mod_spi.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #include "mod_spi.h"
  2. #include "mod_candataprocess.h"
  3. #include "mod_sys.h"
  4. #include "sys_queue.h"
  5. #include "sys_log.h"
  6. #include "sys_crc.h"
  7. #include "sys_common.h"
  8. #include "string.h"
  9. #include "hal_spi.h"
  10. #define WECHAT_DEBUG 1
  11. #define BLE_CONFIG_BUF_LEN 32
  12. static uint16_t g_s_tlen = 0;
  13. static uint16_t g_s_clen = 0;
  14. static uint8_t g_s_ble_config[BLE_CONFIG_BUF_LEN];
  15. #if WECHAT_DEBUG
  16. static uint8_t test_cmd[] = {0x00, 0x00, 0x06, 0xf1, 0x05, 0x12, 0x03, 0x22, 0xf1, 0x8a};
  17. uint8_t test_tx_buffer[] = {0x52, 0x01, 0x00, 0x00, 0x00, 0x06, 0x12, 0x08, 0xf1, 0x06, 0x62, 0xf1, 0x8a, 0x22, 0x22, 0x22};
  18. #endif //WECHAT_DEBUG
  19. static spi_send_callback_fp g_s_spi_send_callback = NULL;
  20. void MOD_SpiDataProcess(uint8_t* data, uint8_t data_len)
  21. {
  22. SPI_HEADER_T* pHeader = (SPI_HEADER_T*)data;
  23. uint16_t check_crc = 0, pack_crc;
  24. uint8_t pack_len;
  25. uint8_t pack_cmd;
  26. uint8_t header_len = sizeof(SPI_HEADER_T);
  27. uint8_t crc_index;
  28. uint8_t ver = 0;
  29. pack_cmd = pHeader->message_code;
  30. pack_len = pHeader->len;
  31. crc_index = header_len-2+pack_len-3;
  32. check_crc = UTIL_CRC(&data[2], crc_index);
  33. memcpy(&pack_crc, &data[crc_index+2], 2);
  34. small_big_transfer16(&pack_crc);
  35. if(check_crc != pack_crc)
  36. {
  37. return;
  38. }
  39. DLOG_I("spi_rx_data:%s,len:%d", SYS_Hex2str((uint8_t* )data, data_len), data_len);
  40. if(pack_cmd == BLE_CMD_VER)
  41. {
  42. ver = data[4];
  43. DLOG_I("BLE_CMD_VER");
  44. DLOG_I("ble ver:0x%x", ver);
  45. MOD_SpiSetBleConfig();
  46. }
  47. else if(pack_cmd == BLE_CMD_CFG)
  48. {
  49. DLOG_I("BLE_CMD_CFG");
  50. }
  51. else if(pack_cmd == BLE_CMD_TRANSFER)
  52. {
  53. DLOG_I("BLE_CMD_TRANSFER");
  54. if(data[4] == TRANSFER_GET_CAN_CMD)
  55. {
  56. DLOG_I("send_can_data_cmd");
  57. #if WECHAT_DEBUG
  58. if(!memcmp(&data[7], test_cmd, sizeof(test_cmd)))
  59. {
  60. DLOG_I("wechat test cmd");
  61. MOD_SpiDataSend(BLE_CMD_TRANSFER, test_tx_buffer, sizeof(test_tx_buffer));
  62. }
  63. else
  64. {
  65. MOD_CanTransferData(&data[5], pack_len-3-1);
  66. }
  67. #else
  68. MOD_CanTransferData(&data[5], pack_len-3-1);
  69. #endif //WECHAT_DEBUG
  70. }
  71. }
  72. else if(pack_cmd == BLE_CMD_CONNECT)
  73. {
  74. DLOG_I("BLE_CMD_CONNECT");
  75. }
  76. else if(pack_cmd == BLE_CMD_DISCONNECT)
  77. {
  78. DLOG_I("BLE_CMD_DISCONNECT");
  79. }
  80. else if(pack_cmd == BLE_CMD_TEST)
  81. {
  82. ver = data[4];
  83. DLOG_I("BLE_CMD_TEST");
  84. DLOG_I("get ble ver:0x%x", ver);
  85. }
  86. }
  87. void MOD_SpiDataSendCallbackRegister(spi_send_callback_fp fp)
  88. {
  89. g_s_spi_send_callback = fp;
  90. }
  91. void MOD_SpiDataSend(uint8_t cmd, uint8_t*data, uint8_t len)
  92. {
  93. uint8_t send_buf[QUEUE_MAX_DATA_LEN] = {0};
  94. int pack_len = 0;
  95. uint16_t crc;
  96. uint16_t header_len = sizeof(SPI_HEADER_T);
  97. SPI_HEADER_T* pHeader = (SPI_HEADER_T*)send_buf;
  98. memset(send_buf, 0, QUEUE_MAX_DATA_LEN);
  99. pHeader->ident[0] = SPI_DATA_IDENT;
  100. pHeader->ident[1] = SPI_DATA_IDENT;
  101. pHeader->len = 3 + len;
  102. pHeader->message_code = cmd;
  103. if ((len>0)&&(len<QUEUE_MAX_DATA_LEN-2-header_len))
  104. {
  105. memcpy(&send_buf[header_len], data, len);
  106. }
  107. crc = UTIL_CRC(&send_buf[2], header_len-2+len);
  108. send_buf[header_len + len] = (crc >> 8) & 0xFF;
  109. send_buf[header_len + len + 1] = crc & 0xFF;
  110. pack_len = header_len+len+2;
  111. DLOG_I("spi_tx_data:%s,len:%d", SYS_Hex2str(send_buf, pack_len), pack_len);
  112. if(NULL != g_s_spi_send_callback)
  113. {
  114. g_s_spi_send_callback(send_buf, QUEUE_MAX_DATA_LEN);
  115. }
  116. }
  117. int MOD_SpiSetBleConfig(void)
  118. {
  119. uint8_t ble_mac[6] = {0};
  120. uint8_t ble_name[10] = {0};
  121. uint32_t ble_adv_interval = 0;
  122. uint8_t* p_name = NULL;
  123. uint8_t ble_name_len = 0;
  124. memset(ble_mac, 0, 6);
  125. memcpy(ble_mac, (uint8_t* )MOD_SysGetPara(PARA_BLE_MAC), 6);
  126. DLOG_I("set ble_mac:%X%X%X%X%X%X", ble_mac[0],ble_mac[1],ble_mac[2],ble_mac[3],ble_mac[4],ble_mac[5]);
  127. memset(ble_name, 0, 10);
  128. p_name = (uint8_t* )MOD_SysGetPara(PARA_BLE_NAME);
  129. ble_name_len = strlen(p_name);
  130. memcpy(ble_name, p_name, ble_name_len);
  131. DLOG_I("set ble_name:%s,len:%d", ble_name, ble_name_len);
  132. ble_adv_interval = *(uint32_t* )MOD_SysGetPara(PARA_BLE_ADV_INTERVAL);
  133. DLOG_I("set ble_adv_interval:%d", ble_adv_interval);
  134. MOD_SpiTlvInit(g_s_ble_config, BLE_CONFIG_BUF_LEN);
  135. MOD_SpiTlvSetValue(g_s_ble_config, TAG_DL_MAC, 6, ble_mac);
  136. MOD_SpiTlvSetValue(g_s_ble_config, TAG_DL_ADV_NAME, ble_name_len, ble_name);
  137. MOD_SpiTlvSetValue(g_s_ble_config, TAG_DL_ADV_INTERVAL, 4, &ble_adv_interval);
  138. MOD_SpiDataSend(BLE_CMD_CFG, g_s_ble_config, MOD_SpiTlvGetLen());
  139. return 0;
  140. }
  141. uint16_t srv_ble_byte_2_short(uint8_t* bytes)
  142. {
  143. uint16_t result = bytes[1] & 0xFF;
  144. result |= ((bytes[0] << 8) & 0xFF00);
  145. return result;
  146. }
  147. uint16_t MOD_SpiTlvGetLen(void)
  148. {
  149. return g_s_clen;
  150. }
  151. void MOD_SpiTlvInit(uint8_t *buf, uint16_t len)
  152. {
  153. g_s_tlen = len;
  154. g_s_clen = 0;
  155. memset(buf, 0, len);
  156. }
  157. uint16_t MOD_SpiTlvGetValue(uint16_t id, void* input ,uint16_t inputLen, void* output)
  158. {
  159. uint8_t* tmp;
  160. uint16_t curr = 0;
  161. uint16_t len = 0;
  162. uint8_t* end;
  163. tmp = input;
  164. end = (uint8_t*)input + inputLen;
  165. while (tmp + 4 <= end)
  166. {
  167. curr = srv_ble_byte_2_short(tmp);
  168. tmp += 2;
  169. len = srv_ble_byte_2_short(tmp);
  170. tmp += 2;
  171. if( tmp + len > end )
  172. return 0;
  173. if (curr == id)
  174. {
  175. memcpy(output, tmp, len);
  176. return len;
  177. }
  178. tmp += len;
  179. }
  180. return 0;
  181. }
  182. void MOD_SpiTlvSetValue(uint8_t *buf, uint16_t id, uint16_t size, void *value)
  183. {
  184. if(g_s_clen + size + 4 > g_s_tlen)
  185. {
  186. DLOG_E("tlv buffer is too small[%d]", g_s_clen + size + 4);
  187. return;
  188. }
  189. buf[g_s_clen++] = (id >> 8) & 0xFF;
  190. buf[g_s_clen++] = id & 0xFF;
  191. buf[g_s_clen++] = (size >> 8) & 0xFF;
  192. buf[g_s_clen++] = size & 0xFF;
  193. memcpy(buf + g_s_clen, value, size);
  194. g_s_clen += size;
  195. }