diff --git a/SHinterface.pro b/SHinterface.pro index c8c7a7b..4ee98f9 100644 --- a/SHinterface.pro +++ b/SHinterface.pro @@ -4,7 +4,7 @@ # #------------------------------------------------- -QT += core gui widgets network +QT += core gui widgets network multimedia QT += serialport @@ -29,6 +29,7 @@ SOURCES += \ src/broadcast.cpp \ src/iomuliplexer.cpp \ src/items/messageitem.cpp \ + src/items/systemitem.cpp \ src/ui/actorwidgets/factoractorwidget.cpp \ src/ui/itemcreationdialog.cpp \ src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \ @@ -38,6 +39,8 @@ SOURCES += \ src/ui/actorwidgets/sensoractorwidget.cpp \ src/ui/actorwidgets/alarmwidget.cpp \ src/ui/actorwidgets/timeractorwidget.cpp \ + src/ui/itemsettingswidgets/relayitemsettingswidget.cpp \ + src/ui/itemsettingswidgets/systemitemsettingswidget.cpp \ src/ui/itemwidget.cpp \ src/ui/itemsettingsdialog.cpp \ src/ui/itemscrollbox.cpp \ @@ -82,6 +85,7 @@ HEADERS += \ src/broadcast.h \ src/iomuliplexer.h \ src/items/messageitem.h \ + src/items/systemitem.h \ src/ui/actorwidgets/factoractorwidget.h \ src/ui/itemcreationdialog.h \ src/ui/itemsettingswidgets/messageitemsettingswidget.h \ @@ -91,6 +95,8 @@ HEADERS += \ src/ui/actorwidgets/polynomalactorwidget.h \ src/ui/actorwidgets/sensoractorwidget.h \ src/ui/actorwidgets/timeractorwidget.h \ + src/ui/itemsettingswidgets/relayitemsettingswidget.h \ + src/ui/itemsettingswidgets/systemitemsettingswidget.h \ src/ui/itemwidget.h \ src/ui/itemsettingsdialog.h \ src/ui/itemscrollbox.h \ @@ -133,6 +139,8 @@ FORMS += \ src/ui/itemsettingswidgets/messageitemsettingswidget.ui \ src/ui/actorsettingsdialog.ui \ src/ui/actorwidgets/polynomalactorwidget.ui \ + src/ui/itemsettingswidgets/relayitemsettingswidget.ui \ + src/ui/itemsettingswidgets/systemitemsettingswidget.ui \ src/ui/mainwindow.ui \ src/ui/relayscrollbox.ui \ src/ui/actorwidgets/sensoractorwidget.ui \ diff --git a/src/a.out b/src/a.out deleted file mode 100755 index 75ae050..0000000 Binary files a/src/a.out and /dev/null differ diff --git a/src/actors/actor.cpp b/src/actors/actor.cpp index f6d4f33..7ae5e71 100644 --- a/src/actors/actor.cpp +++ b/src/actors/actor.cpp @@ -91,23 +91,23 @@ void Actor::onValueChanged(uint8_t value) } -Actor* Actor::createActor(const QString& type) +std::shared_ptr Actor::createActor(const QString& type) { - Actor* actor = nullptr; - if(type == "Alarm") actor = new AlarmTime(); - else if(type == "Sensor") actor = new SensorActor(); - else if(type == "Timer") actor = new TimerActor(); - else if(type == "Regulator") actor = new Regulator(); - else if(type == "Polynomal") actor = new PolynomalActor(); - else if(type == "MultiFactor") actor = new MultiFactorActor(); - else if(type == "Actor") actor = new Actor(); + std::shared_ptr actor; + if(type == "Alarm") actor = std::shared_ptr(new AlarmTime()); + else if(type == "Sensor") actor = std::shared_ptr(new SensorActor()); + else if(type == "Timer") actor = std::shared_ptr(new TimerActor()); + else if(type == "Regulator") actor = std::shared_ptr(new Regulator()); + else if(type == "Polynomal") actor = std::shared_ptr(new PolynomalActor()); + else if(type == "MultiFactor") actor = std::shared_ptr(new MultiFactorActor()); + else if(type == "Actor") actor = std::shared_ptr(new Actor()); return actor; } -Actor* Actor::loadActor(const QJsonObject &json) +std::shared_ptr Actor::loadActor(const QJsonObject &json) { QString type = json["Type"].toString("Actor"); - Actor* actor = createActor(type); + std::shared_ptr actor = createActor(type); if(actor) actor->load(json); return actor; } diff --git a/src/actors/actor.h b/src/actors/actor.h index 6de8b4d..a20b5db 100644 --- a/src/actors/actor.h +++ b/src/actors/actor.h @@ -44,11 +44,11 @@ public: uint8_t getTriggerValue(); - static Actor* createActor(const QString& type); + static std::shared_ptr createActor(const QString& type); virtual void store(QJsonObject& json); virtual void load(const QJsonObject& json, const bool preserve = false); - static Actor* loadActor(const QJsonObject& json); + static std::shared_ptr loadActor(const QJsonObject& json); }; #endif // ACTOR_H diff --git a/src/actors/alarmtime.cpp b/src/actors/alarmtime.cpp index 7240689..5574409 100644 --- a/src/actors/alarmtime.cpp +++ b/src/actors/alarmtime.cpp @@ -18,8 +18,6 @@ void AlarmTime::run() active = true; timer.start(); - - qDebug()<<"Start Alarm Time Manager\n"; } void AlarmTime::makeActive() @@ -64,6 +62,7 @@ QString AlarmTime::getName() const void AlarmTime::setRepeat(const uint8_t repeat) { repeat_=repeat; + exausted = false; } uint8_t AlarmTime::getRepeat() @@ -112,6 +111,7 @@ void AlarmTime::doTick() void AlarmTime::changeTime(const QDateTime& time) { time_=time; + exausted = false; qDebug()<<"time: "< factorActor) { - if(factorActor_) delete factorActor_; factorActor_=factorActor; - connect(factorActor_, &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); + connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); } void MultiFactorActor::store(QJsonObject &json) @@ -73,7 +72,7 @@ void MultiFactorActor::load(const QJsonObject &json, bool preserve) } if(factorActor_) { - connect(factorActor_, &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); + connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); } } diff --git a/src/actors/factoractor.h b/src/actors/factoractor.h index ae011ff..8f27a64 100644 --- a/src/actors/factoractor.h +++ b/src/actors/factoractor.h @@ -8,7 +8,7 @@ class MultiFactorActor: public Actor { private: - Actor* factorActor_; + std::shared_ptr factorActor_; QDateTime activationTime; uint preCancleMin_; @@ -28,8 +28,8 @@ public: virtual QString getName() const; - void setFactorActor(Actor* factorActor); - Actor* getFactorActor(){return factorActor_;} + void setFactorActor(std::shared_ptr factorActor); + std::shared_ptr getFactorActor(){return factorActor_;} void setFactorDirection(const bool direction){factorDirection = direction;} bool getFactorDirection(){return factorDirection;} uint getPreCancleTime(){return preCancleMin_;} diff --git a/src/actors/polynomalactor.cpp b/src/actors/polynomalactor.cpp index 7ed9bc5..d9735c3 100644 --- a/src/actors/polynomalactor.cpp +++ b/src/actors/polynomalactor.cpp @@ -76,7 +76,7 @@ QString PolynomalActor::getName() const else { QString string; - string = QString::number(pow3_) + "x^2 + " + QString::number(pow2_) + "x^2 + " + QString::number(pow1_) + "x + " + QString::number(pow0_) + " (x: " + sensor_.name + ")"; + string = QString::number(pow3_) + "x^3 + " + QString::number(pow2_) + "x^2 + " + QString::number(pow1_) + "x + " + QString::number(pow0_) + " (x: " + sensor_.name + ")"; return string; } } diff --git a/src/actors/regulator.cpp b/src/actors/regulator.cpp index 7dda114..9bb403a 100644 --- a/src/actors/regulator.cpp +++ b/src/actors/regulator.cpp @@ -21,7 +21,6 @@ void Regulator::sensorEvent(Sensor sensor) { if(active && sensor == sensor_) { - qDebug()<<"got sensor: "< setPoint_-band_ || first) ) { sigValue(triggerValue); diff --git a/src/actors/sensoractor.cpp b/src/actors/sensoractor.cpp index 8413011..24ad66a 100644 --- a/src/actors/sensoractor.cpp +++ b/src/actors/sensoractor.cpp @@ -21,7 +21,6 @@ void SensorActor::sensorEvent(Sensor sensor) { if(sensor == sensor_) { - qDebug()<<"got sensor: "<= threshold_ ) performAction(); else if((sloap_ == SLOPE_DOWN || sloap_ == SLOPE_BOTH) && sensor_.field > threshold_ && sensor.field <= threshold_) performAction(); sensor_ = sensor; diff --git a/src/broadcast.cpp b/src/broadcast.cpp index 0f1a697..0ca90f1 100644 --- a/src/broadcast.cpp +++ b/src/broadcast.cpp @@ -39,46 +39,63 @@ void BroadCast::sendJson(const QJsonObject& json) write(buffer); } +void BroadCast::sendSensors() +{ + if(iodevice_)for(auto& sensor: *globalSensors.getSensors()) + { + iodevice_->write("bcst: "+sensor.toString().toLatin1()+'\n'); + } +} + +void BroadCast::requestSensors() +{ + if(iodevice_)iodevice_->write("bcst: GETSENSORS\n"); +} + void BroadCast::requestJson() { if(iodevice_)iodevice_->write("bcst: GETJSN\n"); } -void BroadCast::decodeMaster() +void BroadCast::decodeMaster(const QByteArray& buffer) { - if(buffer_.size() >= 6 && buffer_[0] == 'G' && buffer_[1] == 'E' && buffer_[2] == 'T' && buffer_[3] == 'J' && buffer_[4] == 'S' && buffer_[5] == 'N') + if(buffer.startsWith("GETJSN")) { qDebug()<<"json requested"; jsonRequested(); } + else if(buffer.startsWith("GETSENSORS") ) + { + qDebug()<<"sensors requested"; + sendSensors(); + } } -void BroadCast::decode() +void BroadCast::decode(QByteArray buffer) { - if(buffer_.size() >= 6 && buffer_[0] == 'J' && buffer_[1] == 'S' && buffer_[2] == 'O' && buffer_[3] == 'N' && buffer_[4] == ':') + qDebug()<<"decodeing: "<= 6 && buffer[0] == 'J' && buffer[1] == 'S' && buffer[2] == 'O' && buffer[3] == 'N' && buffer[4] == ':') { qDebug()<<"got json"; - buffer_.remove(0,6); - for(int i = 0; i < buffer_.size()-1; ++i) + buffer.remove(0,6); + for(int i = 0; i < buffer.size()-1; ++i) { - if( buffer_[i] == '\\' && buffer_[i+1] == 'n' ) + if( buffer[i] == '\\' && buffer[i+1] == 'n' ) { - buffer_[i] = '\n'; - buffer_.remove(i+1,1); + buffer[i] = '\n'; + buffer.remove(i+1,1); } - else if( buffer_[i] == '\\' && buffer_[i+1] == '0' ) + else if( buffer[i] == '\\' && buffer[i+1] == '0' ) { - buffer_[i] = '\0'; - buffer_.remove(i+1,1); + buffer[i] = '\0'; + buffer.remove(i+1,1); } } QJsonParseError error; - QJsonDocument document = QJsonDocument::fromJson(buffer_, &error); + QJsonDocument document = QJsonDocument::fromJson(buffer, &error); - qDebug()<<"orig json:"; - qDebug()<= 6 && buffer_[0] == 'S' && buffer_[1] == 'E' && buffer_[2] == 'N' && buffer_[3] == 'S' && buffer_[4] == 'O' && buffer_[5] == 'R') + else if(buffer.size() >= 6 && buffer[0] == 'S' && buffer[1] == 'E' && buffer[2] == 'N' && buffer[3] == 'S' && buffer[4] == 'O' && buffer[5] == 'R') { - Sensor sensor = Sensor::sensorFromString(buffer_); + Sensor sensor = Sensor::sensorFromString(buffer); if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor); } } @@ -102,19 +119,16 @@ void BroadCast::sendMessage(const QString &title, const QString &body) void BroadCast::readyRead() { buffer_.append(iodevice_->readAll()); - if(buffer_.size() >= 6) + int newlineIndex = buffer_.indexOf('\n'); + while( newlineIndex != -1 ) { - if(buffer_[0] == 'b' && buffer_[1] == 'c' && buffer_[2] == 's' && buffer_[3] == 't' && buffer_[4] == ':') + if(buffer_.startsWith("bcst: ")) { - if(buffer_.contains('\n')) - { - buffer_.remove(0,6); - decode(); - if(master_)decodeMaster(); - buffer_.clear(); - } + QByteArray tmp = buffer_.mid(6,newlineIndex-6); + decode(tmp); + if(master_)decodeMaster(tmp); } - else buffer_.clear(); + buffer_.remove(0, newlineIndex+1); + newlineIndex = buffer_.indexOf('\n'); } - else if(buffer_.contains('\n')) buffer_.clear(); } diff --git a/src/broadcast.h b/src/broadcast.h index 04869d4..c3e8577 100644 --- a/src/broadcast.h +++ b/src/broadcast.h @@ -24,8 +24,8 @@ private: void write(const char * const buffer, const size_t length); void write(const QByteArray& buffer); - void decode(); - void decodeMaster(); + void decode(QByteArray buffer); + void decodeMaster(const QByteArray& buffer); private slots: @@ -34,6 +34,7 @@ private slots: public slots: void requestJson(); + void requestSensors(); signals: @@ -45,6 +46,7 @@ public: BroadCast(QIODevice* const iodevice = nullptr, bool master = true); void sendJson(const QJsonObject& json); + void sendSensors(); void sendMessage(const QString& title, const QString& body); }; diff --git a/src/items/item.cpp b/src/items/item.cpp index 149b259..f54aead 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -50,13 +50,13 @@ Item::Item(const ItemData& itemData, QObject *parent): QObject(parent), ItemDat Item::~Item() { - for(size_t i = 0; i < actors_.size(); i++) delete actors_[i]; } void Item::store(QJsonObject &json) { json["Name"] = name_; json["ItemId"] = static_cast(itemId_); + json["override"] = override_; QJsonArray actorsArray; for(size_t i = 0; i < actors_.size(); ++i) { @@ -77,17 +77,23 @@ void Item::load(const QJsonObject &json, const bool preserve) name_ = json["Name"].toString(name_); itemId_ = static_cast(json["ItemId"].toDouble(0)); } + override_ = json["override"].toBool(false); const QJsonArray actorsArray(json["Actors"].toArray(QJsonArray())); for(int i = 0; i < actorsArray.size(); ++i) { if(actorsArray[i].isObject()) { - Actor* actor = Actor::loadActor(actorsArray[i].toObject()); + std::shared_ptr actor = Actor::loadActor(actorsArray[i].toObject()); if(actor != nullptr) addActor(actor); } } } +void Item::actorSetValue(uint8_t value) +{ + if(!override_) setValue(value); +} + void Item::setValue(uint8_t value) { value_ = value; @@ -99,34 +105,32 @@ void Item::informValue(uint8_t value) Item::setValue(value); } -void Item::addActor(Actor* actor) +void Item::addActor(std::shared_ptr actor) { actor->setParent(this); actors_.push_back(actor); if(!secondaryFlag) { - qDebug()<<"connecting actor"; - connect(actor, &Actor::sigValue, this, &Item::setValue); + connect(actor.get(), &Actor::sigValue, this, &Item::actorSetValue); } - connect(this, &Item::valueChanged, actor, &Actor::onValueChanged); + connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged); - SensorActor* sensorActor = dynamic_cast(actor); - if(sensorActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor, &SensorActor::sensorEvent); + std::shared_ptr sensorActor = std::dynamic_pointer_cast(actor); + if(sensorActor)connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor.get(), &SensorActor::sensorEvent); - Regulator* regulator = dynamic_cast(actor); - if(regulator != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, regulator, &Regulator::sensorEvent); + std::shared_ptr regulator = std::dynamic_pointer_cast(actor); + if(regulator)connect(&globalSensors, &SensorStore::sensorChangedState, regulator.get(), &Regulator::sensorEvent); - PolynomalActor* polynomalActor = dynamic_cast(actor); - if(polynomalActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor, &PolynomalActor::sensorEvent); + std::shared_ptr polynomalActor = std::dynamic_pointer_cast(actor); + if(polynomalActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor.get(), &PolynomalActor::sensorEvent); } -bool Item::removeActor(Actor* actor) +bool Item::removeActor(std::shared_ptr actor) { for(unsigned int i = 0; i < actors_.size(); i++) { if(actors_[i] == actor) { - delete actor; actors_.erase(actors_.begin()+i); return true; } @@ -134,13 +138,22 @@ bool Item::removeActor(Actor* actor) return false; } +void Item::setOverride(const bool in) +{ + override_ = in; +} + +bool Item::getOverride() +{ + return override_; +} + void Item::removeAllActors() { - for(unsigned int i = 0; i < actors_.size(); i++) delete actors_[i]; actors_.clear(); } -std::vector< Actor* >& Item::getActors() +std::vector< std::shared_ptr >& Item::getActors() { return actors_; } diff --git a/src/items/item.h b/src/items/item.h index de4947b..7c8d38a 100644 --- a/src/items/item.h +++ b/src/items/item.h @@ -4,6 +4,7 @@ #include #include #include +#include class Actor; @@ -33,7 +34,9 @@ class Item: public QObject, public ItemData { Q_OBJECT private: - std::vector< Actor* > actors_; + std::vector< std::shared_ptr > actors_; + + bool override_ = false; public: @@ -43,6 +46,9 @@ signals: void valueChanged(uint8_t value); +private slots: + virtual void actorSetValue(uint8_t value); + public slots: virtual void setValue(uint8_t value); @@ -54,12 +60,14 @@ public: virtual ~Item(); - std::vector< Actor* >& getActors(); + std::vector< std::shared_ptr >& getActors(); bool hasActors(); - void addActor(Actor* actor); - bool removeActor(Actor* actor); + void addActor(std::shared_ptr actor); + bool removeActor(std::shared_ptr actor); void removeAllActors(); void setActorsActive(bool in); + void setOverride(const bool in); + bool getOverride(); void informValue(uint8_t value); virtual void store(QJsonObject& json); diff --git a/src/items/itemstore.cpp b/src/items/itemstore.cpp index d518439..dfcaf0a 100644 --- a/src/items/itemstore.cpp +++ b/src/items/itemstore.cpp @@ -1,6 +1,7 @@ #include "itemstore.h" #include "relay.h" #include "messageitem.h" +#include "systemitem.h" #include ItemStore::ItemStore(QObject *parent): QObject(parent) @@ -110,6 +111,10 @@ void ItemStore::load(const QJsonObject& json) { newItem = std::shared_ptr(new MessageItem); } + else if(itemObject["Type"].toString("") == "System") + { + newItem = std::shared_ptr(new SystemItem()); + } else if(itemObject["Type"].toString("") == "Aux") { } diff --git a/src/items/messageitem.cpp b/src/items/messageitem.cpp index 57f352d..670a204 100644 --- a/src/items/messageitem.cpp +++ b/src/items/messageitem.cpp @@ -1,8 +1,9 @@ #include "messageitem.h" #include +#include -BroadCast* MessageItem::broadCast_ = nullptr; +BroadCast* MessageItem::broadCast = nullptr; MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): Item(itemIdIn, name, value, parent) @@ -26,13 +27,12 @@ void MessageItem::setValue(uint8_t value) Item::setValue(value); if(value && !messageBox_) { + if(broadCast) broadCast->sendMessage(name_, message_); + if(!alertSoundFileName.isEmpty()) QSound::play(alertSoundFileName); messageBox_ = new QMessageBox(QMessageBox::NoIcon, name_, message_); messageBox_->setModal(false); connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox); messageBox_->show(); - if(broadCast_) broadCast_->sendMessage(name_, message_); - - //QTimer::singleShot(600000, this, &MessageItem::closeMessageBox); } else if(!value && messageBox_) { @@ -52,6 +52,16 @@ void MessageItem::closeMessageBox() } } +QString MessageItem::getAlert() +{ + return alertSoundFileName; +} + +void MessageItem::setAlert(const QString &in) +{ + alertSoundFileName = in; +} + void MessageItem::setMessage(const QString& in) { message_ = in; @@ -67,10 +77,12 @@ void MessageItem::store(QJsonObject &json) json["Type"] = "Message"; Item::store(json); json["Message"] = message_; + if(!alertSoundFileName.isEmpty()) json["Alert"] = alertSoundFileName; } void MessageItem::load(const QJsonObject &json, const bool preserve) { Item::load(json,preserve); message_ = json["Message"].toString("Invalid Message"); + alertSoundFileName = json["Alert"].toString(""); } diff --git a/src/items/messageitem.h b/src/items/messageitem.h index 3524f68..64596db 100644 --- a/src/items/messageitem.h +++ b/src/items/messageitem.h @@ -13,8 +13,10 @@ private: QString message_; QMessageBox* messageBox_ = nullptr; + QString alertSoundFileName = ""; - static BroadCast* broadCast_; +public: + static BroadCast* broadCast; private slots: @@ -32,6 +34,8 @@ public: void setMessage(const QString& in); QString getMessage(); + void setAlert(const QString& in); + QString getAlert(); virtual void store(QJsonObject& json); virtual void load(const QJsonObject& json, const bool preserve = false); diff --git a/src/items/poweritem.h b/src/items/poweritem.h index 7390f37..d590d97 100644 --- a/src/items/poweritem.h +++ b/src/items/poweritem.h @@ -1,7 +1,7 @@ #pragma once #include "item.h" -#include "../sensors/sensors.h" +#include "../sensors/sensor.h" #include "../microcontroller.h" #include diff --git a/src/items/systemitem.cpp b/src/items/systemitem.cpp new file mode 100644 index 0000000..6a61046 --- /dev/null +++ b/src/items/systemitem.cpp @@ -0,0 +1,43 @@ +#include "systemitem.h" +#include + +void SystemItem::setValue(uint8_t value) +{ + QProcess::execute(value ? onCommand_ : offCommand_); +} + +SystemItem::SystemItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): +Item(itemIdIn, name, value, parent) +{ + +} + +SystemItem::SystemItem(const ItemData& itemData, QObject *parent): +Item(itemData, parent) +{ + +} + +void SystemItem::setOnCommand(const QString& in) +{ + onCommand_ = in; +} + +void SystemItem::setOffCommand(const QString& in) +{ + offCommand_ = in; +} + +void SystemItem::store(QJsonObject& json) +{ + json["Type"] = "System"; + Item::store(json); + json["OnCommand"] = onCommand_; + json["OffCommand"] = offCommand_; +} +void SystemItem::load(const QJsonObject& json, const bool preserve) +{ + Item::load(json,preserve); + onCommand_ = json["OnCommand"].toString(""); + offCommand_ = json["OffCommand"].toString(""); +} diff --git a/src/items/systemitem.h b/src/items/systemitem.h new file mode 100644 index 0000000..3d46e8d --- /dev/null +++ b/src/items/systemitem.h @@ -0,0 +1,34 @@ +#ifndef SYSTEMITEM_H +#define SYSTEMITEM_H + + +#include "item.h" + +class SystemItem : public Item +{ +Q_OBJECT +private: + + QString onCommand_; + QString offCommand_; + +public: + + virtual void setValue(uint8_t value); + +public: + + SystemItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr); + SystemItem(const ItemData& itemData, QObject *parent = nullptr); + ~SystemItem() = default; + + void setOnCommand(const QString& in); + void setOffCommand(const QString& in); + QString getOnCommand(){return onCommand_;} + QString getOffCommand(){return offCommand_;} + + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, const bool preserve = false); +}; + +#endif // SYSTEMITEM_H diff --git a/src/main.cpp b/src/main.cpp index 7487771..b3ad01c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #ifndef Q_OS_ANDROID @@ -79,6 +80,7 @@ int main(int argc, char *argv[]) if(!microSocket->waitForConnected(1000)) { std::cout<<"Can not connect to to Server.\n"; + QMessageBox::critical(nullptr, "Error", "Can not connect to to Server"); return 1; } masterIODevice = microSocket; diff --git a/src/mainobject.cpp b/src/mainobject.cpp index 21bc74c..518d97a 100644 --- a/src/mainobject.cpp +++ b/src/mainobject.cpp @@ -1,4 +1,5 @@ #include "mainobject.h" +#include "items/messageitem.h" MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent) : QObject(parent), @@ -9,6 +10,7 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const broadCast(ioMultiplexer.getIoDevice(), masterIn), settingsPath(settingsPathIn), sunSensorSource(49.884450, 8.650536), + powerItem(new PowerItem), rgbItem(new RgbItem(µ, 5487422, "Rgb Lights")), auxItem(new AuxItem(µ, 5487421, "Desk Light")) @@ -27,10 +29,12 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const QObject::connect(µ, &Microcontroller::itemChanged, &items, &ItemStore::itemStateChanged); //special items - QObject::connect(&powerItem, &PowerItem::stateChanged, &globalSensors, &SensorStore::sensorGotState); - powerItem.emmitSensor(); + QObject::connect(powerItem.get(), &PowerItem::stateChanged, &globalSensors, &SensorStore::sensorGotState); + powerItem->emmitSensor(); items.addItem(rgbItem); items.addItem(auxItem); + MessageItem::broadCast = &broadCast; + Relay::setMicrocontroller(µ); @@ -42,6 +46,7 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const else { broadCast.requestJson(); + broadCast.requestSensors(); } #ifndef Q_OS_ANDROID @@ -62,12 +67,15 @@ MainObject::~MainObject() void MainObject::store(QJsonObject &json) { items.store(json); + QJsonObject powerObject; - powerItem.store(powerObject); + powerItem->store(powerObject); + json.insert("Power", powerObject); + QJsonDocument pwrDoc(powerObject); + QJsonObject ocupancyObject; ocupancySensor.store(ocupancyObject); json.insert("Ocupancy", ocupancyObject); - json.insert("Power", powerObject); } void MainObject::load(const QJsonObject& json) @@ -75,11 +83,11 @@ void MainObject::load(const QJsonObject& json) items.clear(); rgbItem->removeAllActors(); auxItem->removeAllActors(); - powerItem.removeAllActors(); + powerItem->removeAllActors(); items.addItem(rgbItem); items.addItem(auxItem); items.load(json); - powerItem.load(json["Power"].toObject()); + powerItem->load(json["Power"].toObject()); ocupancySensor.load(json["Ocupancy"].toObject()); qDebug()<<"aray size: "<= 2) diff --git a/src/mainobject.h b/src/mainobject.h index 3e4e7a8..8e15e2e 100644 --- a/src/mainobject.h +++ b/src/mainobject.h @@ -58,7 +58,7 @@ public: //items ItemStore items; - PowerItem powerItem; + std::shared_ptr powerItem; std::shared_ptr rgbItem; std::shared_ptr auxItem; diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index 0ce1dc7..0629fbc 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -9,7 +9,7 @@ void Microcontroller::relayToggle(int state, int relay) { char buffer[8]; int length = sprintf(buffer, "%d \n", relay); - state ? write("relay on ") : write("relay off "); + state ? write("item on ") : write("item off "); write(buffer, length); } @@ -124,7 +124,7 @@ void Microcontroller::setIODevice(QIODevice *port) std::shared_ptr Microcontroller::processRelayLine(const QString& buffer) { QStringList bufferList = buffer.split(' '); - if(bufferList.size() >= 8 && buffer.startsWith("RELAY NUMBER:")) + if(bufferList.size() >= 8 && buffer.startsWith("ITEM NUMBER:")) { QString name; for(int i = 8; i < bufferList.size(); i++) name.append(bufferList[i] + ' '); @@ -139,7 +139,7 @@ std::shared_ptr Microcontroller::processRelayLine(const QString& buffer) void Microcontroller::processList(const QString& buffer) { QStringList bufferList = buffer.split(' '); - if(bufferList.size() >= 8 && buffer.startsWith("RELAY NUMBER:")) + if(bufferList.size() >= 8 && buffer.startsWith("ITEM NUMBER:")) { relayList.push_back(processRelayLine(buffer)); } @@ -175,7 +175,7 @@ void Microcontroller::processMicroReturn() listMode = true; relayList.clear(); } - else if(_buffer.startsWith("RELAY NUMBER:"))processRelayState(_buffer); + else if(_buffer.startsWith("ITEM NUMBER:"))processRelayState(_buffer); else if(_buffer.startsWith("SENSOR")) processSensorState(_buffer); } diff --git a/src/sensors/ocupancysensor.cpp b/src/sensors/ocupancysensor.cpp index 0d064be..ad1e63f 100644 --- a/src/sensors/ocupancysensor.cpp +++ b/src/sensors/ocupancysensor.cpp @@ -7,7 +7,7 @@ OcupancySensorSource::OcupancySensorSource(QObject *parent, const QString& device, const QString& deviceMac): QObject (parent), deviceMac_(deviceMac), device_(device) { - + QTimer::singleShot(timeoutMs, this, &OcupancySensorSource::Timeout); } void OcupancySensorSource::sensorEvent(Sensor sensor) @@ -15,13 +15,14 @@ void OcupancySensorSource::sensorEvent(Sensor sensor) if(sensor.type == Sensor::TYPE_DOOR && sensor.id == 1 && sensor.field != 0.0f) { if(occupied == false) stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 1, "Occupancy")); - QTimer::singleShot(600000, this, &OcupancySensorSource::Timeout); + QTimer::singleShot(timeoutMs, this, &OcupancySensorSource::Timeout); } } void OcupancySensorSource::Timeout() { int error = 0; + qDebug()<<"testing for occupancy"; std::vector devices = ap::connectedDevices(device_.toLatin1().toStdString(), error); if(error == 0) { @@ -32,16 +33,19 @@ void OcupancySensorSource::Timeout() if(mac.find(deviceMac_.toLatin1().toStdString()) != std::string::npos) { found = true; + qDebug()<<"occupied"; break; } } + stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, found, "Occupancy")); occupied = found; } else { stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, true, "Occupancy")); - qDebug()<<"occupancy sensor error"; + qDebug()<<"occupancy sensor error "< #include -ActorSettingsDialog::ActorSettingsDialog(AlarmTime* alarm, QWidget *parent): +ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr alarm, QWidget *parent): QDialog(parent), actor_(alarm), ui(new Ui::ActorSettingsDialog) @@ -15,7 +15,7 @@ ActorSettingsDialog::ActorSettingsDialog(AlarmTime* alarm, QWidget *parent): ui->vertlayout->addWidget(widget); } -ActorSettingsDialog::ActorSettingsDialog(SensorActor* actor, QWidget *parent) : +ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : QDialog(parent), actor_(actor), ui(new Ui::ActorSettingsDialog) @@ -26,7 +26,7 @@ ui(new Ui::ActorSettingsDialog) ui->vertlayout->addWidget(widget); } -ActorSettingsDialog::ActorSettingsDialog(Regulator* actor, QWidget *parent) : +ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : QDialog(parent), actor_(actor), ui(new Ui::ActorSettingsDialog) @@ -37,7 +37,7 @@ ActorSettingsDialog::ActorSettingsDialog(Regulator* actor, QWidget *parent) : ui->vertlayout->addWidget(widget); } -ActorSettingsDialog::ActorSettingsDialog(TimerActor* actor, QWidget *parent) : +ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : QDialog(parent), actor_(actor), ui(new Ui::ActorSettingsDialog) @@ -48,7 +48,7 @@ ui(new Ui::ActorSettingsDialog) ui->vertlayout->addWidget(widget); } -ActorSettingsDialog::ActorSettingsDialog(PolynomalActor* actor, QWidget *parent) : +ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : QDialog(parent), actor_(actor), ui(new Ui::ActorSettingsDialog) @@ -59,7 +59,7 @@ ui(new Ui::ActorSettingsDialog) ui->vertlayout->addWidget(widget); } -ActorSettingsDialog::ActorSettingsDialog(MultiFactorActor* actor, QWidget *parent) : +ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : QDialog(parent), actor_(actor), ui(new Ui::ActorSettingsDialog) @@ -69,7 +69,7 @@ ui(new Ui::ActorSettingsDialog) ui->vertlayout->addWidget(widget); } -ActorSettingsDialog::ActorSettingsDialog(Actor* actor, QWidget *parent) : +ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : QDialog(parent), actor_(actor), ui(new Ui::ActorSettingsDialog) diff --git a/src/ui/actorsettingsdialog.h b/src/ui/actorsettingsdialog.h index 48df7be..3d8e5a5 100644 --- a/src/ui/actorsettingsdialog.h +++ b/src/ui/actorsettingsdialog.h @@ -19,19 +19,19 @@ class ActorSettingsDialog : public QDialog Q_OBJECT private: - Actor* actor_; + std::shared_ptr actor_; QWidget* widget; void init(); public: - ActorSettingsDialog(AlarmTime* actor, QWidget *parent = nullptr); - ActorSettingsDialog(SensorActor* actor, QWidget *parent = nullptr); - ActorSettingsDialog(Regulator* actor, QWidget *parent = nullptr); - ActorSettingsDialog(TimerActor* actor, QWidget *parent = nullptr); - ActorSettingsDialog(PolynomalActor* actor, QWidget *parent = nullptr); - ActorSettingsDialog(MultiFactorActor* actor, QWidget *parent = nullptr); - ActorSettingsDialog(Actor* actor, QWidget *parent); + ActorSettingsDialog(std::shared_ptr actor, QWidget *parent = nullptr); + ActorSettingsDialog(std::shared_ptr actor, QWidget *parent = nullptr); + ActorSettingsDialog(std::shared_ptr actor, QWidget *parent = nullptr); + ActorSettingsDialog(std::shared_ptr actor, QWidget *parent = nullptr); + ActorSettingsDialog(std::shared_ptr actor, QWidget *parent = nullptr); + ActorSettingsDialog(std::shared_ptr actor, QWidget *parent = nullptr); + ActorSettingsDialog(std::shared_ptr actor, QWidget *parent); ~ActorSettingsDialog(); void hideCancle(const bool hide); diff --git a/src/ui/actorwidgets/alarmwidget.cpp b/src/ui/actorwidgets/alarmwidget.cpp index 871be8f..3176c7d 100644 --- a/src/ui/actorwidgets/alarmwidget.cpp +++ b/src/ui/actorwidgets/alarmwidget.cpp @@ -1,7 +1,7 @@ #include "alarmwidget.h" #include "ui_alarmwidget.h" -AlarmWidget::AlarmWidget(AlarmTime* alarm, QWidget *parent) : +AlarmWidget::AlarmWidget(std::shared_ptr alarm, QWidget *parent) : QWidget(parent), alarm_(alarm), ui(new Ui::AlarmWidget) @@ -35,7 +35,7 @@ AlarmWidget::AlarmWidget(AlarmTime* alarm, QWidget *parent) : else if(alarm_->getRepeat() == AlarmTime::REPEAT_MONTHLY)ui->radioButton_3->setChecked(true); else if(alarm_->getRepeat() == AlarmTime::REPEAT_YEARLY) ui->radioButton_4->setChecked(true); - connect(ui->dateTimeEdit, &QDateTimeEdit::dateTimeChanged, alarm, &AlarmTime::changeTime); + connect(ui->dateTimeEdit, &QDateTimeEdit::dateTimeChanged, alarm.get(), &AlarmTime::changeTime); } AlarmWidget::~AlarmWidget() diff --git a/src/ui/actorwidgets/alarmwidget.h b/src/ui/actorwidgets/alarmwidget.h index a71303e..13541d9 100644 --- a/src/ui/actorwidgets/alarmwidget.h +++ b/src/ui/actorwidgets/alarmwidget.h @@ -2,6 +2,7 @@ #define ALARMWIDGET_H #include +#include #include "../../actors/alarmtime.h" namespace Ui { @@ -12,10 +13,10 @@ class AlarmWidget : public QWidget { Q_OBJECT - AlarmTime* alarm_; + std::shared_ptr alarm_; public: - explicit AlarmWidget(AlarmTime* alarm, QWidget *parent = nullptr); + explicit AlarmWidget(std::shared_ptr alarm, QWidget *parent = nullptr); ~AlarmWidget(); private slots: diff --git a/src/ui/actorwidgets/factoractorwidget.cpp b/src/ui/actorwidgets/factoractorwidget.cpp index 4f27110..21990db 100644 --- a/src/ui/actorwidgets/factoractorwidget.cpp +++ b/src/ui/actorwidgets/factoractorwidget.cpp @@ -2,7 +2,7 @@ #include "ui_factoractorwidget.h" #include "../actorsettingsdialog.h" -FactorActorWidget::FactorActorWidget(MultiFactorActor* actor, QWidget *parent) : +FactorActorWidget::FactorActorWidget(std::shared_ptr actor, QWidget *parent) : QWidget(parent), actor_(actor), ui(new Ui::FactorActorWidget) @@ -24,36 +24,36 @@ FactorActorWidget::~FactorActorWidget() void FactorActorWidget::createFactorActor() { ActorSettingsDialog* dialog = nullptr; - Actor* actor = nullptr; + std::shared_ptr actor = nullptr; if(ui->comboBox->currentText() == "Alarm") { - AlarmTime* alarm = new AlarmTime; + std::shared_ptr alarm = std::shared_ptr(new AlarmTime); actor = alarm; dialog = new ActorSettingsDialog(alarm, this); } else if(ui->comboBox->currentText() == "Sensor") { - SensorActor* sensorActor = new SensorActor(); + std::shared_ptr sensorActor = std::shared_ptr(new SensorActor()); actor = sensorActor; dialog = new ActorSettingsDialog(sensorActor, this); } else if(ui->comboBox->currentText() == "Timer" ) { - TimerActor* timerActor = new TimerActor(); + std::shared_ptr timerActor = std::shared_ptr(new TimerActor()); actor = timerActor; dialog = new ActorSettingsDialog(timerActor, this); } else if(ui->comboBox->currentText() == "Regulator") { - Regulator* regulator = new Regulator(); + std::shared_ptr regulator = std::shared_ptr(new Regulator()); actor = regulator; dialog = new ActorSettingsDialog(regulator, this); } else if(ui->comboBox->currentText() == "Polynomal") { - PolynomalActor* polynomalActor = new PolynomalActor(); + std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor()); actor = polynomalActor; dialog = new ActorSettingsDialog(polynomalActor, this); } @@ -68,7 +68,6 @@ void FactorActorWidget::createFactorActor() actor_->setFactorActor(actor); ui->label_FactorActor->setText(actor->getName()); } - else delete actor; delete dialog; } } diff --git a/src/ui/actorwidgets/factoractorwidget.h b/src/ui/actorwidgets/factoractorwidget.h index 1b2cadf..c5bf083 100644 --- a/src/ui/actorwidgets/factoractorwidget.h +++ b/src/ui/actorwidgets/factoractorwidget.h @@ -12,10 +12,10 @@ class FactorActorWidget : public QWidget { Q_OBJECT - MultiFactorActor* actor_; + std::shared_ptr actor_; public: - explicit FactorActorWidget(MultiFactorActor* actor, QWidget *parent = nullptr); + explicit FactorActorWidget(std::shared_ptr actor, QWidget *parent = nullptr); ~FactorActorWidget(); private slots: diff --git a/src/ui/actorwidgets/polynomalactorwidget.cpp b/src/ui/actorwidgets/polynomalactorwidget.cpp index 509fdf4..9b04057 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.cpp +++ b/src/ui/actorwidgets/polynomalactorwidget.cpp @@ -1,7 +1,7 @@ #include "polynomalactorwidget.h" #include "ui_polynomalactorwidget.h" -PolynomalActorWidget::PolynomalActorWidget(PolynomalActor* actor, SensorStore* sensors, QWidget *parent): +PolynomalActorWidget::PolynomalActorWidget(std::shared_ptr actor, SensorStore* sensors, QWidget *parent): QWidget(parent), sensors_(sensors), actor_(actor), diff --git a/src/ui/actorwidgets/polynomalactorwidget.h b/src/ui/actorwidgets/polynomalactorwidget.h index dba3c55..6b4b405 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.h +++ b/src/ui/actorwidgets/polynomalactorwidget.h @@ -12,10 +12,10 @@ class PolynomalActorWidget : public QWidget { Q_OBJECT SensorStore* sensors_; - PolynomalActor* actor_; + std::shared_ptr actor_; public: - explicit PolynomalActorWidget(PolynomalActor* regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr); + explicit PolynomalActorWidget(std::shared_ptr regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr); ~PolynomalActorWidget(); private slots: diff --git a/src/ui/actorwidgets/regulatorwdiget.cpp b/src/ui/actorwidgets/regulatorwdiget.cpp index 1eafa71..8eb6d4a 100644 --- a/src/ui/actorwidgets/regulatorwdiget.cpp +++ b/src/ui/actorwidgets/regulatorwdiget.cpp @@ -9,7 +9,7 @@ RegulatorWdiget::~RegulatorWdiget() -RegulatorWdiget::RegulatorWdiget(Regulator* regulator, SensorStore* sensors, QWidget *parent) : +RegulatorWdiget::RegulatorWdiget(std::shared_ptr regulator, SensorStore* sensors, QWidget *parent) : QWidget(parent), regulator_(regulator), sensors_(sensors), diff --git a/src/ui/actorwidgets/regulatorwdiget.h b/src/ui/actorwidgets/regulatorwdiget.h index 7ca0821..eebd764 100644 --- a/src/ui/actorwidgets/regulatorwdiget.h +++ b/src/ui/actorwidgets/regulatorwdiget.h @@ -12,11 +12,11 @@ class RegulatorWdiget : public QWidget { Q_OBJECT - Regulator* regulator_; + std::shared_ptr regulator_; SensorStore* sensors_; public: - explicit RegulatorWdiget(Regulator* regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr); + explicit RegulatorWdiget(std::shared_ptr regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr); ~RegulatorWdiget(); private slots: diff --git a/src/ui/actorwidgets/sensoractorwidget.cpp b/src/ui/actorwidgets/sensoractorwidget.cpp index 74aca27..87bc6f9 100644 --- a/src/ui/actorwidgets/sensoractorwidget.cpp +++ b/src/ui/actorwidgets/sensoractorwidget.cpp @@ -3,7 +3,7 @@ #include -SensorActorWidget::SensorActorWidget(SensorActor* sensorActor, SensorStore* sensors, QWidget *parent) : +SensorActorWidget::SensorActorWidget(std::shared_ptr sensorActor, SensorStore* sensors, QWidget *parent) : QWidget(parent), sensorActor_(sensorActor), sensors_(sensors), diff --git a/src/ui/actorwidgets/sensoractorwidget.h b/src/ui/actorwidgets/sensoractorwidget.h index a0d95d8..bb0915b 100644 --- a/src/ui/actorwidgets/sensoractorwidget.h +++ b/src/ui/actorwidgets/sensoractorwidget.h @@ -13,11 +13,11 @@ class SensorActorWidget : public QWidget { Q_OBJECT - SensorActor* sensorActor_; + std::shared_ptr sensorActor_; SensorStore* sensors_; public: - explicit SensorActorWidget(SensorActor* sensorActor, SensorStore* sensors = nullptr, QWidget *parent = nullptr); + explicit SensorActorWidget(std::shared_ptr sensorActor, SensorStore* sensors = nullptr, QWidget *parent = nullptr); ~SensorActorWidget(); private slots: diff --git a/src/ui/actorwidgets/timeractorwidget.cpp b/src/ui/actorwidgets/timeractorwidget.cpp index 49296be..f1f6bf7 100644 --- a/src/ui/actorwidgets/timeractorwidget.cpp +++ b/src/ui/actorwidgets/timeractorwidget.cpp @@ -3,7 +3,7 @@ #include -TimerActorWidget::TimerActorWidget(TimerActor* actor, QWidget *parent) : +TimerActorWidget::TimerActorWidget(std::shared_ptr actor, QWidget *parent) : QWidget(parent), ui(new Ui::TimerActorWidget) { @@ -11,7 +11,7 @@ TimerActorWidget::TimerActorWidget(TimerActor* actor, QWidget *parent) : ui->spinBox->setValue(actor->getTimeout()); - connect(ui->spinBox, SIGNAL(valueChanged(int)), actor, SLOT(setTimeout(int))); + connect(ui->spinBox, SIGNAL(valueChanged(int)), actor.get(), SLOT(setTimeout(int))); } TimerActorWidget::~TimerActorWidget() diff --git a/src/ui/actorwidgets/timeractorwidget.h b/src/ui/actorwidgets/timeractorwidget.h index a4179c0..4a88cb6 100644 --- a/src/ui/actorwidgets/timeractorwidget.h +++ b/src/ui/actorwidgets/timeractorwidget.h @@ -13,7 +13,7 @@ class TimerActorWidget : public QWidget Q_OBJECT public: - explicit TimerActorWidget(TimerActor* actor, QWidget *parent = nullptr); + explicit TimerActorWidget(std::shared_ptr actor, QWidget *parent = nullptr); ~TimerActorWidget(); private: diff --git a/src/ui/itemcreationdialog.cpp b/src/ui/itemcreationdialog.cpp index f3d40d3..bd225c6 100644 --- a/src/ui/itemcreationdialog.cpp +++ b/src/ui/itemcreationdialog.cpp @@ -2,6 +2,7 @@ #include "ui_itemcreationdialog.h" #include "itemsettingswidgets/messageitemsettingswidget.h" +#include "itemsettingswidgets/systemitemsettingswidget.h" ItemCreationDialog::ItemCreationDialog(QWidget *parent) : QDialog(parent), @@ -31,7 +32,14 @@ void ItemCreationDialog::itemTypeChanged(const QString& type) std::shared_ptr messageItem(new MessageItem); item = messageItem; widget = new MessageItemSettingsWidget(messageItem, this); - ui->verticalLayout_2->addWidget(widget); + ui->verticalLayout->addWidget(widget); + } + if(type == "System") + { + std::shared_ptr systemItem(new SystemItem); + item = systemItem; + widget = new SystemItemSettingsWidget(systemItem, this); + ui->verticalLayout->addWidget(widget); } } diff --git a/src/ui/itemcreationdialog.ui b/src/ui/itemcreationdialog.ui index f13aed6..4b55d6d 100644 --- a/src/ui/itemcreationdialog.ui +++ b/src/ui/itemcreationdialog.ui @@ -34,6 +34,11 @@ Message + + + System + + diff --git a/src/ui/itemsettingsdialog.cpp b/src/ui/itemsettingsdialog.cpp index c5df21e..e23d051 100644 --- a/src/ui/itemsettingsdialog.cpp +++ b/src/ui/itemsettingsdialog.cpp @@ -6,10 +6,14 @@ #include "../actors/timeractor.h" #include "../actors/regulator.h" #include "../actors/factoractor.h" - +#include "../items/messageitem.h" +#include "../items/systemitem.h" +#include "./itemsettingswidgets/messageitemsettingswidget.h" +#include "./itemsettingswidgets/systemitemsettingswidget.h" +#include "./itemsettingswidgets/relayitemsettingswidget.h" #include -ItemSettingsDialog::ItemSettingsDialog(Item* item, QWidget *parent) : +ItemSettingsDialog::ItemSettingsDialog(std::shared_ptr item, QWidget *parent) : QDialog(parent), item_(item), ui(new Ui::ItemSettingsDialog) @@ -19,23 +23,32 @@ ItemSettingsDialog::ItemSettingsDialog(Item* item, QWidget *parent) : setModal(false); ui->label_name->setText(item_->getName()); + ui->checkBox_Override->setChecked(item_->getOverride()); - if(Relay* relay = dynamic_cast(item_)) + + if(std::shared_ptr relay = std::dynamic_pointer_cast(item_)) { - ui->label_address->setText(QString::number(relay->getAddress(), 2)); - ui->label_id->setText(QString::number(relay->getId(), 10)); + itemSpecificWidget_ = new RelayItemSettingsWidget(relay); } - else + else if(std::shared_ptr msgItem = std::dynamic_pointer_cast(item_)) { - ui->label_address->hide(); - ui->label_id->hide(); - ui->label_address_lable->hide(); - ui->label_id_lable->hide(); + itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem); + } + else if(std::shared_ptr sysItem = std::dynamic_pointer_cast(item_)) + { + itemSpecificWidget_ = new SystemItemSettingsWidget(sysItem); + } + + if(itemSpecificWidget_) + { + ui->verticalLayout_2->addWidget(itemSpecificWidget_); } connect(ui->pushButton_add, &QPushButton::clicked, this, &ItemSettingsDialog::addActor); connect(ui->pushButton_remove, &QPushButton::clicked, this, &ItemSettingsDialog::removeActor); connect(ui->pushButton_edit, &QPushButton::clicked, this, &ItemSettingsDialog::editActor); + connect(ui->checkBox_Override, &QPushButton::clicked, this, &ItemSettingsDialog::changeOverride); + ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Actor")); ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Action")); @@ -48,9 +61,15 @@ ItemSettingsDialog::ItemSettingsDialog(Item* item, QWidget *parent) : ItemSettingsDialog::~ItemSettingsDialog() { + if(itemSpecificWidget_) delete itemSpecificWidget_; delete ui; } +void ItemSettingsDialog::changeOverride() +{ + item_->setOverride(ui->checkBox_Override->isChecked()); +} + void ItemSettingsDialog::loadActorList() { //ui->listWidget->clear(); @@ -67,43 +86,43 @@ void ItemSettingsDialog::loadActorList() void ItemSettingsDialog::addActor() { ActorSettingsDialog* dialog = nullptr; - Actor* actor = nullptr; + std::shared_ptr actor = nullptr; if(ui->comboBox->currentText() == "Alarm") { - AlarmTime* alarm = new AlarmTime; + std::shared_ptr alarm = std::shared_ptr(new AlarmTime); actor = alarm; dialog = new ActorSettingsDialog(alarm, this); } else if(ui->comboBox->currentText() == "Sensor") { - SensorActor* sensorActor = new SensorActor(); + std::shared_ptr sensorActor = std::shared_ptr(new SensorActor); actor = sensorActor; dialog = new ActorSettingsDialog(sensorActor, this); } else if(ui->comboBox->currentText() == "Timer" ) { - TimerActor* timerActor = new TimerActor(); + std::shared_ptr timerActor = std::shared_ptr(new TimerActor); actor = timerActor; dialog = new ActorSettingsDialog(timerActor, this); } else if(ui->comboBox->currentText() == "Regulator") { - Regulator* regulator = new Regulator(); + std::shared_ptr regulator = std::shared_ptr(new Regulator); actor = regulator; dialog = new ActorSettingsDialog(regulator, this); } else if(ui->comboBox->currentText() == "Polynomal") { - PolynomalActor* polynomalActor = new PolynomalActor(); + std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor); actor = polynomalActor; dialog = new ActorSettingsDialog(polynomalActor, this); } else if(ui->comboBox->currentText() == "Multi Factor") { - MultiFactorActor* polynomalActor = new MultiFactorActor(); + std::shared_ptr polynomalActor = std::shared_ptr(new MultiFactorActor); actor = polynomalActor; dialog = new ActorSettingsDialog(polynomalActor, this); } @@ -118,7 +137,6 @@ void ItemSettingsDialog::addActor() item_->addActor(actor); loadActorList(); } - else delete actor; delete dialog; } @@ -137,14 +155,14 @@ void ItemSettingsDialog::editActor() { if(item_->getActors().size() > ui->tableWidget->currentRow()) { - Actor* actor = item_->getActors()[ui->tableWidget->currentRow()]; + std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; - AlarmTime* alarmTime = dynamic_cast(actor); - Regulator* regulator = dynamic_cast(actor); - SensorActor* sensorActor = dynamic_cast(actor); - TimerActor* timerActor = dynamic_cast(actor); - PolynomalActor* polynomalActor = dynamic_cast(actor); - MultiFactorActor* factorActor = dynamic_cast(actor); + std::shared_ptr alarmTime = std::dynamic_pointer_cast(actor); + std::shared_ptr regulator = std::dynamic_pointer_cast(actor); + std::shared_ptr sensorActor = std::dynamic_pointer_cast(actor); + std::shared_ptr timerActor = std::dynamic_pointer_cast(actor); + std::shared_ptr polynomalActor = std::dynamic_pointer_cast(actor); + std::shared_ptr factorActor = std::dynamic_pointer_cast(actor); ActorSettingsDialog* dialog; diff --git a/src/ui/itemsettingsdialog.h b/src/ui/itemsettingsdialog.h index c5056c0..1a9fa34 100644 --- a/src/ui/itemsettingsdialog.h +++ b/src/ui/itemsettingsdialog.h @@ -3,6 +3,7 @@ #include #include +#include #include "../items/relay.h" namespace Ui { @@ -12,13 +13,14 @@ class ItemSettingsDialog; class ItemSettingsDialog : public QDialog { Q_OBJECT - Item* item_; + std::shared_ptr item_; + QWidget* itemSpecificWidget_ = nullptr; private: void loadActorList(); public: - explicit ItemSettingsDialog(Item* item, QWidget *parent = nullptr); + explicit ItemSettingsDialog(std::shared_ptr item, QWidget *parent = nullptr); ~ItemSettingsDialog(); private slots: @@ -26,6 +28,7 @@ private slots: void removeActor(); void addActor(); void editActor(); + void changeOverride(); private: Ui::ItemSettingsDialog *ui; diff --git a/src/ui/itemsettingsdialog.ui b/src/ui/itemsettingsdialog.ui index 940ac20..871bb9f 100644 --- a/src/ui/itemsettingsdialog.ui +++ b/src/ui/itemsettingsdialog.ui @@ -30,23 +30,16 @@ 10 - + - ID: - - - - - - - TextLabel + Name: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + @@ -65,35 +58,18 @@ - - - - Address - - - - - - - TextLabel - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Name: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - + + + + + + + Override + + + diff --git a/src/ui/itemsettingswidgets/relayitemsettingswidget.cpp b/src/ui/itemsettingswidgets/relayitemsettingswidget.cpp new file mode 100644 index 0000000..4c78913 --- /dev/null +++ b/src/ui/itemsettingswidgets/relayitemsettingswidget.cpp @@ -0,0 +1,21 @@ +#include "relayitemsettingswidget.h" +#include "ui_relayitemsettingswidget.h" + + +RelayItemSettingsWidget::RelayItemSettingsWidget(std::weak_ptr relay, QWidget *parent) : + QWidget(parent), + ui(new Ui::RelayItemSettingsWidget) +{ + ui->setupUi(this); + auto relayPtr = relay.lock(); + if(relayPtr) + { + ui->label_ID->setText(QString::number(relayPtr->getId())); + ui->label_Addr->setText(QString::number(relayPtr->getAddress(),2)); + } +} + +RelayItemSettingsWidget::~RelayItemSettingsWidget() +{ + delete ui; +} diff --git a/src/ui/itemsettingswidgets/relayitemsettingswidget.h b/src/ui/itemsettingswidgets/relayitemsettingswidget.h new file mode 100644 index 0000000..400f21a --- /dev/null +++ b/src/ui/itemsettingswidgets/relayitemsettingswidget.h @@ -0,0 +1,24 @@ +#ifndef RELAYITEMSETTINGSWIDGET_H +#define RELAYITEMSETTINGSWIDGET_H + +#include +#include +#include "../../items/relay.h" + +namespace Ui { +class RelayItemSettingsWidget; +} + +class RelayItemSettingsWidget : public QWidget +{ + Q_OBJECT + +public: + explicit RelayItemSettingsWidget(std::weak_ptr relay, QWidget *parent = nullptr); + ~RelayItemSettingsWidget(); + +private: + Ui::RelayItemSettingsWidget *ui; +}; + +#endif // RELAYITEMSETTINGSWIDGET_H diff --git a/src/ui/itemsettingswidgets/relayitemsettingswidget.ui b/src/ui/itemsettingswidgets/relayitemsettingswidget.ui new file mode 100644 index 0000000..e0740b0 --- /dev/null +++ b/src/ui/itemsettingswidgets/relayitemsettingswidget.ui @@ -0,0 +1,85 @@ + + + RelayItemSettingsWidget + + + + 0 + 0 + 400 + 58 + + + + + 0 + 0 + + + + Form + + + + + + + 0 + 0 + + + + ID: + + + + + + + + 0 + 0 + + + + Address: + + + + + + + + 0 + 0 + + + + TextLabel + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + TextLabel + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + diff --git a/src/ui/itemsettingswidgets/systemitemsettingswidget.cpp b/src/ui/itemsettingswidgets/systemitemsettingswidget.cpp new file mode 100644 index 0000000..49d476f --- /dev/null +++ b/src/ui/itemsettingswidgets/systemitemsettingswidget.cpp @@ -0,0 +1,40 @@ +#include "systemitemsettingswidget.h" +#include "ui_systemitemsettingswidget.h" + +SystemItemSettingsWidget::SystemItemSettingsWidget(std::weak_ptr item, QWidget *parent) : + QWidget(parent), + item_(item), + ui(new Ui::SystemItemSettingsWidget) +{ + ui->setupUi(this); + if(auto itemPtr = item_.lock()) + { + ui->lineEdit_on->setText(itemPtr->getOnCommand()); + ui->lineEdit_off->setText(itemPtr->getOffCommand()); + } + else setDisabled(true); + + connect(ui->lineEdit_on, &QLineEdit::textChanged, this, &SystemItemSettingsWidget::setOn); + connect(ui->lineEdit_off, &QLineEdit::textChanged, this, &SystemItemSettingsWidget::setOff); +} + +void SystemItemSettingsWidget::setOn(const QString& in) +{ + if(auto itemPtr = item_.lock()) + { + itemPtr->setOnCommand(in); + } +} + +void SystemItemSettingsWidget::setOff(const QString& in) +{ + if(auto itemPtr = item_.lock()) + { + itemPtr->setOffCommand(in); + } +} + +SystemItemSettingsWidget::~SystemItemSettingsWidget() +{ + delete ui; +} diff --git a/src/ui/itemsettingswidgets/systemitemsettingswidget.h b/src/ui/itemsettingswidgets/systemitemsettingswidget.h new file mode 100644 index 0000000..5b401f7 --- /dev/null +++ b/src/ui/itemsettingswidgets/systemitemsettingswidget.h @@ -0,0 +1,30 @@ +#ifndef SYSTEMITEMSETTINGSWIDGET_H +#define SYSTEMITEMSETTINGSWIDGET_H + +#include +#include +#include "../../items/systemitem.h" + +namespace Ui { +class SystemItemSettingsWidget; +} + +class SystemItemSettingsWidget : public QWidget +{ + Q_OBJECT + std::weak_ptr item_; + +private slots: + + void setOn(const QString &in); + void setOff(const QString &in); + +public: + explicit SystemItemSettingsWidget(std::weak_ptr item, QWidget *parent = nullptr); + ~SystemItemSettingsWidget(); + +private: + Ui::SystemItemSettingsWidget *ui; +}; + +#endif // SYSTEMITEMSETTINGSWIDGET_H diff --git a/src/ui/itemsettingswidgets/systemitemsettingswidget.ui b/src/ui/itemsettingswidgets/systemitemsettingswidget.ui new file mode 100644 index 0000000..c21889b --- /dev/null +++ b/src/ui/itemsettingswidgets/systemitemsettingswidget.ui @@ -0,0 +1,47 @@ + + + SystemItemSettingsWidget + + + + 0 + 0 + 400 + 92 + + + + + 0 + 0 + + + + Form + + + + + + On command + + + + + + + + + + + + + Off command + + + + + + + + diff --git a/src/ui/itemwidget.cpp b/src/ui/itemwidget.cpp index a1f47bb..a195e73 100644 --- a/src/ui/itemwidget.cpp +++ b/src/ui/itemwidget.cpp @@ -64,6 +64,8 @@ void ItemWidget::disable() { ui->checkBox->setEnabled(false); ui->label->setEnabled(false); + ui->slider->setEnabled(false); + ui->pushButton_Remove->setEnabled(false); } bool ItemWidget::controles(const ItemData& relay) @@ -80,7 +82,7 @@ void ItemWidget::showSettingsDialog() { if(auto workingRelay = item_.lock()) { - ItemSettingsDialog dialog(workingRelay.get(), this); + ItemSettingsDialog dialog(workingRelay, this); dialog.exec(); } else disable(); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 7b8fa6f..c59e15c 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -10,7 +10,7 @@ MainWindow::MainWindow(MainObject * const mainObject, QWidget *parent) : ui(new Ui::MainWindow), colorChooser(this), _micro(&mainObject->micro), - _powerItem(&mainObject->powerItem) + _powerItem(mainObject->powerItem) { ui->setupUi(this); @@ -21,7 +21,11 @@ MainWindow::MainWindow(MainObject * const mainObject, QWidget *parent) : //Relays if(mainObject->master)connect(ui->pushButton_refesh, &QPushButton::clicked, _micro, &Microcontroller::requestState); - else connect(ui->pushButton_refesh, &QPushButton::clicked, &mainObject->broadCast, &BroadCast::requestJson); + else + { + connect(ui->pushButton_refesh, &QPushButton::clicked, &mainObject->broadCast, &BroadCast::requestJson); + connect(ui->pushButton_refesh, &QPushButton::clicked, &mainObject->broadCast, &BroadCast::requestSensors); + } connect(&mainObject->items, &ItemStore::itemAdded, ui->relayList, &ItemScrollBox::addItem); connect(&mainObject->items, &ItemStore::itemDeleted, ui->relayList, &ItemScrollBox::removeItem); @@ -51,7 +55,7 @@ MainWindow::~MainWindow() void MainWindow::showPowerItemDialog() { - ItemSettingsDialog diag(_powerItem, this); + ItemSettingsDialog diag(std::shared_ptr(_powerItem), this); diag.show(); diag.exec(); } diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index f51615f..3a5c09c 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -36,7 +36,7 @@ private: Microcontroller *_micro; - PowerItem *_powerItem; + std::shared_ptr _powerItem; signals: diff --git a/src/ui/sensorlistwidget.cpp b/src/ui/sensorlistwidget.cpp index b23f4bd..1f7a823 100644 --- a/src/ui/sensorlistwidget.cpp +++ b/src/ui/sensorlistwidget.cpp @@ -2,13 +2,16 @@ #include #include +#include SensorListWidget::SensorListWidget(const bool showHidden, QWidget *parent): QTableWidget(parent), showHidden_(showHidden) { setColumnCount(2); setSelectionBehavior(QAbstractItemView::SelectRows); horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - + QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture); + setAutoScroll(true); + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor")); setHorizontalHeaderItem(1, new QTableWidgetItem("Value")); }