text: /** @file
   *  @brief GAP Service sample
   */
  
  /*
   * Copyright (c) 2016 Intel Corporation
   *
   * SPDX-License-Identifier: Apache-2.0
   */
  
  #include <zephyr/types.h>
  #include <stddef.h>
  #include <string.h>
  #include <errno.h>
  #include <misc/printk.h>
  #include <misc/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>
  
  static const char *gap_name;
  static u16_t gap_appearance;
  
  static ssize_t read_name(struct bt_conn *conn, const struct bt_gatt_attr *attr,
  			 void *buf, u16_t len, u16_t offset)
  {
  	return bt_gatt_attr_read(conn, attr, buf, len, offset, gap_name,
  				 strlen(gap_name));
  }
  
  static ssize_t read_appearance(struct bt_conn *conn,
  			       const struct bt_gatt_attr *attr, void *buf,
  			       u16_t len, u16_t offset)
  {
  	u16_t appearance = sys_cpu_to_le16(gap_appearance);
  
  	return bt_gatt_attr_read(conn, attr, buf, len, offset, &appearance,
  				 sizeof(appearance));
  }
  
  static struct bt_gatt_attr attrs[] = {
  	BT_GATT_PRIMARY_SERVICE(BT_UUID_GAP),
  	BT_GATT_CHARACTERISTIC(BT_UUID_GAP_DEVICE_NAME, BT_GATT_CHRC_READ),
  	BT_GATT_DESCRIPTOR(BT_UUID_GAP_DEVICE_NAME, BT_GATT_PERM_READ,
  			   read_name, NULL, NULL),
  	BT_GATT_CHARACTERISTIC(BT_UUID_GAP_APPEARANCE, BT_GATT_CHRC_READ),
  	BT_GATT_DESCRIPTOR(BT_UUID_GAP_APPEARANCE, BT_GATT_PERM_READ,
  			   read_appearance, NULL, NULL),
  };
  
  void gap_init(const char *name, u16_t appearance)
  {
  	gap_name = name;
  	gap_appearance = appearance;
  
  	bt_gatt_register(attrs, ARRAY_SIZE(attrs));
  }
  