diff --git a/SHinterface.pro b/SHinterface.pro index f94e80d..c8c7a7b 100644 --- a/SHinterface.pro +++ b/SHinterface.pro @@ -6,11 +6,15 @@ QT += core gui widgets network - QT += serialport +QT += serialport TARGET = SHinterface TEMPLATE = app +INCLUDEPATH += /usr/include/libnl3/ + +LIBS += -lnl-3 -lnl-genl-3 + # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the @@ -29,6 +33,7 @@ SOURCES += \ src/ui/itemcreationdialog.cpp \ src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \ src/mainobject.cpp \ + src/apgetconnected.cpp \ src/ui/actorwidgets/polynomalactorwidget.cpp \ src/ui/actorwidgets/sensoractorwidget.cpp \ src/ui/actorwidgets/alarmwidget.cpp \ @@ -81,6 +86,7 @@ HEADERS += \ src/ui/itemcreationdialog.h \ src/ui/itemsettingswidgets/messageitemsettingswidget.h \ src/mainobject.h \ + src/apgetconnected.h \ src/ui/actorwidgets/alarmwidget.h \ src/ui/actorwidgets/polynomalactorwidget.h \ src/ui/actorwidgets/sensoractorwidget.h \ diff --git a/src/actors/regulator.cpp b/src/actors/regulator.cpp index d68eb4b..7dda114 100644 --- a/src/actors/regulator.cpp +++ b/src/actors/regulator.cpp @@ -65,8 +65,8 @@ void Regulator::store(QJsonObject& json) void Regulator::load(const QJsonObject& json, bool preserve) { Actor::load(json, preserve); - band_ = json["Band"].toInt(1); - setPoint_ = json["SetPoint"].toInt(22); + band_ = json["Band"].toDouble(1); + setPoint_ = json["SetPoint"].toDouble(22); sensor_.type = json["SensorType"].toInt(0); sensor_.id = json["SensorId"].toInt(0); sensor_.field = json["SensorField"].toInt(0); diff --git a/src/broadcast.cpp b/src/broadcast.cpp index 75af2e1..0f1a697 100644 --- a/src/broadcast.cpp +++ b/src/broadcast.cpp @@ -94,6 +94,11 @@ void BroadCast::decode() } } +void BroadCast::sendMessage(const QString &title, const QString &body) +{ + write(QByteArray("MESG ") + title.toLatin1() + " BODY " + body.toLatin1()); +} + void BroadCast::readyRead() { buffer_.append(iodevice_->readAll()); diff --git a/src/broadcast.h b/src/broadcast.h index 3a46622..04869d4 100644 --- a/src/broadcast.h +++ b/src/broadcast.h @@ -45,6 +45,7 @@ public: BroadCast(QIODevice* const iodevice = nullptr, bool master = true); void sendJson(const QJsonObject& json); + void sendMessage(const QString& title, const QString& body); }; diff --git a/src/items/itemstore.cpp b/src/items/itemstore.cpp index 3dcdb78..d518439 100644 --- a/src/items/itemstore.cpp +++ b/src/items/itemstore.cpp @@ -15,7 +15,6 @@ void ItemStore::addItem(std::shared_ptr item) { items_.push_back(std::shared_ptr(item)); itemAdded(std::weak_ptr(items_.back())); - qDebug()<<"item added"; } } @@ -75,7 +74,6 @@ void ItemStore::itemStateChanged(const ItemData& item) { if(items_[i]->operator==(item)) { - qDebug()<<"is item "<id()<<"\nHas state: "<getValue()<<" wants state: "<getValue() != item.getValue())items_[i]->informValue(item.getValue()); } @@ -95,7 +93,7 @@ void ItemStore::store(QJsonObject& json) json["Items"] = itemsArray; } -void ItemStore::load(const QJsonObject& json, Microcontroller * const micro) +void ItemStore::load(const QJsonObject& json) { const QJsonArray itemsArray(json["Items"].toArray(QJsonArray())); for(int i = 0; i < itemsArray.size(); ++i) @@ -106,7 +104,7 @@ void ItemStore::load(const QJsonObject& json, Microcontroller * const micro) std::shared_ptr newItem; if(itemObject["Type"].toString("") == "Relay") { - newItem = std::shared_ptr(new Relay(micro)); + newItem = std::shared_ptr(new Relay()); } else if(itemObject["Type"].toString("") == "Message") { diff --git a/src/items/itemstore.h b/src/items/itemstore.h index 274e999..f2237bf 100644 --- a/src/items/itemstore.h +++ b/src/items/itemstore.h @@ -3,7 +3,6 @@ #include #include "item.h" #include "../sensors/sensor.h" -#include "../microcontroller.h" #include @@ -21,7 +20,7 @@ public: inline std::vector< std::shared_ptr >* getItems(){ return &items_; } void store(QJsonObject &json); - void load(const QJsonObject &json, Microcontroller * const micro); + void load(const QJsonObject &json); void clear(); diff --git a/src/items/messageitem.cpp b/src/items/messageitem.cpp index 1823a6d..57f352d 100644 --- a/src/items/messageitem.cpp +++ b/src/items/messageitem.cpp @@ -2,6 +2,8 @@ #include +BroadCast* MessageItem::broadCast_ = nullptr; + MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): Item(itemIdIn, name, value, parent) { @@ -28,6 +30,8 @@ void MessageItem::setValue(uint8_t value) messageBox_->setModal(false); connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox); messageBox_->show(); + if(broadCast_) broadCast_->sendMessage(name_, message_); + //QTimer::singleShot(600000, this, &MessageItem::closeMessageBox); } else if(!value && messageBox_) diff --git a/src/items/messageitem.h b/src/items/messageitem.h index 58e8bcf..3524f68 100644 --- a/src/items/messageitem.h +++ b/src/items/messageitem.h @@ -4,6 +4,7 @@ #include #include "item.h" +#include "../broadcast.h" class MessageItem : public Item { @@ -13,6 +14,8 @@ private: QString message_; QMessageBox* messageBox_ = nullptr; + static BroadCast* broadCast_; + private slots: void closeMessageBox(); diff --git a/src/items/relay.cpp b/src/items/relay.cpp index bc79ddf..1c5b9b7 100644 --- a/src/items/relay.cpp +++ b/src/items/relay.cpp @@ -3,7 +3,9 @@ //Relay -Relay::Relay(Microcontroller* micro, uint8_t id, QString name, uint16_t address, bool state, QObject* parent): Item(0, name, state, parent), micro_(micro), id_(id), address_(address) +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) { itemId_ = address | ((uint32_t)id << 16); } @@ -11,8 +13,11 @@ Relay::Relay(Microcontroller* micro, uint8_t id, QString name, uint16_t address, void Relay::setValue(uint8_t value) { Item::setValue(value); - if(value)micro_->relayOn(id_); - else micro_->relayOff(id_); + if(micro_) + { + if(value)micro_->relayOn(id_); + else micro_->relayOff(id_); + } } void Relay::on() diff --git a/src/items/relay.h b/src/items/relay.h index 261aa7f..4114eef 100644 --- a/src/items/relay.h +++ b/src/items/relay.h @@ -13,7 +13,7 @@ class Relay : public Item { Q_OBJECT private: - Microcontroller* micro_; + static Microcontroller* micro_; uint8_t id_; uint16_t address_; @@ -26,12 +26,14 @@ public slots: void toggle(); public: - Relay(Microcontroller* micro, uint8_t id = 0, QString name = "", uint16_t address = 0, bool state = false, QObject* parent = nullptr); + Relay(uint8_t id = 0, QString name = "", uint16_t address = 0, bool state = false, QObject* parent = nullptr); uint16_t getAddress() const; uint8_t getId() const; void setId(uint8_t id); + inline static void setMicrocontroller(Microcontroller* micro){ micro_ = micro; } + virtual void store(QJsonObject& json); virtual void load(const QJsonObject& json, const bool preserve = false); }; diff --git a/src/main.cpp b/src/main.cpp index b13196c..7487771 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,8 +59,6 @@ int main(int argc, char *argv[]) parser.addOption(settingsPathOption); QCommandLineOption secondaryOption(QStringList() << "e" << "secondary", QCoreApplication::translate("main", "Set if instance is not main instance")); parser.addOption(secondaryOption); - QCommandLineOption qsettingsOption(QStringList() << "q" << "qsettigns", QCoreApplication::translate("main", "Set if jsettings file format should be used.")); - parser.addOption(secondaryOption); parser.process(a); #endif diff --git a/src/mainobject.cpp b/src/mainobject.cpp index 9f087c7..21bc74c 100644 --- a/src/mainobject.cpp +++ b/src/mainobject.cpp @@ -1,4 +1,4 @@ -#include "mainobject.h" +#include "mainobject.h" MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent) : QObject(parent), @@ -20,6 +20,8 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const QObject::connect(&globalSensors, &SensorStore::sensorChangedState, &ocupancySensor, &OcupancySensorSource::sensorEvent); QObject::connect(&ocupancySensor, &OcupancySensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState); + sunSensorSource.run(); + //connect item store QObject::connect(µ, &Microcontroller::gotRelayList, &items, &ItemStore::addItems); QObject::connect(µ, &Microcontroller::itemChanged, &items, &ItemStore::itemStateChanged); @@ -30,6 +32,8 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const items.addItem(rgbItem); items.addItem(auxItem); + 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); @@ -60,6 +64,9 @@ void MainObject::store(QJsonObject &json) items.store(json); QJsonObject powerObject; powerItem.store(powerObject); + QJsonObject ocupancyObject; + ocupancySensor.store(ocupancyObject); + json.insert("Ocupancy", ocupancyObject); json.insert("Power", powerObject); } @@ -71,8 +78,9 @@ void MainObject::load(const QJsonObject& json) powerItem.removeAllActors(); items.addItem(rgbItem); items.addItem(auxItem); - items.load(json, µ); + items.load(json); powerItem.load(json["Power"].toObject()); + ocupancySensor.load(json["Ocupancy"].toObject()); qDebug()<<"aray size: "<= 2) { @@ -84,7 +92,7 @@ void MainObject::load(const QJsonObject& json) void MainObject::recivedJson(const QJsonObject json) { - if(master)storeJsonObjectToDisk(json, settingsPath); + if(master && !noSave)storeJsonObjectToDisk(json, settingsPath); load(json); } diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index e1e0dd7..0ce1dc7 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -131,7 +131,7 @@ std::shared_ptr Microcontroller::processRelayLine(const QString& buffer) if(name.size() > 1)name.remove(name.size()-1, 1); else name = "Relay " + QString::number(bufferList[1].toInt(nullptr, 2)); qDebug()<<"Relay "<( new Relay(this, bufferList[2].toInt(), name, bufferList[4].toInt(nullptr, 2), bufferList[6].toInt())); + return std::shared_ptr( new Relay(bufferList[2].toInt(), name, bufferList[4].toInt(nullptr, 2), bufferList[6].toInt())); } return nullptr; } diff --git a/src/sensors/ocupancysensor.cpp b/src/sensors/ocupancysensor.cpp index 115a53d..0d064be 100644 --- a/src/sensors/ocupancysensor.cpp +++ b/src/sensors/ocupancysensor.cpp @@ -2,41 +2,57 @@ #include #include +#include "../apgetconnected.h" -OcupancySensorSource::OcupancySensorSource(QObject *parent): QObject (parent) + +OcupancySensorSource::OcupancySensorSource(QObject *parent, const QString& device, const QString& deviceMac): QObject (parent), deviceMac_(deviceMac), device_(device) { - connect(&ping, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(pingExit(int, QProcess::ExitStatus))); - Timeout(); + } void OcupancySensorSource::sensorEvent(Sensor sensor) { if(sensor.type == Sensor::TYPE_DOOR && sensor.id == 1 && sensor.field != 0.0f) { - QTimer::singleShot(240000, this, &OcupancySensorSource::Timeout); - qDebug()<<"starting timer"; + if(occupied == false) stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 1, "Occupancy")); + QTimer::singleShot(600000, this, &OcupancySensorSource::Timeout); } } void OcupancySensorSource::Timeout() { - qDebug()<<"starting ping"; - ping.start("ping 192.168.0.104 -c 1 -W 1"); -} - -void OcupancySensorSource::pingExit(int exitCode, QProcess::ExitStatus exitStatus) -{ - qDebug()<<"ping finished"; - if(exitStatus == QProcess::ExitStatus::NormalExit) + int error = 0; + std::vector devices = ap::connectedDevices(device_.toLatin1().toStdString(), error); + if(error == 0) { - qDebug()<<"Exit Code "< -#include +#include #include "sensor.h" class OcupancySensorSource : public QObject @@ -9,10 +9,15 @@ class OcupancySensorSource : public QObject Q_OBJECT private: - QProcess ping; + QString deviceMac_; + QString device_; + bool occupied = true; public: - explicit OcupancySensorSource(QObject *parent = nullptr); + explicit OcupancySensorSource(QObject *parent = nullptr, const QString& device = "wlan0", const QString& deviceMac = "60:BE:B5:25:8C:E0"); + + void store(QJsonObject& json); + void load(const QJsonObject& json); public slots: void sensorEvent(Sensor sensor); @@ -20,7 +25,6 @@ public slots: private slots: void Timeout(); - void pingExit(int exitCode, QProcess::ExitStatus exitStatus); signals: void stateChanged(Sensor sensor);