text: /* main.c - Application main entry point */
  
  /*
   * Copyright (c) 2015-2016 Intel Corporation
   *
   * SPDX-License-Identifier: Apache-2.0
   */
  
  #include <zephyr/types.h>
  #include <stddef.h>
  #include <string.h>
  #include <errno.h>
  #include <sys/printk.h>
  #include <sys/byteorder.h>
  #include <zephyr.h>
  
  #include <bluetooth/bluetooth.h>
  #include <bluetooth/hci.h>
  #include <bluetooth/conn.h>
  #include <bluetooth/uuid.h>
  #include <bluetooth/gatt.h>
  #include <bluetooth/services/bas.h>
  #include <bluetooth/services/hrs.h>
  
  struct bt_conn *default_conn;
  
  static const struct bt_data ad[] = {
  	BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
  	BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0x0d, 0x18, 0x0f, 0x18, 0x0a, 0x18),
  };
  
  static void connected(struct bt_conn *conn, uint8_t err)
  {
  	if (err) {
  		printk("Connection failed (err 0x%02x)\n", err);
  	} else {
  		default_conn = bt_conn_ref(conn);
  		printk("Connected\n");
  	}
  }
  
  static void disconnected(struct bt_conn *conn, uint8_t reason)
  {
  	printk("Disconnected (reason 0x%02x)\n", reason);
  
  	if (default_conn) {
  		bt_conn_unref(default_conn);
  		default_conn = NULL;
  	}
  }
  
  static struct bt_conn_cb conn_callbacks = {
  	.connected = connected,
  	.disconnected = disconnected,
  };
  
  static void bt_ready(void)
  {
  	int err;
  
  	printk("Bluetooth initialized\n");
  
  	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;
  	}
  
  	printk("Advertising successfully started\n");
  }
  
  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_cb_display = {
  	.cancel = auth_cancel,
  };
  
  static void bas_notify(void)
  {
  	uint8_t battery_level = bt_gatt_bas_get_battery_level();
  
  	battery_level--;
  
  	if (!battery_level) {
  		battery_level = 100U;
  	}
  
  	bt_gatt_bas_set_battery_level(battery_level);
  }
  
  static void hrs_notify(void)
  {
  	static uint8_t heartrate = 90U;
  
  	/* Heartrate measurements simulation */
  	heartrate++;
  	if (heartrate == 160U) {
  		heartrate = 90U;
  	}
  
  	bt_gatt_hrs_notify(heartrate);
  }
  
  void main(void)
  {
  	int err;
  
  	err = bt_enable(NULL);
  	if (err) {
  		printk("Bluetooth init failed (err %d)\n", err);
  		return;
  	}
  
  	bt_ready();
  
  	bt_conn_cb_register(&conn_callbacks);
  	bt_conn_auth_cb_register(&auth_cb_display);
  
  	/* Implement notification. At the moment there is no suitable way
  	 * of starting delayed work so we do it here
  	 */
  	while (1) {
  		k_sleep(K_SECONDS(1));
  
  		/* Heartrate measurements simulation */
  		hrs_notify();
  
  		/* Battery level simulation */
  		bas_notify();
  	}
  }
  