mirror of
				https://github.com/espressif/esp-protocols.git
				synced 2025-10-31 14:41:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  */
 | |
| 
 | |
| #include <cstdint>
 | |
| #include <vector>
 | |
| #include <cstring>
 | |
| #include <queue>
 | |
| #include <mutex>
 | |
| #include <condition_variable>
 | |
| #include <atomic>
 | |
| #include "osal_api.h"
 | |
| 
 | |
| template <class T>
 | |
| class Queue {
 | |
| public:
 | |
|     void send(std::unique_ptr<T> t)
 | |
|     {
 | |
|         std::lock_guard<std::mutex> lock(m);
 | |
|         q.push(std::move(t));
 | |
|         c.notify_one();
 | |
|     }
 | |
| 
 | |
|     std::unique_ptr<T> receive(std::chrono::milliseconds ms)
 | |
|     {
 | |
|         std::unique_lock<std::mutex> lock(m);
 | |
|         while (q.empty()) {
 | |
|             if (c.wait_for(lock, ms) == std::cv_status::timeout) {
 | |
|                 return nullptr;
 | |
|             }
 | |
|         }
 | |
|         std::unique_ptr<T> val = std::move(q.front());
 | |
|         q.pop();
 | |
|         return val;
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     std::queue<std::unique_ptr<T>> q{};
 | |
|     mutable std::mutex m{};
 | |
|     std::condition_variable c{};
 | |
| };
 | |
| 
 | |
| using item_t = std::vector<uint8_t>;
 | |
| 
 | |
| void *osal_queue_create(void)
 | |
| {
 | |
|     auto *q = new Queue<item_t>();
 | |
|     return q;
 | |
| }
 | |
| 
 | |
| void osal_queue_delete(void *q)
 | |
| {
 | |
|     auto *queue = static_cast<Queue<item_t> *>(q);
 | |
|     delete (queue);
 | |
| }
 | |
| 
 | |
| bool osal_queue_send(void *q, uint8_t *data, size_t len)
 | |
| {
 | |
|     auto v = std::make_unique<item_t>(len);
 | |
|     v->assign(data, data + len);
 | |
|     auto queue = static_cast<Queue<item_t> *>(q);
 | |
|     queue->send(std::move(v));
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| 
 | |
| bool osal_queue_recv(void *q, uint8_t *data, size_t len, uint32_t ms)
 | |
| {
 | |
|     auto queue = static_cast<Queue<item_t> *>(q);
 | |
|     auto v = queue->receive(std::chrono::milliseconds(ms));
 | |
|     if (v != nullptr) {
 | |
|         memcpy(data, (void *)v->data(), len);
 | |
|         return true;
 | |
|     }
 | |
|     return false;
 | |
| }
 |