#ifndef __ICOMMUNICATION_H_ #define __ICOMMUNICATION_H_ #include #include #include #include #include #include #include "icsneo/api/errormanager.h" #include "icsneo/third-party/concurrentqueue/blockingconcurrentqueue.h" namespace icsneo { class ICommunication { public: ICommunication(const device_errorhandler_t& handler) : err(handler) {} virtual ~ICommunication() {} virtual bool open() = 0; virtual bool isOpen() = 0; virtual bool close() = 0; virtual bool read(std::vector& bytes, size_t limit = 0); virtual bool readWait(std::vector& bytes, std::chrono::milliseconds timeout = std::chrono::milliseconds(100), size_t limit = 0); virtual bool write(const std::vector& bytes); inline void onWrite() { if(writeQueue.size_approx() < (writeQueueSize * 3/4)) writeCV.notify_one(); } device_errorhandler_t err; size_t writeQueueSize = 50; bool writeBlocks = true; // Otherwise it just fails when the queue is full protected: class WriteOperation { public: WriteOperation() {} WriteOperation(const std::vector& b) : bytes(b) {} std::vector bytes; }; enum IOTaskState { LAUNCH, WAIT }; virtual void readTask() = 0; virtual void writeTask() = 0; moodycamel::BlockingConcurrentQueue readQueue; moodycamel::BlockingConcurrentQueue writeQueue; std::mutex writeMutex; std::condition_variable writeCV; std::thread readThread, writeThread; std::atomic closing{false}; }; } #endif