Finish lerge refactor of systems
This commit is contained in:
parent
6d742e60db
commit
913d7df56d
36 changed files with 614 additions and 634 deletions
|
|
@ -3,11 +3,12 @@
|
|||
AuxItem::AuxItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8_t value,
|
||||
QObject* parent): Item(itemIdIn, name, value, parent), micro_(micro)
|
||||
{
|
||||
|
||||
type_ = ITEM_VALUE_UINT;
|
||||
}
|
||||
|
||||
void AuxItem::enactValue(uint8_t value)
|
||||
{
|
||||
assert(micro_);
|
||||
micro_->setAuxPwm(value);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ protected:
|
|||
virtual void enactValue(uint8_t value) override;
|
||||
|
||||
public:
|
||||
AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "",
|
||||
AuxItem(Microcontroller* micro = nullptr, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "",
|
||||
uint8_t value = 0, QObject* parent = nullptr);
|
||||
|
||||
virtual void store(QJsonObject& json) override;
|
||||
|
|
|
|||
14
src/items/fixeditemsource.cpp
Normal file
14
src/items/fixeditemsource.cpp
Normal file
|
|
@ -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});
|
||||
}
|
||||
22
src/items/fixeditemsource.h
Normal file
22
src/items/fixeditemsource.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef FIXEDITEMSOURCE_H
|
||||
#define FIXEDITEMSOURCE_H
|
||||
|
||||
#include "itemsource.h"
|
||||
#include "poweritem.h"
|
||||
#include "rgbitem.h"
|
||||
#include "auxitem.h"
|
||||
#include "src/microcontroller.h"
|
||||
|
||||
class FixedItemSource : public ItemSource
|
||||
{
|
||||
Q_OBJECT
|
||||
std::shared_ptr<PowerItem> powerItem;
|
||||
std::shared_ptr<RgbItem> rgbItem;
|
||||
std::shared_ptr<AuxItem> auxItem;
|
||||
|
||||
public:
|
||||
explicit FixedItemSource(Microcontroller* micro, QObject *parent = nullptr);
|
||||
virtual void refresh() override;
|
||||
};
|
||||
|
||||
#endif // FIXEDITEMSOURCE_H
|
||||
|
|
@ -7,10 +7,14 @@
|
|||
#include "relay.h"
|
||||
#include "messageitem.h"
|
||||
#include "systemitem.h"
|
||||
#include "auxitem.h"
|
||||
#include "poweritem.h"
|
||||
#include "rgbitem.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -48,9 +52,47 @@ void ItemData::load(const QJsonObject &json, const bool preserve)
|
|||
{
|
||||
name_ = json["Name"].toString(name_);
|
||||
itemId_ = static_cast<uint32_t>(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
|
||||
|
||||
|
|
@ -96,7 +138,8 @@ void Item::load(const QJsonObject &json, const bool preserve)
|
|||
if(actorsArray[i].isObject())
|
||||
{
|
||||
std::shared_ptr<Actor> actor = Actor::loadActor(actorsArray[i].toObject());
|
||||
if(actor != nullptr) addActor(actor);
|
||||
if(actor != nullptr)
|
||||
addActor(actor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -109,6 +152,7 @@ void Item::actorSetValue(uint8_t value)
|
|||
|
||||
void Item::setValue(uint8_t value)
|
||||
{
|
||||
qDebug()<<__func__;
|
||||
informValue(value);
|
||||
if(programMode == PROGRAM_MODE_PRIMARY || programMode == PROGRAM_MODE_HEADLESS_PRIMARY)
|
||||
enactValue(value);
|
||||
|
|
@ -116,9 +160,12 @@ void Item::setValue(uint8_t value)
|
|||
|
||||
void Item::informValue(uint8_t value)
|
||||
{
|
||||
value_ = value;
|
||||
valueChanged(value_);
|
||||
updated(*this);
|
||||
if(value_ != value)
|
||||
{
|
||||
value_ = value;
|
||||
valueChanged(value_);
|
||||
updated(*this);
|
||||
}
|
||||
}
|
||||
|
||||
void Item::enactValue(uint8_t value)
|
||||
|
|
@ -135,14 +182,16 @@ void Item::addActor(std::shared_ptr<Actor> actor)
|
|||
connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged);
|
||||
|
||||
std::shared_ptr<SensorActor> sensorActor = std::dynamic_pointer_cast<SensorActor>(actor);
|
||||
if(sensorActor)connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor.get(), &SensorActor::sensorEvent);
|
||||
if(sensorActor)
|
||||
connect(&globalSensors, &SensorStore::sensorChangedState, sensorActor.get(), &SensorActor::sensorEvent);
|
||||
|
||||
std::shared_ptr<Regulator> regulator = std::dynamic_pointer_cast<Regulator>(actor);
|
||||
if(regulator)connect(&globalSensors, &SensorStore::sensorChangedState, regulator.get(), &Regulator::sensorEvent);
|
||||
if(regulator)
|
||||
connect(&globalSensors, &SensorStore::sensorChangedState, regulator.get(), &Regulator::sensorEvent);
|
||||
|
||||
std::shared_ptr<PolynomalActor> polynomalActor = std::dynamic_pointer_cast<PolynomalActor>(actor);
|
||||
if(polynomalActor != nullptr )connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor.get(),
|
||||
&PolynomalActor::sensorEvent);
|
||||
if(polynomalActor != nullptr )
|
||||
connect(&globalSensors, &SensorStore::sensorChangedState, polynomalActor.get(), &PolynomalActor::sensorEvent);
|
||||
}
|
||||
|
||||
bool Item::removeActor(std::shared_ptr<Actor> actor)
|
||||
|
|
@ -189,6 +238,14 @@ void Item::setActorsActive(bool in)
|
|||
in ? actors_[i]->makeActive() : actors_[i]->makeInactive();
|
||||
}
|
||||
|
||||
void Item::mergeLoaded(Item& item)
|
||||
{
|
||||
name_ = item.name_;
|
||||
actors_.clear();
|
||||
for(std::shared_ptr<Actor> actor : item.actors_)
|
||||
addActor(actor);
|
||||
}
|
||||
|
||||
std::shared_ptr<Item> Item::loadItem(const QJsonObject& json)
|
||||
{
|
||||
std::shared_ptr<Item> newItem = nullptr;
|
||||
|
|
@ -206,8 +263,21 @@ std::shared_ptr<Item> Item::loadItem(const QJsonObject& json)
|
|||
}
|
||||
else if(json["Type"].toString("") == "Aux")
|
||||
{
|
||||
newItem = std::shared_ptr<AuxItem>(new AuxItem);
|
||||
}
|
||||
else if(json["Type"].toString("") == "Power")
|
||||
{
|
||||
newItem = std::shared_ptr<PowerItem>(new PowerItem);
|
||||
}
|
||||
else if(json["Type"].toString("") == "Rgb")
|
||||
{
|
||||
newItem = std::shared_ptr<RgbItem>(new RgbItem);
|
||||
}
|
||||
if(newItem)
|
||||
{
|
||||
newItem->load(json);
|
||||
newItem->setLoaded(true);
|
||||
}
|
||||
return newItem;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,15 +8,29 @@
|
|||
|
||||
class Actor;
|
||||
|
||||
typedef enum {
|
||||
ITEM_VALUE_BOOL = 0,
|
||||
ITEM_VALUE_UINT,
|
||||
ITEM_VALUE_NO_VALUE
|
||||
} item_value_type_t;
|
||||
|
||||
class ItemData
|
||||
{
|
||||
protected:
|
||||
QString name_;
|
||||
uint8_t value_;
|
||||
uint32_t itemId_;
|
||||
bool loaded_;
|
||||
bool hidden_;
|
||||
item_value_type_t type_;
|
||||
|
||||
public:
|
||||
ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0);
|
||||
ItemData(uint32_t itemIdIn = QRandomGenerator::global()->generate(),
|
||||
QString name = "Item",
|
||||
uint8_t value = 0,
|
||||
bool loaded = false,
|
||||
bool hidden = false,
|
||||
item_value_type_t type = ITEM_VALUE_BOOL);
|
||||
|
||||
inline bool operator==(const ItemData& in) const
|
||||
{
|
||||
|
|
@ -29,8 +43,14 @@ public:
|
|||
|
||||
uint32_t id() 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);
|
||||
|
|
@ -72,6 +92,7 @@ public:
|
|||
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);
|
||||
|
|
|
|||
38
src/items/itemloadersource.cpp
Normal file
38
src/items/itemloadersource.cpp
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
#include "itemloadersource.h"
|
||||
|
||||
#include <QJsonArray>
|
||||
|
||||
ItemLoaderSource::ItemLoaderSource(const QJsonObject& json, QObject *parent):
|
||||
ItemSource{parent},
|
||||
json(json)
|
||||
{
|
||||
}
|
||||
|
||||
void ItemLoaderSource::refresh()
|
||||
{
|
||||
std::vector<std::shared_ptr<Item>> 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<Item> newItem = Item::loadItem(itemObject);
|
||||
if(newItem)
|
||||
{
|
||||
items.push_back(newItem);
|
||||
qDebug()<<"Loaded item"<<newItem->getName();
|
||||
}
|
||||
}
|
||||
gotItems(items);
|
||||
}
|
||||
|
||||
void ItemLoaderSource::updateJson(const QJsonObject& json)
|
||||
{
|
||||
this->json = json;
|
||||
}
|
||||
|
||||
ItemLoaderSource::~ItemLoaderSource()
|
||||
{}
|
||||
|
||||
21
src/items/itemloadersource.h
Normal file
21
src/items/itemloadersource.h
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
#ifndef ITEMLOADERSOURCE_H
|
||||
#define ITEMLOADERSOURCE_H
|
||||
|
||||
#include <QJsonObject>
|
||||
|
||||
#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
|
||||
|
|
@ -18,6 +18,7 @@ public slots:
|
|||
|
||||
signals:
|
||||
void gotItems(std::vector<std::shared_ptr<Item>> items, bool inform = true);
|
||||
void requestReplaceItems(std::vector<std::shared_ptr<Item>> items);
|
||||
void updateItems(std::vector<ItemData> items, bool inform = true);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -21,15 +21,15 @@ void ItemStore::addItem(std::shared_ptr<Item> item, bool inform)
|
|||
{
|
||||
items_.push_back(std::shared_ptr<Item>(item));
|
||||
connect(item.get(), &Item::updated, this, &ItemStore::itemUpdateSlot);
|
||||
qDebug()<<"Item"<<item->getName()<<"added";
|
||||
qDebug()<<"Item"<<item->getName()<<"added"<<(item->getLoaded() ? "from loaded" : "");
|
||||
itemAdded(std::weak_ptr<Item>(items_.back()));
|
||||
}
|
||||
else if(item->getValue() != matched->getValue())
|
||||
else
|
||||
{
|
||||
if(inform)
|
||||
matched->informValue(item->getValue());
|
||||
else
|
||||
matched->setValue(item->getValue());
|
||||
if(item->getLoaded())
|
||||
matched->mergeLoaded(*item);
|
||||
else if(item->getValue() != matched->getValue())
|
||||
updateItem(*item, inform);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -53,6 +53,19 @@ void ItemStore::removeItem(const ItemData& item)
|
|||
}
|
||||
}
|
||||
|
||||
void ItemStore::replaceItems(const std::vector<std::shared_ptr<Item>>& items)
|
||||
{
|
||||
addItems(items, true);
|
||||
std::vector<ItemData> deletedItems;
|
||||
for(std::shared_ptr<Item> item : items_)
|
||||
{
|
||||
if(std::find_if(items.begin(), items.end(), [item](const std::shared_ptr<Item> 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]);
|
||||
|
|
@ -66,22 +79,25 @@ void ItemStore::updateItems(std::vector<ItemData> items, bool inform)
|
|||
updateItem(item, inform);
|
||||
}
|
||||
|
||||
|
||||
void ItemStore::updateItem(const ItemData& item, bool inform)
|
||||
{
|
||||
for(unsigned i = 0; i < items_.size(); i++ )
|
||||
{
|
||||
if(items_[i]->operator==(item))
|
||||
{
|
||||
if(items_[i]->getValue() != item.getValue())
|
||||
if(items_[i]->hasChanged(item))
|
||||
{
|
||||
if(inform)
|
||||
items_[i]->informValue(item.getValue());
|
||||
else
|
||||
items_[i]->setValue(item.getValue());
|
||||
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"<<items_[i]->getName()<<"updated";
|
||||
itemUpdated(items_[i]);
|
||||
}
|
||||
qDebug()<<"Item"<<items_[i]->getName()<<"updated";
|
||||
itemUpdated(items_[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -98,24 +114,8 @@ void ItemStore::store(QJsonObject& json)
|
|||
json["Items"] = itemsArray;
|
||||
}
|
||||
|
||||
void ItemStore::load(const QJsonObject& json)
|
||||
{
|
||||
const QJsonArray itemsArray(json["Items"].toArray(QJsonArray()));
|
||||
for(int i = 0; i < itemsArray.size(); ++i)
|
||||
{
|
||||
if(!itemsArray[i].isObject())
|
||||
continue;
|
||||
|
||||
const QJsonObject itemObject = itemsArray[i].toObject();
|
||||
std::shared_ptr<Item> newItem = Item::loadItem(itemObject);
|
||||
if(newItem)
|
||||
addItem(newItem);
|
||||
}
|
||||
}
|
||||
|
||||
void ItemStore::itemUpdateSlot(ItemData data)
|
||||
{
|
||||
qDebug()<<__func__;
|
||||
for(std::shared_ptr<Item>& item: items_)
|
||||
{
|
||||
if(*item == data)
|
||||
|
|
@ -138,6 +138,7 @@ void ItemStore::registerItemSource(ItemSource* source)
|
|||
qDebug()<<__func__<<typeid(*source).name();
|
||||
connect(source, &ItemSource::gotItems, this, &ItemStore::addItems);
|
||||
connect(source, &ItemSource::updateItems, this, &ItemStore::updateItems);
|
||||
connect(source, &ItemSource::requestReplaceItems, this, &ItemStore::replaceItems);
|
||||
connect(this, &ItemStore::sigRefresh, source, &ItemSource::refresh);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ public:
|
|||
|
||||
void registerItemSource(ItemSource* source);
|
||||
void store(QJsonObject &json);
|
||||
void load(const QJsonObject &json);
|
||||
|
||||
void clear();
|
||||
|
||||
|
|
@ -42,6 +41,7 @@ public slots:
|
|||
void removeItem(const ItemData& item);
|
||||
void addItem(std::shared_ptr<Item> item, bool inform = true);
|
||||
void addItems(const std::vector<std::shared_ptr<Item>>& itemsIn, bool inform = true);
|
||||
void replaceItems(const std::vector<std::shared_ptr<Item>>& items);
|
||||
void updateItems(std::vector<ItemData> items, bool inform = true);
|
||||
void updateItem(const ItemData& item, bool inform = true);
|
||||
void refresh();
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObjec
|
|||
Item(itemIdIn, name, value, parent)
|
||||
{
|
||||
alertSound.setVolume(1.0);
|
||||
type_ = ITEM_VALUE_NO_VALUE;
|
||||
}
|
||||
|
||||
MessageItem::MessageItem(const ItemData& itemData, QObject *parent):
|
||||
|
|
|
|||
|
|
@ -3,11 +3,13 @@
|
|||
#include <QApplication>
|
||||
#include <QDebug>
|
||||
|
||||
PowerItem::PowerItem(uint32_t itemIdIn, QString name, uint8_t value, QObject* parent): Item(itemIdIn, name, value,
|
||||
parent)
|
||||
PowerItem::PowerItem(uint32_t itemIdIn, QString name, uint8_t value, QObject* parent):
|
||||
Item(itemIdIn, name, value, parent)
|
||||
{
|
||||
stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true));
|
||||
PowerItem::setValue(true);
|
||||
hidden_ = true;
|
||||
type_ = ITEM_VALUE_NO_VALUE;
|
||||
}
|
||||
|
||||
void PowerItem::enactValue(uint8_t value)
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ protected:
|
|||
virtual void enactValue(uint8_t value) override;
|
||||
|
||||
public:
|
||||
PowerItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0,
|
||||
PowerItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Power", uint8_t value = 0,
|
||||
QObject* parent = nullptr);
|
||||
void emmitSensor()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -9,11 +9,11 @@ Relay::Relay(uint8_t id, QString name, uint16_t address, bool state, QObject* pa
|
|||
id_(id), address_(address)
|
||||
{
|
||||
itemId_ = address | ((uint32_t)id << 16);
|
||||
qDebug()<<"Relay "<<id_<<"Name "<<name<<" id "<<itemId_<<" state "<<state<<" addr: "<<address;
|
||||
}
|
||||
|
||||
void Relay::enactValue(uint8_t value)
|
||||
{
|
||||
qDebug()<<"Relay"<<__func__<<micro_;
|
||||
if(micro_)
|
||||
{
|
||||
if(value)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ RgbItem::RgbItem(Microcontroller* micro, uint32_t itemIdIn, QString name, uint8
|
|||
|
||||
void RgbItem::enactValue(uint8_t value)
|
||||
{
|
||||
assert(micro_);
|
||||
value ? micro_->rgbOn() : micro_->rgbOff();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ protected:
|
|||
virtual void enactValue(uint8_t value) override;
|
||||
|
||||
public:
|
||||
RgbItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "",
|
||||
RgbItem(Microcontroller* micro = nullptr, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "",
|
||||
uint8_t value = 0, QObject* parent = nullptr);
|
||||
|
||||
virtual void store(QJsonObject& json) override;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue