Communication: Add pause feature

Removed redirect read
This commit is contained in:
Yasser Yassine
2024-05-23 21:23:45 +00:00
parent 9a1cd1124d
commit 659fcf633c
13 changed files with 99 additions and 70 deletions
+10 -6
View File
@@ -48,8 +48,10 @@ public:
void awaitModeChangeComplete() { driver->awaitModeChangeComplete(); }
bool rawWrite(const std::vector<uint8_t>& bytes) { return driver->write(bytes); }
virtual bool sendPacket(std::vector<uint8_t>& bytes);
bool redirectRead(std::function<void(std::vector<uint8_t>&&)> redirectTo);
void clearRedirectRead();
void pauseReads();
void resumeReads();
bool readsArePaused();
void setWriteBlocks(bool blocks) { driver->writeBlocks = blocks; }
@@ -90,12 +92,14 @@ protected:
std::mutex messageCallbacksLock;
std::map<int, std::shared_ptr<MessageCallback>> messageCallbacks;
std::atomic<bool> closing{false};
std::atomic<bool> redirectingRead{false};
std::function<void(std::vector<uint8_t>&&)> redirectionFn;
std::mutex redirectingReadMutex; // Don't allow read to be disabled while in the redirectionFn
std::condition_variable pauseReadTaskCv;
std::mutex pauseReadTaskMutex;
std::atomic<bool> pauseReadTask = false;
std::mutex syncMessageMutex;
void handleInput(Packetizer& p, std::vector<uint8_t>& readBytes);
void handleInput(Packetizer& p);
private:
std::thread readTaskThread;
+7 -1
View File
@@ -26,6 +26,8 @@ public:
virtual void awaitModeChangeComplete() {}
virtual bool isDisconnected() { return disconnected; };
virtual bool close() = 0;
bool waitForRx(size_t minBytes, std::chrono::milliseconds timeout);
bool readWait(std::vector<uint8_t>& bytes, std::chrono::milliseconds timeout = std::chrono::milliseconds(100), size_t limit = 0);
bool write(const std::vector<uint8_t>& bytes);
virtual bool isEthernet() const { return false; }
@@ -57,8 +59,12 @@ protected:
virtual bool writeQueueAlmostFull() { return writeQueue.size_approx() > (writeQueueSize * 3 / 4); }
virtual bool writeInternal(const std::vector<uint8_t>& b) { return writeQueue.enqueue(WriteOperation(b)); }
bool writeToReadBuffer(const uint8_t* buf, size_t numReceived);
RingBuffer readBuffer = RingBuffer(ICSNEO_DRIVER_RINGBUFFER_SIZE);
std::atomic<bool> hasRxWaitRequest = false;
std::condition_variable rxWaitRequestCv;
std::mutex rxWaitMutex;
moodycamel::BlockingConcurrentQueue<WriteOperation> writeQueue;
std::thread readThread, writeThread;
std::atomic<bool> closing{false};