diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..924e5f0 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,174 @@ +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 deleted file mode 100644 index 4ee98f9..0000000 --- a/SHinterface.pro +++ /dev/null @@ -1,156 +0,0 @@ -#------------------------------------------------- -# -# 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 deleted file mode 100644 index 72a0dd4..0000000 --- a/src/actor.cpp.autosave +++ /dev/null @@ -1,100 +0,0 @@ -#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 a20b5db..7b81bde 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 e4c7812..0f38f27 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); - run(); + connect(&timer, SIGNAL(timeout()), this, SLOT(doTick())); + timer.setInterval(1000); + AlarmTime::run(); } AlarmTime::~AlarmTime() { - makeInactive(); + AlarmTime::makeInactive(); } void AlarmTime::run() { - makeInactive(); + AlarmTime::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(); - } - bool 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(); + } + 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 8f27a64..104a2c4 100644 --- a/src/actors/factoractor.h +++ b/src/actors/factoractor.h @@ -8,37 +8,52 @@ 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 d9735c3..053dc30 100644 --- a/src/actors/polynomalactor.cpp +++ b/src/actors/polynomalactor.cpp @@ -12,72 +12,74 @@ 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 4dfbcd7..1ff3675 100644 --- a/src/actors/polynomalactor.h +++ b/src/actors/polynomalactor.h @@ -1,39 +1,42 @@ #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 9bb403a..b3ea5f6 100644 --- a/src/actors/regulator.cpp +++ b/src/actors/regulator.cpp @@ -4,82 +4,120 @@ 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_) - { - 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; - } + 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_); } 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; + invert_ = invert; +} + +void Regulator::setSafeValue(int value) +{ + safeValue_ = value; +} + +void Regulator::setTimeout(int value) +{ + timeout_ = value; + timer.start(timeout_*1000); } void Regulator::store(QJsonObject& json) { - json["Type"] = "Regulator"; - Actor::store(json); - json["Band"] = band_; - json["SetPoint"] = setPoint_; - json["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["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; } void Regulator::load(const QJsonObject& json, bool preserve) { - 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"); + Actor::load(json, preserve); + band_ = json["Band"].toDouble(1); + setPoint_ = json["SetPoint"].toDouble(22); + safeValue_ = json["SafeValue"].toDouble(0); + timeout_ = json["Timeout"].toDouble(1800); + sensor_.type = json["SensorType"].toInt(0); + sensor_.id = json["SensorId"].toInt(0); + sensor_.field = json["SensorField"].toInt(0); + sensor_.name = json["SensorName"].toString("Sensor"); + timer.start(timeout_*1000); } QString Regulator::getName() const { - if(name_.size() > 0) return name_; - 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 8c41e3c..339b2ca 100644 --- a/src/actors/regulator.h +++ b/src/actors/regulator.h @@ -1,38 +1,68 @@ #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; + Sensor sensor_; + float setPoint_ = 0; + float band_ = 1; + bool invert_ = false; + int timeout_ = 1800; + int safeValue_ = 0; + QTimer timer; - bool first = true; + bool first = true; + +private slots: + + void timeout(); 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 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; public: - 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); + 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); }; diff --git a/src/actors/sensoractor.cpp b/src/actors/sensoractor.cpp index 24ad66a..0be3ffa 100644 --- a/src/actors/sensoractor.cpp +++ b/src/actors/sensoractor.cpp @@ -14,74 +14,76 @@ 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 76241ab..27a9355 100644 --- a/src/actors/sensoractor.h +++ b/src/actors/sensoractor.h @@ -1,42 +1,45 @@ #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 setSloap(uint8_t sloap); - void setSensor(const Sensor sensor); - void setThreshold( float threshold ); + void sensorEvent(Sensor sensor); + + 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 98b1b51..a0a6b1e 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 973a8c5..36290d9 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 deleted file mode 100644 index f865f0d..0000000 --- a/src/alarmactions.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#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 deleted file mode 100644 index df4e11f..0000000 --- a/src/alarmactions.h +++ /dev/null @@ -1,25 +0,0 @@ -#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 018feaa..2529950 100644 --- a/src/apgetconnected.cpp +++ b/src/apgetconnected.cpp @@ -14,159 +14,163 @@ 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) { - printf("netlink error\n"); - *reinterpret_cast(arg) = 0; - return NL_STOP; + (void)nla; + (void)err; + printf("netlink error\n"); + *reinterpret_cast(arg) = 0; + return NL_STOP; } static int finishHandler(struct nl_msg *msg, void *arg) { - *reinterpret_cast(arg) = 0; - return NL_SKIP; + (void)msg; + *reinterpret_cast(arg) = 0; + return NL_SKIP; } static int ackHandler(struct nl_msg *msg, void *arg) { - *reinterpret_cast(arg) = 0; - return NL_STOP; + (void)msg; + *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 deleted file mode 100644 index 0ca90f1..0000000 --- a/src/broadcast.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#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 deleted file mode 100644 index c3e8577..0000000 --- a/src/broadcast.h +++ /dev/null @@ -1,55 +0,0 @@ -#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 deleted file mode 100644 index 7099575..0000000 --- a/src/iomuliplexer.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#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 deleted file mode 100644 index 8afb26d..0000000 --- a/src/iomuliplexer.h +++ /dev/null @@ -1,54 +0,0 @@ -#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 8f104c5..5bee87e 100644 --- a/src/items/auxitem.cpp +++ b/src/items/auxitem.cpp @@ -1,18 +1,19 @@ #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::setValue(uint8_t value) +void AuxItem::enactValue(uint8_t value) { - Item::setValue(value); - micro_->setAuxPwm(value); + assert(micro_); + 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 a1e6765..774d44e 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_; -public slots: - - virtual void setValue(uint8_t value); +protected: + virtual void enactValue(uint8_t value) override; public: - AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr); + AuxItem(Microcontroller* micro = nullptr, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", + uint8_t value = 0, QObject* parent = nullptr); - virtual void store(QJsonObject& json); + virtual void store(QJsonObject& json) override; }; diff --git a/src/items/fixeditemsource.cpp b/src/items/fixeditemsource.cpp new file mode 100644 index 0000000..d1abc21 --- /dev/null +++ b/src/items/fixeditemsource.cpp @@ -0,0 +1,14 @@ +#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 new file mode 100644 index 0000000..e535842 --- /dev/null +++ b/src/items/fixeditemsource.h @@ -0,0 +1,22 @@ +#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 f54aead..e297094 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -1,44 +1,103 @@ #include "item.h" +#include "actors/sensoractor.h" +#include "actors/regulator.h" +#include "actors/polynomalactor.h" +#include "programmode.h" #include "relay.h" -#include "../microcontroller.h" -#include "../actors/sensoractor.h" -#include "../actors/regulator.h" -#include "../actors/polynomalactor.h" +#include "messageitem.h" +#include "systemitem.h" +#include "auxitem.h" +#include "poweritem.h" +#include "rgbitem.h" #include -ItemData::ItemData(uint32_t itemIdIn, QString name, uint8_t value): name_(name), value_(value), itemId_(itemIdIn) +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) { } 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 -bool Item::secondaryFlag = false; - -Item::Item(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): QObject(parent), ItemData (itemIdIn, name, value) +Item::Item(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): QObject(parent), ItemData (itemIdIn, name, + value) { } @@ -54,116 +113,171 @@ Item::~Item() void Item::store(QJsonObject &json) { - json["Name"] = name_; - json["ItemId"] = static_cast(itemId_); - json["override"] = override_; - QJsonArray actorsArray; - for(size_t i = 0; i < actors_.size(); ++i) - { - if(!actors_[i]->isExausted()) - { - QJsonObject actorObject; - actors_[i]->store(actorObject); - actorsArray.append(actorObject); - } - } - json["Actors"] = actorsArray; + 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; } void Item::load(const QJsonObject &json, const bool preserve) { - 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); - } - } + 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); + } + } } void Item::actorSetValue(uint8_t value) { - if(!override_) setValue(value); + if(!override_ && (programMode == PROGRAM_MODE_PRIMARY || programMode == PROGRAM_MODE_HEADLESS_PRIMARY)) + setValue(value); } void Item::setValue(uint8_t value) { - value_ = value; - valueChanged(value_); + qDebug()<<__func__; + informValue(value); + if(programMode == PROGRAM_MODE_PRIMARY || programMode == PROGRAM_MODE_HEADLESS_PRIMARY) + enactValue(value); } void Item::informValue(uint8_t value) { - Item::setValue(value); + if(value_ != value) + { + value_ = value; + valueChanged(value_); + updated(*this); + } +} + +void Item::enactValue(uint8_t value) +{ + (void)value; } void Item::addActor(std::shared_ptr actor) { - 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); + 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); - 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 7c8d38a..1aaa090 100644 --- a/src/items/item.h +++ b/src/items/item.h @@ -8,70 +8,99 @@ 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_; + QString name_; + uint8_t value_; + uint32_t itemId_; + bool loaded_; + bool hidden_; + item_value_type_t type_; 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); - ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0); + inline bool operator==(const ItemData& in) const + { + return itemId_ == in.itemId_; + } + inline bool operator!=(const ItemData& in) const + { + return itemId_ != in.itemId_; + } - inline bool operator==(const ItemData& in) const{ return itemId_==in.itemId_; } - inline bool operator!=(const ItemData& in) const{ return itemId_!=in.itemId_; } + uint32_t id() const; - uint32_t id() const; - - void setName(QString name); - uint8_t getValue() const; - virtual QString getName() const; + 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); }; 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; - -public: - - static bool secondaryFlag; + bool override_ = false; signals: - - void valueChanged(uint8_t value); + void valueChanged(uint8_t value); + void updated(ItemData data); private slots: - virtual void actorSetValue(uint8_t value); + virtual void actorSetValue(uint8_t value); public slots: - - virtual void setValue(uint8_t value); + 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); + 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(); + 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); + 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); - virtual void store(QJsonObject& json); - virtual void load(const QJsonObject& json, const bool preserve = false); + virtual void store(QJsonObject& json); + virtual void load(const QJsonObject& json, const bool preserve = false); + + static std::shared_ptr loadItem(const QJsonObject& json); + +protected: + virtual void enactValue(uint8_t value); }; diff --git a/src/items/itemloadersource.cpp b/src/items/itemloadersource.cpp new file mode 100644 index 0000000..d5e6afa --- /dev/null +++ b/src/items/itemloadersource.cpp @@ -0,0 +1,38 @@ +#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 new file mode 100644 index 0000000..c31c7fd --- /dev/null +++ b/src/items/itemloadersource.h @@ -0,0 +1,21 @@ +#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 new file mode 100644 index 0000000..1a223dc --- /dev/null +++ b/src/items/itemsource.cpp @@ -0,0 +1,5 @@ +#include "itemsource.h" + +ItemSource::ItemSource(QObject *parent) + : QObject{parent} +{} diff --git a/src/items/itemsource.h b/src/items/itemsource.h new file mode 100644 index 0000000..9fee9c1 --- /dev/null +++ b/src/items/itemsource.h @@ -0,0 +1,25 @@ +#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 a3a76c7..1242afc 100644 --- a/src/items/itemstore.cpp +++ b/src/items/itemstore.cpp @@ -1,130 +1,154 @@ #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) +void ItemStore::addItem(std::shared_ptr item, bool 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())); - } + 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); + } } -void ItemStore::addItems(const std::vector>& itemIn) +void ItemStore::addItems(const std::vector>& itemIn, bool 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]); - + for(unsigned j = 0; j < itemIn.size(); j++) + addItem(itemIn[j], inform); } void ItemStore::removeItem(const ItemData& item) { - for(unsigned j = 0; j < items_.size(); j++) - { - if(item == *items_[j]) - { - items_.erase(items_.begin()+j); - --j; - } - } + 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::itemStateChanged(const ItemData& item) +void ItemStore::updateItems(std::vector items, bool inform) { + for(const ItemData& item : items) + updateItem(item, inform); +} - 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::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]); + } + } + } } 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::load(const QJsonObject& json) +void ItemStore::itemUpdateSlot(ItemData data) { - 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); - } - } - } + for(std::shared_ptr& item: items_) + { + if(*item == data) + itemUpdated(std::weak_ptr(item)); + } } + +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 f2237bf..830cc40 100644 --- a/src/items/itemstore.h +++ b/src/items/itemstore.h @@ -2,37 +2,52 @@ #include #include #include "item.h" -#include "../sensors/sensor.h" +#include "itemsource.h" #include class ItemStore: public QObject { - Q_OBJECT + Q_OBJECT private: - std::vector< std::shared_ptr > items_; + std::vector > 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_; + } - void store(QJsonObject &json); - void load(const QJsonObject &json); + std::shared_ptr getItem(uint32_t id); - void clear(); + void registerItemSource(ItemSource* source); + void store(QJsonObject &json); + + void clear(); signals: - void itemDeleted(ItemData item); - void itemAdded(std::weak_ptr Item); + void itemDeleted(ItemData item); + void itemAdded(std::weak_ptr Item); + void itemUpdated(std::weak_ptr Item); + void sigRefresh(); public slots: - void removeItem(const ItemData& item); - void addItem(std::shared_ptr item); - void addItems(const std::vector>& itemsIn); - void itemStateChanged(const ItemData& item); + 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); }; + +extern ItemStore globalItems; diff --git a/src/items/messageitem.cpp b/src/items/messageitem.cpp index 670a204..151b934 100644 --- a/src/items/messageitem.cpp +++ b/src/items/messageitem.cpp @@ -1,88 +1,90 @@ #include "messageitem.h" #include -#include - -BroadCast* MessageItem::broadCast = nullptr; +#include 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::setValue(uint8_t value) +void MessageItem::enactValue(uint8_t value) { - Item::setValue(value); - if(value && !messageBox_) - { - if(broadCast) broadCast->sendMessage(name_, message_); - if(!alertSoundFileName.isEmpty()) QSound::play(alertSoundFileName); - messageBox_ = new QMessageBox(QMessageBox::NoIcon, name_, message_); - messageBox_->setModal(false); - connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox); - messageBox_->show(); - } - else if(!value && messageBox_) - { - closeMessageBox(); - } + 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(); + } } 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; + alertSoundFileName = in; + alertSound.setSource(QUrl::fromLocalFile(alertSoundFileName)); } 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(""); + Item::load(json,preserve); + message_ = json["Message"].toString("Invalid Message"); + alertSoundFileName = json["Alert"].toString(""); + if(!alertSoundFileName.isEmpty()) + alertSound.setSource(QUrl::fromLocalFile(alertSoundFileName)); } diff --git a/src/items/messageitem.h b/src/items/messageitem.h index 64596db..d23fb11 100644 --- a/src/items/messageitem.h +++ b/src/items/messageitem.h @@ -2,43 +2,40 @@ #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 = ""; - -public: - static BroadCast* broadCast; + QString message_; + QMessageBox* messageBox_ = nullptr; + QString alertSoundFileName = ""; + QSoundEffect alertSound; private slots: + void closeMessageBox(); - void closeMessageBox(); +protected: + virtual void enactValue(uint8_t value) override; public: - virtual void setValue(uint8_t value); + 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(); -public: + void setMessage(const QString& in); + QString getMessage(); + void setAlert(const QString& in); + QString getAlert(); - 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); + virtual void store(QJsonObject& json) override; + virtual void load(const QJsonObject& json, const bool preserve = false) override; }; #endif // MESSAGEITEM_H diff --git a/src/items/poweritem.cpp b/src/items/poweritem.cpp index eef66ac..2b2e4e1 100644 --- a/src/items/poweritem.cpp +++ b/src/items/poweritem.cpp @@ -3,31 +3,33 @@ #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)); - setValue(true); + stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true)); + PowerItem::setValue(true); + hidden_ = true; + type_ = ITEM_VALUE_NO_VALUE; } -void PowerItem::setValue(uint8_t value) +void PowerItem::enactValue(uint8_t value) { - qDebug()<<"shutdown"; - Item::setValue(value); - if(!value) - { - QTimer::singleShot(5000, this, &PowerItem::timeout); - stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 1, "Shutdown Imminent", true)); - } + if(!value) + { + qDebug()<<"shutdown"; + 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"); + qDebug()<<"shutdown timeout"; + QProcess::startDetached("syncoff", QStringList()); } 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 d590d97..d6a610f 100644 --- a/src/items/poweritem.h +++ b/src/items/poweritem.h @@ -1,30 +1,32 @@ #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(); - void timeout(); - -public slots: - - virtual void setValue(uint8_t value); +protected: + virtual void enactValue(uint8_t value) override; public: - 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); + 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; }; diff --git a/src/items/relay.cpp b/src/items/relay.cpp index d9bf2e0..f801e1b 100644 --- a/src/items/relay.cpp +++ b/src/items/relay.cpp @@ -5,66 +5,68 @@ 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); - qDebug()<<"Relay "<relayOn(id_); - else micro_->relayOff(id_); - } + qDebug()<<"Relay"<<__func__<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 4114eef..3c3c4b4 100644 --- a/src/items/relay.h +++ b/src/items/relay.h @@ -4,37 +4,41 @@ #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_; + uint8_t id_; + uint16_t address_; + +protected: + virtual void enactValue(uint8_t value) override; public slots: - - virtual void setValue(uint8_t value); - void on(); - void off(); - void toggle(); + 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); - virtual void load(const QJsonObject& json, const bool preserve = false); + virtual void store(QJsonObject& json) override; + virtual void load(const QJsonObject& json, const bool preserve = false) override; }; #endif // RELAY_H diff --git a/src/items/rgbitem.cpp b/src/items/rgbitem.cpp index 24ec995..6df7c33 100644 --- a/src/items/rgbitem.cpp +++ b/src/items/rgbitem.cpp @@ -1,18 +1,19 @@ #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::setValue(uint8_t value) +void RgbItem::enactValue(uint8_t value) { - Item::setValue(value); - value ? micro_->rgbOn() : micro_->rgbOff(); + assert(micro_); + 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 d3e0235..db721b9 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_; -public slots: - - virtual void setValue(uint8_t value); +protected: + virtual void enactValue(uint8_t value) override; public: - RgbItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr); + RgbItem(Microcontroller* micro = nullptr, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", + uint8_t value = 0, QObject* parent = nullptr); - virtual void store(QJsonObject& json); + virtual void store(QJsonObject& json) override; }; diff --git a/src/items/systemitem.cpp b/src/items/systemitem.cpp index 6a61046..7887ce5 100644 --- a/src/items/systemitem.cpp +++ b/src/items/systemitem.cpp @@ -1,43 +1,43 @@ #include "systemitem.h" #include -void SystemItem::setValue(uint8_t value) +void SystemItem::enactValue(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 3d46e8d..392e914 100644 --- a/src/items/systemitem.h +++ b/src/items/systemitem.h @@ -1,34 +1,37 @@ #ifndef SYSTEMITEM_H #define SYSTEMITEM_H - #include "item.h" class SystemItem : public Item { -Q_OBJECT + Q_OBJECT private: + QString onCommand_; + QString offCommand_; - QString onCommand_; - QString offCommand_; +protected: + virtual void enactValue(uint8_t value) 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; - virtual void setValue(uint8_t value); + void setOnCommand(const QString& in); + void setOffCommand(const QString& in); + QString getOnCommand() + { + return onCommand_; + } + QString getOffCommand() + { + return 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 store(QJsonObject& json); - virtual void load(const QJsonObject& json, const bool preserve = false); + virtual void store(QJsonObject& json) override; + virtual void load(const QJsonObject& json, const bool preserve = false) override; }; #endif // SYSTEMITEM_H diff --git a/src/main.cpp b/src/main.cpp index 31fe38c..8e5ca4c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,133 +1,139 @@ #include -#include #include #include #include - - -#ifndef Q_OS_ANDROID +#include #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" - - -#define BAUD QSerialPort::Baud38400 +#include "programmode.h" int main(int argc, char *argv[]) { - QApplication a(argc, argv); + QApplication a(argc, argv); - //set info - QCoreApplication::setOrganizationName("UVOS"); - QCoreApplication::setOrganizationDomain("uvos.xyz"); - QCoreApplication::setApplicationName("SHinterface"); - QCoreApplication::setApplicationVersion("0.6"); + //pw_init(&argc, &argv); - QDir::setCurrent(a.applicationDirPath()); + //set info + QCoreApplication::setOrganizationName("UVOS"); + QCoreApplication::setOrganizationDomain("uvos.xyz"); + QCoreApplication::setApplicationName("SHinterface"); + QCoreApplication::setApplicationVersion("0.6"); - //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 + QDir::setCurrent(a.applicationDirPath()); - QIODevice* masterIODevice = nullptr; + //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); - #ifndef Q_OS_ANDROID - if(parser.isSet(tcpOption)) - { - QTcpSocket* microSocket = new QTcpSocket; + int retVal; - int port = 6856; - if(parser.isSet(portOption)) port = parser.value(portOption).toInt(); + 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; - 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"); + 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; - if(parser.isSet(portOption)) microPort->setBaudRate(parser.value(baudOption).toInt()); - else microPort->setBaudRate(BAUD); + QTcpSocket* microSocket = new QTcpSocket; - if(!microPort->open(QIODevice::ReadWrite)) std::cout<<"Can not open serial port "<portName().toStdString()<<". Continueing in demo mode"<<'\n'; - masterIODevice = microPort; - } + qInfo()<<"connecting to "<connectToHost(host, port, QIODevice::ReadWrite); - MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "", !parser.isSet(secondaryOption)); + 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; - #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; + QSerialPort *microPort = new QSerialPort; + microPort->setPortName(port); + microPort->setBaudRate(baud); + microPort->open(QIODevice::ReadWrite); - MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "", !parser.isSet(secondaryOption)); - #endif + if(!microPort->isOpen()) + { + qCritical()<<"Can not open serial port"< item){globalItems.addItem(item, false);}); + w->show(); + } + retVal = a.exec(); + 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(); - //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!"); + retVal = a.exec(); + } - w.show(); - - int retVal = a.exec(); - - if(masterIODevice) - delete masterIODevice; - return retVal; + return retVal; } diff --git a/src/mainobject.cpp b/src/mainobject.cpp index 0ed00dc..0f41d19 100644 --- a/src/mainobject.cpp +++ b/src/mainobject.cpp @@ -1,175 +1,162 @@ #include "mainobject.h" -#include "items/messageitem.h" -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 +#include +#include +#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::store(QJsonObject &json) +void MainObject::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); + globalItems.refresh(); } -void MainObject::load(const QJsonObject& json) +QJsonObject MainObject::getJsonObjectFromDisk(const QString& filename, bool* error) { - items.clear(); - rgbItem->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(); -} + QFile file; + file.setFileName(filename); -void MainObject::storeToDisk() -{ - if(master && !noSave) + bool ret = file.open(QIODevice::ReadOnly); + if(!file.isOpen() || !ret) { - QJsonObject json; - store(json); - storeJsonObjectToDisk(json, settingsPath); + std::cerr<<"Can not open config file: "<launch(QHostAddress(host), port); + connect(&globalItems, &ItemStore::itemUpdated, tcpServer, &TcpServer::itemUpdated); } -void MainObject::sendJson() +PrimaryMainObject::~PrimaryMainObject() { - QJsonObject json; - store(json); - broadCast.sendJson(json); + storeToDisk(settingsPath); } -QJsonObject MainObject::getJsonObjectFromDisk(const QString& filePath, bool* error) +void PrimaryMainObject::store(QJsonObject &json) { - 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() { - #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 @@ -12,76 +11,66 @@ #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 "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" +#include "sensors/mqttsensorsource.h" +#include "items/fixeditemsource.h" +#include "items/itemloadersource.h" +#include "service/tcpclient.h" +#include "service/tcpserver.h" class MainObject : public QObject { - 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 = ""); + Q_OBJECT public: - explicit MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent = nullptr); - ~MainObject(); - - void store(QJsonObject& json); - - void load(const QJsonObject& json); - -signals: + explicit MainObject(QObject *parent = nullptr); + ~MainObject(); + static QJsonObject getJsonObjectFromDisk(const QString& filename, bool* error = nullptr); + static bool storeJsonObjectToDisk(const QString& filename, const QJsonObject& json); public slots: + void refresh(); +}; - void storeToDisk(); - void sendJson(); - void recivedJson(const QJsonObject json); +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(); }; diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index 6922206..4833461 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -3,108 +3,99 @@ #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); - std::cout<write(buffer); - _port->waitForBytesWritten(1000); - } - std::this_thread::sleep_for(std::chrono::milliseconds(40)); + if(_port != nullptr) + { + _port->write(buffer); + _port->waitForBytesWritten(1000); + } + std::this_thread::sleep_for(std::chrono::milliseconds(40)); } void Microcontroller::write(char* buffer, const size_t length) { - #ifndef Q_OS_ANDROID - if constexpr(debug) std::cerr<write(buffer, length); - _port->waitForBytesWritten(1000); - } - std::this_thread::sleep_for(std::chrono::milliseconds(40)); + if(_port != nullptr) + { + _port->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::requestState() +void Microcontroller::refresh() { - write("state\n"); + write("state\n"); } //housekeeping Microcontroller::Microcontroller(QIODevice* port) { - setIODevice(port); + setIODevice(port); } Microcontroller::Microcontroller() @@ -117,81 +108,96 @@ 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[4].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[6].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; - qDebug()<<"got relay list " << relayList.size(); - gotRelayList(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; + gotItems(relayList); + relayList.clear(); + } + else listMode = false; } void Microcontroller::processRelayState(const QString& buffer) { - itemChanged(static_cast(*processRelayLine(buffer))); + updateItems({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 f6de49e..1845dc0 100644 --- a/src/microcontroller.h +++ b/src/microcontroller.h @@ -1,8 +1,6 @@ #ifndef MICROCONTROLLER_H #define MICROCONTROLLER_H -#include - #include #include #include @@ -17,73 +15,70 @@ #include "items/item.h" #include "items/relay.h" #include "sensors/sensor.h" +#include "items/itemsource.h" -class Microcontroller : public QObject +class Microcontroller : public ItemSource { - 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 requestState(); + void refresh() override; - 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 itemChanged(ItemData relay); - void auxStateChanged(int value); - void gotRelayList(std::vector< std::shared_ptr >&); - - void gotSensorState(Sensor sensor); + void textRecived(const QString string); + void gotSensorState(Sensor sensor); }; #endif // MICROCONTROLLER_H diff --git a/src/pipewire.cpp b/src/pipewire.cpp new file mode 100644 index 0000000..2c789d5 --- /dev/null +++ b/src/pipewire.cpp @@ -0,0 +1,72 @@ +#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 new file mode 100644 index 0000000..5f2135a --- /dev/null +++ b/src/pipewire.h @@ -0,0 +1,56 @@ +#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 new file mode 100644 index 0000000..d37ba81 --- /dev/null +++ b/src/programmode.cpp @@ -0,0 +1,3 @@ +#include "programmode.h" + +program_mode_t programMode = PROGRAM_MODE_PRIMARY; diff --git a/src/programmode.h b/src/programmode.h new file mode 100644 index 0000000..ccbb900 --- /dev/null +++ b/src/programmode.h @@ -0,0 +1,13 @@ +#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 new file mode 100644 index 0000000..4202ab8 --- /dev/null +++ b/src/sensors/mqttsensorsource.cpp @@ -0,0 +1,187 @@ +#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 deleted file mode 100644 index ad1e63f..0000000 --- a/src/sensors/ocupancysensor.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#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 0a95763..e2a262f 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 e516e7e..bc5e748 100644 --- a/src/sensors/sensor.h +++ b/src/sensors/sensor.h @@ -4,96 +4,149 @@ #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_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_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; - uint8_t type; - uint8_t id; - float field; - QString name; - QDateTime lastSeen; - bool hidden; + uint8_t type; + uint64_t id; + float field; + QString name; + QDateTime lastSeen; + bool hidden; - 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); - } + 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); + } }; 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 deleted file mode 100644 index b6afbfa..0000000 --- a/src/sensors/speakersensor.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#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 deleted file mode 100644 index 94b41f4..0000000 --- a/src/sensors/speakersensor.h +++ /dev/null @@ -1,45 +0,0 @@ -#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 6be9a73..37a1c9b 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 eec3c5f..65d84c3 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 new file mode 100644 index 0000000..5129512 --- /dev/null +++ b/src/service/service.cpp @@ -0,0 +1,104 @@ +#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 new file mode 100644 index 0000000..d4d8dd8 --- /dev/null +++ b/src/service/tcpclient.cpp @@ -0,0 +1,100 @@ +#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 new file mode 100644 index 0000000..df28641 --- /dev/null +++ b/src/service/tcpclient.h @@ -0,0 +1,33 @@ +#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 new file mode 100644 index 0000000..b5b780f --- /dev/null +++ b/src/service/tcpserver.cpp @@ -0,0 +1,153 @@ +#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 c6da3d5..03b74ee 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); - 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); + connect(ui->pushButton_enable, &QPushButton::clicked, this, &ActorSettingsDialog::setEnabled); + ui->spinBox->hide(); - ui->spinBox->setValue(actor_->getTriggerValue()); - if(actor_->getTriggerValue() == 0) ui->comboBox_action->setCurrentIndex(0); - else if(actor_->getTriggerValue() == 1) ui->comboBox_action->setCurrentIndex(1); - else ui->comboBox_action->setCurrentIndex(2); + 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_Exausted->setText(actor_->isExausted() ? "True" : "False"); + ui->label_Enabled->setText(actor_->isActive() ? "True" : "False"); + ui->pushButton_enable->setText(actor_->isActive() ? "Disable" : "Enable"); } ActorSettingsDialog::~ActorSettingsDialog() { - delete ui; + delete ui; } void ActorSettingsDialog::editAsItem() { - ItemSettingsDialog itemSettingsDiag(actor_, this); - itemSettingsDiag.exec(); + 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"); } void ActorSettingsDialog::valueChanged(int value) { - actor_->setTriggerValue(value); + actor_->setTriggerValue(value); } void ActorSettingsDialog::hideCancle([[maybe_unused]] const bool hide) @@ -116,13 +129,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 3d8e5a5..16c4d68 100644 --- a/src/ui/actorsettingsdialog.h +++ b/src/ui/actorsettingsdialog.h @@ -10,40 +10,42 @@ #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 changeAction(int index); + void valueChanged(int value); + void editAsItem(); + void setEnabled(); private: - Ui::ActorSettingsDialog *ui; + Ui::ActorSettingsDialog *ui; }; #endif // ACTORSETTINGSDIALOG_H diff --git a/src/ui/actorsettingsdialog.ui b/src/ui/actorsettingsdialog.ui index 6b0a057..0334dec 100644 --- a/src/ui/actorsettingsdialog.ui +++ b/src/ui/actorsettingsdialog.ui @@ -85,6 +85,63 @@ + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Enabled: + + + + + + + + 0 + 0 + + + + True + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Enable + + + diff --git a/src/ui/actorwidgets/alarmwidget.cpp b/src/ui/actorwidgets/alarmwidget.cpp index 65cbb31..9c2490b 100644 --- a/src/ui/actorwidgets/alarmwidget.cpp +++ b/src/ui/actorwidgets/alarmwidget.cpp @@ -2,73 +2,81 @@ #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); - 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->setupUi(this); - 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->dateTimeEdit, &QDateTimeEdit::dateTimeChanged, alarm.get(), &AlarmTime::changeTime); + 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); } 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 13541d9..58670ee 100644 --- a/src/ui/actorwidgets/alarmwidget.h +++ b/src/ui/actorwidgets/alarmwidget.h @@ -5,26 +5,27 @@ #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 1b29275..3b99187 100644 --- a/src/ui/actorwidgets/alarmwidget.ui +++ b/src/ui/actorwidgets/alarmwidget.ui @@ -24,16 +24,16 @@ - QFormLayout::AllNonFixedFieldsGrow + QFormLayout::FieldGrowthPolicy::AllNonFixedFieldsGrow - QFormLayout::DontWrapRows + QFormLayout::RowWrapPolicy::DontWrapRows - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignVCenter - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop 50 @@ -57,7 +57,7 @@ false - QDateTimeEdit::DaySection + QDateTimeEdit::Section::DaySection dd.MM.yyyy hh:mm diff --git a/src/ui/actorwidgets/factoractorwidget.cpp b/src/ui/actorwidgets/factoractorwidget.cpp index 21990db..deee281 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 c5bf083..37717b2 100644 --- a/src/ui/actorwidgets/factoractorwidget.h +++ b/src/ui/actorwidgets/factoractorwidget.h @@ -4,27 +4,28 @@ #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 9b04057..930a3f8 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.cpp +++ b/src/ui/actorwidgets/polynomalactorwidget.cpp @@ -1,48 +1,50 @@ #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(sensors_->getSensors()->at(index.row())); + actor_->setSensor(ui->listView->getSensorForIndex(index)); } diff --git a/src/ui/actorwidgets/polynomalactorwidget.h b/src/ui/actorwidgets/polynomalactorwidget.h index 6b4b405..26c64b3 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.h +++ b/src/ui/actorwidgets/polynomalactorwidget.h @@ -4,27 +4,29 @@ #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 e1733df..39bf709 100644 --- a/src/ui/actorwidgets/polynomalactorwidget.ui +++ b/src/ui/actorwidgets/polynomalactorwidget.ui @@ -132,7 +132,7 @@ SensorListWidget QListView -
../src/ui/sensorlistwidget.h
+
ui/sensorlistwidget.h
diff --git a/src/ui/actorwidgets/regulatorwdiget.cpp b/src/ui/actorwidgets/regulatorwdiget.cpp index 8eb6d4a..b005240 100644 --- a/src/ui/actorwidgets/regulatorwdiget.cpp +++ b/src/ui/actorwidgets/regulatorwdiget.cpp @@ -4,45 +4,50 @@ 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->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()); - 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->listView, &SensorListWidget::clicked, this, &RegulatorWdiget::setSensor); + connect(ui->doubleSpinBox_setPoint, SIGNAL(valueChanged(double)), this, SLOT(setPoint(double))); + connect(ui->doubleSpinBox_band, SIGNAL(valueChanged(double)), this, SLOT(setBand(double))); + connect(ui->spinBox_safe, SIGNAL(valueChanged(int)), regulator_.get(), SLOT(setSafeValue(int))); + connect(ui->spinBox_timeout, SIGNAL(valueChanged(int)), regulator_.get(), SLOT(setTimeout(int))); } + void RegulatorWdiget::setPoint(double in) { - regulator_->setPoint(in); + regulator_->setPoint(in); } void RegulatorWdiget::setBand(double band) { - regulator_->setBand(band); + regulator_->setBand(band); } void RegulatorWdiget::setSensor(const QModelIndex &index) { - regulator_->setSensor(sensors_->getSensors()->at(index.row())); - setPoint(sensors_->getSensors()->at(index.row()).field); - ui->doubleSpinBox_setPoint->setValue(sensors_->getSensors()->at(index.row()).field); + regulator_->setSensor(ui->listView->getSensorForIndex(index)); + setPoint(ui->listView->getSensorForIndex(index).field); + ui->doubleSpinBox_setPoint->setValue(ui->listView->getSensorForIndex(index).field); } diff --git a/src/ui/actorwidgets/regulatorwdiget.h b/src/ui/actorwidgets/regulatorwdiget.h index eebd764..3c2b2d5 100644 --- a/src/ui/actorwidgets/regulatorwdiget.h +++ b/src/ui/actorwidgets/regulatorwdiget.h @@ -4,29 +4,31 @@ #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 db159cf..ee79da6 100644 --- a/src/ui/actorwidgets/regulatorwdiget.ui +++ b/src/ui/actorwidgets/regulatorwdiget.ui @@ -38,15 +38,8 @@
- - - - - Set Point - - - - + + -9999.989999999999782 @@ -56,7 +49,7 @@ - + @@ -69,9 +62,46 @@ - + + + + Timeout + + + + + + + Set Point + + + + + + + + Safety Value + + + + + + + + + + s + + + 999999999 + + + 1800 + + + @@ -80,7 +110,7 @@ SensorListWidget QListView -
../src/ui/sensorlistwidget.h
+
ui/sensorlistwidget.h
diff --git a/src/ui/actorwidgets/sensoractorwidget.cpp b/src/ui/actorwidgets/sensoractorwidget.cpp index 87bc6f9..2718b1b 100644 --- a/src/ui/actorwidgets/sensoractorwidget.cpp +++ b/src/ui/actorwidgets/sensoractorwidget.cpp @@ -4,49 +4,51 @@ #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(sensors_->getSensors()->at(index.row())); - qDebug()<<"Selected "<getSensors()->at(index.row()).name; + sensorActor_->setSensor(ui->listView->getSensorForIndex(index)); } diff --git a/src/ui/actorwidgets/sensoractorwidget.h b/src/ui/actorwidgets/sensoractorwidget.h index bb0915b..3501977 100644 --- a/src/ui/actorwidgets/sensoractorwidget.h +++ b/src/ui/actorwidgets/sensoractorwidget.h @@ -5,29 +5,31 @@ #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 8e9d967..5f49c96 100644 --- a/src/ui/actorwidgets/sensoractorwidget.ui +++ b/src/ui/actorwidgets/sensoractorwidget.ui @@ -89,7 +89,7 @@ SensorListWidget QListView -
../src/ui/sensorlistwidget.h
+
ui/sensorlistwidget.h
diff --git a/src/ui/actorwidgets/timeractorwidget.cpp b/src/ui/actorwidgets/timeractorwidget.cpp index f1f6bf7..ddd02c7 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 4a88cb6..3b94428 100644 --- a/src/ui/actorwidgets/timeractorwidget.h +++ b/src/ui/actorwidgets/timeractorwidget.h @@ -4,20 +4,21 @@ #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 bd225c6..57e804f 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 57421ae..6e993d3 100644 --- a/src/ui/itemcreationdialog.h +++ b/src/ui/itemcreationdialog.h @@ -5,29 +5,30 @@ #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 5a12edd..170a557 100644 --- a/src/ui/itemscrollbox.cpp +++ b/src/ui/itemscrollbox.cpp @@ -4,52 +4,43 @@ #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(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); - } + 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); + } } 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 18f0dff..54d5fe8 100644 --- a/src/ui/itemscrollbox.h +++ b/src/ui/itemscrollbox.h @@ -11,33 +11,34 @@ #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 e23d051..08417d3 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() > ui->tableWidget->currentRow()) - { - item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); - loadActorList(); - } + if(item_->getActors().size() > static_cast(ui->tableWidget->currentRow())) + { + item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow())); + loadActorList(); + } } void ItemSettingsDialog::editActor() { - if(item_->getActors().size() > ui->tableWidget->currentRow()) - { - std::shared_ptr actor = item_->getActors()[ui->tableWidget->currentRow()]; + if(item_->getActors().size() > static_cast(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 < 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 < 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"); + } + } } diff --git a/src/ui/itemsettingsdialog.h b/src/ui/itemsettingsdialog.h index 1a9fa34..dc2a5af 100644 --- a/src/ui/itemsettingsdialog.h +++ b/src/ui/itemsettingsdialog.h @@ -6,32 +6,33 @@ #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 871bb9f..7faeede 100644 --- a/src/ui/itemsettingsdialog.ui +++ b/src/ui/itemsettingsdialog.ui @@ -115,7 +115,7 @@ 3 - false + true 32 diff --git a/src/ui/itemsettingswidgets/messageitemsettingswidget.cpp b/src/ui/itemsettingswidgets/messageitemsettingswidget.cpp new file mode 100644 index 0000000..02afb64 --- /dev/null +++ b/src/ui/itemsettingswidgets/messageitemsettingswidget.cpp @@ -0,0 +1,48 @@ +#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 new file mode 100644 index 0000000..f7a76c8 --- /dev/null +++ b/src/ui/itemsettingswidgets/messageitemsettingswidget.h @@ -0,0 +1,31 @@ +#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 new file mode 100644 index 0000000..7a71800 --- /dev/null +++ b/src/ui/itemsettingswidgets/messageitemsettingswidget.ui @@ -0,0 +1,59 @@ + + + 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 4c78913..f9194cf 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 400f21a..39cb2e5 100644 --- a/src/ui/itemsettingswidgets/relayitemsettingswidget.h +++ b/src/ui/itemsettingswidgets/relayitemsettingswidget.h @@ -5,20 +5,21 @@ #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 49d476f..643e3e6 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 5b401f7..528f530 100644 --- a/src/ui/itemsettingswidgets/systemitemsettingswidget.h +++ b/src/ui/itemsettingswidgets/systemitemsettingswidget.h @@ -5,26 +5,27 @@ #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 a195e73..d073e50 100644 --- a/src/ui/itemwidget.cpp +++ b/src/ui/itemwidget.cpp @@ -5,106 +5,117 @@ #include #include -ItemWidget::ItemWidget(std::weak_ptr item, bool analog, bool nameOnly, QWidget *parent) : - QWidget(parent), - item_(item), - ui(new Ui::ItemWidget) +ItemWidget::ItemWidget(std::weak_ptr item, QWidget *parent) : + QWidget(parent), + item_(item), + ui(new Ui::ItemWidget) { - ui->setupUi(this); + ui->setupUi(this); - if(analog) - { - ui->horizontalSpacer->changeSize(0,0); - ui->checkBox->hide(); - } - else if(nameOnly) - { - ui->checkBox->hide(); - ui->slider->hide(); - } - else ui->slider->hide(); + 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(auto workingRelay = item_.lock()) - { - ui->checkBox->setChecked(workingRelay->getValue()); + ui->checkBox->setChecked(workingItem->getValue()); - ui->label->setText(workingRelay->getName()); + ui->label->setText(workingItem->getName()); - 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); + 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); - } - 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 workingRelay = item_.lock()) - { - if(relay == *workingRelay) return true; - else return false; - } - return true; + if(auto workingItem = item_.lock()) + { + if(relay == *workingItem) return true; + else return false; + } + return true; } void ItemWidget::showSettingsDialog() { - if(auto workingRelay = item_.lock()) - { - ItemSettingsDialog dialog(workingRelay, this); - dialog.exec(); - } - else disable(); + if(auto workingItem = item_.lock()) + { + ItemSettingsDialog dialog(workingItem, this); + dialog.exec(); + } + else disable(); } std::weak_ptr ItemWidget::getItem() { - return item_; + return item_; } void ItemWidget::stateChanged(int state) { - 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); + ui->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 fadb53e..18d2861 100644 --- a/src/ui/itemwidget.h +++ b/src/ui/itemwidget.h @@ -6,40 +6,41 @@ #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, bool analog = false, bool nameOnly = false, QWidget *parent = nullptr); - std::weak_ptr getItem(); - bool controles(const ItemData& relay); - ~ItemWidget(); + explicit ItemWidget(std::weak_ptr item, 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 bdbc8a6..91d92f5 100644 --- a/src/ui/itemwidget.ui +++ b/src/ui/itemwidget.ui @@ -30,7 +30,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -46,10 +46,10 @@ 255 - true + false - Qt::Horizontal + Qt::Orientation::Horizontal diff --git a/src/ui/mainwindow-android.ui b/src/ui/mainwindow-android.ui index fa90bc9..e7802b3 100644 --- a/src/ui/mainwindow-android.ui +++ b/src/ui/mainwindow-android.ui @@ -245,13 +245,13 @@ ItemScrollBox QWidget -
../src/ui/itemscrollbox.h
+
../ui/itemscrollbox.h
1
SensorListWidget QListView -
../src/ui/sensorlistwidget.h
+
../ui/sensorlistwidget.h
diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 5967c0b..79a6b3e 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -1,88 +1,93 @@ #include "mainwindow.h" + +#include + #include "ui_mainwindow.h" #include "itemscrollbox.h" #include "itemsettingsdialog.h" #include "itemcreationdialog.h" -#include "../mainobject.h" +#include "mainobject.h" +#include "programmode.h" +#include "items/poweritem.h" MainWindow::MainWindow(MainObject * const mainObject, QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow), - colorChooser(this), - _micro(&mainObject->micro), - _powerItem(mainObject->powerItem) + QMainWindow(parent), + ui(new Ui::MainWindow), + colorChooser(this) { - ui->setupUi(this); + 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");}); - 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_power, SIGNAL(clicked()), this, SLOT(showPowerItemDialog())); - connect(ui->pushButton_power, SIGNAL(clicked()), this, SLOT(showPowerItemDialog())); + 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); - //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); + for(size_t i = 0; i < globalItems.getItems()->size(); ++i) + ui->relayList->addItem(globalItems.getItems()->at(i)); - for(size_t i = 0; i < mainObject->items.getItems()->size(); ++i) - { - ui->relayList->addItem(mainObject->items.getItems()->at(i)); - } + if(programMode != PROGRAM_MODE_PRIMARY) + ui->label_serialRecive->setHidden(true); - //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, 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())); + //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(); - connect(ui->pushButton_addItem, &QPushButton::clicked, this, &MainWindow::showItemCreationDialog); - connect(ui->relayList, &ItemScrollBox::deleteRequest, &mainObject->items, &ItemStore::removeItem); + connect(ui->pushButton_addItem, &QPushButton::clicked, this, &MainWindow::showItemCreationDialog); + connect(ui->relayList, &ItemScrollBox::deleteRequest, &globalItems, &ItemStore::removeItem); + + ui->splitter->setStretchFactor(1, 1); } MainWindow::~MainWindow() { - delete ui; + delete ui; } void MainWindow::showPowerItemDialog() { - ItemSettingsDialog diag(std::shared_ptr(_powerItem), this); - diag.show(); - diag.exec(); + 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"); + } } - -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 e52f025..5b04b64 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -5,14 +5,9 @@ #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 +#include class MainObject; @@ -23,37 +18,32 @@ 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; - - Microcontroller *_micro; - - std::shared_ptr _powerItem; + QColorDialog colorChooser; signals: - void sigBrodcast(); void sigSave(); - void createdItem(std::shared_ptr item); + void createdItem(std::shared_ptr item); + void sigSetRgb(const QColor color); private slots: - //RGB - void slotChangedRgb(const QColor color); - void showPowerItemDialog(); - void showItemCreationDialog(); + //RGB + 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 de1eca1..0e6732c 100644 --- a/src/ui/mainwindow.ui +++ b/src/ui/mainwindow.ui @@ -37,181 +37,207 @@ - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight false - + - - - - - - 0 - 0 - - - - QFrame::Box - - - SHinterface - - - Qt::AutoText - - - - - - - Sensors - - - - 2 - - - 2 - - - - - QAbstractItemView::NoSelection - - - false - - - - - - - - - - 0 - + + + Qt::Orientation::Horizontal + + + false + + + - + - + 0 0 - - - 0 - 0 - - - - - 16777215 - 48 - - - - - 0 - 128 - + + QFrame::Shape::Box - Color + SHinterface + + + Qt::TextFormat::AutoText - - - Config Shutdown + + + Sensors + + + 2 + + + 2 + + + + + + 0 + 0 + + + + + 300 + 0 + + + + QAbstractItemView::SelectionMode::NoSelection + + + false + + + + + + + + 0 + + + - - + + + + + + + + 0 + 0 + + + + Items + + + + 2 + + + 2 + + + + + + 0 + 0 + + + + + + + + + + + 0 + + + + + + - + - + + + Config Shutdown + + + + + - + 0 0 - - Items + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + 0 + 128 + + + + Color - - - 2 - - - 2 - - - - - - 0 - 0 - - - - - - - - 0 + + + Refesh - - - - Refesh - - - - - - - Save - - - - - - - Add Item - - - - - - - - 0 - 0 - - - - Qt::RightToLeft - - - Quit - - - - + + + + + + Save + + + + + + + Add Item + + + + + + + + 0 + 0 + + + + Qt::LayoutDirection::RightToLeft + + + Quit + + @@ -223,12 +249,12 @@ SensorListWidget QListView -
../src/ui/sensorlistwidget.h
+
ui/sensorlistwidget.h
ItemScrollBox QWidget -
../src/ui/itemscrollbox.h
+
ui/itemscrollbox.h
1
diff --git a/src/ui/sensorlistwidget.cpp b/src/ui/sensorlistwidget.cpp index 1f7a823..827ab2e 100644 --- a/src/ui/sensorlistwidget.cpp +++ b/src/ui/sensorlistwidget.cpp @@ -4,69 +4,86 @@ #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(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")); + 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(); } -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")); - 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(' '); + 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(' '); - 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 QTableWidgetItem(sensors[i].name + (sensors[i].hidden ? "(H)" : ""))); - setItem(static_cast(row), 1, new QTableWidgetItem(itemString)); - ++row; - } - } + 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(); } void SensorListWidget::setShowHidden(const bool showHidden) { - showHidden_=showHidden; + showHidden_=showHidden; +} + +const Sensor& SensorListItem::getSensor() +{ + return sensor; +} + +SensorListItem::SensorListItem(const QString& text, const Sensor& sensor): + QTableWidgetItem(text, 1001), sensor(sensor) +{ } diff --git a/src/ui/sensorlistwidget.h b/src/ui/sensorlistwidget.h index 9ace2b4..4c84d54 100644 --- a/src/ui/sensorlistwidget.h +++ b/src/ui/sensorlistwidget.h @@ -1,23 +1,33 @@ #pragma once #include #include -#include "../sensors/sensor.h" +#include "sensors/sensor.h" + +class SensorListItem : public QTableWidgetItem +{ + Sensor sensor; + +public: + const Sensor& getSensor(); + SensorListItem(const QString& text, const Sensor& sensor); +}; class SensorListWidget : public QTableWidget { - Q_OBJECT + 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); + SensorListWidget(const bool showHidden = true, QWidget* parent = nullptr); + SensorListWidget(SensorStore& sensorStore, const bool showHidden = true, QWidget* parent = nullptr); + virtual ~SensorListWidget() {} + void setShowHidden(const bool showHidden); + const Sensor& getSensorForIndex(const QModelIndex &index); public slots: - void sensorsChanged(std::vector sensors); + void sensorsChanged(std::vector sensors); };