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;
222
226};
227
228class ReadPort;
229class WritePort;
230
234
238
241typedef ErrorCode (*WriteFun)(WritePort &port);
242
245typedef ErrorCode (*ReadFun)(ReadPort &port);
246
256
257typedef struct
258{
259 ConstRawData data;
262
268{
269 public:
270 enum class BusyState : uint32_t
271 {
272 IDLE = 0,
273 PENDING = 1,
274 EVENT = UINT32_MAX
275 };
276
277 ReadFun read_fun_ = nullptr;
278 LockFreeQueue<uint8_t> *queue_data_ = nullptr;
279 size_t read_size_ = 0;
280 ReadInfoBlock info_;
281 std::atomic<BusyState> busy_{BusyState::IDLE};
282
289 ReadPort(size_t buffer_size = 128);
290
301 virtual size_t EmptySize();
302
313 virtual size_t Size();
314
317 bool Readable();
318
333
351 void Finish(bool in_isr, ErrorCode ans, ReadInfoBlock &info, uint32_t size);
352
363 void MarkAsRunning(ReadInfoBlock &info);
364
381 ErrorCode operator()(RawData data, ReadOperation &op);
382
390 virtual void ProcessPendingReads(bool in_isr);
391
394 virtual void Reset();
395};
396
402{
403 public:
404 enum class LockState : uint32_t
405 {
406 LOCKED = 0,
407 UNLOCKED = UINT32_MAX
408 };
409
410 WriteFun write_fun_ = nullptr;
412 LockFreeQueue<uint8_t> *queue_data_;
413 std::atomic<LockState> lock_{LockState::UNLOCKED};
414 size_t write_size_ = 0;
415
427 class Stream
428 {
429 public:
437
443 ~Stream();
444
451 Stream &operator<<(const ConstRawData &data);
452
464 ErrorCode Commit();
465
466 private:
469 size_t cap_;
470 size_t size_ = 0;
471 bool locked_ = false;
474 };
475
489 WritePort(size_t queue_size = 3, size_t buffer_size = 128);
490
498 virtual size_t EmptySize();
499
507 virtual size_t Size();
508
516 bool Writable();
517
532
550 void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info, uint32_t size);
551
563
580 ErrorCode operator()(ConstRawData data, WriteOperation &op);
581
584 virtual void Reset();
585
586 private:
587 ErrorCode CommitWrite(ConstRawData data, WriteOperation &op, bool pushed = false);
588};
589
594class STDIO
595{
596 public:
597 // NOLINTBEGIN
598 static inline ReadPort *read_ = nullptr;
599 static inline WritePort *write_ = nullptr;
600 static inline LibXR::Mutex *write_mutex_ =
601 nullptr;
602 static inline LibXR::WritePort::Stream *write_stream_ = nullptr;
603#if LIBXR_PRINTF_BUFFER_SIZE > 0
604 static inline char
605 printf_buff_[LIBXR_PRINTF_BUFFER_SIZE];
606#endif
607 // NOLINTEND
608
618 static int Printf(const char *fmt, ...); // NOLINT
619};
620} // 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:225
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:268
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:173
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:127
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:595
static int Printf(const char *fmt,...)
Prints a formatted string to the write port (like printf).
Definition libxr_rw.cpp:429
static LibXR::Mutex * write_mutex_
Write port mutex. 写入端口互斥锁。
Definition libxr_rw.hpp:600
static ReadPort * read_
Read port instance. 读取端口。
Definition libxr_rw.hpp:598
static WritePort * write_
Write port instance. 写入端口。
Definition libxr_rw.hpp:599
信号量类,实现线程同步机制 Semaphore class implementing thread synchronization
Definition semaphore.hpp:23
WritePort 的流式写入操作器,支持链式 << 操作和批量提交。
Definition libxr_rw.hpp:428
bool locked_
是否持有写锁 Whether write lock is held
Definition libxr_rw.hpp:471
size_t size_
当前已写入但未提交的字节数 Bytes written but not yet committed
Definition libxr_rw.hpp:470
ErrorCode Commit()
手动提交已写入的数据到队列,并尝试续锁。
Definition libxr_rw.cpp:402
size_t cap_
当前队列容量 Current queue capacity
Definition libxr_rw.hpp:469
LibXR::WritePort * port_
写端口指针 Pointer to the WritePort
Definition libxr_rw.hpp:467
LibXR::WriteOperation op_
写操作对象 Write operation object
Definition libxr_rw.hpp:468
~Stream()
析构时自动提交已累积的数据并释放锁。
Definition libxr_rw.cpp:360
Stream(LibXR::WritePort *port, LibXR::WriteOperation op)
构造流写入对象,并尝试锁定端口。
Definition libxr_rw.cpp:338
Stream & operator<<(const ConstRawData &data)
追加写入数据,支持链式调用。
Definition libxr_rw.cpp:370
WritePort class for handling write operations.
Definition libxr_rw.hpp:402
virtual size_t EmptySize()
获取数据队列的剩余可用空间。 Gets the remaining available space in the data queue.
Definition libxr_rw.cpp:188
virtual size_t Size()
获取当前数据队列的已使用大小。 Gets the used size of the current data queue.
Definition libxr_rw.cpp:194
ErrorCode operator()(ConstRawData data, WriteOperation &op)
执行写入操作。 Performs a write operation.
Definition libxr_rw.cpp:216
WritePort(size_t queue_size=3, size_t buffer_size=128)
构造一个新的 WritePort 对象。 Constructs a new WritePort object.
Definition libxr_rw.cpp:179
WritePort & operator=(WriteFun fun)
赋值运算符重载,用于设置写入函数。 Overloaded assignment operator to set the write function.
Definition libxr_rw.cpp:202
bool Writable()
判断端口是否可写。 Checks whether the port is writable.
Definition libxr_rw.cpp:200
void MarkAsRunning(WriteOperation &op)
标记写入操作为运行中。 Marks the write operation as running.
Definition libxr_rw.cpp:214
virtual void Reset()
Resets the WritePort.
Definition libxr_rw.cpp:331
void Finish(bool in_isr, ErrorCode ans, WriteInfoBlock &info, uint32_t size)
更新写入操作的状态。 Updates the status of the write operation.
Definition libxr_rw.cpp:208
LibXR 命名空间
Definition ch32_gpio.hpp:9
ErrorCode(* ReadFun)(ReadPort &port)
Function pointer type for read operations.
Definition libxr_rw.hpp:245
Operation< ErrorCode > ReadOperation
Read operation type.
Definition libxr_rw.hpp:233
ErrorCode(* WriteFun)(WritePort &port)
Function pointer type for write operations.
Definition libxr_rw.hpp:241
Operation< ErrorCode > WriteOperation
Write operation type.
Definition libxr_rw.hpp:237
Read information block structure.
Definition libxr_rw.hpp:252
RawData data
Data buffer. 数据缓冲区。
Definition libxr_rw.hpp:253
ReadOperation op
Read operation instance. 读取操作实例。
Definition libxr_rw.hpp:254