diff --git a/communication/communication.cpp b/communication/communication.cpp index 62d3fff..da98a00 100644 --- a/communication/communication.cpp +++ b/communication/communication.cpp @@ -72,6 +72,14 @@ bool Communication::sendCommand(Command cmd, std::vector arguments) { return sendPacket(packet); } +bool Communication::redirectRead(std::function&&)> redirectTo) { + if(redirectingRead) + return false; + redirectionFn = redirectTo; + redirectingRead = true; + return true; +} + bool Communication::getSettingsSync(std::vector& data, std::chrono::milliseconds timeout) { std::shared_ptr msg = waitForMessageSync([this]() { return sendCommand(Command::ReadSettings, { 0, 0, 0, 1 /* Get Global Settings */, 0, 1 /* Subversion 1 */ }); @@ -181,13 +189,17 @@ void Communication::readTask() { while(!closing) { readBytes.clear(); if(driver->readWait(readBytes)) { - if(packetizer->input(readBytes)) { - for(const auto& packet : packetizer->output()) { - std::shared_ptr msg; - if(!decoder->decode(msg, packet)) - continue; + if(redirectingRead) { + redirectionFn(std::move(readBytes)); + } else { + if(packetizer->input(readBytes)) { + for(const auto& packet : packetizer->output()) { + std::shared_ptr msg; + if(!decoder->decode(msg, packet)) + continue; - dispatchMessage(msg); + dispatchMessage(msg); + } } } } diff --git a/include/icsneo/communication/communication.h b/include/icsneo/communication/communication.h index e4cb952..8c4c59a 100644 --- a/include/icsneo/communication/communication.h +++ b/include/icsneo/communication/communication.h @@ -42,6 +42,8 @@ public: virtual void joinThreads(); bool rawWrite(const std::vector& bytes) { return driver->write(bytes); } virtual bool sendPacket(std::vector& bytes); + bool redirectRead(std::function&&)> redirectTo); + void clearRedirectRead() { redirectingRead = false; } void setWriteBlocks(bool blocks) { driver->writeBlocks = blocks; } @@ -76,6 +78,8 @@ protected: std::mutex messageCallbacksLock; std::map messageCallbacks; std::atomic closing{false}; + std::atomic redirectingRead{false}; + std::function&&)> redirectionFn; void dispatchMessage(const std::shared_ptr& msg);