/* * Copyright (c) 2022 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #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; static const struct bt_data ad[] = { BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)), }; static void mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx) { printk("Updated MTU: TX: %d RX: %d bytes\n", tx, rx); } #if defined(CONFIG_BT_SMP) static void auth_cancel(struct bt_conn *conn) { char addr[BT_ADDR_LE_STR_LEN]; bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr)); printk("Pairing cancelled: %s\n", addr); } static struct bt_conn_auth_cb auth_callbacks = { .cancel = auth_cancel, }; #endif /* CONFIG_BT_SMP */ static struct bt_gatt_cb gatt_callbacks = { .att_mtu_updated = mtu_updated }; uint32_t peripheral_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); #if defined(CONFIG_BT_SMP) (void)bt_conn_auth_cb_register(&auth_callbacks); #endif /* CONFIG_BT_SMP */ err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), NULL, 0); if (err) { printk("Advertising failed to start (err %d)\n", err); return 0U; } printk("Advertising successfully started\n"); conn_connected = NULL; last_write_rate = 0U; 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) { 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; }