central_gatt_write.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /*
  2. * Copyright (c) 2022 Nordic Semiconductor ASA
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "base/types.h"
  7. #include <bluetooth/bluetooth.h>
  8. #include <bluetooth/conn.h>
  9. #include <bluetooth/gatt.h>
  10. #include <logging/bt_log_impl.h>
  11. extern int mtu_exchange(struct bt_conn *conn);
  12. extern int write_cmd(struct bt_conn *conn);
  13. extern struct bt_conn *conn_connected;
  14. extern uint32_t last_write_rate;
  15. extern void (*start_scan_func)(void);
  16. extern struct bt_conn_cb conn_callbacks;
  17. static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t type,
  18. struct net_buf_simple *ad)
  19. {
  20. char dev[BT_ADDR_LE_STR_LEN];
  21. struct bt_conn *conn;
  22. int err;
  23. bt_addr_le_to_str(addr, dev, sizeof(dev));
  24. printk("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i\n", dev, type, ad->len, rssi);
  25. /* We're only interested in connectable events */
  26. if (type != BT_GAP_ADV_TYPE_ADV_IND && type != BT_GAP_ADV_TYPE_ADV_DIRECT_IND)
  27. {
  28. return;
  29. }
  30. /* connect only to devices in close proximity */
  31. if (rssi < -50)
  32. {
  33. return;
  34. }
  35. err = bt_le_scan_stop();
  36. if (err)
  37. {
  38. printk("%s: Stop LE scan failed (err %d)\n", __func__, err);
  39. return;
  40. }
  41. err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_LE_CONN_PARAM_DEFAULT, &conn);
  42. if (err)
  43. {
  44. printk("%s: Create conn failed (err %d)\n", __func__, err);
  45. start_scan_func();
  46. }
  47. else
  48. {
  49. // bt_conn_unref(conn);
  50. }
  51. }
  52. static void start_scan(void)
  53. {
  54. int err;
  55. err = bt_le_scan_start(BT_LE_SCAN_ACTIVE, device_found);
  56. if (err)
  57. {
  58. printk("%s: Scanning failed to start (err %d)\n", __func__, err);
  59. return;
  60. }
  61. printk("%s: Scanning successfully started\n", __func__);
  62. }
  63. // void mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
  64. // {
  65. // printk("Updated MTU: TX: %d RX: %d bytes\n", tx, rx);
  66. // }
  67. // static struct bt_gatt_cb gatt_callbacks = {
  68. // .att_mtu_updated = mtu_updated
  69. // };
  70. static uint32_t count;
  71. void bt_ready(int err)
  72. {
  73. if (err)
  74. {
  75. printk("Bluetooth init failed (err %d)\n", err);
  76. return;
  77. }
  78. printk("Bluetooth initialized\n");
  79. // bt_gatt_cb_register(&gatt_callbacks);
  80. bt_conn_cb_register(&conn_callbacks);
  81. conn_connected = NULL;
  82. last_write_rate = 0U;
  83. start_scan_func = start_scan;
  84. start_scan_func();
  85. count = 1;
  86. }
  87. void app_polling_work(void)
  88. {
  89. struct bt_conn *conn = conn_connected;
  90. if (conn)
  91. {
  92. if (count)
  93. {
  94. count--;
  95. (void)write_cmd(conn);
  96. }
  97. }
  98. }