From 271330d5fdc260e3b940e5ad632ba995e271a99e Mon Sep 17 00:00:00 2001 From: uvos Date: Tue, 3 Dec 2024 00:24:35 +0100 Subject: [PATCH 1/3] Add the ability to enable and disable actors from the ui add safe and timeout to the regulator actor --- src/actors/regulator.cpp | 36 ++++++++++++++-- src/actors/regulator.h | 26 +++++++++-- src/ui/actorsettingsdialog.cpp | 19 +++++++-- src/ui/actorsettingsdialog.h | 1 + src/ui/actorsettingsdialog.ui | 57 +++++++++++++++++++++++++ src/ui/actorwidgets/regulatorwdiget.cpp | 5 +++ src/ui/actorwidgets/regulatorwdiget.ui | 52 +++++++++++++++++----- 7 files changed, 176 insertions(+), 20 deletions(-) diff --git a/src/actors/regulator.cpp b/src/actors/regulator.cpp index d334cce..b3ea5f6 100644 --- a/src/actors/regulator.cpp +++ b/src/actors/regulator.cpp @@ -4,12 +4,16 @@ Regulator::Regulator(const Sensor sensor, QObject* parent): Actor(parent), sensor_(sensor) { - + timer.setSingleShot(true); + timer.start(timeout_*1000); + connect(&timer, &QTimer::timeout, this, &Regulator::timeout); } Regulator::Regulator(QObject* parent): Actor(parent) { - + timer.setSingleShot(true); + timer.start(timeout_*1000); + connect(&timer, &QTimer::timeout, this, &Regulator::timeout); } void Regulator::setSensor(const Sensor sensor) @@ -21,6 +25,7 @@ void Regulator::sensorEvent(Sensor sensor) { if(active && sensor == sensor_) { + timer.start(timeout_*1000); if( sensor.field < setPoint_-band_ && (sensor.field < sensor_.field || sensor_.field > setPoint_-band_ || first) ) { sigValue(triggerValue); @@ -39,9 +44,15 @@ void Regulator::makeInactive() first = true; if(active) sigValue(!triggerValue); + timer.stop(); Actor::makeInactive(); } +void Regulator::timeout() +{ + sigValue(safeValue_); +} + void Regulator::setPoint(float setPoint) { setPoint_ = setPoint; @@ -57,12 +68,25 @@ void Regulator::setInvert( bool invert ) invert_ = invert; } +void Regulator::setSafeValue(int value) +{ + safeValue_ = value; +} + +void Regulator::setTimeout(int value) +{ + timeout_ = value; + timer.start(timeout_*1000); +} + void Regulator::store(QJsonObject& json) { json["Type"] = "Regulator"; Actor::store(json); json["Band"] = band_; json["SetPoint"] = setPoint_; + json["SafeValue"] = safeValue_; + json["Timeout"] = timeout_; json["SensorType"] = static_cast(sensor_.type); json["SensorId"] = static_cast(sensor_.id); json["SensorField"] = sensor_.field; @@ -74,15 +98,21 @@ void Regulator::load(const QJsonObject& json, bool preserve) Actor::load(json, preserve); band_ = json["Band"].toDouble(1); setPoint_ = json["SetPoint"].toDouble(22); + safeValue_ = json["SafeValue"].toDouble(0); + timeout_ = json["Timeout"].toDouble(1800); sensor_.type = json["SensorType"].toInt(0); sensor_.id = json["SensorId"].toInt(0); sensor_.field = json["SensorField"].toInt(0); sensor_.name = json["SensorName"].toString("Sensor"); + timer.start(timeout_*1000); } QString Regulator::getName() const { - if(name_.size() > 0) return name_; + if(name_.size() > 0) + { + return name_; + } else { QString string; diff --git a/src/actors/regulator.h b/src/actors/regulator.h index cc742a6..733d643 100644 --- a/src/actors/regulator.h +++ b/src/actors/regulator.h @@ -1,4 +1,7 @@ #pragma once + +#include + #include "actor.h" #include "../sensors/sensor.h" @@ -11,17 +14,26 @@ private: float setPoint_ = 0; float band_ = 1; bool invert_ = false; + int timeout_ = 1800; + int safeValue_ = 0; + QTimer timer; bool first = true; +private slots: + + void timeout(); + public slots: void sensorEvent(Sensor sensor); void setSensor(const Sensor sensor); - void setPoint( float setPoint ); - void setBand ( float band ); - void setInvert( bool invert ); + void setPoint(float setPoint ); + void setBand (float band ); + void setInvert(bool invert ); + void setSafeValue(int value); + void setTimeout(int value); virtual void makeInactive() override; public: @@ -34,6 +46,14 @@ public: { return setPoint_; } + int getSafeValue() + { + return safeValue_; + } + int getTimeout() + { + return timeout_; + } Regulator(const Sensor sensor, QObject* parent = nullptr); Regulator(QObject* parent = nullptr); Sensor getSensor() diff --git a/src/ui/actorsettingsdialog.cpp b/src/ui/actorsettingsdialog.cpp index 29f313b..f89a1a0 100644 --- a/src/ui/actorsettingsdialog.cpp +++ b/src/ui/actorsettingsdialog.cpp @@ -83,14 +83,20 @@ void ActorSettingsDialog::init() connect(ui->comboBox_action, SIGNAL(currentIndexChanged(int)), this, SLOT(changeAction(int))); connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int))); connect(ui->pushButton_editItem, &QPushButton::clicked, this, &ActorSettingsDialog::editAsItem); + connect(ui->pushButton_enable, &QPushButton::clicked, this, &ActorSettingsDialog::setEnabled); ui->spinBox->hide(); ui->spinBox->setValue(actor_->getTriggerValue()); - if(actor_->getTriggerValue() == 0) ui->comboBox_action->setCurrentIndex(0); - else if(actor_->getTriggerValue() == 1) ui->comboBox_action->setCurrentIndex(1); - else ui->comboBox_action->setCurrentIndex(2); + if(actor_->getTriggerValue() == 0) + ui->comboBox_action->setCurrentIndex(0); + else if(actor_->getTriggerValue() == 1) + ui->comboBox_action->setCurrentIndex(1); + else + ui->comboBox_action->setCurrentIndex(2); ui->label_Exausted->setText(actor_->isExausted() ? "True" : "False"); + ui->label_Enabled->setText(actor_->isActive() ? "True" : "False"); + ui->pushButton_enable->setText(actor_->isActive() ? "Disable" : "Enable"); } ActorSettingsDialog::~ActorSettingsDialog() @@ -104,6 +110,13 @@ void ActorSettingsDialog::editAsItem() itemSettingsDiag.exec(); } +void ActorSettingsDialog::setEnabled() +{ + actor_->setActive(!actor_->isActive()); + ui->label_Enabled->setText(actor_->isActive() ? "True" : "False"); + ui->pushButton_enable->setText(actor_->isActive() ? "Disable" : "Enable"); +} + void ActorSettingsDialog::valueChanged(int value) { actor_->setTriggerValue(value); diff --git a/src/ui/actorsettingsdialog.h b/src/ui/actorsettingsdialog.h index bd1b9e7..16c4d68 100644 --- a/src/ui/actorsettingsdialog.h +++ b/src/ui/actorsettingsdialog.h @@ -41,6 +41,7 @@ private slots: void changeAction(int index); void valueChanged(int value); void editAsItem(); + void setEnabled(); private: diff --git a/src/ui/actorsettingsdialog.ui b/src/ui/actorsettingsdialog.ui index 6b0a057..0334dec 100644 --- a/src/ui/actorsettingsdialog.ui +++ b/src/ui/actorsettingsdialog.ui @@ -85,6 +85,63 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Enabled: + + + + + + + + 0 + 0 + + + + True + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Enable + + + diff --git a/src/ui/actorwidgets/regulatorwdiget.cpp b/src/ui/actorwidgets/regulatorwdiget.cpp index 967d792..30b0623 100644 --- a/src/ui/actorwidgets/regulatorwdiget.cpp +++ b/src/ui/actorwidgets/regulatorwdiget.cpp @@ -24,12 +24,17 @@ RegulatorWdiget::RegulatorWdiget(std::shared_ptr regulator, SensorSto } ui->doubleSpinBox_setPoint->setValue(regulator->getSetPoint()); ui->doubleSpinBox_band->setValue(regulator->getBand()); + ui->spinBox_safe->setValue(regulator_->getSafeValue()); + ui->spinBox_timeout->setValue(regulator_->getTimeout()); connect(ui->listView, &SensorListWidget::clicked, this, &RegulatorWdiget::setSensor); connect(ui->doubleSpinBox_setPoint, SIGNAL(valueChanged(double)), this, SLOT(setPoint(double))); connect(ui->doubleSpinBox_band, SIGNAL(valueChanged(double)), this, SLOT(setBand(double))); + connect(ui->spinBox_safe, SIGNAL(valueChanged(int)), regulator_.get(), SLOT(setSafeValue(int))); + connect(ui->spinBox_timeout, SIGNAL(valueChanged(int)), regulator_.get(), SLOT(setTimeout(int))); } + void RegulatorWdiget::setPoint(double in) { regulator_->setPoint(in); diff --git a/src/ui/actorwidgets/regulatorwdiget.ui b/src/ui/actorwidgets/regulatorwdiget.ui index db159cf..a6784a3 100644 --- a/src/ui/actorwidgets/regulatorwdiget.ui +++ b/src/ui/actorwidgets/regulatorwdiget.ui @@ -38,15 +38,8 @@ - - - - - Set Point - - - - + + -9999.989999999999782 @@ -56,7 +49,7 @@ - + @@ -69,9 +62,46 @@ - + + + + Timeout + + + + + + + Set Point + + + + + + + + Safety Value + + + + + + + + + + s + + + 999999999 + + + 1800 + + + From 0c5603ca44701e96bd864739e044139c83a5a74d Mon Sep 17 00:00:00 2001 From: Carl Philipp Klemm Date: Sun, 5 Oct 2025 23:29:23 +0200 Subject: [PATCH 2/3] Fix incorrect sensor selection due to reorder sensors in SensorListWidget --- SHinterface.pro | 2 +- src/microcontroller.cpp | 15 ++++++++++----- src/ui/actorwidgets/polynomalactorwidget.cpp | 2 +- src/ui/actorwidgets/regulatorwdiget.cpp | 2 +- src/ui/actorwidgets/sensoractorwidget.cpp | 12 +++++++----- src/ui/sensorlistwidget.cpp | 17 ++++++++++++++++- src/ui/sensorlistwidget.h | 12 +++++++++++- 7 files changed, 47 insertions(+), 15 deletions(-) diff --git a/SHinterface.pro b/SHinterface.pro index ab27aa7..c7ff09f 100644 --- a/SHinterface.pro +++ b/SHinterface.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += core gui widgets network multimedia +QT += core gui widgets network multimedia QT += serialport diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index c244796..ba5f54b 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -127,11 +127,16 @@ std::shared_ptr Microcontroller::processRelayLine(const QString& buffer) if(bufferList.size() >= 9 && buffer.startsWith("ITEM NUMBER:")) { QString name; - for(int i = 10; i < bufferList.size(); i++) name.append(bufferList[i] + ' '); - if(name.size() > 1)name.remove(name.size()-1, 1); - else name = "Relay " + QString::number(bufferList[1].toInt(nullptr, 2)); - return std::shared_ptr( new Relay(bufferList[2].toInt(), name, bufferList[4].toInt(nullptr, 2), - bufferList[8].toInt())); + for(int i = 10; i < bufferList.size(); i++) + name.append(bufferList[i] + ' '); + if(name.size() > 1) + name.remove(name.size()-1, 1); + else + name = "Relay " + QString::number(bufferList[1].toInt(nullptr, 2)); + return std::shared_ptr(new Relay(bufferList[2].toInt(), + name, + bufferList[6].toInt(nullptr, 2), + bufferList[8].toInt())); } return nullptr; } diff --git a/src/ui/actorwidgets/polynomalactorwidget.cpp b/src/ui/actorwidgets/polynomalactorwidget.cpp index 1c9476b..930a3f8 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.cpp +++ b/src/ui/actorwidgets/polynomalactorwidget.cpp @@ -46,5 +46,5 @@ void PolynomalActorWidget::setPow() void PolynomalActorWidget::setSensor(const QModelIndex &index) { - actor_->setSensor(sensors_->getSensors()->at(index.row())); + actor_->setSensor(ui->listView->getSensorForIndex(index)); } diff --git a/src/ui/actorwidgets/regulatorwdiget.cpp b/src/ui/actorwidgets/regulatorwdiget.cpp index 30b0623..0fdddbf 100644 --- a/src/ui/actorwidgets/regulatorwdiget.cpp +++ b/src/ui/actorwidgets/regulatorwdiget.cpp @@ -47,7 +47,7 @@ void RegulatorWdiget::setBand(double band) void RegulatorWdiget::setSensor(const QModelIndex &index) { - regulator_->setSensor(sensors_->getSensors()->at(index.row())); + regulator_->setSensor(ui->listView->getSensorForIndex(index)); setPoint(sensors_->getSensors()->at(index.row()).field); ui->doubleSpinBox_setPoint->setValue(sensors_->getSensors()->at(index.row()).field); } diff --git a/src/ui/actorwidgets/sensoractorwidget.cpp b/src/ui/actorwidgets/sensoractorwidget.cpp index 41276e9..2718b1b 100644 --- a/src/ui/actorwidgets/sensoractorwidget.cpp +++ b/src/ui/actorwidgets/sensoractorwidget.cpp @@ -17,9 +17,12 @@ SensorActorWidget::SensorActorWidget(std::shared_ptr sensorActor, S ui->label->hide(); } - if(sensorActor_->getSloap() == SensorActor::SLOPE_UP) ui->comboBox_slope->setCurrentIndex(0); - else if(sensorActor_->getSloap() == SensorActor::SLOPE_DOWN) ui->comboBox_slope->setCurrentIndex(1); - else if(sensorActor_->getSloap() == SensorActor::SLOPE_BOTH) ui->comboBox_slope->setCurrentIndex(2); + if(sensorActor_->getSloap() == SensorActor::SLOPE_UP) + ui->comboBox_slope->setCurrentIndex(0); + else if(sensorActor_->getSloap() == SensorActor::SLOPE_DOWN) + ui->comboBox_slope->setCurrentIndex(1); + else if(sensorActor_->getSloap() == SensorActor::SLOPE_BOTH) + ui->comboBox_slope->setCurrentIndex(2); ui->doubleSpinBox_threshold->setValue(sensorActor_->getThreshold()); @@ -47,6 +50,5 @@ void SensorActorWidget::setSlope(int index) void SensorActorWidget::setSensor(const QModelIndex &index) { - sensorActor_->setSensor(sensors_->getSensors()->at(index.row())); - qDebug()<<"Selected "<getSensors()->at(index.row()).name; + sensorActor_->setSensor(ui->listView->getSensorForIndex(index)); } diff --git a/src/ui/sensorlistwidget.cpp b/src/ui/sensorlistwidget.cpp index ce4fe4f..827ab2e 100644 --- a/src/ui/sensorlistwidget.cpp +++ b/src/ui/sensorlistwidget.cpp @@ -56,7 +56,7 @@ void SensorListWidget::sensorsChanged(std::vector sensors) else itemString.append("\"Silent\""); } - setItem(static_cast(row), 0, new QTableWidgetItem(sensors[i].name + (sensors[i].hidden ? " (H)" : ""))); + setItem(static_cast(row), 0, new SensorListItem(sensors[i].name + (sensors[i].hidden ? " (H)" : ""), sensors[i])); setItem(static_cast(row), 1, new QTableWidgetItem(itemString)); if(sensors[i].type <= 128) setItem(static_cast(row), 2, new QTableWidgetItem(sensors[i].lastSeen.time().toString("hh:mm"))); @@ -67,8 +67,23 @@ void SensorListWidget::sensorsChanged(std::vector sensors) resizeColumnsToContents(); } +const Sensor& SensorListWidget::getSensorForIndex(const QModelIndex &index) +{ + return static_cast(item(index.row(), 0))->getSensor(); +} + void SensorListWidget::setShowHidden(const bool showHidden) { showHidden_=showHidden; } +const Sensor& SensorListItem::getSensor() +{ + return sensor; +} + +SensorListItem::SensorListItem(const QString& text, const Sensor& sensor): + QTableWidgetItem(text, 1001), sensor(sensor) +{ +} + diff --git a/src/ui/sensorlistwidget.h b/src/ui/sensorlistwidget.h index 13776a6..c963a05 100644 --- a/src/ui/sensorlistwidget.h +++ b/src/ui/sensorlistwidget.h @@ -3,6 +3,15 @@ #include #include "../sensors/sensor.h" +class SensorListItem : public QTableWidgetItem +{ + Sensor sensor; + +public: + const Sensor& getSensor(); + SensorListItem(const QString& text, const Sensor& sensor); +}; + class SensorListWidget : public QTableWidget { Q_OBJECT @@ -11,10 +20,11 @@ class SensorListWidget : public QTableWidget public: - SensorListWidget(const bool showHidden = true, QWidget *parent = nullptr); + SensorListWidget(const bool showHidden = true, QWidget* parent = nullptr); SensorListWidget(SensorStore& sensorStore, const bool showHidden = true, QWidget* parent = nullptr); virtual ~SensorListWidget() {} void setShowHidden(const bool showHidden); + const Sensor& getSensorForIndex(const QModelIndex &index); public slots: From d30c9546b108af0e4ac4cff81f608c67454c7dec Mon Sep 17 00:00:00 2001 From: Carl Philipp Klemm Date: Sun, 5 Oct 2025 23:45:33 +0200 Subject: [PATCH 3/3] Also read value field from correct sensor on regulatorwidget --- src/ui/actorwidgets/regulatorwdiget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/actorwidgets/regulatorwdiget.cpp b/src/ui/actorwidgets/regulatorwdiget.cpp index 0fdddbf..b005240 100644 --- a/src/ui/actorwidgets/regulatorwdiget.cpp +++ b/src/ui/actorwidgets/regulatorwdiget.cpp @@ -48,6 +48,6 @@ void RegulatorWdiget::setBand(double band) void RegulatorWdiget::setSensor(const QModelIndex &index) { regulator_->setSensor(ui->listView->getSensorForIndex(index)); - setPoint(sensors_->getSensors()->at(index.row()).field); - ui->doubleSpinBox_setPoint->setValue(sensors_->getSensors()->at(index.row()).field); + setPoint(ui->listView->getSensorForIndex(index).field); + ui->doubleSpinBox_setPoint->setValue(ui->listView->getSensorForIndex(index).field); }