| /* |
| * Copyright (c) 2022 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/kernel.h> |
| #include <zephyr/sys/printk.h> |
| |
| #include <zephyr/bluetooth/bluetooth.h> |
| #include <zephyr/bluetooth/conn.h> |
| #include <zephyr/bluetooth/gatt.h> |
| |
| 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; |
| } |