diff options
author | Evgeny Zinoviev <me@ch1p.io> | 2021-05-23 02:56:37 +0300 |
---|---|---|
committer | Evgeny Zinoviev <me@ch1p.io> | 2021-05-23 22:59:46 +0300 |
commit | 5758e0315f9d27007575293760db6d389c2f4162 (patch) | |
tree | 3594078e4694e12c02f56f927be0d674159112bb /src/voltronic/device.h | |
parent | f0ba39a28bb7a42b0dd9755a6d759702a7e39258 (diff) |
device: separate high-priority thread for interacting with hwsched
Diffstat (limited to 'src/voltronic/device.h')
-rw-r--r-- | src/voltronic/device.h | 95 |
1 files changed, 70 insertions, 25 deletions
diff --git a/src/voltronic/device.h b/src/voltronic/device.h index 6584585..23be22e 100644 --- a/src/voltronic/device.h +++ b/src/voltronic/device.h @@ -5,10 +5,15 @@ #include <string> #include <memory> +#include <atomic> +#include <thread> +#include <mutex> +#include <condition_variable> #include <hidapi/hidapi.h> #include <libserialport.h> -#include "../numeric_types.h" +#include "exceptions.h" +#include "../types.h" namespace voltronic { @@ -18,10 +23,40 @@ enum { FLAG_VERIFY_CRC = 4, }; +enum class SharedIOBufferState { + Ready, + InProgress, + Done, +}; + +struct SharedIOBuffer { + // helper methods + void resetWith(const u8* inbuf, size_t inbufSize, u8* outbuf, size_t outbufSize); + void setResult(size_t dataSize); + void setResult(ErrorType type, std::string message); + + // input + const u8* inputBuffer; + u8* outputBuffer; + size_t inputBufferSize; + size_t outputBufferSize; + + // output + SharedIOBufferState state = SharedIOBufferState::Done; + size_t dataSize; + ErrorType errorType = ErrorType::None; + std::string errorMessage; +}; + +enum WorkerType { + OneShot, + Normal, + Dead, +}; -/** - * Common device - */ +// ------------- +// Common device +// ------------- class Device { protected: @@ -30,11 +65,15 @@ protected: u64 timeStarted_; bool verbose_; - void send(const u8* buf, size_t bufSize); - size_t recv(u8* buf, size_t bufSize); + SharedIOBuffer shio_; + std::thread thread_; + // std::mutex enqueueMutex_; + std::mutex mutex_; + std::condition_variable cv_; + WorkerType workerType_; - void writeLoop(const u8* data, size_t dataSize); - size_t readLoop(u8* buf, size_t bufSize); + void writeAll(const u8* data, size_t dataSize); + size_t readAll(u8* buf, size_t bufSize); u64 getElapsedTime() const; u64 getTimeLeft() const; @@ -43,23 +82,26 @@ public: static const u64 TIMEOUT = 1000; Device(); - - virtual size_t read(u8* buf, size_t bufSize) = 0; - virtual size_t write(const u8* data, size_t dataSize) = 0; - - void setTimeout(u64 timeout); - size_t run(const u8* inbuf, size_t inbufSize, u8* outbuf, size_t outbufSize); + ~Device(); void setFlags(int flags); int getFlags() const; - + void setWorkerType(WorkerType wt); void setVerbose(bool verbose); + void setTimeout(u64 timeout); + + size_t enqueue(const u8* inbuf, size_t inbufSize, u8* outbuf, size_t outbufSize); + size_t run(const u8* inbuf, size_t inbufSize, u8* outbuf, size_t outbufSize); + void threadLoop(); + + virtual size_t read(u8* buf, size_t bufSize) = 0; + virtual size_t write(const u8* data, size_t dataSize) = 0; }; -/** - * USB device - */ +// ---------- +// USB device +// ---------- class USBDevice : public Device { private: @@ -79,9 +121,9 @@ public: }; -/** - * Serial device - */ +// ------------- +// Serial device +// ------------- typedef unsigned SerialBaudRate; @@ -149,7 +191,10 @@ public: explicit SerialPortConfiguration(SerialDevice& device); ~SerialPortConfiguration(); - void setConfiguration(SerialBaudRate baudRate, SerialDataBits dataBits, SerialStopBits stopBits, SerialParity parity); + void setConfiguration(SerialBaudRate baudRate, + SerialDataBits dataBits, + SerialStopBits stopBits, + SerialParity parity); }; bool is_serial_baud_rate_valid(SerialBaudRate baudRate); @@ -158,9 +203,9 @@ bool is_serial_stop_bits_valid(SerialStopBits stopBits); bool is_serial_parity_valid(SerialParity parity); -/** - * Pseudo device - */ +// ------------- +// Pseudo device +// ------------- class PseudoDevice : public Device { public: |