protocol.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "protocol.h"
  2. #include <string.h>
  3. #include "bsp/uart.h"
  4. #include "app/pc_message.h"
  5. #include "app/bms_message.h"
  6. #include "app/iap.h"
  7. static uint16_t _check_sum(uint8_t*data,uint16_t size);
  8. static uart_enum_t current_uart = SHARK_UART0;
  9. extern void health_add_uart_error(uint32_t c, uint32_t l, uint32_t d);
  10. void protocol_send_bms_info(uint8_t dest, uint8_t key, uint8_t *data, int len){
  11. can_frame_t can_frame;
  12. CAN_OUT(&(can_frame.head), dest);
  13. can_frame.key = key;
  14. #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700)
  15. u8 dumy_bytes[2] = {0xaa, 0xaa}; //让红外正常
  16. shark_uart_write_bytes(current_uart, dumy_bytes, sizeof(dumy_bytes));
  17. #endif
  18. shark_uart_frame_start(current_uart, (uint8_t *)&can_frame, sizeof(can_frame));
  19. shark_uart_frame_continue(current_uart, data, len);
  20. shark_uart_frame_end(current_uart);
  21. }
  22. void protocol_send_ack(uint8_t dest, uint8_t key, int result) {
  23. uint8_t data[sizeof(can_frame_t) + 1];
  24. can_frame_t *frame = (can_frame_t *)data;
  25. CAN_OUT(&(frame->head), dest);
  26. frame->key = key;
  27. data[sizeof(can_frame_t)] = result;
  28. shark_uart_write_frame(current_uart, data, sizeof(data));
  29. }
  30. void protocol_send_debug_info(uint8_t dest, uint8_t *data, int len){
  31. if (bms_work_is_aging_test() || bms_work_is_pcba_test()){
  32. shark_uart_write_bytes(current_uart, data, len);
  33. return;
  34. }
  35. can_head_t can_head;
  36. CAN_OUT(&can_head, dest);
  37. shark_uart_frame_start(current_uart, (uint8_t *)&can_head, sizeof(can_head));
  38. shark_uart_frame_continue(current_uart, data, len);
  39. shark_uart_frame_end(current_uart);
  40. }
  41. /*如果接收到的数据frame,无法识别为新的protocol,认为是老协议,这里通过老协议发送给PSxxx,告知
  42. 只支持新协议
  43. */
  44. void protocol_notify_old_frame(uart_enum_t uart_no){
  45. current_uart = uart_no;
  46. protocol_old_head_t head;
  47. memset(&head, 0, sizeof(head));
  48. head.size = sizeof(head);
  49. head.protocol = 'C';
  50. head.type = 0x30;
  51. head.dir = 0x16;
  52. head.cmd = 0x10;
  53. head.bStatus = 1;
  54. head.checksum = _check_sum((uint8_t *)&head, head.size);
  55. shark_uart_write_bytes(current_uart, (uint8_t *)&head, head.size);
  56. }
  57. extern u32 uart_new_prot;
  58. extern u64 uart_frame_time;
  59. void protocol_recv_frame(uart_enum_t uart_no, uint8_t *data, int len){
  60. current_uart = uart_no;
  61. if (len < sizeof(can_frame_t)){
  62. health_add_uart_error(0, 1, 0);
  63. return;
  64. }
  65. can_frame_t *can_frame = (can_frame_t *)data;
  66. if (!CAN_IN(&(can_frame->head))) {//data is sent by myself, drop
  67. health_add_uart_error(0 ,0 ,1);
  68. return;
  69. }
  70. uart_new_prot++;
  71. uart_frame_time = shark_get_mseconds();
  72. len -= sizeof(can_frame_t);
  73. if (can_frame->key >= CAN_KEY_IAP_ENTER){
  74. process_iap_message(can_frame, len);
  75. }else {
  76. if (!process_pc_message(can_frame, len)) {
  77. process_bms_message(can_frame, len);
  78. }
  79. }
  80. }
  81. static uint16_t _check_sum(uint8_t*data,uint16_t size)
  82. {
  83. uint32_t checksum;
  84. if((NULL == data)||(0 == size)){
  85. return 0;
  86. }
  87. checksum = 0;
  88. while(size>1) {
  89. checksum += *(uint16_t*)data;
  90. data += 2;
  91. size -= 2;
  92. }
  93. if(size>0) {
  94. checksum += *data;
  95. }
  96. while(checksum>>16) {
  97. checksum = (checksum&0xFFFF)+(checksum>>16);
  98. }
  99. return (uint16_t)~checksum;
  100. }