wait_queue.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "wait_queue.h"
  2. #include "os/os_task.h"
  3. #include "libs/utils.h"
  4. #include "bsp/bsp_driver.h"
  5. void wait_queue_init(wait_queue_t *queue, int max_size){
  6. queue->keys = os_alloc(max_size * sizeof(response_t));
  7. memset(queue->keys, 0, sizeof(max_size * sizeof(response_t)));
  8. queue->max_key_count = max_size;
  9. }
  10. s32 wait_queue_add_buffer(wait_queue_t *queue, u16 key, u8*buffer, u16 len) {
  11. s32 q_index = -1;
  12. for(int i = 0; i < queue->max_key_count; i++){
  13. if (key == queue->keys[i].key){
  14. q_index = -1;
  15. break;
  16. }
  17. if ((q_index == -1) && (queue->keys[i].key== 0)){
  18. q_index = i;
  19. }
  20. }
  21. if (q_index != -1) {
  22. queue->keys[q_index].key = key;
  23. queue->keys[q_index].data_len= len;
  24. queue->keys[q_index].resp_data= buffer;
  25. }
  26. return q_index;
  27. }
  28. s32 wait_queue_add(wait_queue_t *queue, u16 key) {
  29. return wait_queue_add_buffer(queue, key, NULL, 0);
  30. }
  31. bool wait_queue_key_acked_response(wait_queue_t *queue, u16 key, u8 *data, u16 len){
  32. bool stop_to_next = false;
  33. for(int i = 0; i < queue->max_key_count; i++){
  34. if (key == queue->keys[i].key){
  35. queue->keys[i].key = ACKED_KEY;
  36. if (queue->keys[i].resp_data != NULL && data != NULL) {
  37. memcpy(queue->keys[i].resp_data, data, min(queue->keys[i].data_len, len));
  38. queue->keys[i].data_len = len;
  39. stop_to_next = true;
  40. }else {
  41. queue->keys[i].data_len = 0;
  42. }
  43. break;
  44. }
  45. }
  46. return stop_to_next;
  47. }
  48. bool wait_queue_key_acked(wait_queue_t *queue, u16 key){
  49. return wait_queue_key_acked_response(queue, key, NULL, 0);
  50. }
  51. s32 wait_queue_wait_key(wait_queue_t *queue, s32 index, s32 timeout) {
  52. volatile response_t *resp_key = queue->keys + index;
  53. while((resp_key->key != ACKED_KEY) && (timeout-- >= 0)){
  54. can_rx_poll();
  55. delay_ms(1);
  56. }
  57. if (resp_key->key == ACKED_KEY){
  58. return resp_key->data_len;
  59. }
  60. return -1;
  61. }
  62. void wait_queue_delete_key(wait_queue_t *queue, s32 index) {
  63. queue->keys[index].key = 0;
  64. queue->keys[index].data_len = 0;
  65. queue->keys[index].resp_data = NULL;
  66. }