Added system item support, support for RGBControlers with multiple item backends, and item settings widgets
This commit is contained in:
parent
a761eb4317
commit
5fb9ca7cc0
56 changed files with 635 additions and 210 deletions
|
|
@ -50,13 +50,13 @@ Item::Item(const ItemData& itemData, QObject *parent): QObject(parent), ItemDat
|
|||
|
||||
Item::~Item()
|
||||
{
|
||||
for(size_t i = 0; i < actors_.size(); i++) delete actors_[i];
|
||||
}
|
||||
|
||||
void Item::store(QJsonObject &json)
|
||||
{
|
||||
json["Name"] = name_;
|
||||
json["ItemId"] = static_cast<double>(itemId_);
|
||||
json["override"] = override_;
|
||||
QJsonArray actorsArray;
|
||||
for(size_t i = 0; i < actors_.size(); ++i)
|
||||
{
|
||||
|
|
@ -77,17 +77,23 @@ void Item::load(const QJsonObject &json, const bool preserve)
|
|||
name_ = json["Name"].toString(name_);
|
||||
itemId_ = static_cast<uint32_t>(json["ItemId"].toDouble(0));
|
||||
}
|
||||
override_ = json["override"].toBool(false);
|
||||
const QJsonArray actorsArray(json["Actors"].toArray(QJsonArray()));
|
||||
for(int i = 0; i < actorsArray.size(); ++i)
|
||||
{
|
||||
if(actorsArray[i].isObject())
|
||||
{
|
||||
Actor* actor = Actor::loadActor(actorsArray[i].toObject());
|
||||
std::shared_ptr<Actor> actor = Actor::loadActor(actorsArray[i].toObject());
|
||||
if(actor != nullptr) addActor(actor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Item::actorSetValue(uint8_t value)
|
||||
{
|
||||
if(!override_) setValue(value);
|
||||
}
|
||||
|
||||
void Item::setValue(uint8_t value)
|
||||
{
|
||||
value_ = value;
|
||||
|
|
@ -99,34 +105,32 @@ void Item::informValue(uint8_t value)
|
|||
Item::setValue(value);
|
||||
}
|
||||
|
||||
void Item::addActor(Actor* actor)
|
||||
void Item::addActor(std::shared_ptr<Actor> actor)
|
||||
{
|
||||
actor->setParent(this);
|
||||
actors_.push_back(actor);
|
||||
if(!secondaryFlag)
|
||||
{
|
||||
qDebug()<<"connecting actor";
|
||||
connect(actor, &Actor::sigValue, this, &Item::setValue);
|
||||
connect(actor.get(), &Actor::sigValue, this, &Item::actorSetValue);
|
||||
}
|
||||
connect(this, &Item::valueChanged, actor, &Actor::onValueChanged);
|
||||
connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged);
|
||||
|
||||
SensorActor* sensorActor = dynamic_cast<SensorActor*>(actor);
|
||||
if(sensorActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor, &SensorActor::sensorEvent);
|
||||
std::shared_ptr<SensorActor> sensorActor = std::dynamic_pointer_cast<SensorActor>(actor);
|
||||
if(sensorActor)connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor.get(), &SensorActor::sensorEvent);
|
||||
|
||||
Regulator* regulator = dynamic_cast<Regulator*>(actor);
|
||||
if(regulator != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, regulator, &Regulator::sensorEvent);
|
||||
std::shared_ptr<Regulator> regulator = std::dynamic_pointer_cast<Regulator>(actor);
|
||||
if(regulator)connect(&globalSensors, &SensorStore::sensorChangedState, regulator.get(), &Regulator::sensorEvent);
|
||||
|
||||
PolynomalActor* polynomalActor = dynamic_cast<PolynomalActor*>(actor);
|
||||
if(polynomalActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor, &PolynomalActor::sensorEvent);
|
||||
std::shared_ptr<PolynomalActor> polynomalActor = std::dynamic_pointer_cast<PolynomalActor>(actor);
|
||||
if(polynomalActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor.get(), &PolynomalActor::sensorEvent);
|
||||
}
|
||||
|
||||
bool Item::removeActor(Actor* actor)
|
||||
bool Item::removeActor(std::shared_ptr<Actor> actor)
|
||||
{
|
||||
for(unsigned int i = 0; i < actors_.size(); i++)
|
||||
{
|
||||
if(actors_[i] == actor)
|
||||
{
|
||||
delete actor;
|
||||
actors_.erase(actors_.begin()+i);
|
||||
return true;
|
||||
}
|
||||
|
|
@ -134,13 +138,22 @@ bool Item::removeActor(Actor* actor)
|
|||
return false;
|
||||
}
|
||||
|
||||
void Item::setOverride(const bool in)
|
||||
{
|
||||
override_ = in;
|
||||
}
|
||||
|
||||
bool Item::getOverride()
|
||||
{
|
||||
return override_;
|
||||
}
|
||||
|
||||
void Item::removeAllActors()
|
||||
{
|
||||
for(unsigned int i = 0; i < actors_.size(); i++) delete actors_[i];
|
||||
actors_.clear();
|
||||
}
|
||||
|
||||
std::vector< Actor* >& Item::getActors()
|
||||
std::vector< std::shared_ptr<Actor> >& Item::getActors()
|
||||
{
|
||||
return actors_;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include <QRandomGenerator>
|
||||
#include <QSettings>
|
||||
#include <QJsonObject>
|
||||
#include <memory>
|
||||
|
||||
class Actor;
|
||||
|
||||
|
|
@ -33,7 +34,9 @@ class Item: public QObject, public ItemData
|
|||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
std::vector< Actor* > actors_;
|
||||
std::vector< std::shared_ptr<Actor> > actors_;
|
||||
|
||||
bool override_ = false;
|
||||
|
||||
public:
|
||||
|
||||
|
|
@ -43,6 +46,9 @@ signals:
|
|||
|
||||
void valueChanged(uint8_t value);
|
||||
|
||||
private slots:
|
||||
virtual void actorSetValue(uint8_t value);
|
||||
|
||||
public slots:
|
||||
|
||||
virtual void setValue(uint8_t value);
|
||||
|
|
@ -54,12 +60,14 @@ public:
|
|||
|
||||
virtual ~Item();
|
||||
|
||||
std::vector< Actor* >& getActors();
|
||||
std::vector< std::shared_ptr<Actor> >& getActors();
|
||||
bool hasActors();
|
||||
void addActor(Actor* actor);
|
||||
bool removeActor(Actor* actor);
|
||||
void addActor(std::shared_ptr<Actor> actor);
|
||||
bool removeActor(std::shared_ptr<Actor> actor);
|
||||
void removeAllActors();
|
||||
void setActorsActive(bool in);
|
||||
void setOverride(const bool in);
|
||||
bool getOverride();
|
||||
void informValue(uint8_t value);
|
||||
|
||||
virtual void store(QJsonObject& json);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
#include "itemstore.h"
|
||||
#include "relay.h"
|
||||
#include "messageitem.h"
|
||||
#include "systemitem.h"
|
||||
#include <QJsonArray>
|
||||
|
||||
ItemStore::ItemStore(QObject *parent): QObject(parent)
|
||||
|
|
@ -110,6 +111,10 @@ void ItemStore::load(const QJsonObject& json)
|
|||
{
|
||||
newItem = std::shared_ptr<MessageItem>(new MessageItem);
|
||||
}
|
||||
else if(itemObject["Type"].toString("") == "System")
|
||||
{
|
||||
newItem = std::shared_ptr<SystemItem>(new SystemItem());
|
||||
}
|
||||
else if(itemObject["Type"].toString("") == "Aux")
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
#include "messageitem.h"
|
||||
|
||||
#include <QTimer>
|
||||
#include <QSound>
|
||||
|
||||
BroadCast* MessageItem::broadCast_ = nullptr;
|
||||
BroadCast* MessageItem::broadCast = nullptr;
|
||||
|
||||
MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent):
|
||||
Item(itemIdIn, name, value, parent)
|
||||
|
|
@ -26,13 +27,12 @@ void MessageItem::setValue(uint8_t value)
|
|||
Item::setValue(value);
|
||||
if(value && !messageBox_)
|
||||
{
|
||||
if(broadCast) broadCast->sendMessage(name_, message_);
|
||||
if(!alertSoundFileName.isEmpty()) QSound::play(alertSoundFileName);
|
||||
messageBox_ = new QMessageBox(QMessageBox::NoIcon, name_, message_);
|
||||
messageBox_->setModal(false);
|
||||
connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox);
|
||||
messageBox_->show();
|
||||
if(broadCast_) broadCast_->sendMessage(name_, message_);
|
||||
|
||||
//QTimer::singleShot(600000, this, &MessageItem::closeMessageBox);
|
||||
}
|
||||
else if(!value && messageBox_)
|
||||
{
|
||||
|
|
@ -52,6 +52,16 @@ void MessageItem::closeMessageBox()
|
|||
}
|
||||
}
|
||||
|
||||
QString MessageItem::getAlert()
|
||||
{
|
||||
return alertSoundFileName;
|
||||
}
|
||||
|
||||
void MessageItem::setAlert(const QString &in)
|
||||
{
|
||||
alertSoundFileName = in;
|
||||
}
|
||||
|
||||
void MessageItem::setMessage(const QString& in)
|
||||
{
|
||||
message_ = in;
|
||||
|
|
@ -67,10 +77,12 @@ void MessageItem::store(QJsonObject &json)
|
|||
json["Type"] = "Message";
|
||||
Item::store(json);
|
||||
json["Message"] = message_;
|
||||
if(!alertSoundFileName.isEmpty()) json["Alert"] = alertSoundFileName;
|
||||
}
|
||||
|
||||
void MessageItem::load(const QJsonObject &json, const bool preserve)
|
||||
{
|
||||
Item::load(json,preserve);
|
||||
message_ = json["Message"].toString("Invalid Message");
|
||||
alertSoundFileName = json["Alert"].toString("");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,8 +13,10 @@ private:
|
|||
|
||||
QString message_;
|
||||
QMessageBox* messageBox_ = nullptr;
|
||||
QString alertSoundFileName = "";
|
||||
|
||||
static BroadCast* broadCast_;
|
||||
public:
|
||||
static BroadCast* broadCast;
|
||||
|
||||
private slots:
|
||||
|
||||
|
|
@ -32,6 +34,8 @@ public:
|
|||
|
||||
void setMessage(const QString& in);
|
||||
QString getMessage();
|
||||
void setAlert(const QString& in);
|
||||
QString getAlert();
|
||||
|
||||
virtual void store(QJsonObject& json);
|
||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "item.h"
|
||||
#include "../sensors/sensors.h"
|
||||
#include "../sensors/sensor.h"
|
||||
#include "../microcontroller.h"
|
||||
|
||||
#include <QTimer>
|
||||
|
|
|
|||
43
src/items/systemitem.cpp
Normal file
43
src/items/systemitem.cpp
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
#include "systemitem.h"
|
||||
#include <QProcess>
|
||||
|
||||
void SystemItem::setValue(uint8_t value)
|
||||
{
|
||||
QProcess::execute(value ? onCommand_ : offCommand_);
|
||||
}
|
||||
|
||||
SystemItem::SystemItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent):
|
||||
Item(itemIdIn, name, value, parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
SystemItem::SystemItem(const ItemData& itemData, QObject *parent):
|
||||
Item(itemData, parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void SystemItem::setOnCommand(const QString& in)
|
||||
{
|
||||
onCommand_ = in;
|
||||
}
|
||||
|
||||
void SystemItem::setOffCommand(const QString& in)
|
||||
{
|
||||
offCommand_ = in;
|
||||
}
|
||||
|
||||
void SystemItem::store(QJsonObject& json)
|
||||
{
|
||||
json["Type"] = "System";
|
||||
Item::store(json);
|
||||
json["OnCommand"] = onCommand_;
|
||||
json["OffCommand"] = offCommand_;
|
||||
}
|
||||
void SystemItem::load(const QJsonObject& json, const bool preserve)
|
||||
{
|
||||
Item::load(json,preserve);
|
||||
onCommand_ = json["OnCommand"].toString("");
|
||||
offCommand_ = json["OffCommand"].toString("");
|
||||
}
|
||||
34
src/items/systemitem.h
Normal file
34
src/items/systemitem.h
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
#ifndef SYSTEMITEM_H
|
||||
#define SYSTEMITEM_H
|
||||
|
||||
|
||||
#include "item.h"
|
||||
|
||||
class SystemItem : public Item
|
||||
{
|
||||
Q_OBJECT
|
||||
private:
|
||||
|
||||
QString onCommand_;
|
||||
QString offCommand_;
|
||||
|
||||
public:
|
||||
|
||||
virtual void setValue(uint8_t value);
|
||||
|
||||
public:
|
||||
|
||||
SystemItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr);
|
||||
SystemItem(const ItemData& itemData, QObject *parent = nullptr);
|
||||
~SystemItem() = default;
|
||||
|
||||
void setOnCommand(const QString& in);
|
||||
void setOffCommand(const QString& in);
|
||||
QString getOnCommand(){return onCommand_;}
|
||||
QString getOffCommand(){return offCommand_;}
|
||||
|
||||
virtual void store(QJsonObject& json);
|
||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||
};
|
||||
|
||||
#endif // SYSTEMITEM_H
|
||||
Loading…
Add table
Add a link
Reference in a new issue