| /* main.c - Application main entry point */ |
| |
| /* |
| * Copyright (c) 2023 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/kernel.h> |
| #include <zephyr/device.h> |
| |
| #include <zephyr/drivers/gpio.h> |
| |
| #include <zephyr/sys/util.h> |
| #include <zephyr/sys/printk.h> |
| |
| #include <zephyr/bluetooth/conn.h> |
| |
| #include <zephyr/logging/log.h> |
| |
| #include "common.h" |
| |
| LOG_MODULE_DECLARE(ead_peripheral_sample, CONFIG_BT_EAD_LOG_LEVEL); |
| |
| /* |
| * Get button configuration from the devicetree sw0 alias. This is mandatory. |
| */ |
| #define SW0_NODE DT_ALIAS(sw0) |
| #if !DT_NODE_HAS_STATUS(SW0_NODE, okay) |
| #error "Unsupported board: sw0 devicetree alias is not defined" |
| #endif |
| static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET_OR(SW0_NODE, gpios, {0}); |
| static struct gpio_callback button_cb_data; |
| |
| extern int run_peripheral_sample(int get_passkey_confirmation(struct bt_conn *conn)); |
| |
| static struct k_poll_signal button_pressed_signal; |
| |
| static void button_pressed(const struct device *dev, struct gpio_callback *cb, uint32_t pins) |
| { |
| LOG_DBG("Button pressed..."); |
| |
| k_poll_signal_raise(&button_pressed_signal, 0); |
| k_sleep(K_SECONDS(1)); |
| k_poll_signal_reset(&button_pressed_signal); |
| } |
| |
| static int get_passkey_confirmation(struct bt_conn *conn) |
| { |
| int err; |
| |
| printk("Confirm passkey by pressing button at %s pin %d...\n", button.port->name, |
| button.pin); |
| |
| await_signal(&button_pressed_signal); |
| |
| err = bt_conn_auth_passkey_confirm(conn); |
| if (err) { |
| LOG_DBG("Failed to confirm passkey."); |
| return -1; |
| } |
| |
| printk("Passkey confirmed.\n"); |
| |
| return 0; |
| } |
| |
| static int setup_btn(void) |
| { |
| int ret; |
| |
| k_poll_signal_init(&button_pressed_signal); |
| |
| if (!gpio_is_ready_dt(&button)) { |
| LOG_ERR("Error: button device %s is not ready", button.port->name); |
| return -1; |
| } |
| |
| ret = gpio_pin_configure_dt(&button, GPIO_INPUT); |
| if (ret != 0) { |
| LOG_ERR("Error %d: failed to configure %s pin %d", ret, button.port->name, |
| button.pin); |
| return -1; |
| } |
| |
| ret = gpio_pin_interrupt_configure_dt(&button, GPIO_INT_EDGE_TO_ACTIVE); |
| if (ret != 0) { |
| LOG_ERR("Error %d: failed to configure interrupt on %s pin %d", ret, |
| button.port->name, button.pin); |
| return -1; |
| } |
| |
| gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin)); |
| gpio_add_callback(button.port, &button_cb_data); |
| LOG_DBG("Set up button at %s pin %d", button.port->name, button.pin); |
| |
| return 0; |
| } |
| |
| int main(void) |
| { |
| int err; |
| |
| err = setup_btn(); |
| if (err) { |
| return 0; |
| } |
| |
| LOG_DBG("Starting peripheral sample..."); |
| |
| (void)run_peripheral_sample(get_passkey_confirmation); |
| return 0; |
| } |