diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 924e5f0..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,174 +0,0 @@ -cmake_minimum_required(VERSION 4.0) - -project(SHinterface VERSION 1.0 LANGUAGES CXX) - -# Set C++ standard -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# Enable all warnings -add_compile_options(-Wall) - -# Find Qt packages -find_package(Qt6 COMPONENTS Core Gui Widgets Network Multimedia SerialPort Mqtt REQUIRED) - -# Find dependencies using pkg-config -find_package(PkgConfig REQUIRED) -pkg_check_modules(PIPEWIRE REQUIRED libpipewire-0.3) -pkg_check_modules(LIBNL3 REQUIRED libnl-3.0 libnl-genl-3.0) - -# Enable automatic moc and uic processing -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTOUIC ON) - -# Add src to include path for relative includes -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) - -# Create executable -add_executable(SHinterface - src/sensors/mqttsensorsource.h src/sensors/mqttsensorsource.cpp) - -# Add sources to executable -target_sources(SHinterface - PRIVATE - src/main.cpp - src/mainobject.h - src/mainobject.cpp - src/apgetconnected.h - src/apgetconnected.cpp - src/microcontroller.h - src/microcontroller.cpp - src/sun.h - src/sun.cpp - src/programmode.h - src/programmode.cpp - src/pipewire.h - src/pipewire.cpp - - src/service/service.h - src/service/service.cpp - src/service/tcpclient.h - src/service/tcpclient.cpp - src/service/tcpserver.h - src/service/tcpserver.cpp - - src/actors/actor.h - src/actors/actor.cpp - src/actors/factoractor.h - src/actors/factoractor.cpp - src/actors/polynomalactor.h - src/actors/polynomalactor.cpp - src/actors/sensoractor.h - src/actors/sensoractor.cpp - src/actors/alarmtime.h - src/actors/alarmtime.cpp - src/actors/regulator.h - src/actors/regulator.cpp - src/actors/timeractor.h - src/actors/timeractor.cpp - - src/sensors/sensor.h - src/sensors/sensor.cpp - src/sensors/sunsensor.h - src/sensors/sunsensor.cpp - - src/items/item.h - src/items/item.cpp - src/items/relay.h - src/items/relay.cpp - src/items/poweritem.h - src/items/poweritem.cpp - src/items/messageitem.h - src/items/messageitem.cpp - src/items/systemitem.h - src/items/systemitem.cpp - src/items/auxitem.h - src/items/auxitem.cpp - src/items/rgbitem.h - src/items/rgbitem.cpp - src/items/itemsource.h - src/items/itemsource.cpp - src/items/itemloadersource.h - src/items/itemloadersource.cpp - src/items/fixeditemsource.h - src/items/fixeditemsource.cpp - src/items/itemstore.h - src/items/itemstore.cpp - - src/ui/mainwindow.h - src/ui/mainwindow.cpp - src/ui/itemwidget.h - src/ui/itemwidget.cpp - src/ui/itemscrollbox.h - src/ui/itemscrollbox.cpp - src/ui/sensorlistwidget.h - src/ui/sensorlistwidget.cpp - src/ui/itemcreationdialog.h - src/ui/itemcreationdialog.cpp - src/ui/itemsettingsdialog.h - src/ui/itemsettingsdialog.cpp - src/ui/actorsettingsdialog.h - src/ui/actorsettingsdialog.cpp - - src/ui/actorwidgets/factoractorwidget.h - src/ui/actorwidgets/factoractorwidget.cpp - src/ui/actorwidgets/polynomalactorwidget.h - src/ui/actorwidgets/polynomalactorwidget.cpp - src/ui/actorwidgets/sensoractorwidget.h - src/ui/actorwidgets/sensoractorwidget.cpp - src/ui/actorwidgets/timeractorwidget.h - src/ui/actorwidgets/timeractorwidget.cpp - src/ui/actorwidgets/alarmwidget.h - src/ui/actorwidgets/alarmwidget.cpp - src/ui/actorwidgets/regulatorwdiget.h - src/ui/actorwidgets/regulatorwdiget.cpp - - src/ui/itemsettingswidgets/messageitemsettingswidget.h - src/ui/itemsettingswidgets/messageitemsettingswidget.cpp - src/ui/itemsettingswidgets/relayitemsettingswidget.h - src/ui/itemsettingswidgets/relayitemsettingswidget.cpp - src/ui/itemsettingswidgets/systemitemsettingswidget.h - src/ui/itemsettingswidgets/systemitemsettingswidget.cpp -) - -# Add UI files -target_sources(SHinterface - PRIVATE - src/ui/mainwindow.ui - src/ui/itemwidget.ui - src/ui/relayscrollbox.ui - src/ui/itemcreationdialog.ui - src/ui/itemsettingsdialog.ui - src/ui/actorsettingsdialog.ui - src/ui/actorwidgets/factoractorwidget.ui - src/ui/actorwidgets/polynomalactorwidget.ui - src/ui/actorwidgets/sensoractorwidget.ui - src/ui/actorwidgets/timeractorwidget.ui - src/ui/actorwidgets/alarmwidget.ui - src/ui/actorwidgets/regulatorwdiget.ui - src/ui/itemsettingswidgets/messageitemsettingswidget.ui - src/ui/itemsettingswidgets/relayitemsettingswidget.ui - src/ui/itemsettingswidgets/systemitemsettingswidget.ui -) - -# Add resource file -target_sources(SHinterface - PRIVATE - resources.qrc -) - -# Link libraries -target_link_libraries(SHinterface - Qt6::Core - Qt6::Gui - Qt6::Widgets - Qt6::Network - Qt6::Multimedia - Qt6::SerialPort - Qt6::Mqtt - ${PIPEWIRE_LIBRARIES} - ${LIBNL3_LIBRARIES} -) - -# Add include paths -include_directories(${PIPEWIRE_INCLUDE_DIRS} ${LIBNL3_INCLUDE_DIRS}) diff --git a/SHinterface.pro b/SHinterface.pro new file mode 100644 index 0000000..4ee98f9 --- /dev/null +++ b/SHinterface.pro @@ -0,0 +1,156 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2017-06-01T22:31:38 +# +#------------------------------------------------- + +QT += core gui widgets network multimedia + +QT += serialport + +TARGET = SHinterface +TEMPLATE = app + +INCLUDEPATH += /usr/include/libnl3/ + +LIBS += -lnl-3 -lnl-genl-3 + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which as been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +QMAKE_CXXFLAGS += -std=c++17 -O2 + +SOURCES += \ + src/actors/factoractor.cpp \ + src/actors/polynomalactor.cpp \ + 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 \ + src/mainobject.cpp \ + src/apgetconnected.cpp \ + src/ui/actorwidgets/polynomalactorwidget.cpp \ + 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 \ + src/items/poweritem.cpp \ + src/ui/actorwidgets/regulatorwdiget.cpp + +SOURCES += \ + src/ui/actorsettingsdialog.cpp \ + src/ui/mainwindow.cpp \ + src/ui/sensorlistwidget.cpp + +SOURCES += \ + src/actors/actor.cpp \ + src/actors/sensoractor.cpp \ + src/actors/alarmtime.cpp \ + src/actors/regulator.cpp \ + src/actors/timeractor.cpp + +SOURCES += \ + src/sensors/sensor.cpp \ + src/sensors/speakersensor.cpp \ + src/sensors/sunsensor.cpp \ + src/sensors/ocupancysensor.cpp + +SOURCES += \ + src/items/relay.cpp \ + src/items/item.cpp \ + src/items/itemstore.cpp \ + src/items/auxitem.cpp \ + src/items/rgbitem.cpp + +SOURCES += \ + src/alarmactions.cpp \ + src/main.cpp \ + src/microcontroller.cpp \ + src/sun.cpp + + +HEADERS += \ + src/actors/factoractor.h \ + src/actors/polynomalactor.h \ + 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 \ + src/mainobject.h \ + src/apgetconnected.h \ + src/ui/actorwidgets/alarmwidget.h \ + 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 \ + src/items/poweritem.h \ + src/ui/actorwidgets/regulatorwdiget.h + +HEADERS += \ + src/ui/actorsettingsdialog.h \ + src/ui/mainwindow.h \ + src/ui/sensorlistwidget.h + +HEADERS += \ + src/actors/actor.h \ + src/actors/alarmtime.h \ + src/actors/sensoractor.h \ + src/actors/regulator.h \ + src/actors/timeractor.h + +HEADERS += \ + src/sensors/sensor.h \ + src/sensors/speakersensor.h \ + src/sensors/sunsensor.h \ + src/sensors/ocupancysensor.h + +HEADERS += \ + src/items/relay.h \ + src/items/item.h \ + src/items/itemstore.h \ + src/items/auxitem.h \ + src/items/rgbitem.h + +HEADERS += \ + src/alarmactions.h \ + src/microcontroller.h \ + src/sun.h + +FORMS += \ + src/ui/actorwidgets/factoractorwidget.ui \ + src/ui/itemcreationdialog.ui \ + 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 \ + src/ui/actorwidgets/alarmwidget.ui \ + src/ui/actorwidgets/timeractorwidget.ui \ + src/ui/itemsettingsdialog.ui \ + src/ui/itemwidget.ui \ + src/ui/actorwidgets/regulatorwdiget.ui + +android:FORMS += src/ui/mainwindow-android.ui + +RESOURCES += \ + resources.qrc diff --git a/src/actor.cpp.autosave b/src/actor.cpp.autosave new file mode 100644 index 0000000..72a0dd4 --- /dev/null +++ b/src/actor.cpp.autosave @@ -0,0 +1,100 @@ +#include "actor.h" +#include + +Actor::Actor(QObject *parent): QObject(parent) +{ + buildName(); +} + +Actor::~Actor() +{ + +} + +void Actor::performAction() +{ + if(active) + { + trigger(); + if(action_ == ACTION_OFF) off(); + else if(action_ == ACTION_ON) on(); + else if(action_ != ACTION_TOGGLE) toggle(); + else if(action_ != ACTION_VALUE) sigValue(value_); + } +} + +void Actor::makeActive() +{ + active = true; +} + + +void Actor::makeInactive() +{ + active = false; +} + +void Actor::buildName() +{ + name = "Actor"; + appendActionToName(); +} + +void Actor::appendActionToName() +{ + if(action_ == ACTION_OFF || action_ == ACTION_DEFAULT ) name.append("off"); + else if(action_ == ACTION_ON ) name.append("on"); + else if(action_ == ACTION_TOGGLE ) name.append("toggle"); + else if(action_ == ACTION_VALUE ) name.append("value to " + QString::number(value_)); +} + +void Actor::setActive(int state) +{ + state ? makeActive() : makeInactive(); + buildName(); +} + +bool Actor::isActive() +{ + return active; +} + +bool Actor::isExausted() +{ + return exausted; +} + +void Actor::saveSettings(QString subsecton, QSettings* settings) +{ + settings->setValue(subsecton + "Active", active); + settings->setValue(subsecton + "Exausted", exausted); + settings->setValue(subsecton + "Name", name); + settings->setValue(subsecton + "Action", action_); +} + +void Actor::loadSettings(QString subsecton, QSettings* settings) +{ + active = settings->value(subsecton + "Active").toBool(); + exausted = settings->value(subsecton + "Exausted").toBool(); + name = settings->value(subsecton + "Name").toString(); + action_ = settings->value(subsecton + "Action").toUInt(); +} + +void Actor::setAction(uint8_t action) +{ + action_ = action; + qDebug()<<"setting action to "< Actor::createActor(const QString& type) { - 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; + 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; } std::shared_ptr Actor::loadActor(const QJsonObject &json) { - QString type = json["Type"].toString("Actor"); - std::shared_ptr actor = createActor(type); - if(actor) actor->load(json); - return actor; + QString type = json["Type"].toString("Actor"); + std::shared_ptr actor = createActor(type); + if(actor) actor->load(json); + return actor; } void Actor::setValue(uint8_t value) { - Item::setValue(value); - setActive(value); + Item::setValue(value); + setActive(value); } diff --git a/src/actors/actor.h b/src/actors/actor.h index 7b81bde..a20b5db 100644 --- a/src/actors/actor.h +++ b/src/actors/actor.h @@ -5,50 +5,50 @@ #include #include -#include "items/item.h" +#include "../items/item.h" class Actor : public Item { - Q_OBJECT + Q_OBJECT public: - uint8_t triggerValue = 0; + uint8_t triggerValue = 0; protected: - bool active = true; - bool exausted = false; + bool active = true; + bool exausted = false; - void performAction(); + void performAction(); signals: - void sigValue(uint8_t value); + void sigValue(uint8_t value); public slots: - virtual void makeActive(); - virtual void makeInactive(); - virtual void setActive(uint8_t state); - virtual void onValueChanged(uint8_t state); + virtual void makeActive(); + virtual void makeInactive(); + virtual void setActive(uint8_t state); + virtual void onValueChanged(uint8_t state); - virtual void setValue(uint8_t value); + virtual void setValue(uint8_t value); public: - Actor(QObject* parent = nullptr); - virtual ~Actor(); - bool isExausted(); + Actor(QObject* parent = nullptr); + virtual ~Actor(); + bool isExausted(); - virtual QString actionName(); + virtual QString actionName(); - bool isActive(); - void setTriggerValue(uint8_t value); + bool isActive(); + void setTriggerValue(uint8_t value); - uint8_t getTriggerValue(); + uint8_t getTriggerValue(); - static std::shared_ptr 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 std::shared_ptr loadActor(const QJsonObject& json); + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, const bool preserve = false); + static std::shared_ptr loadActor(const QJsonObject& json); }; #endif // ACTOR_H diff --git a/src/actors/alarmtime.cpp b/src/actors/alarmtime.cpp index 0f38f27..e4c7812 100644 --- a/src/actors/alarmtime.cpp +++ b/src/actors/alarmtime.cpp @@ -2,132 +2,132 @@ AlarmTime::AlarmTime(const QDateTime time, QObject *parent) : Actor(parent), time_(time) { - connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); - timer.setInterval(1000); - AlarmTime::run(); + connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); + timer.setInterval(1000); + run(); } AlarmTime::~AlarmTime() { - AlarmTime::makeInactive(); + makeInactive(); } void AlarmTime::run() { - AlarmTime::makeInactive(); + makeInactive(); - active = true; - timer.start(); + active = true; + timer.start(); } void AlarmTime::makeActive() { - run(); + run(); } QString AlarmTime::getName() const { - if(name_.size() > 0)return name_; - else - { - QString string; - string = "Alarm: "; - if(repeat_ == REPEAT_DAILY) - { - string.append("daily "); - string.append(time_.toString("HH:mm")); - } - else if(repeat_ == REPEAT_WEEKLY) - { - string.append("weekly "); - string.append(time_.toString("ddd HH:mm")); + if(name_.size() > 0)return name_; + else + { + QString string; + string = "Alarm: "; + if(repeat_ == REPEAT_DAILY) + { + string.append("daily "); + string.append(time_.toString("HH:mm")); + } + else if(repeat_ == REPEAT_WEEKLY) + { + string.append("weekly "); + string.append(time_.toString("ddd HH:mm")); - } - else if(repeat_ == REPEAT_MONTHLY) - { - string.append("monthly "); - string.append(time_.toString("dd HH:mm")); - } - else if(repeat_ == REPEAT_YEARLY) - { - string.append("yearly "); - string.append(time_.toString("dd.mm HH:mm")); + } + else if(repeat_ == REPEAT_MONTHLY) + { + string.append("monthly "); + string.append(time_.toString("dd HH:mm")); + } + else if(repeat_ == REPEAT_YEARLY) + { + string.append("yearly "); + string.append(time_.toString("dd.mm HH:mm")); - } - else string.append(time_.toString("dd.mm.yyyy HH:mm")); - return string; - } + } + else string.append(time_.toString("dd.mm.yyyy HH:mm")); + return string; + } } void AlarmTime::setRepeat(const uint8_t repeat) { - repeat_ = repeat; - exausted = false; + repeat_=repeat; + exausted = false; } uint8_t AlarmTime::getRepeat() { - return repeat_; + return repeat_; } QDateTime AlarmTime::getDateTime() { - return time_; + return time_; } void AlarmTime::makeInactive() { - timer.stop(); - active = false; + timer.stop(); + active = false; } void AlarmTime::doTick() { - if( - ( - (triggerd_ == false) && - (time_.date().year() == QDate::currentDate().year() || repeat_ != REPEAT_NEVER) && - (time_.date().month() == QDate::currentDate().month() || repeat_ == REPEAT_MONTHLY || repeat_ == REPEAT_DAILY) && - (time_.date().day() == QDate::currentDate().day() || repeat_ == REPEAT_DAILY) - ) - || - ( - (repeat_ == REPEAT_WEEKLY) && - (time_.date().dayOfWeek() == QDate::currentDate().dayOfWeek()) - ) - ) - { - if(time_.time().hour() == QTime::currentTime().hour() && time_.time().minute() == QTime::currentTime().minute()) - { - triggerd_=true; - performAction(); - if(repeat_ == REPEAT_NEVER) exausted = true; - } - } - else if( repeat_ != REPEAT_NEVER && time_.time().hour() != QTime::currentTime().hour() ) triggerd_=false; + if( + ( + (triggerd_ == false) && + (time_.date().year() == QDate::currentDate().year() || repeat_ != REPEAT_NEVER) && + (time_.date().month() == QDate::currentDate().month() || repeat_ == REPEAT_MONTHLY || repeat_ == REPEAT_DAILY) && + (time_.date().day() == QDate::currentDate().day() || repeat_ == REPEAT_DAILY) + ) + || + ( + (repeat_ == REPEAT_WEEKLY) && + (time_.date().dayOfWeek() == QDate::currentDate().dayOfWeek()) + ) + ) + { + if(time_.time().hour() == QTime::currentTime().hour() && time_.time().minute() == QTime::currentTime().minute()) + { + triggerd_=true; + performAction(); + if(repeat_ == REPEAT_NEVER) exausted = true; + } + } + else if( repeat_ != REPEAT_NEVER && time_.time().hour() != QTime::currentTime().hour() ) triggerd_=false; } void AlarmTime::changeTime(const QDateTime& time) { - time_=time; - exausted = false; - qDebug()<<"time: "< activationTime ) - { - performAction(); - } - exausted = true; - for(size_t i = 0; i < getActors().size(); ++i) if(!getActors()[i]->isExausted()) - exausted = false; - } + if(value) + { + QDateTime current = QDateTime::currentDateTime(); + if(current.addSecs(-preCancleMin_*60) > activationTime ) + { + performAction(); + } + bool exausted = true; + for(size_t i = 0; i < getActors().size(); ++i) if(!getActors()[i]->isExausted()) exausted = false; + } } QString MultiFactorActor::getName() const { - if(name_.size() > 0) return name_; - else - { - QString string; - string = "Multi Factor \"" + (factorActor_ ? factorActor_->getName() : "NULL") + "\""; - return string; - } + if(name_.size() > 0) return name_; + else + { + QString string; + string = "Multi Factor \"" + (factorActor_ ? factorActor_->getName() : "NULL") + "\""; + return string; + } } void MultiFactorActor::setFactorActor(std::shared_ptr factorActor) { - factorActor_=factorActor; - connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); + factorActor_=factorActor; + connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); } void MultiFactorActor::store(QJsonObject &json) { - json["Type"] = "MultiFactor"; - Actor::store(json); - json["PreCancleMinutes"] = static_cast(preCancleMin_); - json["FactorDirection"] = factorDirection; - QJsonObject factorActorObject; - if(factorActor_) - { - factorActor_->store(factorActorObject); - } + json["Type"] = "MultiFactor"; + Actor::store(json); + json["PreCancleMinutes"] = static_cast(preCancleMin_); + json["FactorDirection"] = factorDirection; + QJsonObject factorActorObject; + if(factorActor_) + { + factorActor_->store(factorActorObject); + } } void MultiFactorActor::load(const QJsonObject &json, bool preserve) { - Actor::load(json, preserve); - preCancleMin_ = static_cast(json["PreCancleMinutes"].toInt(10)); - factorDirection = json["FacotorDirection"].toBool(true); - if(json["FactorActor"].isObject()) - { - factorActor_ = Actor::loadActor(json["FactorActor"].toObject()); - } - if(factorActor_) - { - connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); - } + Actor::load(json, preserve); + preCancleMin_ = static_cast(json["PreCancleMinutes"].toInt(10)); + factorDirection = json["FacotorDirection"].toBool(true); + if(json["FactorActor"].isObject()) + { + factorActor_ = Actor::loadActor(json["FactorActor"].toObject()); + } + if(factorActor_) + { + connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot); + } } diff --git a/src/actors/factoractor.h b/src/actors/factoractor.h index 104a2c4..8f27a64 100644 --- a/src/actors/factoractor.h +++ b/src/actors/factoractor.h @@ -8,52 +8,37 @@ class MultiFactorActor: public Actor { private: - std::shared_ptr factorActor_; - QDateTime activationTime; - uint preCancleMin_; + std::shared_ptr factorActor_; + QDateTime activationTime; + uint preCancleMin_; - bool factorDirection = true; + bool factorDirection = true; private slots: - void factorActorSlot(uint8_t value); + void factorActorSlot(uint8_t value); public slots: - virtual void setValue(uint8_t value); + virtual void setValue(uint8_t value); public: - MultiFactorActor(Actor* FactorActor = nullptr, const uint preCancleMin = 10, QObject *parent = nullptr); + MultiFactorActor(Actor* FactorActor = nullptr, const uint preCancleMin = 10, QObject *parent = nullptr); - virtual QString getName() const; + virtual QString getName() const; - 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_; - } - void setPreCancleTime(uint minutes) - { - preCancleMin_ = minutes; - } + 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_;} + void setPreCancleTime(uint minutes){preCancleMin_ = minutes;} - virtual ~MultiFactorActor() {} + virtual ~MultiFactorActor(){} - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, bool preserve); + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, bool preserve); }; #endif // REMINDERACTOR_H diff --git a/src/actors/polynomalactor.cpp b/src/actors/polynomalactor.cpp index 053dc30..d9735c3 100644 --- a/src/actors/polynomalactor.cpp +++ b/src/actors/polynomalactor.cpp @@ -12,74 +12,72 @@ PolynomalActor::PolynomalActor(QObject* parent): Actor(parent) void PolynomalActor::setSensor(const Sensor sensor) { - sensor_ = sensor; + sensor_ = sensor; } void PolynomalActor::setCoeffiancts( const double pow3, const double pow2, const double pow1, const double pow0 ) { - pow3_=pow3; - pow2_=pow2; - pow1_=pow1; - pow0_=pow0; + pow3_=pow3; + pow2_=pow2; + pow1_=pow1; + pow0_=pow0; } void PolynomalActor::getCoeffiancts( double& pow3, double& pow2, double& pow1, double& pow0 ) { - pow3=pow3_; - pow2=pow2_; - pow1=pow1_; - pow0=pow0_; + pow3=pow3_; + pow2=pow2_; + pow1=pow1_; + pow0=pow0_; } void PolynomalActor::sensorEvent(Sensor sensor) { - if(active && sensor == sensor_) - { - double result = pow3_*(sensor.field*sensor.field*sensor.field)+pow2_*(sensor.field*sensor.field)+pow1_*sensor.field - +pow0_; - if(result < 0) result = 0; - else if(result > 254) result = 255; - if(result != prevValue)sigValue(static_cast(result)); - prevValue = result; - } + if(active && sensor == sensor_) + { + double result = pow3_*(sensor.field*sensor.field*sensor.field)+pow2_*(sensor.field*sensor.field)+pow1_*sensor.field+pow0_; + if(result < 0) result = 0; + else if(result > 254) result = 255; + if(result != prevValue)sigValue(static_cast(result)); + prevValue = result; + } } void PolynomalActor::store(QJsonObject& json) { - json["Type"] = "Polynomal"; - Actor::store(json); - json["Pow3"] = pow3_; - json["Pow2"] = pow2_; - json["Pow1"] = pow1_; - json["Pow0"] = pow0_; - json["SensorType"] = static_cast(sensor_.type); - json["SensorId"] = static_cast(sensor_.id); - json["SensorField"] = sensor_.field; - json["SensorName"] = sensor_.name; + json["Type"] = "Polynomal"; + Actor::store(json); + json["Pow3"] = pow3_; + json["Pow2"] = pow2_; + json["Pow1"] = pow1_; + json["Pow0"] = pow0_; + json["SensorType"] = static_cast(sensor_.type); + json["SensorId"] = static_cast(sensor_.id); + json["SensorField"] = sensor_.field; + json["SensorName"] = sensor_.name; } void PolynomalActor::load(const QJsonObject& json, bool preserve) { - Actor::load(json, preserve); - pow3_ = json["Pow3"].toDouble(0); - pow2_ = json["Pow2"].toDouble(0); - pow1_ = json["Pow1"].toDouble(1); - pow0_ = json["Pow0"].toDouble(0); - sensor_.type = json["SensorType"].toInt(0); - sensor_.id = json["SensorId"].toInt(0); - sensor_.field = json["SensorField"].toInt(0); - sensor_.name = json["SensorName"].toString("Sensor"); + Actor::load(json, preserve); + pow3_ = json["Pow3"].toDouble(0); + pow2_ = json["Pow2"].toDouble(0); + pow1_ = json["Pow1"].toDouble(1); + pow0_ = json["Pow0"].toDouble(0); + sensor_.type = json["SensorType"].toInt(0); + sensor_.id = json["SensorId"].toInt(0); + sensor_.field = json["SensorField"].toInt(0); + sensor_.name = json["SensorName"].toString("Sensor"); } QString PolynomalActor::getName() const { - if(name_.size() > 0) return name_; - else - { - QString string; - string = QString::number(pow3_) + "x^3 + " + QString::number(pow2_) + "x^2 + " + QString::number( - pow1_) + "x + " + QString::number(pow0_) + " (x: " + sensor_.name + ")"; - return string; - } + if(name_.size() > 0) return name_; + else + { + QString string; + 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/polynomalactor.h b/src/actors/polynomalactor.h index 1ff3675..4dfbcd7 100644 --- a/src/actors/polynomalactor.h +++ b/src/actors/polynomalactor.h @@ -1,42 +1,39 @@ #ifndef POLYNOMALACTOR_H #define POLYNOMALACTOR_H #include "actor.h" -#include "sensors/sensor.h" +#include "../sensors/sensor.h" class PolynomalActor: public Actor { - Q_OBJECT + Q_OBJECT private: - Sensor sensor_; - double pow3_ = 0; - double pow2_ = 0; - double pow1_ = 1; - double pow0_ = 0; + Sensor sensor_; + double pow3_ = 0; + double pow2_ = 0; + double pow1_ = 1; + double pow0_ = 0; - double prevValue = -1; + double prevValue = -1; public slots: - void sensorEvent(Sensor sensor); + void sensorEvent(Sensor sensor); public: - void setCoeffiancts( const double pow3, const double pow2, const double pow1, const double pow0 ); - void getCoeffiancts( double& pow3, double& pow2, double& pow1, double& pow0 ); + void setCoeffiancts( const double pow3, const double pow2, const double pow1, const double pow0 ); + void getCoeffiancts( double& pow3, double& pow2, double& pow1, double& pow0 ); - PolynomalActor(const Sensor sensor, QObject* parent = nullptr); - PolynomalActor(QObject* parent = nullptr); - void setSensor(const Sensor sensor); - Sensor getSensor() - { - return sensor_; - } - virtual QString getName() const; - virtual ~PolynomalActor() {} + PolynomalActor(const Sensor sensor, QObject* parent = nullptr); + PolynomalActor(QObject* parent = nullptr); + void setSensor(const Sensor sensor); + Sensor getSensor(){return sensor_;} + virtual QString getName() const; + virtual ~PolynomalActor(){} - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, bool preserve); + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, bool preserve); }; #endif // POLYNOMALACTOR_H diff --git a/src/actors/regulator.cpp b/src/actors/regulator.cpp index b3ea5f6..9bb403a 100644 --- a/src/actors/regulator.cpp +++ b/src/actors/regulator.cpp @@ -4,120 +4,82 @@ 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) { - sensor_ = sensor; + sensor_ = sensor; } 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); - } - else if( sensor.field > setPoint_+band_ && (sensor.field > sensor_.field || sensor_.field < setPoint_+band_ || first) ) - { - sigValue(!triggerValue); - } - first = false; - sensor_ = sensor; - } -} - -void Regulator::makeInactive() -{ - first = true; - if(active) - sigValue(!triggerValue); - timer.stop(); - Actor::makeInactive(); -} - -void Regulator::timeout() -{ - sigValue(safeValue_); + if(active && sensor == sensor_) + { + if( sensor.field < setPoint_-band_ && (sensor.field < sensor_.field || sensor_.field > setPoint_-band_ || first) ) + { + sigValue(triggerValue); + } + else if( sensor.field > setPoint_+band_ && (sensor.field > sensor_.field || sensor_.field < setPoint_+band_ || first) ) + { + sigValue(!triggerValue); + } + first = false; + sensor_ = sensor; + } } void Regulator::setPoint(float setPoint) { - setPoint_ = setPoint; + setPoint_ = setPoint; } void Regulator::setBand ( float band ) { - band_ = band; + band_ = band; } 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); + invert_ = invert; } 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; - json["SensorName"] = sensor_.name; + json["Type"] = "Regulator"; + Actor::store(json); + json["Band"] = band_; + json["SetPoint"] = setPoint_; + json["SensorType"] = static_cast(sensor_.type); + json["SensorId"] = static_cast(sensor_.id); + json["SensorField"] = sensor_.field; + json["SensorName"] = sensor_.name; } 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); + Actor::load(json, preserve); + band_ = json["Band"].toDouble(1); + setPoint_ = json["SetPoint"].toDouble(22); + sensor_.type = json["SensorType"].toInt(0); + sensor_.id = json["SensorId"].toInt(0); + sensor_.field = json["SensorField"].toInt(0); + sensor_.name = json["SensorName"].toString("Sensor"); } QString Regulator::getName() const { - if(name_.size() > 0) - { - return name_; - } - else - { - QString string; - string = "Regulate \"" + sensor_.name + "\" to "; - string.append(QString::number(setPoint_) + " "); - return string; - } + if(name_.size() > 0) return name_; + else + { + QString string; + string = "Regulate \"" + sensor_.name + "\" to "; + string.append(QString::number(setPoint_) + " "); + return string; + } } diff --git a/src/actors/regulator.h b/src/actors/regulator.h index 339b2ca..8c41e3c 100644 --- a/src/actors/regulator.h +++ b/src/actors/regulator.h @@ -1,68 +1,38 @@ #pragma once - -#include - #include "actor.h" -#include "sensors/sensor.h" +#include "../sensors/sensor.h" class Regulator : public Actor { - Q_OBJECT + Q_OBJECT private: - Sensor sensor_; - float setPoint_ = 0; - float band_ = 1; - bool invert_ = false; - int timeout_ = 1800; - int safeValue_ = 0; - QTimer timer; + Sensor sensor_; + float setPoint_ = 0; + float band_ = 1; + bool invert_ = false; - bool first = true; - -private slots: - - void timeout(); + bool first = true; public slots: - void sensorEvent(Sensor sensor); + void sensorEvent(Sensor sensor); - void setSensor(const Sensor sensor); - void setPoint(float setPoint ); - void setBand (float band ); - void setInvert(bool invert ); - void setSafeValue(int value); - void setTimeout(int value); - virtual void makeInactive() override; + void setSensor(const Sensor sensor); + void setPoint( float setPoint ); + void setBand ( float band ); + void setInvert( bool invert ); public: - float getBand() - { - return band_; - } - float getSetPoint() - { - return setPoint_; - } - int getSafeValue() - { - return safeValue_; - } - int getTimeout() - { - return timeout_; - } - Regulator(const Sensor sensor, QObject* parent = nullptr); - Regulator(QObject* parent = nullptr); - Sensor getSensor() - { - return sensor_; - } - virtual QString getName() const; - virtual ~Regulator() {} - - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, bool preserve); + float getBand() {return band_;} + float getSetPoint() {return setPoint_;} + Regulator(const Sensor sensor, QObject* parent = nullptr); + Regulator(QObject* parent = nullptr); + Sensor getSensor(){return sensor_;} + virtual QString getName() const; + virtual ~Regulator(){} + + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, bool preserve); }; diff --git a/src/actors/sensoractor.cpp b/src/actors/sensoractor.cpp index 0be3ffa..24ad66a 100644 --- a/src/actors/sensoractor.cpp +++ b/src/actors/sensoractor.cpp @@ -14,76 +14,74 @@ SensorActor::SensorActor(QObject* parent): Actor(parent) void SensorActor::setSensor(const Sensor sensor) { - sensor_ = sensor; + sensor_ = sensor; } void SensorActor::sensorEvent(Sensor sensor) { - if(sensor == sensor_) - { - if((sloap_ == SLOPE_UP || sloap_ == SLOPE_BOTH) && sensor_.field < threshold_ - && sensor.field >= threshold_ ) performAction(); - else if((sloap_ == SLOPE_DOWN || sloap_ == SLOPE_BOTH) && sensor_.field > threshold_ - && sensor.field <= threshold_) performAction(); - sensor_ = sensor; - } + if(sensor == sensor_) + { + if((sloap_ == SLOPE_UP || sloap_ == SLOPE_BOTH) && sensor_.field < threshold_ && sensor.field >= threshold_ ) performAction(); + else if((sloap_ == SLOPE_DOWN || sloap_ == SLOPE_BOTH) && sensor_.field > threshold_ && sensor.field <= threshold_) performAction(); + sensor_ = sensor; + } } void SensorActor::setSloap(uint8_t sloap) { - sloap_=sloap; + sloap_=sloap; } void SensorActor::setThreshold(float threshold) { - threshold_ = threshold; + threshold_ = threshold; } float SensorActor::getThreshold() { - return threshold_; + return threshold_; } uint8_t SensorActor::getSloap() { - return sloap_; + return sloap_; } void SensorActor::store(QJsonObject& json) { - json["Type"] = "Sensor"; - Actor::store(json); - json["Sloap"] = sloap_; - json["Threshold"] = threshold_; - json["SensorType"] = static_cast(sensor_.type); - json["SensorId"] = static_cast(sensor_.id); - json["SensorField"] = sensor_.field; - json["SensorName"] = sensor_.name; + json["Type"] = "Sensor"; + Actor::store(json); + json["Sloap"] = sloap_; + json["Threshold"] = threshold_; + json["SensorType"] = static_cast(sensor_.type); + json["SensorId"] = static_cast(sensor_.id); + json["SensorField"] = sensor_.field; + json["SensorName"] = sensor_.name; } void SensorActor::load(const QJsonObject& json, bool preserve) { - Actor::load(json, preserve); - sloap_ = json["Sloap"].toInt(0); - threshold_ = json["Threshold"].toDouble(0); - sensor_.type = json["SensorType"].toInt(0); - sensor_.id = json["SensorId"].toInt(0); - sensor_.field = json["SensorField"].toInt(0); - sensor_.name = json["SensorName"].toString("Sensor"); + Actor::load(json, preserve); + sloap_ = json["Sloap"].toInt(0); + threshold_ = json["Threshold"].toDouble(0); + sensor_.type = json["SensorType"].toInt(0); + sensor_.id = json["SensorId"].toInt(0); + sensor_.field = json["SensorField"].toInt(0); + sensor_.name = json["SensorName"].toString("Sensor"); } QString SensorActor::getName() const { - if(name_.size() > 0) return name_; - else - { - QString string; - string = "Sensor \"" + sensor_.name + "\""; + if(name_.size() > 0) return name_; + else + { + QString string; + string = "Sensor \"" + sensor_.name + "\""; - if(sloap_ == SLOPE_UP) string.append(" rises to "); - else if (sloap_ == SLOPE_DOWN) string.append(" drops to "); - else if (sloap_ == SLOPE_BOTH) string.append(" passes "); + if(sloap_ == SLOPE_UP) string.append(" rises to "); + else if (sloap_ == SLOPE_DOWN) string.append(" drops to "); + else if (sloap_ == SLOPE_BOTH) string.append(" passes "); - string.append(QString::number(threshold_) + " "); - return string; - } + string.append(QString::number(threshold_) + " "); + return string; + } } diff --git a/src/actors/sensoractor.h b/src/actors/sensoractor.h index 27a9355..76241ab 100644 --- a/src/actors/sensoractor.h +++ b/src/actors/sensoractor.h @@ -1,45 +1,42 @@ #pragma once #include "actor.h" -#include "sensors/sensor.h" +#include "../sensors/sensor.h" class SensorActor : public Actor { - Q_OBJECT + Q_OBJECT public: - static constexpr uint8_t SLOPE_UP = 0; - static constexpr uint8_t SLOPE_DOWN = 1; - static constexpr uint8_t SLOPE_BOTH = 2; + static constexpr uint8_t SLOPE_UP = 0; + static constexpr uint8_t SLOPE_DOWN = 1; + static constexpr uint8_t SLOPE_BOTH = 2; private: - Sensor sensor_; - uint8_t sloap_ = SLOPE_UP; - float threshold_ = 0; + Sensor sensor_; + uint8_t sloap_ = SLOPE_UP; + float threshold_ = 0; public slots: + + void sensorEvent(Sensor sensor); - void sensorEvent(Sensor sensor); - - void setSloap(uint8_t sloap); - void setSensor(const Sensor sensor); - void setThreshold( float threshold ); + void setSloap(uint8_t sloap); + void setSensor(const Sensor sensor); + void setThreshold( float threshold ); public: - SensorActor(const Sensor sensor, QObject* parent = nullptr); - SensorActor(QObject* parent = nullptr); - Sensor getSensor() - { - return sensor_; - } - virtual QString getName() const; - virtual ~SensorActor() {} + SensorActor(const Sensor sensor, QObject* parent = nullptr); + SensorActor(QObject* parent = nullptr); + Sensor getSensor(){return sensor_;} + virtual QString getName() const; + virtual ~SensorActor(){} - float getThreshold(); - uint8_t getSloap(); - - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, bool preserve); + float getThreshold(); + uint8_t getSloap(); + + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, bool preserve); }; diff --git a/src/actors/timeractor.cpp b/src/actors/timeractor.cpp index a0a6b1e..98b1b51 100644 --- a/src/actors/timeractor.cpp +++ b/src/actors/timeractor.cpp @@ -3,55 +3,55 @@ TimerActor::TimerActor(const int timeoutSec, QObject *parent): Actor(parent), timeoutMsec_(timeoutSec*1000) { - connect(&timer, &QTimer::timeout, this, &TimerActor::timeout); - timer.setSingleShot(true); + connect(&timer, &QTimer::timeout, this, &TimerActor::timeout); + timer.setSingleShot(true); } void TimerActor::onValueChanged(uint8_t state) { - if((state && !triggerValue) || (!state && triggerValue)) - { - if(timer.isActive()) timer.stop(); - timer.setInterval(timeoutMsec_); - timer.start(); - } + if((state && !triggerValue) || (!state && triggerValue)) + { + if(timer.isActive()) timer.stop(); + timer.setInterval(timeoutMsec_); + timer.start(); + } } void TimerActor::store(QJsonObject& json) { - json["Type"] = "Timer"; - Actor::store(json); - json["Timeout"] = timeoutMsec_; + json["Type"] = "Timer"; + Actor::store(json); + json["Timeout"] = timeoutMsec_; } void TimerActor::load(const QJsonObject& json, bool preserve) { - Actor::load(json, preserve); - timeoutMsec_ = json["Timeout"].toInt(10000); + Actor::load(json, preserve); + timeoutMsec_ = json["Timeout"].toInt(10000); } void TimerActor::setTimeout(const int timeoutSec) { - timeoutMsec_ = timeoutSec*1000; + timeoutMsec_ = timeoutSec*1000; } int TimerActor::getTimeout() { - return timeoutMsec_/1000; + return timeoutMsec_/1000; } void TimerActor::timeout() { - performAction(); + performAction(); } QString TimerActor::getName() const { - if(name_.size() > 0) return name_; - else - { - QString string; - string = "Timeout after " + QString::number(timeoutMsec_/1000) + " seconds. "; - return string; - } + if(name_.size() > 0) return name_; + else + { + QString string; + string = "Timeout after " + QString::number(timeoutMsec_/1000) + " seconds. "; + return string; + } } diff --git a/src/actors/timeractor.h b/src/actors/timeractor.h index 36290d9..973a8c5 100644 --- a/src/actors/timeractor.h +++ b/src/actors/timeractor.h @@ -4,27 +4,27 @@ class TimerActor: public Actor { - Q_OBJECT + Q_OBJECT private: - int timeoutMsec_; + int timeoutMsec_; - QTimer timer; + QTimer timer; private slots: - void timeout(); + void timeout(); public slots: - virtual void onValueChanged(uint8_t state); - void setTimeout(const int timeoutSec); + virtual void onValueChanged(uint8_t state); + void setTimeout(const int timeoutSec); public: - explicit TimerActor(const int timeoutSec = 60, QObject *parent = nullptr); - virtual QString getName() const; + explicit TimerActor(const int timeoutSec = 60, QObject *parent = nullptr); + virtual QString getName() const; - int getTimeout(); + int getTimeout(); - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, bool preserve); + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, bool preserve); }; diff --git a/src/alarmactions.cpp b/src/alarmactions.cpp new file mode 100644 index 0000000..f865f0d --- /dev/null +++ b/src/alarmactions.cpp @@ -0,0 +1,14 @@ +#include "alarmactions.h" +#include + +AlarmActions::AlarmActions(QApplication* a, Microcontroller* micro, QObject *parent) : QObject(parent), _micro(micro), a_(a) +{ + +} + +void AlarmActions::syncoff() +{ + qDebug()<<"syncoff"; + QProcess::execute ( "syncoff" ); + a_->exit(0); +} diff --git a/src/alarmactions.h b/src/alarmactions.h new file mode 100644 index 0000000..df4e11f --- /dev/null +++ b/src/alarmactions.h @@ -0,0 +1,25 @@ +#ifndef POWER_H +#define POWER_H + +#include +#include "microcontroller.h" + +class AlarmActions : public QObject +{ +private: + Q_OBJECT + Microcontroller* _micro; + QApplication* a_; + +public: + explicit AlarmActions(QApplication* a, Microcontroller* micro, QObject *parent = nullptr); + +signals: + +public slots: + + void syncoff(); + +}; + +#endif // POWER_H diff --git a/src/apgetconnected.cpp b/src/apgetconnected.cpp index 2529950..018feaa 100644 --- a/src/apgetconnected.cpp +++ b/src/apgetconnected.cpp @@ -14,163 +14,159 @@ namespace ap { - + static int nl80211Init(struct nl_sock* nl_sock, int* nl80211_id) { - int err; + int err; - if (!nl_sock) - { - std::cerr<<"Failed to allocate netlink socket.\n"; - return -ENOMEM; - } + if (!nl_sock) + { + std::cerr<<"Failed to allocate netlink socket.\n"; + return -ENOMEM; + } - if (genl_connect(nl_sock)) - { - std::cerr<<"Failed to connect to generic netlink.\n"; - err = -ENOLINK; - nl_socket_free(nl_sock); - return err; - } + if (genl_connect(nl_sock)) + { + std::cerr<<"Failed to connect to generic netlink.\n"; + err = -ENOLINK; + nl_socket_free(nl_sock); + return err; + } - nl_socket_set_buffer_size(nl_sock, 8192, 8192); + nl_socket_set_buffer_size(nl_sock, 8192, 8192); - /* try to set NETLINK_EXT_ACK to 1, ignoring errors */ - err = 1; - setsockopt(nl_socket_get_fd(nl_sock), SOL_NETLINK, NETLINK_EXT_ACK, &err, sizeof(err)); + /* try to set NETLINK_EXT_ACK to 1, ignoring errors */ + err = 1; + setsockopt(nl_socket_get_fd(nl_sock), SOL_NETLINK, NETLINK_EXT_ACK, &err, sizeof(err)); - *nl80211_id = genl_ctrl_resolve(nl_sock, "nl80211"); - if (*nl80211_id < 0) - { - std::cerr<<"nl80211 not found.\n"; - err = -ENOENT; - nl_socket_free(nl_sock); - return err; - } + *nl80211_id = genl_ctrl_resolve(nl_sock, "nl80211"); + if (*nl80211_id < 0) + { + std::cerr<<"nl80211 not found.\n"; + err = -ENOENT; + nl_socket_free(nl_sock); + return err; + } - return 0; + return 0; } static int errorHandler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg) { - (void)nla; - (void)err; - printf("netlink error\n"); - *reinterpret_cast(arg) = 0; - return NL_STOP; + printf("netlink error\n"); + *reinterpret_cast(arg) = 0; + return NL_STOP; } static int finishHandler(struct nl_msg *msg, void *arg) { - (void)msg; - *reinterpret_cast(arg) = 0; - return NL_SKIP; + *reinterpret_cast(arg) = 0; + return NL_SKIP; } static int ackHandler(struct nl_msg *msg, void *arg) { - (void)msg; - *reinterpret_cast(arg) = 0; - return NL_STOP; + *reinterpret_cast(arg) = 0; + return NL_STOP; } - + static int extractDeviceMac(struct nl_msg *msg, void *arg) { - struct nlattr* tb[NL80211_ATTR_MAX + 1]; - struct genlmsghdr* gnlh = (struct genlmsghdr*)nlmsg_data(nlmsg_hdr(msg)); - - std::vector* deviceMacAddrs = reinterpret_cast*>(arg); - - nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); - if (!tb[NL80211_ATTR_STA_INFO]) - { - std::cerr<<"sta stats missing!\n"; - return -1; - } - - const unsigned char* macChar = reinterpret_cast(nla_data(tb[NL80211_ATTR_MAC])); - uint64_t macAddr = 0; - memcpy(&macAddr, macChar, 6); - deviceMacAddrs->push_back(macAddr); - - return 0; + struct nlattr* tb[NL80211_ATTR_MAX + 1]; + struct genlmsghdr* gnlh = (struct genlmsghdr*)nlmsg_data(nlmsg_hdr(msg)); + + std::vector* deviceMacAddrs = reinterpret_cast*>(arg); + + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL); + if (!tb[NL80211_ATTR_STA_INFO]) + { + std::cerr<<"sta stats missing!\n"; + return -1; + } + + const unsigned char* macChar = reinterpret_cast(nla_data(tb[NL80211_ATTR_MAC])); + uint64_t macAddr = 0; + memcpy(&macAddr, macChar, 6); + deviceMacAddrs->push_back(macAddr); + + return 0; } std::vector connectedDevices(const std::string& ifDevice, int& error) { - struct nl_sock* nl_sock = nl_socket_alloc(); - int nl80211_id = 0; - error = 0; - - if(nl80211Init(nl_sock, &nl80211_id)) - { - std::cerr<<"Can not init nl80211\n"; - error = ERR_INIT; - } - - signed long long devidx = if_nametoindex(ifDevice.c_str()); - if(!devidx) - { - std::cerr< deviceMacAddrs; - - if(error == 0) - { - if(!genlmsg_put(msg, 0, 0, nl80211_id, 0, NLM_F_DUMP, NL80211_CMD_GET_STATION, 0)) - { - std::cerr<<"genlmsg_put() failed\n"; - error = ERR_GENERAL; - } - - if(error == 0) - { - NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devidx); - - nl_socket_set_cb(nl_sock, s_cb); - nl_send_auto_complete(nl_sock, msg); - - { - int ret = 1; - - nl_cb_err(cb, NL_CB_CUSTOM, errorHandler, &ret); - nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finishHandler, &ret); - nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ackHandler, &ret); - nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, extractDeviceMac, &deviceMacAddrs); - - while (ret > 0) nl_recvmsgs(nl_sock, cb); - } - } - } - -nla_put_failure: - nl_cb_put(cb); - nl_cb_put(s_cb); - nlmsg_free(msg); - nl_socket_free(nl_sock); - return deviceMacAddrs; + struct nl_sock* nl_sock = nl_socket_alloc(); + int nl80211_id = 0; + error = 0; + + if(nl80211Init(nl_sock, &nl80211_id)) + { + std::cerr<<"Can not init nl80211\n"; + error = ERR_INIT; + } + + signed long long devidx = if_nametoindex(ifDevice.c_str()); + if(!devidx) + { + std::cerr< deviceMacAddrs; + + if(error == 0) + { + if(!genlmsg_put(msg, 0, 0, nl80211_id, 0, NLM_F_DUMP, NL80211_CMD_GET_STATION, 0)) + { + std::cerr<<"genlmsg_put() failed\n"; + error = ERR_GENERAL; + } + + if(error == 0) + { + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devidx); + + nl_socket_set_cb(nl_sock, s_cb); + nl_send_auto_complete(nl_sock, msg); + + { + int ret = 1; + + nl_cb_err(cb, NL_CB_CUSTOM, errorHandler, &ret); + nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finishHandler, &ret); + nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ackHandler, &ret); + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, extractDeviceMac, &deviceMacAddrs); + + while (ret > 0) nl_recvmsgs(nl_sock, cb); + } + } + } + + nla_put_failure: + nl_cb_put(cb); + nl_cb_put(s_cb); + nlmsg_free(msg); + nl_socket_free(nl_sock); + return deviceMacAddrs; } std::string macAddrToString(uint64_t macAddr) { - unsigned char* macAddrPtr = reinterpret_cast(&macAddr); - std::stringstream ss; - ss<(&macAddr); + std::stringstream ss; + ss< connectedDevices(const std::string& ifDevice, int& error); -std::string macAddrToString(uint64_t macAddr); + enum ERRORS + { + SUCESS, + ERR_INIT, + ERR_NO_DEV, + ERR_ALLOC, + ERR_GENERAL + }; + std::vector connectedDevices(const std::string& ifDevice, int& error); + std::string macAddrToString(uint64_t macAddr); } diff --git a/src/broadcast.cpp b/src/broadcast.cpp new file mode 100644 index 0000000..0ca90f1 --- /dev/null +++ b/src/broadcast.cpp @@ -0,0 +1,134 @@ +#include "broadcast.h" +#include +#include +#include +#include + +BroadCast::BroadCast(QIODevice* const iodevice, bool master ): master_(master), iodevice_(iodevice) +{ + if(iodevice_ != nullptr) connect(iodevice_, &QIODevice::readyRead, this, &BroadCast::readyRead); +} + +void BroadCast::write(const char * const buffer, const size_t length) +{ + QByteArray mBuffer("bcst: "); + for (size_t i = 0; i < length; ++i) + { + if(buffer[i] != '\n' && buffer[i] != '\0') mBuffer.push_back(buffer[i]); + else + { + mBuffer.push_back('\\'); + if(buffer[i] == '\n')mBuffer.push_back('n'); + else mBuffer.push_back('0'); + } + } + mBuffer.push_back('\n'); + if(iodevice_)iodevice_->write(mBuffer); +} + +void BroadCast::write(const QByteArray& buffer) +{ + write(buffer.data(), buffer.size()); +} + +void BroadCast::sendJson(const QJsonObject& json) +{ + QJsonDocument jsonDocument(json); + QByteArray buffer("JSON: "); + buffer.append(jsonDocument.toJson()); + 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(const QByteArray& buffer) +{ + if(buffer.startsWith("GETJSN")) + { + qDebug()<<"json requested"; + jsonRequested(); + } + else if(buffer.startsWith("GETSENSORS") ) + { + qDebug()<<"sensors requested"; + sendSensors(); + } +} + +void BroadCast::decode(QByteArray buffer) +{ + 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) + { + if( buffer[i] == '\\' && buffer[i+1] == 'n' ) + { + buffer[i] = '\n'; + buffer.remove(i+1,1); + } + else if( buffer[i] == '\\' && buffer[i+1] == '0' ) + { + buffer[i] = '\0'; + buffer.remove(i+1,1); + } + } + + QJsonParseError error; + QJsonDocument document = QJsonDocument::fromJson(buffer, &error); + + qDebug()<<"JSON:"; + qDebug()<= 6 && buffer[0] == 'S' && buffer[1] == 'E' && buffer[2] == 'N' && buffer[3] == 'S' && buffer[4] == 'O' && buffer[5] == 'R') + { + Sensor sensor = Sensor::sensorFromString(buffer); + if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor); + } +} + +void BroadCast::sendMessage(const QString &title, const QString &body) +{ + write(QByteArray("MESG ") + title.toLatin1() + " BODY " + body.toLatin1()); +} + +void BroadCast::readyRead() +{ + buffer_.append(iodevice_->readAll()); + int newlineIndex = buffer_.indexOf('\n'); + while( newlineIndex != -1 ) + { + if(buffer_.startsWith("bcst: ")) + { + QByteArray tmp = buffer_.mid(6,newlineIndex-6); + decode(tmp); + if(master_)decodeMaster(tmp); + } + buffer_.remove(0, newlineIndex+1); + newlineIndex = buffer_.indexOf('\n'); + } +} diff --git a/src/broadcast.h b/src/broadcast.h new file mode 100644 index 0000000..c3e8577 --- /dev/null +++ b/src/broadcast.h @@ -0,0 +1,55 @@ +#ifndef BROADCAST_H +#define BROADCAST_H +#include +#include +#include +#include +#include "sensors/sensor.h" + +class BroadCast: public QObject +{ + Q_OBJECT + +private: + + bool master_; + + static constexpr uint8_t MODE_PREPACKET = 0; + static constexpr uint8_t MODE_PACKET = 1; + + QByteArray buffer_; + + QIODevice* const iodevice_; + + void write(const char * const buffer, const size_t length); + void write(const QByteArray& buffer); + + void decode(QByteArray buffer); + void decodeMaster(const QByteArray& buffer); + +private slots: + + void readyRead(); + +public slots: + + void requestJson(); + void requestSensors(); + +signals: + + void jsonRequested(); + void gotJson(QJsonObject json); + void gotSensorState(Sensor sensor); + +public: + + BroadCast(QIODevice* const iodevice = nullptr, bool master = true); + void sendJson(const QJsonObject& json); + void sendSensors(); + void sendMessage(const QString& title, const QString& body); + +}; + +#endif // BROADCAST_H + diff --git a/src/iomuliplexer.cpp b/src/iomuliplexer.cpp new file mode 100644 index 0000000..7099575 --- /dev/null +++ b/src/iomuliplexer.cpp @@ -0,0 +1,76 @@ +#include "iomuliplexer.h" +#include + +VirutalIODevice::VirutalIODevice(QObject* parent): QBuffer(parent) +{ + +} + +qint64 VirutalIODevice::writeData(const char *data, qint64 len) +{ + blockSignals(true); + qint64 ret = QBuffer::writeData(data, len); + blockSignals(false); + masterReadyRead(); + return ret; +} + +qint64 VirutalIODevice::masterWrite(const QByteArray &byteArray) +{ + return masterWrite(byteArray.data(), byteArray.length()); +} + +qint64 VirutalIODevice::masterWrite(const char *data, qint64 maxSize) +{ + blockSignals(true); + qint64 ret = QBuffer::writeData(data, maxSize); + blockSignals(false); + readyRead(); + return ret; +} + +IoMuliplexer::IoMuliplexer(QIODevice* mainDevice, QObject* Parent): IoMuliplexer(Parent) +{ + setIoDevice(mainDevice); +} + +IoMuliplexer::IoMuliplexer(QObject* Parent): QObject(Parent) +{ + +} + +IoMuliplexer::~IoMuliplexer() +{ + for(size_t i = 0; i < ioDevices_.size(); ++i) delete ioDevices_[i]; + ioDevices_.clear(); +} + +void IoMuliplexer::setIoDevice(QIODevice* mainDevice) +{ + mainDevice_ = mainDevice; + connect(mainDevice_, &QIODevice::readyRead, this, &IoMuliplexer::mainIsReadyRead); +} + +QIODevice* IoMuliplexer::getIoDevice() +{ + ioDevices_.push_back(new VirutalIODevice); + ioDevices_.back()->open(QIODevice::ReadWrite); + connect(ioDevices_.back(), &VirutalIODevice::masterReadyRead, this, &IoMuliplexer::clientIsReadyRead); + return ioDevices_.back(); +} + +void IoMuliplexer::clientIsReadyRead() +{ + VirutalIODevice* device = dynamic_cast(sender()); + if(device) + { + QByteArray array = device->readAll(); + mainDevice_->write(array); + } +} + +void IoMuliplexer::mainIsReadyRead() +{ + QByteArray array = mainDevice_->readAll(); + for(size_t i = 0; i < ioDevices_.size(); ++i) ioDevices_[i]->masterWrite(array); +} diff --git a/src/iomuliplexer.h b/src/iomuliplexer.h new file mode 100644 index 0000000..8afb26d --- /dev/null +++ b/src/iomuliplexer.h @@ -0,0 +1,54 @@ +#ifndef IOMULIPLEXER_H +#define IOMULIPLEXER_H + +#include +#include +#include +#include + +class VirutalIODevice: public QBuffer +{ + Q_OBJECT +public: + + VirutalIODevice(QObject* parent = nullptr); + virtual ~VirutalIODevice() override {} + + virtual qint64 writeData(const char *data, qint64 len) override; + + qint64 masterWrite(const QByteArray &byteArray); + qint64 masterWrite(const char *data, qint64 maxSize); + +signals: + + void masterReadyRead(); + +}; + + +class IoMuliplexer: public QObject +{ + Q_OBJECT +private: + + QIODevice* mainDevice_; + std::vector< VirutalIODevice* > ioDevices_; + +public: + explicit IoMuliplexer(QIODevice* mainDevice, QObject* Parent = nullptr); + explicit IoMuliplexer(QObject* Parent = nullptr); + + ~IoMuliplexer(); + + void setIoDevice(QIODevice* mainDevice); + + QIODevice* getIoDevice(); + +private slots: + + void mainIsReadyRead(); + void clientIsReadyRead(); + +}; + +#endif // IOMULIPLEXER_H diff --git a/src/items/auxitem.cpp b/src/items/auxitem.cpp index 5bee87e..8f104c5 100644 --- a/src/items/auxitem.cpp +++ b/src/items/auxitem.cpp @@ -1,19 +1,18 @@ #include "auxitem.h" -AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, - QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) +AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) { - type_ = ITEM_VALUE_UINT; + } -void AuxItem::enactValue(uint8_t value) +void AuxItem::setValue(uint8_t value) { - assert(micro_); - micro_->setAuxPwm(value); + Item::setValue(value); + micro_->setAuxPwm(value); } void AuxItem::store(QJsonObject &json) { - json["Type"] = "Aux"; - Item::store(json); + json["Type"] = "Aux"; + Item::store(json); } diff --git a/src/items/auxitem.h b/src/items/auxitem.h index 774d44e..a1e6765 100644 --- a/src/items/auxitem.h +++ b/src/items/auxitem.h @@ -1,20 +1,20 @@ #pragma once #include "item.h" -#include "microcontroller.h" +#include "../microcontroller.h" class AuxItem: public Item { - Q_OBJECT + Q_OBJECT private: - Microcontroller* micro_; + Microcontroller* micro_; -protected: - virtual void enactValue(uint8_t value) override; +public slots: + + virtual void setValue(uint8_t value); public: - AuxItem(Microcontroller* micro = nullptr, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", - uint8_t value = 0, QObject* parent = nullptr); + AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr); - virtual void store(QJsonObject& json) override; + virtual void store(QJsonObject& json); }; diff --git a/src/items/fixeditemsource.cpp b/src/items/fixeditemsource.cpp deleted file mode 100644 index d1abc21..0000000 --- a/src/items/fixeditemsource.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "fixeditemsource.h" - -FixedItemSource::FixedItemSource(Microcontroller* micro, QObject *parent): - ItemSource{parent}, - powerItem(new PowerItem(5487423)), - rgbItem(new RgbItem(micro, 5487422, "Rgb Lights")), - auxItem(new AuxItem(micro, 5487421, "Desk Light")) -{ -} - -void FixedItemSource::refresh() -{ - gotItems({powerItem, rgbItem, auxItem}); -} diff --git a/src/items/fixeditemsource.h b/src/items/fixeditemsource.h deleted file mode 100644 index e535842..0000000 --- a/src/items/fixeditemsource.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef FIXEDITEMSOURCE_H -#define FIXEDITEMSOURCE_H - -#include "itemsource.h" -#include "poweritem.h" -#include "rgbitem.h" -#include "auxitem.h" -#include "microcontroller.h" - -class FixedItemSource : public ItemSource -{ - Q_OBJECT - std::shared_ptr powerItem; - std::shared_ptr rgbItem; - std::shared_ptr auxItem; - -public: - explicit FixedItemSource(Microcontroller* micro, QObject *parent = nullptr); - virtual void refresh() override; -}; - -#endif // FIXEDITEMSOURCE_H diff --git a/src/items/item.cpp b/src/items/item.cpp index e297094..f54aead 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -1,103 +1,44 @@ #include "item.h" -#include "actors/sensoractor.h" -#include "actors/regulator.h" -#include "actors/polynomalactor.h" -#include "programmode.h" #include "relay.h" -#include "messageitem.h" -#include "systemitem.h" -#include "auxitem.h" -#include "poweritem.h" -#include "rgbitem.h" +#include "../microcontroller.h" +#include "../actors/sensoractor.h" +#include "../actors/regulator.h" +#include "../actors/polynomalactor.h" #include -ItemData::ItemData(uint32_t itemIdIn, QString name, uint8_t value, bool loaded, bool hidden, item_value_type_t type): - name_(name), value_(value), itemId_(itemIdIn), loaded_(loaded), hidden_(hidden), type_(type) +ItemData::ItemData(uint32_t itemIdIn, QString name, uint8_t value): name_(name), value_(value), itemId_(itemIdIn) { } QString ItemData::getName() const { - return name_; + return name_; } void ItemData::setName(QString name) { - name_ = name; + name_ = name; } uint8_t ItemData::getValue() const { - return value_; + return value_; } uint32_t ItemData::id() const { - return itemId_; + return itemId_; } -void ItemData::store(QJsonObject &json) -{ - json["Name"] = name_; - json["ItemId"] = static_cast(itemId_); - json["Value"] = static_cast(value_); -} - -void ItemData::load(const QJsonObject &json, const bool preserve) -{ - if(!preserve) - { - name_ = json["Name"].toString(name_); - itemId_ = static_cast(json["ItemId"].toDouble(0)); - value_ = json["Value"].toInt(); - } -} - -bool ItemData::getLoaded() const -{ - return loaded_; -} - -void ItemData::setLoaded(bool loaded) -{ - loaded_ = loaded; -} - -bool ItemData::hasChanged(const ItemData& other) -{ - if(other != *this) - return false; - if(other.getName() != getName()) - return true; - if(other.getValue() != getValue()) - return true; - if(other.getLoaded() != getLoaded()) - return true; - return false; -} - -bool ItemData::isHidden() -{ - return hidden_; -} - -void ItemData::setHidden(bool hidden) -{ - hidden_ = hidden; -} - -item_value_type_t ItemData::getValueType() -{ - return type_; -} //item -Item::Item(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): QObject(parent), ItemData (itemIdIn, name, - value) +bool Item::secondaryFlag = false; + +Item::Item(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): QObject(parent), ItemData (itemIdIn, name, value) { } @@ -113,171 +54,116 @@ Item::~Item() void Item::store(QJsonObject &json) { - ItemData::store(json); - json["override"] = override_; - QJsonArray actorsArray; - for(size_t i = 0; i < actors_.size(); ++i) - { - if(!actors_[i]->isExausted()) - { - QJsonObject actorObject; - actors_[i]->store(actorObject); - actorsArray.append(actorObject); - } - } - json["Actors"] = actorsArray; + json["Name"] = name_; + json["ItemId"] = static_cast(itemId_); + json["override"] = override_; + QJsonArray actorsArray; + for(size_t i = 0; i < actors_.size(); ++i) + { + if(!actors_[i]->isExausted()) + { + QJsonObject actorObject; + actors_[i]->store(actorObject); + actorsArray.append(actorObject); + } + } + json["Actors"] = actorsArray; } void Item::load(const QJsonObject &json, const bool preserve) { - ItemData::load(json, preserve); - override_ = json["override"].toBool(false); - const QJsonArray actorsArray(json["Actors"].toArray(QJsonArray())); - for(int i = 0; i < actorsArray.size(); ++i) - { - if(actorsArray[i].isObject()) - { - std::shared_ptr actor = Actor::loadActor(actorsArray[i].toObject()); - if(actor != nullptr) - addActor(actor); - } - } + if(!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()) + { + std::shared_ptr actor = Actor::loadActor(actorsArray[i].toObject()); + if(actor != nullptr) addActor(actor); + } + } } void Item::actorSetValue(uint8_t value) { - if(!override_ && (programMode == PROGRAM_MODE_PRIMARY || programMode == PROGRAM_MODE_HEADLESS_PRIMARY)) - setValue(value); + if(!override_) setValue(value); } void Item::setValue(uint8_t value) { - qDebug()<<__func__; - informValue(value); - if(programMode == PROGRAM_MODE_PRIMARY || programMode == PROGRAM_MODE_HEADLESS_PRIMARY) - enactValue(value); + value_ = value; + valueChanged(value_); } void Item::informValue(uint8_t value) { - if(value_ != value) - { - value_ = value; - valueChanged(value_); - updated(*this); - } -} - -void Item::enactValue(uint8_t value) -{ - (void)value; + Item::setValue(value); } void Item::addActor(std::shared_ptr actor) { - actor->setParent(this); - actors_.push_back(actor); - if(programMode == PROGRAM_MODE_PRIMARY || programMode == PROGRAM_MODE_HEADLESS_PRIMARY) - connect(actor.get(), &Actor::sigValue, this, &Item::actorSetValue); - connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged); + actor->setParent(this); + actors_.push_back(actor); + if(!secondaryFlag) + { + connect(actor.get(), &Actor::sigValue, this, &Item::actorSetValue); + } + connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged); - std::shared_ptr sensorActor = std::dynamic_pointer_cast(actor); - if(sensorActor) - connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor.get(), &SensorActor::sensorEvent); + std::shared_ptr sensorActor = std::dynamic_pointer_cast(actor); + if(sensorActor)connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor.get(), &SensorActor::sensorEvent); - std::shared_ptr regulator = std::dynamic_pointer_cast(actor); - if(regulator) - connect(&globalSensors, &SensorStore::sensorChangedState, regulator.get(), &Regulator::sensorEvent); + std::shared_ptr regulator = std::dynamic_pointer_cast(actor); + if(regulator)connect(&globalSensors, &SensorStore::sensorChangedState, regulator.get(), &Regulator::sensorEvent); - std::shared_ptr polynomalActor = std::dynamic_pointer_cast(actor); - if(polynomalActor != nullptr ) - connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor.get(), &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(std::shared_ptr actor) { - for(unsigned int i = 0; i < actors_.size(); i++) - { - if(actors_[i] == actor) - { - actors_.erase(actors_.begin()+i); - return true; - } - } - return false; + for(unsigned int i = 0; i < actors_.size(); i++) + { + if(actors_[i] == actor) + { + actors_.erase(actors_.begin()+i); + return true; + } + } + return false; } void Item::setOverride(const bool in) { - override_ = in; + override_ = in; } bool Item::getOverride() { - return override_; + return override_; } void Item::removeAllActors() { - actors_.clear(); + actors_.clear(); } std::vector< std::shared_ptr >& Item::getActors() { - return actors_; + return actors_; } bool Item::hasActors() { - return actors_.size() > 0; + return actors_.size() > 0; } void Item::setActorsActive(bool in) { - for(unsigned i = 0; i < actors_.size(); i++) - in ? actors_[i]->makeActive() : actors_[i]->makeInactive(); + for(unsigned i = 0; i < actors_.size(); i++) in ? actors_[i]->makeActive() : actors_[i]->makeInactive(); } - -void Item::mergeLoaded(Item& item) -{ - name_ = item.name_; - actors_.clear(); - for(std::shared_ptr actor : item.actors_) - addActor(actor); -} - -std::shared_ptr Item::loadItem(const QJsonObject& json) -{ - std::shared_ptr newItem = nullptr; - if(json["Type"].toString("") == "Relay") - { - newItem = std::shared_ptr(new Relay); - } - else if(json["Type"].toString("") == "Message") - { - newItem = std::shared_ptr(new MessageItem); - } - else if(json["Type"].toString("") == "System") - { - newItem = std::shared_ptr(new SystemItem); - } - else if(json["Type"].toString("") == "Aux") - { - newItem = std::shared_ptr(new AuxItem); - } - else if(json["Type"].toString("") == "Power") - { - newItem = std::shared_ptr(new PowerItem); - } - else if(json["Type"].toString("") == "Rgb") - { - newItem = std::shared_ptr(new RgbItem); - } - if(newItem) - { - newItem->load(json); - newItem->setLoaded(true); - } - return newItem; -} - diff --git a/src/items/item.h b/src/items/item.h index 1aaa090..7c8d38a 100644 --- a/src/items/item.h +++ b/src/items/item.h @@ -8,99 +8,70 @@ class Actor; -typedef enum { - ITEM_VALUE_BOOL = 0, - ITEM_VALUE_UINT, - ITEM_VALUE_NO_VALUE -} item_value_type_t; - class ItemData { protected: - QString name_; - uint8_t value_; - uint32_t itemId_; - bool loaded_; - bool hidden_; - item_value_type_t type_; + QString name_; + uint8_t value_; + uint32_t itemId_; public: - ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(), - QString name = "Item", - uint8_t value = 0, - bool loaded = false, - bool hidden = false, - item_value_type_t type = ITEM_VALUE_BOOL); - inline bool operator==(const ItemData& in) const - { - return itemId_ == in.itemId_; - } - inline bool operator!=(const ItemData& in) const - { - return itemId_ != in.itemId_; - } + ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0); - uint32_t id() const; + inline bool operator==(const ItemData& in) const{ return itemId_==in.itemId_; } + inline bool operator!=(const ItemData& in) const{ return itemId_!=in.itemId_; } - bool hasChanged(const ItemData& other); - void setName(QString name); - uint8_t getValue() const; - bool getLoaded() const; - void setLoaded(bool loaded); - bool isHidden(); - void setHidden(bool hidden); - item_value_type_t getValueType(); - virtual QString getName() const; - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, const bool preserve = false); + uint32_t id() const; + + void setName(QString name); + uint8_t getValue() const; + virtual QString getName() const; }; class Item: public QObject, public ItemData { - Q_OBJECT + Q_OBJECT private: - std::vector< std::shared_ptr > actors_; + std::vector< std::shared_ptr > actors_; - bool override_ = false; - -signals: - void valueChanged(uint8_t value); - void updated(ItemData data); - -private slots: - virtual void actorSetValue(uint8_t value); - -public slots: - void setValue(uint8_t value); + bool override_ = false; public: - Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, - QObject *parent = nullptr); - Item(const ItemData& itemData, QObject *parent = nullptr); + static bool secondaryFlag; - virtual ~Item(); +signals: - std::vector< std::shared_ptr >& getActors(); - bool hasActors(); - 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); - void mergeLoaded(Item& item); + void valueChanged(uint8_t value); - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, const bool preserve = false); +private slots: + virtual void actorSetValue(uint8_t value); - static std::shared_ptr loadItem(const QJsonObject& json); +public slots: -protected: - virtual void enactValue(uint8_t value); + virtual void setValue(uint8_t value); + +public: + + Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr); + Item(const ItemData& itemData, QObject *parent = nullptr); + + virtual ~Item(); + + std::vector< std::shared_ptr >& getActors(); + bool hasActors(); + 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); + virtual void load(const QJsonObject& json, const bool preserve = false); }; diff --git a/src/items/itemloadersource.cpp b/src/items/itemloadersource.cpp deleted file mode 100644 index d5e6afa..0000000 --- a/src/items/itemloadersource.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "itemloadersource.h" - -#include - -ItemLoaderSource::ItemLoaderSource(const QJsonObject& json, QObject *parent): - ItemSource{parent}, - json(json) -{ -} - -void ItemLoaderSource::refresh() -{ - std::vector> items; - const QJsonArray itemsArray(json["Items"].toArray()); - for(int i = 0; i < itemsArray.size(); ++i) - { - if(!itemsArray[i].isObject()) - continue; - - const QJsonObject itemObject = itemsArray[i].toObject(); - std::shared_ptr newItem = Item::loadItem(itemObject); - if(newItem) - { - items.push_back(newItem); - qDebug()<<"Loaded item"<getName(); - } - } - gotItems(items); -} - -void ItemLoaderSource::updateJson(const QJsonObject& json) -{ - this->json = json; -} - -ItemLoaderSource::~ItemLoaderSource() -{} - diff --git a/src/items/itemloadersource.h b/src/items/itemloadersource.h deleted file mode 100644 index c31c7fd..0000000 --- a/src/items/itemloadersource.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef ITEMLOADERSOURCE_H -#define ITEMLOADERSOURCE_H - -#include - -#include "itemsource.h" - -class ItemLoaderSource : public ItemSource -{ - Q_OBJECT - - QJsonObject json; - -public: - explicit ItemLoaderSource(const QJsonObject& json = QJsonObject(), QObject *parent = nullptr); - ~ItemLoaderSource(); - void updateJson(const QJsonObject& json); - virtual void refresh() override; -}; - -#endif // ITEMLOADERSOURCE_H diff --git a/src/items/itemsource.cpp b/src/items/itemsource.cpp deleted file mode 100644 index 1a223dc..0000000 --- a/src/items/itemsource.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "itemsource.h" - -ItemSource::ItemSource(QObject *parent) - : QObject{parent} -{} diff --git a/src/items/itemsource.h b/src/items/itemsource.h deleted file mode 100644 index 9fee9c1..0000000 --- a/src/items/itemsource.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef ITEMSOURCE_H -#define ITEMSOURCE_H - -#include -#include -#include - -#include "item.h" - -class ItemSource : public QObject -{ - Q_OBJECT -public: - explicit ItemSource(QObject *parent = nullptr); - -public slots: - virtual void refresh() = 0; - -signals: - void gotItems(std::vector> items, bool inform = true); - void requestReplaceItems(std::vector> items); - void updateItems(std::vector items, bool inform = true); -}; - -#endif // ITEMSOURCE_H diff --git a/src/items/itemstore.cpp b/src/items/itemstore.cpp index 1242afc..a3a76c7 100644 --- a/src/items/itemstore.cpp +++ b/src/items/itemstore.cpp @@ -1,154 +1,130 @@ #include "itemstore.h" +#include "relay.h" +#include "messageitem.h" +#include "systemitem.h" #include -#include ItemStore::ItemStore(QObject *parent): QObject(parent) { } -void ItemStore::addItem(std::shared_ptr item, bool inform) +void ItemStore::addItem(std::shared_ptr item) { - std::shared_ptr matched = nullptr; - for(unsigned i = 0; i < items_.size(); i++ ) - { - if(*items_[i] == *item) - { - matched = items_[i]; - break; - } - } - if(!matched) - { - items_.push_back(std::shared_ptr(item)); - connect(item.get(), &Item::updated, this, &ItemStore::itemUpdateSlot); - qDebug()<<"Item"<getName()<<"added"<<(item->getLoaded() ? "from loaded" : ""); - itemAdded(std::weak_ptr(items_.back())); - } - else - { - if(item->getLoaded()) - matched->mergeLoaded(*item); - else if(item->getValue() != matched->getValue()) - updateItem(*item, inform); - } + bool mached = false; + for(unsigned i = 0; i < items_.size(); i++ ) if(*items_[i] == *item) mached = true; + if(!mached) + { + items_.push_back(std::shared_ptr(item)); + itemAdded(std::weak_ptr(items_.back())); + } } -void ItemStore::addItems(const std::vector>& itemIn, bool inform) +void ItemStore::addItems(const std::vector>& itemIn) { - for(unsigned j = 0; j < itemIn.size(); j++) - addItem(itemIn[j], inform); + for(unsigned i = 0; i < items_.size(); i++ ) + { + if(Relay* relay = dynamic_cast(items_[i].get())) + { + bool mached = false; + for(unsigned j = 0; j < itemIn.size(); j++) if(*(items_[i]) == *(itemIn[j])) + { + mached = true; + if(itemIn[j]->getValue() != items_[i]->getValue()) items_[i]->informValue(itemIn[j]->getValue()); + Relay* relayIn = dynamic_cast(itemIn[j].get()); + if(relayIn) + { + if(relay->getId() != relayIn->getId()) relay->setId(relayIn->getId()); + } + + } + if(!mached) + { + itemDeleted(*items_[i].get()); + items_.erase(items_.begin()+i); + } + } + } + + for(unsigned j = 0; j < itemIn.size(); j++)addItem(itemIn[j]); + } void ItemStore::removeItem(const ItemData& item) { - for(unsigned j = 0; j < items_.size(); j++) - { - if(item == *items_[j]) - { - qDebug()<<"Item"<>& items) -{ - addItems(items, true); - std::vector deletedItems; - for(std::shared_ptr item : items_) - { - if(std::find_if(items.begin(), items.end(), [item](const std::shared_ptr other){return *item == *other;}) == items.end()) - deletedItems.push_back(*item); - } - for(const ItemData& item : deletedItems) - removeItem(item); -} void ItemStore::clear() { - for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]); - items_.clear(); + for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]); + items_.clear(); } -void ItemStore::updateItems(std::vector items, bool inform) +void ItemStore::itemStateChanged(const ItemData& item) { - for(const ItemData& item : items) - updateItem(item, inform); -} -void ItemStore::updateItem(const ItemData& item, bool inform) -{ - for(unsigned i = 0; i < items_.size(); i++ ) - { - if(items_[i]->operator==(item)) - { - if(items_[i]->hasChanged(item)) - { - if(items_[i]->getValue() != item.getValue()) - { - items_[i]->setLoaded(false); - if(inform) - items_[i]->informValue(item.getValue()); - else - items_[i]->setValue(item.getValue()); - } - qDebug()<<"Item"<getName()<<"updated"; - itemUpdated(items_[i]); - } - } - } + for(unsigned i = 0; i < items_.size(); i++ ) + { + if(items_[i]->operator==(item)) + { + + if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue()); + } + + } + } void ItemStore::store(QJsonObject& json) { - QJsonArray itemsArray; - for(size_t i = 0; i < items_.size(); ++i) - { - QJsonObject itemObject; - items_[i]->store(itemObject); - itemsArray.append(itemObject); - } - json["Items"] = itemsArray; + QJsonArray itemsArray; + for(size_t i = 0; i < items_.size(); ++i) + { + QJsonObject itemObject; + items_[i]->store(itemObject); + itemsArray.append(itemObject); + } + json["Items"] = itemsArray; } -void ItemStore::itemUpdateSlot(ItemData data) +void ItemStore::load(const QJsonObject& json) { - for(std::shared_ptr& item: items_) - { - if(*item == data) - itemUpdated(std::weak_ptr(item)); - } + const QJsonArray itemsArray(json["Items"].toArray(QJsonArray())); + for(int i = 0; i < itemsArray.size(); ++i) + { + if(itemsArray[i].isObject()) + { + const QJsonObject itemObject = itemsArray[i].toObject(); + std::shared_ptr newItem; + if(itemObject["Type"].toString("") == "Relay") + { + newItem = std::shared_ptr(new Relay()); + } + else if(itemObject["Type"].toString("") == "Message") + { + newItem = std::shared_ptr(new MessageItem); + } + else if(itemObject["Type"].toString("") == "System") + { + newItem = std::shared_ptr(new SystemItem()); + } + else if(itemObject["Type"].toString("") == "Aux") + { + } + if(newItem) + { + newItem->load(itemObject); + addItem(newItem); + } + } + } } - -std::shared_ptr ItemStore::getItem(uint32_t id) -{ - for(std::shared_ptr& item : items_) - { - if(item->id() == id) - return item; - } - return nullptr; -} - -void ItemStore::registerItemSource(ItemSource* source) -{ - qDebug()<<__func__<& item : items_) - itemDeleted(*item); - items_.clear(); - sigRefresh(); -} - -ItemStore globalItems; - diff --git a/src/items/itemstore.h b/src/items/itemstore.h index 830cc40..f2237bf 100644 --- a/src/items/itemstore.h +++ b/src/items/itemstore.h @@ -2,52 +2,37 @@ #include #include #include "item.h" -#include "itemsource.h" +#include "../sensors/sensor.h" #include class ItemStore: public QObject { - Q_OBJECT + Q_OBJECT private: - std::vector > items_; + std::vector< std::shared_ptr > items_; public: - ItemStore(QObject *parent = nullptr); - virtual ~ItemStore() {} + ItemStore(QObject *parent = nullptr); + virtual ~ItemStore(){} - inline std::vector< std::shared_ptr >* getItems() - { - return &items_; - } + inline std::vector< std::shared_ptr >* getItems(){ return &items_; } - std::shared_ptr getItem(uint32_t id); + void store(QJsonObject &json); + void load(const QJsonObject &json); - void registerItemSource(ItemSource* source); - void store(QJsonObject &json); - - void clear(); + void clear(); signals: - void itemDeleted(ItemData item); - void itemAdded(std::weak_ptr Item); - void itemUpdated(std::weak_ptr Item); - void sigRefresh(); + void itemDeleted(ItemData item); + void itemAdded(std::weak_ptr Item); public slots: - void removeItem(const ItemData& item); - void addItem(std::shared_ptr item, bool inform = true); - void addItems(const std::vector>& itemsIn, bool inform = true); - void replaceItems(const std::vector>& items); - void updateItems(std::vector items, bool inform = true); - void updateItem(const ItemData& item, bool inform = true); - void refresh(); - -private slots: - void itemUpdateSlot(ItemData data); + void removeItem(const ItemData& item); + void addItem(std::shared_ptr item); + void addItems(const std::vector>& itemsIn); + void itemStateChanged(const ItemData& item); }; - -extern ItemStore globalItems; diff --git a/src/items/messageitem.cpp b/src/items/messageitem.cpp index 151b934..670a204 100644 --- a/src/items/messageitem.cpp +++ b/src/items/messageitem.cpp @@ -1,90 +1,88 @@ #include "messageitem.h" #include -#include +#include + +BroadCast* MessageItem::broadCast = nullptr; MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): - Item(itemIdIn, name, value, parent) + Item(itemIdIn, name, value, parent) { - alertSound.setVolume(1.0); - type_ = ITEM_VALUE_NO_VALUE; + } MessageItem::MessageItem(const ItemData& itemData, QObject *parent): - Item(itemData, parent) + Item(itemData, parent) { - alertSound.setVolume(1.0); + } MessageItem::~MessageItem() { - closeMessageBox(); + closeMessageBox(); } -void MessageItem::enactValue(uint8_t value) +void MessageItem::setValue(uint8_t value) { - if(value && !messageBox_) - { - if(!alertSoundFileName.isEmpty()) - alertSound.play(); - messageBox_ = new QMessageBox(QMessageBox::NoIcon, name_, message_); - messageBox_->setModal(false); - connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox); - messageBox_->show(); - } - else if(!value && messageBox_) - { - closeMessageBox(); - } + 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(); + } + else if(!value && messageBox_) + { + closeMessageBox(); + } } void MessageItem::closeMessageBox() { - if(messageBox_) - { - value_ = 0; - messageBox_->hide(); - delete messageBox_; - messageBox_ = nullptr; - } + if(messageBox_) + { + value_ = 0; + messageBox_->hide(); + delete messageBox_; + messageBox_ = nullptr; + } } QString MessageItem::getAlert() { - return alertSoundFileName; + return alertSoundFileName; } void MessageItem::setAlert(const QString &in) { - alertSoundFileName = in; - alertSound.setSource(QUrl::fromLocalFile(alertSoundFileName)); + alertSoundFileName = in; } void MessageItem::setMessage(const QString& in) { - message_ = in; + message_ = in; } QString MessageItem::getMessage() { - return message_; + return message_; } void MessageItem::store(QJsonObject &json) { - json["Type"] = "Message"; - Item::store(json); - json["Message"] = message_; - if(!alertSoundFileName.isEmpty()) - json["Alert"] = alertSoundFileName; + 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(""); - if(!alertSoundFileName.isEmpty()) - alertSound.setSource(QUrl::fromLocalFile(alertSoundFileName)); + 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 d23fb11..64596db 100644 --- a/src/items/messageitem.h +++ b/src/items/messageitem.h @@ -2,40 +2,43 @@ #define MESSAGEITEM_H #include -#include #include "item.h" +#include "../broadcast.h" class MessageItem : public Item { - Q_OBJECT +Q_OBJECT private: - QString message_; - QMessageBox* messageBox_ = nullptr; - QString alertSoundFileName = ""; - QSoundEffect alertSound; + QString message_; + QMessageBox* messageBox_ = nullptr; + QString alertSoundFileName = ""; + +public: + static BroadCast* broadCast; private slots: - void closeMessageBox(); -protected: - virtual void enactValue(uint8_t value) override; + void closeMessageBox(); public: - MessageItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, - QObject *parent = nullptr); - MessageItem(const ItemData& itemData, QObject *parent = nullptr); - ~MessageItem(); + virtual void setValue(uint8_t value); - void setMessage(const QString& in); - QString getMessage(); - void setAlert(const QString& in); - QString getAlert(); +public: - virtual void store(QJsonObject& json) override; - virtual void load(const QJsonObject& json, const bool preserve = false) override; + MessageItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr); + MessageItem(const ItemData& itemData, QObject *parent = nullptr); + ~MessageItem(); + + 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); }; #endif // MESSAGEITEM_H diff --git a/src/items/poweritem.cpp b/src/items/poweritem.cpp index 2b2e4e1..eef66ac 100644 --- a/src/items/poweritem.cpp +++ b/src/items/poweritem.cpp @@ -3,33 +3,31 @@ #include #include -PowerItem::PowerItem(uint32_t itemIdIn, QString name, uint8_t value, QObject* parent): - Item(itemIdIn, name, value, parent) +PowerItem::PowerItem(uint32_t itemIdIn, QString name, uint8_t value, QObject* parent): Item(itemIdIn, name, value, parent) { - stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true)); - PowerItem::setValue(true); - hidden_ = true; - type_ = ITEM_VALUE_NO_VALUE; + stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true)); + setValue(true); } -void PowerItem::enactValue(uint8_t value) +void PowerItem::setValue(uint8_t value) { - if(!value) - { - qDebug()<<"shutdown"; - QTimer::singleShot(5000, this, &PowerItem::timeout); - stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 1, "Shutdown Imminent", true)); - } + qDebug()<<"shutdown"; + Item::setValue(value); + if(!value) + { + QTimer::singleShot(5000, this, &PowerItem::timeout); + stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 1, "Shutdown Imminent", true)); + } } void PowerItem::timeout() { - qDebug()<<"shutdown timeout"; - QProcess::startDetached("syncoff", QStringList()); + qDebug()<<"shutdown timeout"; + QProcess::startDetached("syncoff"); } void PowerItem::store(QJsonObject& json) { - json["Type"] = "Power"; - Item::store(json); + json["Type"] = "Power"; + Item::store(json); } diff --git a/src/items/poweritem.h b/src/items/poweritem.h index d6a610f..d590d97 100644 --- a/src/items/poweritem.h +++ b/src/items/poweritem.h @@ -1,32 +1,30 @@ #pragma once #include "item.h" -#include "sensors/sensor.h" -#include "microcontroller.h" +#include "../sensors/sensor.h" +#include "../microcontroller.h" #include class PowerItem: public Item { - Q_OBJECT + Q_OBJECT private: signals: - void stateChanged(Sensor sensor); + void stateChanged(Sensor sensor); private slots: - void timeout(); -protected: - virtual void enactValue(uint8_t value) override; + void timeout(); + +public slots: + + virtual void setValue(uint8_t value); public: - PowerItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Power", uint8_t value = 0, - QObject* parent = nullptr); - void emmitSensor() - { - stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true)); - } - virtual void store(QJsonObject& json) override; + PowerItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr); + void emmitSensor(){stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true));} + virtual void store(QJsonObject& json); }; diff --git a/src/items/relay.cpp b/src/items/relay.cpp index f801e1b..d9bf2e0 100644 --- a/src/items/relay.cpp +++ b/src/items/relay.cpp @@ -5,68 +5,66 @@ Microcontroller* Relay::micro_ = nullptr; -Relay::Relay(uint8_t id, QString name, uint16_t address, bool state, QObject* parent): Item(0, name, state, parent), - id_(id), address_(address) +Relay::Relay(uint8_t id, QString name, uint16_t address, bool state, QObject* parent): Item(0, name, state, parent), id_(id), address_(address) { - itemId_ = address | ((uint32_t)id << 16); + itemId_ = address | ((uint32_t)id << 16); + qDebug()<<"Relay "<relayOn(id_); - else - micro_->relayOff(id_); - } + Item::setValue(value); + if(micro_) + { + if(value)micro_->relayOn(id_); + else micro_->relayOff(id_); + } } void Relay::on() { - setValue(true); + setValue(true); } void Relay::off() { - setValue(false); + setValue(false); } void Relay::toggle() { - value_ ? off() : on(); + value_ ? off() : on(); } void Relay::store(QJsonObject& json) { - json["Type"] = "Relay"; - Item::store(json); - json["Id"] = static_cast(id_); - json["Address"] = address_; + json["Type"] = "Relay"; + Item::store(json); + json["Id"] = static_cast(id_); + json["Address"] = address_; } void Relay::load(const QJsonObject& json, const bool preserve) { - Item::load(json, preserve); - id_ = static_cast(json["Id"].toInt(0)); - address_ = static_cast(json["Address"].toInt(0)); - itemId_ = address_ | (static_cast(id_) << 16); + Item::load(json, preserve); + id_ = static_cast(json["Id"].toInt(0)); + address_ = static_cast(json["Address"].toInt(0)); + itemId_ = address_ | (static_cast(id_) << 16); } uint16_t Relay::getAddress() const { - return address_; + return address_; } uint8_t Relay::getId() const { - return id_; + return id_; } void Relay::setId(uint8_t id) { - id_=id; - itemId_ = address_ | ((uint32_t)id << 16); + id_=id; + itemId_ = address_ | ((uint32_t)id << 16); } diff --git a/src/items/relay.h b/src/items/relay.h index 3c3c4b4..4114eef 100644 --- a/src/items/relay.h +++ b/src/items/relay.h @@ -4,41 +4,37 @@ #include #include -#include "sensors/sensor.h" +#include "../sensors/sensor.h" #include "item.h" class Microcontroller; class Relay : public Item { - Q_OBJECT + Q_OBJECT private: - static Microcontroller* micro_; + static Microcontroller* micro_; - uint8_t id_; - uint16_t address_; - -protected: - virtual void enactValue(uint8_t value) override; + uint8_t id_; + uint16_t address_; public slots: - void on(); - void off(); - void toggle(); + + virtual void setValue(uint8_t value); + void on(); + void off(); + void toggle(); public: - Relay(uint8_t id = 0, QString name = "", uint16_t address = 0, bool state = false, QObject* parent = nullptr); + Relay(uint8_t id = 0, QString name = "", uint16_t address = 0, bool state = false, QObject* parent = nullptr); - uint16_t getAddress() const; - uint8_t getId() const; - void setId(uint8_t id); + uint16_t getAddress() const; + uint8_t getId() const; + void setId(uint8_t id); - inline static void setMicrocontroller(Microcontroller* micro) - { - micro_ = micro; - } + inline static void setMicrocontroller(Microcontroller* micro){ micro_ = micro; } - virtual void store(QJsonObject& json) override; - virtual void load(const QJsonObject& json, const bool preserve = false) override; + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, const bool preserve = false); }; #endif // RELAY_H diff --git a/src/items/rgbitem.cpp b/src/items/rgbitem.cpp index 6df7c33..24ec995 100644 --- a/src/items/rgbitem.cpp +++ b/src/items/rgbitem.cpp @@ -1,19 +1,18 @@ #include "rgbitem.h" -RgbItem::RgbItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, - QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) +RgbItem::RgbItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value, QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro) { } -void RgbItem::enactValue(uint8_t value) +void RgbItem::setValue(uint8_t value) { - assert(micro_); - value ? micro_->rgbOn() : micro_->rgbOff(); + Item::setValue(value); + value ? micro_->rgbOn() : micro_->rgbOff(); } void RgbItem::store(QJsonObject &json) { - json["Type"] = "Rgb"; - Item::store(json); + json["Type"] = "Rgb"; + Item::store(json); } diff --git a/src/items/rgbitem.h b/src/items/rgbitem.h index db721b9..d3e0235 100644 --- a/src/items/rgbitem.h +++ b/src/items/rgbitem.h @@ -1,20 +1,20 @@ #pragma once -#include "microcontroller.h" +#include "../microcontroller.h" #include "item.h" class RgbItem: public Item { - Q_OBJECT + Q_OBJECT private: - Microcontroller* micro_; + Microcontroller* micro_; -protected: - virtual void enactValue(uint8_t value) override; +public slots: + + virtual void setValue(uint8_t value); public: - RgbItem(Microcontroller* micro = nullptr, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", - uint8_t value = 0, QObject* parent = nullptr); + RgbItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr); - virtual void store(QJsonObject& json) override; + virtual void store(QJsonObject& json); }; diff --git a/src/items/systemitem.cpp b/src/items/systemitem.cpp index 7887ce5..6a61046 100644 --- a/src/items/systemitem.cpp +++ b/src/items/systemitem.cpp @@ -1,43 +1,43 @@ #include "systemitem.h" #include -void SystemItem::enactValue(uint8_t value) +void SystemItem::setValue(uint8_t value) { - QProcess::execute(value ? onCommand_ : offCommand_); + QProcess::execute(value ? onCommand_ : offCommand_); } SystemItem::SystemItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): - Item(itemIdIn, name, value, parent) +Item(itemIdIn, name, value, parent) { } SystemItem::SystemItem(const ItemData& itemData, QObject *parent): - Item(itemData, parent) +Item(itemData, parent) { } void SystemItem::setOnCommand(const QString& in) { - onCommand_ = in; + onCommand_ = in; } void SystemItem::setOffCommand(const QString& in) { - offCommand_ = in; + offCommand_ = in; } void SystemItem::store(QJsonObject& json) { - json["Type"] = "System"; - Item::store(json); - json["OnCommand"] = onCommand_; - json["OffCommand"] = offCommand_; + 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(""); + Item::load(json,preserve); + onCommand_ = json["OnCommand"].toString(""); + offCommand_ = json["OffCommand"].toString(""); } diff --git a/src/items/systemitem.h b/src/items/systemitem.h index 392e914..3d46e8d 100644 --- a/src/items/systemitem.h +++ b/src/items/systemitem.h @@ -1,37 +1,34 @@ #ifndef SYSTEMITEM_H #define SYSTEMITEM_H + #include "item.h" class SystemItem : public Item { - Q_OBJECT +Q_OBJECT private: - QString onCommand_; - QString offCommand_; -protected: - virtual void enactValue(uint8_t value) override; + QString onCommand_; + QString offCommand_; 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 setValue(uint8_t value); - virtual void store(QJsonObject& json) override; - virtual void load(const QJsonObject& json, const bool preserve = false) override; +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 8e5ca4c..31fe38c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,139 +1,133 @@ #include +#include #include #include #include -#include + + +#ifndef Q_OS_ANDROID #include #include #include +#endif +#include "actors/alarmtime.h" +#include "microcontroller.h" #include "ui/mainwindow.h" +#include "sensors/speakersensor.h" +#include "sensors/sunsensor.h" +#include "sensors/ocupancysensor.h" +#include "alarmactions.h" +#include "sensors/sensor.h" #include "items/itemstore.h" +#include "items/auxitem.h" +#include "items/rgbitem.h" +#include "items/poweritem.h" #include "mainobject.h" -#include "programmode.h" + + +#define BAUD QSerialPort::Baud38400 int main(int argc, char *argv[]) { - QApplication a(argc, argv); + QApplication a(argc, argv); - //pw_init(&argc, &argv); + //set info + QCoreApplication::setOrganizationName("UVOS"); + QCoreApplication::setOrganizationDomain("uvos.xyz"); + QCoreApplication::setApplicationName("SHinterface"); + QCoreApplication::setApplicationVersion("0.6"); - //set info - QCoreApplication::setOrganizationName("UVOS"); - QCoreApplication::setOrganizationDomain("uvos.xyz"); - QCoreApplication::setApplicationName("SHinterface"); - QCoreApplication::setApplicationVersion("0.6"); + QDir::setCurrent(a.applicationDirPath()); - QDir::setCurrent(a.applicationDirPath()); + //parse comand line + #ifndef Q_OS_ANDROID + QCommandLineParser parser; + parser.setApplicationDescription("Smart Home Interface"); + parser.addHelpOption(); + parser.addVersionOption(); + QCommandLineOption tcpOption(QStringList() << "t" << "tcp", QCoreApplication::translate("main", "Use Tcp connection")); + parser.addOption(tcpOption); + QCommandLineOption hostOption(QStringList() << "H" << "host", QCoreApplication::translate("main", "Set server host ip addres"), "adress"); + parser.addOption(hostOption); + QCommandLineOption portOption(QStringList() << "p" << "port", QCoreApplication::translate("main", "Set server Port in TCP mode or Serial port in serial mode"), "port"); + parser.addOption(portOption); + QCommandLineOption serialOption(QStringList() << "s" << "serial", QCoreApplication::translate("main", "Use serial connection")); + parser.addOption(serialOption); + QCommandLineOption baudOption(QStringList() << "b" << "baud", QCoreApplication::translate("main", "Set Baud Rate")); + parser.addOption(baudOption); + QCommandLineOption settingsPathOption(QStringList() << "c" << "config", QCoreApplication::translate("main", "Set config file"), "configFilePath"); + parser.addOption(settingsPathOption); + QCommandLineOption secondaryOption(QStringList() << "e" << "secondary", QCoreApplication::translate("main", "Set if instance is not main instance")); + parser.addOption(secondaryOption); + parser.process(a); + #endif - //parse comand line - QCommandLineParser parser; - parser.setApplicationDescription("Smart Home Interface"); - parser.addHelpOption(); - parser.addVersionOption(); - QCommandLineOption masterOption(QStringList() << "m" << "master", QCoreApplication::translate("main", "Use in master mode")); - parser.addOption(masterOption); - QCommandLineOption hostOption(QStringList() << "H" << "host", QCoreApplication::translate("main", "Set server host ip addres"), "address", "0.0.0.0"); - parser.addOption(hostOption); - QCommandLineOption portOption(QStringList() << "p" << "port", QCoreApplication::translate("main", "Set server Port"), "port", "104476"); - parser.addOption(portOption); - QCommandLineOption settingsPathOption(QStringList()<<"c"<<"config", QCoreApplication::translate("main", "Set config file"), "configFilePath", - QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/shinterface.json"); - parser.addOption(settingsPathOption); - QCommandLineOption headlessOption(QStringList()<<"e"<<"headless", QCoreApplication::translate("main", "Dont start the gui")); - parser.addOption(headlessOption); - parser.process(a); + QIODevice* masterIODevice = nullptr; - int retVal; + #ifndef Q_OS_ANDROID + if(parser.isSet(tcpOption)) + { + QTcpSocket* microSocket = new QTcpSocket; - programMode = PROGRAM_MODE_UI_ONLY; - if(parser.isSet(masterOption)) - { - programMode = PROGRAM_MODE_PRIMARY; - if(parser.isSet(headlessOption)) - programMode = PROGRAM_MODE_HEADLESS_PRIMARY; - } - if(programMode == PROGRAM_MODE_PRIMARY || programMode == PROGRAM_MODE_HEADLESS_PRIMARY) - { - QString settingsPath = parser.value(settingsPathOption); - QJsonObject json = MainObject::getJsonObjectFromDisk(settingsPath); - bool tcpMicro = json["MicroTcp"].toBool(true); - json["MicroTcp"] = tcpMicro; + int port = 6856; + if(parser.isSet(portOption)) port = parser.value(portOption).toInt(); - QIODevice* microDevice = nullptr; - if(tcpMicro) - { - int port = json["MicroTcpPort"].toInt(6856); - json["MicroTcpPort"] = port; - QString host = json["MicroTcpHost"].toString("127.0.0.1"); - json["MicroTcpHost"] = host; + QString host("127.0.0.1"); + if(parser.isSet(hostOption)) host = parser.value(hostOption); + std::cout<<"connecting to "<connectToHost(host, port, QIODevice::ReadWrite); + 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; + } + else + { + QSerialPort* microPort = new QSerialPort; + if(parser.isSet(portOption)) microPort->setPortName(parser.value(portOption)); + else microPort->setPortName("ttyUSB0"); - QTcpSocket* microSocket = new QTcpSocket; + if(parser.isSet(portOption)) microPort->setBaudRate(parser.value(baudOption).toInt()); + else microPort->setBaudRate(BAUD); - qInfo()<<"connecting to "<connectToHost(host, port, QIODevice::ReadWrite); + if(!microPort->open(QIODevice::ReadWrite)) std::cout<<"Can not open serial port "<portName().toStdString()<<". Continueing in demo mode"<<'\n'; + masterIODevice = microPort; + } - if(!microSocket->waitForConnected(1000)) - { - qCritical()<<"Can not connect to tcp micro"; - MainObject::storeJsonObjectToDisk(settingsPath, json); - if(programMode == PROGRAM_MODE_PRIMARY) - QMessageBox::critical(nullptr, "Error", "Can not connect to tcp micro"); - return 1; - } - microDevice = microSocket; - } - else - { - QString port = json["MicroSerialPort"].toString("ttyUSB0"); - json["MicroSerialPort"] = port; - int baud = json["MicroSerialBaud"].toInt(38400); - json["MicroSerialBaud"] = baud; + MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "", !parser.isSet(secondaryOption)); - QSerialPort *microPort = new QSerialPort; - microPort->setPortName(port); - microPort->setBaudRate(baud); - microPort->open(QIODevice::ReadWrite); + #else + QTcpSocket* microSocket = new QTcpSocket; + microSocket->connectToHost("10.0.0.1", 6856, QIODevice::ReadWrite); + if(!microSocket->waitForConnected(1000)) + { + std::cout<<"Can not connect to to Server.\n"; + return 1; + } + masterIODevice = microSocket; - if(!microPort->isOpen()) - { - qCritical()<<"Can not open serial port"< item){globalItems.addItem(item, false);}); - w->show(); - } - retVal = a.exec(); + MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "", !parser.isSet(secondaryOption)); + #endif - delete w; - delete microDevice; - } - else - { - SecondaryMainObject mainObject(parser.value(hostOption), parser.value(portOption).toInt()); - MainWindow w(&mainObject); - QObject::connect(&w, &MainWindow::createdItem, &globalItems, [](std::shared_ptr item){globalItems.addItem(item, false);}); - QObject::connect(&w, &MainWindow::sigSave, mainObject.tcpClient, &TcpClient::sendItems); - w.show(); - retVal = a.exec(); - } + //mainwindow + MainWindow w(&mainObject); + QObject::connect(&mainObject.micro, SIGNAL(textRecived(QString)), &w, SLOT(changeHeaderLableText(QString))); + QObject::connect(&w, &MainWindow::sigBrodcast, &mainObject, &MainObject::sendJson); + QObject::connect(&w, &MainWindow::sigSave, &mainObject, &MainObject::storeToDisk); + QObject::connect(&w, &MainWindow::createdItem, &mainObject.items, &ItemStore::addItem); + if(!mainObject.micro.connected()) w.changeHeaderLableText("No io debug only!"); - return retVal; + w.show(); + + int retVal = a.exec(); + + if(masterIODevice) + delete masterIODevice; + return retVal; } diff --git a/src/mainobject.cpp b/src/mainobject.cpp index 0f41d19..0ed00dc 100644 --- a/src/mainobject.cpp +++ b/src/mainobject.cpp @@ -1,162 +1,175 @@ #include "mainobject.h" +#include "items/messageitem.h" -#include -#include -#include +MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent) : + QObject(parent), + master(masterIn), + masterIODevice(ioDevice), + ioMultiplexer(masterIODevice), + micro(ioMultiplexer.getIoDevice()), + 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")) -#include "items/itemstore.h" - -MainObject::MainObject(QObject *parent) : - QObject(parent) { + qDebug()<<"Is master:"<emmitSensor(); + items.addItem(rgbItem); + items.addItem(auxItem); + MessageItem::broadCast = &broadCast; + + + Relay::setMicrocontroller(µ); + + connect(&broadCast, &BroadCast::gotJson, this, &MainObject::recivedJson); + QObject::connect(&broadCast, &BroadCast::gotSensorState, &globalSensors, &SensorStore::sensorGotState); + if(master)connect(&broadCast, &BroadCast::jsonRequested, this, &MainObject::sendJson); + + if(master) load(getJsonObjectFromDisk(settingsPath, &noSave)); + else + { + broadCast.requestJson(); + broadCast.requestSensors(); + } + + #ifndef Q_OS_ANDROID + Item::secondaryFlag = !master; + #endif } MainObject::~MainObject() { } -void MainObject::refresh() +void MainObject::store(QJsonObject &json) { - globalItems.refresh(); + items.store(json); + + QJsonObject powerObject; + powerItem->store(powerObject); + json.insert("Power", powerObject); + QJsonDocument pwrDoc(powerObject); + + QJsonObject ocupancyObject; + ocupancySensor.store(ocupancyObject); + json.insert("Ocupancy", ocupancyObject); } -QJsonObject MainObject::getJsonObjectFromDisk(const QString& filename, bool* error) +void MainObject::load(const QJsonObject& json) { - QFile file; - file.setFileName(filename); - - bool ret = file.open(QIODevice::ReadOnly); - if(!file.isOpen() || !ret) - { - std::cerr<<"Can not open config file: "<removeAllActors(); + auxItem->removeAllActors(); + powerItem->removeAllActors(); + items.addItem(rgbItem); + items.addItem(auxItem); + items.load(json); + powerItem->load(json["Power"].toObject()); + ocupancySensor.load(json["Ocupancy"].toObject()); + qDebug()<<"aray size: "<= 2) + { + rgbItem->load(json["Items"].toArray()[0].toObject()); + auxItem->load(json["Items"].toArray()[1].toObject()); + } + micro.requestState(); } -bool MainObject::storeJsonObjectToDisk(const QString& filename, const QJsonObject& json) +void MainObject::storeToDisk() { - QFile file(filename + ".out"); - - qDebug()<<"config file: "<launch(QHostAddress(host), port); - connect(&globalItems, &ItemStore::itemUpdated, tcpServer, &TcpServer::itemUpdated); + if(master && !noSave) + storeJsonObjectToDisk(json, settingsPath); + load(json); } -PrimaryMainObject::~PrimaryMainObject() +void MainObject::sendJson() { - storeToDisk(settingsPath); + QJsonObject json; + store(json); + broadCast.sendJson(json); } -void PrimaryMainObject::store(QJsonObject &json) +QJsonObject MainObject::getJsonObjectFromDisk(const QString& filePath, bool* error) { - globalItems.store(json); - QJsonObject mqttJson = json["Mqtt"].toObject(); - mqttSensorSource.store(mqttJson); - json["Mqtt"] = mqttJson; + QFile file; + + #ifndef Q_OS_ANDROID + if(filePath.size() > 0) file.setFileName(filePath); + else + #endif + { + file.setFileName(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/shinterface.json"); + } + + file.open(QIODevice::ReadOnly); + if(!file.isOpen()) std::cerr<<"Can not open config file: "<launch(QHostAddress(host), port)) - { - QMessageBox::critical(nullptr, "Error", "Could not connect to "+host+":"+QString::number(port)); - QMetaObject::invokeMethod(this, [](){exit(1);}, Qt::QueuedConnection); - } - - connect(&globalItems, &ItemStore::itemUpdated, tcpClient, &TcpClient::itemUpdated); - - globalItems.refresh(); -} - -SecondaryMainObject::~SecondaryMainObject() +bool MainObject::storeJsonObjectToDisk(const QJsonObject& json, QString filePath) { + #ifndef Q_OS_ANDROID + if(filePath.size() == 0) + #endif + { + filePath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/shinterface.json"; + } + QFile file(filePath + ".out"); + + qDebug()<<"config file: "< +#include #include #include #include @@ -11,66 +12,76 @@ #include #include + +#ifndef Q_OS_ANDROID +#include +#include +#include +#endif + +#include "actors/alarmtime.h" #include "microcontroller.h" #include "ui/mainwindow.h" +#include "sensors/speakersensor.h" #include "sensors/sunsensor.h" -#include "sensors/mqttsensorsource.h" -#include "items/fixeditemsource.h" -#include "items/itemloadersource.h" -#include "service/tcpclient.h" -#include "service/tcpserver.h" +#include "sensors/ocupancysensor.h" +#include "sensors/sensor.h" +#include "items/itemstore.h" +#include "items/auxitem.h" +#include "items/rgbitem.h" +#include "items/poweritem.h" +#include "iomuliplexer.h" +#include "broadcast.h" class MainObject : public QObject { - Q_OBJECT + Q_OBJECT +public: + + //io + const bool master; + + bool noSave = false; + + QIODevice * const masterIODevice = nullptr; + IoMuliplexer ioMultiplexer; + + Microcontroller micro; + BroadCast broadCast; + + const QString settingsPath; + + //sensors + SunSensorSource sunSensorSource; + OcupancySensorSource ocupancySensor; + + //items + ItemStore items; + + std::shared_ptr powerItem; + std::shared_ptr rgbItem; + std::shared_ptr auxItem; + +private: + + static QJsonObject getJsonObjectFromDisk(const QString& filePath = "", bool* error = nullptr); + static bool storeJsonObjectToDisk(const QJsonObject& json, QString filePath = ""); public: - explicit MainObject(QObject *parent = nullptr); - ~MainObject(); - static QJsonObject getJsonObjectFromDisk(const QString& filename, bool* error = nullptr); - static bool storeJsonObjectToDisk(const QString& filename, const QJsonObject& json); + explicit MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent = nullptr); + ~MainObject(); + + void store(QJsonObject& json); + + void load(const QJsonObject& json); + +signals: public slots: - void refresh(); -}; -class PrimaryMainObject : public MainObject -{ - Q_OBJECT -public: - - QString settingsPath; - QJsonObject settings; - - Microcontroller micro; - TcpServer* tcpServer; - - //sensors - SunSensorSource sunSensorSource; - MqttSensorSource mqttSensorSource; - - //item sources - FixedItemSource fixedItems; - ItemLoaderSource itemLoader; - -public: - explicit PrimaryMainObject(QIODevice* microDevice, const QString& settingsPath, const QString& host, int port, QObject *parent = nullptr); - ~PrimaryMainObject(); - void store(QJsonObject& json); - void load(const QJsonObject& json); - bool storeToDisk(const QString& filename); - bool loadFromDisk(const QString& filename); -}; - -class SecondaryMainObject : public MainObject -{ - Q_OBJECT -public: - TcpClient* tcpClient; - -public: - explicit SecondaryMainObject(QString host, int port, QObject *parent = nullptr); - ~SecondaryMainObject(); + void storeToDisk(); + void sendJson(); + void recivedJson(const QJsonObject json); }; diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index 4833461..6922206 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -3,99 +3,108 @@ #include #include +static constexpr bool debug = true; + void Microcontroller::relayToggle(int state, int relay) { - char buffer[8]; - int length = sprintf(buffer, "%d \n", relay); - state ? write("item on ") : write("item off "); - write(buffer, length); + char buffer[8]; + int length = sprintf(buffer, "%d \n", relay); + state ? write("item on ") : write("item off "); + write(buffer, length); } void Microcontroller::relayOn(int relay) { - relayToggle(true, relay); + relayToggle(true, relay); } void Microcontroller::relayOff(int relay) { - relayToggle(false, relay); + relayToggle(false, relay); } //rgb lights void Microcontroller::rgbOn() { - write("rgb on\n"); + write("rgb on\n"); } void Microcontroller::rgbOff() { - write( "rgb off\n"); + write( "rgb off\n"); } void Microcontroller::changeRgbColor(const QColor color) { - char buffer[64]; - int length = sprintf(buffer, "rgb set %03d %03d %03d\n", color.red(), color.green(), color.blue()); - write(buffer, length); -} + char buffer[64]; + int length = sprintf(buffer, "rgb set %03d %03d %03d\n", color.red(), color.green(), color.blue()); + write(buffer, length); + std::cout<write(buffer); - _port->waitForBytesWritten(1000); - } - std::this_thread::sleep_for(std::chrono::milliseconds(40)); + #ifndef Q_OS_ANDROID + if constexpr(debug) std::cerr<write(buffer); + _port->waitForBytesWritten(1000); + } + std::this_thread::sleep_for(std::chrono::milliseconds(40)); } void Microcontroller::write(char* buffer, const size_t length) { - if(_port != nullptr) - { - _port->write(buffer, length); - _port->waitForBytesWritten(1000); - } - std::this_thread::sleep_for(std::chrono::milliseconds(40)); + #ifndef Q_OS_ANDROID + if constexpr(debug) std::cerr<write(buffer, length); + _port->waitForBytesWritten(1000); + } + std::this_thread::sleep_for(std::chrono::milliseconds(40)); } void Microcontroller::setPattern(int pattern) { - char buffer[4]; - write("rgb pattern "); - int length = sprintf(buffer, "%d\n", pattern); - write(buffer, length); + char buffer[4]; + write("rgb pattern "); + int length = sprintf(buffer, "%d\n", pattern); + write(buffer, length); } void Microcontroller::startSunrise() { - setPattern(4); + setPattern(4); } bool Microcontroller::connected() { - if(_port != nullptr) return _port->isOpen(); - else return false; + if(_port != nullptr) return _port->isOpen(); + else return false; } -void Microcontroller::refresh() +void Microcontroller::requestState() { - write("state\n"); + write("state\n"); } //housekeeping Microcontroller::Microcontroller(QIODevice* port) { - setIODevice(port); + setIODevice(port); } Microcontroller::Microcontroller() @@ -108,96 +117,81 @@ Microcontroller::~Microcontroller() void Microcontroller::setIODevice(QIODevice *port) { - _port = port; - QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead); + _port = port; + QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead); } std::shared_ptr Microcontroller::processRelayLine(const QString& buffer) { - QStringList bufferList = buffer.split(' '); - 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[6].toInt(nullptr, 2), - bufferList[8].toInt())); - } - return nullptr; + QStringList bufferList = buffer.split(' '); + 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())); + } + return nullptr; } void Microcontroller::processList(const QString& buffer) { - QStringList bufferList = buffer.split(' '); - if(bufferList.size() >= 8 && buffer.startsWith("ITEM NUMBER:")) - { - relayList.push_back(processRelayLine(buffer)); - } - else if(buffer.contains("EOL")) - { - listMode = false; - gotItems(relayList); - relayList.clear(); - } - else listMode = false; + QStringList bufferList = buffer.split(' '); + if(bufferList.size() >= 8 && buffer.startsWith("ITEM NUMBER:")) + { + relayList.push_back(processRelayLine(buffer)); + } + else if(buffer.contains("EOL")) + { + listMode = false; + qDebug()<<"got relay list " << relayList.size(); + gotRelayList(relayList); + relayList.clear(); + } + else listMode = false; } void Microcontroller::processRelayState(const QString& buffer) { - updateItems({static_cast(*processRelayLine(buffer))}); + itemChanged(static_cast(*processRelayLine(buffer))); } void Microcontroller::processSensorState(const QString& buffer) { - Sensor sensor = Sensor::sensorFromString(buffer); - if(sensor.type != Sensor::TYPE_DUMMY) - gotSensorState(sensor); + Sensor sensor = Sensor::sensorFromString(buffer); + if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor); } void Microcontroller::processMicroReturn() { - if(listMode) - { - processList(_buffer); - } - else - { + if(listMode) processList(_buffer); + else + { if(_buffer.startsWith("Items:")) - { - listMode = true; - relayList.clear(); - } - else if(_buffer.startsWith("ITEM NUMBER:")) - { - processRelayState(_buffer); - } - else if(_buffer.startsWith("SENSOR")) - { - processSensorState(_buffer); - } - } + { + listMode = true; + relayList.clear(); + } + else if(_buffer.startsWith("ITEM NUMBER:"))processRelayState(_buffer); + else if(_buffer.startsWith("SENSOR")) processSensorState(_buffer); + } } void Microcontroller::isReadyRead() { - char charBuf; - while(_port->getChar(&charBuf)) - { - _buffer.push_back(charBuf); - if(_buffer.endsWith('\n') ) - { - _buffer.remove('\n'); - processMicroReturn(); - textRecived(_buffer); - _buffer.clear(); - } - } + char charBuf; + while(_port->getChar(&charBuf)) + { + _buffer.push_back(charBuf); + if( _buffer.endsWith('\n') ) + { + _buffer.remove('\n'); + processMicroReturn(); + textRecived(_buffer); + _buffer.clear(); + } + } } diff --git a/src/microcontroller.h b/src/microcontroller.h index 1845dc0..f6de49e 100644 --- a/src/microcontroller.h +++ b/src/microcontroller.h @@ -1,6 +1,8 @@ #ifndef MICROCONTROLLER_H #define MICROCONTROLLER_H +#include + #include #include #include @@ -15,70 +17,73 @@ #include "items/item.h" #include "items/relay.h" #include "sensors/sensor.h" -#include "items/itemsource.h" -class Microcontroller : public ItemSource +class Microcontroller : public QObject { - Q_OBJECT + Q_OBJECT public: - static constexpr char AMP_RELAY = 0; - static constexpr char SENSOR_TEMPERATURE = 1; - static constexpr char SENSOR_DOOR = 0 ; + static constexpr char AMP_RELAY = 0; + static constexpr char SENSOR_TEMPERATURE = 1; + static constexpr char SENSOR_DOOR = 0 ; private: - bool listMode = false; + bool listMode = false; - //uint8_t _auxState = 0; + //uint8_t _auxState = 0; - QIODevice* _port = nullptr; + QIODevice* _port = nullptr; - std::vector< std::shared_ptr > relayList; + std::vector< std::shared_ptr > relayList; - QScopedPointer loop; - QString _buffer; + QScopedPointer loop; + QString _buffer; - void processMicroReturn(); - void processList(const QString& buffer); - void processRelayState(const QString& buffer); - void processSensorState(const QString& buffer); - std::shared_ptr processRelayLine(const QString& buffer); + void processMicroReturn(); + void processList(const QString& buffer); + void processRelayState(const QString& buffer); + void processSensorState(const QString& buffer); + std::shared_ptr processRelayLine(const QString& buffer); - void write(char *buffer, const size_t length); - void write(const QByteArray& buffer); + void write(char *buffer, const size_t length); + void write(const QByteArray& buffer); public: - Microcontroller(QIODevice* port); - Microcontroller(); - ~Microcontroller(); - bool connected(); - void setIODevice(QIODevice* port); + Microcontroller(QIODevice* port); + Microcontroller(); + ~Microcontroller(); + bool connected(); + void setIODevice(QIODevice* port); public slots: - void rgbOn(); - void rgbOff(); - void changeRgbColor(const QColor color); - void setPattern(int pattern); - void startSunrise(); + void rgbOn(); + void rgbOff(); + void changeRgbColor(const QColor color); + void setPattern(int pattern); + void startSunrise(); - void refresh() override; + void requestState(); - void setAuxPwm(int duty); + void setAuxPwm(int duty); - void relayOn(int relay); - void relayOff(int relay); - void relayToggle(int state, int id); + void relayOn(int relay); + void relayOff(int relay); + void relayToggle(int state, int id); private slots: - void isReadyRead(); + void isReadyRead(); signals: - void textRecived(const QString string); - void gotSensorState(Sensor sensor); + void textRecived(const QString string); + void itemChanged(ItemData relay); + void auxStateChanged(int value); + void gotRelayList(std::vector< std::shared_ptr >&); + + void gotSensorState(Sensor sensor); }; #endif // MICROCONTROLLER_H diff --git a/src/pipewire.cpp b/src/pipewire.cpp deleted file mode 100644 index 2c789d5..0000000 --- a/src/pipewire.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include "pipewire.h" -#include -#include - -static const struct pw_registry_events registry_events = { - .version = PW_VERSION_REGISTRY_EVENTS, - .global = &PipeWireHandler::registryEventHandler, - .global_remove = nullptr -}; - -PipeWireHandler::PipeWireHandler() -{ - loop = pw_thread_loop_new("SHinterface", nullptr); - if(!loop) - throw std::runtime_error("Could not create pipewire main loop"); - - context = pw_context_new(pw_thread_loop_get_loop(loop), nullptr, 0); - if(!context) - throw std::runtime_error("Could not create pipewire context"); - - core = pw_context_connect(context, NULL, 0); - if(!core) - throw std::runtime_error("Could not connect to pipewire"); - - registry = pw_core_get_registry(core, PW_VERSION_REGISTRY, 0); - if(!registry) - throw std::runtime_error("Could not get pipewire registry"); - - spa_zero(registryListener); - pw_registry_add_listener(registry, ®istryListener, ®istry_events, this); -} - -bool PipeWireHandler::startLoop() -{ - if(!loop || !context || !core || !registry) - return false; - int ret = pw_thread_loop_start(loop); - return ret == 0; -} - -struct pw_registry* PipeWireHandler::getRegistry() -{ - return registry; -} - -void PipeWireHandler::registryEventHandler(void *data, uint32_t id, - uint32_t permissions, const char *type, uint32_t version, - const struct spa_dict *props) -{ - (void)permissions; - (void)version; - - PipeWireHandler* handler = static_cast(data); - - if(std::string(type) == PW_TYPE_INTERFACE_Node) - { - const struct spa_dict_item *item = spa_dict_lookup_item(props, "node.name"); - if(item) - { - qDebug()<<"got new pipewire node:"<value; - handler->nodeAdded({id, item->value}); - } - } -} - -PipeWireHandler::~PipeWireHandler() -{ - pw_core_disconnect(core); - pw_context_destroy(context); - pw_thread_loop_stop(loop); -} - diff --git a/src/pipewire.h b/src/pipewire.h deleted file mode 100644 index 5f2135a..0000000 --- a/src/pipewire.h +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -class PipeWireHandler: public QObject -{ - Q_OBJECT - -public: - struct PwNode - { - uint32_t id; - std::string name; - }; - -private: - - struct pw_thread_loop* loop; - struct pw_context* context; - struct pw_core* core; - struct pw_registry* registry; - struct spa_hook registryListener; - - void write(const char * const buffer, const size_t length); - void write(const QByteArray& buffer); - - void decode(QByteArray buffer); - void decodeMaster(const QByteArray& buffer); - -public: - - static void registryEventHandler(void *data, uint32_t id, - uint32_t permissions, const char *type, uint32_t version, - const struct spa_dict *props); - -signals: - - void nodeAdded(PwNode node); - void nodeRemoved(PwNode node); - -public: - - PipeWireHandler(); - PipeWireHandler(const PipeWireHandler&) = delete; - PipeWireHandler operator=(const PipeWireHandler&) = delete; - bool startLoop(); - struct pw_registry* getRegistry(); - - ~PipeWireHandler(); -}; - diff --git a/src/programmode.cpp b/src/programmode.cpp deleted file mode 100644 index d37ba81..0000000 --- a/src/programmode.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "programmode.h" - -program_mode_t programMode = PROGRAM_MODE_PRIMARY; diff --git a/src/programmode.h b/src/programmode.h deleted file mode 100644 index ccbb900..0000000 --- a/src/programmode.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef PROGRAMMODE_H -#define PROGRAMMODE_H - -typedef enum -{ - PROGRAM_MODE_PRIMARY = 0, - PROGRAM_MODE_HEADLESS_PRIMARY, - PROGRAM_MODE_UI_ONLY -} program_mode_t; - -extern program_mode_t programMode; - -#endif // PROGRAMMODE_H diff --git a/src/sensors/mqttsensorsource.cpp b/src/sensors/mqttsensorsource.cpp deleted file mode 100644 index 4202ab8..0000000 --- a/src/sensors/mqttsensorsource.cpp +++ /dev/null @@ -1,187 +0,0 @@ -#include "mqttsensorsource.h" - -#include - -MqttSensorSource::MqttSensorSource(QObject *parent) - : QObject{parent} -{ -} - -void MqttSensorSource::start(const QJsonObject& settings) -{ - baseTopicName = settings["BaseTopic"].toString("zigbee2mqtt"); - - connect(&client, &QMqttClient::stateChanged, this, &MqttSensorSource::onClientStateChanged); - connect(&client, &QMqttClient::errorChanged, this, &MqttSensorSource::onClientError); - - client.setHostname(settings["Host"].toString("127.0.0.1")); - client.setPort(settings["Port"].toInt(1883)); - if(settings.contains("User")) - client.setUsername(settings["User"].toString()); - if(settings.contains("Password")) - client.setPassword(settings["Password"].toString()); - client.setProtocolVersion(QMqttClient::MQTT_5_0); - - client.connectToHost(); - - QJsonArray sensorsArray = settings["Sensors"].toArray(); - - for(QJsonValueRef sensorRef : sensorsArray) - { - QJsonObject sensorObject = sensorRef.toObject(); - if(!sensorObject.contains("Topic")) - continue; - SensorSubscription sensor; - sensor.topic = sensorObject["Topic"].toString(); - if(!sensorObject.contains("Name")) - sensor.name = sensor.topic; - else - sensor.name = sensorObject["Name"].toString(); - sensor.id = qHash(baseTopicName + "/" + sensor.topic); - sensors.push_back(sensor); - } -} - -void MqttSensorSource::onClientError(QMqttClient::ClientError error) -{ - qWarning()<<"MQTT Client error:"< -#include -#include -#include - -#include "sensor.h" - -class MqttSensorSource : public QObject -{ - Q_OBJECT - - struct SensorSubscription - { - uint64_t id; - QString topic; - QString name; - QMqttSubscription* subscription = nullptr; - }; - - QString baseTopicName; - std::vector sensors; - QMqttClient client; - -private: - SensorSubscription& findSubscription(const QString& topic); - -private slots: - void onClientStateChanged(QMqttClient::ClientState state); - void onMessageReceived(const QMqttMessage& message); - void onClientError(QMqttClient::ClientError error); - -public: - explicit MqttSensorSource(QObject *parent = nullptr); - void start(const QJsonObject& settings); - void store(QJsonObject& json); - -signals: - void stateChanged(Sensor sensor); -}; - -#endif // MQTTSENSORSOURCE_H diff --git a/src/sensors/ocupancysensor.cpp b/src/sensors/ocupancysensor.cpp new file mode 100644 index 0000000..ad1e63f --- /dev/null +++ b/src/sensors/ocupancysensor.cpp @@ -0,0 +1,61 @@ +#include "ocupancysensor.h" +#include +#include + +#include "../apgetconnected.h" + + +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) +{ + 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(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) + { + bool found = false; + for(size_t i = 0; i < devices.size(); ++i) + { + std::string mac = ap::macAddrToString(devices[i]); + 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 "< +#include +#include "sensor.h" + +class OcupancySensorSource : public QObject +{ + Q_OBJECT +private: + + QString deviceMac_; + QString device_; + bool occupied = true; + static constexpr unsigned timeoutMs = (15 * 60) * 1000; + +public: + explicit OcupancySensorSource(QObject *parent = nullptr, const QString& device = "wlan0", const QString& deviceMac = "60:BE:B5:25:8C:E0"); + + void store(QJsonObject& json); + void load(const QJsonObject& json); + +public slots: + void sensorEvent(Sensor sensor); + +private slots: + + void Timeout(); + +signals: + void stateChanged(Sensor sensor); +}; diff --git a/src/sensors/sensor.cpp b/src/sensors/sensor.cpp index e2a262f..0a95763 100644 --- a/src/sensors/sensor.cpp +++ b/src/sensors/sensor.cpp @@ -6,44 +6,44 @@ SensorStore globalSensors; SensorStore::SensorStore(QObject *parent): QObject(parent) { - sensors_.push_back(Sensor(0,1,0,"Front door")); - sensors_.push_back(Sensor(0,0,0,"Bedroom door")); + sensors_.push_back(Sensor(0,1,0,"Front door")); + sensors_.push_back(Sensor(0,0,0,"Bedroom door")); } void SensorStore::sensorGotState(const Sensor& sensor) { - bool exsisting = false; - for(unsigned i = 0; i < sensors_.size(); ++i) - { - if(sensor.type == sensors_[i].type && sensor.id == sensors_[i].id) - { - sensors_[i].updateSeen(); - if(sensors_[i].field != sensor.field) - { - sensors_[i].field = sensor.field; - sensorChangedState(sensor); - stateChenged(sensors_); - } - exsisting = true; - break; - } - } - if(!exsisting) - { - sensors_.push_back(sensor); - sensorChangedState(sensor); - stateChenged(sensors_); - } + bool exsisting = false; + for(unsigned i = 0; i < sensors_.size(); ++i) + { + if(sensor.type == sensors_[i].type && sensor.id == sensors_[i].id) + { + sensors_[i].updateSeen(); + if(sensors_[i].field != sensor.field) + { + sensors_[i].field = sensor.field; + sensorChangedState(sensor); + stateChenged(sensors_); + } + exsisting = true; + break; + } + } + if(!exsisting) + { + sensors_.push_back(sensor); + sensorChangedState(sensor); + stateChenged(sensors_); + } - for(unsigned i = 0; i < sensors_.size(); ++i) - { - if(sensors_[i].type > 0 && sensors_[i].type < 128 && QDateTime::currentDateTime() > sensors_[i].lastSeen.addSecs(1800)) - { - sensorDeleted(sensors_[i]); - stateChenged(sensors_); - sensors_.erase(sensors_.begin()+i); - } - } + for(unsigned i = 0; i < sensors_.size(); ++i) + { + if(sensors_[i].type > 0 && sensors_[i].type < 128 && QDateTime::currentDateTime() > sensors_[i].lastSeen.addSecs(1800)) + { + sensorDeleted(sensors_[i]); + stateChenged(sensors_); + sensors_.erase(sensors_.begin()+i); + } + } } diff --git a/src/sensors/sensor.h b/src/sensors/sensor.h index bc5e748..e516e7e 100644 --- a/src/sensors/sensor.h +++ b/src/sensors/sensor.h @@ -4,149 +4,96 @@ #include #include #include -#include class Sensor { public: - static constexpr uint8_t TYPE_DOOR = 0; - static constexpr uint8_t TYPE_TEMPERATURE = 1; - static constexpr uint8_t TYPE_HUMIDITY = 2; - static constexpr uint8_t TYPE_PRESSURE = 3; - static constexpr uint8_t TYPE_BRIGHTNESS = 4; - static constexpr uint8_t TYPE_BUTTON = 5; - static constexpr uint8_t TYPE_ADC = 6; - static constexpr uint8_t TYPE_CO2 = 7; - static constexpr uint8_t TYPE_FORMALDEHYD= 8; - static constexpr uint8_t TYPE_PM25 = 9; - static constexpr uint8_t TYPE_TOTAL_VOC = 10; - static constexpr uint8_t TYPE_LOWBATTERY = 128; - static constexpr uint8_t TYPE_SHUTDOWN_IMMINENT = 251; - static constexpr uint8_t TYPE_OCUPANCY = 252; - static constexpr uint8_t TYPE_SUN_ALTITUDE = 253; - static constexpr uint8_t TYPE_AUDIO_OUTPUT = 254; - static constexpr uint8_t TYPE_DUMMY = 255; + static constexpr uint8_t TYPE_DOOR = 0; + static constexpr uint8_t TYPE_TEMPERATURE = 1; + static constexpr uint8_t TYPE_HUMIDITY = 2; + static constexpr uint8_t TYPE_PRESSURE = 3; + static constexpr uint8_t TYPE_BRIGHTNESS = 4; + static constexpr uint8_t TYPE_BUTTON = 5; + static constexpr uint8_t TYPE_ADC = 6; + static constexpr uint8_t TYPE_LOWBATTERY = 128; + static constexpr uint8_t TYPE_SHUTDOWN_IMMINENT = 251; + static constexpr uint8_t TYPE_OCUPANCY = 252; + static constexpr uint8_t TYPE_SUN_ALTITUDE = 253; + static constexpr uint8_t TYPE_AUDIO_OUTPUT = 254; + static constexpr uint8_t TYPE_DUMMY = 255; - uint8_t type; - uint64_t id; - float field; - QString name; - QDateTime lastSeen; - bool hidden; + uint8_t type; + uint8_t id; + float field; + QString name; + QDateTime lastSeen; + bool hidden; - Sensor(uint64_t typeIn, uint8_t idIn, float fieldIn = 0, QString nameIn = "", bool hiddenIn = false): type(typeIn), - id(idIn), field(fieldIn), name(nameIn), hidden(hiddenIn) - { - lastSeen = QDateTime::currentDateTime(); - if(nameIn == "") - generateName(); - } - Sensor(QString nameIn = "dummy"): type(TYPE_DUMMY), id(0), field(0), name(nameIn), hidden(false) - { - lastSeen = QDateTime::currentDateTime(); - } - Sensor(const QJsonObject& json) - { - type = json["SensorType"].toInt(0); - id = json["Id"].toInt(0); - field = json["Field"].toDouble(0); - name = json["Name"].toString("Sensor"); - lastSeen = QDateTime::fromString(json["LastSeen"].toString("")); - hidden = json["Hidden"].toBool(false); - } - inline bool operator==(const Sensor& in) const - { - return type==in.type && id == in.id; - } - inline bool operator!=(const Sensor& in) const - { - return !(*this==in); - } - inline void updateSeen() - { - lastSeen = QDateTime::currentDateTime(); - } - static Sensor sensorFromString(const QString& str) - { - QStringList bufferList = str.split(' '); - if(bufferList.size() >= 7) - { - Sensor sensor(bufferList[2].toUInt(), bufferList[4].toUInt(), bufferList[6].toUInt()); - if(sensor.type == Sensor::TYPE_HUMIDITY || sensor.type == Sensor::TYPE_TEMPERATURE) - sensor.field = sensor.field/10; - - if(bufferList.size() >= 9) - sensor.lastSeen = QDateTime::fromSecsSinceEpoch(bufferList[8].toLongLong()); - return sensor; - } - else - { - return Sensor(TYPE_DUMMY, 0, 0, "", true); - } - } - QString toString() - { - return QString("SENSOR TYPE: ")+QString::number(type)+" ID: "+QString::number(id)+" FIELD: "+ - QString::number((type == Sensor::TYPE_HUMIDITY || type == Sensor::TYPE_TEMPERATURE) ? field*10 : field) + - " TIME: " + QString::number(lastSeen.toSecsSinceEpoch()); - } - inline void store(QJsonObject& json) - { - json["Type"] = "Sensor"; - json["SensorType"] = static_cast(type); - json["Id"] = static_cast(id); - json["Field"] = field; - json["Name"] = name; - json["LastSeen"] = lastSeen.toString(); - json["Hidden"] = hidden; - } - inline void generateName() - { - if(type == TYPE_TEMPERATURE) - name = "Temperature " + QString::number(id); - else if(type == TYPE_DOOR) - name = "Door " + QString::number(id); - else if(type == TYPE_BUTTON) - name = "Button " + QString::number(id); - else if(type == TYPE_AUDIO_OUTPUT) - name = "Speakers " + QString::number(id); - else if(type == TYPE_HUMIDITY) - name = "Humidity " + QString::number(id); - else if(type == TYPE_SUN_ALTITUDE) - name = "Solar Altitude"; - else if(type == TYPE_SHUTDOWN_IMMINENT) - name = "Shutdown Imminent"; - else name = "Sensor Type " + QString::number(type) + " Id " + QString::number(id); - } + Sensor(uint8_t typeIn, uint8_t idIn, float fieldIn = 0, QString nameIn = "", bool hiddenIn = false): type(typeIn), id(idIn), field(fieldIn), name(nameIn), hidden(hiddenIn) + { + lastSeen = QDateTime::currentDateTime(); + if(nameIn == "") generateName(); + } + Sensor(QString nameIn = "dummy"): type(TYPE_DUMMY), id(0), field(0), name(nameIn), hidden(false) + { + lastSeen = QDateTime::currentDateTime(); + } + inline bool operator==(const Sensor& in) const{ return type==in.type && id == in.id; } + inline bool operator!=(const Sensor& in) const{ return !(*this==in); } + inline void updateSeen(){lastSeen = QDateTime::currentDateTime();} + static Sensor sensorFromString(const QString& str) + { + QStringList bufferList = str.split(' '); + if(bufferList.size() >= 7) + { + Sensor sensor(bufferList[2].toUInt(), bufferList[4].toUInt(), bufferList[6].toUInt()); + if(sensor.type == Sensor::TYPE_HUMIDITY || sensor.type == Sensor::TYPE_TEMPERATURE) sensor.field = sensor.field/10; + return sensor; + } + else return Sensor(TYPE_DUMMY, 0, 0, "", true); + } + QString toString() + { + return QString("SENSOR TYPE: ")+QString::number(type)+" ID: "+QString::number(id)+" FIELD: "+ + QString::number((type == Sensor::TYPE_HUMIDITY || type == Sensor::TYPE_TEMPERATURE) ? field*10 : field); + } + inline void generateName() + { + if(type == TYPE_TEMPERATURE) name = "Temperature " + QString::number(id); + else if(type == TYPE_DOOR) name = "Door " + QString::number(id); + else if(type == TYPE_BUTTON) name = "Button " + QString::number(id); + else if(type == TYPE_AUDIO_OUTPUT) name = "Speakers " + QString::number(id); + else if(type == TYPE_HUMIDITY) name = "Humidity " + QString::number(id); + else if(type == TYPE_SUN_ALTITUDE) name = "Solar Altitude"; + else if(type == TYPE_SHUTDOWN_IMMINENT) name = "Shutdown Imminent"; + else name = "Sensor Type " + QString::number(type) + " Id " + QString::number(id); + } }; class SensorStore: public QObject { - Q_OBJECT + Q_OBJECT private: - std::vector sensors_; + std::vector sensors_; public: - SensorStore(QObject *parent = nullptr); - virtual ~SensorStore() {} + SensorStore(QObject *parent = nullptr); + virtual ~SensorStore(){} - inline std::vector* getSensors() - { - return &sensors_; - } + inline std::vector* getSensors(){ return &sensors_; } public slots: - void sensorGotState(const Sensor& sensor); + void sensorGotState(const Sensor& sensor); signals: - void stateChenged(std::vector sensors); - void sensorChangedState(Sensor sensor); - void sensorDeleted(Sensor sensor); + void stateChenged(std::vector sensors); + void sensorChangedState(Sensor sensor); + void sensorDeleted(Sensor sensor); }; diff --git a/src/sensors/speakersensor.cpp b/src/sensors/speakersensor.cpp new file mode 100644 index 0000000..b6afbfa --- /dev/null +++ b/src/sensors/speakersensor.cpp @@ -0,0 +1,59 @@ +#include "speakersensor.h" + +#include + +SpeakerSensorSource::SpeakerSensorSource(QString name, QObject *parent) : QObject(parent), name_(name) +{ + silenceCount = 0; +} + +SpeakerSensorSource::~SpeakerSensorSource() +{ + abort(); +} + +void SpeakerSensorSource::run() +{ + abort(); + arecord.start( "arecord --disable-softvol -r 8000 -D front -" ); + + connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); + timer.setInterval(500); + timer.start(); + + stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_)); +} + + +void SpeakerSensorSource::abort() +{ + if(arecord.state() == QProcess::Running)arecord.close(); + if(timer.isActive())timer.stop(); +} + +void SpeakerSensorSource::doTick() +{ + if(arecord.state() == QProcess::Running) + { + QByteArray buffer = arecord.readAllStandardOutput(); + //qDebug()<<(int16_t)buffer[0]; + for(long i = 0; i < buffer.size(); i++) + { + if((int16_t)buffer.at(i) != -128) + { + silenceCount = 0; + } + } + if(silenceCount > 40 && state) + { + stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 0, name_)); + state = false; + } + else if(silenceCount == 0 && !state) + { + stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_)); + state = true; + } + silenceCount++; + } +} diff --git a/src/sensors/speakersensor.h b/src/sensors/speakersensor.h new file mode 100644 index 0000000..94b41f4 --- /dev/null +++ b/src/sensors/speakersensor.h @@ -0,0 +1,45 @@ +#ifndef AMPMANAGER_H +#define AMPMANAGER_H + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "sensor.h" + + +class SpeakerSensorSource : public QObject +{ + Q_OBJECT +private: + QString name_; + bool state = true; + QTimer timer; + +public: + explicit SpeakerSensorSource(QString name = "", QObject *parent = nullptr); + ~SpeakerSensorSource(); + +public slots: + void run(); + void abort(); + +signals: + void stateChanged(Sensor sensor); + +private slots: + void doTick(); + +private: + long silenceCount = 0; + + QProcess arecord; +}; + +#endif // AMPMANAGER_H diff --git a/src/sensors/sunsensor.cpp b/src/sensors/sunsensor.cpp index 37a1c9b..6be9a73 100644 --- a/src/sensors/sunsensor.cpp +++ b/src/sensors/sunsensor.cpp @@ -2,24 +2,24 @@ SunSensorSource::SunSensorSource(double lat, double lon, QObject *parent): QObject(parent), sun_(lat, lon) { - connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); + connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); } void SunSensorSource::run() { - connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); - timer.setInterval(10000); //10s - timer.start(); - doTick(); + connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); + timer.setInterval(10000); //10s + timer.start(); + doTick(); } void SunSensorSource::abort() { - if(timer.isActive())timer.stop(); + if(timer.isActive())timer.stop(); } void SunSensorSource::doTick() { - stateChanged(Sensor(Sensor::TYPE_SUN_ALTITUDE, 0, static_cast(sun_.altitude()))); + stateChanged(Sensor(Sensor::TYPE_SUN_ALTITUDE, 0, static_cast(sun_.altitude()))); } diff --git a/src/sensors/sunsensor.h b/src/sensors/sunsensor.h index 65d84c3..eec3c5f 100644 --- a/src/sensors/sunsensor.h +++ b/src/sensors/sunsensor.h @@ -2,28 +2,28 @@ #include -#include "sun.h" +#include "../sun.h" #include "sensor.h" class SunSensorSource : public QObject { - Q_OBJECT + Q_OBJECT private: - Sun sun_; - QTimer timer; + Sun sun_; + QTimer timer; public: - explicit SunSensorSource(double lat, double lon, QObject *parent = nullptr); + explicit SunSensorSource(double lat, double lon, QObject *parent = nullptr); public slots: - void run(); - void abort(); + void run(); + void abort(); signals: - void stateChanged(Sensor sensor); + void stateChanged(Sensor sensor); private slots: - void doTick(); + void doTick(); }; diff --git a/src/service/service.cpp b/src/service/service.cpp deleted file mode 100644 index 5129512..0000000 --- a/src/service/service.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include -#include -#include -#include - -#include "items/item.h" -#include "items/itemstore.h" -#include "service.h" - - -Service::Service(QObject* parent): - ItemSource(parent) -{} - -QJsonObject Service::createMessage(const QString& type, const QJsonArray& data) -{ - QJsonObject json; - json["MessageType"] = type; - json["Data"] = data; - return json; -} - -void Service::sensorEvent(Sensor sensor) -{ - QJsonArray sensors; - QJsonObject sensorjson; - sensor.store(sensorjson); - sensors.append(sensorjson); - QJsonObject json = createMessage("SensorUpdate", sensors); - sendJson(json); -} - -void Service::itemUpdated(std::weak_ptr item) -{ - qDebug()<<__func__; - QJsonArray items; - QJsonObject itemjson; - item.lock()->store(itemjson); - items.append(itemjson); - QJsonObject json = createMessage("ItemUpdate", items); - json["FullList"] = false; - sendJson(json); -} - -void Service::refresh() -{ - sendJson(createMessage("GetSensors", QJsonArray())); - sendJson(createMessage("GetItems", QJsonArray())); -} - -void Service::sendSensors() -{ - QJsonArray sensors; - for(auto& sensor: *globalSensors.getSensors()) - { - QJsonObject sensorjson; - sensor.store(sensorjson); - sensors.append(sensorjson); - } - sendJson(createMessage("SensorUpdate", sensors)); -} - -void Service::sendItems() -{ - QJsonArray items; - for(auto& item: *globalItems.getItems()) - { - QJsonObject itemjson; - item->store(itemjson); - items.append(itemjson); - } - QJsonObject json = createMessage("ItemUpdate", items); - json["FullList"] = true; - sendJson(json); -} - - -void Service::processIncomeingJson(const QByteArray& jsonbytes) -{ - QJsonDocument doc = QJsonDocument::fromJson(jsonbytes); - qDebug()<<"Got Json:"< -#include - -#include "sensors/sensor.h" -#include "items/item.h" -#include "items/itemsource.h" - -class Service : public ItemSource -{ - Q_OBJECT -protected: - - typedef enum - { - STATE_IDLE, - STATE_RECV_JSON, - } client_state_t; - -signals: - void gotSensor(Sensor sensor); - -public slots: - void sensorEvent(Sensor sensor); - void itemUpdated(std::weak_ptr item); - virtual void refresh() override; - -public: - Service(QObject* parent = nullptr); - void sendSensors(); - void sendItems(); - virtual void sendJson(const QJsonObject& json) = 0; - virtual bool launch(const QHostAddress &address = QHostAddress::Any, quint16 port = 0) = 0; - -protected: - static QJsonObject createMessage(const QString& type, const QJsonArray& data); - virtual void processIncomeingJson(const QByteArray& jsonbytes); -}; - -#endif // TCPSERVER_BASE_H diff --git a/src/service/tcpclient.cpp b/src/service/tcpclient.cpp deleted file mode 100644 index d4d8dd8..0000000 --- a/src/service/tcpclient.cpp +++ /dev/null @@ -1,100 +0,0 @@ -#include -#include -#include -#include - -#include "items/item.h" -#include "service.h" -#include "tcpclient.h" - -TcpClient::TcpClient(QObject* parent): - Service(parent), - socket(new QTcpSocket(this)) -{ - connect(socket, &QTcpSocket::readyRead, this, &TcpClient::socketReadyRead); -} - -void TcpClient::sendJson(const QJsonObject& json) -{ - QByteArray jsonData = QJsonDocument(json).toJson(); - socket->write(QString("MSG JSON LEN " + QString::number(jsonData.size()) + "\n").toLatin1() + jsonData); -} - -bool TcpClient::launch(const QHostAddress &address, quint16 port) -{ - socket->connectToHost(address, port); - return socket->waitForConnected(2000); -} - -void TcpClient::processIncomeingJson(const QByteArray& jsonbytes) -{ - QJsonDocument doc = QJsonDocument::fromJson(jsonbytes); - QJsonObject json = doc.object(); - QString type = json["MessageType"].toString(); - if(type == "ItemUpdate") - { - std::cout<<"Got item json:\n"<> items; - for(QJsonValueRef itemjson : data) - { - QJsonObject jsonobject = itemjson.toObject(); - std::shared_ptr item = Item::loadItem(jsonobject); - if(item) - { - item->setLoaded(false); - items.push_back(item); - } - } - if(!items.empty()) - gotItems(items, true); - } - else - { - Service::processIncomeingJson(jsonbytes); - } -} - -void TcpClient::processComand(const QByteArray& command) -{ - if(command.startsWith("MSG JSON LEN ")) - { - state = STATE_RECV_JSON; - recievebytes = command.mid(13).toLongLong(); - } -} - -void TcpClient::socketReadyRead() -{ - buffer += socket->readAll(); - bool remianing = true; - while(remianing) - { - remianing = false; - while(state == STATE_IDLE && buffer.contains('\n')) - { - size_t newlineIndex = buffer.indexOf('\n'); - QByteArray command = buffer.left(newlineIndex); - buffer.remove(0, newlineIndex+1); - processComand(command); - remianing = true; - } - if(state == STATE_RECV_JSON) - { - if(recievebytes <= buffer.size()) - { - QByteArray json = buffer.left(recievebytes); - buffer.remove(0, recievebytes); - recievebytes = 0; - state = STATE_IDLE; - processIncomeingJson(json); - remianing = true; - } - } - } -} - -TcpClient::~TcpClient() -{ - delete socket; -} diff --git a/src/service/tcpclient.h b/src/service/tcpclient.h deleted file mode 100644 index df28641..0000000 --- a/src/service/tcpclient.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef TCPSERVER_CLIENT_H -#define TCPSERVER_CLIENT_H - -#include -#include -#include - -#include "service.h" - -class TcpClient : public Service -{ - Q_OBJECT - - QTcpSocket* socket; - client_state_t state = STATE_IDLE; - long long recievebytes = 0; - QByteArray buffer; - -public: - TcpClient(QObject* parent = nullptr); - ~TcpClient(); - virtual bool launch(const QHostAddress &address = QHostAddress::Any, quint16 port = 0) override; - virtual void sendJson(const QJsonObject& json) override; - -protected: - virtual void processIncomeingJson(const QByteArray& jsonbytes) override; - -private slots: - void socketReadyRead(); - void processComand(const QByteArray& command); -}; - -#endif // TCPSERVER_CLIENT_H diff --git a/src/service/tcpserver.cpp b/src/service/tcpserver.cpp deleted file mode 100644 index b5b780f..0000000 --- a/src/service/tcpserver.cpp +++ /dev/null @@ -1,153 +0,0 @@ -#include -#include -#include -#include - -#include "items/item.h" -#include "service.h" -#include "tcpserver.h" - -TcpServer::TcpServer(QObject* parent): - Service(parent), - server(this) -{ - connect(&server, &QTcpServer::newConnection, this, &TcpServer::incomingConnection); -} - -void TcpServer::sendJson(const QJsonObject& json) -{ - for(auto client: clients) - { - QByteArray jsonData = QJsonDocument(json).toJson(); - client.socket->write(QString("MSG JSON LEN " + QString::number(jsonData.size()) + "\n").toLatin1() + jsonData); - } -} - -void TcpServer::processIncomeingJson(const QByteArray& jsonbytes) -{ - QJsonDocument doc = QJsonDocument::fromJson(jsonbytes); - QJsonObject json = doc.object(); - QString type = json["MessageType"].toString(); - if(type == "ItemUpdate") - { - qDebug()<<"Got Items"; - QJsonArray data = json["Data"].toArray(); - bool FullList = json["FullList"].toBool(false); - std::vector> items; - for(QJsonValueRef itemjson : data) - { - QJsonObject jsonobject = itemjson.toObject(); - std::shared_ptr item = Item::loadItem(jsonobject); - item->setLoaded(FullList); - if(item) - items.push_back(item); - } - if(FullList && !items.empty()) - { - requestReplaceItems(items); - sigRequestSave(); - } - else if(!items.empty()) - { - gotItems(items, false); - } - } - else - { - Service::processIncomeingJson(jsonbytes); - } -} - -bool TcpServer::launch(const QHostAddress &address, quint16 port) -{ - return server.listen(address, port); -} - -void TcpServer::incomingConnection() -{ - while(server.hasPendingConnections()) - { - QTcpSocket* client = server.nextPendingConnection(); - qDebug()<<"Got new client from"<peerAddress().toString(); - if(client) - { - clients.push_back({client}); - connect(client, &QTcpSocket::errorOccurred, this, &TcpServer::socketError); - connect(client, &QTcpSocket::disconnected, this, &TcpServer::socketDisconnect); - connect(client, &QTcpSocket::readyRead, this, &TcpServer::socketReadyRead); - } - } -} - -void TcpServer::socketError(QAbstractSocket::SocketError socketError) -{ - (void)socketError; - for(size_t i = 0; i < clients.size(); i++) - { - if(clients[i].socket == TcpServer::sender()) - { - clients.erase(clients.begin()+i); - --i; - } - } -} -void TcpServer::socketDisconnect() -{ - for(size_t i = 0; i < clients.size(); i++) - { - if(clients[i].socket == TcpServer::sender()) - { - clients.erase(clients.begin()+i); - --i; - } - } -} - -void TcpServer::processComand(const QByteArray& command, Client& client) -{ - if(command.startsWith("MSG JSON LEN ")) - { - client.state = STATE_RECV_JSON; - client.recievebytes = command.mid(13).toLongLong(); - qDebug()<<"Got command:"<readAll(); - clients[i].buffer += newChars; - - bool remianing = true; - while(remianing) - { - qDebug()< -#include - -#include "service.h" - -class TcpServer : public Service -{ - Q_OBJECT - - struct Client - { - QTcpSocket* socket; - QByteArray buffer; - client_state_t state = STATE_IDLE; - long long recievebytes = 0; - }; - - std::vector clients; - QTcpServer server; - -public: - TcpServer(QObject* parent = nullptr); - virtual bool launch(const QHostAddress &address = QHostAddress::Any, quint16 port = 0) override; - virtual void sendJson(const QJsonObject& json) override; - -signals: - void sigRequestSave(); - -private slots: - void incomingConnection(); - void socketError(QAbstractSocket::SocketError socketError); - void socketDisconnect(); - void socketReadyRead(); - -protected: - virtual void processIncomeingJson(const QByteArray& jsonbytes) override; - -private: - void processComand(const QByteArray& command, Client& client); -}; - -#endif // TCPSERVER_SERVER_H diff --git a/src/sun.cpp b/src/sun.cpp index 03b74ee..c6da3d5 100644 --- a/src/sun.cpp +++ b/src/sun.cpp @@ -13,7 +13,7 @@ public: double utcHour; int day; int year; - + JdTime(); void update(); std::time_t toStdTime(); @@ -34,21 +34,21 @@ void Sun::JdTime::update() void Sun::JdTime::fromStdTime(std::time_t time) { - std::tm ltime = *std::localtime( &time ); - + std::tm ltime = *std::localtime( &time ); + localHour = ltime.tm_hour + ltime.tm_min/60.0 + ltime.tm_sec/3600.0; utcHour = localHour - ltime.tm_gmtoff/3600.0; day = ltime.tm_yday; year = ltime.tm_year + 1900; - + std::tm millennium = {0,0,0,1,0,100}; std::time_t millenniumTime = std::mktime(&millennium) - timezone; - + daysSinceY2K = (time - millenniumTime)/(60*60*24.0); //std::cout<<"days since y2k: "< ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr alarm, QWidget *parent): - QDialog(parent), - actor_(alarm), - ui(new Ui::ActorSettingsDialog) + QDialog(parent), + actor_(alarm), + ui(new Ui::ActorSettingsDialog) { - init(); + init(); - widget = new AlarmWidget(alarm, this); - ui->vertlayout->addWidget(widget); + widget = new AlarmWidget(alarm, this); + ui->vertlayout->addWidget(widget); } ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : - QDialog(parent), - actor_(actor), - ui(new Ui::ActorSettingsDialog) +QDialog(parent), +actor_(actor), +ui(new Ui::ActorSettingsDialog) { - init(); + init(); - widget = new SensorActorWidget(actor, &globalSensors, this); - ui->vertlayout->addWidget(widget); + widget = new SensorActorWidget(actor, &globalSensors, this); + ui->vertlayout->addWidget(widget); } ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : - QDialog(parent), - actor_(actor), - ui(new Ui::ActorSettingsDialog) + QDialog(parent), + actor_(actor), + ui(new Ui::ActorSettingsDialog) { - init(); + init(); - widget = new RegulatorWdiget(actor, &globalSensors, this); - ui->vertlayout->addWidget(widget); + widget = new RegulatorWdiget(actor, &globalSensors, this); + ui->vertlayout->addWidget(widget); } ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : - QDialog(parent), - actor_(actor), - ui(new Ui::ActorSettingsDialog) +QDialog(parent), +actor_(actor), +ui(new Ui::ActorSettingsDialog) { - init(); + init(); - widget = new TimerActorWidget(actor, this); - ui->vertlayout->addWidget(widget); + widget = new TimerActorWidget(actor, this); + ui->vertlayout->addWidget(widget); } ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : - QDialog(parent), - actor_(actor), - ui(new Ui::ActorSettingsDialog) +QDialog(parent), +actor_(actor), +ui(new Ui::ActorSettingsDialog) { - init(); + init(); - widget = new PolynomalActorWidget(actor, &globalSensors, this); - ui->vertlayout->addWidget(widget); + widget = new PolynomalActorWidget(actor, &globalSensors, this); + ui->vertlayout->addWidget(widget); } ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : - QDialog(parent), - actor_(actor), - ui(new Ui::ActorSettingsDialog) +QDialog(parent), +actor_(actor), +ui(new Ui::ActorSettingsDialog) { - init(); - widget = new FactorActorWidget(actor, this); - ui->vertlayout->addWidget(widget); + init(); + widget = new FactorActorWidget(actor, this); + ui->vertlayout->addWidget(widget); } ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr actor, QWidget *parent) : - QDialog(parent), - actor_(actor), - ui(new Ui::ActorSettingsDialog) +QDialog(parent), +actor_(actor), +ui(new Ui::ActorSettingsDialog) { - init(); + init(); } void ActorSettingsDialog::init() { - ui->setupUi(this); - 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->setupUi(this); + 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); + 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); + 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); - ui->label_Exausted->setText(actor_->isExausted() ? "True" : "False"); - ui->label_Enabled->setText(actor_->isActive() ? "True" : "False"); - ui->pushButton_enable->setText(actor_->isActive() ? "Disable" : "Enable"); + ui->label_Exausted->setText(actor_->isExausted() ? "True" : "False"); } ActorSettingsDialog::~ActorSettingsDialog() { - delete ui; + delete ui; } void ActorSettingsDialog::editAsItem() { - ItemSettingsDialog itemSettingsDiag(actor_, this); - 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"); + ItemSettingsDialog itemSettingsDiag(actor_, this); + itemSettingsDiag.exec(); } void ActorSettingsDialog::valueChanged(int value) { - actor_->setTriggerValue(value); + actor_->setTriggerValue(value); } void ActorSettingsDialog::hideCancle([[maybe_unused]] const bool hide) @@ -129,13 +116,13 @@ void ActorSettingsDialog::hideCancle([[maybe_unused]] const bool hide) void ActorSettingsDialog::changeAction(int index) { - if(index == 0) actor_->setTriggerValue(0); - else if(index == 1) actor_->setTriggerValue(1); - else if(index == 2) - { - ui->spinBox->show(); - actor_->setTriggerValue(ui->spinBox->value()); - } - if(index != 2)ui->spinBox->hide(); + if(index == 0) actor_->setTriggerValue(0); + else if(index == 1) actor_->setTriggerValue(1); + else if(index == 2) + { + ui->spinBox->show(); + actor_->setTriggerValue(ui->spinBox->value()); + } + if(index != 2)ui->spinBox->hide(); } diff --git a/src/ui/actorsettingsdialog.h b/src/ui/actorsettingsdialog.h index 16c4d68..3d8e5a5 100644 --- a/src/ui/actorsettingsdialog.h +++ b/src/ui/actorsettingsdialog.h @@ -10,42 +10,40 @@ #include "actorwidgets/polynomalactorwidget.h" #include "actorwidgets/factoractorwidget.h" -namespace Ui -{ +namespace Ui { class ActorSettingsDialog; } class ActorSettingsDialog : public QDialog { - Q_OBJECT + Q_OBJECT private: - std::shared_ptr actor_; - QWidget* widget; + std::shared_ptr actor_; + QWidget* widget; - void init(); + void init(); public: - 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(); + 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); + void hideCancle(const bool hide); private slots: - void changeAction(int index); - void valueChanged(int value); - void editAsItem(); - void setEnabled(); + void changeAction(int index); + void valueChanged(int value); + void editAsItem(); private: - Ui::ActorSettingsDialog *ui; + Ui::ActorSettingsDialog *ui; }; #endif // ACTORSETTINGSDIALOG_H diff --git a/src/ui/actorsettingsdialog.ui b/src/ui/actorsettingsdialog.ui index 0334dec..6b0a057 100644 --- a/src/ui/actorsettingsdialog.ui +++ b/src/ui/actorsettingsdialog.ui @@ -85,63 +85,6 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Enabled: - - - - - - - - 0 - 0 - - - - True - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Enable - - - diff --git a/src/ui/actorwidgets/alarmwidget.cpp b/src/ui/actorwidgets/alarmwidget.cpp index 9c2490b..65cbb31 100644 --- a/src/ui/actorwidgets/alarmwidget.cpp +++ b/src/ui/actorwidgets/alarmwidget.cpp @@ -2,81 +2,73 @@ #include "ui_alarmwidget.h" AlarmWidget::AlarmWidget(std::shared_ptr alarm, QWidget *parent) : - QWidget(parent), - alarm_(alarm), - ui(new Ui::AlarmWidget) + QWidget(parent), + alarm_(alarm), + ui(new Ui::AlarmWidget) { - ui->setupUi(this); + ui->setupUi(this); + connect(ui->checkBox, &QCheckBox::stateChanged, this, &AlarmWidget::toggleRepeating); + connect(ui->radioButton, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); + connect(ui->radioButton_2, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); + connect(ui->radioButton_3, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); + connect(ui->radioButton_4, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); - ui->dateTimeEdit->setDateTime(alarm->getDateTime()); + ui->dateTimeEdit->setDateTime(alarm->getDateTime()); - if(alarm_->getRepeat() == AlarmTime::REPEAT_NEVER) - { - ui->radioButton->setEnabled(false); - ui->radioButton_2->setEnabled(false); - ui->radioButton_3->setEnabled(false); - ui->radioButton_4->setEnabled(false); - } - else - { - ui->checkBox->setChecked(true); - ui->radioButton->setEnabled(true); - ui->radioButton_2->setEnabled(true); - ui->radioButton_3->setEnabled(true); - ui->radioButton_4->setEnabled(true); - } + if(alarm_->getRepeat() == AlarmTime::REPEAT_NEVER) + { + ui->radioButton->setEnabled(false); + ui->radioButton_2->setEnabled(false); + ui->radioButton_3->setEnabled(false); + ui->radioButton_4->setEnabled(false); + } + else + { + ui->checkBox->setChecked(true); + ui->radioButton->setEnabled(true); + ui->radioButton_2->setEnabled(true); + ui->radioButton_3->setEnabled(true); + ui->radioButton_4->setEnabled(true); + } - if(alarm_->getRepeat() == AlarmTime::REPEAT_DAILY) - ui->radioButton->setChecked(true); - else if(alarm_->getRepeat() == AlarmTime::REPEAT_WEEKLY) - ui->radioButton_2->setChecked(true); - else if(alarm_->getRepeat() == AlarmTime::REPEAT_MONTHLY) - ui->radioButton_3->setChecked(true); - else if(alarm_->getRepeat() == AlarmTime::REPEAT_YEARLY) - ui->radioButton_4->setChecked(true); + if(alarm_->getRepeat() == AlarmTime::REPEAT_DAILY) ui->radioButton->setChecked(true); + else if(alarm_->getRepeat() == AlarmTime::REPEAT_WEEKLY) ui->radioButton_2->setChecked(true); + 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->checkBox, &QCheckBox::stateChanged, this, &AlarmWidget::toggleRepeating); - connect(ui->radioButton, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); - connect(ui->radioButton_2, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); - connect(ui->radioButton_3, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); - connect(ui->radioButton_4, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType); - connect(ui->dateTimeEdit, &QDateTimeEdit::dateTimeChanged, alarm.get(), &AlarmTime::changeTime); + connect(ui->dateTimeEdit, &QDateTimeEdit::dateTimeChanged, alarm.get(), &AlarmTime::changeTime); } AlarmWidget::~AlarmWidget() { - delete ui; + delete ui; } void AlarmWidget::setRepeatingType() { - if(ui->radioButton->isChecked()) - alarm_->setRepeat(AlarmTime::REPEAT_DAILY); - if(ui->radioButton_2->isChecked()) - alarm_->setRepeat(AlarmTime::REPEAT_WEEKLY); - if(ui->radioButton_3->isChecked()) - alarm_->setRepeat(AlarmTime::REPEAT_MONTHLY); - if(ui->radioButton_4->isChecked()) - alarm_->setRepeat(AlarmTime::REPEAT_YEARLY); + if(ui->radioButton->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_DAILY); + if(ui->radioButton_2->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_WEEKLY); + if(ui->radioButton_3->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_MONTHLY); + if(ui->radioButton_4->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_YEARLY); } void AlarmWidget::toggleRepeating(int state) { - if(state) - { - ui->radioButton->setEnabled(true); - ui->radioButton_2->setEnabled(true); - ui->radioButton_3->setEnabled(true); - ui->radioButton_4->setEnabled(true); - setRepeatingType(); - } - else - { - alarm_->setRepeat(AlarmTime::REPEAT_NEVER); - ui->radioButton->setEnabled(false); - ui->radioButton_2->setEnabled(false); - ui->radioButton_3->setEnabled(false); - ui->radioButton_4->setEnabled(false); - } + if(state) + { + ui->radioButton->setEnabled(true); + ui->radioButton_2->setEnabled(true); + ui->radioButton_3->setEnabled(true); + ui->radioButton_4->setEnabled(true); + setRepeatingType(); + } + else + { + alarm_->setRepeat(AlarmTime::REPEAT_NEVER); + ui->radioButton->setEnabled(false); + ui->radioButton_2->setEnabled(false); + ui->radioButton_3->setEnabled(false); + ui->radioButton_4->setEnabled(false); + } } diff --git a/src/ui/actorwidgets/alarmwidget.h b/src/ui/actorwidgets/alarmwidget.h index 58670ee..13541d9 100644 --- a/src/ui/actorwidgets/alarmwidget.h +++ b/src/ui/actorwidgets/alarmwidget.h @@ -5,27 +5,26 @@ #include #include "../../actors/alarmtime.h" -namespace Ui -{ +namespace Ui { class AlarmWidget; } class AlarmWidget : public QWidget { - Q_OBJECT + Q_OBJECT - std::shared_ptr alarm_; + std::shared_ptr alarm_; public: - explicit AlarmWidget(std::shared_ptr alarm, QWidget *parent = nullptr); - ~AlarmWidget(); + explicit AlarmWidget(std::shared_ptr alarm, QWidget *parent = nullptr); + ~AlarmWidget(); private slots: - void toggleRepeating(int state); - void setRepeatingType(); + void toggleRepeating(int state); + void setRepeatingType(); private: - Ui::AlarmWidget *ui; + Ui::AlarmWidget *ui; }; #endif // ALARMWIDGET_H diff --git a/src/ui/actorwidgets/alarmwidget.ui b/src/ui/actorwidgets/alarmwidget.ui index 3b99187..1b29275 100644 --- a/src/ui/actorwidgets/alarmwidget.ui +++ b/src/ui/actorwidgets/alarmwidget.ui @@ -24,16 +24,16 @@ - QFormLayout::FieldGrowthPolicy::AllNonFixedFieldsGrow + QFormLayout::AllNonFixedFieldsGrow - QFormLayout::RowWrapPolicy::DontWrapRows + QFormLayout::DontWrapRows - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 50 @@ -57,7 +57,7 @@ false - QDateTimeEdit::Section::DaySection + QDateTimeEdit::DaySection dd.MM.yyyy hh:mm diff --git a/src/ui/actorwidgets/factoractorwidget.cpp b/src/ui/actorwidgets/factoractorwidget.cpp index deee281..21990db 100644 --- a/src/ui/actorwidgets/factoractorwidget.cpp +++ b/src/ui/actorwidgets/factoractorwidget.cpp @@ -3,82 +3,82 @@ #include "../actorsettingsdialog.h" FactorActorWidget::FactorActorWidget(std::shared_ptr actor, QWidget *parent) : - QWidget(parent), - actor_(actor), - ui(new Ui::FactorActorWidget) + QWidget(parent), + actor_(actor), + ui(new Ui::FactorActorWidget) { - ui->setupUi(this); - ui->comboBox->setCurrentText(actor_->getFactorDirection() ? "True" : "False"); - ui->spinBox->setValue(actor_->getPreCancleTime()); - if(actor_->getFactorActor()) ui->label_FactorActor->setText(actor_->getFactorActor()->getName()); - connect(ui->pushButton, &QPushButton::clicked, this, &FactorActorWidget::createFactorActor); - connect(ui->comboBox_Direcion, &QComboBox::currentTextChanged, this, &FactorActorWidget::setDirection); - connect(ui->spinBox, qOverload(&QSpinBox::valueChanged), this, &FactorActorWidget::setPreCancleTime); + ui->setupUi(this); + ui->comboBox->setCurrentText(actor_->getFactorDirection() ? "True" : "False"); + ui->spinBox->setValue(actor_->getPreCancleTime()); + if(actor_->getFactorActor()) ui->label_FactorActor->setText(actor_->getFactorActor()->getName()); + connect(ui->pushButton, &QPushButton::clicked, this, &FactorActorWidget::createFactorActor); + connect(ui->comboBox_Direcion, &QComboBox::currentTextChanged, this, &FactorActorWidget::setDirection); + connect(ui->spinBox, qOverload(&QSpinBox::valueChanged), this, &FactorActorWidget::setPreCancleTime); } FactorActorWidget::~FactorActorWidget() { - delete ui; + delete ui; } void FactorActorWidget::createFactorActor() { - ActorSettingsDialog* dialog = nullptr; - std::shared_ptr actor = nullptr; + ActorSettingsDialog* dialog = nullptr; + std::shared_ptr actor = nullptr; - if(ui->comboBox->currentText() == "Alarm") - { - std::shared_ptr alarm = std::shared_ptr(new AlarmTime); - actor = alarm; - dialog = new ActorSettingsDialog(alarm, this); - } - else if(ui->comboBox->currentText() == "Sensor") - { - std::shared_ptr sensorActor = std::shared_ptr(new SensorActor()); - actor = sensorActor; - dialog = new ActorSettingsDialog(sensorActor, this); - } - else if(ui->comboBox->currentText() == "Timer" ) - { - std::shared_ptr timerActor = std::shared_ptr(new TimerActor()); - actor = timerActor; - dialog = new ActorSettingsDialog(timerActor, this); - } - else if(ui->comboBox->currentText() == "Regulator") - { - std::shared_ptr regulator = std::shared_ptr(new Regulator()); - actor = regulator; - dialog = new ActorSettingsDialog(regulator, this); - } + if(ui->comboBox->currentText() == "Alarm") + { + std::shared_ptr alarm = std::shared_ptr(new AlarmTime); + actor = alarm; + dialog = new ActorSettingsDialog(alarm, this); + } + else if(ui->comboBox->currentText() == "Sensor") + { + std::shared_ptr sensorActor = std::shared_ptr(new SensorActor()); + actor = sensorActor; + dialog = new ActorSettingsDialog(sensorActor, this); + } + else if(ui->comboBox->currentText() == "Timer" ) + { + std::shared_ptr timerActor = std::shared_ptr(new TimerActor()); + actor = timerActor; + dialog = new ActorSettingsDialog(timerActor, this); + } + else if(ui->comboBox->currentText() == "Regulator") + { + std::shared_ptr regulator = std::shared_ptr(new Regulator()); + actor = regulator; + dialog = new ActorSettingsDialog(regulator, this); + } - else if(ui->comboBox->currentText() == "Polynomal") - { - std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor()); - actor = polynomalActor; - dialog = new ActorSettingsDialog(polynomalActor, this); - } + else if(ui->comboBox->currentText() == "Polynomal") + { + std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor()); + actor = polynomalActor; + dialog = new ActorSettingsDialog(polynomalActor, this); + } - if(dialog != nullptr) - { - dialog->setParent(this); - dialog->show(); - if(dialog->exec() == QDialog::Accepted) - { - actor_->setFactorActor(actor); - ui->label_FactorActor->setText(actor->getName()); - } - delete dialog; - } + if(dialog != nullptr) + { + dialog->setParent(this); + dialog->show(); + if(dialog->exec() == QDialog::Accepted) + { + actor_->setFactorActor(actor); + ui->label_FactorActor->setText(actor->getName()); + } + delete dialog; + } } void FactorActorWidget::setDirection(const QString& type) { - if(type == "True") actor_->setFactorDirection(true); - else actor_->setFactorDirection(false); + if(type == "True") actor_->setFactorDirection(true); + else actor_->setFactorDirection(false); } void FactorActorWidget::setPreCancleTime(int time) { - actor_->setPreCancleTime(time); + actor_->setPreCancleTime(time); } diff --git a/src/ui/actorwidgets/factoractorwidget.h b/src/ui/actorwidgets/factoractorwidget.h index 37717b2..c5bf083 100644 --- a/src/ui/actorwidgets/factoractorwidget.h +++ b/src/ui/actorwidgets/factoractorwidget.h @@ -4,28 +4,27 @@ #include #include "../../actors/factoractor.h" -namespace Ui -{ +namespace Ui { class FactorActorWidget; } class FactorActorWidget : public QWidget { - Q_OBJECT + Q_OBJECT - std::shared_ptr actor_; + std::shared_ptr actor_; public: - explicit FactorActorWidget(std::shared_ptr actor, QWidget *parent = nullptr); - ~FactorActorWidget(); + explicit FactorActorWidget(std::shared_ptr actor, QWidget *parent = nullptr); + ~FactorActorWidget(); private slots: - void createFactorActor(); - void setDirection(const QString& direction); - void setPreCancleTime(int time); + void createFactorActor(); + void setDirection(const QString& direction); + void setPreCancleTime(int time); private: - Ui::FactorActorWidget *ui; + Ui::FactorActorWidget *ui; }; #endif // FACTORACTORWIDGET_H diff --git a/src/ui/actorwidgets/polynomalactorwidget.cpp b/src/ui/actorwidgets/polynomalactorwidget.cpp index 930a3f8..9b04057 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.cpp +++ b/src/ui/actorwidgets/polynomalactorwidget.cpp @@ -1,50 +1,48 @@ #include "polynomalactorwidget.h" #include "ui_polynomalactorwidget.h" -PolynomalActorWidget::PolynomalActorWidget(std::shared_ptr actor, SensorStore* sensors, - QWidget *parent): - QWidget(parent), - sensors_(sensors), - actor_(actor), - ui(new Ui::PolynomalActorWidget) +PolynomalActorWidget::PolynomalActorWidget(std::shared_ptr actor, SensorStore* sensors, QWidget *parent): + QWidget(parent), + sensors_(sensors), + actor_(actor), + ui(new Ui::PolynomalActorWidget) { - ui->setupUi(this); - if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors())); - else - { - ui->listView->hide(); - ui->label->hide(); - } + ui->setupUi(this); + if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors())); + else + { + ui->listView->hide(); + ui->label->hide(); + } - double pow3, pow2, pow1, pow0; + double pow3, pow2, pow1, pow0; - actor_->getCoeffiancts(pow3, pow2, pow1, pow0); + actor_->getCoeffiancts(pow3, pow2, pow1, pow0); - ui->doubleSpinBox_pow0->setValue(pow0); - ui->doubleSpinBox_pow1->setValue(pow1); - ui->doubleSpinBox_pow2->setValue(pow2); - ui->doubleSpinBox_pow3->setValue(pow3); + ui->doubleSpinBox_pow0->setValue(pow0); + ui->doubleSpinBox_pow1->setValue(pow1); + ui->doubleSpinBox_pow2->setValue(pow2); + ui->doubleSpinBox_pow3->setValue(pow3); - connect(ui->doubleSpinBox_pow3, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); - connect(ui->doubleSpinBox_pow2, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); - connect(ui->doubleSpinBox_pow1, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); - connect(ui->doubleSpinBox_pow0, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); - connect(ui->listView, &SensorListWidget::clicked, this, &PolynomalActorWidget::setSensor); + connect(ui->doubleSpinBox_pow3, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); + connect(ui->doubleSpinBox_pow2, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); + connect(ui->doubleSpinBox_pow1, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); + connect(ui->doubleSpinBox_pow0, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow); + connect(ui->listView, &SensorListWidget::clicked, this, &PolynomalActorWidget::setSensor); } PolynomalActorWidget::~PolynomalActorWidget() { - delete ui; + delete ui; } void PolynomalActorWidget::setPow() { - actor_->setCoeffiancts(ui->doubleSpinBox_pow3->value(), ui->doubleSpinBox_pow2->value(), - ui->doubleSpinBox_pow1->value(), ui->doubleSpinBox_pow0->value()); + actor_->setCoeffiancts(ui->doubleSpinBox_pow3->value(), ui->doubleSpinBox_pow2->value(), ui->doubleSpinBox_pow1->value(), ui->doubleSpinBox_pow0->value()); } void PolynomalActorWidget::setSensor(const QModelIndex &index) { - actor_->setSensor(ui->listView->getSensorForIndex(index)); + actor_->setSensor(sensors_->getSensors()->at(index.row())); } diff --git a/src/ui/actorwidgets/polynomalactorwidget.h b/src/ui/actorwidgets/polynomalactorwidget.h index 26c64b3..6b4b405 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.h +++ b/src/ui/actorwidgets/polynomalactorwidget.h @@ -4,29 +4,27 @@ #include #include "../../actors/polynomalactor.h" -namespace Ui -{ +namespace Ui { class PolynomalActorWidget; } class PolynomalActorWidget : public QWidget { - Q_OBJECT - SensorStore* sensors_; - std::shared_ptr actor_; + Q_OBJECT + SensorStore* sensors_; + std::shared_ptr actor_; public: - explicit PolynomalActorWidget(std::shared_ptr regulator, SensorStore* sensors = nullptr, - QWidget *parent = nullptr); - ~PolynomalActorWidget(); + explicit PolynomalActorWidget(std::shared_ptr regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr); + ~PolynomalActorWidget(); private slots: - void setPow(); - void setSensor(const QModelIndex &index); + void setPow(); + void setSensor(const QModelIndex &index); private: - Ui::PolynomalActorWidget *ui; + Ui::PolynomalActorWidget *ui; }; #endif // POLYNOMALACTORWIDGET_H diff --git a/src/ui/actorwidgets/polynomalactorwidget.ui b/src/ui/actorwidgets/polynomalactorwidget.ui index 39bf709..e1733df 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.ui +++ b/src/ui/actorwidgets/polynomalactorwidget.ui @@ -132,7 +132,7 @@ SensorListWidget QListView -
ui/sensorlistwidget.h
+
../src/ui/sensorlistwidget.h
diff --git a/src/ui/actorwidgets/regulatorwdiget.cpp b/src/ui/actorwidgets/regulatorwdiget.cpp index b005240..8eb6d4a 100644 --- a/src/ui/actorwidgets/regulatorwdiget.cpp +++ b/src/ui/actorwidgets/regulatorwdiget.cpp @@ -4,50 +4,45 @@ RegulatorWdiget::~RegulatorWdiget() { - delete ui; + delete ui; } RegulatorWdiget::RegulatorWdiget(std::shared_ptr regulator, SensorStore* sensors, QWidget *parent) : - QWidget(parent), - regulator_(regulator), - sensors_(sensors), - ui(new Ui::RegulatorWdiget) + QWidget(parent), + regulator_(regulator), + sensors_(sensors), + ui(new Ui::RegulatorWdiget) { - ui->setupUi(this); - if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors())); - else - { - ui->listView->hide(); - ui->label->hide(); - } - ui->doubleSpinBox_setPoint->setValue(regulator->getSetPoint()); - ui->doubleSpinBox_band->setValue(regulator->getBand()); - ui->spinBox_safe->setValue(regulator_->getSafeValue()); - ui->spinBox_timeout->setValue(regulator_->getTimeout()); + ui->setupUi(this); + if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors())); + else + { + ui->listView->hide(); + ui->label->hide(); + } + ui->doubleSpinBox_setPoint->setValue(regulator->getSetPoint()); + ui->doubleSpinBox_band->setValue(regulator->getBand()); - 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))); + 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))); } - void RegulatorWdiget::setPoint(double in) { - regulator_->setPoint(in); + regulator_->setPoint(in); } void RegulatorWdiget::setBand(double band) { - regulator_->setBand(band); + regulator_->setBand(band); } void RegulatorWdiget::setSensor(const QModelIndex &index) { - regulator_->setSensor(ui->listView->getSensorForIndex(index)); - setPoint(ui->listView->getSensorForIndex(index).field); - ui->doubleSpinBox_setPoint->setValue(ui->listView->getSensorForIndex(index).field); + regulator_->setSensor(sensors_->getSensors()->at(index.row())); + setPoint(sensors_->getSensors()->at(index.row()).field); + ui->doubleSpinBox_setPoint->setValue(sensors_->getSensors()->at(index.row()).field); } diff --git a/src/ui/actorwidgets/regulatorwdiget.h b/src/ui/actorwidgets/regulatorwdiget.h index 3c2b2d5..eebd764 100644 --- a/src/ui/actorwidgets/regulatorwdiget.h +++ b/src/ui/actorwidgets/regulatorwdiget.h @@ -4,31 +4,29 @@ #include #include "../../actors/regulator.h" -namespace Ui -{ +namespace Ui { class RegulatorWdiget; } class RegulatorWdiget : public QWidget { - Q_OBJECT + Q_OBJECT - std::shared_ptr regulator_; - SensorStore* sensors_; + std::shared_ptr regulator_; + SensorStore* sensors_; public: - explicit RegulatorWdiget(std::shared_ptr regulator, SensorStore* sensors = nullptr, - QWidget *parent = nullptr); - ~RegulatorWdiget(); + explicit RegulatorWdiget(std::shared_ptr regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr); + ~RegulatorWdiget(); private slots: - void setPoint(double in); - void setBand(double band); - void setSensor(const QModelIndex &index); + void setPoint(double in); + void setBand(double band); + void setSensor(const QModelIndex &index); private: - Ui::RegulatorWdiget *ui; + Ui::RegulatorWdiget *ui; }; #endif // REGULATORWDIGET_H diff --git a/src/ui/actorwidgets/regulatorwdiget.ui b/src/ui/actorwidgets/regulatorwdiget.ui index ee79da6..db159cf 100644 --- a/src/ui/actorwidgets/regulatorwdiget.ui +++ b/src/ui/actorwidgets/regulatorwdiget.ui @@ -38,8 +38,15 @@
- - + + + + + Set Point + + + + -9999.989999999999782 @@ -49,7 +56,7 @@ - + @@ -62,46 +69,9 @@ - - - - Timeout - - - - - - - Set Point - - - - + - - - - Safety Value - - - - - - - - - - s - - - 999999999 - - - 1800 - - - @@ -110,7 +80,7 @@ SensorListWidget QListView -
ui/sensorlistwidget.h
+
../src/ui/sensorlistwidget.h
diff --git a/src/ui/actorwidgets/sensoractorwidget.cpp b/src/ui/actorwidgets/sensoractorwidget.cpp index 2718b1b..87bc6f9 100644 --- a/src/ui/actorwidgets/sensoractorwidget.cpp +++ b/src/ui/actorwidgets/sensoractorwidget.cpp @@ -4,51 +4,49 @@ #include SensorActorWidget::SensorActorWidget(std::shared_ptr sensorActor, SensorStore* sensors, QWidget *parent) : - QWidget(parent), - sensorActor_(sensorActor), - sensors_(sensors), - ui(new Ui::SensorActorWidget) + QWidget(parent), + sensorActor_(sensorActor), + sensors_(sensors), + ui(new Ui::SensorActorWidget) { - ui->setupUi(this); - if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors())); - else - { - ui->listView->hide(); - ui->label->hide(); - } + ui->setupUi(this); + if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors())); + else + { + ui->listView->hide(); + 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()); + ui->doubleSpinBox_threshold->setValue(sensorActor_->getThreshold()); - connect(ui->listView, &SensorListWidget::clicked, this, &SensorActorWidget::setSensor); - connect(ui->doubleSpinBox_threshold, SIGNAL(valueChanged(double)), this, SLOT(setThreshold(double))); - connect(ui->comboBox_slope, SIGNAL(currentIndexChanged(int)), this, SLOT(setSlope(int))); + connect(ui->listView, &SensorListWidget::clicked, this, &SensorActorWidget::setSensor); + connect(ui->doubleSpinBox_threshold, SIGNAL(valueChanged(double)), this, SLOT(setThreshold(double))); + connect(ui->comboBox_slope, SIGNAL(currentIndexChanged(int)), this, SLOT(setSlope(int))); } SensorActorWidget::~SensorActorWidget() { - delete ui; + delete ui; } void SensorActorWidget::setThreshold(double in) { - sensorActor_->setThreshold(in); + sensorActor_->setThreshold(in); } void SensorActorWidget::setSlope(int index) { - if(index == 0) sensorActor_->setSloap(SensorActor::SLOPE_UP); - else if(index == 1) sensorActor_->setSloap(SensorActor::SLOPE_DOWN); - else if(index == 2) sensorActor_->setSloap(SensorActor::SLOPE_BOTH); + if(index == 0) sensorActor_->setSloap(SensorActor::SLOPE_UP); + else if(index == 1) sensorActor_->setSloap(SensorActor::SLOPE_DOWN); + else if(index == 2) sensorActor_->setSloap(SensorActor::SLOPE_BOTH); } void SensorActorWidget::setSensor(const QModelIndex &index) { - sensorActor_->setSensor(ui->listView->getSensorForIndex(index)); + sensorActor_->setSensor(sensors_->getSensors()->at(index.row())); + qDebug()<<"Selected "<getSensors()->at(index.row()).name; } diff --git a/src/ui/actorwidgets/sensoractorwidget.h b/src/ui/actorwidgets/sensoractorwidget.h index 3501977..bb0915b 100644 --- a/src/ui/actorwidgets/sensoractorwidget.h +++ b/src/ui/actorwidgets/sensoractorwidget.h @@ -5,31 +5,29 @@ #include #include "../../actors/sensoractor.h" -namespace Ui -{ +namespace Ui { class SensorActorWidget; } class SensorActorWidget : public QWidget { - Q_OBJECT + Q_OBJECT - std::shared_ptr sensorActor_; - SensorStore* sensors_; + std::shared_ptr sensorActor_; + SensorStore* sensors_; public: - explicit SensorActorWidget(std::shared_ptr sensorActor, SensorStore* sensors = nullptr, - QWidget *parent = nullptr); - ~SensorActorWidget(); + explicit SensorActorWidget(std::shared_ptr sensorActor, SensorStore* sensors = nullptr, QWidget *parent = nullptr); + ~SensorActorWidget(); private slots: - void setThreshold(double in); - void setSlope(int index); - void setSensor(const QModelIndex &index); + void setThreshold(double in); + void setSlope(int index); + void setSensor(const QModelIndex &index); private: - Ui::SensorActorWidget *ui; + Ui::SensorActorWidget *ui; }; #endif // SENSORACTORWIDGET_H diff --git a/src/ui/actorwidgets/sensoractorwidget.ui b/src/ui/actorwidgets/sensoractorwidget.ui index 5f49c96..8e9d967 100644 --- a/src/ui/actorwidgets/sensoractorwidget.ui +++ b/src/ui/actorwidgets/sensoractorwidget.ui @@ -89,7 +89,7 @@ SensorListWidget QListView -
ui/sensorlistwidget.h
+
../src/ui/sensorlistwidget.h
diff --git a/src/ui/actorwidgets/timeractorwidget.cpp b/src/ui/actorwidgets/timeractorwidget.cpp index ddd02c7..f1f6bf7 100644 --- a/src/ui/actorwidgets/timeractorwidget.cpp +++ b/src/ui/actorwidgets/timeractorwidget.cpp @@ -4,17 +4,17 @@ #include TimerActorWidget::TimerActorWidget(std::shared_ptr actor, QWidget *parent) : - QWidget(parent), - ui(new Ui::TimerActorWidget) + QWidget(parent), + ui(new Ui::TimerActorWidget) { - ui->setupUi(this); + ui->setupUi(this); - ui->spinBox->setValue(actor->getTimeout()); + ui->spinBox->setValue(actor->getTimeout()); - connect(ui->spinBox, SIGNAL(valueChanged(int)), actor.get(), SLOT(setTimeout(int))); + connect(ui->spinBox, SIGNAL(valueChanged(int)), actor.get(), SLOT(setTimeout(int))); } TimerActorWidget::~TimerActorWidget() { - delete ui; + delete ui; } diff --git a/src/ui/actorwidgets/timeractorwidget.h b/src/ui/actorwidgets/timeractorwidget.h index 3b94428..4a88cb6 100644 --- a/src/ui/actorwidgets/timeractorwidget.h +++ b/src/ui/actorwidgets/timeractorwidget.h @@ -4,21 +4,20 @@ #include #include "../../actors/timeractor.h" -namespace Ui -{ +namespace Ui { class TimerActorWidget; } class TimerActorWidget : public QWidget { - Q_OBJECT + Q_OBJECT public: - explicit TimerActorWidget(std::shared_ptr actor, QWidget *parent = nullptr); - ~TimerActorWidget(); + explicit TimerActorWidget(std::shared_ptr actor, QWidget *parent = nullptr); + ~TimerActorWidget(); private: - Ui::TimerActorWidget *ui; + Ui::TimerActorWidget *ui; }; #endif // TIMERACTORWIDGET_H diff --git a/src/ui/itemcreationdialog.cpp b/src/ui/itemcreationdialog.cpp index 57e804f..bd225c6 100644 --- a/src/ui/itemcreationdialog.cpp +++ b/src/ui/itemcreationdialog.cpp @@ -5,49 +5,49 @@ #include "itemsettingswidgets/systemitemsettingswidget.h" ItemCreationDialog::ItemCreationDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ItemCreationDialog) + QDialog(parent), + ui(new Ui::ItemCreationDialog) { - ui->setupUi(this); - std::shared_ptr messageItem(new MessageItem); - item = messageItem; - widget = new MessageItemSettingsWidget(messageItem, this); - ui->verticalLayout->addWidget(widget); - connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ItemCreationDialog::itemTypeChanged); - connect(ui->lineEdit, &QLineEdit::textChanged, this, &ItemCreationDialog::itemNameChanged); + ui->setupUi(this); + std::shared_ptr messageItem(new MessageItem); + item = messageItem; + widget = new MessageItemSettingsWidget(messageItem, this); + ui->verticalLayout->addWidget(widget); + connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ItemCreationDialog::itemTypeChanged); + connect(ui->lineEdit, &QLineEdit::textChanged, this, &ItemCreationDialog::itemNameChanged); } ItemCreationDialog::~ItemCreationDialog() { - delete ui; - delete widget; + delete ui; + delete widget; } void ItemCreationDialog::itemTypeChanged(const QString& type) { - ui->verticalLayout->removeWidget(widget); - delete widget; - if(type == "Message") - { - std::shared_ptr messageItem(new MessageItem); - item = messageItem; - widget = new MessageItemSettingsWidget(messageItem, this); - ui->verticalLayout->addWidget(widget); - } - if(type == "System") - { - std::shared_ptr systemItem(new SystemItem); - item = systemItem; - widget = new SystemItemSettingsWidget(systemItem, this); - ui->verticalLayout->addWidget(widget); - } + ui->verticalLayout->removeWidget(widget); + delete widget; + if(type == "Message") + { + std::shared_ptr messageItem(new MessageItem); + item = messageItem; + widget = new MessageItemSettingsWidget(messageItem, this); + ui->verticalLayout->addWidget(widget); + } + if(type == "System") + { + std::shared_ptr systemItem(new SystemItem); + item = systemItem; + widget = new SystemItemSettingsWidget(systemItem, this); + ui->verticalLayout->addWidget(widget); + } } void ItemCreationDialog::itemNameChanged(const QString& name) { - if(item) - { - item->setName(name); - } + if(item) + { + item->setName(name); + } } diff --git a/src/ui/itemcreationdialog.h b/src/ui/itemcreationdialog.h index 6e993d3..57421ae 100644 --- a/src/ui/itemcreationdialog.h +++ b/src/ui/itemcreationdialog.h @@ -5,30 +5,29 @@ #include #include "../items/item.h" -namespace Ui -{ +namespace Ui { class ItemCreationDialog; } class ItemCreationDialog : public QDialog { - Q_OBJECT + Q_OBJECT - QWidget* widget; + QWidget* widget; public: - explicit ItemCreationDialog(QWidget *parent = nullptr); - ~ItemCreationDialog(); + explicit ItemCreationDialog(QWidget *parent = nullptr); + ~ItemCreationDialog(); - std::shared_ptr item; + std::shared_ptr item; private slots: - void itemTypeChanged(const QString& type); - void itemNameChanged(const QString& name); + void itemTypeChanged(const QString& type); + void itemNameChanged(const QString& name); private: - Ui::ItemCreationDialog *ui; + Ui::ItemCreationDialog *ui; }; #endif // ITEMCREATIONDIALOG_H diff --git a/src/ui/itemscrollbox.cpp b/src/ui/itemscrollbox.cpp index 170a557..5a12edd 100644 --- a/src/ui/itemscrollbox.cpp +++ b/src/ui/itemscrollbox.cpp @@ -4,43 +4,52 @@ #include "../items/messageitem.h" ItemScrollBox::ItemScrollBox(QWidget *parent) : - QWidget(parent), - ui(new Ui::RelayScrollBox) + QWidget(parent), + ui(new Ui::RelayScrollBox) { - ui->setupUi(this); - QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture); - QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture); + ui->setupUi(this); + QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture); + QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture); } ItemScrollBox::~ItemScrollBox() { - delete ui; + delete ui; } void ItemScrollBox::addItem(std::weak_ptr item) { - if(auto workItem = item.lock()) - { - if(workItem->isHidden()) - return; - widgets_.push_back(new ItemWidget(item)); - ui->relayWidgetVbox->addWidget(widgets_.back()); - connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest); - connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::removeItem); - } + if(auto workItem = item.lock()) + { + if(dynamic_cast(workItem.get())) + { + widgets_.push_back(new ItemWidget(item, true)); + } + else if(dynamic_cast(workItem.get())) + { + widgets_.push_back(new ItemWidget(item, false, true)); + } + else + { + widgets_.push_back(new ItemWidget(item)); + } + ui->relayWidgetVbox->addWidget(widgets_.back()); + connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest); + connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::removeItem); + } } void ItemScrollBox::removeItem(const ItemData& item) { - for(unsigned i = 0; i < widgets_.size(); i++) - { - if(widgets_[i]->controles(item)) - { - ui->relayWidgetVbox->removeWidget(widgets_[i]); - delete widgets_[i]; - widgets_.erase(widgets_.begin()+i); - } - } + for(unsigned i = 0; i < widgets_.size(); i++) + { + if(widgets_[i]->controles(item)) + { + ui->relayWidgetVbox->removeWidget(widgets_[i]); + delete widgets_[i]; + widgets_.erase(widgets_.begin()+i); + } + } } diff --git a/src/ui/itemscrollbox.h b/src/ui/itemscrollbox.h index 54d5fe8..18f0dff 100644 --- a/src/ui/itemscrollbox.h +++ b/src/ui/itemscrollbox.h @@ -11,34 +11,33 @@ #include "../items/itemstore.h" -namespace Ui -{ +namespace Ui { class RelayScrollBox; } class ItemScrollBox : public QWidget { - Q_OBJECT + Q_OBJECT private: - std::vector< ItemWidget* > widgets_; + std::vector< ItemWidget* > widgets_; signals: - void deleteRequest(const ItemData& item); + void deleteRequest(const ItemData& item); public: - explicit ItemScrollBox(QWidget *parent = nullptr); - ~ItemScrollBox(); + explicit ItemScrollBox(QWidget *parent = nullptr); + ~ItemScrollBox(); - void setItemStore(ItemStore* itemStore); + void setItemStore(ItemStore* itemStore); public slots: - void addItem(std::weak_ptr item); - void removeItem(const ItemData& item); + void addItem(std::weak_ptr item); + void removeItem(const ItemData& item); private: - Ui::RelayScrollBox *ui; + Ui::RelayScrollBox *ui; }; #endif // RELAYSCROLLBOX_H diff --git a/src/ui/itemsettingsdialog.cpp b/src/ui/itemsettingsdialog.cpp index 08417d3..e23d051 100644 --- a/src/ui/itemsettingsdialog.cpp +++ b/src/ui/itemsettingsdialog.cpp @@ -1,4 +1,4 @@ -#include "itemsettingsdialog.h" + #include "itemsettingsdialog.h" #include "ui_itemsettingsdialog.h" #include "actorsettingsdialog.h" #include "../actors/alarmtime.h" @@ -8,180 +8,180 @@ #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 "./itemsettingswidgets/messageitemsettingswidget.h" +#include "./itemsettingswidgets/systemitemsettingswidget.h" +#include "./itemsettingswidgets/relayitemsettingswidget.h" #include ItemSettingsDialog::ItemSettingsDialog(std::shared_ptr item, QWidget *parent) : - QDialog(parent), - item_(item), - ui(new Ui::ItemSettingsDialog) + QDialog(parent), + item_(item), + ui(new Ui::ItemSettingsDialog) { - ui->setupUi(this); + ui->setupUi(this); - setModal(false); + setModal(false); - ui->label_name->setText(item_->getName()); - ui->checkBox_Override->setChecked(item_->getOverride()); + ui->label_name->setText(item_->getName()); + ui->checkBox_Override->setChecked(item_->getOverride()); - if(std::shared_ptr relay = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new RelayItemSettingsWidget(relay); - } - else if(std::shared_ptr msgItem = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem); - } - else if(std::shared_ptr sysItem = std::dynamic_pointer_cast(item_)) - { - itemSpecificWidget_ = new SystemItemSettingsWidget(sysItem); - } + if(std::shared_ptr relay = std::dynamic_pointer_cast(item_)) + { + itemSpecificWidget_ = new RelayItemSettingsWidget(relay); + } + else if(std::shared_ptr msgItem = std::dynamic_pointer_cast(item_)) + { + 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_); - } + 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); + 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")); - ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Enabled")); - ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - ui->tableWidget->horizontalHeader()->resizeSection(1, 60); - ui->tableWidget->horizontalHeader()->resizeSection(2, 75); - loadActorList(); + ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Actor")); + ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Action")); + ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Enabled")); + ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); + ui->tableWidget->horizontalHeader()->resizeSection(1, 60); + ui->tableWidget->horizontalHeader()->resizeSection(2, 75); + loadActorList(); } ItemSettingsDialog::~ItemSettingsDialog() { - if(itemSpecificWidget_) delete itemSpecificWidget_; - delete ui; + if(itemSpecificWidget_) delete itemSpecificWidget_; + delete ui; } void ItemSettingsDialog::changeOverride() { - item_->setOverride(ui->checkBox_Override->isChecked()); + item_->setOverride(ui->checkBox_Override->isChecked()); } void ItemSettingsDialog::loadActorList() { - //ui->listWidget->clear(); - ui->tableWidget->setRowCount(item_->getActors().size()); + //ui->listWidget->clear(); + ui->tableWidget->setRowCount(item_->getActors().size()); - for(unsigned i = 0; i < item_->getActors().size(); i++) - { - ui->tableWidget->setItem(i, 0, new QTableWidgetItem(item_->getActors()[i]->getName())); - ui->tableWidget->setItem(i, 1, new QTableWidgetItem(item_->getActors()[i]->actionName())); - ui->tableWidget->setItem(i, 2, new QTableWidgetItem(item_->getActors()[i]->isActive() ? "Y" : "N")); - } + for(unsigned i = 0; i < item_->getActors().size(); i++) + { + ui->tableWidget->setItem(i, 0, new QTableWidgetItem(item_->getActors()[i]->getName())); + ui->tableWidget->setItem(i, 1, new QTableWidgetItem(item_->getActors()[i]->actionName())); + ui->tableWidget->setItem(i, 2, new QTableWidgetItem(item_->getActors()[i]->isActive() ? "Y" : "N")); + } } void ItemSettingsDialog::addActor() { - ActorSettingsDialog* dialog = nullptr; - std::shared_ptr actor = nullptr; + ActorSettingsDialog* dialog = nullptr; + std::shared_ptr actor = nullptr; - if(ui->comboBox->currentText() == "Alarm") - { - std::shared_ptr alarm = std::shared_ptr(new AlarmTime); - actor = alarm; - dialog = new ActorSettingsDialog(alarm, this); - } - else if(ui->comboBox->currentText() == "Sensor") - { - std::shared_ptr sensorActor = std::shared_ptr(new SensorActor); - actor = sensorActor; - dialog = new ActorSettingsDialog(sensorActor, this); - } - else if(ui->comboBox->currentText() == "Timer" ) - { - std::shared_ptr timerActor = std::shared_ptr(new TimerActor); - actor = timerActor; - dialog = new ActorSettingsDialog(timerActor, this); - } - else if(ui->comboBox->currentText() == "Regulator") - { - std::shared_ptr regulator = std::shared_ptr(new Regulator); - actor = regulator; - dialog = new ActorSettingsDialog(regulator, this); - } + if(ui->comboBox->currentText() == "Alarm") + { + std::shared_ptr alarm = std::shared_ptr(new AlarmTime); + actor = alarm; + dialog = new ActorSettingsDialog(alarm, this); + } + else if(ui->comboBox->currentText() == "Sensor") + { + std::shared_ptr sensorActor = std::shared_ptr(new SensorActor); + actor = sensorActor; + dialog = new ActorSettingsDialog(sensorActor, this); + } + else if(ui->comboBox->currentText() == "Timer" ) + { + std::shared_ptr timerActor = std::shared_ptr(new TimerActor); + actor = timerActor; + dialog = new ActorSettingsDialog(timerActor, this); + } + else if(ui->comboBox->currentText() == "Regulator") + { + std::shared_ptr regulator = std::shared_ptr(new Regulator); + actor = regulator; + dialog = new ActorSettingsDialog(regulator, this); + } - else if(ui->comboBox->currentText() == "Polynomal") - { - std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor); - actor = polynomalActor; - dialog = new ActorSettingsDialog(polynomalActor, this); - } + else if(ui->comboBox->currentText() == "Polynomal") + { + std::shared_ptr polynomalActor = std::shared_ptr(new PolynomalActor); + actor = polynomalActor; + dialog = new ActorSettingsDialog(polynomalActor, this); + } - else if(ui->comboBox->currentText() == "Multi Factor") - { - std::shared_ptr polynomalActor = std::shared_ptr(new MultiFactorActor); - actor = polynomalActor; - dialog = new ActorSettingsDialog(polynomalActor, this); - } + else if(ui->comboBox->currentText() == "Multi Factor") + { + std::shared_ptr polynomalActor = std::shared_ptr(new MultiFactorActor); + actor = polynomalActor; + dialog = new ActorSettingsDialog(polynomalActor, this); + } - if(dialog != nullptr) - { - dialog->setParent(this); - dialog->show(); - if(dialog->exec() == QDialog::Accepted) - { - item_->addActor(actor); - loadActorList(); - } - delete dialog; - } + if(dialog != nullptr) + { + dialog->setParent(this); + dialog->show(); + if(dialog->exec() == QDialog::Accepted) + { + item_->addActor(actor); + loadActorList(); + } + delete dialog; + } } void ItemSettingsDialog::removeActor() { - if(item_->getActors().size() > static_cast(ui->tableWidget->currentRow())) - { - item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); - loadActorList(); - } + if(item_->getActors().size() > ui->tableWidget->currentRow()) + { + item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); + loadActorList(); + } } void ItemSettingsDialog::editActor() { - if(item_->getActors().size() > static_cast(ui->tableWidget->currentRow())) - { - std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; + if(item_->getActors().size() > ui->tableWidget->currentRow()) + { + std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; - 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); + 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; + ActorSettingsDialog* dialog; - if(alarmTime) dialog = new ActorSettingsDialog(alarmTime, this); - else if(regulator) dialog = new ActorSettingsDialog(regulator, this); - else if(sensorActor) dialog = new ActorSettingsDialog(sensorActor, this); - else if(timerActor) dialog = new ActorSettingsDialog(timerActor, this); - else if(polynomalActor) dialog = new ActorSettingsDialog(polynomalActor, this); - else if(factorActor) dialog = new ActorSettingsDialog(factorActor, this); - else dialog = new ActorSettingsDialog(actor, this); - dialog->setParent(this); - dialog->show(); - dialog->exec(); + if(alarmTime) dialog = new ActorSettingsDialog(alarmTime, this); + else if(regulator) dialog = new ActorSettingsDialog(regulator, this); + else if(sensorActor) dialog = new ActorSettingsDialog(sensorActor, this); + else if(timerActor) dialog = new ActorSettingsDialog(timerActor, this); + else if(polynomalActor) dialog = new ActorSettingsDialog(polynomalActor, this); + else if(factorActor) dialog = new ActorSettingsDialog(factorActor, this); + else dialog = new ActorSettingsDialog(actor, this); + dialog->setParent(this); + dialog->show(); + dialog->exec(); - for(int i = 0; i < ui->tableWidget->rowCount() && i < static_cast(item_->getActors().size()); ++i) - { - ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName()); - ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName()); - ui->tableWidget->item(i, 2)->setText(item_->getActors()[i]->isActive() ? "Y" : "N"); - } - } + for(int i = 0; i < ui->tableWidget->rowCount() && i < item_->getActors().size(); ++i) + { + ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName()); + ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName()); + ui->tableWidget->item(i, 2)->setText(item_->getActors()[i]->isActive() ? "Y" : "N"); + } + } } diff --git a/src/ui/itemsettingsdialog.h b/src/ui/itemsettingsdialog.h index dc2a5af..1a9fa34 100644 --- a/src/ui/itemsettingsdialog.h +++ b/src/ui/itemsettingsdialog.h @@ -6,33 +6,32 @@ #include #include "../items/relay.h" -namespace Ui -{ +namespace Ui { class ItemSettingsDialog; } class ItemSettingsDialog : public QDialog { - Q_OBJECT - std::shared_ptr item_; - QWidget* itemSpecificWidget_ = nullptr; + Q_OBJECT + std::shared_ptr item_; + QWidget* itemSpecificWidget_ = nullptr; private: - void loadActorList(); + void loadActorList(); public: - explicit ItemSettingsDialog(std::shared_ptr item, QWidget *parent = nullptr); - ~ItemSettingsDialog(); + explicit ItemSettingsDialog(std::shared_ptr item, QWidget *parent = nullptr); + ~ItemSettingsDialog(); private slots: - void removeActor(); - void addActor(); - void editActor(); - void changeOverride(); + void removeActor(); + void addActor(); + void editActor(); + void changeOverride(); private: - Ui::ItemSettingsDialog *ui; + Ui::ItemSettingsDialog *ui; }; #endif // RELAYSETTINGSDIALOG_H diff --git a/src/ui/itemsettingsdialog.ui b/src/ui/itemsettingsdialog.ui index 7faeede..871bb9f 100644 --- a/src/ui/itemsettingsdialog.ui +++ b/src/ui/itemsettingsdialog.ui @@ -115,7 +115,7 @@ 3 - true + false 32 diff --git a/src/ui/itemsettingswidgets/messageitemsettingswidget.cpp b/src/ui/itemsettingswidgets/messageitemsettingswidget.cpp deleted file mode 100644 index 02afb64..0000000 --- a/src/ui/itemsettingswidgets/messageitemsettingswidget.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "messageitemsettingswidget.h" -#include "ui_messageitemsettingswidget.h" - -#include -#include - -MessageItemSettingsWidget::MessageItemSettingsWidget(std::weak_ptr item, QWidget *parent) : - QWidget(parent), - item_(item), - ui(new Ui::MessageItemSettingsWidget) -{ - ui->setupUi(this); - qDebug()<<"test"; - if(auto workingItem = item_.lock()) - { - ui->lineEdit->setText(workingItem->getMessage()); - ui->lineEdit_alert->setText(workingItem->getAlert()); - } - - connect(ui->lineEdit, &QLineEdit::textChanged, this, &MessageItemSettingsWidget::setText); - connect(ui->lineEdit_alert, &QLineEdit::textChanged, this, &MessageItemSettingsWidget::setAlert); - connect(ui->pushButton, &QPushButton::pressed, [this]() - { - ui->lineEdit_alert->setText(QFileDialog::getOpenFileName(this, "Choose File")); - }); -} - - -void MessageItemSettingsWidget::setText(const QString& text) -{ - if(auto workingItem = item_.lock()) - { - workingItem->setMessage(text); - } -} - -void MessageItemSettingsWidget::setAlert(const QString &in) -{ - if(auto workingItem = item_.lock()) - { - workingItem->setAlert(in); - } -} - -MessageItemSettingsWidget::~MessageItemSettingsWidget() -{ - delete ui; -} diff --git a/src/ui/itemsettingswidgets/messageitemsettingswidget.h b/src/ui/itemsettingswidgets/messageitemsettingswidget.h deleted file mode 100644 index f7a76c8..0000000 --- a/src/ui/itemsettingswidgets/messageitemsettingswidget.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef MESSAGEITEMSETTINGSWIDGET_H -#define MESSAGEITEMSETTINGSWIDGET_H - -#include -#include -#include "../../items/messageitem.h" - -namespace Ui -{ -class MessageItemSettingsWidget; -} - -class MessageItemSettingsWidget : public QWidget -{ - Q_OBJECT - std::weak_ptr item_; - -private slots: - - void setText(const QString& text); - void setAlert(const QString &in); - -public: - explicit MessageItemSettingsWidget(std::weak_ptr item, QWidget *parent = nullptr); - ~MessageItemSettingsWidget(); - -private: - Ui::MessageItemSettingsWidget *ui; -}; - -#endif // MESSAGEITEMSETTINGSWIDGET_H diff --git a/src/ui/itemsettingswidgets/messageitemsettingswidget.ui b/src/ui/itemsettingswidgets/messageitemsettingswidget.ui deleted file mode 100644 index 7a71800..0000000 --- a/src/ui/itemsettingswidgets/messageitemsettingswidget.ui +++ /dev/null @@ -1,59 +0,0 @@ - - - MessageItemSettingsWidget - - - - 0 - 0 - 400 - 124 - - - - Form - - - - - - 0 - - - - - Text: - - - - - - - - - - - - - - Alert: - - - - - - - - - - Browse - - - - - - - - - - diff --git a/src/ui/itemsettingswidgets/relayitemsettingswidget.cpp b/src/ui/itemsettingswidgets/relayitemsettingswidget.cpp index f9194cf..4c78913 100644 --- a/src/ui/itemsettingswidgets/relayitemsettingswidget.cpp +++ b/src/ui/itemsettingswidgets/relayitemsettingswidget.cpp @@ -3,19 +3,19 @@ RelayItemSettingsWidget::RelayItemSettingsWidget(std::weak_ptr relay, QWidget *parent) : - QWidget(parent), - ui(new Ui::RelayItemSettingsWidget) + 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)); - } + 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; + delete ui; } diff --git a/src/ui/itemsettingswidgets/relayitemsettingswidget.h b/src/ui/itemsettingswidgets/relayitemsettingswidget.h index 39cb2e5..400f21a 100644 --- a/src/ui/itemsettingswidgets/relayitemsettingswidget.h +++ b/src/ui/itemsettingswidgets/relayitemsettingswidget.h @@ -5,21 +5,20 @@ #include #include "../../items/relay.h" -namespace Ui -{ +namespace Ui { class RelayItemSettingsWidget; } class RelayItemSettingsWidget : public QWidget { - Q_OBJECT + Q_OBJECT public: - explicit RelayItemSettingsWidget(std::weak_ptr relay, QWidget *parent = nullptr); - ~RelayItemSettingsWidget(); + explicit RelayItemSettingsWidget(std::weak_ptr relay, QWidget *parent = nullptr); + ~RelayItemSettingsWidget(); private: - Ui::RelayItemSettingsWidget *ui; + Ui::RelayItemSettingsWidget *ui; }; #endif // RELAYITEMSETTINGSWIDGET_H diff --git a/src/ui/itemsettingswidgets/systemitemsettingswidget.cpp b/src/ui/itemsettingswidgets/systemitemsettingswidget.cpp index 643e3e6..49d476f 100644 --- a/src/ui/itemsettingswidgets/systemitemsettingswidget.cpp +++ b/src/ui/itemsettingswidgets/systemitemsettingswidget.cpp @@ -2,39 +2,39 @@ #include "ui_systemitemsettingswidget.h" SystemItemSettingsWidget::SystemItemSettingsWidget(std::weak_ptr item, QWidget *parent) : - QWidget(parent), - item_(item), - ui(new Ui::SystemItemSettingsWidget) + 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); + 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); + 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); - } + if(auto itemPtr = item_.lock()) + { + itemPtr->setOnCommand(in); + } } void SystemItemSettingsWidget::setOff(const QString& in) { - if(auto itemPtr = item_.lock()) - { - itemPtr->setOffCommand(in); - } + if(auto itemPtr = item_.lock()) + { + itemPtr->setOffCommand(in); + } } SystemItemSettingsWidget::~SystemItemSettingsWidget() { - delete ui; + delete ui; } diff --git a/src/ui/itemsettingswidgets/systemitemsettingswidget.h b/src/ui/itemsettingswidgets/systemitemsettingswidget.h index 528f530..5b401f7 100644 --- a/src/ui/itemsettingswidgets/systemitemsettingswidget.h +++ b/src/ui/itemsettingswidgets/systemitemsettingswidget.h @@ -5,27 +5,26 @@ #include #include "../../items/systemitem.h" -namespace Ui -{ +namespace Ui { class SystemItemSettingsWidget; } class SystemItemSettingsWidget : public QWidget { - Q_OBJECT - std::weak_ptr item_; + Q_OBJECT + std::weak_ptr item_; private slots: - void setOn(const QString &in); - void setOff(const QString &in); + void setOn(const QString &in); + void setOff(const QString &in); public: - explicit SystemItemSettingsWidget(std::weak_ptr item, QWidget *parent = nullptr); - ~SystemItemSettingsWidget(); + explicit SystemItemSettingsWidget(std::weak_ptr item, QWidget *parent = nullptr); + ~SystemItemSettingsWidget(); private: - Ui::SystemItemSettingsWidget *ui; + Ui::SystemItemSettingsWidget *ui; }; #endif // SYSTEMITEMSETTINGSWIDGET_H diff --git a/src/ui/itemwidget.cpp b/src/ui/itemwidget.cpp index d073e50..a195e73 100644 --- a/src/ui/itemwidget.cpp +++ b/src/ui/itemwidget.cpp @@ -5,117 +5,106 @@ #include #include -ItemWidget::ItemWidget(std::weak_ptr item, QWidget *parent) : - QWidget(parent), - item_(item), - ui(new Ui::ItemWidget) +ItemWidget::ItemWidget(std::weak_ptr item, bool analog, bool nameOnly, QWidget *parent) : + QWidget(parent), + item_(item), + ui(new Ui::ItemWidget) { - ui->setupUi(this); + ui->setupUi(this); - if(auto workingItem = item_.lock()) - { - if(workingItem->getValueType() == ITEM_VALUE_UINT) - { - ui->horizontalSpacer->changeSize(0,0); - ui->checkBox->hide(); - } - else if(workingItem->getValueType() == ITEM_VALUE_NO_VALUE) - { - ui->checkBox->hide(); - ui->slider->hide(); - } - else - { - ui->slider->hide(); - } + if(analog) + { + ui->horizontalSpacer->changeSize(0,0); + ui->checkBox->hide(); + } + else if(nameOnly) + { + ui->checkBox->hide(); + ui->slider->hide(); + } + else ui->slider->hide(); - ui->checkBox->setChecked(workingItem->getValue()); + if(auto workingRelay = item_.lock()) + { + ui->checkBox->setChecked(workingRelay->getValue()); - ui->label->setText(workingItem->getName()); + ui->label->setText(workingRelay->getName()); - if(workingItem->getValueType() == ITEM_VALUE_UINT) - connect(ui->slider, &QSlider::valueChanged, this, &ItemWidget::moveToValue); - else - connect(ui->checkBox, &QCheckBox::toggled, this, &ItemWidget::moveToState); - connect(ui->pushButton, &QPushButton::clicked, this, &ItemWidget::showSettingsDialog); - connect(workingItem.get(), &Relay::valueChanged, this, &ItemWidget::stateChanged); - connect(ui->pushButton_Remove, &QPushButton::clicked, this, &ItemWidget::deleteItem); + if(analog)connect(ui->slider, &QSlider::valueChanged, this, &ItemWidget::moveToValue); + else connect(ui->checkBox, &QCheckBox::toggled, this, &ItemWidget::moveToState); + connect(ui->pushButton, &QPushButton::clicked, this, &ItemWidget::showSettingsDialog); + connect(workingRelay.get(), &Relay::valueChanged, this, &ItemWidget::stateChanged); + connect(ui->pushButton_Remove, &QPushButton::clicked, this, &ItemWidget::deleteItem); - } - else - { - disable(); - } + } + else disable(); } void ItemWidget::deleteItem() { - if(auto workingItem = item_.lock()) - { - deleteRequest(*workingItem); - } + if(auto workingItem = item_.lock()) + { + deleteRequest(*workingItem); + } } void ItemWidget::moveToValue(int value) { - if(auto workingItem = item_.lock()) - workingItem->setValue(value); - else - disable(); + if(auto workingItem = item_.lock()) workingItem->setValue(value); + else disable(); } void ItemWidget::moveToState(bool state) { - if(auto workingItem = item_.lock()) - workingItem->setValue(state); - else - disable(); + if(auto workingItem = item_.lock()) workingItem->setValue(state); + else disable(); } void ItemWidget::disable() { - ui->checkBox->setEnabled(false); - ui->label->setEnabled(false); - ui->slider->setEnabled(false); - ui->pushButton_Remove->setEnabled(false); + ui->checkBox->setEnabled(false); + ui->label->setEnabled(false); + ui->slider->setEnabled(false); + ui->pushButton_Remove->setEnabled(false); } bool ItemWidget::controles(const ItemData& relay) { - if(auto workingItem = item_.lock()) - { - if(relay == *workingItem) return true; - else return false; - } - return true; + if(auto workingRelay = item_.lock()) + { + if(relay == *workingRelay) return true; + else return false; + } + return true; } void ItemWidget::showSettingsDialog() { - if(auto workingItem = item_.lock()) - { - ItemSettingsDialog dialog(workingItem, this); - dialog.exec(); - } - else disable(); + if(auto workingRelay = item_.lock()) + { + ItemSettingsDialog dialog(workingRelay, this); + dialog.exec(); + } + else disable(); } std::weak_ptr ItemWidget::getItem() { - return item_; + return item_; } void ItemWidget::stateChanged(int state) { - ui->slider->blockSignals(true); - ui->slider->setValue(state); - ui->slider->blockSignals(false); - ui->checkBox->blockSignals(true); - ui->checkBox->setChecked(state); - ui->checkBox->blockSignals(false); + qDebug()<<"widget got state "<slider->blockSignals(true); + ui->slider->setValue(state); + ui->slider->blockSignals(false); + ui->checkBox->blockSignals(true); + ui->checkBox->setChecked(state); + ui->checkBox->blockSignals(false); } ItemWidget::~ItemWidget() { - delete ui; + delete ui; } diff --git a/src/ui/itemwidget.h b/src/ui/itemwidget.h index 18d2861..fadb53e 100644 --- a/src/ui/itemwidget.h +++ b/src/ui/itemwidget.h @@ -6,41 +6,40 @@ #include "itemsettingsdialog.h" #include "../items/item.h" -namespace Ui -{ +namespace Ui { class ItemWidget; } class ItemWidget : public QWidget { - Q_OBJECT + Q_OBJECT private: - std::weak_ptr item_; + std::weak_ptr item_; - void disable(); + void disable(); signals: - void deleteRequest(const ItemData& item); + void deleteRequest(const ItemData& item); private slots: - void showSettingsDialog(); - void moveToState(bool state); - void moveToValue(int value); - void deleteItem(); + void showSettingsDialog(); + void moveToState(bool state); + void moveToValue(int value); + void deleteItem(); public: - explicit ItemWidget(std::weak_ptr item, QWidget *parent = nullptr); - std::weak_ptr getItem(); - bool controles(const ItemData& relay); - ~ItemWidget(); + explicit ItemWidget(std::weak_ptr item, bool analog = false, bool nameOnly = false, QWidget *parent = nullptr); + std::weak_ptr getItem(); + bool controles(const ItemData& relay); + ~ItemWidget(); public slots: - void stateChanged(int state); + void stateChanged(int state); private: - Ui::ItemWidget *ui; + Ui::ItemWidget *ui; }; #endif // RELAYWIDGET_H diff --git a/src/ui/itemwidget.ui b/src/ui/itemwidget.ui index 91d92f5..bdbc8a6 100644 --- a/src/ui/itemwidget.ui +++ b/src/ui/itemwidget.ui @@ -30,7 +30,7 @@ - Qt::Orientation::Horizontal + Qt::Horizontal @@ -46,10 +46,10 @@ 255 - false + true - Qt::Orientation::Horizontal + Qt::Horizontal diff --git a/src/ui/mainwindow-android.ui b/src/ui/mainwindow-android.ui index e7802b3..fa90bc9 100644 --- a/src/ui/mainwindow-android.ui +++ b/src/ui/mainwindow-android.ui @@ -245,13 +245,13 @@ ItemScrollBox QWidget -
../ui/itemscrollbox.h
+
../src/ui/itemscrollbox.h
1
SensorListWidget QListView -
../ui/sensorlistwidget.h
+
../src/ui/sensorlistwidget.h
diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 79a6b3e..5967c0b 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -1,93 +1,88 @@ #include "mainwindow.h" - -#include - #include "ui_mainwindow.h" #include "itemscrollbox.h" #include "itemsettingsdialog.h" #include "itemcreationdialog.h" -#include "mainobject.h" -#include "programmode.h" -#include "items/poweritem.h" +#include "../mainobject.h" MainWindow::MainWindow(MainObject * const mainObject, QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow), - colorChooser(this) + QMainWindow(parent), + ui(new Ui::MainWindow), + colorChooser(this), + _micro(&mainObject->micro), + _powerItem(mainObject->powerItem) { - ui->setupUi(this); - connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::sigSave); - connect(ui->pushButton_broadcast, &QPushButton::clicked, this, [this](){QMessageBox::information(this, "Saved", "Settings where saved");}); + ui->setupUi(this); - connect(ui->pushButton_power, SIGNAL(clicked()), this, SLOT(showPowerItemDialog())); + if(!mainObject->master) + connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::sigBrodcast); + else + connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::sigSave); - connect(ui->pushButton_refesh, &QPushButton::clicked, mainObject, &MainObject::refresh); - connect(&globalItems, &ItemStore::itemAdded, ui->relayList, &ItemScrollBox::addItem); - connect(&globalItems, &ItemStore::itemDeleted, ui->relayList, &ItemScrollBox::removeItem); + connect(ui->pushButton_power, SIGNAL(clicked()), this, SLOT(showPowerItemDialog())); - for(size_t i = 0; i < globalItems.getItems()->size(); ++i) - ui->relayList->addItem(globalItems.getItems()->at(i)); + //Relays + if(mainObject->master)connect(ui->pushButton_refesh, &QPushButton::clicked, _micro, &Microcontroller::requestState); + 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); - if(programMode != PROGRAM_MODE_PRIMARY) - ui->label_serialRecive->setHidden(true); + for(size_t i = 0; i < mainObject->items.getItems()->size(); ++i) + { + ui->relayList->addItem(mainObject->items.getItems()->at(i)); + } - //Sensors - ui->sensorListView->setShowHidden(false); - ui->sensorListView->sensorsChanged(*globalSensors.getSensors()); - connect(&globalSensors, &SensorStore::stateChenged, ui->sensorListView, &SensorListWidget::sensorsChanged); + //Sensors + ui->sensorListView->setShowHidden(false); + ui->sensorListView->sensorsChanged(*globalSensors.getSensors()); + connect(&globalSensors, &SensorStore::stateChenged, ui->sensorListView, &SensorListWidget::sensorsChanged); - //RGB Leds - connect(&colorChooser, &QColorDialog::colorSelected, this, &MainWindow::sigSetRgb); - connect(ui->button_quit, SIGNAL(clicked()), this, SLOT(close())); - connect(ui->button_color, SIGNAL(clicked()), &colorChooser, SLOT(show())); - if(programMode != PROGRAM_MODE_PRIMARY) - ui->button_color->hide(); + //RGB Leds + connect(&colorChooser, SIGNAL(colorSelected(const QColor)), this, SLOT(slotChangedRgb(const QColor))); + connect(ui->button_quit, SIGNAL(clicked()), this, SLOT(close())); + connect(ui->button_color, SIGNAL(clicked()), &colorChooser, SLOT(show())); - connect(ui->pushButton_addItem, &QPushButton::clicked, this, &MainWindow::showItemCreationDialog); - connect(ui->relayList, &ItemScrollBox::deleteRequest, &globalItems, &ItemStore::removeItem); - - ui->splitter->setStretchFactor(1, 1); + connect(ui->pushButton_addItem, &QPushButton::clicked, this, &MainWindow::showItemCreationDialog); + connect(ui->relayList, &ItemScrollBox::deleteRequest, &mainObject->items, &ItemStore::removeItem); } MainWindow::~MainWindow() { - delete ui; + delete ui; } void MainWindow::showPowerItemDialog() { - std::shared_ptr powerItem; - for(std::shared_ptr item : *globalItems.getItems()) - { - powerItem = std::dynamic_pointer_cast(item); - if(powerItem) - break; - } - if(powerItem) - { - ItemSettingsDialog diag(std::shared_ptr(powerItem), this); - diag.show(); - diag.exec(); - } - else - { - QMessageBox::warning(this, "Error", "No power item found, refresh first"); - } + ItemSettingsDialog diag(std::shared_ptr(_powerItem), this); + diag.show(); + diag.exec(); } + +void MainWindow::slotChangedRgb(const QColor color) +{ + _micro->changeRgbColor(color); +} + void MainWindow::showItemCreationDialog() { - ItemCreationDialog diag(this); - diag.show(); - if(diag.exec()) - createdItem(diag.item); + ItemCreationDialog diag(this); + diag.show(); + if(diag.exec()) + { + createdItem(diag.item); + } } void MainWindow::changeHeaderLableText(QString string) { - if(string.size() > 28) - { - string.remove(28, string.size()-(28)); - string.append("..."); - } - ui->label_serialRecive->setText(string); + if(string.size() > 28) + { + string.remove(28, string.size()-(28)); + string.append("..."); + } + ui->label_serialRecive->setText(string); } diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 5b04b64..e52f025 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -5,9 +5,14 @@ #include #include #include -#include +#include +#include "../actors/alarmtime.h" +#include "../microcontroller.h" +#include "../sensors/sensor.h" +#include "../items/itemstore.h" +#include "../items/poweritem.h" +#include "../broadcast.h" -#include class MainObject; @@ -18,32 +23,37 @@ class MainWindow; class MainWindow : public QMainWindow { - Q_OBJECT + Q_OBJECT public: - explicit MainWindow(MainObject * const mainObject, QWidget *parent = nullptr); - ~MainWindow(); + explicit MainWindow(MainObject * const mainObject, QWidget *parent = nullptr); + ~MainWindow(); private: - Ui::MainWindow *ui; + Ui::MainWindow *ui; - QColorDialog colorChooser; + QColorDialog colorChooser; + + Microcontroller *_micro; + + std::shared_ptr _powerItem; signals: + void sigBrodcast(); void sigSave(); - void createdItem(std::shared_ptr item); - void sigSetRgb(const QColor color); + void createdItem(std::shared_ptr item); private slots: - //RGB - void showPowerItemDialog(); - void showItemCreationDialog(); + //RGB + void slotChangedRgb(const QColor color); + void showPowerItemDialog(); + void showItemCreationDialog(); public slots: - void changeHeaderLableText(QString string); + void changeHeaderLableText(QString string); }; #endif // MAINWINDOW_H diff --git a/src/ui/mainwindow.ui b/src/ui/mainwindow.ui index 0e6732c..de1eca1 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -37,207 +37,181 @@ - Qt::LayoutDirection::LeftToRight + Qt::LeftToRight false - + - - - Qt::Orientation::Horizontal - - - false - - - + + + + + + 0 + 0 + + + + QFrame::Box + + + SHinterface + + + Qt::AutoText + + + + + + + Sensors + + + + 2 + + + 2 + + + + + QAbstractItemView::NoSelection + + + false + + + + + + + + + + 0 + - + - + 0 0 - - QFrame::Shape::Box + + + 0 + 0 + + + + + 16777215 + 48 + + + + + 0 + 128 + - SHinterface - - - Qt::TextFormat::AutoText + Color - - - Sensors + + + Config Shutdown - - - 2 - - - 2 - - - - - - 0 - 0 - - - - - 300 - 0 - - - - QAbstractItemView::SelectionMode::NoSelection - - - false - - - - - - - - 0 - - - - - - + + + + + + + + + + 0 + 0 + + + + Items + + + + 2 + + + 2 + + + + + + 0 + 0 + + + + + + + + + + + 0 + - + + + Refesh + + + + + + + Save + + + + + + + Add Item + + + + + - + 0 0 - - Items + + Qt::RightToLeft + + + Quit - - - 2 - - - 2 - - - - - - 0 - 0 - - - - - - - - - 0 - - - - - - - - - - - - Config Shutdown - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - 0 - 128 - - - - Color - - - - - - - Refesh - - - - - - - Save - - - - - - - Add Item - - - - - - - - 0 - 0 - - - - Qt::LayoutDirection::RightToLeft - - - Quit - - @@ -249,12 +223,12 @@ SensorListWidget QListView -
ui/sensorlistwidget.h
+
../src/ui/sensorlistwidget.h
ItemScrollBox QWidget -
ui/itemscrollbox.h
+
../src/ui/itemscrollbox.h
1
diff --git a/src/ui/sensorlistwidget.cpp b/src/ui/sensorlistwidget.cpp index 827ab2e..1f7a823 100644 --- a/src/ui/sensorlistwidget.cpp +++ b/src/ui/sensorlistwidget.cpp @@ -4,86 +4,69 @@ #include #include -SensorListWidget::SensorListWidget(const bool showHidden, QWidget *parent): QTableWidget(parent), - showHidden_(showHidden) +SensorListWidget::SensorListWidget(const bool showHidden, QWidget *parent): QTableWidget(parent), showHidden_(showHidden) { - setColumnCount(3); - setSelectionBehavior(QAbstractItemView::SelectRows); - horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture); - setAutoScroll(true); - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - sensorsChanged(std::vector()); - verticalHeader()->hide(); + 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")); } -SensorListWidget::SensorListWidget(SensorStore& sensorStore, const bool showHidden, - QWidget* parent): QTableWidget (parent), showHidden_(showHidden) +SensorListWidget::SensorListWidget(SensorStore& sensorStore, const bool showHidden, QWidget* parent): QTableWidget (parent), showHidden_(showHidden) { - sensorsChanged(*(sensorStore.getSensors())); + sensorsChanged(*(sensorStore.getSensors())); } void SensorListWidget::sensorsChanged(std::vector sensors) { - clear(); - setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor")); - setHorizontalHeaderItem(1, new QTableWidgetItem("Value")); - setHorizontalHeaderItem(2, new QTableWidgetItem("Time")); - size_t listLen = 0; - for(size_t i = 0; i < sensors.size(); ++i) - if(showHidden_ || !sensors[i].hidden) - ++listLen; - setRowCount(static_cast(listLen)); - size_t row = 0; - for(size_t i = 0; i < sensors.size(); ++i) - { - if(showHidden_ || !sensors[i].hidden) - { - QString itemString; - itemString.append(QString::number(sensors[i].field)); - itemString.append(' '); + clear(); + setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor")); + setHorizontalHeaderItem(1, new QTableWidgetItem("Value")); + size_t nonHiddenCount = sensors.size(); + if(!showHidden_) + { + nonHiddenCount = 0; + for(size_t i = 0; i < sensors.size(); ++i) + { + if(!sensors[i].hidden) nonHiddenCount++; + } + } + size_t listLen = 0; + for(size_t i = 0; i < sensors.size(); ++i) if(showHidden_ || !sensors[i].hidden) ++listLen; + setRowCount(static_cast(listLen)); + size_t row = 0; + for(size_t i = 0; i < sensors.size(); ++i) + { + if(showHidden_ || !sensors[i].hidden) + { + QString itemString; + itemString.append(QString::number(sensors[i].field)); + itemString.append(' '); - if(sensors[i].type == Sensor::TYPE_DOOR) - { - if(static_cast(sensors[i].field)) - itemString.append("\"Open\""); - else itemString.append("\"Closed\""); - } - else if(sensors[i].type == Sensor::TYPE_AUDIO_OUTPUT) - { - if(static_cast(sensors[i].field)) - itemString.append("\"Playing\""); - else itemString.append("\"Silent\""); - } + if(sensors[i].type == Sensor::TYPE_DOOR) + { + if(static_cast(sensors[i].field)) itemString.append("\"Open\""); + else itemString.append("\"Closed\""); + } + else if(sensors[i].type == Sensor::TYPE_AUDIO_OUTPUT) + { + if(static_cast(sensors[i].field)) itemString.append("\"Playing\""); + else itemString.append("\"Silent\""); + } - 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"))); - ++row; - } - } - sortItems(0, Qt::AscendingOrder); - resizeColumnsToContents(); -} - -const Sensor& SensorListWidget::getSensorForIndex(const QModelIndex &index) -{ - return static_cast(item(index.row(), 0))->getSensor(); + setItem(static_cast(row), 0, new QTableWidgetItem(sensors[i].name + (sensors[i].hidden ? "(H)" : ""))); + setItem(static_cast(row), 1, new QTableWidgetItem(itemString)); + ++row; + } + } } 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) -{ + showHidden_=showHidden; } diff --git a/src/ui/sensorlistwidget.h b/src/ui/sensorlistwidget.h index 4c84d54..9ace2b4 100644 --- a/src/ui/sensorlistwidget.h +++ b/src/ui/sensorlistwidget.h @@ -1,33 +1,23 @@ #pragma once #include #include -#include "sensors/sensor.h" - -class SensorListItem : public QTableWidgetItem -{ - Sensor sensor; - -public: - const Sensor& getSensor(); - SensorListItem(const QString& text, const Sensor& sensor); -}; +#include "../sensors/sensor.h" class SensorListWidget : public QTableWidget { - Q_OBJECT + Q_OBJECT - bool showHidden_; + bool showHidden_; public: - 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); + 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); public slots: - void sensorsChanged(std::vector sensors); + void sensorsChanged(std::vector sensors); };