protocol_old.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include <string.h>
  2. #include "app/sox/soc.h"
  3. #include "app/sox/measure.h"
  4. #include "app/sox/measure_task.h"
  5. #include "app/sox/health.h"
  6. #include "app/sox/state.h"
  7. #include "app/sox/iostate.h"
  8. #include "bsp/gpio.h"
  9. #include "bsp/ml5238.h"
  10. #include "bsp/fmc_flash.h"
  11. #include "libs/logger.h"
  12. #include "bsp/uart.h"
  13. #include "protocol_old.h"
  14. static uart_enum_t current_uart = SHARK_UART0;
  15. extern char* bsp_get_fversion(void);
  16. uint16_t _checksum(uint8_t *data, uint16_t size) {
  17. uint32_t checksum;
  18. if((NULL == data) || (0 == size)) {
  19. return 0;
  20. }
  21. checksum = 0;
  22. while(size>1) {
  23. checksum += *(uint16_t*)data;
  24. data += 2;
  25. size -= 2;
  26. }
  27. if(size>0) {
  28. checksum += *data;
  29. }
  30. while(checksum>>16) {
  31. checksum = (checksum&0xFFFF)+(checksum>>16);
  32. }
  33. return (uint16_t)~checksum;
  34. }
  35. static int get_response_data(uint8_t *data, uint8_t operate, uint8_t result){
  36. comm_head_t *head = (comm_head_t *)data;
  37. head->size = sizeof(comm_head_t);
  38. head->type = 0x30;
  39. head->dir = 0x16;
  40. head->bStatus = 1;
  41. head->cmd = 0x10;
  42. head->protocol = 'B';
  43. head->checksum = 0;
  44. comm_response_t *response = (comm_response_t *)head->data;
  45. response->remain_miles= 0; //Ê£ÓàÀï³Ì
  46. response->capacity = get_soc()->capacity;
  47. response->remain_charger_time= soc_get_charger_remain_time()/360; //10·ÖÖ®1Сʱµ¥Î»
  48. response->is_chargering = bms_state_get()->charging;
  49. response->load_current = measure_value()->load_current;
  50. response->pack_voltage = bms_state_get()->pack_voltage;
  51. response->max_temp = -100;
  52. for (int i = 0; i < PACK_TEMPS_NUM; i++){
  53. if (response->max_temp < measure_value()->pack_temp[i]){
  54. response->max_temp = measure_value()->pack_temp[i];
  55. }
  56. }
  57. response->health_state = *((uint16_t *)bms_health());
  58. response->balance_mask = 0x0;
  59. response->misc_status = (ml5238_is_charging() << 1) | (ml5238_is_discharging() << 2) | (AUX_VOL_IS_OPEN() << 3) |(io_state()->aux_lock_detect << 4) | ((get_soc()->capacity==100) << 5) | (((get_soc()->flags & SOC_FLAG_CALIBRATED) == 0) << 6);
  60. response->result = (operate << 4) | result;
  61. head->size += sizeof(comm_response_t);
  62. if (operate == OP_READ_INFO){
  63. uint8_t sn[32];
  64. int sn_len = sizeof(sn);
  65. fmc_read_sn(sn, &sn_len);
  66. if (sn_len == 0){
  67. sn[0] = 'B';
  68. memset(sn + 1, '0', sizeof(sn) - 1);
  69. sn_len = 18;
  70. }
  71. memcpy(&data[head->size], sn, sn_len);
  72. head->size += sn_len;
  73. strcpy((char *)&data[head->size], bsp_get_fversion());
  74. head->size += strlen(bsp_get_fversion());
  75. }else if (operate == OP_ALARM_TIMES){
  76. memset(&data[head->size], 0, 42);
  77. head->size += 42;
  78. }else if (operate == OP_CELL_VOL){
  79. data[head->size ++] = CELLS_NUM;
  80. for (int i = 0; i <CELLS_NUM; i++){
  81. data[head->size ++] = (uint8_t)measure_value()->cell_vol[i];
  82. data[head->size ++] = (uint8_t)(measure_value()->cell_vol[i] >> 8);
  83. }
  84. }else if (operate == OP_TEMP_OTHER){
  85. for (int i = 0; i < PACK_TEMPS_NUM; i++){
  86. data[head->size ++] = measure_value()->pack_temp[i];
  87. }
  88. data[head->size ++] = (ml5238_is_charging() << 0) | (ml5238_is_discharging() << 1);
  89. }
  90. head->checksum = _checksum(data, head->size);
  91. return head->size;
  92. }
  93. void protocol_old_recv_frame(uart_enum_t uart_no, uint8_t *data, int len){
  94. current_uart = uart_no;
  95. comm_head_t *head = (comm_head_t *)data;
  96. if (/*head->type != 0x30 || */head->dir != 0x16 || head->bStatus == 1 || head->size < sizeof(comm_head_t)){
  97. return;
  98. }
  99. uint16_t checksum = head->checksum;
  100. head->checksum = 0;
  101. if (checksum != _checksum(data, len)){
  102. return;
  103. }
  104. data = head->data;
  105. data += 6;
  106. uint8_t operate = data[0];
  107. data += 1;
  108. uint8_t result = 1;
  109. if (operate == OP_OPEN_FET){
  110. if (data[8] == 0x03) {
  111. bms_state_get()->user_request = USER_REQUEST_PENDING | USER_REQUEST_DISCHARGER_ON|USER_REQUEST_CHARGER_ON;
  112. }else if (data[8] == 0x0){
  113. bms_state_get()->user_request = USER_REQUEST_PENDING | USER_REQUEST_SMALLCURRENT_OFF|USER_REQUEST_DISCHARGER_OFF|USER_REQUEST_CHARGER_OFF;
  114. }else if (data[8] == 0x04) {
  115. bms_state_get()->user_request = USER_REQUEST_PENDING | USER_REQUEST_SMALLCURRENT_ON;
  116. }else {
  117. result = 0;
  118. }
  119. }
  120. uint8_t response_data[256];
  121. uint16_t response_len = get_response_data(response_data, operate, result);
  122. if (response_len <= 0){
  123. return;
  124. }
  125. shark_uart_write_bytes(current_uart, response_data, response_len);
  126. }