ble_comm.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /** @file
  2. *
  3. * @API 文档
  4. *
  5. */
  6. #ifndef __BLE_COMM__
  7. #define __BLE_COMM__
  8. #include "sdk_common.h"
  9. #include "ble_db_discovery.h"
  10. #include "sdk_errors.h"
  11. #include "app_error.h"
  12. #include "app_util.h"
  13. #include "bsp_btn_ble.h"
  14. #include "ble.h"
  15. #include "ble_gap.h"
  16. #include "ble_hci.h"
  17. #include "nrf_sdh.h"
  18. #include "nrf_sdh_ble.h"
  19. #include "nrf_sdh_soc.h"
  20. #include "ble_nus_c.h"
  21. #include "nrf_ble_gatt.h"
  22. #include "nrf_pwr_mgmt.h"
  23. #include "nrf_ble_scan.h"
  24. #include "app_timer.h"
  25. #include "ble_conn_state.h"
  26. #include "SEGGER_RTT.h"
  27. #include "nrf_delay.h"
  28. #include "main.h"
  29. #include "queue.h"
  30. #include "ringframe.h"
  31. #include "ble_advdata.h"
  32. // <<< Use Configuration Wizard in Context Menu >>>\r\n
  33. #define APP_BLE_CONN_CFG_TAG 1
  34. // <q> USE_LADDR - 广播名称是否添加地址后缀
  35. #ifndef USE_LADDR
  36. #define USE_LADDR 1
  37. #endif
  38. // <q> USENAMEFR - 扫描是否采用名字匹配
  39. #ifndef USENAMEFR
  40. #define USENAMEFR 1
  41. #endif
  42. // <q> USEMACNAME - 采用mac地址作为蓝牙名称
  43. #ifndef USEMACNAME
  44. #define USEMACNAME 0
  45. #endif
  46. // <q> USEFIFO - 采用FIFO方式发送
  47. #ifndef USEFIFO
  48. #define USEFIFO 1
  49. #endif
  50. #define TARFET_LEN_MAX NRF_BLE_SCAN_NAME_MAX_LEN
  51. // <q> BLE_PRINTF - 调试信息
  52. #ifndef BLE_PRINTF
  53. #define BLE_PRINTF 0
  54. #endif
  55. #if BLE_PRINTF
  56. #define BLE_PRINT(...) DEBUG_LOG( __VA_ARGS__)
  57. #else
  58. #define BLE_PRINT(...) ;
  59. #endif
  60. #define APP_ERR_BASE 0
  61. /**@brief 各种错误数据类型. */
  62. enum
  63. {
  64. APP_SUCCESS = APP_ERR_BASE,
  65. APP_ERR_DISCONN,
  66. APP_ERR_CONNECTED,
  67. APP_ERR_PARAMERR,
  68. APP_ERR_OVERLENGTH,
  69. APP_ERR_BUSY,
  70. APP_ERROR_RESOURCES,
  71. };
  72. /**@brief 报错函数.
  73. *
  74. * @param[in] err_num 错误代码
  75. *
  76. * @warning
  77. */
  78. void err(int err_num);
  79. /**@brief 扫描到的广播数据包回调事件类型
  80. *
  81. * @param[in] unsigned short 广播数据包的长度
  82. * @param[out] unsigned char * 接收到的完整广播数据包的指针
  83. * @param[in] signed char RSSI
  84. *
  85. * @warning
  86. */
  87. typedef void (*advdata_rep_handler_t)(ble_gap_evt_adv_report_t const * p_adv_report);
  88. /**@brief 数据接收类型
  89. *
  90. * @warning
  91. */
  92. typedef void (*Ble_receive_handler_t)(unsigned char *, int);
  93. /**@brief 蓝牙时间回调类型
  94. *
  95. * @warning
  96. */
  97. typedef void (*Ble_evt_cb)(void);
  98. /**@brief 发送数据到从机
  99. *
  100. * @param[in] bytes 要发送的数据的指针.
  101. * @param[in] len 要发送的数据的长度
  102. *
  103. * @retval 0 操作成功
  104. * @retval 1 发送失败
  105. *
  106. * @warning
  107. */
  108. unsigned int send_bytes_server(uint8_t *bytes, uint16_t len);
  109. /**@brief 发送数据到主机
  110. *
  111. * @param[in] bytes 要发送的数据的指针.
  112. * @param[in] len 要发送的数据的长度
  113. *
  114. * @retval 0 操作成功
  115. * @retval 1 发送失败
  116. *
  117. * @warning
  118. */
  119. unsigned int send_bytes_client(unsigned char *bytes, uint16_t len);
  120. /**@brief 主机初始化
  121. *
  122. * @warning
  123. */
  124. void host_init(Ble_receive_handler_t receive_handler);
  125. /**@brief 从机初始化
  126. *
  127. * @warning
  128. */
  129. void slave_init(Ble_receive_handler_t receive_handler);
  130. /**@brief 从机角色获取链接是否建立
  131. *
  132. * @retval 1 链接已经建立
  133. * @retval 0 链接未建立
  134. *
  135. * @warning
  136. */
  137. unsigned char slave_isconnect(void);
  138. /**@brief 主机角色获取链接是否建立
  139. *
  140. * @retval 1 链接已经建立
  141. * @retval 0 链接未建立
  142. *
  143. * @warning
  144. */
  145. unsigned char host_isconnect(void);
  146. /**@brief 设置扫描名称
  147. *
  148. * @param[in] name 要设置的名称
  149. * @param[in] len 要设置的名称的长度
  150. *
  151. * @retval APP_SUCCESS 操作成功
  152. * @retval APP_ERR_CONNECTED 链接已经建立
  153. * @retval APP_ERR_OVERLENGTH 长度太长
  154. *
  155. * @warning
  156. */
  157. unsigned int host_set_scan_name(char *name, int len);
  158. /**@brief 设置广播名称
  159. *
  160. * @param[in] name 要设置的广播名称
  161. * @param[in] len 要设置的广播名称的长度
  162. *
  163. * @retval APP_SUCCESS 操作成功
  164. *
  165. * @warning
  166. */
  167. unsigned int slave_set_adv_name(char *name, int len);
  168. /**@brief 获取当前正在广播的名称长度
  169. *
  170. * @param[out] len 广播的名称长度
  171. *
  172. * @warning
  173. */
  174. void slave_get_advname_len(int *len);
  175. /**@brief 获取当前正在广播的名称,要和void slave_get_advname_len(int *len);合用
  176. *
  177. * @param[in] len 广播名称的长度
  178. * @param[out] name 广播名称
  179. *
  180. * @warning
  181. */
  182. void slave_get_advname(char *name, int len);
  183. /**@brief 注册一个在连接建立的时候的通知
  184. *
  185. * @param[in] cb 要注册的回调函数指针
  186. *
  187. * @retval -1 要注册的回调已经存在
  188. * @retval 0 注册成功
  189. * @retval -2 注册的队列已经满了
  190. *
  191. * @warning
  192. */
  193. int Ble_Host_Connectd_Evt_Regist(Ble_evt_cb cb);
  194. /**@brief 注册一个在连接断开的时候的通知
  195. *
  196. * @param[in] cb 要注册的回调函数指针
  197. *
  198. * @retval -1 要注册的回调已经存在
  199. * @retval 0 注册成功
  200. * @retval -2 注册的队列已经满了
  201. *
  202. * @warning
  203. */
  204. int Ble_Host_Disconn_Evt_Regist(Ble_evt_cb cb);
  205. /**@brief 注册一个在连接建立的时候的通知
  206. *
  207. * @param[in] cb 要注册的回调函数指针
  208. *
  209. * @retval -1 要注册的回调已经存在
  210. * @retval 0 注册成功
  211. * @retval -2 注册的队列已经满了
  212. *
  213. * @warning
  214. */
  215. int Ble_Slave_Connectd_Evt_Regist(Ble_evt_cb cb);
  216. /**@brief 注册一个在连接断开的时候的通知
  217. *
  218. * @param[in] cb 要注册的回调函数指针
  219. *
  220. * @retval -1 要注册的回调已经存在
  221. * @retval 0 注册成功
  222. * @retval -2 注册的队列已经满了
  223. *
  224. * @warning
  225. */
  226. int Ble_Slave_Disconn_Evt_Regist(Ble_evt_cb cb);
  227. /**@brief 作为主机时申请更新链接间隔
  228. *
  229. * @param[in] min_conn_interval 最小链接间隔
  230. * @param[in] max_conn_interval 最大链接间隔
  231. *
  232. * @retval APP_ERR_PARAMERR 输如的参数错误
  233. * @retval APP_ERR_DISCONN 链接已经断开
  234. *
  235. * @warning
  236. */
  237. unsigned int Ble_update_conn_interval(float min_conn_interval, float max_conn_interval);
  238. /**@brief 作为从机时申请更新链接间隔
  239. *
  240. * @param[in] min_conn_interval 最小链接间隔
  241. * @param[in] max_conn_interval 最大链接间隔
  242. *
  243. * @retval APP_ERR_BUSY 正处在一个申请流程中,此时不接受新的申请
  244. * @retval APP_ERR_PARAMERR 输如的参数错误
  245. * @retval APP_ERR_DISCONN 链接已经断开
  246. *
  247. * @warning
  248. */
  249. unsigned int slave_update_conn_interval_request(float min_conn_interval, float max_conn_interval);
  250. /**@brief 关闭广播
  251. *
  252. * @warning
  253. */
  254. void advertising_stop(void);
  255. /**@brief 开启广播
  256. *
  257. * @warning
  258. */
  259. void advertising_start(void);
  260. /**@brief 开启扫描
  261. *
  262. * @warning
  263. */
  264. void scan_start(void);
  265. //关掉扫描直接调用 void nrf_ble_scan_stop(void);
  266. /**@brief 略
  267. *
  268. * @warning
  269. */
  270. uint8_t Slave_Get7_5ms_interval(void);
  271. /**@brief 作为从机角色的时候主动断开蓝牙链接
  272. *
  273. * @warning
  274. */
  275. void slave_disconnect(void);
  276. /**@brief 作为主机角色的时候主动断开蓝牙链接
  277. *
  278. * @warning
  279. */
  280. void host_disconnect(void);
  281. /**@brief 作为从机角色的时候获取连接参数
  282. *
  283. * @param[out] p 获取到的链接参数的存放指针
  284. *
  285. * @warning
  286. */
  287. void slave_get_conn_params(ble_gap_conn_params_t *p);
  288. /**@brief 作为主机角色的时候获取连接参数
  289. *
  290. * @param[out] p 获取到的链接参数的存放指针
  291. *
  292. * @warning
  293. */
  294. void host_get_conn_params(ble_gap_conn_params_t *p);
  295. /**@brief 从机广播初始化
  296. * @warning
  297. */
  298. void slave_adv_init(void);
  299. /**@brief 作为从机角色的时候获取RSSI
  300. *
  301. * @retval 获取到的RSSI
  302. *
  303. * @warning
  304. */
  305. signed char slave_get_rssi(void);
  306. /**@brief 作为主机角色的时候获取RSSI
  307. *
  308. * @retval 获取到的RSSI
  309. *
  310. * @warning
  311. */
  312. signed char host_get_rssi(void);
  313. /**@brief 运动算法处理
  314. *
  315. * @param[in] IS_HOST 是否是左鞋.
  316. * @param[in] time_stamp 时间戳.
  317. * @param[in] _acc 加速度.
  318. * @param[in] _gry 陀螺仪.
  319. * @param[in] front_mag 前磁力计.
  320. * @param[in] back_mag 后磁力计.
  321. * @param[in] _rssi 信号强度.
  322. *
  323. * @warning
  324. */
  325. void IMU_Process_motion_queue(uint8_t IS_HOST, int32_t time_stamp, int16_t* _acc,int16_t* _gry, int16_t* front_mag, int16_t* back_mag, uint8_t _rssi);
  326. /**@brief 对齐功能驱动
  327. *
  328. * @details
  329. * @warning
  330. */
  331. void IMU_Rec_data(uint8_t* pdat,uint8_t len);
  332. /**@brief IMU_Dtalige 对齐函数
  333. * @warning
  334. */
  335. void IMU_Dtalige(void);
  336. /**@brief 打开原始数据上传模式
  337. * @warning
  338. */
  339. void IMU_Dtalige_Rowdata_ON(void);
  340. /**@brief 关闭原始数据上传模式
  341. * @warning
  342. */
  343. void IMU_Dtalige_Rowdata_OFF(void);
  344. /**@brief 这个函数是在系统大循环中调的
  345. *
  346. * @warning
  347. */
  348. void send_bytes_client_pcs(void);
  349. /**@brief Function for searching through encoded Advertising data for a complete local name.
  350. *
  351. * @param[in] p_encoded_data Data buffer containing the encoded Advertising data.
  352. * @param[in] data_len Length of the data buffer \p p_encoded_data.
  353. * @param[in] p_target_name Name to search for.
  354. *
  355. * @retval true If \p p_target_name was found among \p p_encoded_data, as a complete local name.
  356. * @retval false If \p p_target_name was not found among \p p_encoded_data, or if \p p_encoded_data
  357. * or \p p_target_name was NULL.
  358. */
  359. bool advdata_name_find(uint8_t const * p_encoded_data,
  360. uint16_t data_len,
  361. char const * p_target_name);
  362. /**@brief Function for searching through encoded Advertising data for a device shortened name.
  363. *
  364. * @param[in] p_encoded_data Data buffer containing the encoded Advertising data.
  365. * @param[in] data_len Length of the data buffer \p p_encoded_data.
  366. * @param[in] p_target_name Name to search for.
  367. * @param[in] short_name_min_len Minimum length of the shortened name.
  368. * For example, if the advertising data has a shortened name 'No' and this parameter is
  369. * set to 4 with a target_name set to Nordic_XXX it will return false, but if
  370. * the shortened name in the advertising data is 'Nord', it will return true.
  371. * @note: If the shortened name in the Advertising data has the same length as the target name,
  372. * this function will return false, since this means that the complete name is actually
  373. * longer, thus different than the target name.
  374. *
  375. * @retval true If \p p_target_name was found among \p p_encoded_data, as short local name.
  376. * @retval false If \p p_target_name was not found among \p p_encoded_data, or if \p p_encoded_data
  377. * or \p p_target_name was NULL.
  378. */
  379. bool advdata_short_name_find(uint8_t const * p_encoded_data,
  380. uint16_t data_len,
  381. char const * p_target_name,
  382. uint8_t const short_name_min_len);
  383. /**@brief 这个函数用来注册收到广播数据包时候的事件.
  384. *
  385. * @param[in] handler 需要注册的回调函数的函数指针
  386. *
  387. * @note: 此函数每次调用都会覆盖上一次的注册的handler,建议只调用一次,注册成功后会在每次收到广播数据包以后产生事件回调。
  388. *
  389. */
  390. void advdata_report_Evt_Regist(advdata_rep_handler_t handler);
  391. /**@brief 关闭扫描
  392. * @warning
  393. */
  394. void ST_scan_stop(void);
  395. /**@brief 无条件打开扫描
  396. * @warning
  397. *
  398. * @retval APP_ERROR_RESOURCES radio占用过多,先关闭一个或多个链路后再打开就好了
  399. * @retval APP_SUCCESS 操作成功
  400. *
  401. * @note:
  402. */
  403. unsigned int ST_scan_start(void);
  404. /**@brief 获取本机mac地址,*mac提供的内存长度必须大于6个字节否则内存溢出
  405. * @warning
  406. *
  407. * @note:
  408. */
  409. void Get_MACaddr(unsigned char *mac);
  410. /**@brief 主机端连接成功,获取对方蓝牙的地址
  411. * @warning
  412. *
  413. * @retval 对方蓝牙地址
  414. */
  415. uint8_t * HostConnted_peer_addr(void);
  416. /**@brief 从机端连接成功,获取对方蓝牙的地址
  417. * @warning
  418. *
  419. * @retval 对方蓝牙地址
  420. */
  421. uint8_t * ClientConnted_peer_addr(void);
  422. void SetScanResponse(uint8_t charge,uint8_t config);
  423. void advdata_report_Evt_del(advdata_rep_handler_t handler);
  424. int Continuous_scan_start(void);
  425. #endif