libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
driver.hpp
1
33 static void ThreadFun(Terminal* term)
34 {
35 Semaphore read_sem, write_sem;
36 ReadOperation op(read_sem);
37
38 term->write_op_ = WriteOperation(write_sem, 10);
39
40 while (true)
41 {
42 term->request_read_size_ = LibXR::min(term->read_port_->Size(), READ_BUFF_SIZE);
43 auto buffer = RawData(term->read_buff_, term->request_read_size_);
44
45 if ((*term->read_port_)(buffer, op) == ErrorCode::OK &&
46 term->request_read_size_ > 0)
47 {
48 term->write_mutex_->Lock();
49 term->Parse(buffer);
50 term->write_stream_.Commit();
51 term->write_mutex_->Unlock();
52 }
53 }
54 }
55
76 static void TaskFun(Terminal* term)
77 {
78 ReadOperation op(term->read_status_);
79
80 auto start_read = [&]()
81 {
82 term->request_read_size_ =
83 LibXR::min(LibXR::max(1u, term->read_port_->Size()), READ_BUFF_SIZE);
84 auto buffer = RawData(term->read_buff_, term->request_read_size_);
85 (*term->read_port_)(buffer, op);
86 };
87
88 while (true)
89 {
90 switch (term->read_status_)
91 {
92 case ReadOperation::OperationPollingStatus::READY:
93 {
94 term->request_read_size_ =
95 LibXR::min(LibXR::max(1u, term->read_port_->Size()), READ_BUFF_SIZE);
96 auto buffer = RawData(term->read_buff_, term->request_read_size_);
97 (*term->read_port_)(buffer, op);
98 continue;
99 }
100 case ReadOperation::OperationPollingStatus::RUNNING:
101 return;
102 case ReadOperation::OperationPollingStatus::DONE:
103 {
104 term->write_mutex_->Lock();
105 auto buffer = RawData(term->read_buff_, term->request_read_size_);
106 term->Parse(buffer);
107 term->write_stream_.Commit();
108 term->write_mutex_->Unlock();
109 start_read();
110 return;
111 }
112 case ReadOperation::OperationPollingStatus::ERROR:
113 {
114 start_read();
115 return;
116 }
117 }
118 }
119 }
Operation< ErrorCode > ReadOperation
Read operation type.
constexpr auto min(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最小值
Operation< ErrorCode > WriteOperation
Write operation type.
constexpr auto max(LeftType a, RightType b) -> std::common_type_t< LeftType, RightType >
计算两个数的最大值