#ifndef __DRIVER_H_ #define __DRIVER_H_ #ifdef __cplusplus #include #include #include #include #include #include #include "icsneo/api/eventmanager.h" #include "icsneo/third-party/concurrentqueue/blockingconcurrentqueue.h" namespace icsneo { class Driver { public: Driver(const device_eventhandler_t& handler) : report(handler) {} virtual ~Driver() {} 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); device_eventhandler_t report; 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::thread readThread, writeThread; std::atomic closing{false}; }; } #endif // __cplusplus #endif