app_pair.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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,9600);
  50. else UART0_Initialize(UART0_INVALID_PIN,PIN_RXD_BLE,9600);
  51. flag = 1;
  52. }
  53. else if(isConfig<PAIR_TIMES){ isConfig++;
  54. if(mFlash.isHost){ //充电模式下主机主机申请配对
  55. UART0_Initialize(PIN_TXD_BLE,PIN_RXD_BLE,9600);
  56. UART0_Config_Send(UART0_T_CONFIG_ASK);
  57. UART0_Initialize(UART0_INVALID_PIN,PIN_RXD_BLE,9600);
  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. void app_config_LED(void)
  71. {
  72. static uint8_t state = 0;
  73. switch(state){
  74. case 0:
  75. Process_SetHoldOn(app_config_LED,1);
  76. LED_SetColor(LED_CONFIG,COLOR_BLUE);
  77. LED_Start(LED_CONFIG);
  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. void cb_UART0_R_CONFIG_ASK(void* handle)
  92. { //从机接收到配对申请
  93. UART0_Rx_t* target = handle;
  94. uint8_t mac[6];
  95. char buf[16];
  96. uint8_t ret = 0;
  97. if(app_charge_Getstate()==BLE_Client_T_CHARGE_PULLOUT) return; //非充电模式不匹配
  98. if(mFlash.isHost){
  99. return; //防止主机自发自收
  100. }
  101. for(int i=0;i<6;i++) mac[i] = target->pDat[i];
  102. uint16_t hv = ((uint16_t)target->pDat[6]<<8)| ((uint16_t)target->pDat[7]<<0);
  103. uint16_t sv = ((uint16_t)target->pDat[8]<<8)| ((uint16_t)target->pDat[9]<<0);
  104. if(slave_isconnect()) slave_disconnect();
  105. else advertising_stop();
  106. UART0_Initialize(PIN_TXD_BLE,UART0_INVALID_PIN,9600);
  107. UART0_Config_Send(UART0_T_CONFIG_ACK);//应答主机申请
  108. UART0_Initialize(UART0_INVALID_PIN,PIN_RXD_BLE,9600);
  109. mFlash.mClient.isConfig = 'C';
  110. if(mBackup.isConfig != mFlash.mClient.isConfig)ret = 1;
  111. for(int i=0;i<6;i++){
  112. mFlash.mClient.macAddr[i] = mAddr.addr[5-i]; //从机自身mac地址
  113. mFlash.macHost[i] = mac[i]; //主机发过来的mac地址
  114. if(mBackup.macAddr_L[i]!=mFlash.macHost[i]) ret = 1;
  115. if(mBackup.macAddr_R[i]!=mFlash.mClient.macAddr[i]) ret = 1;
  116. }
  117. mFlash.mClient.hardVersion = hv;
  118. mFlash.mClient.sotfVersion = sv;
  119. if( mBackup.hardVersion != mFlash.mClient.hardVersion) ret = 1;
  120. if( mBackup.sotfVersion != mFlash.mClient.sotfVersion) ret = 1;
  121. SEGGER_RTT_printf(0,"mFlash.mClient.hardVersion:%X\n",mFlash.mClient.hardVersion);
  122. SEGGER_RTT_printf(0,"mFlash.mClient.sotfVersion:%X\n",mFlash.mClient.sotfVersion);
  123. 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]);
  124. 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]);
  125. Process_Start(0,"config_LED",app_config_LED);
  126. memset(buf,0,16);
  127. 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]);
  128. SEGGER_RTT_printf(0,"advName(%d):%s\n",strlen(buf),buf);
  129. slave_set_adv_name(buf,strlen(buf));
  130. slave_adv_init();
  131. if(ret >=1){
  132. for(int i=0;i<6;i++){
  133. mBackup.macAddr_L[i] = mFlash.macHost[i]; //主机地址
  134. mBackup.macAddr_R[i] = mFlash.mClient.macAddr[i];//从机地址
  135. }
  136. mBackup.hardVersion = mFlash.mClient.hardVersion;
  137. mBackup.sotfVersion = mFlash.mClient.sotfVersion;
  138. mBackup.isConfig = mFlash.mClient.isConfig;
  139. //SEGGER_RTT_printf(0,"AAAAAbackup config:%d,hardVersion:%d,sotfVersion:%d\n",mBackup.isConfig,mBackup.hardVersion,mBackup.sotfVersion);
  140. Flash_SaveInfomation();
  141. Flash_SaveBackup();
  142. }
  143. while(slave_isconnect());
  144. advertising_start();
  145. // nrf_gpio_cfg_output(PIN_LED_RUN); nrf_gpio_pin_write(PIN_LED_RUN,LED_SMALL_ENABLE);
  146. }
  147. void cb_UART0_R_CONFIG_ACK(void* handle)
  148. { //主机接收到配对应答
  149. UART0_Rx_t* target = handle;
  150. uint8_t mac[6];
  151. char buf[16];
  152. uint8_t ret = 0;
  153. if(app_charge_Getstate()==BLE_Client_T_CHARGE_PULLOUT) return; //非充电模式不匹配
  154. if(!mFlash.isHost) return; //从机自发自收
  155. for(int i=0;i<6;i++) mac[i] = target->pDat[i];
  156. uint16_t hv = ((uint16_t)target->pDat[6]<<8)| ((uint16_t)target->pDat[7]<<0);
  157. uint16_t sv = ((uint16_t)target->pDat[8]<<8)| ((uint16_t)target->pDat[9]<<0);
  158. isConfig = PAIR_TIMES+1; //已配对,停止配对发送
  159. mFlash.mClient.isConfig = 'C';
  160. if(mBackup.isConfig != mFlash.mClient.isConfig)ret = 1;
  161. for(int i=0;i<6;i++){
  162. mFlash.mClient.macAddr[i] = mac[i]; //收到的从机mac地址
  163. mFlash.macHost[i] = mAddr.addr[5-i]; //主机本身mac地址
  164. if(mBackup.macAddr_L[i]!=mFlash.macHost[i]) ret = 1;
  165. if(mBackup.macAddr_R[i]!=mFlash.mClient.macAddr[i]) ret = 1;
  166. }
  167. mFlash.mClient.hardVersion = hv;
  168. mFlash.mClient.sotfVersion = sv;
  169. if( mBackup.hardVersion != mFlash.mClient.hardVersion) ret = 1;
  170. if( mBackup.sotfVersion != mFlash.mClient.sotfVersion) ret = 1;
  171. SEGGER_RTT_printf(0,"mFlash.mClient.hardVersion:%X\n",mFlash.mClient.hardVersion);
  172. SEGGER_RTT_printf(0,"mFlash.mClient.sotfVersion:%X\n",mFlash.mClient.sotfVersion);
  173. 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]);
  174. 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]);
  175. Process_Start(0,"config_LED",app_config_LED);
  176. memset(buf,0,16);
  177. 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]);
  178. SEGGER_RTT_printf(0,"scanName(%d):%s\n",strlen(buf),buf);
  179. host_set_scan_name(buf,strlen(buf));
  180. if(ret >=1){
  181. for(int i=0;i<6;i++){
  182. mBackup.macAddr_L[i] = mFlash.macHost[i]; //主机地址
  183. mBackup.macAddr_R[i] = mFlash.mClient.macAddr[i];//从机地址
  184. }
  185. mBackup.hardVersion = mFlash.mClient.hardVersion;
  186. mBackup.sotfVersion = mFlash.mClient.sotfVersion;
  187. mBackup.isConfig = mFlash.mClient.isConfig;
  188. //SEGGER_RTT_printf(0,"AAAAAbackup config:%d,hardVersion:%d,sotfVersion:%d\n",mBackup.isConfig,mBackup.hardVersion,mBackup.sotfVersion);
  189. Flash_SaveInfomation();
  190. Flash_SaveBackup();
  191. }
  192. // nrf_gpio_cfg_output(PIN_LED_RUN); nrf_gpio_pin_write(PIN_LED_RUN,LED_SMALL_ENABLE);
  193. }
  194. void app_pair_Init(void)
  195. {
  196. uint32_t err_code = sd_ble_gap_addr_get(&mAddr); APP_ERROR_CHECK(err_code);
  197. Process_Start(100,"app_pair_Process",app_pair_Process);
  198. UART0_Rx_Regist(UART0_R_CONFIG_ASK,cb_UART0_R_CONFIG_ASK);
  199. UART0_Rx_Regist(UART0_R_CONFIG_ACK,cb_UART0_R_CONFIG_ACK);
  200. }