/**
 * Copyright (c) 2019 Oticon A/S
 *
 * SPDX-License-Identifier: Apache-2.0
 */
/**
 * @brief GATT Macros
 *
 *  This code is auto-generated from the Excel Workbook
 *  'GATT_Qualification_Test_Databases.xlsm' Sheet: 'Large Database 1'
 *
 *  Feel free to change it - but be aware that your changes might be
 *  overwritten at the next generation...
 */

#ifndef GATT_MACS_H
#define GATT_MACS_H

#ifdef __cplusplus
extern "C" {
#endif

#include <zephyr/bluetooth/gatt.h>

/** @def BT_GATT_H_ATTRIBUTE
 *  @brief Attribute Declaration Macro.
 *
 *  Helper macro to declare an attribute.
 *
 *  @param _uuid   Attribute uuid.
 *  @param _perm   Attribute access permissions.
 *  @param _read   Attribute read callback.
 *  @param _write  Attribute write callback.
 *  @param _value  Attribute value.
 *  @param _handle Attribute handle.
 */
#define BT_GATT_H_ATTRIBUTE(_uuid, _perm, _read, _write, _value, _handle) \
	{ \
	.uuid = _uuid, \
	.perm = _perm, \
	.read = _read, \
	.write = _write, \
	.user_data = _value, \
	.handle = _handle \
	}

/** @def BT_GATT_H_CHARACTERISTIC
 *  @brief Characteristic and Value Declaration Macro.
 *
 *  Helper macro to declare a characteristic attribute along with its attribute
 *  value.
 *
 *  @param _uuid   Characteristic attribute uuid.
 *  @param _props  Characteristic attribute properties.
 *  @param _perm   Characteristic attribute access permissions.
 *  @param _read   Characteristic attribute read callback.
 *  @param _write  Characteristic attribute write callback.
 *  @param _value  Characteristic attribute value.
 *  @param _handle Characteristic attribute handle.
 */
#define BT_GATT_H_CHARACTERISTIC(_uuid, _props, _perm, _read, _write, _value,\
			       _handle) \
	BT_GATT_H_ATTRIBUTE(BT_UUID_GATT_CHRC, \
			  BT_GATT_PERM_READ, \
			  bt_gatt_attr_read_chrc, \
			  NULL, \
			  (&(struct bt_gatt_chrc) {.uuid = _uuid, \
						   .properties = _props \
						  }), \
			  _handle), \
	BT_GATT_H_ATTRIBUTE(_uuid, _perm, _read, _write, _value, _handle + 1)

/** @def BT_GATT_H_PRIMARY_SERVICE
 *  @brief Primary Service Declaration Macro.
 *
 *  Helper macro to declare a primary service attribute.
 *
 *  @param _service Service attribute value.
 *  @param _handle  Service attribute handle.
 */
#define BT_GATT_H_PRIMARY_SERVICE(_service, _handle) \
		BT_GATT_H_ATTRIBUTE(BT_UUID_GATT_PRIMARY, \
				BT_GATT_PERM_READ, \
				bt_gatt_attr_read_service, \
				NULL, \
				_service, \
				_handle)

/** @def BT_GATT_H_SECONDARY_SERVICE
 *  @brief Secondary Service Declaration Macro.
 *
 *  Helper macro to declare a secondary service attribute.
 *
 *  @param _service Service attribute value.
 *  @param _handle  Service attribute handle.
 */
#define BT_GATT_H_SECONDARY_SERVICE(_service, _handle) \
		BT_GATT_H_ATTRIBUTE(BT_UUID_GATT_SECONDARY, \
				BT_GATT_PERM_READ, \
				bt_gatt_attr_read_service, \
				NULL, \
				_service, \
				_handle)

/** @def BT_GATT_H_INCLUDE_SERVICE
 *  @brief Include Service Declaration Macro.
 *
 *  Helper macro to declare database internal include service attribute.
 *
 *  @param _service_incl The first service attribute of service to include.
 *  @param _handle       Service attribute handle.
 */
#define BT_GATT_H_INCLUDE_SERVICE(_service_incl, _handle) \
		BT_GATT_H_ATTRIBUTE(BT_UUID_GATT_INCLUDE, \
				BT_GATT_PERM_READ, \
				bt_gatt_attr_read_included, \
				NULL, \
				_service_incl, \
				_handle)

/** @def BT_GATT_H_DESCRIPTOR
 *  @brief Descriptor Declaration Macro.
 *
 *  Helper macro to declare a descriptor attribute.
 *
 *  @param _uuid   Descriptor attribute uuid.
 *  @param _perm   Descriptor attribute access permissions.
 *  @param _read   Descriptor attribute read callback.
 *  @param _write  Descriptor attribute write callback.
 *  @param _value  Descriptor attribute value.
 *  @param _handle Descriptor attribute handle.
 */
