can_message.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "bsp/bsp.h"
  2. #include "os/co_task.h"
  3. #include "libs/logger.h"
  4. #include "libs/utils.h"
  5. #include "can_message.h"
  6. #include "wait_queue.h"
  7. static void can_process_message(can_message_t *message);
  8. static void free_can_message(can_message_t *message);
  9. #define MAX_CAN_MESSAGE 10
  10. static can_message_t messages[MAX_CAN_MESSAGE];
  11. static wait_queue_t wait_queue;
  12. void can_message_init(void){
  13. wait_queue_init(&wait_queue, 32);
  14. shark_can0_init();
  15. }
  16. static can_message_t *get_message_by_id(can_id_t id){
  17. can_message_t *idle_msg = NULL;
  18. can_message_t *src_msg = NULL;
  19. for (int i = 0; i < MAX_CAN_MESSAGE; i++){
  20. /*first found the same src&dest */
  21. if ((messages[i].src == id.src) && (messages[i].dest == id.dest)){
  22. return (messages + i);
  23. }
  24. if (messages[i].src == id.src){
  25. src_msg = messages + i;
  26. }else if (messages[i].data == NULL){
  27. idle_msg = messages + i;
  28. }
  29. }
  30. return ((src_msg!=NULL)?src_msg:idle_msg);
  31. }
  32. s32 can_send_message(uint32_t can_id, u8 *data, int len, s32 timeout){
  33. can_id_t id;
  34. id.id = can_id;
  35. if (id.type != ptype_request || id.retry <= 1) {
  36. return shark_can0_send_message(can_id, data, len) == 0?CAN_SEND_SUCCESS:CAN_SEND_ERROR;
  37. }
  38. s32 s_ret = CAN_SEND_NO_WAIT_QUEUE;
  39. s32 index = wait_queue_add(&wait_queue, decoder_can_key(data));
  40. if (index >= 0){
  41. s_ret = CAN_SEND_TIMEOUT;
  42. s32 retry = id.retry;
  43. while(retry -- > 0) {
  44. s_ret = shark_can0_send_message(can_id, data, len) == 0?CAN_SEND_SUCCESS:CAN_SEND_ERROR;
  45. if (s_ret != CAN_SEND_SUCCESS){
  46. continue;
  47. }
  48. s_ret = wait_queue_wait_key(&wait_queue, index, timeout)?CAN_SEND_SUCCESS:CAN_SEND_TIMEOUT;
  49. if (s_ret == CAN_SEND_SUCCESS){
  50. break;
  51. }
  52. }
  53. wait_queue_delete_key(&wait_queue, index);
  54. }
  55. return s_ret;
  56. }
  57. void handle_can_frame(can_id_t id, uint8_t *data, int len){
  58. can_message_t *message = get_message_by_id(id);
  59. if (message == NULL) {
  60. return ;
  61. }
  62. uint16_t key = 0;
  63. int total = id.total?id.total:32;
  64. int idx = id.idx?id.idx:32;
  65. if((total <= CAN_MESSAGE_MAX_FRAMES) && (idx <= CAN_MESSAGE_MAX_FRAMES)
  66. && (idx <= total)){
  67. if ((idx == 1) && (len >= 2)) { //first frame for message
  68. key = decoder_can_key(data);
  69. if (message->data) {
  70. co_free(message->data);
  71. }
  72. message->key = key;
  73. message->dest = id.dest;
  74. message->src = id.src;
  75. message->data = co_malloc(total * CAN_DLC_LENGTH);
  76. message->len = 0;
  77. message->idx = idx;
  78. message->type= id.type;
  79. message->total_frame = total;
  80. len = len - 2; //skip key
  81. data = data + 2;
  82. }
  83. if (message->data){
  84. if ((message->idx == idx) && (message->total_frame == total)){
  85. memcpy(message->data + message->len, data, len);
  86. message->len += len;
  87. if (idx == total) { //last frame
  88. if (message->type == ptype_response) {
  89. wait_queue_key_acked(&wait_queue, message->key);
  90. }
  91. can_process_message(message);
  92. }
  93. message->idx = (idx + 1);
  94. }else {
  95. free_can_message(message);
  96. }
  97. }
  98. }
  99. }
  100. static void can_process_message(can_message_t *message){
  101. sys_debug("can %x [%x -> %x], len = %d\n", message->key, message->src, message->dest, message->len);
  102. if (message->key & 0xFF >= 0xF0) {
  103. //do iap update
  104. }else if (message->src == 0x42){ //只处理后控的指令
  105. }
  106. free_can_message(message);
  107. }
  108. static void free_can_message(can_message_t *message){
  109. if (message->data) {
  110. co_free(message->data);
  111. }
  112. message->data = NULL;
  113. message->src = 0;
  114. message->len = 0;
  115. message->idx = 0xFF;
  116. message->total_frame = 0xFF;
  117. }
  118. void can_send_response(uint8_t can_add, uint8_t *data, int len){
  119. can_send_message(get_reponse_can_id(can_add), data, len, 50);
  120. }
  121. void can_send_message_ack(can_message_t *msg, uint8_t success){
  122. u8 response[3];
  123. encoder_can_key(response, msg->key);
  124. response[2] = success;
  125. can_send_message(get_reponse_can_id(msg->src), response, 3, 50);
  126. }
  127. void can_send_indicator(uint8_t can_add, uint8_t *data, int len){
  128. can_send_message(get_indicator_can_id(can_add), data, len, 50);
  129. }
  130. void can_send_request(uint8_t can_add, uint8_t *data, int len){
  131. can_send_message(get_request_can_id(can_add,3), data, len, 300);
  132. }