libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
driver.hpp
1
33static 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 && term->request_read_size_ > 0)
46 {
47 term->write_mutex_->Lock();
48 term->Parse(buffer);
49 term->write_stream_.Commit();
50 term->write_mutex_->Unlock();
51 }
52 }
53}
54
75static void TaskFun(Terminal* term)
76{
77 ReadOperation op(term->read_status_);
78
79 auto start_read = [&]()
80 {
81 term->request_read_size_ =
82 LibXR::min(LibXR::max(1u, term->read_port_->Size()), READ_BUFF_SIZE);
83 auto buffer = RawData(term->read_buff_, term->request_read_size_);
84 (*term->read_port_)(buffer, op);
85 };
86
87 while (true)
88 {
89 switch (term->read_status_)
90 {
91 case ReadOperation::OperationPollingStatus::READY:
92 {
93 term->request_read_size_ =
94 LibXR::min(LibXR::max(1u, term->read_port_->Size()), READ_BUFF_SIZE);
95 auto buffer = RawData(term->read_buff_, term->request_read_size_);
96 (*term->read_port_)(buffer, op);
97 continue;
98 }
99 case ReadOperation::OperationPollingStatus::RUNNING:
100 return;
101 case ReadOperation::OperationPollingStatus::DONE:
102 {
103 term->write_mutex_->Lock();
104 auto buffer = RawData(term->read_buff_, term->request_read_size_);
105 term->Parse(buffer);
106 term->write_stream_.Commit();
107 term->write_mutex_->Unlock();
108 start_read();
109 return;
110 }
111 case ReadOperation::OperationPollingStatus::ERROR:
112 {
113 start_read();
114 return;
115 }
116 }
117 }
118}
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 >
计算两个数的最大值