diff --git a/src/items/item.cpp b/src/items/item.cpp index 7f350a2..6f88544 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -161,34 +161,26 @@ Item& Item::operator=(const ItemData& other) void Item::requestUpdate(ItemUpdateRequest update) { - assert(update.type != ITEM_UPDATE_INVALID); - if(update.type != ITEM_UPDATE_LOADED && value_ == update.payload.getValue()) + if(!hasChanged(update.payload)) return; if(update.type == ITEM_UPDATE_ACTOR && override_) return; - qDebug()<<"Item Update Request for"<& actor : update.newActors) addActor(actor); } - update.payload = *this; + updated(update); } @@ -294,7 +286,6 @@ ItemUpdateRequest Item::createValueUpdateRequest(uint8_t value, bool withActors) { ItemUpdateRequest update; - update.type = type; update.payload = *this; update.payload.setValueData(value); if(withActors) diff --git a/src/items/item.h b/src/items/item.h index d461006..f88b8cf 100644 --- a/src/items/item.h +++ b/src/items/item.h @@ -19,8 +19,7 @@ typedef enum { ITEM_UPDATE_ACTOR, ITEM_UPDATE_REMOTE, ITEM_UPDATE_LOADED, - ITEM_UPDATE_BACKEND, - ITEM_UPDATE_INVALID + ITEM_UPDATE_BACKEND } item_update_type_t; class ItemData @@ -68,7 +67,7 @@ public: struct ItemUpdateRequest { - item_update_type_t type = ITEM_UPDATE_INVALID; + item_update_type_t type; ItemData payload; std::vector > newActors; }; diff --git a/src/items/itemstore.cpp b/src/items/itemstore.cpp index 232d319..a14ae6f 100644 --- a/src/items/itemstore.cpp +++ b/src/items/itemstore.cpp @@ -29,7 +29,6 @@ void ItemStore::addItem(const std::shared_ptr& item, item_update_type_t up ItemUpdateRequest request = item->createValueUpdateRequest(item->getValue(), updateType, updateType == ITEM_UPDATE_LOADED); - request.newActors = item->getActors(); updateItem(request); } } @@ -57,7 +56,6 @@ void ItemStore::removeItem(const ItemData& item) void ItemStore::replaceItems(const std::vector>& items) { - qDebug()<<__func__; addItems(items, ITEM_UPDATE_LOADED); std::vector deletedItems; for(std::shared_ptr item : items_) @@ -88,6 +86,7 @@ void ItemStore::updateItem(const ItemUpdateRequest& update) if(items_[i]->operator==(update.payload)) { items_[i]->requestUpdate(update); + qDebug() << "Item" << items_[i]->getName() << "updated"; itemUpdated(update); } } @@ -107,6 +106,7 @@ void ItemStore::store(QJsonObject& json) void ItemStore::itemUpdateSlot(ItemUpdateRequest update) { + qDebug() << "Item" << update.payload.getName() << "updated from update slot"; itemUpdated(update); } diff --git a/src/microcontroller.cpp b/src/microcontroller.cpp index 0bf8690..340bc6e 100644 --- a/src/microcontroller.cpp +++ b/src/microcontroller.cpp @@ -1,5 +1,8 @@ #include "microcontroller.h" +#include +#include + void Microcontroller::relayToggle(int state, int relay) { char buffer[8]; @@ -46,34 +49,22 @@ void Microcontroller::setAuxPwm(int duty) void Microcontroller::write(const QByteArray& buffer) { - writeQue.enqueue(buffer); - if(!writeTimer.isActive()) + if(_port != nullptr) { - writeTimer.setInterval(0); - writeTimer.start(); + _port->write(buffer); + _port->waitForBytesWritten(1000); } + std::this_thread::sleep_for(std::chrono::milliseconds(40)); } void Microcontroller::write(char* buffer, const size_t length) { - write(QByteArray(buffer, length)); -} - -void Microcontroller::onWriteTimerTimeout() -{ - writeTimer.setInterval(50); - if(connected()) + if(_port != nullptr) { - if(!writeQue.empty()) - { - QByteArray data = writeQue.dequeue(); - _port->write(data); - } - else - { - writeTimer.stop(); - } + _port->write(buffer, length); + _port->waitForBytesWritten(1000); } + std::this_thread::sleep_for(std::chrono::milliseconds(40)); } void Microcontroller::setPattern(int pattern) @@ -91,10 +82,8 @@ void Microcontroller::startSunrise() bool Microcontroller::connected() { - if(_port != nullptr) - return _port->isOpen(); - else - return false; + if(_port != nullptr) return _port->isOpen(); + else return false; } void Microcontroller::refresh() @@ -104,17 +93,13 @@ void Microcontroller::refresh() //housekeeping -Microcontroller::Microcontroller(QIODevice* port): Microcontroller() +Microcontroller::Microcontroller(QIODevice* port) { setIODevice(port); } Microcontroller::Microcontroller() { - writeTimer.setInterval(50); - writeTimer.setSingleShot(false); - connect(&writeTimer, &QTimer::timeout, this, &Microcontroller::onWriteTimerTimeout); - qDebug()<<__func__< #include #include +#include #include -#include -#include +#include #include #include #include "items/item.h" @@ -32,12 +32,13 @@ private: bool listMode = false; + //uint8_t _auxState = 0; + QIODevice* _port = nullptr; - QQueue writeQue; - QTimer writeTimer; std::vector< std::shared_ptr > relayList; + QScopedPointer loop; QString _buffer; void processMicroReturn(); @@ -74,7 +75,6 @@ public slots: private slots: void isReadyRead(); - void onWriteTimerTimeout(); signals: void textRecived(const QString string);