Compare commits
10 Commits
954eec754c
...
master
Author | SHA1 | Date | |
---|---|---|---|
d8471789b7 | |||
a301bdbaa7 | |||
260334ef35 | |||
146c33673a | |||
a00c8a52f8 | |||
0acf6c7fc4 | |||
03c2be7977 | |||
fa45072998 | |||
a6aad07f05 | |||
09b23fc296 |
174
SHinterface.pro
174
SHinterface.pro
@ -25,130 +25,130 @@ QMAKE_CXXFLAGS += -std=c++17 -O2
|
|||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
src/actors/factoractor.cpp \
|
src/actors/factoractor.cpp \
|
||||||
src/actors/polynomalactor.cpp \
|
src/actors/polynomalactor.cpp \
|
||||||
src/broadcast.cpp \
|
src/broadcast.cpp \
|
||||||
src/iomuliplexer.cpp \
|
src/iomuliplexer.cpp \
|
||||||
src/items/messageitem.cpp \
|
src/items/messageitem.cpp \
|
||||||
src/items/systemitem.cpp \
|
src/items/systemitem.cpp \
|
||||||
src/ui/actorwidgets/factoractorwidget.cpp \
|
src/ui/actorwidgets/factoractorwidget.cpp \
|
||||||
src/ui/itemcreationdialog.cpp \
|
src/ui/itemcreationdialog.cpp \
|
||||||
src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \
|
src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \
|
||||||
src/mainobject.cpp \
|
src/mainobject.cpp \
|
||||||
src/apgetconnected.cpp \
|
src/apgetconnected.cpp \
|
||||||
src/ui/actorwidgets/polynomalactorwidget.cpp \
|
src/ui/actorwidgets/polynomalactorwidget.cpp \
|
||||||
src/ui/actorwidgets/sensoractorwidget.cpp \
|
src/ui/actorwidgets/sensoractorwidget.cpp \
|
||||||
src/ui/actorwidgets/alarmwidget.cpp \
|
src/ui/actorwidgets/alarmwidget.cpp \
|
||||||
src/ui/actorwidgets/timeractorwidget.cpp \
|
src/ui/actorwidgets/timeractorwidget.cpp \
|
||||||
src/ui/itemsettingswidgets/relayitemsettingswidget.cpp \
|
src/ui/itemsettingswidgets/relayitemsettingswidget.cpp \
|
||||||
src/ui/itemsettingswidgets/systemitemsettingswidget.cpp \
|
src/ui/itemsettingswidgets/systemitemsettingswidget.cpp \
|
||||||
src/ui/itemwidget.cpp \
|
src/ui/itemwidget.cpp \
|
||||||
src/ui/itemsettingsdialog.cpp \
|
src/ui/itemsettingsdialog.cpp \
|
||||||
src/ui/itemscrollbox.cpp \
|
src/ui/itemscrollbox.cpp \
|
||||||
src/items/poweritem.cpp \
|
src/items/poweritem.cpp \
|
||||||
src/ui/actorwidgets/regulatorwdiget.cpp
|
src/ui/actorwidgets/regulatorwdiget.cpp
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
src/ui/actorsettingsdialog.cpp \
|
src/ui/actorsettingsdialog.cpp \
|
||||||
src/ui/mainwindow.cpp \
|
src/ui/mainwindow.cpp \
|
||||||
src/ui/sensorlistwidget.cpp
|
src/ui/sensorlistwidget.cpp
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
src/actors/actor.cpp \
|
src/actors/actor.cpp \
|
||||||
src/actors/sensoractor.cpp \
|
src/actors/sensoractor.cpp \
|
||||||
src/actors/alarmtime.cpp \
|
src/actors/alarmtime.cpp \
|
||||||
src/actors/regulator.cpp \
|
src/actors/regulator.cpp \
|
||||||
src/actors/timeractor.cpp
|
src/actors/timeractor.cpp
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
src/sensors/sensor.cpp \
|
src/sensors/sensor.cpp \
|
||||||
src/sensors/speakersensor.cpp \
|
src/sensors/speakersensor.cpp \
|
||||||
src/sensors/sunsensor.cpp \
|
src/sensors/sunsensor.cpp \
|
||||||
src/sensors/ocupancysensor.cpp
|
src/sensors/ocupancysensor.cpp
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
src/items/relay.cpp \
|
src/items/relay.cpp \
|
||||||
src/items/item.cpp \
|
src/items/item.cpp \
|
||||||
src/items/itemstore.cpp \
|
src/items/itemstore.cpp \
|
||||||
src/items/auxitem.cpp \
|
src/items/auxitem.cpp \
|
||||||
src/items/rgbitem.cpp
|
src/items/rgbitem.cpp
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
src/alarmactions.cpp \
|
src/alarmactions.cpp \
|
||||||
src/main.cpp \
|
src/main.cpp \
|
||||||
src/microcontroller.cpp \
|
src/microcontroller.cpp \
|
||||||
src/sun.cpp
|
src/sun.cpp
|
||||||
|
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/actors/factoractor.h \
|
src/actors/factoractor.h \
|
||||||
src/actors/polynomalactor.h \
|
src/actors/polynomalactor.h \
|
||||||
src/broadcast.h \
|
src/broadcast.h \
|
||||||
src/iomuliplexer.h \
|
src/iomuliplexer.h \
|
||||||
src/items/messageitem.h \
|
src/items/messageitem.h \
|
||||||
src/items/systemitem.h \
|
src/items/systemitem.h \
|
||||||
src/ui/actorwidgets/factoractorwidget.h \
|
src/ui/actorwidgets/factoractorwidget.h \
|
||||||
src/ui/itemcreationdialog.h \
|
src/ui/itemcreationdialog.h \
|
||||||
src/ui/itemsettingswidgets/messageitemsettingswidget.h \
|
src/ui/itemsettingswidgets/messageitemsettingswidget.h \
|
||||||
src/mainobject.h \
|
src/mainobject.h \
|
||||||
src/apgetconnected.h \
|
src/apgetconnected.h \
|
||||||
src/ui/actorwidgets/alarmwidget.h \
|
src/ui/actorwidgets/alarmwidget.h \
|
||||||
src/ui/actorwidgets/polynomalactorwidget.h \
|
src/ui/actorwidgets/polynomalactorwidget.h \
|
||||||
src/ui/actorwidgets/sensoractorwidget.h \
|
src/ui/actorwidgets/sensoractorwidget.h \
|
||||||
src/ui/actorwidgets/timeractorwidget.h \
|
src/ui/actorwidgets/timeractorwidget.h \
|
||||||
src/ui/itemsettingswidgets/relayitemsettingswidget.h \
|
src/ui/itemsettingswidgets/relayitemsettingswidget.h \
|
||||||
src/ui/itemsettingswidgets/systemitemsettingswidget.h \
|
src/ui/itemsettingswidgets/systemitemsettingswidget.h \
|
||||||
src/ui/itemwidget.h \
|
src/ui/itemwidget.h \
|
||||||
src/ui/itemsettingsdialog.h \
|
src/ui/itemsettingsdialog.h \
|
||||||
src/ui/itemscrollbox.h \
|
src/ui/itemscrollbox.h \
|
||||||
src/items/poweritem.h \
|
src/items/poweritem.h \
|
||||||
src/ui/actorwidgets/regulatorwdiget.h
|
src/ui/actorwidgets/regulatorwdiget.h
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/ui/actorsettingsdialog.h \
|
src/ui/actorsettingsdialog.h \
|
||||||
src/ui/mainwindow.h \
|
src/ui/mainwindow.h \
|
||||||
src/ui/sensorlistwidget.h
|
src/ui/sensorlistwidget.h
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/actors/actor.h \
|
src/actors/actor.h \
|
||||||
src/actors/alarmtime.h \
|
src/actors/alarmtime.h \
|
||||||
src/actors/sensoractor.h \
|
src/actors/sensoractor.h \
|
||||||
src/actors/regulator.h \
|
src/actors/regulator.h \
|
||||||
src/actors/timeractor.h
|
src/actors/timeractor.h
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/sensors/sensor.h \
|
src/sensors/sensor.h \
|
||||||
src/sensors/speakersensor.h \
|
src/sensors/speakersensor.h \
|
||||||
src/sensors/sunsensor.h \
|
src/sensors/sunsensor.h \
|
||||||
src/sensors/ocupancysensor.h
|
src/sensors/ocupancysensor.h
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/items/relay.h \
|
src/items/relay.h \
|
||||||
src/items/item.h \
|
src/items/item.h \
|
||||||
src/items/itemstore.h \
|
src/items/itemstore.h \
|
||||||
src/items/auxitem.h \
|
src/items/auxitem.h \
|
||||||
src/items/rgbitem.h
|
src/items/rgbitem.h
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/alarmactions.h \
|
src/alarmactions.h \
|
||||||
src/microcontroller.h \
|
src/microcontroller.h \
|
||||||
src/sun.h
|
src/sun.h
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
src/ui/actorwidgets/factoractorwidget.ui \
|
src/ui/actorwidgets/factoractorwidget.ui \
|
||||||
src/ui/itemcreationdialog.ui \
|
src/ui/itemcreationdialog.ui \
|
||||||
src/ui/itemsettingswidgets/messageitemsettingswidget.ui \
|
src/ui/itemsettingswidgets/messageitemsettingswidget.ui \
|
||||||
src/ui/actorsettingsdialog.ui \
|
src/ui/actorsettingsdialog.ui \
|
||||||
src/ui/actorwidgets/polynomalactorwidget.ui \
|
src/ui/actorwidgets/polynomalactorwidget.ui \
|
||||||
src/ui/itemsettingswidgets/relayitemsettingswidget.ui \
|
src/ui/itemsettingswidgets/relayitemsettingswidget.ui \
|
||||||
src/ui/itemsettingswidgets/systemitemsettingswidget.ui \
|
src/ui/itemsettingswidgets/systemitemsettingswidget.ui \
|
||||||
src/ui/mainwindow.ui \
|
src/ui/mainwindow.ui \
|
||||||
src/ui/relayscrollbox.ui \
|
src/ui/relayscrollbox.ui \
|
||||||
src/ui/actorwidgets/sensoractorwidget.ui \
|
src/ui/actorwidgets/sensoractorwidget.ui \
|
||||||
src/ui/actorwidgets/alarmwidget.ui \
|
src/ui/actorwidgets/alarmwidget.ui \
|
||||||
src/ui/actorwidgets/timeractorwidget.ui \
|
src/ui/actorwidgets/timeractorwidget.ui \
|
||||||
src/ui/itemsettingsdialog.ui \
|
src/ui/itemsettingsdialog.ui \
|
||||||
src/ui/itemwidget.ui \
|
src/ui/itemwidget.ui \
|
||||||
src/ui/actorwidgets/regulatorwdiget.ui
|
src/ui/actorwidgets/regulatorwdiget.ui
|
||||||
|
|
||||||
android:FORMS += src/ui/mainwindow-android.ui
|
android:FORMS += src/ui/mainwindow-android.ui
|
||||||
|
|
||||||
|
@ -19,102 +19,102 @@ Actor::~Actor()
|
|||||||
|
|
||||||
void Actor::performAction()
|
void Actor::performAction()
|
||||||
{
|
{
|
||||||
if(active)
|
if(active)
|
||||||
{
|
{
|
||||||
sigValue(triggerValue);
|
sigValue(triggerValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::makeActive()
|
void Actor::makeActive()
|
||||||
{
|
{
|
||||||
active = true;
|
active = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Actor::makeInactive()
|
void Actor::makeInactive()
|
||||||
{
|
{
|
||||||
active = false;
|
active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Actor::actionName()
|
QString Actor::actionName()
|
||||||
{
|
{
|
||||||
QString string;
|
QString string;
|
||||||
if(triggerValue == 0 ) string = "off";
|
if(triggerValue == 0 ) string = "off";
|
||||||
else if(triggerValue == 1 ) string = "on";
|
else if(triggerValue == 1 ) string = "on";
|
||||||
else string = "value to " + QString::number(triggerValue);
|
else string = "value to " + QString::number(triggerValue);
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::setActive(uint8_t state)
|
void Actor::setActive(uint8_t state)
|
||||||
{
|
{
|
||||||
state ? makeActive() : makeInactive();
|
state ? makeActive() : makeInactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Actor::isActive()
|
bool Actor::isActive()
|
||||||
{
|
{
|
||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Actor::isExausted()
|
bool Actor::isExausted()
|
||||||
{
|
{
|
||||||
return exausted;
|
return exausted;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::store(QJsonObject& json)
|
void Actor::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
Item::store(json);
|
Item::store(json);
|
||||||
json["Active"] = active;
|
json["Active"] = active;
|
||||||
json["Exausted"] = exausted;
|
json["Exausted"] = exausted;
|
||||||
json["TriggerValue"] = triggerValue;
|
json["TriggerValue"] = triggerValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::load(const QJsonObject& json, const bool preserve)
|
void Actor::load(const QJsonObject& json, const bool preserve)
|
||||||
{
|
{
|
||||||
Item::load(json, preserve);
|
Item::load(json, preserve);
|
||||||
active = json["Active"].toBool();
|
active = json["Active"].toBool();
|
||||||
exausted = json["Exausted"].toBool();
|
exausted = json["Exausted"].toBool();
|
||||||
triggerValue = json["TriggerValue"].toInt();
|
triggerValue = json["TriggerValue"].toInt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::setTriggerValue(uint8_t value)
|
void Actor::setTriggerValue(uint8_t value)
|
||||||
{
|
{
|
||||||
triggerValue=value;
|
triggerValue=value;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Actor::getTriggerValue()
|
uint8_t Actor::getTriggerValue()
|
||||||
{
|
{
|
||||||
return triggerValue;
|
return triggerValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::onValueChanged(uint8_t value)
|
void Actor::onValueChanged(uint8_t value)
|
||||||
{
|
{
|
||||||
|
(void)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Actor> Actor::createActor(const QString& type)
|
std::shared_ptr<Actor> Actor::createActor(const QString& type)
|
||||||
{
|
{
|
||||||
std::shared_ptr<Actor> actor;
|
std::shared_ptr<Actor> actor;
|
||||||
if(type == "Alarm") actor = std::shared_ptr<Actor>(new AlarmTime());
|
if(type == "Alarm") actor = std::shared_ptr<Actor>(new AlarmTime());
|
||||||
else if(type == "Sensor") actor = std::shared_ptr<Actor>(new SensorActor());
|
else if(type == "Sensor") actor = std::shared_ptr<Actor>(new SensorActor());
|
||||||
else if(type == "Timer") actor = std::shared_ptr<Actor>(new TimerActor());
|
else if(type == "Timer") actor = std::shared_ptr<Actor>(new TimerActor());
|
||||||
else if(type == "Regulator") actor = std::shared_ptr<Actor>(new Regulator());
|
else if(type == "Regulator") actor = std::shared_ptr<Actor>(new Regulator());
|
||||||
else if(type == "Polynomal") actor = std::shared_ptr<Actor>(new PolynomalActor());
|
else if(type == "Polynomal") actor = std::shared_ptr<Actor>(new PolynomalActor());
|
||||||
else if(type == "MultiFactor") actor = std::shared_ptr<Actor>(new MultiFactorActor());
|
else if(type == "MultiFactor") actor = std::shared_ptr<Actor>(new MultiFactorActor());
|
||||||
else if(type == "Actor") actor = std::shared_ptr<Actor>(new Actor());
|
else if(type == "Actor") actor = std::shared_ptr<Actor>(new Actor());
|
||||||
return actor;
|
return actor;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Actor> Actor::loadActor(const QJsonObject &json)
|
std::shared_ptr<Actor> Actor::loadActor(const QJsonObject &json)
|
||||||
{
|
{
|
||||||
QString type = json["Type"].toString("Actor");
|
QString type = json["Type"].toString("Actor");
|
||||||
std::shared_ptr<Actor> actor = createActor(type);
|
std::shared_ptr<Actor> actor = createActor(type);
|
||||||
if(actor) actor->load(json);
|
if(actor) actor->load(json);
|
||||||
return actor;
|
return actor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actor::setValue(uint8_t value)
|
void Actor::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
Item::setValue(value);
|
Item::setValue(value);
|
||||||
setActive(value);
|
setActive(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,46 +9,46 @@
|
|||||||
|
|
||||||
class Actor : public Item
|
class Actor : public Item
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
uint8_t triggerValue = 0;
|
uint8_t triggerValue = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool active = true;
|
bool active = true;
|
||||||
bool exausted = false;
|
bool exausted = false;
|
||||||
|
|
||||||
void performAction();
|
void performAction();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void sigValue(uint8_t value);
|
void sigValue(uint8_t value);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
virtual void makeActive();
|
virtual void makeActive();
|
||||||
virtual void makeInactive();
|
virtual void makeInactive();
|
||||||
virtual void setActive(uint8_t state);
|
virtual void setActive(uint8_t state);
|
||||||
virtual void onValueChanged(uint8_t state);
|
virtual void onValueChanged(uint8_t state);
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Actor(QObject* parent = nullptr);
|
Actor(QObject* parent = nullptr);
|
||||||
virtual ~Actor();
|
virtual ~Actor();
|
||||||
bool isExausted();
|
bool isExausted();
|
||||||
|
|
||||||
virtual QString actionName();
|
virtual QString actionName();
|
||||||
|
|
||||||
bool isActive();
|
bool isActive();
|
||||||
void setTriggerValue(uint8_t value);
|
void setTriggerValue(uint8_t value);
|
||||||
|
|
||||||
uint8_t getTriggerValue();
|
uint8_t getTriggerValue();
|
||||||
|
|
||||||
static std::shared_ptr<Actor> createActor(const QString& type);
|
static std::shared_ptr<Actor> createActor(const QString& type);
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||||
static std::shared_ptr<Actor> loadActor(const QJsonObject& json);
|
static std::shared_ptr<Actor> loadActor(const QJsonObject& json);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ACTOR_H
|
#endif // ACTOR_H
|
||||||
|
@ -2,132 +2,132 @@
|
|||||||
|
|
||||||
AlarmTime::AlarmTime(const QDateTime time, QObject *parent) : Actor(parent), time_(time)
|
AlarmTime::AlarmTime(const QDateTime time, QObject *parent) : Actor(parent), time_(time)
|
||||||
{
|
{
|
||||||
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
|
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
|
||||||
timer.setInterval(1000);
|
timer.setInterval(1000);
|
||||||
run();
|
run();
|
||||||
}
|
}
|
||||||
|
|
||||||
AlarmTime::~AlarmTime()
|
AlarmTime::~AlarmTime()
|
||||||
{
|
{
|
||||||
makeInactive();
|
makeInactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmTime::run()
|
void AlarmTime::run()
|
||||||
{
|
{
|
||||||
makeInactive();
|
makeInactive();
|
||||||
|
|
||||||
active = true;
|
active = true;
|
||||||
timer.start();
|
timer.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmTime::makeActive()
|
void AlarmTime::makeActive()
|
||||||
{
|
{
|
||||||
run();
|
run();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString AlarmTime::getName() const
|
QString AlarmTime::getName() const
|
||||||
{
|
{
|
||||||
if(name_.size() > 0)return name_;
|
if(name_.size() > 0)return name_;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString string;
|
QString string;
|
||||||
string = "Alarm: ";
|
string = "Alarm: ";
|
||||||
if(repeat_ == REPEAT_DAILY)
|
if(repeat_ == REPEAT_DAILY)
|
||||||
{
|
{
|
||||||
string.append("daily ");
|
string.append("daily ");
|
||||||
string.append(time_.toString("HH:mm"));
|
string.append(time_.toString("HH:mm"));
|
||||||
}
|
}
|
||||||
else if(repeat_ == REPEAT_WEEKLY)
|
else if(repeat_ == REPEAT_WEEKLY)
|
||||||
{
|
{
|
||||||
string.append("weekly ");
|
string.append("weekly ");
|
||||||
string.append(time_.toString("ddd HH:mm"));
|
string.append(time_.toString("ddd HH:mm"));
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(repeat_ == REPEAT_MONTHLY)
|
else if(repeat_ == REPEAT_MONTHLY)
|
||||||
{
|
{
|
||||||
string.append("monthly ");
|
string.append("monthly ");
|
||||||
string.append(time_.toString("dd HH:mm"));
|
string.append(time_.toString("dd HH:mm"));
|
||||||
}
|
}
|
||||||
else if(repeat_ == REPEAT_YEARLY)
|
else if(repeat_ == REPEAT_YEARLY)
|
||||||
{
|
{
|
||||||
string.append("yearly ");
|
string.append("yearly ");
|
||||||
string.append(time_.toString("dd.mm HH:mm"));
|
string.append(time_.toString("dd.mm HH:mm"));
|
||||||
|
|
||||||
}
|
}
|
||||||
else string.append(time_.toString("dd.mm.yyyy HH:mm"));
|
else string.append(time_.toString("dd.mm.yyyy HH:mm"));
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmTime::setRepeat(const uint8_t repeat)
|
void AlarmTime::setRepeat(const uint8_t repeat)
|
||||||
{
|
{
|
||||||
repeat_=repeat;
|
repeat_ = repeat;
|
||||||
exausted = false;
|
exausted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t AlarmTime::getRepeat()
|
uint8_t AlarmTime::getRepeat()
|
||||||
{
|
{
|
||||||
return repeat_;
|
return repeat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDateTime AlarmTime::getDateTime()
|
QDateTime AlarmTime::getDateTime()
|
||||||
{
|
{
|
||||||
return time_;
|
return time_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmTime::makeInactive()
|
void AlarmTime::makeInactive()
|
||||||
{
|
{
|
||||||
timer.stop();
|
timer.stop();
|
||||||
active = false;
|
active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmTime::doTick()
|
void AlarmTime::doTick()
|
||||||
{
|
{
|
||||||
if(
|
if(
|
||||||
(
|
(
|
||||||
(triggerd_ == false) &&
|
(triggerd_ == false) &&
|
||||||
(time_.date().year() == QDate::currentDate().year() || repeat_ != REPEAT_NEVER) &&
|
(time_.date().year() == QDate::currentDate().year() || repeat_ != REPEAT_NEVER) &&
|
||||||
(time_.date().month() == QDate::currentDate().month() || repeat_ == REPEAT_MONTHLY || repeat_ == REPEAT_DAILY) &&
|
(time_.date().month() == QDate::currentDate().month() || repeat_ == REPEAT_MONTHLY || repeat_ == REPEAT_DAILY) &&
|
||||||
(time_.date().day() == QDate::currentDate().day() || repeat_ == REPEAT_DAILY)
|
(time_.date().day() == QDate::currentDate().day() || repeat_ == REPEAT_DAILY)
|
||||||
)
|
)
|
||||||
||
|
||
|
||||||
(
|
(
|
||||||
(repeat_ == REPEAT_WEEKLY) &&
|
(repeat_ == REPEAT_WEEKLY) &&
|
||||||
(time_.date().dayOfWeek() == QDate::currentDate().dayOfWeek())
|
(time_.date().dayOfWeek() == QDate::currentDate().dayOfWeek())
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if(time_.time().hour() == QTime::currentTime().hour() && time_.time().minute() == QTime::currentTime().minute())
|
if(time_.time().hour() == QTime::currentTime().hour() && time_.time().minute() == QTime::currentTime().minute())
|
||||||
{
|
{
|
||||||
triggerd_=true;
|
triggerd_=true;
|
||||||
performAction();
|
performAction();
|
||||||
if(repeat_ == REPEAT_NEVER) exausted = true;
|
if(repeat_ == REPEAT_NEVER) exausted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( repeat_ != REPEAT_NEVER && time_.time().hour() != QTime::currentTime().hour() ) triggerd_=false;
|
else if( repeat_ != REPEAT_NEVER && time_.time().hour() != QTime::currentTime().hour() ) triggerd_=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmTime::changeTime(const QDateTime& time)
|
void AlarmTime::changeTime(const QDateTime& time)
|
||||||
{
|
{
|
||||||
time_=time;
|
time_=time;
|
||||||
exausted = false;
|
exausted = false;
|
||||||
qDebug()<<"time: "<<time_;
|
qDebug()<<"time: "<<time_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AlarmTime::store(QJsonObject& json)
|
void AlarmTime::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Alarm";
|
json["Type"] = "Alarm";
|
||||||
Actor::store(json);
|
Actor::store(json);
|
||||||
json["Time"] = time_.toString();
|
json["Time"] = time_.toString();
|
||||||
json["Repeat"] = repeat_;
|
json["Repeat"] = repeat_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmTime::load(const QJsonObject& json, const bool preserve)
|
void AlarmTime::load(const QJsonObject& json, const bool preserve)
|
||||||
{
|
{
|
||||||
bool oldActive = isActive();
|
bool oldActive = isActive();
|
||||||
Actor::load(json, preserve);
|
Actor::load(json, preserve);
|
||||||
time_ = QDateTime::fromString(json["Time"].toString(""));
|
time_ = QDateTime::fromString(json["Time"].toString(""));
|
||||||
repeat_ = json["Repeat"].toInt(REPEAT_NEVER);
|
repeat_ = json["Repeat"].toInt(REPEAT_NEVER);
|
||||||
if(oldActive != isActive()) setActive(isActive());
|
if(oldActive != isActive()) setActive(isActive());
|
||||||
}
|
}
|
||||||
|
@ -14,41 +14,41 @@
|
|||||||
|
|
||||||
class AlarmTime : public Actor, public QRunnable
|
class AlarmTime : public Actor, public QRunnable
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
static const uint8_t REPEAT_NEVER = 0;
|
static const uint8_t REPEAT_NEVER = 0;
|
||||||
static const uint8_t REPEAT_DAILY = 1;
|
static const uint8_t REPEAT_DAILY = 1;
|
||||||
static const uint8_t REPEAT_WEEKLY = 2;
|
static const uint8_t REPEAT_WEEKLY = 2;
|
||||||
static const uint8_t REPEAT_MONTHLY = 3;
|
static const uint8_t REPEAT_MONTHLY = 3;
|
||||||
static const uint8_t REPEAT_YEARLY = 4;
|
static const uint8_t REPEAT_YEARLY = 4;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool triggerd_ = false;
|
bool triggerd_ = false;
|
||||||
QDateTime time_;
|
QDateTime time_;
|
||||||
QTimer timer;
|
QTimer timer;
|
||||||
uint8_t repeat_ = REPEAT_NEVER;
|
uint8_t repeat_ = REPEAT_NEVER;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AlarmTime(const QDateTime time = QDateTime::currentDateTime(), QObject *parent = nullptr);
|
explicit AlarmTime(const QDateTime time = QDateTime::currentDateTime(), QObject *parent = nullptr);
|
||||||
~AlarmTime();
|
~AlarmTime();
|
||||||
|
|
||||||
QDateTime getDateTime();
|
QDateTime getDateTime();
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||||
|
|
||||||
uint8_t getRepeat();
|
uint8_t getRepeat();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void run();
|
void run();
|
||||||
virtual void makeActive();
|
virtual void makeActive();
|
||||||
virtual void makeInactive();
|
virtual void makeInactive();
|
||||||
virtual QString getName() const;
|
virtual QString getName() const;
|
||||||
void doTick();
|
void doTick();
|
||||||
void changeTime(const QDateTime& time);
|
void changeTime(const QDateTime& time);
|
||||||
void setRepeat(const uint8_t repeat);
|
void setRepeat(const uint8_t repeat);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ALARMTIME_H
|
#endif // ALARMTIME_H
|
||||||
|
@ -1,79 +1,80 @@
|
|||||||
#include "factoractor.h"
|
#include "factoractor.h"
|
||||||
|
|
||||||
MultiFactorActor::MultiFactorActor(Actor* factorActor, const uint preCancleMin, QObject *parent):
|
MultiFactorActor::MultiFactorActor(Actor* factorActor, const uint preCancleMin, QObject *parent):
|
||||||
Actor(parent),
|
Actor(parent),
|
||||||
factorActor_(factorActor),
|
factorActor_(factorActor),
|
||||||
preCancleMin_(preCancleMin)
|
preCancleMin_(preCancleMin)
|
||||||
{
|
{
|
||||||
activationTime.setMSecsSinceEpoch(0);
|
activationTime.setMSecsSinceEpoch(0);
|
||||||
if(factorActor) connect(factorActor, &Actor::sigValue, this, &MultiFactorActor::factorActorSlot);
|
if(factorActor) connect(factorActor, &Actor::sigValue, this, &MultiFactorActor::factorActorSlot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiFactorActor::factorActorSlot(uint8_t value)
|
void MultiFactorActor::factorActorSlot(uint8_t value)
|
||||||
{
|
{
|
||||||
if(value == factorDirection)
|
if(value == factorDirection)
|
||||||
{
|
{
|
||||||
activationTime = QDateTime::currentDateTime();
|
activationTime = QDateTime::currentDateTime();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiFactorActor::setValue(uint8_t value)
|
void MultiFactorActor::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
if(value)
|
if(value)
|
||||||
{
|
{
|
||||||
QDateTime current = QDateTime::currentDateTime();
|
QDateTime current = QDateTime::currentDateTime();
|
||||||
if(current.addSecs(-preCancleMin_*60) > activationTime )
|
if(current.addSecs(-preCancleMin_*60) > activationTime )
|
||||||
{
|
{
|
||||||
performAction();
|
performAction();
|
||||||
}
|
}
|
||||||
bool exausted = true;
|
exausted = true;
|
||||||
for(size_t i = 0; i < getActors().size(); ++i) if(!getActors()[i]->isExausted()) exausted = false;
|
for(size_t i = 0; i < getActors().size(); ++i) if(!getActors()[i]->isExausted())
|
||||||
}
|
exausted = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString MultiFactorActor::getName() const
|
QString MultiFactorActor::getName() const
|
||||||
{
|
{
|
||||||
if(name_.size() > 0) return name_;
|
if(name_.size() > 0) return name_;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString string;
|
QString string;
|
||||||
string = "Multi Factor \"" + (factorActor_ ? factorActor_->getName() : "NULL") + "\"";
|
string = "Multi Factor \"" + (factorActor_ ? factorActor_->getName() : "NULL") + "\"";
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiFactorActor::setFactorActor(std::shared_ptr<Actor> factorActor)
|
void MultiFactorActor::setFactorActor(std::shared_ptr<Actor> factorActor)
|
||||||
{
|
{
|
||||||
factorActor_=factorActor;
|
factorActor_=factorActor;
|
||||||
connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot);
|
connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiFactorActor::store(QJsonObject &json)
|
void MultiFactorActor::store(QJsonObject &json)
|
||||||
{
|
{
|
||||||
json["Type"] = "MultiFactor";
|
json["Type"] = "MultiFactor";
|
||||||
Actor::store(json);
|
Actor::store(json);
|
||||||
json["PreCancleMinutes"] = static_cast<int>(preCancleMin_);
|
json["PreCancleMinutes"] = static_cast<int>(preCancleMin_);
|
||||||
json["FactorDirection"] = factorDirection;
|
json["FactorDirection"] = factorDirection;
|
||||||
QJsonObject factorActorObject;
|
QJsonObject factorActorObject;
|
||||||
if(factorActor_)
|
if(factorActor_)
|
||||||
{
|
{
|
||||||
factorActor_->store(factorActorObject);
|
factorActor_->store(factorActorObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MultiFactorActor::load(const QJsonObject &json, bool preserve)
|
void MultiFactorActor::load(const QJsonObject &json, bool preserve)
|
||||||
{
|
{
|
||||||
Actor::load(json, preserve);
|
Actor::load(json, preserve);
|
||||||
preCancleMin_ = static_cast<uint>(json["PreCancleMinutes"].toInt(10));
|
preCancleMin_ = static_cast<uint>(json["PreCancleMinutes"].toInt(10));
|
||||||
factorDirection = json["FacotorDirection"].toBool(true);
|
factorDirection = json["FacotorDirection"].toBool(true);
|
||||||
if(json["FactorActor"].isObject())
|
if(json["FactorActor"].isObject())
|
||||||
{
|
{
|
||||||
factorActor_ = Actor::loadActor(json["FactorActor"].toObject());
|
factorActor_ = Actor::loadActor(json["FactorActor"].toObject());
|
||||||
}
|
}
|
||||||
if(factorActor_)
|
if(factorActor_)
|
||||||
{
|
{
|
||||||
connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot);
|
connect(factorActor_.get(), &Actor::sigValue, this, &MultiFactorActor::factorActorSlot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,37 +8,52 @@ class MultiFactorActor: public Actor
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::shared_ptr<Actor> factorActor_;
|
std::shared_ptr<Actor> factorActor_;
|
||||||
QDateTime activationTime;
|
QDateTime activationTime;
|
||||||
uint preCancleMin_;
|
uint preCancleMin_;
|
||||||
|
|
||||||
bool factorDirection = true;
|
bool factorDirection = true;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void factorActorSlot(uint8_t value);
|
void factorActorSlot(uint8_t value);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
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<Actor> factorActor);
|
void setFactorActor(std::shared_ptr<Actor> factorActor);
|
||||||
std::shared_ptr<Actor> getFactorActor(){return factorActor_;}
|
std::shared_ptr<Actor> getFactorActor()
|
||||||
void setFactorDirection(const bool direction){factorDirection = direction;}
|
{
|
||||||
bool getFactorDirection(){return factorDirection;}
|
return factorActor_;
|
||||||
uint getPreCancleTime(){return preCancleMin_;}
|
}
|
||||||
void setPreCancleTime(uint minutes){preCancleMin_ = minutes;}
|
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 store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, bool preserve);
|
virtual void load(const QJsonObject& json, bool preserve);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // REMINDERACTOR_H
|
#endif // REMINDERACTOR_H
|
||||||
|
@ -12,72 +12,74 @@ PolynomalActor::PolynomalActor(QObject* parent): Actor(parent)
|
|||||||
|
|
||||||
void PolynomalActor::setSensor(const Sensor sensor)
|
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 )
|
void PolynomalActor::setCoeffiancts( const double pow3, const double pow2, const double pow1, const double pow0 )
|
||||||
{
|
{
|
||||||
pow3_=pow3;
|
pow3_=pow3;
|
||||||
pow2_=pow2;
|
pow2_=pow2;
|
||||||
pow1_=pow1;
|
pow1_=pow1;
|
||||||
pow0_=pow0;
|
pow0_=pow0;
|
||||||
}
|
}
|
||||||
void PolynomalActor::getCoeffiancts( double& pow3, double& pow2, double& pow1, double& pow0 )
|
void PolynomalActor::getCoeffiancts( double& pow3, double& pow2, double& pow1, double& pow0 )
|
||||||
{
|
{
|
||||||
pow3=pow3_;
|
pow3=pow3_;
|
||||||
pow2=pow2_;
|
pow2=pow2_;
|
||||||
pow1=pow1_;
|
pow1=pow1_;
|
||||||
pow0=pow0_;
|
pow0=pow0_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolynomalActor::sensorEvent(Sensor sensor)
|
void PolynomalActor::sensorEvent(Sensor sensor)
|
||||||
{
|
{
|
||||||
if(active && sensor == sensor_)
|
if(active && sensor == sensor_)
|
||||||
{
|
{
|
||||||
double result = pow3_*(sensor.field*sensor.field*sensor.field)+pow2_*(sensor.field*sensor.field)+pow1_*sensor.field+pow0_;
|
double result = pow3_*(sensor.field*sensor.field*sensor.field)+pow2_*(sensor.field*sensor.field)+pow1_*sensor.field
|
||||||
if(result < 0) result = 0;
|
+pow0_;
|
||||||
else if(result > 254) result = 255;
|
if(result < 0) result = 0;
|
||||||
if(result != prevValue)sigValue(static_cast<uint8_t>(result));
|
else if(result > 254) result = 255;
|
||||||
prevValue = result;
|
if(result != prevValue)sigValue(static_cast<uint8_t>(result));
|
||||||
}
|
prevValue = result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolynomalActor::store(QJsonObject& json)
|
void PolynomalActor::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Polynomal";
|
json["Type"] = "Polynomal";
|
||||||
Actor::store(json);
|
Actor::store(json);
|
||||||
json["Pow3"] = pow3_;
|
json["Pow3"] = pow3_;
|
||||||
json["Pow2"] = pow2_;
|
json["Pow2"] = pow2_;
|
||||||
json["Pow1"] = pow1_;
|
json["Pow1"] = pow1_;
|
||||||
json["Pow0"] = pow0_;
|
json["Pow0"] = pow0_;
|
||||||
json["SensorType"] = static_cast<int>(sensor_.type);
|
json["SensorType"] = static_cast<int>(sensor_.type);
|
||||||
json["SensorId"] = static_cast<int>(sensor_.id);
|
json["SensorId"] = static_cast<int>(sensor_.id);
|
||||||
json["SensorField"] = sensor_.field;
|
json["SensorField"] = sensor_.field;
|
||||||
json["SensorName"] = sensor_.name;
|
json["SensorName"] = sensor_.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolynomalActor::load(const QJsonObject& json, bool preserve)
|
void PolynomalActor::load(const QJsonObject& json, bool preserve)
|
||||||
{
|
{
|
||||||
Actor::load(json, preserve);
|
Actor::load(json, preserve);
|
||||||
pow3_ = json["Pow3"].toDouble(0);
|
pow3_ = json["Pow3"].toDouble(0);
|
||||||
pow2_ = json["Pow2"].toDouble(0);
|
pow2_ = json["Pow2"].toDouble(0);
|
||||||
pow1_ = json["Pow1"].toDouble(1);
|
pow1_ = json["Pow1"].toDouble(1);
|
||||||
pow0_ = json["Pow0"].toDouble(0);
|
pow0_ = json["Pow0"].toDouble(0);
|
||||||
sensor_.type = json["SensorType"].toInt(0);
|
sensor_.type = json["SensorType"].toInt(0);
|
||||||
sensor_.id = json["SensorId"].toInt(0);
|
sensor_.id = json["SensorId"].toInt(0);
|
||||||
sensor_.field = json["SensorField"].toInt(0);
|
sensor_.field = json["SensorField"].toInt(0);
|
||||||
sensor_.name = json["SensorName"].toString("Sensor");
|
sensor_.name = json["SensorName"].toString("Sensor");
|
||||||
}
|
}
|
||||||
|
|
||||||
QString PolynomalActor::getName() const
|
QString PolynomalActor::getName() const
|
||||||
{
|
{
|
||||||
if(name_.size() > 0) return name_;
|
if(name_.size() > 0) return name_;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString string;
|
QString string;
|
||||||
string = QString::number(pow3_) + "x^3 + " + QString::number(pow2_) + "x^2 + " + QString::number(pow1_) + "x + " + QString::number(pow0_) + " (x: " + sensor_.name + ")";
|
string = QString::number(pow3_) + "x^3 + " + QString::number(pow2_) + "x^2 + " + QString::number(
|
||||||
return string;
|
pow1_) + "x + " + QString::number(pow0_) + " (x: " + sensor_.name + ")";
|
||||||
}
|
return string;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,35 +5,38 @@
|
|||||||
|
|
||||||
class PolynomalActor: public Actor
|
class PolynomalActor: public Actor
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Sensor sensor_;
|
Sensor sensor_;
|
||||||
double pow3_ = 0;
|
double pow3_ = 0;
|
||||||
double pow2_ = 0;
|
double pow2_ = 0;
|
||||||
double pow1_ = 1;
|
double pow1_ = 1;
|
||||||
double pow0_ = 0;
|
double pow0_ = 0;
|
||||||
|
|
||||||
double prevValue = -1;
|
double prevValue = -1;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void sensorEvent(Sensor sensor);
|
void sensorEvent(Sensor sensor);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void setCoeffiancts( const double pow3, const double pow2, const double pow1, const 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 );
|
void getCoeffiancts( double& pow3, double& pow2, double& pow1, double& pow0 );
|
||||||
|
|
||||||
PolynomalActor(const Sensor sensor, QObject* parent = nullptr);
|
PolynomalActor(const Sensor sensor, QObject* parent = nullptr);
|
||||||
PolynomalActor(QObject* parent = nullptr);
|
PolynomalActor(QObject* parent = nullptr);
|
||||||
void setSensor(const Sensor sensor);
|
void setSensor(const Sensor sensor);
|
||||||
Sensor getSensor(){return sensor_;}
|
Sensor getSensor()
|
||||||
virtual QString getName() const;
|
{
|
||||||
virtual ~PolynomalActor(){}
|
return sensor_;
|
||||||
|
}
|
||||||
|
virtual QString getName() const;
|
||||||
|
virtual ~PolynomalActor() {}
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, bool preserve);
|
virtual void load(const QJsonObject& json, bool preserve);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POLYNOMALACTOR_H
|
#endif // POLYNOMALACTOR_H
|
||||||
|
@ -14,72 +14,80 @@ Regulator::Regulator(QObject* parent): Actor(parent)
|
|||||||
|
|
||||||
void Regulator::setSensor(const Sensor sensor)
|
void Regulator::setSensor(const Sensor sensor)
|
||||||
{
|
{
|
||||||
sensor_ = sensor;
|
sensor_ = sensor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Regulator::sensorEvent(Sensor sensor)
|
void Regulator::sensorEvent(Sensor sensor)
|
||||||
{
|
{
|
||||||
if(active && sensor == sensor_)
|
if(active && sensor == sensor_)
|
||||||
{
|
{
|
||||||
if( sensor.field < setPoint_-band_ && (sensor.field < sensor_.field || sensor_.field > setPoint_-band_ || first) )
|
if( sensor.field < setPoint_-band_ && (sensor.field < sensor_.field || sensor_.field > setPoint_-band_ || first) )
|
||||||
{
|
{
|
||||||
sigValue(triggerValue);
|
sigValue(triggerValue);
|
||||||
}
|
}
|
||||||
else if( sensor.field > setPoint_+band_ && (sensor.field > sensor_.field || sensor_.field < setPoint_+band_ || first) )
|
else if( sensor.field > setPoint_+band_ && (sensor.field > sensor_.field || sensor_.field < setPoint_+band_ || first) )
|
||||||
{
|
{
|
||||||
sigValue(!triggerValue);
|
sigValue(!triggerValue);
|
||||||
}
|
}
|
||||||
first = false;
|
first = false;
|
||||||
sensor_ = sensor;
|
sensor_ = sensor;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Regulator::makeInactive()
|
||||||
|
{
|
||||||
|
first = true;
|
||||||
|
if(active)
|
||||||
|
sigValue(!triggerValue);
|
||||||
|
Actor::makeInactive();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Regulator::setPoint(float setPoint)
|
void Regulator::setPoint(float setPoint)
|
||||||
{
|
{
|
||||||
setPoint_ = setPoint;
|
setPoint_ = setPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Regulator::setBand ( float band )
|
void Regulator::setBand ( float band )
|
||||||
{
|
{
|
||||||
band_ = band;
|
band_ = band;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Regulator::setInvert( bool invert )
|
void Regulator::setInvert( bool invert )
|
||||||
{
|
{
|
||||||
invert_ = invert;
|
invert_ = invert;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Regulator::store(QJsonObject& json)
|
void Regulator::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Regulator";
|
json["Type"] = "Regulator";
|
||||||
Actor::store(json);
|
Actor::store(json);
|
||||||
json["Band"] = band_;
|
json["Band"] = band_;
|
||||||
json["SetPoint"] = setPoint_;
|
json["SetPoint"] = setPoint_;
|
||||||
json["SensorType"] = static_cast<int>(sensor_.type);
|
json["SensorType"] = static_cast<int>(sensor_.type);
|
||||||
json["SensorId"] = static_cast<int>(sensor_.id);
|
json["SensorId"] = static_cast<int>(sensor_.id);
|
||||||
json["SensorField"] = sensor_.field;
|
json["SensorField"] = sensor_.field;
|
||||||
json["SensorName"] = sensor_.name;
|
json["SensorName"] = sensor_.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Regulator::load(const QJsonObject& json, bool preserve)
|
void Regulator::load(const QJsonObject& json, bool preserve)
|
||||||
{
|
{
|
||||||
Actor::load(json, preserve);
|
Actor::load(json, preserve);
|
||||||
band_ = json["Band"].toDouble(1);
|
band_ = json["Band"].toDouble(1);
|
||||||
setPoint_ = json["SetPoint"].toDouble(22);
|
setPoint_ = json["SetPoint"].toDouble(22);
|
||||||
sensor_.type = json["SensorType"].toInt(0);
|
sensor_.type = json["SensorType"].toInt(0);
|
||||||
sensor_.id = json["SensorId"].toInt(0);
|
sensor_.id = json["SensorId"].toInt(0);
|
||||||
sensor_.field = json["SensorField"].toInt(0);
|
sensor_.field = json["SensorField"].toInt(0);
|
||||||
sensor_.name = json["SensorName"].toString("Sensor");
|
sensor_.name = json["SensorName"].toString("Sensor");
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Regulator::getName() const
|
QString Regulator::getName() const
|
||||||
{
|
{
|
||||||
if(name_.size() > 0) return name_;
|
if(name_.size() > 0) return name_;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString string;
|
QString string;
|
||||||
string = "Regulate \"" + sensor_.name + "\" to ";
|
string = "Regulate \"" + sensor_.name + "\" to ";
|
||||||
string.append(QString::number(setPoint_) + " ");
|
string.append(QString::number(setPoint_) + " ");
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,35 +4,45 @@
|
|||||||
|
|
||||||
class Regulator : public Actor
|
class Regulator : public Actor
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Sensor sensor_;
|
Sensor sensor_;
|
||||||
float setPoint_ = 0;
|
float setPoint_ = 0;
|
||||||
float band_ = 1;
|
float band_ = 1;
|
||||||
bool invert_ = false;
|
bool invert_ = false;
|
||||||
|
|
||||||
bool first = true;
|
bool first = true;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void sensorEvent(Sensor sensor);
|
void sensorEvent(Sensor sensor);
|
||||||
|
|
||||||
void setSensor(const Sensor sensor);
|
void setSensor(const Sensor sensor);
|
||||||
void setPoint( float setPoint );
|
void setPoint( float setPoint );
|
||||||
void setBand ( float band );
|
void setBand ( float band );
|
||||||
void setInvert( bool invert );
|
void setInvert( bool invert );
|
||||||
|
virtual void makeInactive() override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
float getBand() {return band_;}
|
float getBand()
|
||||||
float getSetPoint() {return setPoint_;}
|
{
|
||||||
Regulator(const Sensor sensor, QObject* parent = nullptr);
|
return band_;
|
||||||
Regulator(QObject* parent = nullptr);
|
}
|
||||||
Sensor getSensor(){return sensor_;}
|
float getSetPoint()
|
||||||
virtual QString getName() const;
|
{
|
||||||
virtual ~Regulator(){}
|
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 store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, bool preserve);
|
virtual void load(const QJsonObject& json, bool preserve);
|
||||||
};
|
};
|
||||||
|
@ -14,74 +14,76 @@ SensorActor::SensorActor(QObject* parent): Actor(parent)
|
|||||||
|
|
||||||
void SensorActor::setSensor(const Sensor sensor)
|
void SensorActor::setSensor(const Sensor sensor)
|
||||||
{
|
{
|
||||||
sensor_ = sensor;
|
sensor_ = sensor;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActor::sensorEvent(Sensor sensor)
|
void SensorActor::sensorEvent(Sensor sensor)
|
||||||
{
|
{
|
||||||
if(sensor == sensor_)
|
if(sensor == sensor_)
|
||||||
{
|
{
|
||||||
if((sloap_ == SLOPE_UP || sloap_ == SLOPE_BOTH) && sensor_.field < threshold_ && sensor.field >= threshold_ ) performAction();
|
if((sloap_ == SLOPE_UP || sloap_ == SLOPE_BOTH) && sensor_.field < threshold_
|
||||||
else if((sloap_ == SLOPE_DOWN || sloap_ == SLOPE_BOTH) && sensor_.field > threshold_ && sensor.field <= threshold_) performAction();
|
&& sensor.field >= threshold_ ) performAction();
|
||||||
sensor_ = sensor;
|
else if((sloap_ == SLOPE_DOWN || sloap_ == SLOPE_BOTH) && sensor_.field > threshold_
|
||||||
}
|
&& sensor.field <= threshold_) performAction();
|
||||||
|
sensor_ = sensor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActor::setSloap(uint8_t sloap)
|
void SensorActor::setSloap(uint8_t sloap)
|
||||||
{
|
{
|
||||||
sloap_=sloap;
|
sloap_=sloap;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActor::setThreshold(float threshold)
|
void SensorActor::setThreshold(float threshold)
|
||||||
{
|
{
|
||||||
threshold_ = threshold;
|
threshold_ = threshold;
|
||||||
}
|
}
|
||||||
|
|
||||||
float SensorActor::getThreshold()
|
float SensorActor::getThreshold()
|
||||||
{
|
{
|
||||||
return threshold_;
|
return threshold_;
|
||||||
}
|
}
|
||||||
uint8_t SensorActor::getSloap()
|
uint8_t SensorActor::getSloap()
|
||||||
{
|
{
|
||||||
return sloap_;
|
return sloap_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActor::store(QJsonObject& json)
|
void SensorActor::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Sensor";
|
json["Type"] = "Sensor";
|
||||||
Actor::store(json);
|
Actor::store(json);
|
||||||
json["Sloap"] = sloap_;
|
json["Sloap"] = sloap_;
|
||||||
json["Threshold"] = threshold_;
|
json["Threshold"] = threshold_;
|
||||||
json["SensorType"] = static_cast<int>(sensor_.type);
|
json["SensorType"] = static_cast<int>(sensor_.type);
|
||||||
json["SensorId"] = static_cast<int>(sensor_.id);
|
json["SensorId"] = static_cast<int>(sensor_.id);
|
||||||
json["SensorField"] = sensor_.field;
|
json["SensorField"] = sensor_.field;
|
||||||
json["SensorName"] = sensor_.name;
|
json["SensorName"] = sensor_.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActor::load(const QJsonObject& json, bool preserve)
|
void SensorActor::load(const QJsonObject& json, bool preserve)
|
||||||
{
|
{
|
||||||
Actor::load(json, preserve);
|
Actor::load(json, preserve);
|
||||||
sloap_ = json["Sloap"].toInt(0);
|
sloap_ = json["Sloap"].toInt(0);
|
||||||
threshold_ = json["Threshold"].toDouble(0);
|
threshold_ = json["Threshold"].toDouble(0);
|
||||||
sensor_.type = json["SensorType"].toInt(0);
|
sensor_.type = json["SensorType"].toInt(0);
|
||||||
sensor_.id = json["SensorId"].toInt(0);
|
sensor_.id = json["SensorId"].toInt(0);
|
||||||
sensor_.field = json["SensorField"].toInt(0);
|
sensor_.field = json["SensorField"].toInt(0);
|
||||||
sensor_.name = json["SensorName"].toString("Sensor");
|
sensor_.name = json["SensorName"].toString("Sensor");
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SensorActor::getName() const
|
QString SensorActor::getName() const
|
||||||
{
|
{
|
||||||
if(name_.size() > 0) return name_;
|
if(name_.size() > 0) return name_;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString string;
|
QString string;
|
||||||
string = "Sensor \"" + sensor_.name + "\"";
|
string = "Sensor \"" + sensor_.name + "\"";
|
||||||
|
|
||||||
if(sloap_ == SLOPE_UP) string.append(" rises to ");
|
if(sloap_ == SLOPE_UP) string.append(" rises to ");
|
||||||
else if (sloap_ == SLOPE_DOWN) string.append(" drops to ");
|
else if (sloap_ == SLOPE_DOWN) string.append(" drops to ");
|
||||||
else if (sloap_ == SLOPE_BOTH) string.append(" passes ");
|
else if (sloap_ == SLOPE_BOTH) string.append(" passes ");
|
||||||
|
|
||||||
string.append(QString::number(threshold_) + " ");
|
string.append(QString::number(threshold_) + " ");
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,39 +4,42 @@
|
|||||||
|
|
||||||
class SensorActor : public Actor
|
class SensorActor : public Actor
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static constexpr uint8_t SLOPE_UP = 0;
|
static constexpr uint8_t SLOPE_UP = 0;
|
||||||
static constexpr uint8_t SLOPE_DOWN = 1;
|
static constexpr uint8_t SLOPE_DOWN = 1;
|
||||||
static constexpr uint8_t SLOPE_BOTH = 2;
|
static constexpr uint8_t SLOPE_BOTH = 2;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Sensor sensor_;
|
Sensor sensor_;
|
||||||
uint8_t sloap_ = SLOPE_UP;
|
uint8_t sloap_ = SLOPE_UP;
|
||||||
float threshold_ = 0;
|
float threshold_ = 0;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void sensorEvent(Sensor sensor);
|
void sensorEvent(Sensor sensor);
|
||||||
|
|
||||||
void setSloap(uint8_t sloap);
|
void setSloap(uint8_t sloap);
|
||||||
void setSensor(const Sensor sensor);
|
void setSensor(const Sensor sensor);
|
||||||
void setThreshold( float threshold );
|
void setThreshold( float threshold );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SensorActor(const Sensor sensor, QObject* parent = nullptr);
|
SensorActor(const Sensor sensor, QObject* parent = nullptr);
|
||||||
SensorActor(QObject* parent = nullptr);
|
SensorActor(QObject* parent = nullptr);
|
||||||
Sensor getSensor(){return sensor_;}
|
Sensor getSensor()
|
||||||
virtual QString getName() const;
|
{
|
||||||
virtual ~SensorActor(){}
|
return sensor_;
|
||||||
|
}
|
||||||
|
virtual QString getName() const;
|
||||||
|
virtual ~SensorActor() {}
|
||||||
|
|
||||||
float getThreshold();
|
float getThreshold();
|
||||||
uint8_t getSloap();
|
uint8_t getSloap();
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, bool preserve);
|
virtual void load(const QJsonObject& json, bool preserve);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,55 +3,55 @@
|
|||||||
|
|
||||||
TimerActor::TimerActor(const int timeoutSec, QObject *parent): Actor(parent), timeoutMsec_(timeoutSec*1000)
|
TimerActor::TimerActor(const int timeoutSec, QObject *parent): Actor(parent), timeoutMsec_(timeoutSec*1000)
|
||||||
{
|
{
|
||||||
connect(&timer, &QTimer::timeout, this, &TimerActor::timeout);
|
connect(&timer, &QTimer::timeout, this, &TimerActor::timeout);
|
||||||
timer.setSingleShot(true);
|
timer.setSingleShot(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimerActor::onValueChanged(uint8_t state)
|
void TimerActor::onValueChanged(uint8_t state)
|
||||||
{
|
{
|
||||||
if((state && !triggerValue) || (!state && triggerValue))
|
if((state && !triggerValue) || (!state && triggerValue))
|
||||||
{
|
{
|
||||||
if(timer.isActive()) timer.stop();
|
if(timer.isActive()) timer.stop();
|
||||||
timer.setInterval(timeoutMsec_);
|
timer.setInterval(timeoutMsec_);
|
||||||
timer.start();
|
timer.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimerActor::store(QJsonObject& json)
|
void TimerActor::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Timer";
|
json["Type"] = "Timer";
|
||||||
Actor::store(json);
|
Actor::store(json);
|
||||||
json["Timeout"] = timeoutMsec_;
|
json["Timeout"] = timeoutMsec_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimerActor::load(const QJsonObject& json, bool preserve)
|
void TimerActor::load(const QJsonObject& json, bool preserve)
|
||||||
{
|
{
|
||||||
Actor::load(json, preserve);
|
Actor::load(json, preserve);
|
||||||
timeoutMsec_ = json["Timeout"].toInt(10000);
|
timeoutMsec_ = json["Timeout"].toInt(10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimerActor::setTimeout(const int timeoutSec)
|
void TimerActor::setTimeout(const int timeoutSec)
|
||||||
{
|
{
|
||||||
timeoutMsec_ = timeoutSec*1000;
|
timeoutMsec_ = timeoutSec*1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
int TimerActor::getTimeout()
|
int TimerActor::getTimeout()
|
||||||
{
|
{
|
||||||
return timeoutMsec_/1000;
|
return timeoutMsec_/1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimerActor::timeout()
|
void TimerActor::timeout()
|
||||||
{
|
{
|
||||||
performAction();
|
performAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString TimerActor::getName() const
|
QString TimerActor::getName() const
|
||||||
{
|
{
|
||||||
if(name_.size() > 0) return name_;
|
if(name_.size() > 0) return name_;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString string;
|
QString string;
|
||||||
string = "Timeout after " + QString::number(timeoutMsec_/1000) + " seconds. ";
|
string = "Timeout after " + QString::number(timeoutMsec_/1000) + " seconds. ";
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,27 +4,27 @@
|
|||||||
|
|
||||||
class TimerActor: public Actor
|
class TimerActor: public Actor
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
int timeoutMsec_;
|
int timeoutMsec_;
|
||||||
|
|
||||||
QTimer timer;
|
QTimer timer;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void timeout();
|
void timeout();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void onValueChanged(uint8_t state);
|
virtual void onValueChanged(uint8_t state);
|
||||||
void setTimeout(const int timeoutSec);
|
void setTimeout(const int timeoutSec);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit TimerActor(const int timeoutSec = 60, QObject *parent = nullptr);
|
explicit TimerActor(const int timeoutSec = 60, QObject *parent = nullptr);
|
||||||
virtual QString getName() const;
|
virtual QString getName() const;
|
||||||
|
|
||||||
int getTimeout();
|
int getTimeout();
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, bool preserve);
|
virtual void load(const QJsonObject& json, bool preserve);
|
||||||
};
|
};
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
#include "alarmactions.h"
|
#include "alarmactions.h"
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
|
||||||
AlarmActions::AlarmActions(QApplication* a, Microcontroller* micro, QObject *parent) : QObject(parent), _micro(micro), a_(a)
|
AlarmActions::AlarmActions(QApplication* a, Microcontroller* micro, QObject *parent) : QObject(parent), _micro(micro),
|
||||||
|
a_(a)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmActions::syncoff()
|
void AlarmActions::syncoff()
|
||||||
{
|
{
|
||||||
qDebug()<<"syncoff";
|
qDebug()<<"syncoff";
|
||||||
QProcess::execute ( "syncoff" );
|
QProcess::execute ("syncoff", QStringList());
|
||||||
a_->exit(0);
|
a_->exit(0);
|
||||||
}
|
}
|
||||||
|
@ -7,18 +7,18 @@
|
|||||||
class AlarmActions : public QObject
|
class AlarmActions : public QObject
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Microcontroller* _micro;
|
Microcontroller* _micro;
|
||||||
QApplication* a_;
|
QApplication* a_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AlarmActions(QApplication* a, Microcontroller* micro, QObject *parent = nullptr);
|
explicit AlarmActions(QApplication* a, Microcontroller* micro, QObject *parent = nullptr);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void syncoff();
|
void syncoff();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,156 +17,160 @@ namespace ap
|
|||||||
|
|
||||||
static int nl80211Init(struct nl_sock* nl_sock, int* nl80211_id)
|
static int nl80211Init(struct nl_sock* nl_sock, int* nl80211_id)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!nl_sock)
|
if (!nl_sock)
|
||||||
{
|
{
|
||||||
std::cerr<<"Failed to allocate netlink socket.\n";
|
std::cerr<<"Failed to allocate netlink socket.\n";
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (genl_connect(nl_sock))
|
if (genl_connect(nl_sock))
|
||||||
{
|
{
|
||||||
std::cerr<<"Failed to connect to generic netlink.\n";
|
std::cerr<<"Failed to connect to generic netlink.\n";
|
||||||
err = -ENOLINK;
|
err = -ENOLINK;
|
||||||
nl_socket_free(nl_sock);
|
nl_socket_free(nl_sock);
|
||||||
return err;
|
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 */
|
/* try to set NETLINK_EXT_ACK to 1, ignoring errors */
|
||||||
err = 1;
|
err = 1;
|
||||||
setsockopt(nl_socket_get_fd(nl_sock), SOL_NETLINK, NETLINK_EXT_ACK, &err, sizeof(err));
|
setsockopt(nl_socket_get_fd(nl_sock), SOL_NETLINK, NETLINK_EXT_ACK, &err, sizeof(err));
|
||||||
|
|
||||||
*nl80211_id = genl_ctrl_resolve(nl_sock, "nl80211");
|
*nl80211_id = genl_ctrl_resolve(nl_sock, "nl80211");
|
||||||
if (*nl80211_id < 0)
|
if (*nl80211_id < 0)
|
||||||
{
|
{
|
||||||
std::cerr<<"nl80211 not found.\n";
|
std::cerr<<"nl80211 not found.\n";
|
||||||
err = -ENOENT;
|
err = -ENOENT;
|
||||||
nl_socket_free(nl_sock);
|
nl_socket_free(nl_sock);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int errorHandler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
|
static int errorHandler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg)
|
||||||
{
|
{
|
||||||
printf("netlink error\n");
|
(void)nla;
|
||||||
*reinterpret_cast<int*>(arg) = 0;
|
(void)err;
|
||||||
return NL_STOP;
|
printf("netlink error\n");
|
||||||
|
*reinterpret_cast<int*>(arg) = 0;
|
||||||
|
return NL_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int finishHandler(struct nl_msg *msg, void *arg)
|
static int finishHandler(struct nl_msg *msg, void *arg)
|
||||||
{
|
{
|
||||||
*reinterpret_cast<int*>(arg) = 0;
|
(void)msg;
|
||||||
return NL_SKIP;
|
*reinterpret_cast<int*>(arg) = 0;
|
||||||
|
return NL_SKIP;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ackHandler(struct nl_msg *msg, void *arg)
|
static int ackHandler(struct nl_msg *msg, void *arg)
|
||||||
{
|
{
|
||||||
*reinterpret_cast<int*>(arg) = 0;
|
(void)msg;
|
||||||
return NL_STOP;
|
*reinterpret_cast<int*>(arg) = 0;
|
||||||
|
return NL_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int extractDeviceMac(struct nl_msg *msg, void *arg)
|
static int extractDeviceMac(struct nl_msg *msg, void *arg)
|
||||||
{
|
{
|
||||||
struct nlattr* tb[NL80211_ATTR_MAX + 1];
|
struct nlattr* tb[NL80211_ATTR_MAX + 1];
|
||||||
struct genlmsghdr* gnlh = (struct genlmsghdr*)nlmsg_data(nlmsg_hdr(msg));
|
struct genlmsghdr* gnlh = (struct genlmsghdr*)nlmsg_data(nlmsg_hdr(msg));
|
||||||
|
|
||||||
std::vector<uint64_t>* deviceMacAddrs = reinterpret_cast<std::vector<uint64_t>*>(arg);
|
std::vector<uint64_t>* deviceMacAddrs = reinterpret_cast<std::vector<uint64_t>*>(arg);
|
||||||
|
|
||||||
nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
|
nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL);
|
||||||
if (!tb[NL80211_ATTR_STA_INFO])
|
if (!tb[NL80211_ATTR_STA_INFO])
|
||||||
{
|
{
|
||||||
std::cerr<<"sta stats missing!\n";
|
std::cerr<<"sta stats missing!\n";
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned char* macChar = reinterpret_cast<const unsigned char*>(nla_data(tb[NL80211_ATTR_MAC]));
|
const unsigned char* macChar = reinterpret_cast<const unsigned char*>(nla_data(tb[NL80211_ATTR_MAC]));
|
||||||
uint64_t macAddr = 0;
|
uint64_t macAddr = 0;
|
||||||
memcpy(&macAddr, macChar, 6);
|
memcpy(&macAddr, macChar, 6);
|
||||||
deviceMacAddrs->push_back(macAddr);
|
deviceMacAddrs->push_back(macAddr);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint64_t> connectedDevices(const std::string& ifDevice, int& error)
|
std::vector<uint64_t> connectedDevices(const std::string& ifDevice, int& error)
|
||||||
{
|
{
|
||||||
struct nl_sock* nl_sock = nl_socket_alloc();
|
struct nl_sock* nl_sock = nl_socket_alloc();
|
||||||
int nl80211_id = 0;
|
int nl80211_id = 0;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
|
||||||
if(nl80211Init(nl_sock, &nl80211_id))
|
if(nl80211Init(nl_sock, &nl80211_id))
|
||||||
{
|
{
|
||||||
std::cerr<<"Can not init nl80211\n";
|
std::cerr<<"Can not init nl80211\n";
|
||||||
error = ERR_INIT;
|
error = ERR_INIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
signed long long devidx = if_nametoindex(ifDevice.c_str());
|
signed long long devidx = if_nametoindex(ifDevice.c_str());
|
||||||
if(!devidx)
|
if(!devidx)
|
||||||
{
|
{
|
||||||
std::cerr<<ifDevice<<" is not a valid if device\n";
|
std::cerr<<ifDevice<<" is not a valid if device\n";
|
||||||
error = ERR_NO_DEV;
|
error = ERR_NO_DEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct nl_msg *msg;
|
struct nl_msg *msg;
|
||||||
msg = nlmsg_alloc();
|
msg = nlmsg_alloc();
|
||||||
if(!msg) error = ERR_ALLOC;
|
if(!msg) error = ERR_ALLOC;
|
||||||
|
|
||||||
struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
|
struct nl_cb *cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||||
struct nl_cb *s_cb = nl_cb_alloc(NL_CB_DEFAULT);
|
struct nl_cb *s_cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||||
if (!cb || !s_cb) error = ERR_ALLOC;
|
if (!cb || !s_cb) error = ERR_ALLOC;
|
||||||
|
|
||||||
std::vector<uint64_t> deviceMacAddrs;
|
std::vector<uint64_t> deviceMacAddrs;
|
||||||
|
|
||||||
if(error == 0)
|
if(error == 0)
|
||||||
{
|
{
|
||||||
if(!genlmsg_put(msg, 0, 0, nl80211_id, 0, NLM_F_DUMP, NL80211_CMD_GET_STATION, 0))
|
if(!genlmsg_put(msg, 0, 0, nl80211_id, 0, NLM_F_DUMP, NL80211_CMD_GET_STATION, 0))
|
||||||
{
|
{
|
||||||
std::cerr<<"genlmsg_put() failed\n";
|
std::cerr<<"genlmsg_put() failed\n";
|
||||||
error = ERR_GENERAL;
|
error = ERR_GENERAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(error == 0)
|
if(error == 0)
|
||||||
{
|
{
|
||||||
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devidx);
|
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, devidx);
|
||||||
|
|
||||||
nl_socket_set_cb(nl_sock, s_cb);
|
nl_socket_set_cb(nl_sock, s_cb);
|
||||||
nl_send_auto_complete(nl_sock, msg);
|
nl_send_auto_complete(nl_sock, msg);
|
||||||
|
|
||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
|
||||||
nl_cb_err(cb, NL_CB_CUSTOM, errorHandler, &ret);
|
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_FINISH, NL_CB_CUSTOM, finishHandler, &ret);
|
||||||
nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ackHandler, &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);
|
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, extractDeviceMac, &deviceMacAddrs);
|
||||||
|
|
||||||
while (ret > 0) nl_recvmsgs(nl_sock, cb);
|
while (ret > 0) nl_recvmsgs(nl_sock, cb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nla_put_failure:
|
nla_put_failure:
|
||||||
nl_cb_put(cb);
|
nl_cb_put(cb);
|
||||||
nl_cb_put(s_cb);
|
nl_cb_put(s_cb);
|
||||||
nlmsg_free(msg);
|
nlmsg_free(msg);
|
||||||
nl_socket_free(nl_sock);
|
nl_socket_free(nl_sock);
|
||||||
return deviceMacAddrs;
|
return deviceMacAddrs;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string macAddrToString(uint64_t macAddr)
|
std::string macAddrToString(uint64_t macAddr)
|
||||||
{
|
{
|
||||||
unsigned char* macAddrPtr = reinterpret_cast<unsigned char*>(&macAddr);
|
unsigned char* macAddrPtr = reinterpret_cast<unsigned char*>(&macAddr);
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss<<std::uppercase<<std::setfill('0')<<std::setw(2)<<std::hex;
|
ss<<std::uppercase<<std::setfill('0')<<std::setw(2)<<std::hex;
|
||||||
for(unsigned int i = 0; i < 6; ++i) ss<<+macAddrPtr[i]<<':';
|
for(unsigned int i = 0; i < 6; ++i) ss<<+macAddrPtr[i]<<':';
|
||||||
std::string macString = ss.str();
|
std::string macString = ss.str();
|
||||||
macString.pop_back();
|
macString.pop_back();
|
||||||
return macString;
|
return macString;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6,14 +6,14 @@
|
|||||||
|
|
||||||
namespace ap
|
namespace ap
|
||||||
{
|
{
|
||||||
enum ERRORS
|
enum ERRORS
|
||||||
{
|
{
|
||||||
SUCESS,
|
SUCESS,
|
||||||
ERR_INIT,
|
ERR_INIT,
|
||||||
ERR_NO_DEV,
|
ERR_NO_DEV,
|
||||||
ERR_ALLOC,
|
ERR_ALLOC,
|
||||||
ERR_GENERAL
|
ERR_GENERAL
|
||||||
};
|
};
|
||||||
std::vector<uint64_t> connectedDevices(const std::string& ifDevice, int& error);
|
std::vector<uint64_t> connectedDevices(const std::string& ifDevice, int& error);
|
||||||
std::string macAddrToString(uint64_t macAddr);
|
std::string macAddrToString(uint64_t macAddr);
|
||||||
}
|
}
|
||||||
|
@ -6,129 +6,134 @@
|
|||||||
|
|
||||||
BroadCast::BroadCast(QIODevice* const iodevice, bool master ): master_(master), iodevice_(iodevice)
|
BroadCast::BroadCast(QIODevice* const iodevice, bool master ): master_(master), iodevice_(iodevice)
|
||||||
{
|
{
|
||||||
if(iodevice_ != nullptr) connect(iodevice_, &QIODevice::readyRead, this, &BroadCast::readyRead);
|
if(iodevice_ != nullptr) connect(iodevice_, &QIODevice::readyRead, this, &BroadCast::readyRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::write(const char * const buffer, const size_t length)
|
void BroadCast::write(const char * const buffer, const size_t length)
|
||||||
{
|
{
|
||||||
QByteArray mBuffer("bcst: ");
|
QByteArray mBuffer("bcst: ");
|
||||||
for (size_t i = 0; i < length; ++i)
|
for (size_t i = 0; i < length; ++i)
|
||||||
{
|
{
|
||||||
if(buffer[i] != '\n' && buffer[i] != '\0') mBuffer.push_back(buffer[i]);
|
if(buffer[i] != '\n' && buffer[i] != '\0') mBuffer.push_back(buffer[i]);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mBuffer.push_back('\\');
|
mBuffer.push_back('\\');
|
||||||
if(buffer[i] == '\n')mBuffer.push_back('n');
|
if(buffer[i] == '\n')mBuffer.push_back('n');
|
||||||
else mBuffer.push_back('0');
|
else mBuffer.push_back('0');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mBuffer.push_back('\n');
|
mBuffer.push_back('\n');
|
||||||
if(iodevice_)iodevice_->write(mBuffer);
|
if(iodevice_)iodevice_->write(mBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::write(const QByteArray& buffer)
|
void BroadCast::write(const QByteArray& buffer)
|
||||||
{
|
{
|
||||||
write(buffer.data(), buffer.size());
|
write(buffer.data(), buffer.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::sendJson(const QJsonObject& json)
|
void BroadCast::sendJson(const QJsonObject& json)
|
||||||
{
|
{
|
||||||
QJsonDocument jsonDocument(json);
|
QJsonDocument jsonDocument(json);
|
||||||
QByteArray buffer("JSON: ");
|
QByteArray buffer("JSON: ");
|
||||||
buffer.append(jsonDocument.toJson());
|
buffer.append(jsonDocument.toJson());
|
||||||
write(buffer);
|
write(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::sendSensors()
|
void BroadCast::sendSensors()
|
||||||
{
|
{
|
||||||
if(iodevice_)for(auto& sensor: *globalSensors.getSensors())
|
if(iodevice_)
|
||||||
{
|
{
|
||||||
iodevice_->write("bcst: "+sensor.toString().toLatin1()+'\n');
|
for(auto& sensor: *globalSensors.getSensors())
|
||||||
}
|
iodevice_->write("bcst: "+sensor.toString().toLatin1()+'\n');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::requestSensors()
|
void BroadCast::requestSensors()
|
||||||
{
|
{
|
||||||
if(iodevice_)iodevice_->write("bcst: GETSENSORS\n");
|
if(iodevice_)
|
||||||
|
iodevice_->write("bcst: GETSENSORS\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::requestJson()
|
void BroadCast::requestJson()
|
||||||
{
|
{
|
||||||
if(iodevice_)iodevice_->write("bcst: GETJSN\n");
|
if(iodevice_)
|
||||||
|
iodevice_->write("bcst: GETJSN\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::decodeMaster(const QByteArray& buffer)
|
void BroadCast::decodeMaster(const QByteArray& buffer)
|
||||||
{
|
{
|
||||||
if(buffer.startsWith("GETJSN"))
|
if(buffer.startsWith("GETJSN"))
|
||||||
{
|
{
|
||||||
qDebug()<<"json requested";
|
qDebug()<<"json requested";
|
||||||
jsonRequested();
|
jsonRequested();
|
||||||
}
|
}
|
||||||
else if(buffer.startsWith("GETSENSORS") )
|
else if(buffer.startsWith("GETSENSORS") )
|
||||||
{
|
{
|
||||||
qDebug()<<"sensors requested";
|
qDebug()<<"sensors requested";
|
||||||
sendSensors();
|
sendSensors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::decode(QByteArray buffer)
|
void BroadCast::decode(QByteArray buffer)
|
||||||
{
|
{
|
||||||
qDebug()<<"decodeing: "<<buffer;
|
qDebug()<<"decodeing: "<<buffer;
|
||||||
if(buffer.size() >= 6 && buffer[0] == 'J' && buffer[1] == 'S' && buffer[2] == 'O' && buffer[3] == 'N' && buffer[4] == ':')
|
if(buffer.size() >= 6 && buffer[0] == 'J' && buffer[1] == 'S' && buffer[2] == 'O' && buffer[3] == 'N'
|
||||||
{
|
&& buffer[4] == ':')
|
||||||
qDebug()<<"got json";
|
{
|
||||||
buffer.remove(0,6);
|
qDebug()<<"got json";
|
||||||
for(int i = 0; i < buffer.size()-1; ++i)
|
buffer.remove(0,6);
|
||||||
{
|
for(int i = 0; i < buffer.size()-1; ++i)
|
||||||
if( buffer[i] == '\\' && buffer[i+1] == 'n' )
|
{
|
||||||
{
|
if( buffer[i] == '\\' && buffer[i+1] == 'n' )
|
||||||
buffer[i] = '\n';
|
{
|
||||||
buffer.remove(i+1,1);
|
buffer[i] = '\n';
|
||||||
}
|
buffer.remove(i+1,1);
|
||||||
else if( buffer[i] == '\\' && buffer[i+1] == '0' )
|
}
|
||||||
{
|
else if( buffer[i] == '\\' && buffer[i+1] == '0' )
|
||||||
buffer[i] = '\0';
|
{
|
||||||
buffer.remove(i+1,1);
|
buffer[i] = '\0';
|
||||||
}
|
buffer.remove(i+1,1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QJsonParseError error;
|
QJsonParseError error;
|
||||||
QJsonDocument document = QJsonDocument::fromJson(buffer, &error);
|
QJsonDocument document = QJsonDocument::fromJson(buffer, &error);
|
||||||
|
|
||||||
qDebug()<<"JSON:";
|
qDebug()<<"JSON:";
|
||||||
qDebug()<<document.toJson().data();
|
qDebug()<<document.toJson().data();
|
||||||
QJsonObject jsonObject = document.object();
|
QJsonObject jsonObject = document.object();
|
||||||
if(error.error == QJsonParseError::NoError && !document.isEmpty() && !jsonObject.isEmpty()) gotJson(jsonObject);
|
if(error.error == QJsonParseError::NoError && !document.isEmpty() && !jsonObject.isEmpty()) gotJson(jsonObject);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug()<<error.errorString();
|
qDebug()<<error.errorString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(buffer.size() >= 6 && buffer[0] == 'S' && buffer[1] == 'E' && buffer[2] == 'N' && buffer[3] == 'S' && buffer[4] == 'O' && buffer[5] == 'R')
|
else if(buffer.size() >= 6 && buffer[0] == 'S' && buffer[1] == 'E' && buffer[2] == 'N' && buffer[3] == 'S'
|
||||||
{
|
&& buffer[4] == 'O' && buffer[5] == 'R')
|
||||||
Sensor sensor = Sensor::sensorFromString(buffer);
|
{
|
||||||
if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor);
|
Sensor sensor = Sensor::sensorFromString(buffer);
|
||||||
}
|
if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::sendMessage(const QString &title, const QString &body)
|
void BroadCast::sendMessage(const QString &title, const QString &body)
|
||||||
{
|
{
|
||||||
write(QByteArray("MESG ") + title.toLatin1() + " BODY " + body.toLatin1());
|
write(QByteArray("MESG ") + title.toLatin1() + " BODY " + body.toLatin1());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BroadCast::readyRead()
|
void BroadCast::readyRead()
|
||||||
{
|
{
|
||||||
buffer_.append(iodevice_->readAll());
|
buffer_.append(iodevice_->readAll());
|
||||||
int newlineIndex = buffer_.indexOf('\n');
|
int newlineIndex = buffer_.indexOf('\n');
|
||||||
while( newlineIndex != -1 )
|
while( newlineIndex != -1 )
|
||||||
{
|
{
|
||||||
if(buffer_.startsWith("bcst: "))
|
if(buffer_.startsWith("bcst: "))
|
||||||
{
|
{
|
||||||
QByteArray tmp = buffer_.mid(6,newlineIndex-6);
|
QByteArray tmp = buffer_.mid(6,newlineIndex-6);
|
||||||
decode(tmp);
|
decode(tmp);
|
||||||
if(master_)decodeMaster(tmp);
|
if(master_)decodeMaster(tmp);
|
||||||
}
|
}
|
||||||
buffer_.remove(0, newlineIndex+1);
|
buffer_.remove(0, newlineIndex+1);
|
||||||
newlineIndex = buffer_.indexOf('\n');
|
newlineIndex = buffer_.indexOf('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,46 +8,46 @@
|
|||||||
|
|
||||||
class BroadCast: public QObject
|
class BroadCast: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
bool master_;
|
bool master_;
|
||||||
|
|
||||||
static constexpr uint8_t MODE_PREPACKET = 0;
|
static constexpr uint8_t MODE_PREPACKET = 0;
|
||||||
static constexpr uint8_t MODE_PACKET = 1;
|
static constexpr uint8_t MODE_PACKET = 1;
|
||||||
|
|
||||||
QByteArray buffer_;
|
QByteArray buffer_;
|
||||||
|
|
||||||
QIODevice* const iodevice_;
|
QIODevice* const iodevice_;
|
||||||
|
|
||||||
void write(const char * const buffer, const size_t length);
|
void write(const char * const buffer, const size_t length);
|
||||||
void write(const QByteArray& buffer);
|
void write(const QByteArray& buffer);
|
||||||
|
|
||||||
void decode(QByteArray buffer);
|
void decode(QByteArray buffer);
|
||||||
void decodeMaster(const QByteArray& buffer);
|
void decodeMaster(const QByteArray& buffer);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void readyRead();
|
void readyRead();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void requestJson();
|
void requestJson();
|
||||||
void requestSensors();
|
void requestSensors();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void jsonRequested();
|
void jsonRequested();
|
||||||
void gotJson(QJsonObject json);
|
void gotJson(QJsonObject json);
|
||||||
void gotSensorState(Sensor sensor);
|
void gotSensorState(Sensor sensor);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
BroadCast(QIODevice* const iodevice = nullptr, bool master = true);
|
BroadCast(QIODevice* const iodevice = nullptr, bool master = true);
|
||||||
void sendJson(const QJsonObject& json);
|
void sendJson(const QJsonObject& json);
|
||||||
void sendSensors();
|
void sendSensors();
|
||||||
void sendMessage(const QString& title, const QString& body);
|
void sendMessage(const QString& title, const QString& body);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -8,30 +8,30 @@ VirutalIODevice::VirutalIODevice(QObject* parent): QBuffer(parent)
|
|||||||
|
|
||||||
qint64 VirutalIODevice::writeData(const char *data, qint64 len)
|
qint64 VirutalIODevice::writeData(const char *data, qint64 len)
|
||||||
{
|
{
|
||||||
blockSignals(true);
|
blockSignals(true);
|
||||||
qint64 ret = QBuffer::writeData(data, len);
|
qint64 ret = QBuffer::writeData(data, len);
|
||||||
blockSignals(false);
|
blockSignals(false);
|
||||||
masterReadyRead();
|
masterReadyRead();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 VirutalIODevice::masterWrite(const QByteArray &byteArray)
|
qint64 VirutalIODevice::masterWrite(const QByteArray &byteArray)
|
||||||
{
|
{
|
||||||
return masterWrite(byteArray.data(), byteArray.length());
|
return masterWrite(byteArray.data(), byteArray.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 VirutalIODevice::masterWrite(const char *data, qint64 maxSize)
|
qint64 VirutalIODevice::masterWrite(const char *data, qint64 maxSize)
|
||||||
{
|
{
|
||||||
blockSignals(true);
|
blockSignals(true);
|
||||||
qint64 ret = QBuffer::writeData(data, maxSize);
|
qint64 ret = QBuffer::writeData(data, maxSize);
|
||||||
blockSignals(false);
|
blockSignals(false);
|
||||||
readyRead();
|
readyRead();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
IoMuliplexer::IoMuliplexer(QIODevice* mainDevice, QObject* Parent): IoMuliplexer(Parent)
|
IoMuliplexer::IoMuliplexer(QIODevice* mainDevice, QObject* Parent): IoMuliplexer(Parent)
|
||||||
{
|
{
|
||||||
setIoDevice(mainDevice);
|
setIoDevice(mainDevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
IoMuliplexer::IoMuliplexer(QObject* Parent): QObject(Parent)
|
IoMuliplexer::IoMuliplexer(QObject* Parent): QObject(Parent)
|
||||||
@ -41,36 +41,36 @@ IoMuliplexer::IoMuliplexer(QObject* Parent): QObject(Parent)
|
|||||||
|
|
||||||
IoMuliplexer::~IoMuliplexer()
|
IoMuliplexer::~IoMuliplexer()
|
||||||
{
|
{
|
||||||
for(size_t i = 0; i < ioDevices_.size(); ++i) delete ioDevices_[i];
|
for(size_t i = 0; i < ioDevices_.size(); ++i) delete ioDevices_[i];
|
||||||
ioDevices_.clear();
|
ioDevices_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoMuliplexer::setIoDevice(QIODevice* mainDevice)
|
void IoMuliplexer::setIoDevice(QIODevice* mainDevice)
|
||||||
{
|
{
|
||||||
mainDevice_ = mainDevice;
|
mainDevice_ = mainDevice;
|
||||||
connect(mainDevice_, &QIODevice::readyRead, this, &IoMuliplexer::mainIsReadyRead);
|
connect(mainDevice_, &QIODevice::readyRead, this, &IoMuliplexer::mainIsReadyRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
QIODevice* IoMuliplexer::getIoDevice()
|
QIODevice* IoMuliplexer::getIoDevice()
|
||||||
{
|
{
|
||||||
ioDevices_.push_back(new VirutalIODevice);
|
ioDevices_.push_back(new VirutalIODevice);
|
||||||
ioDevices_.back()->open(QIODevice::ReadWrite);
|
ioDevices_.back()->open(QIODevice::ReadWrite);
|
||||||
connect(ioDevices_.back(), &VirutalIODevice::masterReadyRead, this, &IoMuliplexer::clientIsReadyRead);
|
connect(ioDevices_.back(), &VirutalIODevice::masterReadyRead, this, &IoMuliplexer::clientIsReadyRead);
|
||||||
return ioDevices_.back();
|
return ioDevices_.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoMuliplexer::clientIsReadyRead()
|
void IoMuliplexer::clientIsReadyRead()
|
||||||
{
|
{
|
||||||
VirutalIODevice* device = dynamic_cast<VirutalIODevice*>(sender());
|
VirutalIODevice* device = dynamic_cast<VirutalIODevice*>(sender());
|
||||||
if(device)
|
if(device)
|
||||||
{
|
{
|
||||||
QByteArray array = device->readAll();
|
QByteArray array = device->readAll();
|
||||||
mainDevice_->write(array);
|
mainDevice_->write(array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void IoMuliplexer::mainIsReadyRead()
|
void IoMuliplexer::mainIsReadyRead()
|
||||||
{
|
{
|
||||||
QByteArray array = mainDevice_->readAll();
|
QByteArray array = mainDevice_->readAll();
|
||||||
for(size_t i = 0; i < ioDevices_.size(); ++i) ioDevices_[i]->masterWrite(array);
|
for(size_t i = 0; i < ioDevices_.size(); ++i) ioDevices_[i]->masterWrite(array);
|
||||||
}
|
}
|
||||||
|
@ -8,46 +8,46 @@
|
|||||||
|
|
||||||
class VirutalIODevice: public QBuffer
|
class VirutalIODevice: public QBuffer
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
VirutalIODevice(QObject* parent = nullptr);
|
VirutalIODevice(QObject* parent = nullptr);
|
||||||
virtual ~VirutalIODevice() override {}
|
virtual ~VirutalIODevice() override {}
|
||||||
|
|
||||||
virtual qint64 writeData(const char *data, qint64 len) override;
|
virtual qint64 writeData(const char *data, qint64 len) override;
|
||||||
|
|
||||||
qint64 masterWrite(const QByteArray &byteArray);
|
qint64 masterWrite(const QByteArray &byteArray);
|
||||||
qint64 masterWrite(const char *data, qint64 maxSize);
|
qint64 masterWrite(const char *data, qint64 maxSize);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void masterReadyRead();
|
void masterReadyRead();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class IoMuliplexer: public QObject
|
class IoMuliplexer: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QIODevice* mainDevice_;
|
QIODevice* mainDevice_;
|
||||||
std::vector< VirutalIODevice* > ioDevices_;
|
std::vector< VirutalIODevice* > ioDevices_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit IoMuliplexer(QIODevice* mainDevice, QObject* Parent = nullptr);
|
explicit IoMuliplexer(QIODevice* mainDevice, QObject* Parent = nullptr);
|
||||||
explicit IoMuliplexer(QObject* Parent = nullptr);
|
explicit IoMuliplexer(QObject* Parent = nullptr);
|
||||||
|
|
||||||
~IoMuliplexer();
|
~IoMuliplexer();
|
||||||
|
|
||||||
void setIoDevice(QIODevice* mainDevice);
|
void setIoDevice(QIODevice* mainDevice);
|
||||||
|
|
||||||
QIODevice* getIoDevice();
|
QIODevice* getIoDevice();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void mainIsReadyRead();
|
void mainIsReadyRead();
|
||||||
void clientIsReadyRead();
|
void clientIsReadyRead();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
#include "auxitem.h"
|
#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)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuxItem::setValue(uint8_t value)
|
void AuxItem::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
Item::setValue(value);
|
Item::setValue(value);
|
||||||
micro_->setAuxPwm(value);
|
micro_->setAuxPwm(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AuxItem::store(QJsonObject &json)
|
void AuxItem::store(QJsonObject &json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Aux";
|
json["Type"] = "Aux";
|
||||||
Item::store(json);
|
Item::store(json);
|
||||||
}
|
}
|
||||||
|
@ -5,16 +5,17 @@
|
|||||||
|
|
||||||
class AuxItem: public Item
|
class AuxItem: public Item
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
Microcontroller* micro_;
|
Microcontroller* micro_;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr);
|
AuxItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "",
|
||||||
|
uint8_t value = 0, QObject* parent = nullptr);
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
};
|
};
|
||||||
|
@ -15,22 +15,22 @@ ItemData::ItemData(uint32_t itemIdIn, QString name, uint8_t value): name_(name),
|
|||||||
|
|
||||||
QString ItemData::getName() const
|
QString ItemData::getName() const
|
||||||
{
|
{
|
||||||
return name_;
|
return name_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemData::setName(QString name)
|
void ItemData::setName(QString name)
|
||||||
{
|
{
|
||||||
name_ = name;
|
name_ = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t ItemData::getValue() const
|
uint8_t ItemData::getValue() const
|
||||||
{
|
{
|
||||||
return value_;
|
return value_;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ItemData::id() const
|
uint32_t ItemData::id() const
|
||||||
{
|
{
|
||||||
return itemId_;
|
return itemId_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -38,7 +38,8 @@ uint32_t ItemData::id() const
|
|||||||
|
|
||||||
bool Item::secondaryFlag = false;
|
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 +55,117 @@ Item::~Item()
|
|||||||
|
|
||||||
void Item::store(QJsonObject &json)
|
void Item::store(QJsonObject &json)
|
||||||
{
|
{
|
||||||
json["Name"] = name_;
|
json["Name"] = name_;
|
||||||
json["ItemId"] = static_cast<double>(itemId_);
|
json["ItemId"] = static_cast<double>(itemId_);
|
||||||
json["override"] = override_;
|
json["override"] = override_;
|
||||||
QJsonArray actorsArray;
|
QJsonArray actorsArray;
|
||||||
for(size_t i = 0; i < actors_.size(); ++i)
|
for(size_t i = 0; i < actors_.size(); ++i)
|
||||||
{
|
{
|
||||||
if(!actors_[i]->isExausted())
|
if(!actors_[i]->isExausted())
|
||||||
{
|
{
|
||||||
QJsonObject actorObject;
|
QJsonObject actorObject;
|
||||||
actors_[i]->store(actorObject);
|
actors_[i]->store(actorObject);
|
||||||
actorsArray.append(actorObject);
|
actorsArray.append(actorObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
json["Actors"] = actorsArray;
|
json["Actors"] = actorsArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::load(const QJsonObject &json, const bool preserve)
|
void Item::load(const QJsonObject &json, const bool preserve)
|
||||||
{
|
{
|
||||||
if(!preserve)
|
if(!preserve)
|
||||||
{
|
{
|
||||||
name_ = json["Name"].toString(name_);
|
name_ = json["Name"].toString(name_);
|
||||||
itemId_ = static_cast<uint32_t>(json["ItemId"].toDouble(0));
|
itemId_ = static_cast<uint32_t>(json["ItemId"].toDouble(0));
|
||||||
}
|
}
|
||||||
override_ = json["override"].toBool(false);
|
override_ = json["override"].toBool(false);
|
||||||
const QJsonArray actorsArray(json["Actors"].toArray(QJsonArray()));
|
const QJsonArray actorsArray(json["Actors"].toArray(QJsonArray()));
|
||||||
for(int i = 0; i < actorsArray.size(); ++i)
|
for(int i = 0; i < actorsArray.size(); ++i)
|
||||||
{
|
{
|
||||||
if(actorsArray[i].isObject())
|
if(actorsArray[i].isObject())
|
||||||
{
|
{
|
||||||
std::shared_ptr<Actor> actor = Actor::loadActor(actorsArray[i].toObject());
|
std::shared_ptr<Actor> actor = Actor::loadActor(actorsArray[i].toObject());
|
||||||
if(actor != nullptr) addActor(actor);
|
if(actor != nullptr) addActor(actor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::actorSetValue(uint8_t value)
|
void Item::actorSetValue(uint8_t value)
|
||||||
{
|
{
|
||||||
if(!override_) setValue(value);
|
if(!override_) setValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::setValue(uint8_t value)
|
void Item::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
value_ = value;
|
value_ = value;
|
||||||
valueChanged(value_);
|
valueChanged(value_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::informValue(uint8_t value)
|
void Item::informValue(uint8_t value)
|
||||||
{
|
{
|
||||||
Item::setValue(value);
|
Item::setValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::addActor(std::shared_ptr<Actor> actor)
|
void Item::addActor(std::shared_ptr<Actor> actor)
|
||||||
{
|
{
|
||||||
actor->setParent(this);
|
actor->setParent(this);
|
||||||
actors_.push_back(actor);
|
actors_.push_back(actor);
|
||||||
if(!secondaryFlag)
|
if(!secondaryFlag)
|
||||||
{
|
{
|
||||||
connect(actor.get(), &Actor::sigValue, this, &Item::actorSetValue);
|
connect(actor.get(), &Actor::sigValue, this, &Item::actorSetValue);
|
||||||
}
|
}
|
||||||
connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged);
|
connect(this, &Item::valueChanged, actor.get(), &Actor::onValueChanged);
|
||||||
|
|
||||||
std::shared_ptr<SensorActor> sensorActor = std::dynamic_pointer_cast<SensorActor>(actor);
|
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);
|
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);
|
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)
|
bool Item::removeActor(std::shared_ptr<Actor> actor)
|
||||||
{
|
{
|
||||||
for(unsigned int i = 0; i < actors_.size(); i++)
|
for(unsigned int i = 0; i < actors_.size(); i++)
|
||||||
{
|
{
|
||||||
if(actors_[i] == actor)
|
if(actors_[i] == actor)
|
||||||
{
|
{
|
||||||
actors_.erase(actors_.begin()+i);
|
actors_.erase(actors_.begin()+i);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::setOverride(const bool in)
|
void Item::setOverride(const bool in)
|
||||||
{
|
{
|
||||||
override_ = in;
|
override_ = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item::getOverride()
|
bool Item::getOverride()
|
||||||
{
|
{
|
||||||
return override_;
|
return override_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::removeAllActors()
|
void Item::removeAllActors()
|
||||||
{
|
{
|
||||||
actors_.clear();
|
actors_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector< std::shared_ptr<Actor> >& Item::getActors()
|
std::vector< std::shared_ptr<Actor> >& Item::getActors()
|
||||||
{
|
{
|
||||||
return actors_;
|
return actors_;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Item::hasActors()
|
bool Item::hasActors()
|
||||||
{
|
{
|
||||||
return actors_.size() > 0;
|
return actors_.size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::setActorsActive(bool in)
|
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();
|
||||||
}
|
}
|
||||||
|
@ -11,67 +11,74 @@ class Actor;
|
|||||||
class ItemData
|
class ItemData
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
QString name_;
|
QString name_;
|
||||||
uint8_t value_;
|
uint8_t value_;
|
||||||
uint32_t itemId_;
|
uint32_t itemId_;
|
||||||
|
|
||||||
public:
|
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);
|
||||||
|
|
||||||
inline bool operator==(const ItemData& in) const{ return itemId_==in.itemId_; }
|
inline bool operator==(const ItemData& in) const
|
||||||
inline bool operator!=(const ItemData& in) const{ return itemId_!=in.itemId_; }
|
{
|
||||||
|
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);
|
void setName(QString name);
|
||||||
uint8_t getValue() const;
|
uint8_t getValue() const;
|
||||||
virtual QString getName() const;
|
virtual QString getName() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item: public QObject, public ItemData
|
class Item: public QObject, public ItemData
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
std::vector< std::shared_ptr<Actor> > actors_;
|
std::vector< std::shared_ptr<Actor> > actors_;
|
||||||
|
|
||||||
bool override_ = false;
|
bool override_ = false;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static bool secondaryFlag;
|
static bool secondaryFlag;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void valueChanged(uint8_t value);
|
void valueChanged(uint8_t value);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
virtual void actorSetValue(uint8_t value);
|
virtual void actorSetValue(uint8_t value);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr);
|
Item(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0,
|
||||||
Item(const ItemData& itemData, QObject *parent = nullptr);
|
QObject *parent = nullptr);
|
||||||
|
Item(const ItemData& itemData, QObject *parent = nullptr);
|
||||||
|
|
||||||
virtual ~Item();
|
virtual ~Item();
|
||||||
|
|
||||||
std::vector< std::shared_ptr<Actor> >& getActors();
|
std::vector< std::shared_ptr<Actor> >& getActors();
|
||||||
bool hasActors();
|
bool hasActors();
|
||||||
void addActor(std::shared_ptr<Actor> actor);
|
void addActor(std::shared_ptr<Actor> actor);
|
||||||
bool removeActor(std::shared_ptr<Actor> actor);
|
bool removeActor(std::shared_ptr<Actor> actor);
|
||||||
void removeAllActors();
|
void removeAllActors();
|
||||||
void setActorsActive(bool in);
|
void setActorsActive(bool in);
|
||||||
void setOverride(const bool in);
|
void setOverride(const bool in);
|
||||||
bool getOverride();
|
bool getOverride();
|
||||||
void informValue(uint8_t value);
|
void informValue(uint8_t value);
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -10,121 +10,121 @@ ItemStore::ItemStore(QObject *parent): QObject(parent)
|
|||||||
|
|
||||||
void ItemStore::addItem(std::shared_ptr<Item> item)
|
void ItemStore::addItem(std::shared_ptr<Item> item)
|
||||||
{
|
{
|
||||||
bool mached = false;
|
bool mached = false;
|
||||||
for(unsigned i = 0; i < items_.size(); i++ ) if(*items_[i] == *item) mached = true;
|
for(unsigned i = 0; i < items_.size(); i++ ) if(*items_[i] == *item) mached = true;
|
||||||
if(!mached)
|
if(!mached)
|
||||||
{
|
{
|
||||||
items_.push_back(std::shared_ptr<Item>(item));
|
items_.push_back(std::shared_ptr<Item>(item));
|
||||||
itemAdded(std::weak_ptr<Item>(items_.back()));
|
itemAdded(std::weak_ptr<Item>(items_.back()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemStore::addItems(const std::vector<std::shared_ptr<Item>>& itemIn)
|
void ItemStore::addItems(const std::vector<std::shared_ptr<Item>>& itemIn)
|
||||||
{
|
{
|
||||||
for(unsigned i = 0; i < items_.size(); i++ )
|
for(unsigned i = 0; i < items_.size(); i++ )
|
||||||
{
|
{
|
||||||
if(Relay* relay = dynamic_cast<Relay*>(items_[i].get()))
|
if(Relay* relay = dynamic_cast<Relay*>(items_[i].get()))
|
||||||
{
|
{
|
||||||
bool mached = false;
|
bool mached = false;
|
||||||
for(unsigned j = 0; j < itemIn.size(); j++) if(*(items_[i]) == *(itemIn[j]))
|
for(unsigned j = 0; j < itemIn.size(); j++) if(*(items_[i]) == *(itemIn[j]))
|
||||||
{
|
{
|
||||||
mached = true;
|
mached = true;
|
||||||
if(itemIn[j]->getValue() != items_[i]->getValue()) items_[i]->informValue(itemIn[j]->getValue());
|
if(itemIn[j]->getValue() != items_[i]->getValue()) items_[i]->informValue(itemIn[j]->getValue());
|
||||||
Relay* relayIn = dynamic_cast<Relay*>(itemIn[j].get());
|
Relay* relayIn = dynamic_cast<Relay*>(itemIn[j].get());
|
||||||
if(relayIn)
|
if(relayIn)
|
||||||
{
|
{
|
||||||
if(relay->getId() != relayIn->getId()) relay->setId(relayIn->getId());
|
if(relay->getId() != relayIn->getId()) relay->setId(relayIn->getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(!mached)
|
if(!mached)
|
||||||
{
|
{
|
||||||
itemDeleted(*items_[i].get());
|
itemDeleted(*items_[i].get());
|
||||||
items_.erase(items_.begin()+i);
|
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]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemStore::removeItem(const ItemData& item)
|
void ItemStore::removeItem(const ItemData& item)
|
||||||
{
|
{
|
||||||
for(unsigned j = 0; j < items_.size(); j++)
|
for(unsigned j = 0; j < items_.size(); j++)
|
||||||
{
|
{
|
||||||
if(item == *items_[j])
|
if(item == *items_[j])
|
||||||
{
|
{
|
||||||
items_.erase(items_.begin()+j);
|
items_.erase(items_.begin()+j);
|
||||||
--j;
|
--j;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ItemStore::clear()
|
void ItemStore::clear()
|
||||||
{
|
{
|
||||||
for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]);
|
for(size_t i = 0; i < items_.size(); ++i) itemDeleted(*items_[i]);
|
||||||
items_.clear();
|
items_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ItemStore::itemStateChanged(const ItemData& item)
|
void ItemStore::itemStateChanged(const ItemData& item)
|
||||||
{
|
{
|
||||||
|
|
||||||
for(unsigned i = 0; i < items_.size(); i++ )
|
for(unsigned i = 0; i < items_.size(); i++ )
|
||||||
{
|
{
|
||||||
if(items_[i]->operator==(item))
|
if(items_[i]->operator==(item))
|
||||||
{
|
{
|
||||||
|
|
||||||
if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue());
|
if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemStore::store(QJsonObject& json)
|
void ItemStore::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
QJsonArray itemsArray;
|
QJsonArray itemsArray;
|
||||||
for(size_t i = 0; i < items_.size(); ++i)
|
for(size_t i = 0; i < items_.size(); ++i)
|
||||||
{
|
{
|
||||||
QJsonObject itemObject;
|
QJsonObject itemObject;
|
||||||
items_[i]->store(itemObject);
|
items_[i]->store(itemObject);
|
||||||
itemsArray.append(itemObject);
|
itemsArray.append(itemObject);
|
||||||
}
|
}
|
||||||
json["Items"] = itemsArray;
|
json["Items"] = itemsArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemStore::load(const QJsonObject& json)
|
void ItemStore::load(const QJsonObject& json)
|
||||||
{
|
{
|
||||||
const QJsonArray itemsArray(json["Items"].toArray(QJsonArray()));
|
const QJsonArray itemsArray(json["Items"].toArray(QJsonArray()));
|
||||||
for(int i = 0; i < itemsArray.size(); ++i)
|
for(int i = 0; i < itemsArray.size(); ++i)
|
||||||
{
|
{
|
||||||
if(itemsArray[i].isObject())
|
if(itemsArray[i].isObject())
|
||||||
{
|
{
|
||||||
const QJsonObject itemObject = itemsArray[i].toObject();
|
const QJsonObject itemObject = itemsArray[i].toObject();
|
||||||
std::shared_ptr<Item> newItem;
|
std::shared_ptr<Item> newItem;
|
||||||
if(itemObject["Type"].toString("") == "Relay")
|
if(itemObject["Type"].toString("") == "Relay")
|
||||||
{
|
{
|
||||||
newItem = std::shared_ptr<Relay>(new Relay());
|
newItem = std::shared_ptr<Relay>(new Relay());
|
||||||
}
|
}
|
||||||
else if(itemObject["Type"].toString("") == "Message")
|
else if(itemObject["Type"].toString("") == "Message")
|
||||||
{
|
{
|
||||||
newItem = std::shared_ptr<MessageItem>(new MessageItem);
|
newItem = std::shared_ptr<MessageItem>(new MessageItem);
|
||||||
}
|
}
|
||||||
else if(itemObject["Type"].toString("") == "System")
|
else if(itemObject["Type"].toString("") == "System")
|
||||||
{
|
{
|
||||||
newItem = std::shared_ptr<SystemItem>(new SystemItem());
|
newItem = std::shared_ptr<SystemItem>(new SystemItem());
|
||||||
}
|
}
|
||||||
else if(itemObject["Type"].toString("") == "Aux")
|
else if(itemObject["Type"].toString("") == "Aux")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
if(newItem)
|
if(newItem)
|
||||||
{
|
{
|
||||||
newItem->load(itemObject);
|
newItem->load(itemObject);
|
||||||
addItem(newItem);
|
addItem(newItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,31 +8,34 @@
|
|||||||
|
|
||||||
class ItemStore: public QObject
|
class ItemStore: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
std::vector< std::shared_ptr<Item> > items_;
|
std::vector< std::shared_ptr<Item> > items_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
ItemStore(QObject *parent = nullptr);
|
ItemStore(QObject *parent = nullptr);
|
||||||
virtual ~ItemStore(){}
|
virtual ~ItemStore() {}
|
||||||
|
|
||||||
inline std::vector< std::shared_ptr<Item> >* getItems(){ return &items_; }
|
inline std::vector< std::shared_ptr<Item> >* getItems()
|
||||||
|
{
|
||||||
|
return &items_;
|
||||||
|
}
|
||||||
|
|
||||||
void store(QJsonObject &json);
|
void store(QJsonObject &json);
|
||||||
void load(const QJsonObject &json);
|
void load(const QJsonObject &json);
|
||||||
|
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void itemDeleted(ItemData item);
|
void itemDeleted(ItemData item);
|
||||||
void itemAdded(std::weak_ptr<Item> Item);
|
void itemAdded(std::weak_ptr<Item> Item);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void removeItem(const ItemData& item);
|
void removeItem(const ItemData& item);
|
||||||
void addItem(std::shared_ptr<Item> item);
|
void addItem(std::shared_ptr<Item> item);
|
||||||
void addItems(const std::vector<std::shared_ptr<Item>>& itemsIn);
|
void addItems(const std::vector<std::shared_ptr<Item>>& itemsIn);
|
||||||
void itemStateChanged(const ItemData& item);
|
void itemStateChanged(const ItemData& item);
|
||||||
};
|
};
|
||||||
|
@ -6,83 +6,83 @@
|
|||||||
BroadCast* MessageItem::broadCast = nullptr;
|
BroadCast* MessageItem::broadCast = nullptr;
|
||||||
|
|
||||||
MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent):
|
MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent):
|
||||||
Item(itemIdIn, name, value, parent)
|
Item(itemIdIn, name, value, parent)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageItem::MessageItem(const ItemData& itemData, QObject *parent):
|
MessageItem::MessageItem(const ItemData& itemData, QObject *parent):
|
||||||
Item(itemData, parent)
|
Item(itemData, parent)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageItem::~MessageItem()
|
MessageItem::~MessageItem()
|
||||||
{
|
{
|
||||||
closeMessageBox();
|
closeMessageBox();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageItem::setValue(uint8_t value)
|
void MessageItem::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
Item::setValue(value);
|
Item::setValue(value);
|
||||||
if(value && !messageBox_)
|
if(value && !messageBox_)
|
||||||
{
|
{
|
||||||
if(broadCast) broadCast->sendMessage(name_, message_);
|
if(broadCast) broadCast->sendMessage(name_, message_);
|
||||||
if(!alertSoundFileName.isEmpty()) QSound::play(alertSoundFileName);
|
if(!alertSoundFileName.isEmpty()) QSound::play(alertSoundFileName);
|
||||||
messageBox_ = new QMessageBox(QMessageBox::NoIcon, name_, message_);
|
messageBox_ = new QMessageBox(QMessageBox::NoIcon, name_, message_);
|
||||||
messageBox_->setModal(false);
|
messageBox_->setModal(false);
|
||||||
connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox);
|
connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox);
|
||||||
messageBox_->show();
|
messageBox_->show();
|
||||||
}
|
}
|
||||||
else if(!value && messageBox_)
|
else if(!value && messageBox_)
|
||||||
{
|
{
|
||||||
closeMessageBox();
|
closeMessageBox();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MessageItem::closeMessageBox()
|
void MessageItem::closeMessageBox()
|
||||||
{
|
{
|
||||||
if(messageBox_)
|
if(messageBox_)
|
||||||
{
|
{
|
||||||
value_ = 0;
|
value_ = 0;
|
||||||
messageBox_->hide();
|
messageBox_->hide();
|
||||||
delete messageBox_;
|
delete messageBox_;
|
||||||
messageBox_ = nullptr;
|
messageBox_ = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString MessageItem::getAlert()
|
QString MessageItem::getAlert()
|
||||||
{
|
{
|
||||||
return alertSoundFileName;
|
return alertSoundFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageItem::setAlert(const QString &in)
|
void MessageItem::setAlert(const QString &in)
|
||||||
{
|
{
|
||||||
alertSoundFileName = in;
|
alertSoundFileName = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageItem::setMessage(const QString& in)
|
void MessageItem::setMessage(const QString& in)
|
||||||
{
|
{
|
||||||
message_ = in;
|
message_ = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString MessageItem::getMessage()
|
QString MessageItem::getMessage()
|
||||||
{
|
{
|
||||||
return message_;
|
return message_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageItem::store(QJsonObject &json)
|
void MessageItem::store(QJsonObject &json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Message";
|
json["Type"] = "Message";
|
||||||
Item::store(json);
|
Item::store(json);
|
||||||
json["Message"] = message_;
|
json["Message"] = message_;
|
||||||
if(!alertSoundFileName.isEmpty()) json["Alert"] = alertSoundFileName;
|
if(!alertSoundFileName.isEmpty()) json["Alert"] = alertSoundFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MessageItem::load(const QJsonObject &json, const bool preserve)
|
void MessageItem::load(const QJsonObject &json, const bool preserve)
|
||||||
{
|
{
|
||||||
Item::load(json,preserve);
|
Item::load(json,preserve);
|
||||||
message_ = json["Message"].toString("Invalid Message");
|
message_ = json["Message"].toString("Invalid Message");
|
||||||
alertSoundFileName = json["Alert"].toString("");
|
alertSoundFileName = json["Alert"].toString("");
|
||||||
}
|
}
|
||||||
|
@ -8,37 +8,38 @@
|
|||||||
|
|
||||||
class MessageItem : public Item
|
class MessageItem : public Item
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QString message_;
|
QString message_;
|
||||||
QMessageBox* messageBox_ = nullptr;
|
QMessageBox* messageBox_ = nullptr;
|
||||||
QString alertSoundFileName = "";
|
QString alertSoundFileName = "";
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static BroadCast* broadCast;
|
static BroadCast* broadCast;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void closeMessageBox();
|
void closeMessageBox();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
MessageItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr);
|
MessageItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0,
|
||||||
MessageItem(const ItemData& itemData, QObject *parent = nullptr);
|
QObject *parent = nullptr);
|
||||||
~MessageItem();
|
MessageItem(const ItemData& itemData, QObject *parent = nullptr);
|
||||||
|
~MessageItem();
|
||||||
|
|
||||||
void setMessage(const QString& in);
|
void setMessage(const QString& in);
|
||||||
QString getMessage();
|
QString getMessage();
|
||||||
void setAlert(const QString& in);
|
void setAlert(const QString& in);
|
||||||
QString getAlert();
|
QString getAlert();
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MESSAGEITEM_H
|
#endif // MESSAGEITEM_H
|
||||||
|
@ -3,31 +3,32 @@
|
|||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDebug>
|
#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));
|
stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true));
|
||||||
setValue(true);
|
setValue(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PowerItem::setValue(uint8_t value)
|
void PowerItem::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
qDebug()<<"shutdown";
|
qDebug()<<"shutdown";
|
||||||
Item::setValue(value);
|
Item::setValue(value);
|
||||||
if(!value)
|
if(!value)
|
||||||
{
|
{
|
||||||
QTimer::singleShot(5000, this, &PowerItem::timeout);
|
QTimer::singleShot(5000, this, &PowerItem::timeout);
|
||||||
stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 1, "Shutdown Imminent", true));
|
stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 1, "Shutdown Imminent", true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PowerItem::timeout()
|
void PowerItem::timeout()
|
||||||
{
|
{
|
||||||
qDebug()<<"shutdown timeout";
|
qDebug()<<"shutdown timeout";
|
||||||
QProcess::startDetached("syncoff");
|
QProcess::startDetached("syncoff", QStringList());
|
||||||
}
|
}
|
||||||
|
|
||||||
void PowerItem::store(QJsonObject& json)
|
void PowerItem::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Power";
|
json["Type"] = "Power";
|
||||||
Item::store(json);
|
Item::store(json);
|
||||||
}
|
}
|
||||||
|
@ -8,23 +8,27 @@
|
|||||||
|
|
||||||
class PowerItem: public Item
|
class PowerItem: public Item
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void stateChanged(Sensor sensor);
|
void stateChanged(Sensor sensor);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void timeout();
|
void timeout();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PowerItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr);
|
PowerItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0,
|
||||||
void emmitSensor(){stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true));}
|
QObject* parent = nullptr);
|
||||||
virtual void store(QJsonObject& json);
|
void emmitSensor()
|
||||||
|
{
|
||||||
|
stateChanged(Sensor(Sensor::TYPE_SHUTDOWN_IMMINENT, 0, 0, "Shutdown Imminent", true));
|
||||||
|
}
|
||||||
|
virtual void store(QJsonObject& json);
|
||||||
};
|
};
|
||||||
|
@ -5,66 +5,67 @@
|
|||||||
|
|
||||||
Microcontroller* Relay::micro_ = nullptr;
|
Microcontroller* Relay::micro_ = nullptr;
|
||||||
|
|
||||||
Relay::Relay(uint8_t id, QString name, uint16_t address, bool state, QObject* parent): Item(0, name, state, parent), id_(id), address_(address)
|
Relay::Relay(uint8_t id, QString name, uint16_t address, bool state, QObject* parent): Item(0, name, state, parent),
|
||||||
|
id_(id), address_(address)
|
||||||
{
|
{
|
||||||
itemId_ = address | ((uint32_t)id << 16);
|
itemId_ = address | ((uint32_t)id << 16);
|
||||||
qDebug()<<"Relay "<<id_<<"Name "<<name<<" id "<<itemId_<<" state "<<state<<" addr: "<<address;
|
qDebug()<<"Relay "<<id_<<"Name "<<name<<" id "<<itemId_<<" state "<<state<<" addr: "<<address;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::setValue(uint8_t value)
|
void Relay::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
Item::setValue(value);
|
Item::setValue(value);
|
||||||
if(micro_)
|
if(micro_)
|
||||||
{
|
{
|
||||||
if(value)micro_->relayOn(id_);
|
if(value)micro_->relayOn(id_);
|
||||||
else micro_->relayOff(id_);
|
else micro_->relayOff(id_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::on()
|
void Relay::on()
|
||||||
{
|
{
|
||||||
setValue(true);
|
setValue(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::off()
|
void Relay::off()
|
||||||
{
|
{
|
||||||
setValue(false);
|
setValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::toggle()
|
void Relay::toggle()
|
||||||
{
|
{
|
||||||
value_ ? off() : on();
|
value_ ? off() : on();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::store(QJsonObject& json)
|
void Relay::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Relay";
|
json["Type"] = "Relay";
|
||||||
Item::store(json);
|
Item::store(json);
|
||||||
json["Id"] = static_cast<double>(id_);
|
json["Id"] = static_cast<double>(id_);
|
||||||
json["Address"] = address_;
|
json["Address"] = address_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::load(const QJsonObject& json, const bool preserve)
|
void Relay::load(const QJsonObject& json, const bool preserve)
|
||||||
{
|
{
|
||||||
Item::load(json, preserve);
|
Item::load(json, preserve);
|
||||||
id_ = static_cast<uint8_t>(json["Id"].toInt(0));
|
id_ = static_cast<uint8_t>(json["Id"].toInt(0));
|
||||||
address_ = static_cast<uint16_t>(json["Address"].toInt(0));
|
address_ = static_cast<uint16_t>(json["Address"].toInt(0));
|
||||||
itemId_ = address_ | (static_cast<uint32_t>(id_) << 16);
|
itemId_ = address_ | (static_cast<uint32_t>(id_) << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t Relay::getAddress() const
|
uint16_t Relay::getAddress() const
|
||||||
{
|
{
|
||||||
return address_;
|
return address_;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Relay::getId() const
|
uint8_t Relay::getId() const
|
||||||
{
|
{
|
||||||
return id_;
|
return id_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relay::setId(uint8_t id)
|
void Relay::setId(uint8_t id)
|
||||||
{
|
{
|
||||||
id_=id;
|
id_=id;
|
||||||
itemId_ = address_ | ((uint32_t)id << 16);
|
itemId_ = address_ | ((uint32_t)id << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,30 +11,33 @@ class Microcontroller;
|
|||||||
|
|
||||||
class Relay : public Item
|
class Relay : public Item
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
static Microcontroller* micro_;
|
static Microcontroller* micro_;
|
||||||
|
|
||||||
uint8_t id_;
|
uint8_t id_;
|
||||||
uint16_t address_;
|
uint16_t address_;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
void on();
|
void on();
|
||||||
void off();
|
void off();
|
||||||
void toggle();
|
void toggle();
|
||||||
|
|
||||||
public:
|
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;
|
uint16_t getAddress() const;
|
||||||
uint8_t getId() const;
|
uint8_t getId() const;
|
||||||
void setId(uint8_t id);
|
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 store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||||
};
|
};
|
||||||
#endif // RELAY_H
|
#endif // RELAY_H
|
||||||
|
@ -1,18 +1,19 @@
|
|||||||
#include "rgbitem.h"
|
#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::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
Item::setValue(value);
|
Item::setValue(value);
|
||||||
value ? micro_->rgbOn() : micro_->rgbOff();
|
value ? micro_->rgbOn() : micro_->rgbOff();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RgbItem::store(QJsonObject &json)
|
void RgbItem::store(QJsonObject &json)
|
||||||
{
|
{
|
||||||
json["Type"] = "Rgb";
|
json["Type"] = "Rgb";
|
||||||
Item::store(json);
|
Item::store(json);
|
||||||
}
|
}
|
||||||
|
@ -5,16 +5,17 @@
|
|||||||
|
|
||||||
class RgbItem: public Item
|
class RgbItem: public Item
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
Microcontroller* micro_;
|
Microcontroller* micro_;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RgbItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "", uint8_t value = 0, QObject* parent = nullptr);
|
RgbItem(Microcontroller* micro, uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "",
|
||||||
|
uint8_t value = 0, QObject* parent = nullptr);
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
};
|
};
|
||||||
|
@ -3,41 +3,41 @@
|
|||||||
|
|
||||||
void SystemItem::setValue(uint8_t value)
|
void SystemItem::setValue(uint8_t value)
|
||||||
{
|
{
|
||||||
QProcess::execute(value ? onCommand_ : offCommand_);
|
QProcess::execute(value ? onCommand_ : offCommand_);
|
||||||
}
|
}
|
||||||
|
|
||||||
SystemItem::SystemItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent):
|
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):
|
SystemItem::SystemItem(const ItemData& itemData, QObject *parent):
|
||||||
Item(itemData, parent)
|
Item(itemData, parent)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemItem::setOnCommand(const QString& in)
|
void SystemItem::setOnCommand(const QString& in)
|
||||||
{
|
{
|
||||||
onCommand_ = in;
|
onCommand_ = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemItem::setOffCommand(const QString& in)
|
void SystemItem::setOffCommand(const QString& in)
|
||||||
{
|
{
|
||||||
offCommand_ = in;
|
offCommand_ = in;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemItem::store(QJsonObject& json)
|
void SystemItem::store(QJsonObject& json)
|
||||||
{
|
{
|
||||||
json["Type"] = "System";
|
json["Type"] = "System";
|
||||||
Item::store(json);
|
Item::store(json);
|
||||||
json["OnCommand"] = onCommand_;
|
json["OnCommand"] = onCommand_;
|
||||||
json["OffCommand"] = offCommand_;
|
json["OffCommand"] = offCommand_;
|
||||||
}
|
}
|
||||||
void SystemItem::load(const QJsonObject& json, const bool preserve)
|
void SystemItem::load(const QJsonObject& json, const bool preserve)
|
||||||
{
|
{
|
||||||
Item::load(json,preserve);
|
Item::load(json,preserve);
|
||||||
onCommand_ = json["OnCommand"].toString("");
|
onCommand_ = json["OnCommand"].toString("");
|
||||||
offCommand_ = json["OffCommand"].toString("");
|
offCommand_ = json["OffCommand"].toString("");
|
||||||
}
|
}
|
||||||
|
@ -6,29 +6,36 @@
|
|||||||
|
|
||||||
class SystemItem : public Item
|
class SystemItem : public Item
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QString onCommand_;
|
QString onCommand_;
|
||||||
QString offCommand_;
|
QString offCommand_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
virtual void setValue(uint8_t value);
|
virtual void setValue(uint8_t value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SystemItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0, QObject *parent = nullptr);
|
SystemItem(uint32_t itemIdIn = QRandomGenerator::global()->generate(), QString name = "Item", uint8_t value = 0,
|
||||||
SystemItem(const ItemData& itemData, QObject *parent = nullptr);
|
QObject *parent = nullptr);
|
||||||
~SystemItem() = default;
|
SystemItem(const ItemData& itemData, QObject *parent = nullptr);
|
||||||
|
~SystemItem() = default;
|
||||||
|
|
||||||
void setOnCommand(const QString& in);
|
void setOnCommand(const QString& in);
|
||||||
void setOffCommand(const QString& in);
|
void setOffCommand(const QString& in);
|
||||||
QString getOnCommand(){return onCommand_;}
|
QString getOnCommand()
|
||||||
QString getOffCommand(){return offCommand_;}
|
{
|
||||||
|
return onCommand_;
|
||||||
|
}
|
||||||
|
QString getOffCommand()
|
||||||
|
{
|
||||||
|
return offCommand_;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void store(QJsonObject& json);
|
virtual void store(QJsonObject& json);
|
||||||
virtual void load(const QJsonObject& json, const bool preserve = false);
|
virtual void load(const QJsonObject& json, const bool preserve = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SYSTEMITEM_H
|
#endif // SYSTEMITEM_H
|
||||||
|
181
src/main.cpp
181
src/main.cpp
@ -4,6 +4,9 @@
|
|||||||
#include <QTcpSocket>
|
#include <QTcpSocket>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
//Currently pipewire support is disabled
|
||||||
|
//#include <pipewire/pipewire.h>
|
||||||
|
|
||||||
|
|
||||||
#ifndef Q_OS_ANDROID
|
#ifndef Q_OS_ANDROID
|
||||||
#include <QtSerialPort/QtSerialPort>
|
#include <QtSerialPort/QtSerialPort>
|
||||||
@ -11,18 +14,9 @@
|
|||||||
#include <QCommandLineParser>
|
#include <QCommandLineParser>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "actors/alarmtime.h"
|
|
||||||
#include "microcontroller.h"
|
#include "microcontroller.h"
|
||||||
#include "ui/mainwindow.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/itemstore.h"
|
||||||
#include "items/auxitem.h"
|
|
||||||
#include "items/rgbitem.h"
|
|
||||||
#include "items/poweritem.h"
|
|
||||||
#include "mainobject.h"
|
#include "mainobject.h"
|
||||||
|
|
||||||
|
|
||||||
@ -30,104 +24,115 @@
|
|||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
//set info
|
//pw_init(&argc, &argv);
|
||||||
QCoreApplication::setOrganizationName("UVOS");
|
|
||||||
QCoreApplication::setOrganizationDomain("uvos.xyz");
|
|
||||||
QCoreApplication::setApplicationName("SHinterface");
|
|
||||||
QCoreApplication::setApplicationVersion("0.6");
|
|
||||||
|
|
||||||
QDir::setCurrent(a.applicationDirPath());
|
//set info
|
||||||
|
QCoreApplication::setOrganizationName("UVOS");
|
||||||
|
QCoreApplication::setOrganizationDomain("uvos.xyz");
|
||||||
|
QCoreApplication::setApplicationName("SHinterface");
|
||||||
|
QCoreApplication::setApplicationVersion("0.6");
|
||||||
|
|
||||||
//parse comand line
|
QDir::setCurrent(a.applicationDirPath());
|
||||||
#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
|
|
||||||
|
|
||||||
QIODevice* masterIODevice = nullptr;
|
//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
|
||||||
|
|
||||||
#ifndef Q_OS_ANDROID
|
QIODevice* masterIODevice = nullptr;
|
||||||
if(parser.isSet(tcpOption))
|
|
||||||
{
|
|
||||||
QTcpSocket* microSocket = new QTcpSocket;
|
|
||||||
|
|
||||||
int port = 6856;
|
#ifndef Q_OS_ANDROID
|
||||||
if(parser.isSet(portOption)) port = parser.value(portOption).toInt();
|
if(parser.isSet(tcpOption))
|
||||||
|
{
|
||||||
|
QTcpSocket* microSocket = new QTcpSocket;
|
||||||
|
|
||||||
QString host("127.0.0.1");
|
int port = 6856;
|
||||||
if(parser.isSet(hostOption)) host = parser.value(hostOption);
|
if(parser.isSet(portOption)) port = parser.value(portOption).toInt();
|
||||||
std::cout<<"connecting to "<<host.toStdString()<<':'<<port<<'\n';
|
|
||||||
microSocket->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");
|
|
||||||
|
|
||||||
if(parser.isSet(portOption)) microPort->setBaudRate(parser.value(baudOption).toInt());
|
QString host("127.0.0.1");
|
||||||
else microPort->setBaudRate(BAUD);
|
if(parser.isSet(hostOption)) host = parser.value(hostOption);
|
||||||
|
std::cout<<"connecting to "<<host.toStdString()<<':'<<port<<'\n';
|
||||||
|
microSocket->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");
|
||||||
|
|
||||||
if(!microPort->open(QIODevice::ReadWrite)) std::cout<<"Can not open serial port "<<microPort->portName().toStdString()<<". Continueing in demo mode"<<'\n';
|
if(parser.isSet(portOption)) microPort->setBaudRate(parser.value(baudOption).toInt());
|
||||||
masterIODevice = microPort;
|
else microPort->setBaudRate(BAUD);
|
||||||
}
|
|
||||||
|
|
||||||
MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "", !parser.isSet(secondaryOption));
|
if(!microPort->open(QIODevice::ReadWrite)) std::cout<<"Can not open serial port "<<microPort->portName().toStdString()
|
||||||
|
<<". Continueing in demo mode"<<'\n';
|
||||||
|
masterIODevice = microPort;
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "",
|
||||||
QTcpSocket* microSocket = new QTcpSocket;
|
!parser.isSet(secondaryOption));
|
||||||
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;
|
|
||||||
|
|
||||||
MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "", !parser.isSet(secondaryOption));
|
#else
|
||||||
#endif
|
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;
|
||||||
|
|
||||||
|
MainObject mainObject(masterIODevice, parser.isSet(settingsPathOption) ? parser.value(settingsPathOption) : "",
|
||||||
|
!parser.isSet(secondaryOption));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//mainwindow
|
//mainwindow
|
||||||
MainWindow w(&mainObject);
|
MainWindow w(&mainObject);
|
||||||
QObject::connect(&mainObject.micro, SIGNAL(textRecived(QString)), &w, SLOT(changeHeaderLableText(QString)));
|
QObject::connect(&mainObject.micro, SIGNAL(textRecived(QString)), &w, SLOT(changeHeaderLableText(QString)));
|
||||||
QObject::connect(&w, &MainWindow::sigBrodcast, &mainObject, &MainObject::sendJson);
|
QObject::connect(&w, &MainWindow::sigBrodcast, &mainObject, &MainObject::sendJson);
|
||||||
QObject::connect(&w, &MainWindow::sigSave, &mainObject, &MainObject::storeToDisk);
|
QObject::connect(&w, &MainWindow::sigSave, &mainObject, &MainObject::storeToDisk);
|
||||||
QObject::connect(&w, &MainWindow::createdItem, &mainObject.items, &ItemStore::addItem);
|
QObject::connect(&w, &MainWindow::createdItem, &mainObject.items, &ItemStore::addItem);
|
||||||
if(!mainObject.micro.connected()) w.changeHeaderLableText("No io debug only!");
|
if(!mainObject.micro.connected())
|
||||||
|
w.changeHeaderLableText("No io debug only!");
|
||||||
|
|
||||||
w.show();
|
w.show();
|
||||||
|
|
||||||
int retVal = a.exec();
|
int retVal = a.exec();
|
||||||
|
|
||||||
if(masterIODevice)
|
if(masterIODevice)
|
||||||
delete masterIODevice;
|
delete masterIODevice;
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,56 +2,60 @@
|
|||||||
#include "items/messageitem.h"
|
#include "items/messageitem.h"
|
||||||
|
|
||||||
MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent) :
|
MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent) :
|
||||||
QObject(parent),
|
QObject(parent),
|
||||||
master(masterIn),
|
master(masterIn),
|
||||||
masterIODevice(ioDevice),
|
masterIODevice(ioDevice),
|
||||||
ioMultiplexer(masterIODevice),
|
ioMultiplexer(masterIODevice),
|
||||||
micro(ioMultiplexer.getIoDevice()),
|
micro(ioMultiplexer.getIoDevice()),
|
||||||
broadCast(ioMultiplexer.getIoDevice(), masterIn),
|
broadCast(ioMultiplexer.getIoDevice(), masterIn),
|
||||||
settingsPath(settingsPathIn),
|
settingsPath(settingsPathIn),
|
||||||
sunSensorSource(49.884450, 8.650536),
|
sunSensorSource(49.884450, 8.650536),
|
||||||
powerItem(new PowerItem),
|
powerItem(new PowerItem),
|
||||||
rgbItem(new RgbItem(µ, 5487422, "Rgb Lights")),
|
rgbItem(new RgbItem(µ, 5487422, "Rgb Lights")),
|
||||||
auxItem(new AuxItem(µ, 5487421, "Desk Light"))
|
auxItem(new AuxItem(µ, 5487421, "Desk Light"))
|
||||||
|
|
||||||
{
|
{
|
||||||
qDebug()<<"Is master:"<<master;
|
qDebug()<<"Is master:"<<master;
|
||||||
//connect sensors subsystem
|
//connect sensors subsystem
|
||||||
QObject::connect(µ, &Microcontroller::gotSensorState, &globalSensors, &SensorStore::sensorGotState);
|
QObject::connect(µ, &Microcontroller::gotSensorState, &globalSensors, &SensorStore::sensorGotState);
|
||||||
QObject::connect(&sunSensorSource, &SunSensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState);
|
QObject::connect(&sunSensorSource, &SunSensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState);
|
||||||
QObject::connect(&globalSensors, &SensorStore::sensorChangedState, &ocupancySensor, &OcupancySensorSource::sensorEvent);
|
QObject::connect(&globalSensors, &SensorStore::sensorChangedState, &ocupancySensor, &OcupancySensorSource::sensorEvent);
|
||||||
QObject::connect(&ocupancySensor, &OcupancySensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState);
|
QObject::connect(&ocupancySensor, &OcupancySensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState);
|
||||||
|
|
||||||
sunSensorSource.run();
|
sunSensorSource.run();
|
||||||
|
//pwHandler.startLoop();
|
||||||
|
|
||||||
//connect item store
|
//connect item store
|
||||||
QObject::connect(µ, &Microcontroller::gotRelayList, &items, &ItemStore::addItems);
|
QObject::connect(µ, &Microcontroller::gotRelayList, &items, &ItemStore::addItems);
|
||||||
QObject::connect(µ, &Microcontroller::itemChanged, &items, &ItemStore::itemStateChanged);
|
QObject::connect(µ, &Microcontroller::itemChanged, &items, &ItemStore::itemStateChanged);
|
||||||
|
|
||||||
//special items
|
//special items
|
||||||
QObject::connect(powerItem.get(), &PowerItem::stateChanged, &globalSensors, &SensorStore::sensorGotState);
|
QObject::connect(powerItem.get(), &PowerItem::stateChanged, &globalSensors, &SensorStore::sensorGotState);
|
||||||
powerItem->emmitSensor();
|
powerItem->emmitSensor();
|
||||||
items.addItem(rgbItem);
|
items.addItem(rgbItem);
|
||||||
items.addItem(auxItem);
|
items.addItem(auxItem);
|
||||||
MessageItem::broadCast = &broadCast;
|
MessageItem::broadCast = &broadCast;
|
||||||
|
|
||||||
|
Relay::setMicrocontroller(µ);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
connect(&broadCast, &BroadCast::gotJson, this, &MainObject::recivedJson);
|
if(master)
|
||||||
QObject::connect(&broadCast, &BroadCast::gotSensorState, &globalSensors, &SensorStore::sensorGotState);
|
{
|
||||||
if(master)connect(&broadCast, &BroadCast::jsonRequested, this, &MainObject::sendJson);
|
load(getJsonObjectFromDisk(settingsPath, &noSave));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
broadCast.requestJson();
|
||||||
|
broadCast.requestSensors();
|
||||||
|
}
|
||||||
|
|
||||||
if(master) load(getJsonObjectFromDisk(settingsPath, &noSave));
|
#ifndef Q_OS_ANDROID
|
||||||
else
|
Item::secondaryFlag = !master;
|
||||||
{
|
#endif
|
||||||
broadCast.requestJson();
|
|
||||||
broadCast.requestSensors();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef Q_OS_ANDROID
|
|
||||||
Item::secondaryFlag = !master;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MainObject::~MainObject()
|
MainObject::~MainObject()
|
||||||
@ -60,36 +64,36 @@ MainObject::~MainObject()
|
|||||||
|
|
||||||
void MainObject::store(QJsonObject &json)
|
void MainObject::store(QJsonObject &json)
|
||||||
{
|
{
|
||||||
items.store(json);
|
items.store(json);
|
||||||
|
|
||||||
QJsonObject powerObject;
|
QJsonObject powerObject;
|
||||||
powerItem->store(powerObject);
|
powerItem->store(powerObject);
|
||||||
json.insert("Power", powerObject);
|
json.insert("Power", powerObject);
|
||||||
QJsonDocument pwrDoc(powerObject);
|
QJsonDocument pwrDoc(powerObject);
|
||||||
|
|
||||||
QJsonObject ocupancyObject;
|
QJsonObject ocupancyObject;
|
||||||
ocupancySensor.store(ocupancyObject);
|
ocupancySensor.store(ocupancyObject);
|
||||||
json.insert("Ocupancy", ocupancyObject);
|
json.insert("Ocupancy", ocupancyObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainObject::load(const QJsonObject& json)
|
void MainObject::load(const QJsonObject& json)
|
||||||
{
|
{
|
||||||
items.clear();
|
items.clear();
|
||||||
rgbItem->removeAllActors();
|
rgbItem->removeAllActors();
|
||||||
auxItem->removeAllActors();
|
auxItem->removeAllActors();
|
||||||
powerItem->removeAllActors();
|
powerItem->removeAllActors();
|
||||||
items.addItem(rgbItem);
|
items.addItem(rgbItem);
|
||||||
items.addItem(auxItem);
|
items.addItem(auxItem);
|
||||||
items.load(json);
|
items.load(json);
|
||||||
powerItem->load(json["Power"].toObject());
|
powerItem->load(json["Power"].toObject());
|
||||||
ocupancySensor.load(json["Ocupancy"].toObject());
|
ocupancySensor.load(json["Ocupancy"].toObject());
|
||||||
qDebug()<<"aray size: "<<json.isEmpty();
|
qDebug()<<"aray size: "<<json.isEmpty();
|
||||||
if(json["Items"].toArray().size() >= 2)
|
if(json["Items"].toArray().size() >= 2)
|
||||||
{
|
{
|
||||||
rgbItem->load(json["Items"].toArray()[0].toObject());
|
rgbItem->load(json["Items"].toArray()[0].toObject());
|
||||||
auxItem->load(json["Items"].toArray()[1].toObject());
|
auxItem->load(json["Items"].toArray()[1].toObject());
|
||||||
}
|
}
|
||||||
micro.requestState();
|
micro.requestState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainObject::storeToDisk()
|
void MainObject::storeToDisk()
|
||||||
@ -106,70 +110,70 @@ void MainObject::recivedJson(const QJsonObject json)
|
|||||||
{
|
{
|
||||||
if(master && !noSave)
|
if(master && !noSave)
|
||||||
storeJsonObjectToDisk(json, settingsPath);
|
storeJsonObjectToDisk(json, settingsPath);
|
||||||
load(json);
|
load(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainObject::sendJson()
|
void MainObject::sendJson()
|
||||||
{
|
{
|
||||||
QJsonObject json;
|
QJsonObject json;
|
||||||
store(json);
|
store(json);
|
||||||
broadCast.sendJson(json);
|
broadCast.sendJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
QJsonObject MainObject::getJsonObjectFromDisk(const QString& filePath, bool* error)
|
QJsonObject MainObject::getJsonObjectFromDisk(const QString& filePath, bool* error)
|
||||||
{
|
{
|
||||||
QFile file;
|
QFile file;
|
||||||
|
|
||||||
#ifndef Q_OS_ANDROID
|
#ifndef Q_OS_ANDROID
|
||||||
if(filePath.size() > 0) file.setFileName(filePath);
|
if(filePath.size() > 0) file.setFileName(filePath);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
file.setFileName(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/shinterface.json");
|
file.setFileName(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/shinterface.json");
|
||||||
}
|
}
|
||||||
|
|
||||||
file.open(QIODevice::ReadOnly);
|
file.open(QIODevice::ReadOnly);
|
||||||
if(!file.isOpen()) std::cerr<<"Can not open config file: "<<filePath.toLatin1().data()<<std::endl;
|
if(!file.isOpen()) std::cerr<<"Can not open config file: "<<filePath.toLatin1().data()<<std::endl;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QJsonParseError qerror;
|
QJsonParseError qerror;
|
||||||
QJsonDocument document(QJsonDocument::fromJson(file.readAll(), &qerror));
|
QJsonDocument document(QJsonDocument::fromJson(file.readAll(), &qerror));
|
||||||
file.close();
|
file.close();
|
||||||
if(qerror.error != QJsonParseError::NoError)
|
if(qerror.error != QJsonParseError::NoError)
|
||||||
{
|
{
|
||||||
qDebug()<<filePath<<" "<<qerror.errorString();
|
qDebug()<<filePath<<" "<<qerror.errorString();
|
||||||
if(error) (*error) = true;
|
if(error) (*error) = true;
|
||||||
}
|
}
|
||||||
return document.object();
|
return document.object();
|
||||||
}
|
}
|
||||||
return QJsonObject();
|
return QJsonObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MainObject::storeJsonObjectToDisk(const QJsonObject& json, QString filePath)
|
bool MainObject::storeJsonObjectToDisk(const QJsonObject& json, QString filePath)
|
||||||
{
|
{
|
||||||
#ifndef Q_OS_ANDROID
|
#ifndef Q_OS_ANDROID
|
||||||
if(filePath.size() == 0)
|
if(filePath.size() == 0)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
filePath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/shinterface.json";
|
filePath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + "/shinterface.json";
|
||||||
}
|
}
|
||||||
QFile file(filePath + ".out");
|
QFile file(filePath + ".out");
|
||||||
|
|
||||||
qDebug()<<"config file: "<<filePath;
|
qDebug()<<"config file: "<<filePath;
|
||||||
file.open(QIODevice::WriteOnly);
|
file.open(QIODevice::WriteOnly);
|
||||||
if(!file.isOpen())
|
if(!file.isOpen())
|
||||||
{
|
{
|
||||||
std::cerr<<"Can not open config file: "<<filePath.toLatin1().data()<<std::endl;
|
std::cerr<<"Can not open config file: "<<filePath.toLatin1().data()<<std::endl;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QJsonDocument document(json);
|
QJsonDocument document(json);
|
||||||
file.write(document.toJson());
|
file.write(document.toJson());
|
||||||
file.close();
|
file.close();
|
||||||
QFile::remove(filePath);
|
QFile::remove(filePath);
|
||||||
file.rename(filePath);
|
file.rename(filePath);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,56 +32,60 @@
|
|||||||
#include "items/poweritem.h"
|
#include "items/poweritem.h"
|
||||||
#include "iomuliplexer.h"
|
#include "iomuliplexer.h"
|
||||||
#include "broadcast.h"
|
#include "broadcast.h"
|
||||||
|
//#include "pipewire.h"
|
||||||
|
|
||||||
class MainObject : public QObject
|
class MainObject : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//io
|
//io
|
||||||
const bool master;
|
const bool master;
|
||||||
|
|
||||||
bool noSave = false;
|
bool noSave = false;
|
||||||
|
|
||||||
QIODevice * const masterIODevice = nullptr;
|
QIODevice * const masterIODevice = nullptr;
|
||||||
IoMuliplexer ioMultiplexer;
|
IoMuliplexer ioMultiplexer;
|
||||||
|
|
||||||
Microcontroller micro;
|
Microcontroller micro;
|
||||||
BroadCast broadCast;
|
BroadCast broadCast;
|
||||||
|
|
||||||
const QString settingsPath;
|
|
||||||
|
|
||||||
//sensors
|
const QString settingsPath;
|
||||||
SunSensorSource sunSensorSource;
|
|
||||||
OcupancySensorSource ocupancySensor;
|
|
||||||
|
|
||||||
//items
|
//sensors
|
||||||
ItemStore items;
|
SunSensorSource sunSensorSource;
|
||||||
|
OcupancySensorSource ocupancySensor;
|
||||||
|
|
||||||
std::shared_ptr<PowerItem> powerItem;
|
//items
|
||||||
std::shared_ptr<RgbItem> rgbItem;
|
ItemStore items;
|
||||||
std::shared_ptr<AuxItem> auxItem;
|
|
||||||
|
std::shared_ptr<PowerItem> powerItem;
|
||||||
|
std::shared_ptr<RgbItem> rgbItem;
|
||||||
|
std::shared_ptr<AuxItem> auxItem;
|
||||||
|
|
||||||
|
//PipeWireHandler pwHandler;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
static QJsonObject getJsonObjectFromDisk(const QString& filePath = "", bool* error = nullptr);
|
static QJsonObject getJsonObjectFromDisk(const QString& filePath = "", bool* error = nullptr);
|
||||||
static bool storeJsonObjectToDisk(const QJsonObject& json, QString filePath = "");
|
static bool storeJsonObjectToDisk(const QJsonObject& json, QString filePath = "");
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent = nullptr);
|
explicit MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent = nullptr);
|
||||||
~MainObject();
|
~MainObject();
|
||||||
|
|
||||||
void store(QJsonObject& json);
|
void store(QJsonObject& json);
|
||||||
|
|
||||||
void load(const QJsonObject& json);
|
void load(const QJsonObject& json);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void storeToDisk();
|
void storeToDisk();
|
||||||
void sendJson();
|
void sendJson();
|
||||||
void recivedJson(const QJsonObject json);
|
void recivedJson(const QJsonObject json);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -7,104 +7,104 @@ static constexpr bool debug = true;
|
|||||||
|
|
||||||
void Microcontroller::relayToggle(int state, int relay)
|
void Microcontroller::relayToggle(int state, int relay)
|
||||||
{
|
{
|
||||||
char buffer[8];
|
char buffer[8];
|
||||||
int length = sprintf(buffer, "%d \n", relay);
|
int length = sprintf(buffer, "%d \n", relay);
|
||||||
state ? write("item on ") : write("item off ");
|
state ? write("item on ") : write("item off ");
|
||||||
write(buffer, length);
|
write(buffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::relayOn(int relay)
|
void Microcontroller::relayOn(int relay)
|
||||||
{
|
{
|
||||||
relayToggle(true, relay);
|
relayToggle(true, relay);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::relayOff(int relay)
|
void Microcontroller::relayOff(int relay)
|
||||||
{
|
{
|
||||||
relayToggle(false, relay);
|
relayToggle(false, relay);
|
||||||
}
|
}
|
||||||
|
|
||||||
//rgb lights
|
//rgb lights
|
||||||
|
|
||||||
void Microcontroller::rgbOn()
|
void Microcontroller::rgbOn()
|
||||||
{
|
{
|
||||||
write("rgb on\n");
|
write("rgb on\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::rgbOff()
|
void Microcontroller::rgbOff()
|
||||||
{
|
{
|
||||||
write( "rgb off\n");
|
write( "rgb off\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::changeRgbColor(const QColor color)
|
void Microcontroller::changeRgbColor(const QColor color)
|
||||||
{
|
{
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
int length = sprintf(buffer, "rgb set %03d %03d %03d\n", color.red(), color.green(), color.blue());
|
int length = sprintf(buffer, "rgb set %03d %03d %03d\n", color.red(), color.green(), color.blue());
|
||||||
write(buffer, length);
|
write(buffer, length);
|
||||||
std::cout<<buffer;
|
std::cout<<buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::setAuxPwm(int duty)
|
void Microcontroller::setAuxPwm(int duty)
|
||||||
{
|
{
|
||||||
char buffer[64];
|
char buffer[64];
|
||||||
int length = sprintf(buffer, "aux set %03d\n", duty );
|
int length = sprintf(buffer, "aux set %03d\n", duty );
|
||||||
write(buffer, length);
|
write(buffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::write(const QByteArray& buffer)
|
void Microcontroller::write(const QByteArray& buffer)
|
||||||
{
|
{
|
||||||
#ifndef Q_OS_ANDROID
|
#ifndef Q_OS_ANDROID
|
||||||
if constexpr(debug) std::cerr<<buffer.data();
|
if constexpr(debug) std::cerr<<buffer.data();
|
||||||
#endif
|
#endif
|
||||||
if(_port != nullptr)
|
if(_port != nullptr)
|
||||||
{
|
{
|
||||||
_port->write(buffer);
|
_port->write(buffer);
|
||||||
_port->waitForBytesWritten(1000);
|
_port->waitForBytesWritten(1000);
|
||||||
}
|
}
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(40));
|
std::this_thread::sleep_for(std::chrono::milliseconds(40));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::write(char* buffer, const size_t length)
|
void Microcontroller::write(char* buffer, const size_t length)
|
||||||
{
|
{
|
||||||
#ifndef Q_OS_ANDROID
|
#ifndef Q_OS_ANDROID
|
||||||
if constexpr(debug) std::cerr<<buffer;
|
if constexpr(debug) std::cerr<<buffer;
|
||||||
#endif
|
#endif
|
||||||
if(_port != nullptr)
|
if(_port != nullptr)
|
||||||
{
|
{
|
||||||
_port->write(buffer, length);
|
_port->write(buffer, length);
|
||||||
_port->waitForBytesWritten(1000);
|
_port->waitForBytesWritten(1000);
|
||||||
}
|
}
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(40));
|
std::this_thread::sleep_for(std::chrono::milliseconds(40));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::setPattern(int pattern)
|
void Microcontroller::setPattern(int pattern)
|
||||||
{
|
{
|
||||||
char buffer[4];
|
char buffer[4];
|
||||||
write("rgb pattern ");
|
write("rgb pattern ");
|
||||||
int length = sprintf(buffer, "%d\n", pattern);
|
int length = sprintf(buffer, "%d\n", pattern);
|
||||||
write(buffer, length);
|
write(buffer, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::startSunrise()
|
void Microcontroller::startSunrise()
|
||||||
{
|
{
|
||||||
setPattern(4);
|
setPattern(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Microcontroller::connected()
|
bool Microcontroller::connected()
|
||||||
{
|
{
|
||||||
if(_port != nullptr) return _port->isOpen();
|
if(_port != nullptr) return _port->isOpen();
|
||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::requestState()
|
void Microcontroller::requestState()
|
||||||
{
|
{
|
||||||
write("state\n");
|
write("state\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
//housekeeping
|
//housekeeping
|
||||||
|
|
||||||
Microcontroller::Microcontroller(QIODevice* port)
|
Microcontroller::Microcontroller(QIODevice* port)
|
||||||
{
|
{
|
||||||
setIODevice(port);
|
setIODevice(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
Microcontroller::Microcontroller()
|
Microcontroller::Microcontroller()
|
||||||
@ -117,81 +117,82 @@ Microcontroller::~Microcontroller()
|
|||||||
|
|
||||||
void Microcontroller::setIODevice(QIODevice *port)
|
void Microcontroller::setIODevice(QIODevice *port)
|
||||||
{
|
{
|
||||||
_port = port;
|
_port = port;
|
||||||
QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead);
|
QObject::connect(_port, &QIODevice::readyRead, this, &Microcontroller::isReadyRead);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<Relay> Microcontroller::processRelayLine(const QString& buffer)
|
std::shared_ptr<Relay> Microcontroller::processRelayLine(const QString& buffer)
|
||||||
{
|
{
|
||||||
QStringList bufferList = buffer.split(' ');
|
QStringList bufferList = buffer.split(' ');
|
||||||
if(bufferList.size() >= 9 && buffer.startsWith("ITEM NUMBER:"))
|
if(bufferList.size() >= 9 && buffer.startsWith("ITEM NUMBER:"))
|
||||||
{
|
{
|
||||||
QString name;
|
QString name;
|
||||||
for(int i = 10; i < bufferList.size(); i++) name.append(bufferList[i] + ' ');
|
for(int i = 10; i < bufferList.size(); i++) name.append(bufferList[i] + ' ');
|
||||||
if(name.size() > 1)name.remove(name.size()-1, 1);
|
if(name.size() > 1)name.remove(name.size()-1, 1);
|
||||||
else name = "Relay " + QString::number(bufferList[1].toInt(nullptr, 2));
|
else name = "Relay " + QString::number(bufferList[1].toInt(nullptr, 2));
|
||||||
return std::shared_ptr<Relay>( new Relay(bufferList[2].toInt(), name, bufferList[4].toInt(nullptr, 2), bufferList[8].toInt()));
|
return std::shared_ptr<Relay>( new Relay(bufferList[2].toInt(), name, bufferList[4].toInt(nullptr, 2),
|
||||||
}
|
bufferList[8].toInt()));
|
||||||
return nullptr;
|
}
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::processList(const QString& buffer)
|
void Microcontroller::processList(const QString& buffer)
|
||||||
{
|
{
|
||||||
QStringList bufferList = buffer.split(' ');
|
QStringList bufferList = buffer.split(' ');
|
||||||
if(bufferList.size() >= 8 && buffer.startsWith("ITEM NUMBER:"))
|
if(bufferList.size() >= 8 && buffer.startsWith("ITEM NUMBER:"))
|
||||||
{
|
{
|
||||||
relayList.push_back(processRelayLine(buffer));
|
relayList.push_back(processRelayLine(buffer));
|
||||||
}
|
}
|
||||||
else if(buffer.contains("EOL"))
|
else if(buffer.contains("EOL"))
|
||||||
{
|
{
|
||||||
listMode = false;
|
listMode = false;
|
||||||
qDebug()<<"got relay list " << relayList.size();
|
qDebug()<<"got relay list " << relayList.size();
|
||||||
gotRelayList(relayList);
|
gotRelayList(relayList);
|
||||||
relayList.clear();
|
relayList.clear();
|
||||||
}
|
}
|
||||||
else listMode = false;
|
else listMode = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::processRelayState(const QString& buffer)
|
void Microcontroller::processRelayState(const QString& buffer)
|
||||||
{
|
{
|
||||||
itemChanged(static_cast<ItemData>(*processRelayLine(buffer)));
|
itemChanged(static_cast<ItemData>(*processRelayLine(buffer)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::processSensorState(const QString& buffer)
|
void Microcontroller::processSensorState(const QString& buffer)
|
||||||
{
|
{
|
||||||
Sensor sensor = Sensor::sensorFromString(buffer);
|
Sensor sensor = Sensor::sensorFromString(buffer);
|
||||||
if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor);
|
if(sensor.type != Sensor::TYPE_DUMMY) gotSensorState(sensor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Microcontroller::processMicroReturn()
|
void Microcontroller::processMicroReturn()
|
||||||
{
|
{
|
||||||
if(listMode) processList(_buffer);
|
if(listMode) processList(_buffer);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(_buffer.startsWith("Items:"))
|
if(_buffer.startsWith("Items:"))
|
||||||
{
|
{
|
||||||
listMode = true;
|
listMode = true;
|
||||||
relayList.clear();
|
relayList.clear();
|
||||||
}
|
}
|
||||||
else if(_buffer.startsWith("ITEM NUMBER:"))processRelayState(_buffer);
|
else if(_buffer.startsWith("ITEM NUMBER:"))processRelayState(_buffer);
|
||||||
else if(_buffer.startsWith("SENSOR")) processSensorState(_buffer);
|
else if(_buffer.startsWith("SENSOR")) processSensorState(_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Microcontroller::isReadyRead()
|
void Microcontroller::isReadyRead()
|
||||||
{
|
{
|
||||||
char charBuf;
|
char charBuf;
|
||||||
while(_port->getChar(&charBuf))
|
while(_port->getChar(&charBuf))
|
||||||
{
|
{
|
||||||
_buffer.push_back(charBuf);
|
_buffer.push_back(charBuf);
|
||||||
if( _buffer.endsWith('\n') )
|
if( _buffer.endsWith('\n') )
|
||||||
{
|
{
|
||||||
_buffer.remove('\n');
|
_buffer.remove('\n');
|
||||||
processMicroReturn();
|
processMicroReturn();
|
||||||
textRecived(_buffer);
|
textRecived(_buffer);
|
||||||
_buffer.clear();
|
_buffer.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,69 +21,69 @@
|
|||||||
class Microcontroller : public QObject
|
class Microcontroller : public QObject
|
||||||
{
|
{
|
||||||
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static constexpr char AMP_RELAY = 0;
|
static constexpr char AMP_RELAY = 0;
|
||||||
static constexpr char SENSOR_TEMPERATURE = 1;
|
static constexpr char SENSOR_TEMPERATURE = 1;
|
||||||
static constexpr char SENSOR_DOOR = 0 ;
|
static constexpr char SENSOR_DOOR = 0 ;
|
||||||
|
|
||||||
private:
|
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<Item> > relayList;
|
std::vector< std::shared_ptr<Item> > relayList;
|
||||||
|
|
||||||
QScopedPointer<QEventLoop> loop;
|
QScopedPointer<QEventLoop> loop;
|
||||||
QString _buffer;
|
QString _buffer;
|
||||||
|
|
||||||
void processMicroReturn();
|
void processMicroReturn();
|
||||||
void processList(const QString& buffer);
|
void processList(const QString& buffer);
|
||||||
void processRelayState(const QString& buffer);
|
void processRelayState(const QString& buffer);
|
||||||
void processSensorState(const QString& buffer);
|
void processSensorState(const QString& buffer);
|
||||||
std::shared_ptr<Relay> processRelayLine(const QString& buffer);
|
std::shared_ptr<Relay> processRelayLine(const QString& buffer);
|
||||||
|
|
||||||
void write(char *buffer, const size_t length);
|
void write(char *buffer, const size_t length);
|
||||||
void write(const QByteArray& buffer);
|
void write(const QByteArray& buffer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Microcontroller(QIODevice* port);
|
Microcontroller(QIODevice* port);
|
||||||
Microcontroller();
|
Microcontroller();
|
||||||
~Microcontroller();
|
~Microcontroller();
|
||||||
bool connected();
|
bool connected();
|
||||||
void setIODevice(QIODevice* port);
|
void setIODevice(QIODevice* port);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void rgbOn();
|
void rgbOn();
|
||||||
void rgbOff();
|
void rgbOff();
|
||||||
void changeRgbColor(const QColor color);
|
void changeRgbColor(const QColor color);
|
||||||
void setPattern(int pattern);
|
void setPattern(int pattern);
|
||||||
void startSunrise();
|
void startSunrise();
|
||||||
|
|
||||||
void requestState();
|
void requestState();
|
||||||
|
|
||||||
void setAuxPwm(int duty);
|
void setAuxPwm(int duty);
|
||||||
|
|
||||||
void relayOn(int relay);
|
void relayOn(int relay);
|
||||||
void relayOff(int relay);
|
void relayOff(int relay);
|
||||||
void relayToggle(int state, int id);
|
void relayToggle(int state, int id);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void isReadyRead();
|
void isReadyRead();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void textRecived(const QString string);
|
void textRecived(const QString string);
|
||||||
void itemChanged(ItemData relay);
|
void itemChanged(ItemData relay);
|
||||||
void auxStateChanged(int value);
|
void auxStateChanged(int value);
|
||||||
void gotRelayList(std::vector< std::shared_ptr<Item> >&);
|
void gotRelayList(std::vector< std::shared_ptr<Item> >&);
|
||||||
|
|
||||||
void gotSensorState(Sensor sensor);
|
void gotSensorState(Sensor sensor);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MICROCONTROLLER_H
|
#endif // MICROCONTROLLER_H
|
||||||
|
72
src/pipewire.cpp
Normal file
72
src/pipewire.cpp
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
#include "pipewire.h"
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
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<PipeWireHandler*>(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:"<<id<<"name:"<<item->value;
|
||||||
|
handler->nodeAdded({id, item->value});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PipeWireHandler::~PipeWireHandler()
|
||||||
|
{
|
||||||
|
pw_core_disconnect(core);
|
||||||
|
pw_context_destroy(context);
|
||||||
|
pw_thread_loop_stop(loop);
|
||||||
|
}
|
||||||
|
|
56
src/pipewire.h
Normal file
56
src/pipewire.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <pipewire/context.h>
|
||||||
|
#include <pipewire/core.h>
|
||||||
|
#include <pipewire/pipewire.h>
|
||||||
|
#include <QObject>
|
||||||
|
#include <string>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
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();
|
||||||
|
};
|
||||||
|
|
@ -5,57 +5,58 @@
|
|||||||
#include "../apgetconnected.h"
|
#include "../apgetconnected.h"
|
||||||
|
|
||||||
|
|
||||||
OcupancySensorSource::OcupancySensorSource(QObject *parent, const QString& device, const QString& deviceMac): QObject (parent), deviceMac_(deviceMac), device_(device)
|
OcupancySensorSource::OcupancySensorSource(QObject *parent, const QString& device,
|
||||||
|
const QString& deviceMac): QObject (parent), deviceMac_(deviceMac), device_(device)
|
||||||
{
|
{
|
||||||
QTimer::singleShot(timeoutMs, this, &OcupancySensorSource::Timeout);
|
QTimer::singleShot(timeoutMs, this, &OcupancySensorSource::Timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OcupancySensorSource::sensorEvent(Sensor sensor)
|
void OcupancySensorSource::sensorEvent(Sensor sensor)
|
||||||
{
|
{
|
||||||
if(sensor.type == Sensor::TYPE_DOOR && sensor.id == 1 && sensor.field != 0.0f)
|
if(sensor.type == Sensor::TYPE_DOOR && sensor.id == 1 && sensor.field != 0.0f)
|
||||||
{
|
{
|
||||||
if(occupied == false) stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 1, "Occupancy"));
|
if(occupied == false) stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 1, "Occupancy"));
|
||||||
QTimer::singleShot(timeoutMs, this, &OcupancySensorSource::Timeout);
|
QTimer::singleShot(timeoutMs, this, &OcupancySensorSource::Timeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OcupancySensorSource::Timeout()
|
void OcupancySensorSource::Timeout()
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
qDebug()<<"testing for occupancy";
|
qDebug()<<"testing for occupancy";
|
||||||
std::vector<uint64_t> devices = ap::connectedDevices(device_.toLatin1().toStdString(), error);
|
std::vector<uint64_t> devices = ap::connectedDevices(device_.toLatin1().toStdString(), error);
|
||||||
if(error == 0)
|
if(error == 0)
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for(size_t i = 0; i < devices.size(); ++i)
|
for(size_t i = 0; i < devices.size(); ++i)
|
||||||
{
|
{
|
||||||
std::string mac = ap::macAddrToString(devices[i]);
|
std::string mac = ap::macAddrToString(devices[i]);
|
||||||
if(mac.find(deviceMac_.toLatin1().toStdString()) != std::string::npos)
|
if(mac.find(deviceMac_.toLatin1().toStdString()) != std::string::npos)
|
||||||
{
|
{
|
||||||
found = true;
|
found = true;
|
||||||
qDebug()<<"occupied";
|
qDebug()<<"occupied";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, found, "Occupancy"));
|
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, found, "Occupancy"));
|
||||||
occupied = found;
|
occupied = found;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, true, "Occupancy"));
|
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, true, "Occupancy"));
|
||||||
qDebug()<<"occupancy sensor error "<<error;
|
qDebug()<<"occupancy sensor error "<<error;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OcupancySensorSource::store(QJsonObject &json)
|
void OcupancySensorSource::store(QJsonObject &json)
|
||||||
{
|
{
|
||||||
json["Device"] = device_;
|
json["Device"] = device_;
|
||||||
json["MacAddres"] = deviceMac_;
|
json["MacAddres"] = deviceMac_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OcupancySensorSource::load(const QJsonObject &json)
|
void OcupancySensorSource::load(const QJsonObject &json)
|
||||||
{
|
{
|
||||||
device_ = json["Device"].toString("wlan0");
|
device_ = json["Device"].toString("wlan0");
|
||||||
deviceMac_ = json["MacAddres"].toString("60:BE:B5:25:8C:E0");
|
deviceMac_ = json["MacAddres"].toString("60:BE:B5:25:8C:E0");
|
||||||
}
|
}
|
||||||
|
@ -6,27 +6,28 @@
|
|||||||
|
|
||||||
class OcupancySensorSource : public QObject
|
class OcupancySensorSource : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
|
||||||
QString deviceMac_;
|
QString deviceMac_;
|
||||||
QString device_;
|
QString device_;
|
||||||
bool occupied = true;
|
bool occupied = true;
|
||||||
static constexpr unsigned timeoutMs = (15 * 60) * 1000;
|
static constexpr unsigned timeoutMs = (15 * 60) * 1000;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit OcupancySensorSource(QObject *parent = nullptr, const QString& device = "wlan0", const QString& deviceMac = "60:BE:B5:25:8C:E0");
|
explicit OcupancySensorSource(QObject *parent = nullptr, const QString& device = "wlan0",
|
||||||
|
const QString& deviceMac = "60:BE:B5:25:8C:E0");
|
||||||
|
|
||||||
void store(QJsonObject& json);
|
void store(QJsonObject& json);
|
||||||
void load(const QJsonObject& json);
|
void load(const QJsonObject& json);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void sensorEvent(Sensor sensor);
|
void sensorEvent(Sensor sensor);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void Timeout();
|
void Timeout();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void stateChanged(Sensor sensor);
|
void stateChanged(Sensor sensor);
|
||||||
};
|
};
|
||||||
|
74
src/sensors/pipewiresensor.cpp
Normal file
74
src/sensors/pipewiresensor.cpp
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#include "pipewiresensor.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
static const struct pw_node_events node_events = {
|
||||||
|
.version = PW_VERSION_NODE_EVENTS,
|
||||||
|
.info = &PipeWireSensorSource::nodeEventHandler,
|
||||||
|
.param = nullptr
|
||||||
|
};
|
||||||
|
|
||||||
|
PipeWireSensorSource::PipeWireSensorSource(PipeWireHandler* handler, const std::string& nodeName, uint8_t id, QObject *parent)
|
||||||
|
: QObject{parent}, handler_(handler), nodeName_(nodeName), id_(id)
|
||||||
|
{
|
||||||
|
connect(handler_, &PipeWireHandler::nodeAdded, this, &PipeWireSensorSource::nodeAdded);
|
||||||
|
connect(&timer, &QTimer::timeout, this, &PipeWireSensorSource::offTimeout);
|
||||||
|
timer.setSingleShot(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PipeWireSensorSource::offTimeout()
|
||||||
|
{
|
||||||
|
if(state == false)
|
||||||
|
return;
|
||||||
|
state = false;
|
||||||
|
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, id_, state));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PipeWireSensorSource::nodeEventHandler(void* data, const struct pw_node_info *info)
|
||||||
|
{
|
||||||
|
PipeWireSensorSource* source = static_cast<PipeWireSensorSource*>(data);
|
||||||
|
|
||||||
|
if(info->state == source->prevState)
|
||||||
|
return;
|
||||||
|
|
||||||
|
source->prevState = info->state;
|
||||||
|
|
||||||
|
switch (info->state)
|
||||||
|
{
|
||||||
|
case PW_NODE_STATE_ERROR:
|
||||||
|
case PW_NODE_STATE_CREATING:
|
||||||
|
source->state = false;
|
||||||
|
source->stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, source->id_, 0));
|
||||||
|
break;
|
||||||
|
case PW_NODE_STATE_SUSPENDED:
|
||||||
|
case PW_NODE_STATE_IDLE:
|
||||||
|
if(source->state == true)
|
||||||
|
source->timer.start(10000);
|
||||||
|
break;
|
||||||
|
case PW_NODE_STATE_RUNNING:
|
||||||
|
if(source->state == false)
|
||||||
|
{
|
||||||
|
source->state = true;
|
||||||
|
source->stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, source->id_, source->state));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PipeWireSensorSource::nodeAdded(PipeWireHandler::PwNode node)
|
||||||
|
{
|
||||||
|
if(node.name == nodeName_)
|
||||||
|
{
|
||||||
|
|
||||||
|
sinkNode = static_cast<struct pw_node*>(pw_registry_bind(handler_->getRegistry(), node.id, PW_TYPE_INTERFACE_Node, PW_VERSION_CLIENT, 0));
|
||||||
|
if(sinkNode)
|
||||||
|
{
|
||||||
|
qDebug()<<"Failed to register to required pipewire node"<<node.name.c_str()<<"as id"<<node.id;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pw_node_add_listener(sinkNode, &sinkListener, &node_events, this);
|
||||||
|
qDebug()<<"Found required pipewire node"<<node.name.c_str()<<"as id"<<node.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
40
src/sensors/pipewiresensor.h
Normal file
40
src/sensors/pipewiresensor.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#ifndef PIPEWIRESENSOR_H
|
||||||
|
#define PIPEWIRESENSOR_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <string>
|
||||||
|
#include <pipewire/core.h>
|
||||||
|
#include <pipewire/pipewire.h>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include "sensor.h"
|
||||||
|
#include "../pipewire.h"
|
||||||
|
|
||||||
|
class PipeWireSensorSource : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
PipeWireHandler* handler_;
|
||||||
|
std::string nodeName_;
|
||||||
|
struct pw_node* sinkNode = nullptr;
|
||||||
|
struct spa_hook sinkListener;
|
||||||
|
pw_node_state prevState = PW_NODE_STATE_SUSPENDED;
|
||||||
|
QTimer timer;
|
||||||
|
uint8_t id_;
|
||||||
|
bool state = false;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void offTimeout();
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PipeWireSensorSource(PipeWireHandler* handler, const std::string& nodeName, uint8_t id, QObject *parent = nullptr);
|
||||||
|
static void nodeEventHandler(void* data, const struct pw_node_info *info);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void stateChanged(Sensor sensor);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void nodeAdded(PipeWireHandler::PwNode node);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // PIPEWIRESENSOR_H
|
@ -6,44 +6,44 @@ SensorStore globalSensors;
|
|||||||
|
|
||||||
SensorStore::SensorStore(QObject *parent): QObject(parent)
|
SensorStore::SensorStore(QObject *parent): QObject(parent)
|
||||||
{
|
{
|
||||||
sensors_.push_back(Sensor(0,1,0,"Front door"));
|
sensors_.push_back(Sensor(0,1,0,"Front door"));
|
||||||
sensors_.push_back(Sensor(0,0,0,"Bedroom door"));
|
sensors_.push_back(Sensor(0,0,0,"Bedroom door"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorStore::sensorGotState(const Sensor& sensor)
|
void SensorStore::sensorGotState(const Sensor& sensor)
|
||||||
{
|
{
|
||||||
bool exsisting = false;
|
bool exsisting = false;
|
||||||
for(unsigned i = 0; i < sensors_.size(); ++i)
|
for(unsigned i = 0; i < sensors_.size(); ++i)
|
||||||
{
|
{
|
||||||
if(sensor.type == sensors_[i].type && sensor.id == sensors_[i].id)
|
if(sensor.type == sensors_[i].type && sensor.id == sensors_[i].id)
|
||||||
{
|
{
|
||||||
sensors_[i].updateSeen();
|
sensors_[i].updateSeen();
|
||||||
if(sensors_[i].field != sensor.field)
|
if(sensors_[i].field != sensor.field)
|
||||||
{
|
{
|
||||||
sensors_[i].field = sensor.field;
|
sensors_[i].field = sensor.field;
|
||||||
sensorChangedState(sensor);
|
sensorChangedState(sensor);
|
||||||
stateChenged(sensors_);
|
stateChenged(sensors_);
|
||||||
}
|
}
|
||||||
exsisting = true;
|
exsisting = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!exsisting)
|
if(!exsisting)
|
||||||
{
|
{
|
||||||
sensors_.push_back(sensor);
|
sensors_.push_back(sensor);
|
||||||
sensorChangedState(sensor);
|
sensorChangedState(sensor);
|
||||||
stateChenged(sensors_);
|
stateChenged(sensors_);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(unsigned i = 0; i < sensors_.size(); ++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))
|
if(sensors_[i].type > 0 && sensors_[i].type < 128 && QDateTime::currentDateTime() > sensors_[i].lastSeen.addSecs(1800))
|
||||||
{
|
{
|
||||||
sensorDeleted(sensors_[i]);
|
sensorDeleted(sensors_[i]);
|
||||||
stateChenged(sensors_);
|
stateChenged(sensors_);
|
||||||
sensors_.erase(sensors_.begin()+i);
|
sensors_.erase(sensors_.begin()+i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,91 +9,113 @@ class Sensor
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
static constexpr uint8_t TYPE_DOOR = 0;
|
static constexpr uint8_t TYPE_DOOR = 0;
|
||||||
static constexpr uint8_t TYPE_TEMPERATURE = 1;
|
static constexpr uint8_t TYPE_TEMPERATURE = 1;
|
||||||
static constexpr uint8_t TYPE_HUMIDITY = 2;
|
static constexpr uint8_t TYPE_HUMIDITY = 2;
|
||||||
static constexpr uint8_t TYPE_PRESSURE = 3;
|
static constexpr uint8_t TYPE_PRESSURE = 3;
|
||||||
static constexpr uint8_t TYPE_BRIGHTNESS = 4;
|
static constexpr uint8_t TYPE_BRIGHTNESS = 4;
|
||||||
static constexpr uint8_t TYPE_BUTTON = 5;
|
static constexpr uint8_t TYPE_BUTTON = 5;
|
||||||
static constexpr uint8_t TYPE_ADC = 6;
|
static constexpr uint8_t TYPE_ADC = 6;
|
||||||
static constexpr uint8_t TYPE_LOWBATTERY = 128;
|
static constexpr uint8_t TYPE_LOWBATTERY = 128;
|
||||||
static constexpr uint8_t TYPE_SHUTDOWN_IMMINENT = 251;
|
static constexpr uint8_t TYPE_SHUTDOWN_IMMINENT = 251;
|
||||||
static constexpr uint8_t TYPE_OCUPANCY = 252;
|
static constexpr uint8_t TYPE_OCUPANCY = 252;
|
||||||
static constexpr uint8_t TYPE_SUN_ALTITUDE = 253;
|
static constexpr uint8_t TYPE_SUN_ALTITUDE = 253;
|
||||||
static constexpr uint8_t TYPE_AUDIO_OUTPUT = 254;
|
static constexpr uint8_t TYPE_AUDIO_OUTPUT = 254;
|
||||||
static constexpr uint8_t TYPE_DUMMY = 255;
|
static constexpr uint8_t TYPE_DUMMY = 255;
|
||||||
|
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
float field;
|
float field;
|
||||||
QString name;
|
QString name;
|
||||||
QDateTime lastSeen;
|
QDateTime lastSeen;
|
||||||
bool hidden;
|
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)
|
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();
|
lastSeen = QDateTime::currentDateTime();
|
||||||
}
|
if(nameIn == "")
|
||||||
Sensor(QString nameIn = "dummy"): type(TYPE_DUMMY), id(0), field(0), name(nameIn), hidden(false)
|
generateName();
|
||||||
{
|
}
|
||||||
lastSeen = QDateTime::currentDateTime();
|
Sensor(QString nameIn = "dummy"): type(TYPE_DUMMY), id(0), field(0), name(nameIn), hidden(false)
|
||||||
}
|
{
|
||||||
inline bool operator==(const Sensor& in) const{ return type==in.type && id == in.id; }
|
lastSeen = QDateTime::currentDateTime();
|
||||||
inline bool operator!=(const Sensor& in) const{ return !(*this==in); }
|
}
|
||||||
inline void updateSeen(){lastSeen = QDateTime::currentDateTime();}
|
inline bool operator==(const Sensor& in) const
|
||||||
static Sensor sensorFromString(const QString& str)
|
{
|
||||||
{
|
return type==in.type && id == in.id;
|
||||||
QStringList bufferList = str.split(' ');
|
}
|
||||||
if(bufferList.size() >= 7)
|
inline bool operator!=(const Sensor& in) const
|
||||||
{
|
{
|
||||||
Sensor sensor(bufferList[2].toUInt(), bufferList[4].toUInt(), bufferList[6].toUInt());
|
return !(*this==in);
|
||||||
if(sensor.type == Sensor::TYPE_HUMIDITY || sensor.type == Sensor::TYPE_TEMPERATURE) sensor.field = sensor.field/10;
|
}
|
||||||
return sensor;
|
inline void updateSeen()
|
||||||
}
|
{
|
||||||
else return Sensor(TYPE_DUMMY, 0, 0, "", true);
|
lastSeen = QDateTime::currentDateTime();
|
||||||
}
|
}
|
||||||
QString toString()
|
static Sensor sensorFromString(const QString& str)
|
||||||
{
|
{
|
||||||
return QString("SENSOR TYPE: ")+QString::number(type)+" ID: "+QString::number(id)+" FIELD: "+
|
QStringList bufferList = str.split(' ');
|
||||||
QString::number((type == Sensor::TYPE_HUMIDITY || type == Sensor::TYPE_TEMPERATURE) ? field*10 : field);
|
if(bufferList.size() >= 7)
|
||||||
}
|
{
|
||||||
inline void generateName()
|
Sensor sensor(bufferList[2].toUInt(), bufferList[4].toUInt(), bufferList[6].toUInt());
|
||||||
{
|
if(sensor.type == Sensor::TYPE_HUMIDITY || sensor.type == Sensor::TYPE_TEMPERATURE)
|
||||||
if(type == TYPE_TEMPERATURE) name = "Temperature " + QString::number(id);
|
sensor.field = sensor.field/10;
|
||||||
else if(type == TYPE_DOOR) name = "Door " + QString::number(id);
|
|
||||||
else if(type == TYPE_BUTTON) name = "Button " + QString::number(id);
|
if(bufferList.size() >= 9)
|
||||||
else if(type == TYPE_AUDIO_OUTPUT) name = "Speakers " + QString::number(id);
|
sensor.lastSeen = QDateTime::fromSecsSinceEpoch(bufferList[8].toLongLong());
|
||||||
else if(type == TYPE_HUMIDITY) name = "Humidity " + QString::number(id);
|
return sensor;
|
||||||
else if(type == TYPE_SUN_ALTITUDE) name = "Solar Altitude";
|
}
|
||||||
else if(type == TYPE_SHUTDOWN_IMMINENT) name = "Shutdown Imminent";
|
else
|
||||||
else name = "Sensor Type " + QString::number(type) + " Id " + QString::number(id);
|
{
|
||||||
}
|
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 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
|
class SensorStore: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
std::vector<Sensor> sensors_;
|
std::vector<Sensor> sensors_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SensorStore(QObject *parent = nullptr);
|
SensorStore(QObject *parent = nullptr);
|
||||||
virtual ~SensorStore(){}
|
virtual ~SensorStore() {}
|
||||||
|
|
||||||
inline std::vector<Sensor>* getSensors(){ return &sensors_; }
|
inline std::vector<Sensor>* getSensors()
|
||||||
|
{
|
||||||
|
return &sensors_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void sensorGotState(const Sensor& sensor);
|
void sensorGotState(const Sensor& sensor);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void stateChenged(std::vector<Sensor> sensors);
|
void stateChenged(std::vector<Sensor> sensors);
|
||||||
void sensorChangedState(Sensor sensor);
|
void sensorChangedState(Sensor sensor);
|
||||||
void sensorDeleted(Sensor sensor);
|
void sensorDeleted(Sensor sensor);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4,56 +4,56 @@
|
|||||||
|
|
||||||
SpeakerSensorSource::SpeakerSensorSource(QString name, QObject *parent) : QObject(parent), name_(name)
|
SpeakerSensorSource::SpeakerSensorSource(QString name, QObject *parent) : QObject(parent), name_(name)
|
||||||
{
|
{
|
||||||
silenceCount = 0;
|
silenceCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SpeakerSensorSource::~SpeakerSensorSource()
|
SpeakerSensorSource::~SpeakerSensorSource()
|
||||||
{
|
{
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpeakerSensorSource::run()
|
void SpeakerSensorSource::run()
|
||||||
{
|
{
|
||||||
abort();
|
abort();
|
||||||
arecord.start( "arecord --disable-softvol -r 8000 -D front -" );
|
arecord.start( "arecord", {"--disable-softvol", "-r", "8000", "-D", "front", "-"});
|
||||||
|
|
||||||
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
|
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
|
||||||
timer.setInterval(500);
|
timer.setInterval(500);
|
||||||
timer.start();
|
timer.start();
|
||||||
|
|
||||||
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
|
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SpeakerSensorSource::abort()
|
void SpeakerSensorSource::abort()
|
||||||
{
|
{
|
||||||
if(arecord.state() == QProcess::Running)arecord.close();
|
if(arecord.state() == QProcess::Running)arecord.close();
|
||||||
if(timer.isActive())timer.stop();
|
if(timer.isActive())timer.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpeakerSensorSource::doTick()
|
void SpeakerSensorSource::doTick()
|
||||||
{
|
{
|
||||||
if(arecord.state() == QProcess::Running)
|
if(arecord.state() == QProcess::Running)
|
||||||
{
|
{
|
||||||
QByteArray buffer = arecord.readAllStandardOutput();
|
QByteArray buffer = arecord.readAllStandardOutput();
|
||||||
//qDebug()<<(int16_t)buffer[0];
|
//qDebug()<<(int16_t)buffer[0];
|
||||||
for(long i = 0; i < buffer.size(); i++)
|
for(long i = 0; i < buffer.size(); i++)
|
||||||
{
|
{
|
||||||
if((int16_t)buffer.at(i) != -128)
|
if((int16_t)buffer.at(i) != -128)
|
||||||
{
|
{
|
||||||
silenceCount = 0;
|
silenceCount = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(silenceCount > 40 && state)
|
if(silenceCount > 40 && state)
|
||||||
{
|
{
|
||||||
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 0, name_));
|
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 0, name_));
|
||||||
state = false;
|
state = false;
|
||||||
}
|
}
|
||||||
else if(silenceCount == 0 && !state)
|
else if(silenceCount == 0 && !state)
|
||||||
{
|
{
|
||||||
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
|
stateChanged(Sensor(Sensor::TYPE_AUDIO_OUTPUT, 0, 1, name_));
|
||||||
state = true;
|
state = true;
|
||||||
}
|
}
|
||||||
silenceCount++;
|
silenceCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,30 +16,30 @@
|
|||||||
|
|
||||||
class SpeakerSensorSource : public QObject
|
class SpeakerSensorSource : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
QString name_;
|
QString name_;
|
||||||
bool state = true;
|
bool state = true;
|
||||||
QTimer timer;
|
QTimer timer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SpeakerSensorSource(QString name = "", QObject *parent = nullptr);
|
explicit SpeakerSensorSource(QString name = "", QObject *parent = nullptr);
|
||||||
~SpeakerSensorSource();
|
~SpeakerSensorSource();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void run();
|
void run();
|
||||||
void abort();
|
void abort();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void stateChanged(Sensor sensor);
|
void stateChanged(Sensor sensor);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void doTick();
|
void doTick();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
long silenceCount = 0;
|
long silenceCount = 0;
|
||||||
|
|
||||||
QProcess arecord;
|
QProcess arecord;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // AMPMANAGER_H
|
#endif // AMPMANAGER_H
|
||||||
|
@ -2,24 +2,24 @@
|
|||||||
|
|
||||||
SunSensorSource::SunSensorSource(double lat, double lon, QObject *parent): QObject(parent), sun_(lat, lon)
|
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()
|
void SunSensorSource::run()
|
||||||
{
|
{
|
||||||
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
|
connect(&timer, SIGNAL(timeout()), this, SLOT(doTick()));
|
||||||
timer.setInterval(10000); //10s
|
timer.setInterval(10000); //10s
|
||||||
timer.start();
|
timer.start();
|
||||||
doTick();
|
doTick();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SunSensorSource::abort()
|
void SunSensorSource::abort()
|
||||||
{
|
{
|
||||||
if(timer.isActive())timer.stop();
|
if(timer.isActive())timer.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SunSensorSource::doTick()
|
void SunSensorSource::doTick()
|
||||||
{
|
{
|
||||||
stateChanged(Sensor(Sensor::TYPE_SUN_ALTITUDE, 0, static_cast<float>(sun_.altitude())));
|
stateChanged(Sensor(Sensor::TYPE_SUN_ALTITUDE, 0, static_cast<float>(sun_.altitude())));
|
||||||
}
|
}
|
||||||
|
@ -8,22 +8,22 @@
|
|||||||
|
|
||||||
class SunSensorSource : public QObject
|
class SunSensorSource : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Sun sun_;
|
Sun sun_;
|
||||||
QTimer timer;
|
QTimer timer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SunSensorSource(double lat, double lon, QObject *parent = nullptr);
|
explicit SunSensorSource(double lat, double lon, QObject *parent = nullptr);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void run();
|
void run();
|
||||||
void abort();
|
void abort();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void stateChanged(Sensor sensor);
|
void stateChanged(Sensor sensor);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void doTick();
|
void doTick();
|
||||||
};
|
};
|
||||||
|
26
src/sun.cpp
26
src/sun.cpp
@ -34,7 +34,7 @@ void Sun::JdTime::update()
|
|||||||
|
|
||||||
void Sun::JdTime::fromStdTime(std::time_t time)
|
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;
|
localHour = ltime.tm_hour + ltime.tm_min/60.0 + ltime.tm_sec/3600.0;
|
||||||
utcHour = localHour - ltime.tm_gmtoff/3600.0;
|
utcHour = localHour - ltime.tm_gmtoff/3600.0;
|
||||||
@ -63,7 +63,8 @@ std::time_t Sun::JdTime::toStdTime()
|
|||||||
return millenniumTime;
|
return millenniumTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
Sun::Sun(double latitude, double longitude, double altitude): latitude_(latitude), longetude_(longitude), altitude_(altitude)
|
Sun::Sun(double latitude, double longitude, double altitude): latitude_(latitude), longetude_(longitude),
|
||||||
|
altitude_(altitude)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
double Sun::nextMeanSolarNoonJD(const JdTime& time)
|
double Sun::nextMeanSolarNoonJD(const JdTime& time)
|
||||||
@ -78,7 +79,8 @@ double Sun::meanSolarAnomaly(double meanSolarNoon)
|
|||||||
|
|
||||||
double Sun::eqOfCenter(double meanSolarAnomaly)
|
double Sun::eqOfCenter(double meanSolarAnomaly)
|
||||||
{
|
{
|
||||||
return 1.9148*sin(meanSolarAnomaly*TO_RADS) + 0.0200*sin(2*meanSolarAnomaly*TO_RADS) + 0.0003*sin(3*meanSolarAnomaly*TO_RADS);
|
return 1.9148*sin(meanSolarAnomaly*TO_RADS) + 0.0200*sin(2*meanSolarAnomaly*TO_RADS) + 0.0003*sin(
|
||||||
|
3*meanSolarAnomaly*TO_RADS);
|
||||||
}
|
}
|
||||||
|
|
||||||
double Sun::eclipticLongitude(double eqOfCenter, double meanSolarAnomaly)
|
double Sun::eclipticLongitude(double eqOfCenter, double meanSolarAnomaly)
|
||||||
@ -108,7 +110,8 @@ double Sun::hourAngle(double localSolarTime)
|
|||||||
|
|
||||||
double Sun::hourAngleAtSunset(double solarDeclination)
|
double Sun::hourAngleAtSunset(double solarDeclination)
|
||||||
{
|
{
|
||||||
return TO_DEGS*acos((sin((-0.83-(2.076*sqrt(altitude_)/60.0))*TO_RADS) - sin(solarDeclination*TO_RADS)*sin(latitude_*TO_RADS))/(cos(latitude_*TO_RADS)*cos(solarDeclination*TO_RADS)));
|
return TO_DEGS*acos((sin((-0.83-(2.076*sqrt(altitude_)/60.0))*TO_RADS) - sin(solarDeclination*TO_RADS)*sin(
|
||||||
|
latitude_*TO_RADS))/(cos(latitude_*TO_RADS)*cos(solarDeclination*TO_RADS)));
|
||||||
}
|
}
|
||||||
|
|
||||||
double Sun::altitude()
|
double Sun::altitude()
|
||||||
@ -120,7 +123,8 @@ double Sun::altitude()
|
|||||||
double localSolarTimeValue = localSolarTime(time, equationOfTime(meanSolarAnomalyValue, eclipticLongitudeValue));
|
double localSolarTimeValue = localSolarTime(time, equationOfTime(meanSolarAnomalyValue, eclipticLongitudeValue));
|
||||||
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
||||||
|
|
||||||
double cosZenithAngle = sin(latitude_*TO_RADS)*sin(declinationValue*TO_RADS)+cos(latitude_*TO_RADS)*cos(declinationValue*TO_RADS)*cos(hourAngle(localSolarTimeValue)*TO_RADS);
|
double cosZenithAngle = sin(latitude_*TO_RADS)*sin(declinationValue*TO_RADS)+cos(latitude_*TO_RADS)*cos(
|
||||||
|
declinationValue*TO_RADS)*cos(hourAngle(localSolarTimeValue)*TO_RADS);
|
||||||
|
|
||||||
return TO_DEGS*asin(cosZenithAngle);
|
return TO_DEGS*asin(cosZenithAngle);
|
||||||
}
|
}
|
||||||
@ -133,7 +137,8 @@ double Sun::maximumAltitude()
|
|||||||
double eclipticLongitudeValue = eclipticLongitude(eqOfCenter(meanSolarAnomalyValue), meanSolarAnomalyValue);
|
double eclipticLongitudeValue = eclipticLongitude(eqOfCenter(meanSolarAnomalyValue), meanSolarAnomalyValue);
|
||||||
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
||||||
|
|
||||||
double cosZenithAngle = sin(latitude_*TO_RADS)*sin(declinationValue*TO_RADS)+cos(latitude_*TO_RADS)*cos(declinationValue*TO_RADS);
|
double cosZenithAngle = sin(latitude_*TO_RADS)*sin(declinationValue*TO_RADS)+cos(latitude_*TO_RADS)*cos(
|
||||||
|
declinationValue*TO_RADS);
|
||||||
|
|
||||||
return TO_DEGS*asin(cosZenithAngle);
|
return TO_DEGS*asin(cosZenithAngle);
|
||||||
}
|
}
|
||||||
@ -143,7 +148,6 @@ double Sun::azimuth()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::time_t Sun::riseTime()
|
std::time_t Sun::riseTime()
|
||||||
{
|
{
|
||||||
JdTime time;
|
JdTime time;
|
||||||
@ -153,10 +157,12 @@ std::time_t Sun::riseTime()
|
|||||||
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
||||||
double hourAngleValue = hourAngleAtSunset(declinationValue);
|
double hourAngleValue = hourAngleAtSunset(declinationValue);
|
||||||
|
|
||||||
time.julianDate = meanSolarNoonValue + equationOfTime(meanSolarAnomalyValue, eclipticLongitudeValue) - hourAngleValue/360.0;
|
time.julianDate = meanSolarNoonValue + equationOfTime(meanSolarAnomalyValue,
|
||||||
|
eclipticLongitudeValue) - hourAngleValue/360.0;
|
||||||
|
|
||||||
return time.toStdTime();
|
return time.toStdTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::time_t Sun::setTime()
|
std::time_t Sun::setTime()
|
||||||
{
|
{
|
||||||
JdTime time;
|
JdTime time;
|
||||||
@ -166,12 +172,12 @@ std::time_t Sun::setTime()
|
|||||||
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
double declinationValue = solarDeclination(eclipticLongitudeValue);
|
||||||
double hourAngleValue = hourAngleAtSunset(declinationValue);
|
double hourAngleValue = hourAngleAtSunset(declinationValue);
|
||||||
|
|
||||||
time.julianDate = meanSolarNoonValue + equationOfTime(meanSolarAnomalyValue, eclipticLongitudeValue) + hourAngleValue/360.0;
|
time.julianDate = meanSolarNoonValue + equationOfTime(meanSolarAnomalyValue,
|
||||||
|
eclipticLongitudeValue) + hourAngleValue/360.0;
|
||||||
|
|
||||||
return time.toStdTime();
|
return time.toStdTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
double Sun::declination()
|
double Sun::declination()
|
||||||
{
|
{
|
||||||
JdTime time;
|
JdTime time;
|
||||||
|
26
src/sun.h
26
src/sun.h
@ -17,23 +17,23 @@ class Sun
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
static constexpr double TO_DEGS = 180.0/M_PI;
|
static constexpr double TO_DEGS = 180.0/M_PI;
|
||||||
static constexpr double TO_RADS = M_PI/180.0;
|
static constexpr double TO_RADS = M_PI/180.0;
|
||||||
static constexpr double SUN_DIA = 0.53; //degrees
|
static constexpr double SUN_DIA = 0.53; //degrees
|
||||||
static constexpr double AIR_REFRACTION = 34.0/60.0;
|
static constexpr double AIR_REFRACTION = 34.0/60.0;
|
||||||
|
|
||||||
static constexpr double ARGUMENT_OF_PERIHELION = 102.9372;
|
static constexpr double ARGUMENT_OF_PERIHELION = 102.9372;
|
||||||
static constexpr double PLANETARY_AXIAL_TILT = 23.44;
|
static constexpr double PLANETARY_AXIAL_TILT = 23.44;
|
||||||
|
|
||||||
class JdTime;
|
class JdTime;
|
||||||
|
|
||||||
double latitude_;
|
double latitude_;
|
||||||
double longetude_;
|
double longetude_;
|
||||||
double altitude_;
|
double altitude_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
double nextMeanSolarNoonJD(const JdTime& time);
|
double nextMeanSolarNoonJD(const JdTime& time);
|
||||||
double meanSolarAnomaly(double meanSolarNoon);
|
double meanSolarAnomaly(double meanSolarNoon);
|
||||||
double eqOfCenter(double meanSolarAnomaly);
|
double eqOfCenter(double meanSolarAnomaly);
|
||||||
double eclipticLongitude(double eqOfCenter, double meanSolarAnomaly);
|
double eclipticLongitude(double eqOfCenter, double meanSolarAnomaly);
|
||||||
@ -46,11 +46,11 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Sun(double latitude, double longitude, double altitude = 0);
|
Sun(double latitude, double longitude, double altitude = 0);
|
||||||
double altitude();
|
double altitude();
|
||||||
double maximumAltitude();
|
double maximumAltitude();
|
||||||
double azimuth();
|
double azimuth();
|
||||||
double declination();
|
double declination();
|
||||||
std::time_t riseTime();
|
std::time_t riseTime();
|
||||||
std::time_t setTime();
|
std::time_t setTime();
|
||||||
};
|
};
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
std::cout<<std::setprecision(15);
|
std::cout<<std::setprecision(15);
|
||||||
Sun sun(49.884450, 8.650536);
|
Sun sun(49.884450, 8.650536);
|
||||||
std::time_t time = sun.setTime();
|
std::time_t time = sun.setTime();
|
||||||
tm setTime = *localtime(&time);
|
tm setTime = *localtime(&time);
|
||||||
time = sun.riseTime();
|
time = sun.riseTime();
|
||||||
@ -16,5 +16,5 @@ int main()
|
|||||||
std::cout<<"current Alt: "<<sun.altitude()<<std::endl;
|
std::cout<<"current Alt: "<<sun.altitude()<<std::endl;
|
||||||
std::cout<<"maximum Alt: "<<sun.maximumAltitude()<<std::endl;
|
std::cout<<"maximum Alt: "<<sun.maximumAltitude()<<std::endl;
|
||||||
std::cout<<"declination: "<<sun.declination()<<std::endl;
|
std::cout<<"declination: "<<sun.declination()<<std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -5,108 +5,108 @@
|
|||||||
#include <QSpinBox>
|
#include <QSpinBox>
|
||||||
|
|
||||||
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<AlarmTime> alarm, QWidget *parent):
|
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<AlarmTime> alarm, QWidget *parent):
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
actor_(alarm),
|
actor_(alarm),
|
||||||
ui(new Ui::ActorSettingsDialog)
|
ui(new Ui::ActorSettingsDialog)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
widget = new AlarmWidget(alarm, this);
|
widget = new AlarmWidget(alarm, this);
|
||||||
ui->vertlayout->addWidget(widget);
|
ui->vertlayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<SensorActor> actor, QWidget *parent) :
|
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<SensorActor> actor, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
actor_(actor),
|
actor_(actor),
|
||||||
ui(new Ui::ActorSettingsDialog)
|
ui(new Ui::ActorSettingsDialog)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
widget = new SensorActorWidget(actor, &globalSensors, this);
|
widget = new SensorActorWidget(actor, &globalSensors, this);
|
||||||
ui->vertlayout->addWidget(widget);
|
ui->vertlayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<Regulator> actor, QWidget *parent) :
|
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<Regulator> actor, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
actor_(actor),
|
actor_(actor),
|
||||||
ui(new Ui::ActorSettingsDialog)
|
ui(new Ui::ActorSettingsDialog)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
widget = new RegulatorWdiget(actor, &globalSensors, this);
|
widget = new RegulatorWdiget(actor, &globalSensors, this);
|
||||||
ui->vertlayout->addWidget(widget);
|
ui->vertlayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<TimerActor> actor, QWidget *parent) :
|
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<TimerActor> actor, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
actor_(actor),
|
actor_(actor),
|
||||||
ui(new Ui::ActorSettingsDialog)
|
ui(new Ui::ActorSettingsDialog)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
widget = new TimerActorWidget(actor, this);
|
widget = new TimerActorWidget(actor, this);
|
||||||
ui->vertlayout->addWidget(widget);
|
ui->vertlayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<PolynomalActor> actor, QWidget *parent) :
|
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<PolynomalActor> actor, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
actor_(actor),
|
actor_(actor),
|
||||||
ui(new Ui::ActorSettingsDialog)
|
ui(new Ui::ActorSettingsDialog)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
|
||||||
widget = new PolynomalActorWidget(actor, &globalSensors, this);
|
widget = new PolynomalActorWidget(actor, &globalSensors, this);
|
||||||
ui->vertlayout->addWidget(widget);
|
ui->vertlayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<MultiFactorActor> actor, QWidget *parent) :
|
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<MultiFactorActor> actor, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
actor_(actor),
|
actor_(actor),
|
||||||
ui(new Ui::ActorSettingsDialog)
|
ui(new Ui::ActorSettingsDialog)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
widget = new FactorActorWidget(actor, this);
|
widget = new FactorActorWidget(actor, this);
|
||||||
ui->vertlayout->addWidget(widget);
|
ui->vertlayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<Actor> actor, QWidget *parent) :
|
ActorSettingsDialog::ActorSettingsDialog(std::shared_ptr<Actor> actor, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
actor_(actor),
|
actor_(actor),
|
||||||
ui(new Ui::ActorSettingsDialog)
|
ui(new Ui::ActorSettingsDialog)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActorSettingsDialog::init()
|
void ActorSettingsDialog::init()
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
connect(ui->comboBox_action, SIGNAL(currentIndexChanged(int)), this, SLOT(changeAction(int)));
|
connect(ui->comboBox_action, SIGNAL(currentIndexChanged(int)), this, SLOT(changeAction(int)));
|
||||||
connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
|
connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
|
||||||
connect(ui->pushButton_editItem, &QPushButton::clicked, this, &ActorSettingsDialog::editAsItem);
|
connect(ui->pushButton_editItem, &QPushButton::clicked, this, &ActorSettingsDialog::editAsItem);
|
||||||
ui->spinBox->hide();
|
ui->spinBox->hide();
|
||||||
|
|
||||||
ui->spinBox->setValue(actor_->getTriggerValue());
|
ui->spinBox->setValue(actor_->getTriggerValue());
|
||||||
if(actor_->getTriggerValue() == 0) ui->comboBox_action->setCurrentIndex(0);
|
if(actor_->getTriggerValue() == 0) ui->comboBox_action->setCurrentIndex(0);
|
||||||
else if(actor_->getTriggerValue() == 1) ui->comboBox_action->setCurrentIndex(1);
|
else if(actor_->getTriggerValue() == 1) ui->comboBox_action->setCurrentIndex(1);
|
||||||
else ui->comboBox_action->setCurrentIndex(2);
|
else ui->comboBox_action->setCurrentIndex(2);
|
||||||
|
|
||||||
ui->label_Exausted->setText(actor_->isExausted() ? "True" : "False");
|
ui->label_Exausted->setText(actor_->isExausted() ? "True" : "False");
|
||||||
}
|
}
|
||||||
|
|
||||||
ActorSettingsDialog::~ActorSettingsDialog()
|
ActorSettingsDialog::~ActorSettingsDialog()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActorSettingsDialog::editAsItem()
|
void ActorSettingsDialog::editAsItem()
|
||||||
{
|
{
|
||||||
ItemSettingsDialog itemSettingsDiag(actor_, this);
|
ItemSettingsDialog itemSettingsDiag(actor_, this);
|
||||||
itemSettingsDiag.exec();
|
itemSettingsDiag.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActorSettingsDialog::valueChanged(int value)
|
void ActorSettingsDialog::valueChanged(int value)
|
||||||
{
|
{
|
||||||
actor_->setTriggerValue(value);
|
actor_->setTriggerValue(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ActorSettingsDialog::hideCancle([[maybe_unused]] const bool hide)
|
void ActorSettingsDialog::hideCancle([[maybe_unused]] const bool hide)
|
||||||
@ -116,13 +116,13 @@ void ActorSettingsDialog::hideCancle([[maybe_unused]] const bool hide)
|
|||||||
|
|
||||||
void ActorSettingsDialog::changeAction(int index)
|
void ActorSettingsDialog::changeAction(int index)
|
||||||
{
|
{
|
||||||
if(index == 0) actor_->setTriggerValue(0);
|
if(index == 0) actor_->setTriggerValue(0);
|
||||||
else if(index == 1) actor_->setTriggerValue(1);
|
else if(index == 1) actor_->setTriggerValue(1);
|
||||||
else if(index == 2)
|
else if(index == 2)
|
||||||
{
|
{
|
||||||
ui->spinBox->show();
|
ui->spinBox->show();
|
||||||
actor_->setTriggerValue(ui->spinBox->value());
|
actor_->setTriggerValue(ui->spinBox->value());
|
||||||
}
|
}
|
||||||
if(index != 2)ui->spinBox->hide();
|
if(index != 2)ui->spinBox->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,40 +10,41 @@
|
|||||||
#include "actorwidgets/polynomalactorwidget.h"
|
#include "actorwidgets/polynomalactorwidget.h"
|
||||||
#include "actorwidgets/factoractorwidget.h"
|
#include "actorwidgets/factoractorwidget.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class ActorSettingsDialog;
|
class ActorSettingsDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ActorSettingsDialog : public QDialog
|
class ActorSettingsDialog : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<Actor> actor_;
|
std::shared_ptr<Actor> actor_;
|
||||||
QWidget* widget;
|
QWidget* widget;
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ActorSettingsDialog(std::shared_ptr<AlarmTime> actor, QWidget *parent = nullptr);
|
ActorSettingsDialog(std::shared_ptr<AlarmTime> actor, QWidget *parent = nullptr);
|
||||||
ActorSettingsDialog(std::shared_ptr<SensorActor> actor, QWidget *parent = nullptr);
|
ActorSettingsDialog(std::shared_ptr<SensorActor> actor, QWidget *parent = nullptr);
|
||||||
ActorSettingsDialog(std::shared_ptr<Regulator> actor, QWidget *parent = nullptr);
|
ActorSettingsDialog(std::shared_ptr<Regulator> actor, QWidget *parent = nullptr);
|
||||||
ActorSettingsDialog(std::shared_ptr<TimerActor> actor, QWidget *parent = nullptr);
|
ActorSettingsDialog(std::shared_ptr<TimerActor> actor, QWidget *parent = nullptr);
|
||||||
ActorSettingsDialog(std::shared_ptr<PolynomalActor> actor, QWidget *parent = nullptr);
|
ActorSettingsDialog(std::shared_ptr<PolynomalActor> actor, QWidget *parent = nullptr);
|
||||||
ActorSettingsDialog(std::shared_ptr<MultiFactorActor> actor, QWidget *parent = nullptr);
|
ActorSettingsDialog(std::shared_ptr<MultiFactorActor> actor, QWidget *parent = nullptr);
|
||||||
ActorSettingsDialog(std::shared_ptr<Actor> actor, QWidget *parent);
|
ActorSettingsDialog(std::shared_ptr<Actor> actor, QWidget *parent);
|
||||||
~ActorSettingsDialog();
|
~ActorSettingsDialog();
|
||||||
|
|
||||||
void hideCancle(const bool hide);
|
void hideCancle(const bool hide);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void changeAction(int index);
|
void changeAction(int index);
|
||||||
void valueChanged(int value);
|
void valueChanged(int value);
|
||||||
void editAsItem();
|
void editAsItem();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::ActorSettingsDialog *ui;
|
Ui::ActorSettingsDialog *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ACTORSETTINGSDIALOG_H
|
#endif // ACTORSETTINGSDIALOG_H
|
||||||
|
@ -2,73 +2,81 @@
|
|||||||
#include "ui_alarmwidget.h"
|
#include "ui_alarmwidget.h"
|
||||||
|
|
||||||
AlarmWidget::AlarmWidget(std::shared_ptr<AlarmTime> alarm, QWidget *parent) :
|
AlarmWidget::AlarmWidget(std::shared_ptr<AlarmTime> alarm, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
alarm_(alarm),
|
alarm_(alarm),
|
||||||
ui(new Ui::AlarmWidget)
|
ui(new Ui::AlarmWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
connect(ui->checkBox, &QCheckBox::stateChanged, this, &AlarmWidget::toggleRepeating);
|
|
||||||
connect(ui->radioButton, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType);
|
|
||||||
connect(ui->radioButton_2, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType);
|
|
||||||
connect(ui->radioButton_3, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType);
|
|
||||||
connect(ui->radioButton_4, &QRadioButton::clicked, this, &AlarmWidget::setRepeatingType);
|
|
||||||
|
|
||||||
ui->dateTimeEdit->setDateTime(alarm->getDateTime());
|
ui->dateTimeEdit->setDateTime(alarm->getDateTime());
|
||||||
|
|
||||||
if(alarm_->getRepeat() == AlarmTime::REPEAT_NEVER)
|
if(alarm_->getRepeat() == AlarmTime::REPEAT_NEVER)
|
||||||
{
|
{
|
||||||
ui->radioButton->setEnabled(false);
|
ui->radioButton->setEnabled(false);
|
||||||
ui->radioButton_2->setEnabled(false);
|
ui->radioButton_2->setEnabled(false);
|
||||||
ui->radioButton_3->setEnabled(false);
|
ui->radioButton_3->setEnabled(false);
|
||||||
ui->radioButton_4->setEnabled(false);
|
ui->radioButton_4->setEnabled(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->checkBox->setChecked(true);
|
ui->checkBox->setChecked(true);
|
||||||
ui->radioButton->setEnabled(true);
|
ui->radioButton->setEnabled(true);
|
||||||
ui->radioButton_2->setEnabled(true);
|
ui->radioButton_2->setEnabled(true);
|
||||||
ui->radioButton_3->setEnabled(true);
|
ui->radioButton_3->setEnabled(true);
|
||||||
ui->radioButton_4->setEnabled(true);
|
ui->radioButton_4->setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(alarm_->getRepeat() == AlarmTime::REPEAT_DAILY) ui->radioButton->setChecked(true);
|
if(alarm_->getRepeat() == AlarmTime::REPEAT_DAILY)
|
||||||
else if(alarm_->getRepeat() == AlarmTime::REPEAT_WEEKLY) ui->radioButton_2->setChecked(true);
|
ui->radioButton->setChecked(true);
|
||||||
else if(alarm_->getRepeat() == AlarmTime::REPEAT_MONTHLY)ui->radioButton_3->setChecked(true);
|
else if(alarm_->getRepeat() == AlarmTime::REPEAT_WEEKLY)
|
||||||
else if(alarm_->getRepeat() == AlarmTime::REPEAT_YEARLY) ui->radioButton_4->setChecked(true);
|
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()
|
AlarmWidget::~AlarmWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlarmWidget::setRepeatingType()
|
void AlarmWidget::setRepeatingType()
|
||||||
{
|
{
|
||||||
if(ui->radioButton->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_DAILY);
|
if(ui->radioButton->isChecked())
|
||||||
if(ui->radioButton_2->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_WEEKLY);
|
alarm_->setRepeat(AlarmTime::REPEAT_DAILY);
|
||||||
if(ui->radioButton_3->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_MONTHLY);
|
if(ui->radioButton_2->isChecked())
|
||||||
if(ui->radioButton_4->isChecked())alarm_->setRepeat(AlarmTime::REPEAT_YEARLY);
|
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)
|
void AlarmWidget::toggleRepeating(int state)
|
||||||
{
|
{
|
||||||
if(state)
|
if(state)
|
||||||
{
|
{
|
||||||
ui->radioButton->setEnabled(true);
|
ui->radioButton->setEnabled(true);
|
||||||
ui->radioButton_2->setEnabled(true);
|
ui->radioButton_2->setEnabled(true);
|
||||||
ui->radioButton_3->setEnabled(true);
|
ui->radioButton_3->setEnabled(true);
|
||||||
ui->radioButton_4->setEnabled(true);
|
ui->radioButton_4->setEnabled(true);
|
||||||
setRepeatingType();
|
setRepeatingType();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
alarm_->setRepeat(AlarmTime::REPEAT_NEVER);
|
alarm_->setRepeat(AlarmTime::REPEAT_NEVER);
|
||||||
ui->radioButton->setEnabled(false);
|
ui->radioButton->setEnabled(false);
|
||||||
ui->radioButton_2->setEnabled(false);
|
ui->radioButton_2->setEnabled(false);
|
||||||
ui->radioButton_3->setEnabled(false);
|
ui->radioButton_3->setEnabled(false);
|
||||||
ui->radioButton_4->setEnabled(false);
|
ui->radioButton_4->setEnabled(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,26 +5,27 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include "../../actors/alarmtime.h"
|
#include "../../actors/alarmtime.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class AlarmWidget;
|
class AlarmWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class AlarmWidget : public QWidget
|
class AlarmWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
std::shared_ptr<AlarmTime> alarm_;
|
std::shared_ptr<AlarmTime> alarm_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AlarmWidget(std::shared_ptr<AlarmTime> alarm, QWidget *parent = nullptr);
|
explicit AlarmWidget(std::shared_ptr<AlarmTime> alarm, QWidget *parent = nullptr);
|
||||||
~AlarmWidget();
|
~AlarmWidget();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void toggleRepeating(int state);
|
void toggleRepeating(int state);
|
||||||
void setRepeatingType();
|
void setRepeatingType();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::AlarmWidget *ui;
|
Ui::AlarmWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ALARMWIDGET_H
|
#endif // ALARMWIDGET_H
|
||||||
|
@ -3,82 +3,82 @@
|
|||||||
#include "../actorsettingsdialog.h"
|
#include "../actorsettingsdialog.h"
|
||||||
|
|
||||||
FactorActorWidget::FactorActorWidget(std::shared_ptr<MultiFactorActor> actor, QWidget *parent) :
|
FactorActorWidget::FactorActorWidget(std::shared_ptr<MultiFactorActor> actor, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
actor_(actor),
|
actor_(actor),
|
||||||
ui(new Ui::FactorActorWidget)
|
ui(new Ui::FactorActorWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
ui->comboBox->setCurrentText(actor_->getFactorDirection() ? "True" : "False");
|
ui->comboBox->setCurrentText(actor_->getFactorDirection() ? "True" : "False");
|
||||||
ui->spinBox->setValue(actor_->getPreCancleTime());
|
ui->spinBox->setValue(actor_->getPreCancleTime());
|
||||||
if(actor_->getFactorActor()) ui->label_FactorActor->setText(actor_->getFactorActor()->getName());
|
if(actor_->getFactorActor()) ui->label_FactorActor->setText(actor_->getFactorActor()->getName());
|
||||||
connect(ui->pushButton, &QPushButton::clicked, this, &FactorActorWidget::createFactorActor);
|
connect(ui->pushButton, &QPushButton::clicked, this, &FactorActorWidget::createFactorActor);
|
||||||
connect(ui->comboBox_Direcion, &QComboBox::currentTextChanged, this, &FactorActorWidget::setDirection);
|
connect(ui->comboBox_Direcion, &QComboBox::currentTextChanged, this, &FactorActorWidget::setDirection);
|
||||||
connect(ui->spinBox, qOverload<int>(&QSpinBox::valueChanged), this, &FactorActorWidget::setPreCancleTime);
|
connect(ui->spinBox, qOverload<int>(&QSpinBox::valueChanged), this, &FactorActorWidget::setPreCancleTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
FactorActorWidget::~FactorActorWidget()
|
FactorActorWidget::~FactorActorWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FactorActorWidget::createFactorActor()
|
void FactorActorWidget::createFactorActor()
|
||||||
{
|
{
|
||||||
ActorSettingsDialog* dialog = nullptr;
|
ActorSettingsDialog* dialog = nullptr;
|
||||||
std::shared_ptr<Actor> actor = nullptr;
|
std::shared_ptr<Actor> actor = nullptr;
|
||||||
|
|
||||||
if(ui->comboBox->currentText() == "Alarm")
|
if(ui->comboBox->currentText() == "Alarm")
|
||||||
{
|
{
|
||||||
std::shared_ptr<AlarmTime> alarm = std::shared_ptr<AlarmTime>(new AlarmTime);
|
std::shared_ptr<AlarmTime> alarm = std::shared_ptr<AlarmTime>(new AlarmTime);
|
||||||
actor = alarm;
|
actor = alarm;
|
||||||
dialog = new ActorSettingsDialog(alarm, this);
|
dialog = new ActorSettingsDialog(alarm, this);
|
||||||
}
|
}
|
||||||
else if(ui->comboBox->currentText() == "Sensor")
|
else if(ui->comboBox->currentText() == "Sensor")
|
||||||
{
|
{
|
||||||
std::shared_ptr<SensorActor> sensorActor = std::shared_ptr<SensorActor>(new SensorActor());
|
std::shared_ptr<SensorActor> sensorActor = std::shared_ptr<SensorActor>(new SensorActor());
|
||||||
actor = sensorActor;
|
actor = sensorActor;
|
||||||
dialog = new ActorSettingsDialog(sensorActor, this);
|
dialog = new ActorSettingsDialog(sensorActor, this);
|
||||||
}
|
}
|
||||||
else if(ui->comboBox->currentText() == "Timer" )
|
else if(ui->comboBox->currentText() == "Timer" )
|
||||||
{
|
{
|
||||||
std::shared_ptr<TimerActor> timerActor = std::shared_ptr<TimerActor>(new TimerActor());
|
std::shared_ptr<TimerActor> timerActor = std::shared_ptr<TimerActor>(new TimerActor());
|
||||||
actor = timerActor;
|
actor = timerActor;
|
||||||
dialog = new ActorSettingsDialog(timerActor, this);
|
dialog = new ActorSettingsDialog(timerActor, this);
|
||||||
}
|
}
|
||||||
else if(ui->comboBox->currentText() == "Regulator")
|
else if(ui->comboBox->currentText() == "Regulator")
|
||||||
{
|
{
|
||||||
std::shared_ptr<Regulator> regulator = std::shared_ptr<Regulator>(new Regulator());
|
std::shared_ptr<Regulator> regulator = std::shared_ptr<Regulator>(new Regulator());
|
||||||
actor = regulator;
|
actor = regulator;
|
||||||
dialog = new ActorSettingsDialog(regulator, this);
|
dialog = new ActorSettingsDialog(regulator, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(ui->comboBox->currentText() == "Polynomal")
|
else if(ui->comboBox->currentText() == "Polynomal")
|
||||||
{
|
{
|
||||||
std::shared_ptr<PolynomalActor> polynomalActor = std::shared_ptr<PolynomalActor>(new PolynomalActor());
|
std::shared_ptr<PolynomalActor> polynomalActor = std::shared_ptr<PolynomalActor>(new PolynomalActor());
|
||||||
actor = polynomalActor;
|
actor = polynomalActor;
|
||||||
dialog = new ActorSettingsDialog(polynomalActor, this);
|
dialog = new ActorSettingsDialog(polynomalActor, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(dialog != nullptr)
|
if(dialog != nullptr)
|
||||||
{
|
{
|
||||||
dialog->setParent(this);
|
dialog->setParent(this);
|
||||||
dialog->show();
|
dialog->show();
|
||||||
if(dialog->exec() == QDialog::Accepted)
|
if(dialog->exec() == QDialog::Accepted)
|
||||||
{
|
{
|
||||||
actor_->setFactorActor(actor);
|
actor_->setFactorActor(actor);
|
||||||
ui->label_FactorActor->setText(actor->getName());
|
ui->label_FactorActor->setText(actor->getName());
|
||||||
}
|
}
|
||||||
delete dialog;
|
delete dialog;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FactorActorWidget::setDirection(const QString& type)
|
void FactorActorWidget::setDirection(const QString& type)
|
||||||
{
|
{
|
||||||
if(type == "True") actor_->setFactorDirection(true);
|
if(type == "True") actor_->setFactorDirection(true);
|
||||||
else actor_->setFactorDirection(false);
|
else actor_->setFactorDirection(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FactorActorWidget::setPreCancleTime(int time)
|
void FactorActorWidget::setPreCancleTime(int time)
|
||||||
{
|
{
|
||||||
actor_->setPreCancleTime(time);
|
actor_->setPreCancleTime(time);
|
||||||
}
|
}
|
||||||
|
@ -4,27 +4,28 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include "../../actors/factoractor.h"
|
#include "../../actors/factoractor.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class FactorActorWidget;
|
class FactorActorWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class FactorActorWidget : public QWidget
|
class FactorActorWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
std::shared_ptr<MultiFactorActor> actor_;
|
std::shared_ptr<MultiFactorActor> actor_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit FactorActorWidget(std::shared_ptr<MultiFactorActor> actor, QWidget *parent = nullptr);
|
explicit FactorActorWidget(std::shared_ptr<MultiFactorActor> actor, QWidget *parent = nullptr);
|
||||||
~FactorActorWidget();
|
~FactorActorWidget();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void createFactorActor();
|
void createFactorActor();
|
||||||
void setDirection(const QString& direction);
|
void setDirection(const QString& direction);
|
||||||
void setPreCancleTime(int time);
|
void setPreCancleTime(int time);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::FactorActorWidget *ui;
|
Ui::FactorActorWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FACTORACTORWIDGET_H
|
#endif // FACTORACTORWIDGET_H
|
||||||
|
@ -1,48 +1,50 @@
|
|||||||
#include "polynomalactorwidget.h"
|
#include "polynomalactorwidget.h"
|
||||||
#include "ui_polynomalactorwidget.h"
|
#include "ui_polynomalactorwidget.h"
|
||||||
|
|
||||||
PolynomalActorWidget::PolynomalActorWidget(std::shared_ptr<PolynomalActor> actor, SensorStore* sensors, QWidget *parent):
|
PolynomalActorWidget::PolynomalActorWidget(std::shared_ptr<PolynomalActor> actor, SensorStore* sensors,
|
||||||
QWidget(parent),
|
QWidget *parent):
|
||||||
sensors_(sensors),
|
QWidget(parent),
|
||||||
actor_(actor),
|
sensors_(sensors),
|
||||||
ui(new Ui::PolynomalActorWidget)
|
actor_(actor),
|
||||||
|
ui(new Ui::PolynomalActorWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors()));
|
if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors()));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->listView->hide();
|
ui->listView->hide();
|
||||||
ui->label->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_pow0->setValue(pow0);
|
||||||
ui->doubleSpinBox_pow1->setValue(pow1);
|
ui->doubleSpinBox_pow1->setValue(pow1);
|
||||||
ui->doubleSpinBox_pow2->setValue(pow2);
|
ui->doubleSpinBox_pow2->setValue(pow2);
|
||||||
ui->doubleSpinBox_pow3->setValue(pow3);
|
ui->doubleSpinBox_pow3->setValue(pow3);
|
||||||
|
|
||||||
connect(ui->doubleSpinBox_pow3, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow);
|
connect(ui->doubleSpinBox_pow3, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow);
|
||||||
connect(ui->doubleSpinBox_pow2, &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_pow1, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow);
|
||||||
connect(ui->doubleSpinBox_pow0, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow);
|
connect(ui->doubleSpinBox_pow0, &QDoubleSpinBox::editingFinished, this, &PolynomalActorWidget::setPow);
|
||||||
connect(ui->listView, &SensorListWidget::clicked, this, &PolynomalActorWidget::setSensor);
|
connect(ui->listView, &SensorListWidget::clicked, this, &PolynomalActorWidget::setSensor);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PolynomalActorWidget::~PolynomalActorWidget()
|
PolynomalActorWidget::~PolynomalActorWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolynomalActorWidget::setPow()
|
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)
|
void PolynomalActorWidget::setSensor(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
actor_->setSensor(sensors_->getSensors()->at(index.row()));
|
actor_->setSensor(sensors_->getSensors()->at(index.row()));
|
||||||
}
|
}
|
||||||
|
@ -4,27 +4,29 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include "../../actors/polynomalactor.h"
|
#include "../../actors/polynomalactor.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class PolynomalActorWidget;
|
class PolynomalActorWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class PolynomalActorWidget : public QWidget
|
class PolynomalActorWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
SensorStore* sensors_;
|
SensorStore* sensors_;
|
||||||
std::shared_ptr<PolynomalActor> actor_;
|
std::shared_ptr<PolynomalActor> actor_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PolynomalActorWidget(std::shared_ptr<PolynomalActor> regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr);
|
explicit PolynomalActorWidget(std::shared_ptr<PolynomalActor> regulator, SensorStore* sensors = nullptr,
|
||||||
~PolynomalActorWidget();
|
QWidget *parent = nullptr);
|
||||||
|
~PolynomalActorWidget();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void setPow();
|
void setPow();
|
||||||
void setSensor(const QModelIndex &index);
|
void setSensor(const QModelIndex &index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::PolynomalActorWidget *ui;
|
Ui::PolynomalActorWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // POLYNOMALACTORWIDGET_H
|
#endif // POLYNOMALACTORWIDGET_H
|
||||||
|
@ -4,45 +4,45 @@
|
|||||||
|
|
||||||
RegulatorWdiget::~RegulatorWdiget()
|
RegulatorWdiget::~RegulatorWdiget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RegulatorWdiget::RegulatorWdiget(std::shared_ptr<Regulator> regulator, SensorStore* sensors, QWidget *parent) :
|
RegulatorWdiget::RegulatorWdiget(std::shared_ptr<Regulator> regulator, SensorStore* sensors, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
regulator_(regulator),
|
regulator_(regulator),
|
||||||
sensors_(sensors),
|
sensors_(sensors),
|
||||||
ui(new Ui::RegulatorWdiget)
|
ui(new Ui::RegulatorWdiget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors()));
|
if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors()));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->listView->hide();
|
ui->listView->hide();
|
||||||
ui->label->hide();
|
ui->label->hide();
|
||||||
}
|
}
|
||||||
ui->doubleSpinBox_setPoint->setValue(regulator->getSetPoint());
|
ui->doubleSpinBox_setPoint->setValue(regulator->getSetPoint());
|
||||||
ui->doubleSpinBox_band->setValue(regulator->getBand());
|
ui->doubleSpinBox_band->setValue(regulator->getBand());
|
||||||
|
|
||||||
connect(ui->listView, &SensorListWidget::clicked, this, &RegulatorWdiget::setSensor);
|
connect(ui->listView, &SensorListWidget::clicked, this, &RegulatorWdiget::setSensor);
|
||||||
connect(ui->doubleSpinBox_setPoint, SIGNAL(valueChanged(double)), this, SLOT(setPoint(double)));
|
connect(ui->doubleSpinBox_setPoint, SIGNAL(valueChanged(double)), this, SLOT(setPoint(double)));
|
||||||
connect(ui->doubleSpinBox_band, SIGNAL(valueChanged(double)), this, SLOT(setBand(double)));
|
connect(ui->doubleSpinBox_band, SIGNAL(valueChanged(double)), this, SLOT(setBand(double)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegulatorWdiget::setPoint(double in)
|
void RegulatorWdiget::setPoint(double in)
|
||||||
{
|
{
|
||||||
regulator_->setPoint(in);
|
regulator_->setPoint(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegulatorWdiget::setBand(double band)
|
void RegulatorWdiget::setBand(double band)
|
||||||
{
|
{
|
||||||
regulator_->setBand(band);
|
regulator_->setBand(band);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegulatorWdiget::setSensor(const QModelIndex &index)
|
void RegulatorWdiget::setSensor(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
regulator_->setSensor(sensors_->getSensors()->at(index.row()));
|
regulator_->setSensor(sensors_->getSensors()->at(index.row()));
|
||||||
setPoint(sensors_->getSensors()->at(index.row()).field);
|
setPoint(sensors_->getSensors()->at(index.row()).field);
|
||||||
ui->doubleSpinBox_setPoint->setValue(sensors_->getSensors()->at(index.row()).field);
|
ui->doubleSpinBox_setPoint->setValue(sensors_->getSensors()->at(index.row()).field);
|
||||||
}
|
}
|
||||||
|
@ -4,29 +4,31 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include "../../actors/regulator.h"
|
#include "../../actors/regulator.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class RegulatorWdiget;
|
class RegulatorWdiget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class RegulatorWdiget : public QWidget
|
class RegulatorWdiget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
std::shared_ptr<Regulator> regulator_;
|
std::shared_ptr<Regulator> regulator_;
|
||||||
SensorStore* sensors_;
|
SensorStore* sensors_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RegulatorWdiget(std::shared_ptr<Regulator> regulator, SensorStore* sensors = nullptr, QWidget *parent = nullptr);
|
explicit RegulatorWdiget(std::shared_ptr<Regulator> regulator, SensorStore* sensors = nullptr,
|
||||||
~RegulatorWdiget();
|
QWidget *parent = nullptr);
|
||||||
|
~RegulatorWdiget();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void setPoint(double in);
|
void setPoint(double in);
|
||||||
void setBand(double band);
|
void setBand(double band);
|
||||||
void setSensor(const QModelIndex &index);
|
void setSensor(const QModelIndex &index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::RegulatorWdiget *ui;
|
Ui::RegulatorWdiget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // REGULATORWDIGET_H
|
#endif // REGULATORWDIGET_H
|
||||||
|
@ -4,49 +4,49 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
SensorActorWidget::SensorActorWidget(std::shared_ptr<SensorActor> sensorActor, SensorStore* sensors, QWidget *parent) :
|
SensorActorWidget::SensorActorWidget(std::shared_ptr<SensorActor> sensorActor, SensorStore* sensors, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
sensorActor_(sensorActor),
|
sensorActor_(sensorActor),
|
||||||
sensors_(sensors),
|
sensors_(sensors),
|
||||||
ui(new Ui::SensorActorWidget)
|
ui(new Ui::SensorActorWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors()));
|
if(sensors)ui->listView->sensorsChanged(*(sensors->getSensors()));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->listView->hide();
|
ui->listView->hide();
|
||||||
ui->label->hide();
|
ui->label->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sensorActor_->getSloap() == SensorActor::SLOPE_UP) ui->comboBox_slope->setCurrentIndex(0);
|
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_DOWN) ui->comboBox_slope->setCurrentIndex(1);
|
||||||
else if(sensorActor_->getSloap() == SensorActor::SLOPE_BOTH) ui->comboBox_slope->setCurrentIndex(2);
|
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->listView, &SensorListWidget::clicked, this, &SensorActorWidget::setSensor);
|
||||||
connect(ui->doubleSpinBox_threshold, SIGNAL(valueChanged(double)), this, SLOT(setThreshold(double)));
|
connect(ui->doubleSpinBox_threshold, SIGNAL(valueChanged(double)), this, SLOT(setThreshold(double)));
|
||||||
connect(ui->comboBox_slope, SIGNAL(currentIndexChanged(int)), this, SLOT(setSlope(int)));
|
connect(ui->comboBox_slope, SIGNAL(currentIndexChanged(int)), this, SLOT(setSlope(int)));
|
||||||
}
|
}
|
||||||
|
|
||||||
SensorActorWidget::~SensorActorWidget()
|
SensorActorWidget::~SensorActorWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActorWidget::setThreshold(double in)
|
void SensorActorWidget::setThreshold(double in)
|
||||||
{
|
{
|
||||||
sensorActor_->setThreshold(in);
|
sensorActor_->setThreshold(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActorWidget::setSlope(int index)
|
void SensorActorWidget::setSlope(int index)
|
||||||
{
|
{
|
||||||
if(index == 0) sensorActor_->setSloap(SensorActor::SLOPE_UP);
|
if(index == 0) sensorActor_->setSloap(SensorActor::SLOPE_UP);
|
||||||
else if(index == 1) sensorActor_->setSloap(SensorActor::SLOPE_DOWN);
|
else if(index == 1) sensorActor_->setSloap(SensorActor::SLOPE_DOWN);
|
||||||
else if(index == 2) sensorActor_->setSloap(SensorActor::SLOPE_BOTH);
|
else if(index == 2) sensorActor_->setSloap(SensorActor::SLOPE_BOTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorActorWidget::setSensor(const QModelIndex &index)
|
void SensorActorWidget::setSensor(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
sensorActor_->setSensor(sensors_->getSensors()->at(index.row()));
|
sensorActor_->setSensor(sensors_->getSensors()->at(index.row()));
|
||||||
qDebug()<<"Selected "<<sensors_->getSensors()->at(index.row()).name;
|
qDebug()<<"Selected "<<sensors_->getSensors()->at(index.row()).name;
|
||||||
}
|
}
|
||||||
|
@ -5,29 +5,31 @@
|
|||||||
#include <QItemSelection>
|
#include <QItemSelection>
|
||||||
#include "../../actors/sensoractor.h"
|
#include "../../actors/sensoractor.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class SensorActorWidget;
|
class SensorActorWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class SensorActorWidget : public QWidget
|
class SensorActorWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
std::shared_ptr<SensorActor> sensorActor_;
|
std::shared_ptr<SensorActor> sensorActor_;
|
||||||
SensorStore* sensors_;
|
SensorStore* sensors_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SensorActorWidget(std::shared_ptr<SensorActor> sensorActor, SensorStore* sensors = nullptr, QWidget *parent = nullptr);
|
explicit SensorActorWidget(std::shared_ptr<SensorActor> sensorActor, SensorStore* sensors = nullptr,
|
||||||
~SensorActorWidget();
|
QWidget *parent = nullptr);
|
||||||
|
~SensorActorWidget();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void setThreshold(double in);
|
void setThreshold(double in);
|
||||||
void setSlope(int index);
|
void setSlope(int index);
|
||||||
void setSensor(const QModelIndex &index);
|
void setSensor(const QModelIndex &index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::SensorActorWidget *ui;
|
Ui::SensorActorWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SENSORACTORWIDGET_H
|
#endif // SENSORACTORWIDGET_H
|
||||||
|
@ -4,17 +4,17 @@
|
|||||||
#include <QSpinBox>
|
#include <QSpinBox>
|
||||||
|
|
||||||
TimerActorWidget::TimerActorWidget(std::shared_ptr<TimerActor> actor, QWidget *parent) :
|
TimerActorWidget::TimerActorWidget(std::shared_ptr<TimerActor> actor, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
ui(new Ui::TimerActorWidget)
|
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()
|
TimerActorWidget::~TimerActorWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
@ -4,20 +4,21 @@
|
|||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include "../../actors/timeractor.h"
|
#include "../../actors/timeractor.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class TimerActorWidget;
|
class TimerActorWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class TimerActorWidget : public QWidget
|
class TimerActorWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit TimerActorWidget(std::shared_ptr<TimerActor> actor, QWidget *parent = nullptr);
|
explicit TimerActorWidget(std::shared_ptr<TimerActor> actor, QWidget *parent = nullptr);
|
||||||
~TimerActorWidget();
|
~TimerActorWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::TimerActorWidget *ui;
|
Ui::TimerActorWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TIMERACTORWIDGET_H
|
#endif // TIMERACTORWIDGET_H
|
||||||
|
@ -5,49 +5,49 @@
|
|||||||
#include "itemsettingswidgets/systemitemsettingswidget.h"
|
#include "itemsettingswidgets/systemitemsettingswidget.h"
|
||||||
|
|
||||||
ItemCreationDialog::ItemCreationDialog(QWidget *parent) :
|
ItemCreationDialog::ItemCreationDialog(QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
ui(new Ui::ItemCreationDialog)
|
ui(new Ui::ItemCreationDialog)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
std::shared_ptr<MessageItem> messageItem(new MessageItem);
|
std::shared_ptr<MessageItem> messageItem(new MessageItem);
|
||||||
item = messageItem;
|
item = messageItem;
|
||||||
widget = new MessageItemSettingsWidget(messageItem, this);
|
widget = new MessageItemSettingsWidget(messageItem, this);
|
||||||
ui->verticalLayout->addWidget(widget);
|
ui->verticalLayout->addWidget(widget);
|
||||||
connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ItemCreationDialog::itemTypeChanged);
|
connect(ui->comboBox, &QComboBox::currentTextChanged, this, &ItemCreationDialog::itemTypeChanged);
|
||||||
connect(ui->lineEdit, &QLineEdit::textChanged, this, &ItemCreationDialog::itemNameChanged);
|
connect(ui->lineEdit, &QLineEdit::textChanged, this, &ItemCreationDialog::itemNameChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemCreationDialog::~ItemCreationDialog()
|
ItemCreationDialog::~ItemCreationDialog()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
delete widget;
|
delete widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemCreationDialog::itemTypeChanged(const QString& type)
|
void ItemCreationDialog::itemTypeChanged(const QString& type)
|
||||||
{
|
{
|
||||||
ui->verticalLayout->removeWidget(widget);
|
ui->verticalLayout->removeWidget(widget);
|
||||||
delete widget;
|
delete widget;
|
||||||
if(type == "Message")
|
if(type == "Message")
|
||||||
{
|
{
|
||||||
std::shared_ptr<MessageItem> messageItem(new MessageItem);
|
std::shared_ptr<MessageItem> messageItem(new MessageItem);
|
||||||
item = messageItem;
|
item = messageItem;
|
||||||
widget = new MessageItemSettingsWidget(messageItem, this);
|
widget = new MessageItemSettingsWidget(messageItem, this);
|
||||||
ui->verticalLayout->addWidget(widget);
|
ui->verticalLayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
if(type == "System")
|
if(type == "System")
|
||||||
{
|
{
|
||||||
std::shared_ptr<SystemItem> systemItem(new SystemItem);
|
std::shared_ptr<SystemItem> systemItem(new SystemItem);
|
||||||
item = systemItem;
|
item = systemItem;
|
||||||
widget = new SystemItemSettingsWidget(systemItem, this);
|
widget = new SystemItemSettingsWidget(systemItem, this);
|
||||||
ui->verticalLayout->addWidget(widget);
|
ui->verticalLayout->addWidget(widget);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemCreationDialog::itemNameChanged(const QString& name)
|
void ItemCreationDialog::itemNameChanged(const QString& name)
|
||||||
{
|
{
|
||||||
if(item)
|
if(item)
|
||||||
{
|
{
|
||||||
item->setName(name);
|
item->setName(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,29 +5,30 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include "../items/item.h"
|
#include "../items/item.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class ItemCreationDialog;
|
class ItemCreationDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ItemCreationDialog : public QDialog
|
class ItemCreationDialog : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
QWidget* widget;
|
QWidget* widget;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ItemCreationDialog(QWidget *parent = nullptr);
|
explicit ItemCreationDialog(QWidget *parent = nullptr);
|
||||||
~ItemCreationDialog();
|
~ItemCreationDialog();
|
||||||
|
|
||||||
std::shared_ptr<Item> item;
|
std::shared_ptr<Item> item;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void itemTypeChanged(const QString& type);
|
void itemTypeChanged(const QString& type);
|
||||||
void itemNameChanged(const QString& name);
|
void itemNameChanged(const QString& name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::ItemCreationDialog *ui;
|
Ui::ItemCreationDialog *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ITEMCREATIONDIALOG_H
|
#endif // ITEMCREATIONDIALOG_H
|
||||||
|
@ -4,52 +4,52 @@
|
|||||||
#include "../items/messageitem.h"
|
#include "../items/messageitem.h"
|
||||||
|
|
||||||
ItemScrollBox::ItemScrollBox(QWidget *parent) :
|
ItemScrollBox::ItemScrollBox(QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
ui(new Ui::RelayScrollBox)
|
ui(new Ui::RelayScrollBox)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture);
|
QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture);
|
||||||
QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture);
|
QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture);
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemScrollBox::~ItemScrollBox()
|
ItemScrollBox::~ItemScrollBox()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemScrollBox::addItem(std::weak_ptr<Item> item)
|
void ItemScrollBox::addItem(std::weak_ptr<Item> item)
|
||||||
{
|
{
|
||||||
if(auto workItem = item.lock())
|
if(auto workItem = item.lock())
|
||||||
{
|
{
|
||||||
if(dynamic_cast<AuxItem*>(workItem.get()))
|
if(dynamic_cast<AuxItem*>(workItem.get()))
|
||||||
{
|
{
|
||||||
widgets_.push_back(new ItemWidget(item, true));
|
widgets_.push_back(new ItemWidget(item, true));
|
||||||
}
|
}
|
||||||
else if(dynamic_cast<MessageItem*>(workItem.get()))
|
else if(dynamic_cast<MessageItem*>(workItem.get()))
|
||||||
{
|
{
|
||||||
widgets_.push_back(new ItemWidget(item, false, true));
|
widgets_.push_back(new ItemWidget(item, false, true));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
widgets_.push_back(new ItemWidget(item));
|
widgets_.push_back(new ItemWidget(item));
|
||||||
}
|
}
|
||||||
ui->relayWidgetVbox->addWidget(widgets_.back());
|
ui->relayWidgetVbox->addWidget(widgets_.back());
|
||||||
connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest);
|
connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::deleteRequest);
|
||||||
connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::removeItem);
|
connect(widgets_.back(), &ItemWidget::deleteRequest, this, &ItemScrollBox::removeItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemScrollBox::removeItem(const ItemData& item)
|
void ItemScrollBox::removeItem(const ItemData& item)
|
||||||
{
|
{
|
||||||
for(unsigned i = 0; i < widgets_.size(); i++)
|
for(unsigned i = 0; i < widgets_.size(); i++)
|
||||||
{
|
{
|
||||||
if(widgets_[i]->controles(item))
|
if(widgets_[i]->controles(item))
|
||||||
{
|
{
|
||||||
ui->relayWidgetVbox->removeWidget(widgets_[i]);
|
ui->relayWidgetVbox->removeWidget(widgets_[i]);
|
||||||
delete widgets_[i];
|
delete widgets_[i];
|
||||||
widgets_.erase(widgets_.begin()+i);
|
widgets_.erase(widgets_.begin()+i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,33 +11,34 @@
|
|||||||
#include "../items/itemstore.h"
|
#include "../items/itemstore.h"
|
||||||
|
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class RelayScrollBox;
|
class RelayScrollBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ItemScrollBox : public QWidget
|
class ItemScrollBox : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
std::vector< ItemWidget* > widgets_;
|
std::vector< ItemWidget* > widgets_;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void deleteRequest(const ItemData& item);
|
void deleteRequest(const ItemData& item);
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ItemScrollBox(QWidget *parent = nullptr);
|
explicit ItemScrollBox(QWidget *parent = nullptr);
|
||||||
~ItemScrollBox();
|
~ItemScrollBox();
|
||||||
|
|
||||||
void setItemStore(ItemStore* itemStore);
|
void setItemStore(ItemStore* itemStore);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void addItem(std::weak_ptr<Item> item);
|
void addItem(std::weak_ptr<Item> item);
|
||||||
void removeItem(const ItemData& item);
|
void removeItem(const ItemData& item);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::RelayScrollBox *ui;
|
Ui::RelayScrollBox *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RELAYSCROLLBOX_H
|
#endif // RELAYSCROLLBOX_H
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#include "itemsettingsdialog.h"
|
#include "itemsettingsdialog.h"
|
||||||
#include "ui_itemsettingsdialog.h"
|
#include "ui_itemsettingsdialog.h"
|
||||||
#include "actorsettingsdialog.h"
|
#include "actorsettingsdialog.h"
|
||||||
#include "../actors/alarmtime.h"
|
#include "../actors/alarmtime.h"
|
||||||
@ -14,174 +14,174 @@
|
|||||||
#include<memory>
|
#include<memory>
|
||||||
|
|
||||||
ItemSettingsDialog::ItemSettingsDialog(std::shared_ptr<Item> item, QWidget *parent) :
|
ItemSettingsDialog::ItemSettingsDialog(std::shared_ptr<Item> item, QWidget *parent) :
|
||||||
QDialog(parent),
|
QDialog(parent),
|
||||||
item_(item),
|
item_(item),
|
||||||
ui(new Ui::ItemSettingsDialog)
|
ui(new Ui::ItemSettingsDialog)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
setModal(false);
|
setModal(false);
|
||||||
|
|
||||||
ui->label_name->setText(item_->getName());
|
ui->label_name->setText(item_->getName());
|
||||||
ui->checkBox_Override->setChecked(item_->getOverride());
|
ui->checkBox_Override->setChecked(item_->getOverride());
|
||||||
|
|
||||||
|
|
||||||
if(std::shared_ptr<Relay> relay = std::dynamic_pointer_cast<Relay>(item_))
|
if(std::shared_ptr<Relay> relay = std::dynamic_pointer_cast<Relay>(item_))
|
||||||
{
|
{
|
||||||
itemSpecificWidget_ = new RelayItemSettingsWidget(relay);
|
itemSpecificWidget_ = new RelayItemSettingsWidget(relay);
|
||||||
}
|
}
|
||||||
else if(std::shared_ptr<MessageItem> msgItem = std::dynamic_pointer_cast<MessageItem>(item_))
|
else if(std::shared_ptr<MessageItem> msgItem = std::dynamic_pointer_cast<MessageItem>(item_))
|
||||||
{
|
{
|
||||||
itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem);
|
itemSpecificWidget_ = new MessageItemSettingsWidget(msgItem);
|
||||||
}
|
}
|
||||||
else if(std::shared_ptr<SystemItem> sysItem = std::dynamic_pointer_cast<SystemItem>(item_))
|
else if(std::shared_ptr<SystemItem> sysItem = std::dynamic_pointer_cast<SystemItem>(item_))
|
||||||
{
|
{
|
||||||
itemSpecificWidget_ = new SystemItemSettingsWidget(sysItem);
|
itemSpecificWidget_ = new SystemItemSettingsWidget(sysItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(itemSpecificWidget_)
|
if(itemSpecificWidget_)
|
||||||
{
|
{
|
||||||
ui->verticalLayout_2->addWidget(itemSpecificWidget_);
|
ui->verticalLayout_2->addWidget(itemSpecificWidget_);
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(ui->pushButton_add, &QPushButton::clicked, this, &ItemSettingsDialog::addActor);
|
connect(ui->pushButton_add, &QPushButton::clicked, this, &ItemSettingsDialog::addActor);
|
||||||
connect(ui->pushButton_remove, &QPushButton::clicked, this, &ItemSettingsDialog::removeActor);
|
connect(ui->pushButton_remove, &QPushButton::clicked, this, &ItemSettingsDialog::removeActor);
|
||||||
connect(ui->pushButton_edit, &QPushButton::clicked, this, &ItemSettingsDialog::editActor);
|
connect(ui->pushButton_edit, &QPushButton::clicked, this, &ItemSettingsDialog::editActor);
|
||||||
connect(ui->checkBox_Override, &QPushButton::clicked, this, &ItemSettingsDialog::changeOverride);
|
connect(ui->checkBox_Override, &QPushButton::clicked, this, &ItemSettingsDialog::changeOverride);
|
||||||
|
|
||||||
|
|
||||||
ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Actor"));
|
ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Actor"));
|
||||||
ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Action"));
|
ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Action"));
|
||||||
ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Enabled"));
|
ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Enabled"));
|
||||||
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||||
ui->tableWidget->horizontalHeader()->resizeSection(1, 60);
|
ui->tableWidget->horizontalHeader()->resizeSection(1, 60);
|
||||||
ui->tableWidget->horizontalHeader()->resizeSection(2, 75);
|
ui->tableWidget->horizontalHeader()->resizeSection(2, 75);
|
||||||
loadActorList();
|
loadActorList();
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemSettingsDialog::~ItemSettingsDialog()
|
ItemSettingsDialog::~ItemSettingsDialog()
|
||||||
{
|
{
|
||||||
if(itemSpecificWidget_) delete itemSpecificWidget_;
|
if(itemSpecificWidget_) delete itemSpecificWidget_;
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemSettingsDialog::changeOverride()
|
void ItemSettingsDialog::changeOverride()
|
||||||
{
|
{
|
||||||
item_->setOverride(ui->checkBox_Override->isChecked());
|
item_->setOverride(ui->checkBox_Override->isChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemSettingsDialog::loadActorList()
|
void ItemSettingsDialog::loadActorList()
|
||||||
{
|
{
|
||||||
//ui->listWidget->clear();
|
//ui->listWidget->clear();
|
||||||
ui->tableWidget->setRowCount(item_->getActors().size());
|
ui->tableWidget->setRowCount(item_->getActors().size());
|
||||||
|
|
||||||
for(unsigned i = 0; i < item_->getActors().size(); i++)
|
for(unsigned i = 0; i < item_->getActors().size(); i++)
|
||||||
{
|
{
|
||||||
ui->tableWidget->setItem(i, 0, new QTableWidgetItem(item_->getActors()[i]->getName()));
|
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, 1, new QTableWidgetItem(item_->getActors()[i]->actionName()));
|
||||||
ui->tableWidget->setItem(i, 2, new QTableWidgetItem(item_->getActors()[i]->isActive() ? "Y" : "N"));
|
ui->tableWidget->setItem(i, 2, new QTableWidgetItem(item_->getActors()[i]->isActive() ? "Y" : "N"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemSettingsDialog::addActor()
|
void ItemSettingsDialog::addActor()
|
||||||
{
|
{
|
||||||
ActorSettingsDialog* dialog = nullptr;
|
ActorSettingsDialog* dialog = nullptr;
|
||||||
std::shared_ptr<Actor> actor = nullptr;
|
std::shared_ptr<Actor> actor = nullptr;
|
||||||
|
|
||||||
if(ui->comboBox->currentText() == "Alarm")
|
if(ui->comboBox->currentText() == "Alarm")
|
||||||
{
|
{
|
||||||
std::shared_ptr<AlarmTime> alarm = std::shared_ptr<AlarmTime>(new AlarmTime);
|
std::shared_ptr<AlarmTime> alarm = std::shared_ptr<AlarmTime>(new AlarmTime);
|
||||||
actor = alarm;
|
actor = alarm;
|
||||||
dialog = new ActorSettingsDialog(alarm, this);
|
dialog = new ActorSettingsDialog(alarm, this);
|
||||||
}
|
}
|
||||||
else if(ui->comboBox->currentText() == "Sensor")
|
else if(ui->comboBox->currentText() == "Sensor")
|
||||||
{
|
{
|
||||||
std::shared_ptr<SensorActor> sensorActor = std::shared_ptr<SensorActor>(new SensorActor);
|
std::shared_ptr<SensorActor> sensorActor = std::shared_ptr<SensorActor>(new SensorActor);
|
||||||
actor = sensorActor;
|
actor = sensorActor;
|
||||||
dialog = new ActorSettingsDialog(sensorActor, this);
|
dialog = new ActorSettingsDialog(sensorActor, this);
|
||||||
}
|
}
|
||||||
else if(ui->comboBox->currentText() == "Timer" )
|
else if(ui->comboBox->currentText() == "Timer" )
|
||||||
{
|
{
|
||||||
std::shared_ptr<TimerActor> timerActor = std::shared_ptr<TimerActor>(new TimerActor);
|
std::shared_ptr<TimerActor> timerActor = std::shared_ptr<TimerActor>(new TimerActor);
|
||||||
actor = timerActor;
|
actor = timerActor;
|
||||||
dialog = new ActorSettingsDialog(timerActor, this);
|
dialog = new ActorSettingsDialog(timerActor, this);
|
||||||
}
|
}
|
||||||
else if(ui->comboBox->currentText() == "Regulator")
|
else if(ui->comboBox->currentText() == "Regulator")
|
||||||
{
|
{
|
||||||
std::shared_ptr<Regulator> regulator = std::shared_ptr<Regulator>(new Regulator);
|
std::shared_ptr<Regulator> regulator = std::shared_ptr<Regulator>(new Regulator);
|
||||||
actor = regulator;
|
actor = regulator;
|
||||||
dialog = new ActorSettingsDialog(regulator, this);
|
dialog = new ActorSettingsDialog(regulator, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(ui->comboBox->currentText() == "Polynomal")
|
else if(ui->comboBox->currentText() == "Polynomal")
|
||||||
{
|
{
|
||||||
std::shared_ptr<PolynomalActor> polynomalActor = std::shared_ptr<PolynomalActor>(new PolynomalActor);
|
std::shared_ptr<PolynomalActor> polynomalActor = std::shared_ptr<PolynomalActor>(new PolynomalActor);
|
||||||
actor = polynomalActor;
|
actor = polynomalActor;
|
||||||
dialog = new ActorSettingsDialog(polynomalActor, this);
|
dialog = new ActorSettingsDialog(polynomalActor, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(ui->comboBox->currentText() == "Multi Factor")
|
else if(ui->comboBox->currentText() == "Multi Factor")
|
||||||
{
|
{
|
||||||
std::shared_ptr<MultiFactorActor> polynomalActor = std::shared_ptr<MultiFactorActor>(new MultiFactorActor);
|
std::shared_ptr<MultiFactorActor> polynomalActor = std::shared_ptr<MultiFactorActor>(new MultiFactorActor);
|
||||||
actor = polynomalActor;
|
actor = polynomalActor;
|
||||||
dialog = new ActorSettingsDialog(polynomalActor, this);
|
dialog = new ActorSettingsDialog(polynomalActor, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(dialog != nullptr)
|
if(dialog != nullptr)
|
||||||
{
|
{
|
||||||
dialog->setParent(this);
|
dialog->setParent(this);
|
||||||
dialog->show();
|
dialog->show();
|
||||||
if(dialog->exec() == QDialog::Accepted)
|
if(dialog->exec() == QDialog::Accepted)
|
||||||
{
|
{
|
||||||
item_->addActor(actor);
|
item_->addActor(actor);
|
||||||
loadActorList();
|
loadActorList();
|
||||||
}
|
}
|
||||||
delete dialog;
|
delete dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemSettingsDialog::removeActor()
|
void ItemSettingsDialog::removeActor()
|
||||||
{
|
{
|
||||||
if(item_->getActors().size() > ui->tableWidget->currentRow())
|
if(item_->getActors().size() > static_cast<size_t>(ui->tableWidget->currentRow()))
|
||||||
{
|
{
|
||||||
item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow()));
|
item_->removeActor(item_->getActors().at(ui->tableWidget->currentRow()));
|
||||||
loadActorList();
|
loadActorList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemSettingsDialog::editActor()
|
void ItemSettingsDialog::editActor()
|
||||||
{
|
{
|
||||||
if(item_->getActors().size() > ui->tableWidget->currentRow())
|
if(item_->getActors().size() > static_cast<size_t>(ui->tableWidget->currentRow()))
|
||||||
{
|
{
|
||||||
std::shared_ptr<Actor> actor = item_->getActors()[ui->tableWidget->currentRow()];
|
std::shared_ptr<Actor> actor = item_->getActors()[ui->tableWidget->currentRow()];
|
||||||
|
|
||||||
std::shared_ptr<AlarmTime> alarmTime = std::dynamic_pointer_cast<AlarmTime>(actor);
|
std::shared_ptr<AlarmTime> alarmTime = std::dynamic_pointer_cast<AlarmTime>(actor);
|
||||||
std::shared_ptr<Regulator> regulator = std::dynamic_pointer_cast<Regulator>(actor);
|
std::shared_ptr<Regulator> regulator = std::dynamic_pointer_cast<Regulator>(actor);
|
||||||
std::shared_ptr<SensorActor> sensorActor = std::dynamic_pointer_cast<SensorActor>(actor);
|
std::shared_ptr<SensorActor> sensorActor = std::dynamic_pointer_cast<SensorActor>(actor);
|
||||||
std::shared_ptr<TimerActor> timerActor = std::dynamic_pointer_cast<TimerActor>(actor);
|
std::shared_ptr<TimerActor> timerActor = std::dynamic_pointer_cast<TimerActor>(actor);
|
||||||
std::shared_ptr<PolynomalActor> polynomalActor = std::dynamic_pointer_cast<PolynomalActor>(actor);
|
std::shared_ptr<PolynomalActor> polynomalActor = std::dynamic_pointer_cast<PolynomalActor>(actor);
|
||||||
std::shared_ptr<MultiFactorActor> factorActor = std::dynamic_pointer_cast<MultiFactorActor>(actor);
|
std::shared_ptr<MultiFactorActor> factorActor = std::dynamic_pointer_cast<MultiFactorActor>(actor);
|
||||||
|
|
||||||
ActorSettingsDialog* dialog;
|
ActorSettingsDialog* dialog;
|
||||||
|
|
||||||
if(alarmTime) dialog = new ActorSettingsDialog(alarmTime, this);
|
if(alarmTime) dialog = new ActorSettingsDialog(alarmTime, this);
|
||||||
else if(regulator) dialog = new ActorSettingsDialog(regulator, this);
|
else if(regulator) dialog = new ActorSettingsDialog(regulator, this);
|
||||||
else if(sensorActor) dialog = new ActorSettingsDialog(sensorActor, this);
|
else if(sensorActor) dialog = new ActorSettingsDialog(sensorActor, this);
|
||||||
else if(timerActor) dialog = new ActorSettingsDialog(timerActor, this);
|
else if(timerActor) dialog = new ActorSettingsDialog(timerActor, this);
|
||||||
else if(polynomalActor) dialog = new ActorSettingsDialog(polynomalActor, this);
|
else if(polynomalActor) dialog = new ActorSettingsDialog(polynomalActor, this);
|
||||||
else if(factorActor) dialog = new ActorSettingsDialog(factorActor, this);
|
else if(factorActor) dialog = new ActorSettingsDialog(factorActor, this);
|
||||||
else dialog = new ActorSettingsDialog(actor, this);
|
else dialog = new ActorSettingsDialog(actor, this);
|
||||||
dialog->setParent(this);
|
dialog->setParent(this);
|
||||||
dialog->show();
|
dialog->show();
|
||||||
dialog->exec();
|
dialog->exec();
|
||||||
|
|
||||||
for(int i = 0; i < ui->tableWidget->rowCount() && i < item_->getActors().size(); ++i)
|
for(int i = 0; i < ui->tableWidget->rowCount() && i < static_cast<size_t>(item_->getActors().size()); ++i)
|
||||||
{
|
{
|
||||||
ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName());
|
ui->tableWidget->item(i, 0)->setText(item_->getActors()[i]->getName());
|
||||||
ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName());
|
ui->tableWidget->item(i, 1)->setText(item_->getActors()[i]->actionName());
|
||||||
ui->tableWidget->item(i, 2)->setText(item_->getActors()[i]->isActive() ? "Y" : "N");
|
ui->tableWidget->item(i, 2)->setText(item_->getActors()[i]->isActive() ? "Y" : "N");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,32 +6,33 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include "../items/relay.h"
|
#include "../items/relay.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class ItemSettingsDialog;
|
class ItemSettingsDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ItemSettingsDialog : public QDialog
|
class ItemSettingsDialog : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
std::shared_ptr<Item> item_;
|
std::shared_ptr<Item> item_;
|
||||||
QWidget* itemSpecificWidget_ = nullptr;
|
QWidget* itemSpecificWidget_ = nullptr;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void loadActorList();
|
void loadActorList();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ItemSettingsDialog(std::shared_ptr<Item> item, QWidget *parent = nullptr);
|
explicit ItemSettingsDialog(std::shared_ptr<Item> item, QWidget *parent = nullptr);
|
||||||
~ItemSettingsDialog();
|
~ItemSettingsDialog();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void removeActor();
|
void removeActor();
|
||||||
void addActor();
|
void addActor();
|
||||||
void editActor();
|
void editActor();
|
||||||
void changeOverride();
|
void changeOverride();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::ItemSettingsDialog *ui;
|
Ui::ItemSettingsDialog *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RELAYSETTINGSDIALOG_H
|
#endif // RELAYSETTINGSDIALOG_H
|
||||||
|
@ -115,7 +115,7 @@
|
|||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="horizontalHeaderVisible">
|
<attribute name="horizontalHeaderVisible">
|
||||||
<bool>false</bool>
|
<bool>true</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="horizontalHeaderMinimumSectionSize">
|
<attribute name="horizontalHeaderMinimumSectionSize">
|
||||||
<number>32</number>
|
<number>32</number>
|
||||||
|
48
src/ui/itemsettingswidgets/messageitemsettingswidget.cpp
Normal file
48
src/ui/itemsettingswidgets/messageitemsettingswidget.cpp
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#include "messageitemsettingswidget.h"
|
||||||
|
#include "ui_messageitemsettingswidget.h"
|
||||||
|
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
MessageItemSettingsWidget::MessageItemSettingsWidget(std::weak_ptr<MessageItem> 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;
|
||||||
|
}
|
31
src/ui/itemsettingswidgets/messageitemsettingswidget.h
Normal file
31
src/ui/itemsettingswidgets/messageitemsettingswidget.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef MESSAGEITEMSETTINGSWIDGET_H
|
||||||
|
#define MESSAGEITEMSETTINGSWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <memory>
|
||||||
|
#include "../../items/messageitem.h"
|
||||||
|
|
||||||
|
namespace Ui
|
||||||
|
{
|
||||||
|
class MessageItemSettingsWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MessageItemSettingsWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
std::weak_ptr<MessageItem> item_;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
|
||||||
|
void setText(const QString& text);
|
||||||
|
void setAlert(const QString &in);
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MessageItemSettingsWidget(std::weak_ptr<MessageItem> item, QWidget *parent = nullptr);
|
||||||
|
~MessageItemSettingsWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MessageItemSettingsWidget *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MESSAGEITEMSETTINGSWIDGET_H
|
59
src/ui/itemsettingswidgets/messageitemsettingswidget.ui
Normal file
59
src/ui/itemsettingswidgets/messageitemsettingswidget.ui
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MessageItemSettingsWidget</class>
|
||||||
|
<widget class="QWidget" name="MessageItemSettingsWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>124</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Text:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEdit"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Alert:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEdit_alert"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Browse</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -3,19 +3,19 @@
|
|||||||
|
|
||||||
|
|
||||||
RelayItemSettingsWidget::RelayItemSettingsWidget(std::weak_ptr<Relay> relay, QWidget *parent) :
|
RelayItemSettingsWidget::RelayItemSettingsWidget(std::weak_ptr<Relay> relay, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
ui(new Ui::RelayItemSettingsWidget)
|
ui(new Ui::RelayItemSettingsWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
auto relayPtr = relay.lock();
|
auto relayPtr = relay.lock();
|
||||||
if(relayPtr)
|
if(relayPtr)
|
||||||
{
|
{
|
||||||
ui->label_ID->setText(QString::number(relayPtr->getId()));
|
ui->label_ID->setText(QString::number(relayPtr->getId()));
|
||||||
ui->label_Addr->setText(QString::number(relayPtr->getAddress(),2));
|
ui->label_Addr->setText(QString::number(relayPtr->getAddress(),2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RelayItemSettingsWidget::~RelayItemSettingsWidget()
|
RelayItemSettingsWidget::~RelayItemSettingsWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
@ -5,20 +5,21 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include "../../items/relay.h"
|
#include "../../items/relay.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class RelayItemSettingsWidget;
|
class RelayItemSettingsWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class RelayItemSettingsWidget : public QWidget
|
class RelayItemSettingsWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RelayItemSettingsWidget(std::weak_ptr<Relay> relay, QWidget *parent = nullptr);
|
explicit RelayItemSettingsWidget(std::weak_ptr<Relay> relay, QWidget *parent = nullptr);
|
||||||
~RelayItemSettingsWidget();
|
~RelayItemSettingsWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::RelayItemSettingsWidget *ui;
|
Ui::RelayItemSettingsWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RELAYITEMSETTINGSWIDGET_H
|
#endif // RELAYITEMSETTINGSWIDGET_H
|
||||||
|
@ -2,39 +2,39 @@
|
|||||||
#include "ui_systemitemsettingswidget.h"
|
#include "ui_systemitemsettingswidget.h"
|
||||||
|
|
||||||
SystemItemSettingsWidget::SystemItemSettingsWidget(std::weak_ptr<SystemItem> item, QWidget *parent) :
|
SystemItemSettingsWidget::SystemItemSettingsWidget(std::weak_ptr<SystemItem> item, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
item_(item),
|
item_(item),
|
||||||
ui(new Ui::SystemItemSettingsWidget)
|
ui(new Ui::SystemItemSettingsWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
if(auto itemPtr = item_.lock())
|
if(auto itemPtr = item_.lock())
|
||||||
{
|
{
|
||||||
ui->lineEdit_on->setText(itemPtr->getOnCommand());
|
ui->lineEdit_on->setText(itemPtr->getOnCommand());
|
||||||
ui->lineEdit_off->setText(itemPtr->getOffCommand());
|
ui->lineEdit_off->setText(itemPtr->getOffCommand());
|
||||||
}
|
}
|
||||||
else setDisabled(true);
|
else setDisabled(true);
|
||||||
|
|
||||||
connect(ui->lineEdit_on, &QLineEdit::textChanged, this, &SystemItemSettingsWidget::setOn);
|
connect(ui->lineEdit_on, &QLineEdit::textChanged, this, &SystemItemSettingsWidget::setOn);
|
||||||
connect(ui->lineEdit_off, &QLineEdit::textChanged, this, &SystemItemSettingsWidget::setOff);
|
connect(ui->lineEdit_off, &QLineEdit::textChanged, this, &SystemItemSettingsWidget::setOff);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemItemSettingsWidget::setOn(const QString& in)
|
void SystemItemSettingsWidget::setOn(const QString& in)
|
||||||
{
|
{
|
||||||
if(auto itemPtr = item_.lock())
|
if(auto itemPtr = item_.lock())
|
||||||
{
|
{
|
||||||
itemPtr->setOnCommand(in);
|
itemPtr->setOnCommand(in);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SystemItemSettingsWidget::setOff(const QString& in)
|
void SystemItemSettingsWidget::setOff(const QString& in)
|
||||||
{
|
{
|
||||||
if(auto itemPtr = item_.lock())
|
if(auto itemPtr = item_.lock())
|
||||||
{
|
{
|
||||||
itemPtr->setOffCommand(in);
|
itemPtr->setOffCommand(in);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SystemItemSettingsWidget::~SystemItemSettingsWidget()
|
SystemItemSettingsWidget::~SystemItemSettingsWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
@ -5,26 +5,27 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include "../../items/systemitem.h"
|
#include "../../items/systemitem.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class SystemItemSettingsWidget;
|
class SystemItemSettingsWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class SystemItemSettingsWidget : public QWidget
|
class SystemItemSettingsWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
std::weak_ptr<SystemItem> item_;
|
std::weak_ptr<SystemItem> item_;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
void setOn(const QString &in);
|
void setOn(const QString &in);
|
||||||
void setOff(const QString &in);
|
void setOff(const QString &in);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SystemItemSettingsWidget(std::weak_ptr<SystemItem> item, QWidget *parent = nullptr);
|
explicit SystemItemSettingsWidget(std::weak_ptr<SystemItem> item, QWidget *parent = nullptr);
|
||||||
~SystemItemSettingsWidget();
|
~SystemItemSettingsWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::SystemItemSettingsWidget *ui;
|
Ui::SystemItemSettingsWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SYSTEMITEMSETTINGSWIDGET_H
|
#endif // SYSTEMITEMSETTINGSWIDGET_H
|
||||||
|
@ -6,105 +6,105 @@
|
|||||||
#include <QSlider>
|
#include <QSlider>
|
||||||
|
|
||||||
ItemWidget::ItemWidget(std::weak_ptr<Item> item, bool analog, bool nameOnly, QWidget *parent) :
|
ItemWidget::ItemWidget(std::weak_ptr<Item> item, bool analog, bool nameOnly, QWidget *parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
item_(item),
|
item_(item),
|
||||||
ui(new Ui::ItemWidget)
|
ui(new Ui::ItemWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
if(analog)
|
if(analog)
|
||||||
{
|
{
|
||||||
ui->horizontalSpacer->changeSize(0,0);
|
ui->horizontalSpacer->changeSize(0,0);
|
||||||
ui->checkBox->hide();
|
ui->checkBox->hide();
|
||||||
}
|
}
|
||||||
else if(nameOnly)
|
else if(nameOnly)
|
||||||
{
|
{
|
||||||
ui->checkBox->hide();
|
ui->checkBox->hide();
|
||||||
ui->slider->hide();
|
ui->slider->hide();
|
||||||
}
|
}
|
||||||
else ui->slider->hide();
|
else ui->slider->hide();
|
||||||
|
|
||||||
if(auto workingRelay = item_.lock())
|
if(auto workingRelay = item_.lock())
|
||||||
{
|
{
|
||||||
ui->checkBox->setChecked(workingRelay->getValue());
|
ui->checkBox->setChecked(workingRelay->getValue());
|
||||||
|
|
||||||
ui->label->setText(workingRelay->getName());
|
ui->label->setText(workingRelay->getName());
|
||||||
|
|
||||||
if(analog)connect(ui->slider, &QSlider::valueChanged, this, &ItemWidget::moveToValue);
|
if(analog)connect(ui->slider, &QSlider::valueChanged, this, &ItemWidget::moveToValue);
|
||||||
else connect(ui->checkBox, &QCheckBox::toggled, this, &ItemWidget::moveToState);
|
else connect(ui->checkBox, &QCheckBox::toggled, this, &ItemWidget::moveToState);
|
||||||
connect(ui->pushButton, &QPushButton::clicked, this, &ItemWidget::showSettingsDialog);
|
connect(ui->pushButton, &QPushButton::clicked, this, &ItemWidget::showSettingsDialog);
|
||||||
connect(workingRelay.get(), &Relay::valueChanged, this, &ItemWidget::stateChanged);
|
connect(workingRelay.get(), &Relay::valueChanged, this, &ItemWidget::stateChanged);
|
||||||
connect(ui->pushButton_Remove, &QPushButton::clicked, this, &ItemWidget::deleteItem);
|
connect(ui->pushButton_Remove, &QPushButton::clicked, this, &ItemWidget::deleteItem);
|
||||||
|
|
||||||
}
|
}
|
||||||
else disable();
|
else disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemWidget::deleteItem()
|
void ItemWidget::deleteItem()
|
||||||
{
|
{
|
||||||
if(auto workingItem = item_.lock())
|
if(auto workingItem = item_.lock())
|
||||||
{
|
{
|
||||||
deleteRequest(*workingItem);
|
deleteRequest(*workingItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemWidget::moveToValue(int value)
|
void ItemWidget::moveToValue(int value)
|
||||||
{
|
{
|
||||||
if(auto workingItem = item_.lock()) workingItem->setValue(value);
|
if(auto workingItem = item_.lock()) workingItem->setValue(value);
|
||||||
else disable();
|
else disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemWidget::moveToState(bool state)
|
void ItemWidget::moveToState(bool state)
|
||||||
{
|
{
|
||||||
if(auto workingItem = item_.lock()) workingItem->setValue(state);
|
if(auto workingItem = item_.lock()) workingItem->setValue(state);
|
||||||
else disable();
|
else disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemWidget::disable()
|
void ItemWidget::disable()
|
||||||
{
|
{
|
||||||
ui->checkBox->setEnabled(false);
|
ui->checkBox->setEnabled(false);
|
||||||
ui->label->setEnabled(false);
|
ui->label->setEnabled(false);
|
||||||
ui->slider->setEnabled(false);
|
ui->slider->setEnabled(false);
|
||||||
ui->pushButton_Remove->setEnabled(false);
|
ui->pushButton_Remove->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ItemWidget::controles(const ItemData& relay)
|
bool ItemWidget::controles(const ItemData& relay)
|
||||||
{
|
{
|
||||||
if(auto workingRelay = item_.lock())
|
if(auto workingRelay = item_.lock())
|
||||||
{
|
{
|
||||||
if(relay == *workingRelay) return true;
|
if(relay == *workingRelay) return true;
|
||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemWidget::showSettingsDialog()
|
void ItemWidget::showSettingsDialog()
|
||||||
{
|
{
|
||||||
if(auto workingRelay = item_.lock())
|
if(auto workingRelay = item_.lock())
|
||||||
{
|
{
|
||||||
ItemSettingsDialog dialog(workingRelay, this);
|
ItemSettingsDialog dialog(workingRelay, this);
|
||||||
dialog.exec();
|
dialog.exec();
|
||||||
}
|
}
|
||||||
else disable();
|
else disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::weak_ptr<Item> ItemWidget::getItem()
|
std::weak_ptr<Item> ItemWidget::getItem()
|
||||||
{
|
{
|
||||||
return item_;
|
return item_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ItemWidget::stateChanged(int state)
|
void ItemWidget::stateChanged(int state)
|
||||||
{
|
{
|
||||||
qDebug()<<"widget got state "<<state;
|
qDebug()<<"widget got state "<<state;
|
||||||
ui->slider->blockSignals(true);
|
ui->slider->blockSignals(true);
|
||||||
ui->slider->setValue(state);
|
ui->slider->setValue(state);
|
||||||
ui->slider->blockSignals(false);
|
ui->slider->blockSignals(false);
|
||||||
ui->checkBox->blockSignals(true);
|
ui->checkBox->blockSignals(true);
|
||||||
ui->checkBox->setChecked(state);
|
ui->checkBox->setChecked(state);
|
||||||
ui->checkBox->blockSignals(false);
|
ui->checkBox->blockSignals(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
ItemWidget::~ItemWidget()
|
ItemWidget::~ItemWidget()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
@ -6,40 +6,41 @@
|
|||||||
#include "itemsettingsdialog.h"
|
#include "itemsettingsdialog.h"
|
||||||
#include "../items/item.h"
|
#include "../items/item.h"
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui
|
||||||
|
{
|
||||||
class ItemWidget;
|
class ItemWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
class ItemWidget : public QWidget
|
class ItemWidget : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
std::weak_ptr<Item> item_;
|
std::weak_ptr<Item> item_;
|
||||||
|
|
||||||
void disable();
|
void disable();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void deleteRequest(const ItemData& item);
|
void deleteRequest(const ItemData& item);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void showSettingsDialog();
|
void showSettingsDialog();
|
||||||
void moveToState(bool state);
|
void moveToState(bool state);
|
||||||
void moveToValue(int value);
|
void moveToValue(int value);
|
||||||
void deleteItem();
|
void deleteItem();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ItemWidget(std::weak_ptr<Item> item, bool analog = false, bool nameOnly = false, QWidget *parent = nullptr);
|
explicit ItemWidget(std::weak_ptr<Item> item, bool analog = false, bool nameOnly = false, QWidget *parent = nullptr);
|
||||||
std::weak_ptr<Item> getItem();
|
std::weak_ptr<Item> getItem();
|
||||||
bool controles(const ItemData& relay);
|
bool controles(const ItemData& relay);
|
||||||
~ItemWidget();
|
~ItemWidget();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void stateChanged(int state);
|
void stateChanged(int state);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::ItemWidget *ui;
|
Ui::ItemWidget *ui;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RELAYWIDGET_H
|
#endif // RELAYWIDGET_H
|
||||||
|
@ -4,85 +4,98 @@
|
|||||||
#include "itemsettingsdialog.h"
|
#include "itemsettingsdialog.h"
|
||||||
#include "itemcreationdialog.h"
|
#include "itemcreationdialog.h"
|
||||||
#include "../mainobject.h"
|
#include "../mainobject.h"
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
MainWindow::MainWindow(MainObject * const mainObject, QWidget *parent) :
|
MainWindow::MainWindow(MainObject * const mainObject, QWidget *parent) :
|
||||||
QMainWindow(parent),
|
QMainWindow(parent),
|
||||||
ui(new Ui::MainWindow),
|
ui(new Ui::MainWindow),
|
||||||
colorChooser(this),
|
colorChooser(this),
|
||||||
_micro(&mainObject->micro),
|
_micro(&mainObject->micro),
|
||||||
_powerItem(mainObject->powerItem)
|
_powerItem(mainObject->powerItem)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
if(!mainObject->master)
|
if(!mainObject->master)
|
||||||
|
{
|
||||||
connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::sigBrodcast);
|
connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::sigBrodcast);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::sigSave);
|
connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::sigSave);
|
||||||
|
connect(ui->pushButton_broadcast, &QPushButton::clicked, this, &MainWindow::saved);
|
||||||
|
}
|
||||||
|
|
||||||
connect(ui->pushButton_power, SIGNAL(clicked()), this, SLOT(showPowerItemDialog()));
|
connect(ui->pushButton_power, SIGNAL(clicked()), this, SLOT(showPowerItemDialog()));
|
||||||
|
|
||||||
//Relays
|
//Relays
|
||||||
if(mainObject->master)connect(ui->pushButton_refesh, &QPushButton::clicked, _micro, &Microcontroller::requestState);
|
if(mainObject->master)connect(ui->pushButton_refesh, &QPushButton::clicked, _micro, &Microcontroller::requestState);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
connect(ui->pushButton_refesh, &QPushButton::clicked, &mainObject->broadCast, &BroadCast::requestJson);
|
connect(ui->pushButton_refesh, &QPushButton::clicked, &mainObject->broadCast, &BroadCast::requestJson);
|
||||||
connect(ui->pushButton_refesh, &QPushButton::clicked, &mainObject->broadCast, &BroadCast::requestSensors);
|
connect(ui->pushButton_refesh, &QPushButton::clicked, &mainObject->broadCast, &BroadCast::requestSensors);
|
||||||
}
|
}
|
||||||
connect(&mainObject->items, &ItemStore::itemAdded, ui->relayList, &ItemScrollBox::addItem);
|
connect(&mainObject->items, &ItemStore::itemAdded, ui->relayList, &ItemScrollBox::addItem);
|
||||||
connect(&mainObject->items, &ItemStore::itemDeleted, ui->relayList, &ItemScrollBox::removeItem);
|
connect(&mainObject->items, &ItemStore::itemDeleted, ui->relayList, &ItemScrollBox::removeItem);
|
||||||
|
|
||||||
for(size_t i = 0; i < mainObject->items.getItems()->size(); ++i)
|
for(size_t i = 0; i < mainObject->items.getItems()->size(); ++i)
|
||||||
{
|
{
|
||||||
ui->relayList->addItem(mainObject->items.getItems()->at(i));
|
ui->relayList->addItem(mainObject->items.getItems()->at(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Sensors
|
//Sensors
|
||||||
ui->sensorListView->setShowHidden(false);
|
ui->sensorListView->setShowHidden(false);
|
||||||
ui->sensorListView->sensorsChanged(*globalSensors.getSensors());
|
ui->sensorListView->sensorsChanged(*globalSensors.getSensors());
|
||||||
connect(&globalSensors, &SensorStore::stateChenged, ui->sensorListView, &SensorListWidget::sensorsChanged);
|
connect(&globalSensors, &SensorStore::stateChenged, ui->sensorListView, &SensorListWidget::sensorsChanged);
|
||||||
|
|
||||||
//RGB Leds
|
//RGB Leds
|
||||||
connect(&colorChooser, SIGNAL(colorSelected(const QColor)), this, SLOT(slotChangedRgb(const QColor)));
|
connect(&colorChooser, SIGNAL(colorSelected(QColor)), this, SLOT(slotChangedRgb(QColor)));
|
||||||
connect(ui->button_quit, SIGNAL(clicked()), this, SLOT(close()));
|
connect(ui->button_quit, SIGNAL(clicked()), this, SLOT(close()));
|
||||||
connect(ui->button_color, SIGNAL(clicked()), &colorChooser, SLOT(show()));
|
connect(ui->button_color, SIGNAL(clicked()), &colorChooser, SLOT(show()));
|
||||||
|
|
||||||
connect(ui->pushButton_addItem, &QPushButton::clicked, this, &MainWindow::showItemCreationDialog);
|
connect(ui->pushButton_addItem, &QPushButton::clicked, this, &MainWindow::showItemCreationDialog);
|
||||||
connect(ui->relayList, &ItemScrollBox::deleteRequest, &mainObject->items, &ItemStore::removeItem);
|
connect(ui->relayList, &ItemScrollBox::deleteRequest, &mainObject->items, &ItemStore::removeItem);
|
||||||
|
|
||||||
|
ui->splitter->setStretchFactor(1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::showPowerItemDialog()
|
void MainWindow::showPowerItemDialog()
|
||||||
{
|
{
|
||||||
ItemSettingsDialog diag(std::shared_ptr<Item>(_powerItem), this);
|
ItemSettingsDialog diag(std::shared_ptr<Item>(_powerItem), this);
|
||||||
diag.show();
|
diag.show();
|
||||||
diag.exec();
|
diag.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::saved()
|
||||||
|
{
|
||||||
|
QMessageBox::information(this, "Saved", "Settings where saved");
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::slotChangedRgb(const QColor color)
|
void MainWindow::slotChangedRgb(const QColor color)
|
||||||
{
|
{
|
||||||
_micro->changeRgbColor(color);
|
_micro->changeRgbColor(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::showItemCreationDialog()
|
void MainWindow::showItemCreationDialog()
|
||||||
{
|
{
|
||||||
ItemCreationDialog diag(this);
|
ItemCreationDialog diag(this);
|
||||||
diag.show();
|
diag.show();
|
||||||
if(diag.exec())
|
if(diag.exec())
|
||||||
{
|
{
|
||||||
createdItem(diag.item);
|
createdItem(diag.item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::changeHeaderLableText(QString string)
|
void MainWindow::changeHeaderLableText(QString string)
|
||||||
{
|
{
|
||||||
if(string.size() > 28)
|
if(string.size() > 28)
|
||||||
{
|
{
|
||||||
string.remove(28, string.size()-(28));
|
string.remove(28, string.size()-(28));
|
||||||
string.append("...");
|
string.append("...");
|
||||||
}
|
}
|
||||||
ui->label_serialRecive->setText(string);
|
ui->label_serialRecive->setText(string);
|
||||||
}
|
}
|
||||||
|
@ -23,37 +23,38 @@ class MainWindow;
|
|||||||
|
|
||||||
class MainWindow : public QMainWindow
|
class MainWindow : public QMainWindow
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MainWindow(MainObject * const mainObject, QWidget *parent = nullptr);
|
explicit MainWindow(MainObject * const mainObject, QWidget *parent = nullptr);
|
||||||
~MainWindow();
|
~MainWindow();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
|
|
||||||
QColorDialog colorChooser;
|
QColorDialog colorChooser;
|
||||||
|
|
||||||
Microcontroller *_micro;
|
Microcontroller *_micro;
|
||||||
|
|
||||||
std::shared_ptr<PowerItem> _powerItem;
|
std::shared_ptr<PowerItem> _powerItem;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void sigBrodcast();
|
void sigBrodcast();
|
||||||
void sigSave();
|
void sigSave();
|
||||||
void createdItem(std::shared_ptr<Item> item);
|
void createdItem(std::shared_ptr<Item> item);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
||||||
//RGB
|
//RGB
|
||||||
void slotChangedRgb(const QColor color);
|
void slotChangedRgb(const QColor color);
|
||||||
void showPowerItemDialog();
|
void showPowerItemDialog();
|
||||||
void showItemCreationDialog();
|
void showItemCreationDialog();
|
||||||
|
void saved();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void changeHeaderLableText(QString string);
|
void changeHeaderLableText(QString string);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
@ -42,178 +42,200 @@
|
|||||||
<property name="autoFillBackground">
|
<property name="autoFillBackground">
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_10" stretch="0,1">
|
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0">
|
<widget class="QSplitter" name="splitter">
|
||||||
<item>
|
<property name="orientation">
|
||||||
<widget class="QLabel" name="label_serialRecive">
|
<enum>Qt::Horizontal</enum>
|
||||||
<property name="sizePolicy">
|
</property>
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
<property name="childrenCollapsible">
|
||||||
<horstretch>0</horstretch>
|
<bool>false</bool>
|
||||||
<verstretch>0</verstretch>
|
</property>
|
||||||
</sizepolicy>
|
<widget class="QWidget" name="">
|
||||||
</property>
|
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,0">
|
||||||
<property name="frameShape">
|
|
||||||
<enum>QFrame::Box</enum>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>SHinterface</string>
|
|
||||||
</property>
|
|
||||||
<property name="textFormat">
|
|
||||||
<enum>Qt::AutoText</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="groupBox_2">
|
|
||||||
<property name="title">
|
|
||||||
<string>Sensors</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="SensorListWidget" name="sensorListView">
|
|
||||||
<property name="selectionMode">
|
|
||||||
<enum>QAbstractItemView::NoSelection</enum>
|
|
||||||
</property>
|
|
||||||
<property name="showGrid" stdset="0">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="button_color">
|
<widget class="QLabel" name="label_serialRecive">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="frameShape">
|
||||||
<size>
|
<enum>QFrame::Box</enum>
|
||||||
<width>0</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>48</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="baseSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>128</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Color</string>
|
<string>SHinterface</string>
|
||||||
|
</property>
|
||||||
|
<property name="textFormat">
|
||||||
|
<enum>Qt::AutoText</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="pushButton_power">
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
<property name="text">
|
<property name="title">
|
||||||
<string>Config Shutdown</string>
|
<string>Sensors</string>
|
||||||
</property>
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="SensorListWidget" name="sensorListView">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>300</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="selectionMode">
|
||||||
|
<enum>QAbstractItemView::NoSelection</enum>
|
||||||
|
</property>
|
||||||
|
<property name="showGrid" stdset="0">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="button_color">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>48</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="baseSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>128</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Color</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_power">
|
||||||
|
<property name="text">
|
||||||
|
<string>Config Shutdown</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</widget>
|
||||||
</layout>
|
<widget class="QWidget" name="">
|
||||||
</item>
|
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0">
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0">
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="groupBox">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Items</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="ItemScrollBox" name="relayList" native="true">
|
|
||||||
<property name="sizePolicy">
|
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
|
||||||
<horstretch>0</horstretch>
|
|
||||||
<verstretch>0</verstretch>
|
|
||||||
</sizepolicy>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="pushButton_refesh">
|
<widget class="QGroupBox" name="groupBox">
|
||||||
<property name="text">
|
|
||||||
<string>Refesh</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="pushButton_broadcast">
|
|
||||||
<property name="text">
|
|
||||||
<string>Save</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="pushButton_addItem">
|
|
||||||
<property name="text">
|
|
||||||
<string>Add Item</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="button_quit">
|
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="layoutDirection">
|
<property name="title">
|
||||||
<enum>Qt::RightToLeft</enum>
|
<string>Items</string>
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Quit</string>
|
|
||||||
</property>
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="ItemScrollBox" name="relayList" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_refesh">
|
||||||
|
<property name="text">
|
||||||
|
<string>Refesh</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_broadcast">
|
||||||
|
<property name="text">
|
||||||
|
<string>Save</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_addItem">
|
||||||
|
<property name="text">
|
||||||
|
<string>Add Item</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="button_quit">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="layoutDirection">
|
||||||
|
<enum>Qt::RightToLeft</enum>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Quit</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</widget>
|
||||||
</layout>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -4,69 +4,71 @@
|
|||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QScroller>
|
#include <QScroller>
|
||||||
|
|
||||||
SensorListWidget::SensorListWidget(const bool showHidden, QWidget *parent): QTableWidget(parent), showHidden_(showHidden)
|
SensorListWidget::SensorListWidget(const bool showHidden, QWidget *parent): QTableWidget(parent),
|
||||||
|
showHidden_(showHidden)
|
||||||
{
|
{
|
||||||
setColumnCount(2);
|
setColumnCount(3);
|
||||||
setSelectionBehavior(QAbstractItemView::SelectRows);
|
setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||||
horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
||||||
QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture);
|
QScroller::grabGesture(this, QScroller::LeftMouseButtonGesture);
|
||||||
setAutoScroll(true);
|
setAutoScroll(true);
|
||||||
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||||
setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor"));
|
sensorsChanged(std::vector<Sensor>());
|
||||||
setHorizontalHeaderItem(1, new QTableWidgetItem("Value"));
|
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<Sensor> sensors)
|
void SensorListWidget::sensorsChanged(std::vector<Sensor> sensors)
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor"));
|
setHorizontalHeaderItem(0, new QTableWidgetItem("Sensor"));
|
||||||
setHorizontalHeaderItem(1, new QTableWidgetItem("Value"));
|
setHorizontalHeaderItem(1, new QTableWidgetItem("Value"));
|
||||||
size_t nonHiddenCount = sensors.size();
|
setHorizontalHeaderItem(2, new QTableWidgetItem("Time"));
|
||||||
if(!showHidden_)
|
size_t listLen = 0;
|
||||||
{
|
for(size_t i = 0; i < sensors.size(); ++i)
|
||||||
nonHiddenCount = 0;
|
if(showHidden_ || !sensors[i].hidden)
|
||||||
for(size_t i = 0; i < sensors.size(); ++i)
|
++listLen;
|
||||||
{
|
setRowCount(static_cast<int>(listLen));
|
||||||
if(!sensors[i].hidden) nonHiddenCount++;
|
size_t row = 0;
|
||||||
}
|
for(size_t i = 0; i < sensors.size(); ++i)
|
||||||
}
|
{
|
||||||
size_t listLen = 0;
|
if(showHidden_ || !sensors[i].hidden)
|
||||||
for(size_t i = 0; i < sensors.size(); ++i) if(showHidden_ || !sensors[i].hidden) ++listLen;
|
{
|
||||||
setRowCount(static_cast<int>(listLen));
|
QString itemString;
|
||||||
size_t row = 0;
|
itemString.append(QString::number(sensors[i].field));
|
||||||
for(size_t i = 0; i < sensors.size(); ++i)
|
itemString.append(' ');
|
||||||
{
|
|
||||||
if(showHidden_ || !sensors[i].hidden)
|
|
||||||
{
|
|
||||||
QString itemString;
|
|
||||||
itemString.append(QString::number(sensors[i].field));
|
|
||||||
itemString.append(' ');
|
|
||||||
|
|
||||||
if(sensors[i].type == Sensor::TYPE_DOOR)
|
if(sensors[i].type == Sensor::TYPE_DOOR)
|
||||||
{
|
{
|
||||||
if(static_cast<bool>(sensors[i].field)) itemString.append("\"Open\"");
|
if(static_cast<bool>(sensors[i].field))
|
||||||
else itemString.append("\"Closed\"");
|
itemString.append("\"Open\"");
|
||||||
}
|
else itemString.append("\"Closed\"");
|
||||||
else if(sensors[i].type == Sensor::TYPE_AUDIO_OUTPUT)
|
}
|
||||||
{
|
else if(sensors[i].type == Sensor::TYPE_AUDIO_OUTPUT)
|
||||||
if(static_cast<bool>(sensors[i].field)) itemString.append("\"Playing\"");
|
{
|
||||||
else itemString.append("\"Silent\"");
|
if(static_cast<bool>(sensors[i].field))
|
||||||
}
|
itemString.append("\"Playing\"");
|
||||||
|
else itemString.append("\"Silent\"");
|
||||||
|
}
|
||||||
|
|
||||||
setItem(static_cast<int>(row), 0, new QTableWidgetItem(sensors[i].name + (sensors[i].hidden ? "(H)" : "")));
|
setItem(static_cast<int>(row), 0, new QTableWidgetItem(sensors[i].name + (sensors[i].hidden ? " (H)" : "")));
|
||||||
setItem(static_cast<int>(row), 1, new QTableWidgetItem(itemString));
|
setItem(static_cast<int>(row), 1, new QTableWidgetItem(itemString));
|
||||||
++row;
|
if(sensors[i].type <= 128)
|
||||||
}
|
setItem(static_cast<int>(row), 2, new QTableWidgetItem(sensors[i].lastSeen.time().toString("hh:mm")));
|
||||||
}
|
++row;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sortItems(0, Qt::AscendingOrder);
|
||||||
|
resizeColumnsToContents();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SensorListWidget::setShowHidden(const bool showHidden)
|
void SensorListWidget::setShowHidden(const bool showHidden)
|
||||||
{
|
{
|
||||||
showHidden_=showHidden;
|
showHidden_=showHidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,19 +5,19 @@
|
|||||||
|
|
||||||
class SensorListWidget : public QTableWidget
|
class SensorListWidget : public QTableWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
bool showHidden_;
|
bool showHidden_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
SensorListWidget(const bool showHidden = true, QWidget *parent = nullptr);
|
SensorListWidget(const bool showHidden = true, QWidget *parent = nullptr);
|
||||||
SensorListWidget(SensorStore& sensorStore, const bool showHidden = true, QWidget* parent = nullptr);
|
SensorListWidget(SensorStore& sensorStore, const bool showHidden = true, QWidget* parent = nullptr);
|
||||||
virtual ~SensorListWidget(){}
|
virtual ~SensorListWidget() {}
|
||||||
void setShowHidden(const bool showHidden);
|
void setShowHidden(const bool showHidden);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
void sensorsChanged(std::vector<Sensor> sensors);
|
void sensorsChanged(std::vector<Sensor> sensors);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user