app_pair.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /*********************************************************************
  2. * INCLUDES
  3. */
  4. #include "ble_comm.h"
  5. #include "ble_gap.h"
  6. #include "nrf_gpio.h"
  7. #include "bsp_time.h"
  8. #include "app_flash.h"
  9. #include "hal_ble_uart0.h"
  10. #include "hal_ble_client.h"
  11. #include "hal_ble_host.h"
  12. #include "hal_led.h"
  13. #include "app_charge.h"
  14. #include "app_pair.h"
  15. /*********************************************************************
  16. * LOCAL DEFINETION
  17. */
  18. /*********************************************************************
  19. * LOCAL VARIABLES
  20. */
  21. static ble_gap_addr_t mAddr;
  22. static uint16_t isConfig = 0;
  23. /*********************************************************************
  24. * LOCAL FUNCTIONS
  25. */
  26. void UART0_Config_Send(uint8_t cmd)
  27. {
  28. uint8_t buf[32];
  29. uint8_t L = 0;
  30. //MAC 地址
  31. for(int i=0;i<6;i++){
  32. buf[L++] = mAddr.addr[5-i];
  33. }
  34. //硬件版本
  35. buf[L++] = (uint8_t)((uint16_t)HARDWARE_VERSION>>8);
  36. buf[L++] = (uint8_t)((uint16_t)HARDWARE_VERSION>>0);
  37. //软件版本
  38. buf[L++] = (uint8_t)((uint16_t)SOFTWARE_VERSION>>8);
  39. buf[L++] = (uint8_t)((uint16_t)SOFTWARE_VERSION>>0);
  40. UART0_Tx_Send(0,cmd,buf,L);
  41. }
  42. #define PAIR_TIMES 50 //配对次数
  43. void app_pair_Process(void)
  44. {
  45. static uint8_t flag = 0;
  46. if(app_charge_Getstate()!=BLE_Client_T_CHARGE_PULLOUT){
  47. if(flag != 1)
  48. {
  49. if(mFlash.isHost)UART0_Initialize(PIN_TXD_BLE,PIN_RXD_BLE,UART_HZ);
  50. else UART0_Initialize(UART0_INVALID_PIN,PIN_RXD_BLE,UART_HZ);
  51. flag = 1;
  52. }
  53. else if(isConfig<PAIR_TIMES){ isConfig++;
  54. if(mFlash.isHost){ //充电模式下主机主机申请配对
  55. UART0_Initialize(PIN_TXD_BLE,PIN_RXD_BLE,UART_HZ);
  56. UART0_Config_Send(UART0_T_CONFIG_ASK);
  57. UART0_Initialize(UART0_INVALID_PIN,PIN_RXD_BLE,UART_HZ);
  58. }
  59. }
  60. }else{
  61. if(flag != 2)
  62. {
  63. UART0_unInit(PIN_TXD_BLE,PIN_RXD_BLE);
  64. flag = 2;
  65. // nrf_gpio_cfg_output(PIN_LED_RUN); nrf_gpio_pin_write(PIN_LED_RUN,LED_SMALL_DISABLE);
  66. }
  67. else if(isConfig>0) isConfig = 0;
  68. }
  69. }
  70. #if BLUE_LED_TEST_ENANBLE
  71. void app_config_LED(void)
  72. {
  73. static uint8_t state = 0;
  74. switch(state){
  75. case 0:
  76. Process_SetHoldOn(app_config_LED,1);
  77. LED_Start(LED_CONFIG,COLOR_BLUE);
  78. state = 1;
  79. Process_UpdatePeroid(app_config_LED,2000);
  80. break;
  81. case 1:
  82. Process_UpdatePeroid(app_config_LED,0);
  83. LED_Stop(LED_CONFIG);
  84. state = 0;
  85. Process_SetHoldOn(app_config_LED,0);
  86. Process_Stop(app_config_LED);
  87. break;
  88. default:state=0;Process_UpdatePeroid(app_config_LED,0);break;
  89. }
  90. }
  91. #endif
  92. void cb_UART0_R_CONFIG_ASK(void* handle)
  93. { //从机接收到配对申请
  94. UART0_Rx_t* target = handle;
  95. uint8_t mac[6];
  96. char buf[16];
  97. uint8_t ret = 0;
  98. if(app_charge_Getstate()==BLE_Client_T_CHARGE_PULLOUT) return; //非充电模式不匹配
  99. if(mFlash.isHost){
  100. return; //防止主机自发自收
  101. }
  102. for(int i=0;i<6;i++) mac[i] = target->pDat[i];
  103. uint16_t hv = ((uint16_t)target->pDat[6]<<8)| ((uint16_t)target->pDat[7]<<0);
  104. uint16_t sv = ((uint16_t)target->pDat[8]<<8)| ((uint16_t)target->pDat[9]<<0);
  105. if(slave_isconnect()) slave_disconnect();
  106. else advertising_stop();
  107. UART0_Initialize(PIN_TXD_BLE,UART0_INVALID_PIN,UART_HZ);
  108. for(int i=0; i < 10; i++){
  109. UART0_Config_Send(UART0_T_CONFIG_ACK);//应答主机申请
  110. }
  111. UART0_Initialize(UART0_INVALID_PIN,PIN_RXD_BLE,UART_HZ);
  112. mFlash.mClient.isConfig = 'C';
  113. if(mBackup.isConfig != mFlash.mClient.isConfig)ret = 1;
  114. for(int i=0;i<6;i++){
  115. mFlash.mClient.macAddr[i] = mAddr.addr[5-i]; //从机自身mac地址
  116. mFlash.macHost[i] = mac[i]; //主机发过来的mac地址
  117. if(mBackup.macAddr_L[i]!=mFlash.macHost[i]) ret = 1;
  118. if(mBackup.macAddr_R[i]!=mFlash.mClient.macAddr[i]) ret = 1;
  119. }
  120. mFlash.mClient.hardVersion = hv;
  121. mFlash.mClient.sotfVersion = sv;
  122. if( mBackup.hardVersion != mFlash.mClient.hardVersion) ret = 1;
  123. if( mBackup.sotfVersion != mFlash.mClient.sotfVersion) ret = 1;
  124. SEGGER_RTT_printf(0,"mFlash.mClient.hardVersion:%X\n",mFlash.mClient.hardVersion);
  125. SEGGER_RTT_printf(0,"mFlash.mClient.sotfVersion:%X\n",mFlash.mClient.sotfVersion);
  126. SEGGER_RTT_printf(0,"mFlash.mClient.macAddr:%02X %02X %02X %02X %02X %02X\n",mFlash.mClient.macAddr[0],mFlash.mClient.macAddr[1],mFlash.mClient.macAddr[2],mFlash.mClient.macAddr[3],mFlash.mClient.macAddr[4],mFlash.mClient.macAddr[5]);
  127. SEGGER_RTT_printf(0,"mFlash.macHost:%02X %02X %02X %02X %02X %02X\n",mFlash.macHost[0],mFlash.macHost[1],mFlash.macHost[2],mFlash.macHost[3],mFlash.macHost[4],mFlash.macHost[5]);
  128. #if BLUE_LED_TEST_ENANBLE
  129. Process_Start(0,"config_LED",app_config_LED);
  130. #endif
  131. memset(buf,0,16);
  132. sprintf(buf,"%02X%02X%02X%02X%02X%02X",mFlash.macHost[0],mFlash.macHost[1],mFlash.macHost[2],mFlash.mClient.macAddr[3],mFlash.mClient.macAddr[4],mFlash.mClient.macAddr[5]);
  133. SEGGER_RTT_printf(0,"advName(%d):%s\n",strlen(buf),buf);
  134. slave_set_adv_name(buf,strlen(buf));
  135. slave_adv_init();
  136. if(ret >=1){
  137. for(int i=0;i<6;i++){
  138. mBackup.macAddr_L[i] = mFlash.macHost[i]; //主机地址
  139. mBackup.macAddr_R[i] = mFlash.mClient.macAddr[i];//从机地址
  140. }
  141. mBackup.hardVersion = mFlash.mClient.hardVersion;
  142. mBackup.sotfVersion = mFlash.mClient.sotfVersion;
  143. mBackup.isConfig = mFlash.mClient.isConfig;
  144. //SEGGER_RTT_printf(0,"AAAAAbackup config:%d,hardVersion:%d,sotfVersion:%d\n",mBackup.isConfig,mBackup.hardVersion,mBackup.sotfVersion);
  145. Flash_SaveInfomation();
  146. Flash_SaveBackup();
  147. }
  148. while(slave_isconnect());
  149. advertising_start();
  150. // nrf_gpio_cfg_output(PIN_LED_RUN); nrf_gpio_pin_write(PIN_LED_RUN,LED_SMALL_ENABLE);
  151. }
  152. void cb_UART0_R_CONFIG_ACK(void* handle)
  153. { //主机接收到配对应答
  154. UART0_Rx_t* target = handle;
  155. uint8_t mac[6];
  156. char buf[16];
  157. uint8_t ret = 0;
  158. if(app_charge_Getstate()==BLE_Client_T_CHARGE_PULLOUT) return; //非充电模式不匹配
  159. if(!mFlash.isHost) return; //从机自发自收
  160. for(int i=0;i<6;i++) mac[i] = target->pDat[i];
  161. uint16_t hv = ((uint16_t)target->pDat[6]<<8)| ((uint16_t)target->pDat[7]<<0);
  162. uint16_t sv = ((uint16_t)target->pDat[8]<<8)| ((uint16_t)target->pDat[9]<<0);
  163. isConfig = PAIR_TIMES+1; //已配对,停止配对发送
  164. mFlash.mClient.isConfig = 'C';
  165. if(mBackup.isConfig != mFlash.mClient.isConfig)ret = 1;
  166. for(int i=0;i<6;i++){
  167. mFlash.mClient.macAddr[i] = mac[i]; //收到的从机mac地址
  168. mFlash.macHost[i] = mAddr.addr[5-i]; //主机本身mac地址
  169. if(mBackup.macAddr_L[i]!=mFlash.macHost[i]) ret = 1;
  170. if(mBackup.macAddr_R[i]!=mFlash.mClient.macAddr[i]) ret = 1;
  171. }
  172. mFlash.mClient.hardVersion = hv;
  173. mFlash.mClient.sotfVersion = sv;
  174. if( mBackup.hardVersion != mFlash.mClient.hardVersion) ret = 1;
  175. if( mBackup.sotfVersion != mFlash.mClient.sotfVersion) ret = 1;
  176. SEGGER_RTT_printf(0,"mFlash.mClient.hardVersion:%X\n",mFlash.mClient.hardVersion);
  177. SEGGER_RTT_printf(0,"mFlash.mClient.sotfVersion:%X\n",mFlash.mClient.sotfVersion);
  178. SEGGER_RTT_printf(0,"mFlash.mClient.macAddr:%02X %02X %02X %02X %02X %02X\n",mFlash.mClient.macAddr[0],mFlash.mClient.macAddr[1],mFlash.mClient.macAddr[2],mFlash.mClient.macAddr[3],mFlash.mClient.macAddr[4],mFlash.mClient.macAddr[5]);
  179. SEGGER_RTT_printf(0,"mFlash.macHost:%02X %02X %02X %02X %02X %02X\n",mFlash.macHost[0],mFlash.macHost[1],mFlash.macHost[2],mFlash.macHost[3],mFlash.macHost[4],mFlash.macHost[5]);
  180. #if BLUE_LED_TEST_ENANBLE
  181. Process_Start(0,"config_LED",app_config_LED);
  182. #endif
  183. memset(buf,0,16);
  184. sprintf(buf,"%02X%02X%02X%02X%02X%02X",mFlash.macHost[0],mFlash.macHost[1],mFlash.macHost[2],mFlash.mClient.macAddr[3],mFlash.mClient.macAddr[4],mFlash.mClient.macAddr[5]);
  185. SEGGER_RTT_printf(0,"scanName(%d):%s\n",strlen(buf),buf);
  186. host_set_scan_name(buf,strlen(buf));
  187. if(ret >=1){
  188. for(int i=0;i<6;i++){
  189. mBackup.macAddr_L[i] = mFlash.macHost[i]; //主机地址
  190. mBackup.macAddr_R[i] = mFlash.mClient.macAddr[i];//从机地址
  191. }
  192. mBackup.hardVersion = mFlash.mClient.hardVersion;
  193. mBackup.sotfVersion = mFlash.mClient.sotfVersion;
  194. mBackup.isConfig = mFlash.mClient.isConfig;
  195. //SEGGER_RTT_printf(0,"AAAAAbackup config:%d,hardVersion:%d,sotfVersion:%d\n",mBackup.isConfig,mBackup.hardVersion,mBackup.sotfVersion);
  196. Flash_SaveInfomation();
  197. Flash_SaveBackup();
  198. }
  199. // nrf_gpio_cfg_output(PIN_LED_RUN); nrf_gpio_pin_write(PIN_LED_RUN,LED_SMALL_ENABLE);
  200. }
  201. void app_pair_Init(void)
  202. {
  203. uint32_t err_code = sd_ble_gap_addr_get(&mAddr); APP_ERROR_CHECK(err_code);
  204. Process_Start(100,"app_pair_Process",app_pair_Process);
  205. UART0_Rx_Regist(UART0_R_CONFIG_ASK,cb_UART0_R_CONFIG_ASK);
  206. UART0_Rx_Regist(UART0_R_CONFIG_ACK,cb_UART0_R_CONFIG_ACK);
  207. }