| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #include "wait_queue.h"
- #include "os/co_task.h"
- #include "libs/utils.h"
- void wait_queue_init(wait_queue_t *queue, int max_size){
- queue->keys = co_malloc(max_size * sizeof(response_t));
- memset(queue->keys, 0, sizeof(max_size * sizeof(response_t)));
- queue->max_key_count = max_size;
- }
- s32 wait_queue_add_buffer(wait_queue_t *queue, u16 key, u8*buffer, u16 len) {
- s32 q_index = -1;
- for(int i = 0; i < queue->max_key_count; i++){
- if (key == queue->keys[i].key){
- q_index = -1;
- break;
- }
- if ((q_index == -1) && (queue->keys[i].key== 0)){
- q_index = i;
- }
- }
- if (q_index != -1) {
- queue->keys[q_index].key = key;
- queue->keys[q_index].data_len= len;
- queue->keys[q_index].resp_data= buffer;
- }
- return q_index;
- }
- s32 wait_queue_add(wait_queue_t *queue, u16 key) {
- return wait_queue_add_buffer(queue, key, NULL, 0);
- }
- bool wait_queue_key_acked_response(wait_queue_t *queue, u16 key, u8 *data, u16 len){
- bool stop_to_next = false;
- for(int i = 0; i < queue->max_key_count; i++){
- if (key == queue->keys[i].key){
- queue->keys[i].key = ACKED_KEY;
- if (queue->keys[i].resp_data != NULL && data != NULL) {
- memcpy(queue->keys[i].resp_data, data, min(queue->keys[i].data_len, len));
- queue->keys[i].data_len = len;
- stop_to_next = true;
- }else {
- queue->keys[i].data_len = 0;
- }
- break;
- }
- }
- return stop_to_next;
- }
- bool wait_queue_key_acked(wait_queue_t *queue, u16 key){
- return wait_queue_key_acked_response(queue, key, NULL, 0);
- }
- s32 wait_queue_wait_key(wait_queue_t *queue, s32 index, s32 timeout) {
- volatile response_t *resp_key = queue->keys + index;
- while((resp_key->key != ACKED_KEY) && (timeout-- >= 0)){
- co_task_delay(1);
- }
- if (resp_key->key == ACKED_KEY){
- return resp_key->data_len;
- }
- return -1;
- }
- void wait_queue_delete_key(wait_queue_t *queue, s32 index) {
- queue->keys[index].key = 0;
- queue->keys[index].data_len = 0;
- queue->keys[index].resp_data = NULL;
- }
|