summaryrefslogtreecommitdiff
path: root/src/voltronic/device.h
diff options
context:
space:
mode:
authorEvgeny Zinoviev <me@ch1p.io>2021-05-23 02:56:37 +0300
committerEvgeny Zinoviev <me@ch1p.io>2021-05-23 22:59:46 +0300
commit5758e0315f9d27007575293760db6d389c2f4162 (patch)
tree3594078e4694e12c02f56f927be0d674159112bb /src/voltronic/device.h
parentf0ba39a28bb7a42b0dd9755a6d759702a7e39258 (diff)
device: separate high-priority thread for interacting with hwsched
Diffstat (limited to 'src/voltronic/device.h')
-rw-r--r--src/voltronic/device.h95
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: