| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #include "wait_queue.h"
- #include "os/os_task.h"
- #include "libs/utils.h"
- #include "bsp/bsp_driver.h"
- void wait_queue_init(wait_queue_t *queue, int max_size){
- queue->keys = os_alloc(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)){
- can_rx_poll();
- delay_ms(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;
- }
|