can_message.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "bsp/bsp_driver.h"
  2. #include "os/os_task.h"
  3. #include "libs/logger.h"
  4. #include "libs/utils.h"
  5. #include "can_message.h"
  6. #include "can_pc_message.h"
  7. #include "app/factory.h"
  8. #include "foc/commands.h"
  9. static void can_process_message(can_message_t *message);
  10. static void free_can_message(can_message_t *message);
  11. #define MAX_CAN_MESSAGE 10
  12. static can_message_t messages[MAX_CAN_MESSAGE];
  13. void can_message_init(void){
  14. #ifdef CONFIG_BOARD_COM_UART
  15. shark_uart_can_init();
  16. #else
  17. shark_can0_init();
  18. #endif
  19. }
  20. static can_message_t *get_message_by_id(can_id_t id){
  21. can_message_t *idle_msg = NULL;
  22. can_message_t *src_msg = NULL;
  23. for (int i = 0; i < MAX_CAN_MESSAGE; i++){
  24. /*first found the same src&dest */
  25. if ((messages[i].src == id.src) && (messages[i].dest == id.dest)){
  26. return (messages + i);
  27. }
  28. if (messages[i].src == id.src){
  29. src_msg = messages + i;
  30. }else if (messages[i].data == NULL){
  31. idle_msg = messages + i;
  32. }
  33. }
  34. return ((src_msg!=NULL)?src_msg:idle_msg);
  35. }
  36. s32 can_send_message(uint32_t can_id, u8 *data, int len, s32 timeout){
  37. #ifdef CONFIG_BOARD_COM_UART
  38. can_id_t efid;
  39. efid.id = can_id;
  40. efid.total = efid.idx = 1;
  41. return shark_uart_send_can_message(efid.id, data, len);
  42. #else
  43. return shark_can0_send_message(can_id, data, len) == 0?CAN_SEND_SUCCESS:CAN_SEND_ERROR;
  44. #endif
  45. }
  46. static bool handle_can_ext_frame(u32 id, uint8_t *data, int len) {
  47. switch (id) {
  48. case 0x1A01434D:
  49. case 0x1A02434D:
  50. case 0x1A03434D:
  51. case 0x1A04434D:
  52. case 0x1A05434D:
  53. case 0x1A06434D:
  54. {
  55. foc_cmd_body_t command;
  56. command.cmd = (foc_cmd_t)0;
  57. command.ext_key = (id >> 16) & 0xFFFF;
  58. command.can_src = 0x43;
  59. command.len = len;
  60. command.data = os_alloc(len);
  61. if (command.data != NULL) {
  62. memcpy(command.data, data, len);
  63. foc_send_command(&command);
  64. }
  65. return true;
  66. }
  67. default:
  68. break;
  69. }
  70. return false;
  71. }
  72. void handle_can_frame(can_id_t id, uint8_t *data, int len){
  73. //sys_debug("id = %0x\n", id.id);
  74. if (handle_can_ext_frame(id.id, data, len)) {
  75. return;
  76. }
  77. if (id.dest != CAN_MY_ADDRESS) {
  78. return;
  79. }
  80. can_message_t *message = get_message_by_id(id);
  81. if (message == NULL) {
  82. return ;
  83. }
  84. uint16_t key = 0;
  85. int total = id.total?id.total:32;
  86. int idx = id.idx?id.idx:32;
  87. if((total <= CAN_MESSAGE_MAX_FRAMES) && (idx <= CAN_MESSAGE_MAX_FRAMES)
  88. && (idx <= total)){
  89. if ((idx == 1) && (len >= 2)) { //first frame for message
  90. key = decoder_can_key(data);
  91. if (message->data) {
  92. os_free(message->data);
  93. }
  94. message->key = key;
  95. message->dest = id.dest;
  96. message->src = id.src;
  97. message->data = os_alloc(total * CAN_DLC_LENGTH);
  98. message->len = 0;
  99. message->idx = idx;
  100. message->type= id.type;
  101. message->total_frame = total;
  102. len = len - 2; //skip key
  103. data = data + 2;
  104. }
  105. if (message->data){
  106. if ((message->idx == idx) && (message->total_frame == total)){
  107. memcpy(message->data + message->len, data, len);
  108. message->len += len;
  109. if (idx == total) { //last frame
  110. can_process_message(message);
  111. }
  112. message->idx = (idx + 1);
  113. }else {
  114. free_can_message(message);
  115. }
  116. }
  117. }
  118. }
  119. #ifdef CONFIG_BOARD_COM_UART
  120. void handle_uart_can_frame(uint8_t *data, int len) {
  121. can_id_t *can_id;
  122. can_id = (can_id_t *)data;
  123. handle_can_frame(*can_id, data+4, len-4);
  124. }
  125. int shark_can0_send_ext_message(uint32_t can_id, const void*buff, int len) {
  126. return 0;//shark_uart_send_can_message(can_id, (u8 *)buff, len);
  127. }
  128. #endif
  129. static void can_process_message(can_message_t *message){
  130. //sys_debug("can %x [%x -> %x], len = %d\n", message->key, message->src, message->dest, message->len);
  131. if ((message->key & 0xFF) >= 0xF0) {
  132. can_process_iap_message(message);
  133. }else if ((message->key & 0xFF) >= 0xE0) { //工厂测试
  134. can_process_factory_message(message);
  135. }else{ //只处理后控的指令
  136. if ((message->key & 0xFF) < Foc_Cmd_Max){
  137. foc_cmd_body_t command;
  138. command.ext_key = 0;
  139. command.cmd = (foc_cmd_t)(message->key & 0xFF);
  140. command.can_src = message->src;
  141. command.len = message->len;
  142. command.data = os_alloc(message->len);
  143. if (command.data || message->len == 0) {
  144. if (message->len > 0) {
  145. memcpy(command.data, message->data, message->len);
  146. }
  147. foc_send_command(&command);
  148. }
  149. }
  150. }
  151. free_can_message(message);
  152. }
  153. static void free_can_message(can_message_t *message){
  154. if (message->data) {
  155. os_free(message->data);
  156. }
  157. message->data = NULL;
  158. message->src = 0;
  159. message->len = 0;
  160. message->idx = 0xFF;
  161. message->total_frame = 0xFF;
  162. }
  163. void can_send_response(uint8_t can_addr, uint8_t *data, int len){
  164. can_send_message(get_reponse_can_id(can_addr), data, len, 50);
  165. }
  166. void can_send_ack(uint8_t can_addr, uint16_t key, uint8_t data){
  167. can_message_t message;
  168. message.src = can_addr;
  169. message.key = key;
  170. can_send_message_ack(&message, data);
  171. }
  172. void can_send_message_ack(can_message_t *msg, uint8_t success){
  173. u8 response[3];
  174. encoder_can_key(response, msg->key);
  175. response[2] = success;
  176. can_send_message(get_reponse_can_id(msg->src), response, 3, 50);
  177. }
  178. void can_send_indicator(uint8_t can_add, uint8_t *data, int len){
  179. can_send_message(get_indicator_can_id(can_add), data, len, 50);
  180. }
  181. void can_send_request(uint8_t can_add, uint8_t *data, int len){
  182. can_send_message(get_request_can_id(can_add,3), data, len, 300);
  183. }