12 #ifndef INCLUDE_DISTORTOS_DEVICES_COMMUNICATION_SERIALPORT_HPP_ 13 #define INCLUDE_DISTORTOS_DEVICES_COMMUNICATION_SERIALPORT_HPP_ 60 buffer_{static_cast<uint8_t*>(buffer)},
76 buffer_{static_cast<uint8_t*>(const_cast<void*>(buffer))},
117 if (
isEmpty(readPosition, writePosition) ==
true)
120 if (
isFull(readPosition, writePosition) ==
true)
196 std::pair<uint8_t*, size_t>
getBlock(
const size_t begin,
const size_t end)
const 200 return {
buffer_ + maskedBegin, (maskedEnd > maskedBegin ? maskedEnd :
getCapacity()) - maskedBegin};
216 const auto msb = position &
msbMask_;
218 return maskedPosition + value !=
getCapacity() ? msb | (maskedPosition + value) : msb ^
msbMask_;
232 constexpr
static bool isEmpty(
const size_t readPosition,
const size_t writePosition)
234 return readPosition == writePosition;
248 constexpr
static bool isFull(
const size_t readPosition,
const size_t writePosition)
250 return (readPosition ^ writePosition) ==
msbMask_;
291 void*
const writeBuffer,
const size_t writeBufferSize) :
292 readMutex_{Mutex::Protocol::priorityInheritance},
368 int open(uint32_t baudRate, uint8_t characterLength,
UartParity parity,
bool _2StopBits);
400 std::pair<int, size_t>
read(
void* buffer,
size_t size,
size_t minSize = 1,
425 const size_t minSize = 1)
456 template<
typename Rep,
typename Period>
457 std::pair<int, size_t>
tryReadFor(
const std::chrono::duration<Rep, Period> duration,
void*
const buffer,
458 const size_t size,
const size_t minSize = 1)
460 return tryReadFor(std::chrono::duration_cast<TickClock::duration>(duration), buffer, size, minSize);
485 const size_t minSize = 1)
487 return read(buffer, size, minSize, &timePoint);
515 template<
typename Duration>
516 std::pair<int, size_t>
tryReadUntil(
const std::chrono::time_point<TickClock, Duration> timePoint,
517 void*
const buffer,
const size_t size,
const size_t minSize = 1)
519 return tryReadUntil(std::chrono::time_point_cast<TickClock::duration>(timePoint), buffer, size, minSize);
544 const size_t minSize = SIZE_MAX)
575 template<
typename Rep,
typename Period>
576 std::pair<int, size_t>
tryWriteFor(
const std::chrono::duration<Rep, Period> duration,
const void*
const buffer,
577 const size_t size,
const size_t minSize = SIZE_MAX)
579 return tryWriteFor(std::chrono::duration_cast<TickClock::duration>(duration), buffer, size, minSize);
604 const size_t size,
const size_t minSize = SIZE_MAX)
606 return write(buffer, size, minSize, &timePoint);
632 template<
typename Duration>
633 std::pair<int, size_t>
tryWriteUntil(
const std::chrono::time_point<TickClock, Duration> timePoint,
634 const void*
const buffer,
const size_t size,
const size_t minSize = SIZE_MAX)
636 return tryWriteUntil(std::chrono::time_point_cast<TickClock::duration>(timePoint), buffer, size, minSize);
669 std::pair<int, size_t>
write(
const void* buffer,
size_t size,
size_t minSize = SIZE_MAX,
919 #endif // INCLUDE_DISTORTOS_DEVICES_COMMUNICATION_SERIALPORT_HPP_ bool isReadOnly() const
Definition: SerialPort.hpp:177
std::pair< int, size_t > tryReadUntil(const TickClock::time_point timePoint, void *const buffer, const size_t size, const size_t minSize=1)
Wrapper for read() with absolute timeout.
Definition: SerialPort.hpp:484
uint8_t characterLength_
current character length, bits
Definition: SerialPort.hpp:894
std::pair< int, size_t > write(const void *buffer, size_t size, size_t minSize=SIZE_MAX, const TickClock::time_point *timePoint=nullptr)
Writes data to SerialPort.
Definition: SerialPort.cpp:225
std::pair< int, size_t > tryWriteUntil(const TickClock::time_point timePoint, const void *const buffer, const size_t size, const size_t minSize=SIZE_MAX)
Wrapper for write() with absolute timeout.
Definition: SerialPort.hpp:603
std::pair< const uint8_t *, size_t > getReadBlock() const
Definition: SerialPort.cpp:72
Semaphore is the basic synchronization primitive.
Definition: Semaphore.hpp:30
void increaseReadPosition(const size_t value)
Increases read position by given value.
Definition: SerialPort.hpp:138
Mutex readMutex_
mutex used to serialize access to read(), close() and open()
Definition: SerialPort.hpp:849
static constexpr size_t positionMask_
bitmask used to extract position from readPosition_ or writePosition_
Definition: SerialPort.hpp:254
CircularBuffer *volatile nextWriteBuffer_
pointer to next circular buffer for write operations, used when currentWriteBuffer_ becomes empty
Definition: SerialPort.hpp:870
Mutex writeMutex_
mutex used to serialize access to write(), close() and open()
Definition: SerialPort.hpp:852
int startReadWrapper()
Wrapper for UartLowLevel::startRead()
Definition: SerialPort.cpp:433
static constexpr size_t msbMask_
bitmask used to extract MSB from readPosition_ or writePosition_
Definition: SerialPort.hpp:257
std::pair< uint8_t *, size_t > getWriteBlock() const
Definition: SerialPort.cpp:81
Semaphore *volatile readSemaphore_
pointer to semaphore used for "read complete" event notifications
Definition: SerialPort.hpp:873
uint8_t openCount_
number of times this device was opened but not yet closed
Definition: SerialPort.hpp:903
size_t increasePosition(const size_t position, const size_t value)
Increases given position by given value.
Definition: SerialPort.hpp:213
bool _2StopBits_
current configuration of stop bits: 1 (false) or 2 (true)
Definition: SerialPort.hpp:900
static constexpr bool isEmpty(const size_t readPosition, const size_t writePosition)
Tests for empty circular buffer.
Definition: SerialPort.hpp:232
std::pair< int, size_t > read(void *buffer, size_t size, size_t minSize=1, const TickClock::time_point *timePoint=nullptr)
Reads data from SerialPort.
Definition: SerialPort.cpp:196
volatile bool readInProgress_
"read in progress" flag
Definition: SerialPort.hpp:906
Semaphore *volatile transmitSemaphore_
pointer to semaphore used for "transmit complete" event notifications
Definition: SerialPort.hpp:876
size_t size_
size of buffer_, bytes
Definition: SerialPort.hpp:269
UartLowLevel & uart_
reference to low-level implementation of UartLowLevel interface
Definition: SerialPort.hpp:888
void clear()
Clears circular buffer.
Definition: SerialPort.hpp:88
volatile size_t readLimit_
size limit of read operations, 0 if no limiting is needed, bytes
Definition: SerialPort.hpp:882
int writeImplementation(CircularBuffer &buffer, size_t minSize, const TickClock::time_point *timePoint)
Implementation of basic write() functionality.
Definition: SerialPort.cpp:491
static constexpr size_t readOnlyMask_
bitmask used to extract "read-only" flag from size_
Definition: SerialPort.hpp:263
std::chrono::time_point< TickClock > time_point
basic time_point type of clock
Definition: TickClock.hpp:42
int close()
Closes SerialPort.
Definition: SerialPort.cpp:112
int readFromCircularBufferAndStartRead(CircularBuffer &buffer)
Reads data from circular buffer and calls startReadWrapper().
Definition: SerialPort.cpp:345
Semaphore *volatile writeSemaphore_
pointer to semaphore used for "write complete" event notifications
Definition: SerialPort.hpp:879
std::pair< int, size_t > tryReadFor(const TickClock::duration duration, void *const buffer, const size_t size, const size_t minSize=1)
Wrapper for read() with relative timeout.
Definition: SerialPort.hpp:424
CircularBuffer *volatile currentReadBuffer_
pointer to current circular buffer for read operations, always valid
Definition: SerialPort.hpp:861
size_t getSize() const
Definition: SerialPort.hpp:113
volatile size_t writeLimit_
size limit of write operations, 0 if no limiting is needed, bytes
Definition: SerialPort.hpp:885
void increaseWritePosition(const size_t value)
Increases write position by given value.
Definition: SerialPort.hpp:150
static time_point now()
Definition: TickClock.cpp:20
constexpr SerialPort(UartLowLevel &uart, void *const readBuffer, const size_t readBufferSize, void *const writeBuffer, const size_t writeBufferSize)
SerialPort's constructor.
Definition: SerialPort.hpp:290
static constexpr size_t sizeMask_
bitmask used to extract size from size_
Definition: SerialPort.hpp:260
int open(uint32_t baudRate, uint8_t characterLength, UartParity parity, bool _2StopBits)
Opens SerialPort.
Definition: SerialPort.cpp:154
int readImplementation(CircularBuffer &buffer, size_t minSize, const TickClock::time_point *timePoint)
Implementation of basic read() functionality.
Definition: SerialPort.cpp:357
Definition: UartBase.hpp:30
size_t stopReadWrapper()
Wrapper for UartLowLevel::stopRead()
Definition: SerialPort.cpp:471
void readCompleteEvent(size_t bytesRead) override
"Read complete" event
Definition: SerialPort.cpp:259
Top-level namespace of distortos project.
Definition: buttons.hpp:33
std::pair< int, size_t > tryReadUntil(const std::chrono::time_point< TickClock, Duration > timePoint, void *const buffer, const size_t size, const size_t minSize=1)
Wrapper for read() with absolute timeout.
Definition: SerialPort.hpp:516
Mutex is the basic synchronization primitive.
Definition: Mutex.hpp:30
UartParity
Definition: UartParity.hpp:29
std::pair< int, size_t > tryWriteFor(const std::chrono::duration< Rep, Period > duration, const void *const buffer, const size_t size, const size_t minSize=SIZE_MAX)
Wrapper for write() with relative timeout.
Definition: SerialPort.hpp:576
std::pair< uint8_t *, size_t > getBlock(const size_t begin, const size_t end) const
Gets first contiguous block between position1 and position2.
Definition: SerialPort.hpp:196
constexpr CircularBuffer(void *const buffer, const size_t size)
CircularBuffer's constructor.
Definition: SerialPort.hpp:59
UartParity parity_
current parity
Definition: SerialPort.hpp:897
Definition: SerialPort.hpp:36
Definition: UartLowLevel.hpp:35
~SerialPort() override
SerialPort's destructor.
Definition: SerialPort.cpp:97
UartParity enum class header.
bool isEmpty() const
Definition: SerialPort.hpp:159
bool isFull() const
Definition: SerialPort.hpp:168
volatile bool transmitInProgress_
"transmit in progress" flag
Definition: SerialPort.hpp:909
CircularBuffer writeBuffer_
internal instance of circular buffer for write operations
Definition: SerialPort.hpp:858
CircularBuffer *volatile currentWriteBuffer_
pointer to current circular buffer for write operations, always valid
Definition: SerialPort.hpp:864
int startWriteWrapper()
Wrapper for UartLowLevel::startWrite()
Definition: SerialPort.cpp:452
volatile bool writeInProgress_
"write in progress" flag
Definition: SerialPort.hpp:912
volatile size_t readPosition_
current read position
Definition: SerialPort.hpp:272
std::chrono::duration< rep, period > duration
basic duration type of clock
Definition: TickClock.hpp:39
volatile size_t writePosition_
current write position
Definition: SerialPort.hpp:275
size_t getCapacity() const
Definition: SerialPort.hpp:98
void transmitCompleteEvent() override
"Transmit complete" event
Definition: SerialPort.cpp:294
CircularBuffer readBuffer_
internal instance of circular buffer for read operations
Definition: SerialPort.hpp:855
Thread-safe, lock-free circular buffer for one-producer and one-consumer.
Definition: SerialPort.hpp:48
CircularBuffer *volatile nextReadBuffer_
pointer to next circular buffer for read operations, used when currentReadBuffer_ becomes full
Definition: SerialPort.hpp:867
std::pair< int, size_t > tryWriteUntil(const std::chrono::time_point< TickClock, Duration > timePoint, const void *const buffer, const size_t size, const size_t minSize=SIZE_MAX)
Wrapper for write() with absolute timeout.
Definition: SerialPort.hpp:633
std::pair< int, size_t > tryReadFor(const std::chrono::duration< Rep, Period > duration, void *const buffer, const size_t size, const size_t minSize=1)
Wrapper for read() with relative timeout.
Definition: SerialPort.hpp:457
int writeToCircularBufferAndStartWrite(CircularBuffer &buffer)
Writes data to circular buffer and calls startWriteWrapper().
Definition: SerialPort.cpp:551
constexpr CircularBuffer(const void *const buffer, const size_t size)
CircularBuffer's constructor, read-only variant.
Definition: SerialPort.hpp:75
std::pair< int, size_t > tryWriteFor(const TickClock::duration duration, const void *const buffer, const size_t size, const size_t minSize=SIZE_MAX)
Wrapper for write() with relative timeout.
Definition: SerialPort.hpp:543
uint8_t * buffer_
pointer to beginning of buffer
Definition: SerialPort.hpp:266
void writeCompleteEvent(size_t bytesWritten) override
"Write complete" event
Definition: SerialPort.cpp:311
size_t stopWriteWrapper()
Wrapper for UartLowLevel::stopWrite()
Definition: SerialPort.cpp:481
static constexpr bool isFull(const size_t readPosition, const size_t writePosition)
Tests for full circular buffer.
Definition: SerialPort.hpp:248
uint32_t baudRate_
current baud rate, bps
Definition: SerialPort.hpp:891
void receiveErrorEvent(ErrorSet errorSet) override
"Receive error" event
Definition: SerialPort.cpp:289
std::bitset< errorBitsMax > ErrorSet
set of error bits
Definition: UartBase.hpp:51
void transmitStartEvent() override
"Transmit start" event
Definition: SerialPort.cpp:306