#define BT_GATT_H_DESCRIPTOR(_uuid, _perm, _read, _write, _value, _handle) \
	       BT_GATT_H_ATTRIBUTE(_uuid, _perm, _read, _write, _value, _handle)

/** @def BT_GATT_H_MANAGED
 *  @brief Managed Client Characteristic Configuration Declaration Macro.
 *
 *  Helper macro to declare a Managed CCC attribute.
 *
 *  @param _ccc    CCC attribute user data, shall point to a _bt_gatt_ccc.
 *  @param _perm   CCC access permissions.
 *  @param _handle Descriptor attribute handle.
 */
#define BT_GATT_H_MANAGED(_ccc, _perm, _handle) \
		BT_GATT_H_ATTRIBUTE(BT_UUID_GATT_CCC, _perm,\
		bt_gatt_attr_read_ccc, bt_gatt_attr_write_ccc, _ccc, _handle)

/** @def BT_GATT_H_CCC
 *  @brief Client Characteristic Configuration Change Declaration Macro.
 *
 *  Helper macro to declare a CCC attribute.
 *
 *  @param _cfg         Initial configuration.
 *  @param _cfg_changed Configuration changed callback.
 *  @param _handle      Descriptor attribute handle.
 */
/* #undef  BT_GATT_H_CCC
 *  #define BT_GATT_H_CCC(_cfg, _cfg_changed, _handle) \
 *     BT_GATT_H_DESCRIPTOR(BT_UUID_GATT_CCC, \
 *         BT_GATT_PERM_READ | BT_GATT_PERM_WRITE, \
 *         bt_gatt_attr_read_ccc, \
 *         bt_gatt_attr_write_ccc, \
 *         (&(struct _bt_gatt_ccc) { \
 *             .cfg = _cfg, \
 *             .cfg_len = ARRAY_SIZE(_cfg), \
 *             .cfg_changed = _cfg_changed \
 *         } ), \
 *         _handle)
 */
/** @def BT_GATT_H_CCC
 *  @brief Client Characteristic Configuration Change Declaration Macro.
 *
 *  Helper macro to declare a CCC attribute.
 *
 *  @param _cfg         Initial configuration.
 *  @param _cfg_changed Configuration changed callback.
 *  @param _handle      Descriptor attribute handle.
 */
#define BT_GATT_H_CCC(_cfg, _cfg_changed, _handle) \
		BT_GATT_H_MANAGED((&(struct _bt_gatt_ccc) \
			BT_GATT_CCC_INITIALIZER(_cfg_changed, NULL, NULL)),\
			BT_GATT_PERM_READ | BT_GATT_PERM_WRITE, _handle)

/** @def BT_GATT_H_CEP
 *  @brief Characteristic Extended Properties Declaration Macro.
 *
 *  Helper macro to declare a CEP attribute.
 *
 *  @param _value  Descriptor attribute value.
 *  @param _handle Descriptor attribute handle.
 */
#define BT_GATT_H_CEP(_value, _handle) \
		BT_GATT_H_DESCRIPTOR(BT_UUID_GATT_CEP, \
				BT_GATT_PERM_READ, \
				bt_gatt_attr_read_cep, \
				NULL, \
				(void *)_value, \
				_handle)

/** @def BT_GATT_H_CUD
 *  @brief Characteristic User Format Descriptor Declaration Macro.
 *
 *  Helper macro to declare a CUD attribute.
 *
 *  @param _value  User description NULL-terminated C string.
 *  @param _perm   Descriptor attribute access permissions.
 *  @param _handle Descriptor attribute handle.
 */
#define BT_GATT_H_CUD(_value, _perm, _handle) \
		BT_GATT_H_DESCRIPTOR(BT_UUID_GATT_CUD, \
				_perm, \
				bt_gatt_attr_read_cud, \
				NULL, \
				(void *)_value, \
				_handle)

/** @def BT_GATT_H_CPF
 *  @brief Characteristic Presentation Format Descriptor Declaration Macro.
 *
 *  Helper macro to declare a CPF attribute.
 *
 *  @param _value  Descriptor attribute value.
 *  @param _handle Descriptor attribute handle.
 */
#define BT_GATT_H_CPF(_value, _handle) \
		BT_GATT_H_DESCRIPTOR(BT_UUID_GATT_CPF, \
				BT_GATT_PERM_READ, \
				bt_gatt_attr_read_cpf, \
				NULL, \
				(void *)_value, \
				_handle)

#ifdef __cplusplus
}
#endif

#endif /* GATT_MACS_H */
