libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
libxr_rw.hpp
1#pragma once
2
3#include <atomic>
4#include <cstdarg>
5#include <cstddef>
6#include <cstdint>
7#include <cstdio>
8#include <utility>
9
10#include "libxr_cb.hpp"
11#include "libxr_def.hpp"
12#include "libxr_type.hpp"
13#include "lockfree_queue.hpp"
14#include "mutex.hpp"
15#include "semaphore.hpp"
16
17namespace LibXR
18{
19
27template <typename... Args>
29{
30 public:
31 using Callback = LibXR::Callback<Args...>;
32
35 enum class OperationType : uint8_t
36 {
37 CALLBACK,
38 BLOCK,
39 POLLING,
40 NONE
41 };
42
45 enum class OperationPollingStatus : uint8_t
46 {
47 READY,
48 RUNNING,
49 DONE
50 };
51
54 Operation() : type(OperationType::NONE) { memset(&data, 0, sizeof(data)); }
55
62 Operation(Semaphore &sem, uint32_t timeout = UINT32_MAX) : type(OperationType::BLOCK)
63 {
64 data.sem_info.sem = &sem;
65 data.sem_info.timeout = timeout;
66 }
67
73 Operation(Callback &callback) : type(OperationType::CALLBACK)
74 {
75 data.callback = &callback;
76 }
77
84 {
85 data.status = &status;
86 }
87
95 {
96 if (this != &op)
97 {
98 type = op.type;
99 switch (type)
100 {
101 case OperationType::CALLBACK:
102 data.callback = op.data.callback;
103 break;
104 case OperationType::BLOCK:
105 data.sem_info.sem = op.data.sem_info.sem;
106 data.sem_info.timeout = op.data.sem_info.timeout;
107 break;
108 case OperationType::POLLING:
109 data.status = op.data.status;
110 break;
111 case OperationType::NONE:
112 break;
113 }
114 }
115 return *this;
116 }
117
125 {
126 if (this != &op)
127 {
128 type = op.type;
129 switch (type)
130 {
131 case OperationType::CALLBACK:
132 data.callback = op.data.callback;
133 break;
134 case OperationType::BLOCK:
135 data.sem_info.sem = op.data.sem_info.sem;
136 data.sem_info.timeout = op.data.sem_info.timeout;
137 break;
138 case OperationType::POLLING:
139 data.status = op.data.status;
140 break;
141 case OperationType::NONE:
142 break;
143 }
144 }
145 return *this;
146 }
147
156 template <
157 typename InitOperation,
158 typename = std::enable_if_t<std::is_same_v<std::decay_t<InitOperation>, Operation>>>
159 Operation(InitOperation &&op)
160 {
161 *this = std::forward<InitOperation>(op);
162 }
163
170 template <typename... Status>
171 void UpdateStatus(bool in_isr, Status &&...status)
172 {
173 switch (type)
174 {
175 case OperationType::CALLBACK:
176 data.callback->Run(in_isr, std::forward<Args>(status)...);
177 break;
178 case OperationType::BLOCK:
179 data.sem_info.sem->PostFromCallback(in_isr);
180 break;
181 case OperationType::POLLING:
182 *data.status = OperationPollingStatus::DONE;
183 break;
184 case OperationType::NONE:
185 break;
186 }
187 }
188
203 {
204 if (type == OperationType::POLLING)
205 {
206 *data.status = OperationPollingStatus::RUNNING;
207 }
208 }
209
212 union
213 {
214 Callback *callback;
215 struct
216 {
217 Semaphore *sem;
218 uint32_t timeout;
219 } sem_info;
221 // TODO: state
223
227};
228
229class ReadPort;
230class WritePort;
231
235
239
242typedef ErrorCode (*WriteFun)(WritePort &port);
243
246typedef ErrorCode (*ReadFun)(ReadPort &port);
247
257
263
269{
270 public:
271 enum class BusyState : uint32_t
272 {
273 IDLE = 0,
274 PENDING = 1,
275 EVENT = UINT32_MAX
276 };
277
278 ReadFun read_fun_ = nullptr;
279 LockFreeQueue<uint8_t> *queue_data_ = nullptr;
280 size_t read_size_ = 0;
281 ReadInfoBlock info_;
282 std::atomic<BusyState> busy_{BusyState::IDLE};
283
290 ReadPort(size_t buffer_size = 128);
291
302 virtual size_t EmptySize();
303
314 virtual size_t Size();
315
318 bool Readable();
319
334
352 void Finish(bool in_isr, ErrorCode ans, ReadInfoBlock &info, uint32_t size);
353
364 void MarkAsRunning(ReadInfoBlock &info);
365
382 ErrorCode operator()(RawData data, ReadOperation &op);
383
391 virtual void ProcessPendingReads(bool in_isr);
392
395 virtual void Reset();
396};
397
403{
404 public:
405 enum class LockState : uint32_t
406 {
407 LOCKED = 0,
408 UNLOCKED = UINT32_MAX
409 };
410
411 WriteFun write_fun_ = nullptr;
413 LockFreeQueue<uint8_t> *queue_data_;
414 std::atomic<LockState> lock_{LockState::UNLOCKED};
415 size_t write_size_ = 0;
416
428 class Stream
429 {
430 public:
438
444 ~Stream();
445
452 Stream &operator<<(const ConstRawData &data);
453
465 ErrorCode Commit();
466
467 private:
470 size_t cap_;
471 size_t size_ = 0;
472 bool locked_ = false;
475 };
476
490 WritePort(size_t queue_size = 3, size_t buffer_size = 128);
491
499 virtual size_t EmptySize();
500
508 virtual size_t Size();
509
517 bool Writable();
518
533
551 void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info, uint32_t size);
552
564
581 ErrorCode operator()(ConstRawData data, WriteOperation &op);
582
585 virtual void Reset();
586
587 private:
588 ErrorCode CommitWrite(ConstRawData data, WriteOperation &op, bool pushed = false);
589};
590
595class STDIO
596{
597 public:
598 // NOLINTBEGIN
599 static inline ReadPort *read_ = nullptr;
600 static inline WritePort *write_ = nullptr;
601 static inline LibXR::Mutex *write_mutex_ =
602 nullptr;
603 static inline LibXR::WritePort::Stream *write_stream_ = nullptr;
604#if LIBXR_PRINTF_BUFFER_SIZE > 0
605 static inline char
606 printf_buff_[LIBXR_PRINTF_BUFFER_SIZE];
607#endif
608 // NOLINTEND
609
619 static int Printf(const char *fmt, ...); // NOLINT
620};
621} // namespace LibXR
提供一个通用的回调包装,支持动态参数传递。 Provides a generic callback wrapper, supporting dynamic argument passing.
Definition libxr_cb.hpp:124
常量原始数据封装类。 A class for encapsulating constant raw data.
无锁队列实现 / Lock-free queue implementation
互斥锁类,提供线程同步机制 (Mutex class providing thread synchronization mechanisms).
Definition mutex.hpp:18
Defines an operation with different execution modes.
Definition libxr_rw.hpp:29
Operation & operator=(const Operation &op)
Copy assignment operator.
Definition libxr_rw.hpp:94
Operation(Semaphore &sem, uint32_t timeout=UINT32_MAX)
Constructs a blocking operation with a semaphore and timeout.
Definition libxr_rw.hpp:62
Operation & operator=(Operation &&op) noexcept
Move assignment operator.
Definition libxr_rw.hpp:124
Operation(Callback &callback)
Constructs a callback-based operation.
Definition libxr_rw.hpp:73
Operation()
Default constructor, initializes with NONE type.
Definition libxr_rw.hpp:54
void MarkAsRunning()
标记操作为运行状态。 Marks the operation as running.
Definition libxr_rw.hpp:202
void UpdateStatus(bool in_isr, Status &&...status)
Updates operation status based on type.
Definition libxr_rw.hpp:171
union LibXR::Operation::@4 data
OperationType type
Definition libxr_rw.hpp:226
Operation(OperationPollingStatus &status)
Constructs a polling operation.
Definition libxr_rw.hpp:83
Operation(InitOperation &&op)
构造一个新的 Operation 对象(初始化操作)。 Constructs a new Operation object (initialization operation).
Definition libxr_rw.hpp:159
原始数据封装类。 A class for encapsulating raw data.
ReadPort class for handling read operations.
Definition libxr_rw.hpp:269
bool Readable()
Checks if read operations are supported.
Definition libxr_rw.cpp:29
ReadPort(size_t buffer_size=128)
Constructs a ReadPort with queue sizes.
Definition libxr_rw.cpp:10
void Finish(bool in_isr, ErrorCode ans, ReadInfoBlock &info, uint32_t size)
更新读取操作的状态。 Updates the status of the read operation.
Definition libxr_rw.cpp:37
virtual void Reset()
Resets the ReadPort.
Definition libxr_rw.cpp:172
virtual size_t EmptySize()
获取队列的剩余可用空间。 Gets the remaining available space in the queue.
Definition libxr_rw.cpp:17
ErrorCode operator()(RawData data, ReadOperation &op)
读取操作符重载,用于执行读取操作。 Overloaded function call operator to perform a read operation.
Definition libxr_rw.cpp:46
virtual void ProcessPendingReads(bool in_isr)
Processes pending reads.
Definition libxr_rw.cpp:126
ReadPort & operator=(ReadFun fun)
赋值运算符重载,用于设置读取函数。 Overloaded assignment operator to set the read function.
Definition libxr_rw.cpp:31
virtual size_t Size()
获取当前队列的已使用大小。 Gets the currently used size of the queue.
Definition libxr_rw.cpp:23
void MarkAsRunning(ReadInfoBlock &info)
标记读取操作为运行中。 Marks the read operation as running.
Definition libxr_rw.cpp:44
STDIO interface for read/write ports.
Definition libxr_rw.hpp:596
static int Printf(const char *fmt,...)
Prints a formatted string to the write port (like printf).
Definition libxr_rw.cpp:446
static LibXR::Mutex * write_mutex_
Write port mutex. 写入端口互斥锁。
Definition libxr_rw.hpp:601
static ReadPort * read_
Read port instance. 读取端口。
Definition libxr_rw.hpp:599
static WritePort * write_
Write port instance. 写入端口。
Definition libxr_rw.hpp:600
信号量类,实现线程同步机制 Semaphore class implementing thread synchronization
Definition semaphore.hpp:23
WritePort 的流式写入操作器,支持链式 << 操作和批量提交。
Definition libxr_rw.hpp:429
bool locked_
是否持有写锁 Whether write lock is held
Definition libxr_rw.hpp:472
size_t size_
当前已写入但未提交的字节数 Bytes written but not yet committed
Definition libxr_rw.hpp:471
ErrorCode Commit()
手动提交已写入的数据到队列,并尝试续锁。
Definition libxr_rw.cpp:417
size_t cap_
当前队列容量 Current queue capacity
Definition libxr_rw.hpp:470
LibXR::WritePort * port_
写端口指针 Pointer to the WritePort
Definition libxr_rw.hpp:468
LibXR::WriteOperation op_
写操作对象 Write operation object
Definition libxr_rw.hpp:469
~Stream()
析构时自动提交已累积的数据并释放锁。
Definition libxr_rw.cpp:362
Stream(LibXR::WritePort *port, LibXR::WriteOperation op)
构造流写入对象,并尝试锁定端口。
Definition libxr_rw.cpp:340
Stream & operator<<(const ConstRawData &data)
追加写入数据,支持链式调用。
Definition libxr_rw.cpp:376
WritePort class for handling write operations.
Definition libxr_rw.hpp:403
virtual size_t EmptySize()
获取数据队列的剩余可用空间。 Gets the remaining available space in the data queue.
Definition libxr_rw.cpp:187
virtual size_t Size()
获取当前数据队列的已使用大小。 Gets the used size of the current data queue.
Definition libxr_rw.cpp:193
ErrorCode operator()(ConstRawData data, WriteOperation &op)
执行写入操作。 Performs a write operation.
Definition libxr_rw.cpp:215
WritePort(size_t queue_size=3, size_t buffer_size=128)
构造一个新的 WritePort 对象。 Constructs a new WritePort object.
Definition libxr_rw.cpp:178
WritePort & operator=(WriteFun fun)
赋值运算符重载,用于设置写入函数。 Overloaded assignment operator to set the write function.
Definition libxr_rw.cpp:201
bool Writable()
判断端口是否可写。 Checks whether the port is writable.
Definition libxr_rw.cpp:199
void MarkAsRunning(WriteOperation &op)
标记写入操作为运行中。 Marks the write operation as running.
Definition libxr_rw.cpp:213
virtual void Reset()
Resets the WritePort.
Definition libxr_rw.cpp:333
void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info, uint32_t size)
更新写入操作的状态。 Updates the status of the write operation.
Definition libxr_rw.cpp:207
LibXR 命名空间
Definition ch32_gpio.hpp:9
ErrorCode(* ReadFun)(ReadPort &port)
Function pointer type for read operations.
Definition libxr_rw.hpp:246
Operation< ErrorCode > ReadOperation
Read operation type.
Definition libxr_rw.hpp:234
ErrorCode(* WriteFun)(WritePort &port)
Function pointer type for write operations.
Definition libxr_rw.hpp:242
Operation< ErrorCode > WriteOperation
Write operation type.
Definition libxr_rw.hpp:238
Read information block structure.
Definition libxr_rw.hpp:253
RawData data
Data buffer. 数据缓冲区。
Definition libxr_rw.hpp:254
ReadOperation op
Read operation instance. 读取操作实例。
Definition libxr_rw.hpp:255
ConstRawData data
Data buffer. 数据缓冲区。
Definition libxr_rw.hpp:260
WriteOperation op
Write operation instance. 写入操作实例。
Definition libxr_rw.hpp:261