/* * Copyright (c) 2022 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include extern int mtu_exchange(struct bt_conn *conn); extern int write_cmd(struct bt_conn *conn); extern struct bt_conn *conn_connected; extern uint32_t last_write_rate; extern void (*start_scan_func)(void); static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t type, struct net_buf_simple *ad) { char dev[BT_ADDR_LE_STR_LEN]; struct bt_conn *conn; int err; bt_addr_le_to_str(addr, dev, sizeof(dev)); printk("[DEVICE]: %s, AD evt type %u, AD data len %u, RSSI %i\n", dev, type, ad->len, rssi); /* We're only interested in connectable events */ if (type != BT_GAP_ADV_TYPE_ADV_IND && type != BT_GAP_ADV_TYPE_ADV_DIRECT_IND) { return; } /* connect only to devices in close proximity */ if (rssi < -50) { return; } err = bt_le_scan_stop(); if (err) { printk("%s: Stop LE scan failed (err %d)\n", __func__, err); return; } err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_LE_CONN_PARAM_DEFAULT, &conn); if (err) { printk("%s: Create conn failed (err %d)\n", __func__, err); start_scan_func(); } else { bt_conn_unref(conn); } } static void start_scan(void) { int err; err = bt_le_scan_start(BT_LE_SCAN_ACTIVE, device_found); if (err) { printk("%s: Scanning failed to start (err %d)\n", __func__, err); return; } printk("%s: Scanning successfully started\n", __func__); } void mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx) { printk("Updated MTU: TX: %d RX: %d bytes\n", tx, rx); } static struct bt_gatt_cb gatt_callbacks = { .att_mtu_updated = mtu_updated }; uint32_t central_gatt_write(uint32_t count) { int err; err = bt_enable(NULL); if (err) { printk("Bluetooth init failed (err %d)\n", err); return 0U; } printk("Bluetooth initialized\n"); bt_gatt_cb_register(&gatt_callbacks); conn_connected = NULL; last_write_rate = 0U; start_scan_func = start_scan; start_scan_func(); while (true) { struct bt_conn *conn = NULL; if (conn_connected) { /* Get a connection reference to ensure that a * reference is maintained in case disconnected * callback is called while we perform GATT Write * command. */ conn = bt_conn_ref(conn_connected); } if (conn) { (void)write_cmd(conn); bt_conn_unref(conn); if (count) { count--; if (!count) { break; } } k_yield(); } else { k_sleep(K_SECONDS(1)); } } return last_write_rate; }