blob: 1ab6812e6d14144cc1ba826fc58997e22c616240 [file] [log] [blame]
/**
****************************************************************************************
*
* @file att.h
*
* @brief Header file - ATT.
*
* Copyright (C) RivieraWaves 2009-2016
* Copyright (C) Atmosic 2023
*
****************************************************************************************
*/
#ifndef ATT_H_
#define ATT_H_
/**
****************************************************************************************
* @addtogroup ATT Attribute Protocol
* @ingroup HOST
* @brief Attribute Protocol.
*
* The ATT block contains the procedures for discovering, reading, writing
* and indicating attributes to peer device . It also defines a number of items
* that caters to the security aspect of the block as access to some information
* may require both authorization and an authenticated and encrypted physical
* link before an attribute can be read or written
*
* @{
*
****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include <stdint.h>
/*
* DEFINES
****************************************************************************************
*/
/// Macro used to convert CPU integer define to LSB first 16-bits UUID
#define ATT_UUID_16(uuid) (uuid)
/// Invalid attribute handle
#define ATT_INVALID_HDL (0x0000)
/// Invalid attribute idx (used for profiles)
#define ATT_INVALID_IDX (0xff)
#define ATT_1ST_REQ_START_HDL 0x0001
#define ATT_1ST_REQ_END_HDL 0xFFFF
/// Maximum possible attribute handle
#define ATT_MAX_ATTR_HDL ATT_1ST_REQ_END_HDL
/// Offset of value in signed PDU
#define ATT_SIGNED_PDU_VAL_OFFSET 0x03
/// Attribute Features
#define ATT_SERVER_CONFIG 0x0001
#define ATT_SERVICE_DISC 0x0002
#define ATT_RELATIONSHIP_DISC 0x0004
#define ATT_CHAR_DISC 0x0008
#define ATT_CHAR_DESC_DISC 0x0010
#define ATT_RD_CHAR_VALUE 0x0020
#define ATT_WR_CHAR_VALUE 0x0040
#define ATT_NOTIF_CHAR_VALUE 0x0080
#define ATT_IND_CHAR_VALUE 0x0100
#define ATT_RD_CHAR_DESC 0x0200
#define ATT_WR_CHAR_DESC 0x0400
/// Length, number, offset defines
#define ATT_SVC_VALUE_MAX_LEN 0x0030
#define ATT_CHAR_NAME_MAX_LEN 0x0030
#define ATT_UUID_16_LEN 0x0002
#define ATT_UUID_32_LEN 0x0004
#define ATT_UUID_128_LEN 0x0010
/// offset - l2cap header and ATT code
#define ATT_PDU_DATA_OFFSET 0x05
/// Characteristic Properties Bit
#define ATT_CHAR_PROP_BCAST 0x01
#define ATT_CHAR_PROP_RD 0x02
#define ATT_CHAR_PROP_WR_NO_RESP 0x04
#define ATT_CHAR_PROP_WR 0x08
#define ATT_CHAR_PROP_NTF 0x10
#define ATT_CHAR_PROP_IND 0x20
#define ATT_CHAR_PROP_AUTH 0x40
#define ATT_CHAR_PROP_EXT_PROP 0x80
/// Invalid Attribute Handle
#define ATT_INVALID_SEARCH_HANDLE 0x0000
#define ATT_INVALID_HANDLE 0x0000
/// Read Information Request
#define ATT_UUID_FILTER_0 0x00
#define ATT_UUID_FILTER_2 0x02
#define ATT_UUID_FILTER_16 0x10
/// Read Information Response
#define ATT_FORMAT_LEN 0x0001
#define ATT_FORMAT_16BIT_UUID 0x01
#define ATT_FORMAT_128BIT_UUID 0x02
/// For No fix length PDU
#define ATT_HANDLE_LEN 0x0002
#define ATT_EACHLEN_LEN 0x0001
#define ATT_PROP_LEN 0x0001
#define ATT_CODE_LEN 0x0001
#define ATT_CODE_AND_DATA_LEN 0x0002
#define ATT_CODE_AND_HANDLE_LEN 0x0003
#define ATT_CODE_AND_HANDLE_LEN_AND_OFFSET 0x0005
#define ATT_SIGNATURE_LEN 0x0C
/// extended characteristics
#define ATT_EXT_RELIABLE_WRITE 0x0001
#define ATT_EXT_WRITABLE_AUX 0x0002
#define ATT_EXT_RFU 0xFFFC
/// PDU size for error response
#define ATT_ERROR_RESP_LEN 0x05
/// Offset of value in signed PDU
#define ATT_SIGNED_PDU_VAL_OFFSET 0x03
/// Attribute operation code - Method (bit 5 - 0)
#define ATT_OPCODE_METHOD_MASK 0x3F
#define ATT_OPCODE_METHOD_LSB 0
/// Attribute operation code - Command Flag (bit 6)
#define ATT_OPCODE_CMD_FLAG_BIT 0x40
#define ATT_OPCODE_CMD_FLAG_POS 6
/// Attribute operation code - Authentication Signature Flag (bit 7)
#define ATT_OPCODE_AUTH_SIGNATURE_FLAG_BIT 0x80
#define ATT_OPCODE_AUTH_SIGNATURE_FLAG_POS 7
#define ATT_BT_UUID_128 {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, \
0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
/* Attribute Specification Defines */
/// Common 16-bit Universal Unique Identifier
enum {
ATT_INVALID_UUID = ATT_UUID_16(0x0000),
/*----------------- SERVICES ---------------------*/
/// Generic Access Profile
ATT_SVC_GENERIC_ACCESS = ATT_UUID_16(0x1800),
/// Attribute Profile
ATT_SVC_GENERIC_ATTRIBUTE = ATT_UUID_16(0x1801),
/// Immediate alert Service
ATT_SVC_IMMEDIATE_ALERT = ATT_UUID_16(0x1802),
/// Link Loss Service
ATT_SVC_LINK_LOSS = ATT_UUID_16(0x1803),
/// Tx Power Service
ATT_SVC_TX_POWER = ATT_UUID_16(0x1804),
/// Current Time Service Service
ATT_SVC_CURRENT_TIME = ATT_UUID_16(0x1805),
/// Reference Time Update Service
ATT_SVC_REF_TIME_UPDATE = ATT_UUID_16(0x1806),
/// Next DST Change Service
ATT_SVC_NEXT_DST_CHANGE = ATT_UUID_16(0x1807),
/// Glucose Service
ATT_SVC_GLUCOSE = ATT_UUID_16(0x1808),
/// Health Thermometer Service
ATT_SVC_HEALTH_THERMOM = ATT_UUID_16(0x1809),
/// Device Information Service
ATT_SVC_DEVICE_INFO = ATT_UUID_16(0x180A),
/// Heart Rate Service
ATT_SVC_HEART_RATE = ATT_UUID_16(0x180D),
/// Phone Alert Status Service
ATT_SVC_PHONE_ALERT_STATUS = ATT_UUID_16(0x180E),
/// Battery Service
ATT_SVC_BATTERY_SERVICE = ATT_UUID_16(0x180F),
/// Blood Pressure Service
ATT_SVC_BLOOD_PRESSURE = ATT_UUID_16(0x1810),
/// Alert Notification Service
ATT_SVC_ALERT_NTF = ATT_UUID_16(0x1811),
/// HID Service
ATT_SVC_HID = ATT_UUID_16(0x1812),
/// Scan Parameters Service
ATT_SVC_SCAN_PARAMETERS = ATT_UUID_16(0x1813),
/// Running Speed and Cadence Service
ATT_SVC_RUNNING_SPEED_CADENCE = ATT_UUID_16(0x1814),
/// Cycling Speed and Cadence Service
ATT_SVC_CYCLING_SPEED_CADENCE = ATT_UUID_16(0x1816),
/// Cycling Power Service
ATT_SVC_CYCLING_POWER = ATT_UUID_16(0x1818),
/// Location and Navigation Service
ATT_SVC_LOCATION_AND_NAVIGATION = ATT_UUID_16(0x1819),
/// Environmental Sensing Service
ATT_SVC_ENVIRONMENTAL_SENSING = ATT_UUID_16(0x181A),
/// Body Composition Service
ATT_SVC_BODY_COMPOSITION = ATT_UUID_16(0x181B),
/// User Data Service
ATT_SVC_USER_DATA = ATT_UUID_16(0x181C),
/// Weight Scale Service
ATT_SVC_WEIGHT_SCALE = ATT_UUID_16(0x181D),
/// Bond Management Service
ATT_SVC_BOND_MANAGEMENT = ATT_UUID_16(0x181E),
/// Continuous Glucose Monitoring Service
ATT_SVC_CONTINUOUS_GLUCOSE_MONITORING = ATT_UUID_16(0x181F),
/// Internet Protocol Support Service
ATT_SVC_IP_SUPPORT = ATT_UUID_16(0x1820),
/// Indoor Positioning Service
ATT_SVC_INDOOR_POSITIONING = ATT_UUID_16(0x1821),
/// Pulse Oximeter Service
ATT_SVC_PULSE_OXIMETER = ATT_UUID_16(0x1822),
/// HTTP Proxy Service
ATT_SVC_HTTP_PROXY = ATT_UUID_16(0x1823),
/// Transport Discovery Service
ATT_SVC_TRANSPORT_DISCOVERY = ATT_UUID_16(0x1824),
/// Object Transfer Service
ATT_SVC_OBJECT_TRANSFER = ATT_UUID_16(0x1825),
/// Mesh Provisioning Service
ATT_SVC_MESH_PROVISIONING = ATT_UUID_16(0x1827),
/// Mesh Proxy Service
ATT_SVC_MESH_PROXY = ATT_UUID_16(0x1828),
/*------------------- UNITS ---------------------*/
/// No defined unit
ATT_UNIT_UNITLESS = ATT_UUID_16(0x2700),
/// Length Unit - Metre
ATT_UNIT_METRE = ATT_UUID_16(0x2701),
///Mass unit - Kilogram
ATT_UNIT_KG = ATT_UUID_16(0x2702),
///Time unit - second
ATT_UNIT_SECOND = ATT_UUID_16(0x2703),
///Electric current unit - Ampere
ATT_UNIT_AMPERE = ATT_UUID_16(0x2704),
///Thermodynamic Temperature unit - Kelvin
ATT_UNIT_KELVIN = ATT_UUID_16(0x2705),
/// Amount of substance unit - mole
ATT_UNIT_MOLE = ATT_UUID_16(0x2706),
///Luminous intensity unit - candela
ATT_UNIT_CANDELA = ATT_UUID_16(0x2707),
///Area unit - square metres
ATT_UNIT_SQ_METRE = ATT_UUID_16(0x2710),
///Colume unit - cubic metres
ATT_UNIT_CUBIC_METRE = ATT_UUID_16(0x2710),
///Velocity unit - metres per second
ATT_UNIT_METRE_PER_SECOND = ATT_UUID_16(0x2711),
///Acceleration unit - metres per second squared
ATT_UNIT_METRES_PER_SEC_SQ = ATT_UUID_16(0x2712),
///Wavenumber unit - reciprocal metre
ATT_UNIT_RECIPROCAL_METRE = ATT_UUID_16(0x2713),
///Density unit - kilogram per cubic metre
ATT_UNIT_DENS_KG_PER_CUBIC_METRE = ATT_UUID_16(0x2714),
///Surface density unit - kilogram per square metre
ATT_UNIT_KG_PER_SQ_METRE = ATT_UUID_16(0x2715),
///Specific volume unit - cubic metre per kilogram
ATT_UNIT_CUBIC_METRE_PER_KG = ATT_UUID_16(0x2716),
///Current density unit - ampere per square metre
ATT_UNIT_AMPERE_PER_SQ_METRE = ATT_UUID_16(0x2717),
///Magnetic field strength unit - Ampere per metre
ATT_UNIT_AMPERE_PER_METRE = ATT_UUID_16(0x2718),
///Amount concentration unit - mole per cubic metre
ATT_UNIT_MOLE_PER_CUBIC_METRE = ATT_UUID_16(0x2719),
///Mass Concentration unit - kilogram per cubic metre
ATT_UNIT_MASS_KG_PER_CUBIC_METRE = ATT_UUID_16(0x271A),
///Luminance unit - candela per square metre
ATT_UNIT_CANDELA_PER_SQ_METRE = ATT_UUID_16(0x271B),
///Refractive index unit
ATT_UNIT_REFRACTIVE_INDEX = ATT_UUID_16(0x271C),
///Relative permeability unit
ATT_UNIT_RELATIVE_PERMEABILITY = ATT_UUID_16(0x271D),
///Plane angle unit - radian
ATT_UNIT_RADIAN = ATT_UUID_16(0x2720),
///Solid angle unit - steradian
ATT_UNIT_STERADIAN = ATT_UUID_16(0x2721),
///Frequency unit - Hertz
ATT_UNIT_HERTZ = ATT_UUID_16(0x2722),
///Force unit - Newton
ATT_UNIT_NEWTON = ATT_UUID_16(0x2723),
///Pressure unit - Pascal
ATT_UNIT_PASCAL = ATT_UUID_16(0x2724),
///Energy unit - Joule
ATT_UNIT_JOULE = ATT_UUID_16(0x2725),
///Power unit - Watt
ATT_UNIT_WATT = ATT_UUID_16(0x2726),
///electric Charge unit - Coulomb
ATT_UNIT_COULOMB = ATT_UUID_16(0x2727),
///Electric potential difference - Volt
ATT_UNIT_VOLT = ATT_UUID_16(0x2728),
///Capacitance unit - Farad
ATT_UNIT_FARAD = ATT_UUID_16(0x2729),
///electric resistance unit - Ohm
ATT_UNIT_OHM = ATT_UUID_16(0x272A),
///Electric conductance - Siemens
ATT_UNIT_SIEMENS = ATT_UUID_16(0x272B),
///Magnetic flux unit - Weber
ATT_UNIT_WEBER = ATT_UUID_16(0x272C),
///Magnetic flux density unit - Tesla
ATT_UNIT_TESLA = ATT_UUID_16(0x272D),
///Inductance unit - Henry
ATT_UNIT_HENRY = ATT_UUID_16(0x272E),
///Temperature unit - degree Celsius
ATT_UNIT_CELSIUS = ATT_UUID_16(0x272F),
///Luminous flux unit - lumen
ATT_UNIT_LUMEN = ATT_UUID_16(0x2730),
///Illuminance unit - lux
ATT_UNIT_LUX = ATT_UUID_16(0x2731),
///Activity referred to a radionuclide unit - becquerel
ATT_UNIT_BECQUEREL = ATT_UUID_16(0x2732),
///Absorbed dose unit - Gray
ATT_UNIT_GRAY = ATT_UUID_16(0x2733),
///Dose equivalent unit - Sievert
ATT_UNIT_SIEVERT = ATT_UUID_16(0x2734),
///Catalytic activity unit - Katal
ATT_UNIT_KATAL = ATT_UUID_16(0x2735),
///Synamic viscosity unit - Pascal second
ATT_UNIT_PASCAL_SECOND = ATT_UUID_16(0x2740),
///Moment of force unit - Newton metre
ATT_UNIT_NEWTON_METRE = ATT_UUID_16(0x2741),
///surface tension unit - Newton per metre
ATT_UNIT_NEWTON_PER_METRE = ATT_UUID_16(0x2742),
///Angular velocity unit - radian per second
ATT_UNIT_RADIAN_PER_SECOND = ATT_UUID_16(0x2743),
///Angular acceleration unit - radian per second squared
ATT_UNIT_RADIAN_PER_SECOND_SQ = ATT_UUID_16(0x2744),
///Heat flux density unit - Watt per square metre
ATT_UNIT_WATT_PER_SQ_METRE = ATT_UUID_16(0x2745),
///HEat capacity unit - Joule per Kelvin
ATT_UNIT_JOULE_PER_KELVIN = ATT_UUID_16(0x2746),
///Specific heat capacity unit - Joule per kilogram kelvin
ATT_UNIT_JOULE_PER_KG_KELVIN = ATT_UUID_16(0x2747),
///Specific Energy unit - Joule per kilogram
ATT_UNIT_JOULE_PER_KG = ATT_UUID_16(0x2748),
///Thermal conductivity - Watt per metre Kelvin
ATT_UNIT_WATT_PER_METRE_KELVIN = ATT_UUID_16(0x2749),
///Energy Density unit - joule per cubic metre
ATT_UNIT_JOULE_PER_CUBIC_METRE = ATT_UUID_16(0x274A),
///Electric field strength unit - volt per metre
ATT_UNIT_VOLT_PER_METRE = ATT_UUID_16(0x274B),
///Electric charge density unit - coulomb per cubic metre
ATT_UNIT_COULOMB_PER_CUBIC_METRE = ATT_UUID_16(0x274C),
///Surface charge density unit - coulomb per square metre
ATT_UNIT_SURF_COULOMB_PER_SQ_METRE = ATT_UUID_16(0x274D),
///Electric flux density unit - coulomb per square metre
ATT_UNIT_FLUX_COULOMB_PER_SQ_METRE = ATT_UUID_16(0x274E),
///Permittivity unit - farad per metre
ATT_UNIT_FARAD_PER_METRE = ATT_UUID_16(0x274F),
///Permeability unit - henry per metre
ATT_UNIT_HENRY_PER_METRE = ATT_UUID_16(0x2750),
///Molar energy unit - joule per mole
ATT_UNIT_JOULE_PER_MOLE = ATT_UUID_16(0x2751),
///Molar entropy unit - joule per mole kelvin
ATT_UNIT_JOULE_PER_MOLE_KELVIN = ATT_UUID_16(0x2752),
///Exposure unit - coulomb per kilogram
ATT_UNIT_COULOMB_PER_KG = ATT_UUID_16(0x2753),
///Absorbed dose rate unit - gray per second
ATT_UNIT_GRAY_PER_SECOND = ATT_UUID_16(0x2754),
///Radiant intensity unit - watt per steradian
ATT_UNIT_WATT_PER_STERADIAN = ATT_UUID_16(0x2755),
///Radiance unit - watt per square meter steradian
ATT_UNIT_WATT_PER_SQ_METRE_STERADIAN = ATT_UUID_16(0x2756),
///Catalytic activity concentration unit - katal per cubic metre
ATT_UNIT_KATAL_PER_CUBIC_METRE = ATT_UUID_16(0x2757),
///Time unit - minute
ATT_UNIT_MINUTE = ATT_UUID_16(0x2760),
///Time unit - hour
ATT_UNIT_HOUR = ATT_UUID_16(0x2761),
///Time unit - day
ATT_UNIT_DAY = ATT_UUID_16(0x2762),
///Plane angle unit - degree
ATT_UNIT_ANGLE_DEGREE = ATT_UUID_16(0x2763),
///Plane angle unit - minute
ATT_UNIT_ANGLE_MINUTE = ATT_UUID_16(0x2764),
///Plane angle unit - second
ATT_UNIT_ANGLE_SECOND = ATT_UUID_16(0x2765),
///Area unit - hectare
ATT_UNIT_HECTARE = ATT_UUID_16(0x2766),
///Volume unit - litre
ATT_UNIT_LITRE = ATT_UUID_16(0x2767),
///Mass unit - tonne
ATT_UNIT_TONNE = ATT_UUID_16(0x2768),
///Pressure unit - bar
ATT_UNIT_BAR = ATT_UUID_16(0x2780),
///Pressure unit - millimetre of mercury
ATT_UNIT_MM_MERCURY = ATT_UUID_16(0x2781),
///Length unit - angstrom
ATT_UNIT_ANGSTROM = ATT_UUID_16(0x2782),
///Length unit - nautical mile
ATT_UNIT_NAUTICAL_MILE = ATT_UUID_16(0x2783),
///Area unit - barn
ATT_UNIT_BARN = ATT_UUID_16(0x2784),
///Velocity unit - knot
ATT_UNIT_KNOT = ATT_UUID_16(0x2785),
///Logarithmic radio quantity unit - neper
ATT_UNIT_NEPER = ATT_UUID_16(0x2786),
///Logarithmic radio quantity unit - bel
ATT_UNIT_BEL = ATT_UUID_16(0x2787),
///Length unit - yard
ATT_UNIT_YARD = ATT_UUID_16(0x27A0),
///Length unit - parsec
ATT_UNIT_PARSEC = ATT_UUID_16(0x27A1),
///length unit - inch
ATT_UNIT_INCH = ATT_UUID_16(0x27A2),
///length unit - foot
ATT_UNIT_FOOT = ATT_UUID_16(0x27A3),
///length unit - mile
ATT_UNIT_MILE = ATT_UUID_16(0x27A4),
///pressure unit - pound-force per square inch
ATT_UNIT_POUND_FORCE_PER_SQ_INCH = ATT_UUID_16(0x27A5),
///velocity unit - kilometre per hour
ATT_UNIT_KM_PER_HOUR = ATT_UUID_16(0x27A6),
///velocity unit - mile per hour
ATT_UNIT_MILE_PER_HOUR = ATT_UUID_16(0x27A7),
///angular velocity unit - revolution per minute
ATT_UNIT_REVOLUTION_PER_MINUTE = ATT_UUID_16(0x27A8),
///energy unit - gram calorie
ATT_UNIT_GRAM_CALORIE = ATT_UUID_16(0x27A9),
///energy unit - kilogram calorie
ATT_UNIT_KG_CALORIE = ATT_UUID_16(0x27AA),
/// energy unit - kilowatt hour
ATT_UNIT_KILOWATT_HOUR = ATT_UUID_16(0x27AB),
///thermodynamic temperature unit - degree Fahrenheit
ATT_UNIT_FAHRENHEIT = ATT_UUID_16(0x27AC),
///percentage
ATT_UNIT_PERCENTAGE = ATT_UUID_16(0x27AD),
///per mille
ATT_UNIT_PER_MILLE = ATT_UUID_16(0x27AE),
///period unit - beats per minute)
ATT_UNIT_BEATS_PER_MINUTE = ATT_UUID_16(0x27AF),
///electric charge unit - ampere hours
ATT_UNIT_AMPERE_HOURS = ATT_UUID_16(0x27B0),
///mass density unit - milligram per decilitre
ATT_UNIT_MILLIGRAM_PER_DECILITRE = ATT_UUID_16(0x27B1),
///mass density unit - millimole per litre
ATT_UNIT_MILLIMOLE_PER_LITRE = ATT_UUID_16(0x27B2),
///time unit - year
ATT_UNIT_YEAR = ATT_UUID_16(0x27B3),
////time unit - month
ATT_UNIT_MONTH = ATT_UUID_16(0x27B4),
/*---------------- DECLARATIONS -----------------*/
/// Primary service Declaration
ATT_DECL_PRIMARY_SERVICE = ATT_UUID_16(0x2800),
/// Secondary service Declaration
ATT_DECL_SECONDARY_SERVICE = ATT_UUID_16(0x2801),
/// Include Declaration
ATT_DECL_INCLUDE = ATT_UUID_16(0x2802),
/// Characteristic Declaration
ATT_DECL_CHARACTERISTIC = ATT_UUID_16(0x2803),
/*----------------- DESCRIPTORS -----------------*/
/// Characteristic extended properties
ATT_DESC_CHAR_EXT_PROPERTIES = ATT_UUID_16(0x2900),
/// Characteristic user description
ATT_DESC_CHAR_USER_DESCRIPTION = ATT_UUID_16(0x2901),
/// Client characteristic configuration
ATT_DESC_CLIENT_CHAR_CFG = ATT_UUID_16(0x2902),
/// Server characteristic configuration
ATT_DESC_SERVER_CHAR_CFG = ATT_UUID_16(0x2903),
/// Characteristic Presentation Format
ATT_DESC_CHAR_PRES_FORMAT = ATT_UUID_16(0x2904),
/// Characteristic Aggregate Format
ATT_DESC_CHAR_AGGREGATE_FORMAT = ATT_UUID_16(0x2905),
/// Valid Range
ATT_DESC_VALID_RANGE = ATT_UUID_16(0x2906),
/// External Report Reference
ATT_DESC_EXT_REPORT_REF = ATT_UUID_16(0x2907),
/// Report Reference
ATT_DESC_REPORT_REF = ATT_UUID_16(0x2908),
/// Environmental Sensing Configuration
ATT_DESC_ES_CONFIGURATION = ATT_UUID_16(0x290B),
/// Environmental Sensing Measurement
ATT_DESC_ES_MEASUREMENT = ATT_UUID_16(0x290C),
/// Environmental Sensing Trigger Setting
ATT_DESC_ES_TRIGGER_SETTING = ATT_UUID_16(0x290D),
/*--------------- CHARACTERISTICS ---------------*/
/// Device name
ATT_CHAR_DEVICE_NAME = ATT_UUID_16(0x2A00),
/// Appearance
ATT_CHAR_APPEARANCE = ATT_UUID_16(0x2A01),
/// Privacy flag
ATT_CHAR_PRIVACY_FLAG = ATT_UUID_16(0x2A02),
/// Reconnection address
ATT_CHAR_RECONNECTION_ADDR = ATT_UUID_16(0x2A03),
/// Peripheral preferred connection parameters
ATT_CHAR_PERIPH_PREF_CON_PARAM = ATT_UUID_16(0x2A04),
/// Service handles changed
ATT_CHAR_SERVICE_CHANGED = ATT_UUID_16(0x2A05),
/// Alert Level characteristic
ATT_CHAR_ALERT_LEVEL = ATT_UUID_16(0x2A06),
/// Tx Power Level
ATT_CHAR_TX_POWER_LEVEL = ATT_UUID_16(0x2A07),
/// Date Time
ATT_CHAR_DATE_TIME = ATT_UUID_16(0x2A08),
/// Day of Week
ATT_CHAR_DAY_WEEK = ATT_UUID_16(0x2A09),
/// Day Date Time
ATT_CHAR_DAY_DATE_TIME = ATT_UUID_16(0x2A0A),
/// Exact time 256
ATT_CHAR_EXACT_TIME_256 = ATT_UUID_16(0x2A0C),
/// DST Offset
ATT_CHAR_DST_OFFSET = ATT_UUID_16(0x2A0D),
/// Time zone
ATT_CHAR_TIME_ZONE = ATT_UUID_16(0x2A0E),
/// Local time Information
ATT_CHAR_LOCAL_TIME_INFO = ATT_UUID_16(0x2A0F),
/// Time with DST
ATT_CHAR_TIME_WITH_DST = ATT_UUID_16(0x2A11),
/// Time Accuracy
ATT_CHAR_TIME_ACCURACY = ATT_UUID_16(0x2A12),
///Time Source
ATT_CHAR_TIME_SOURCE = ATT_UUID_16(0x2A13),
/// Reference Time Information
ATT_CHAR_REFERENCE_TIME_INFO = ATT_UUID_16(0x2A14),
/// Time Update Control Point
ATT_CHAR_TIME_UPDATE_CNTL_POINT = ATT_UUID_16(0x2A16),
/// Time Update State
ATT_CHAR_TIME_UPDATE_STATE = ATT_UUID_16(0x2A17),
/// Glucose Measurement
ATT_CHAR_GLUCOSE_MEAS = ATT_UUID_16(0x2A18),
/// Battery Level
ATT_CHAR_BATTERY_LEVEL = ATT_UUID_16(0x2A19),
/// Temperature Measurement
ATT_CHAR_TEMPERATURE_MEAS = ATT_UUID_16(0x2A1C),
/// Temperature Type
ATT_CHAR_TEMPERATURE_TYPE = ATT_UUID_16(0x2A1D),
/// Intermediate Temperature
ATT_CHAR_INTERMED_TEMPERATURE = ATT_UUID_16(0x2A1E),
/// Measurement Interval
ATT_CHAR_MEAS_INTERVAL = ATT_UUID_16(0x2A21),
/// Boot Keyboard Input Report
ATT_CHAR_BOOT_KB_IN_REPORT = ATT_UUID_16(0x2A22),
/// System ID
ATT_CHAR_SYS_ID = ATT_UUID_16(0x2A23),
/// Model Number String
ATT_CHAR_MODEL_NB = ATT_UUID_16(0x2A24),
/// Serial Number String
ATT_CHAR_SERIAL_NB = ATT_UUID_16(0x2A25),
/// Firmware Revision String
ATT_CHAR_FW_REV = ATT_UUID_16(0x2A26),
/// Hardware revision String
ATT_CHAR_HW_REV = ATT_UUID_16(0x2A27),
/// Software Revision String
ATT_CHAR_SW_REV = ATT_UUID_16(0x2A28),
/// Manufacturer Name String
ATT_CHAR_MANUF_NAME = ATT_UUID_16(0x2A29),
/// IEEE Regulatory Certification Data List
ATT_CHAR_IEEE_CERTIF = ATT_UUID_16(0x2A2A),
/// CT Time
ATT_CHAR_CT_TIME = ATT_UUID_16(0x2A2B),
/// Magnetic Declination
ATT_CHAR_MAGN_DECLINE = ATT_UUID_16(0x2A2C),
/// Scan Refresh
ATT_CHAR_SCAN_REFRESH = ATT_UUID_16(0x2A31),
/// Boot Keyboard Output Report
ATT_CHAR_BOOT_KB_OUT_REPORT = ATT_UUID_16(0x2A32),
/// Boot Mouse Input Report
ATT_CHAR_BOOT_MOUSE_IN_REPORT = ATT_UUID_16(0x2A33),
/// Glucose Measurement Context
ATT_CHAR_GLUCOSE_MEAS_CTX = ATT_UUID_16(0x2A34),
/// Blood Pressure Measurement
ATT_CHAR_BLOOD_PRESSURE_MEAS = ATT_UUID_16(0x2A35),
/// Intermediate Cuff Pressure
ATT_CHAR_INTERMEDIATE_CUFF_PRESSURE = ATT_UUID_16(0x2A36),
/// Heart Rate Measurement
ATT_CHAR_HEART_RATE_MEAS = ATT_UUID_16(0x2A37),
/// Body Sensor Location
ATT_CHAR_BODY_SENSOR_LOCATION = ATT_UUID_16(0x2A38),
/// Heart Rate Control Point
ATT_CHAR_HEART_RATE_CNTL_POINT = ATT_UUID_16(0x2A39),
/// Alert Status
ATT_CHAR_ALERT_STATUS = ATT_UUID_16(0x2A3F),
/// Ringer Control Point
ATT_CHAR_RINGER_CNTL_POINT = ATT_UUID_16(0x2A40),
/// Ringer Setting
ATT_CHAR_RINGER_SETTING = ATT_UUID_16(0x2A41),
/// Alert Category ID Bit Mask
ATT_CHAR_ALERT_CAT_ID_BIT_MASK = ATT_UUID_16(0x2A42),
/// Alert Category ID
ATT_CHAR_ALERT_CAT_ID = ATT_UUID_16(0x2A43),
/// Alert Notification Control Point
ATT_CHAR_ALERT_NTF_CTNL_PT = ATT_UUID_16(0x2A44),
/// Unread Alert Status
ATT_CHAR_UNREAD_ALERT_STATUS = ATT_UUID_16(0x2A45),
/// New Alert
ATT_CHAR_NEW_ALERT = ATT_UUID_16(0x2A46),
/// Supported New Alert Category
ATT_CHAR_SUP_NEW_ALERT_CAT = ATT_UUID_16(0x2A47),
/// Supported Unread Alert Category
ATT_CHAR_SUP_UNREAD_ALERT_CAT = ATT_UUID_16(0x2A48),
/// Blood Pressure Feature
ATT_CHAR_BLOOD_PRESSURE_FEATURE = ATT_UUID_16(0x2A49),
/// HID Information
ATT_CHAR_HID_INFO = ATT_UUID_16(0x2A4A),
/// Report Map
ATT_CHAR_REPORT_MAP = ATT_UUID_16(0x2A4B),
/// HID Control Point
ATT_CHAR_HID_CTNL_PT = ATT_UUID_16(0x2A4C),
/// Report
ATT_CHAR_REPORT = ATT_UUID_16(0x2A4D),
/// Protocol Mode
ATT_CHAR_PROTOCOL_MODE = ATT_UUID_16(0x2A4E),
/// Scan Interval Window
ATT_CHAR_SCAN_INTV_WD = ATT_UUID_16(0x2A4F),
/// PnP ID
ATT_CHAR_PNP_ID = ATT_UUID_16(0x2A50),
/// Glucose Feature
ATT_CHAR_GLUCOSE_FEATURE = ATT_UUID_16(0x2A51),
/// Record access control point
ATT_CHAR_REC_ACCESS_CTRL_PT = ATT_UUID_16(0x2A52),
/// RSC Measurement
ATT_CHAR_RSC_MEAS = ATT_UUID_16(0x2A53),
/// RSC Feature
ATT_CHAR_RSC_FEAT = ATT_UUID_16(0x2A54),
/// SC Control Point
ATT_CHAR_SC_CNTL_PT = ATT_UUID_16(0x2A55),
/// CSC Measurement
ATT_CHAR_CSC_MEAS = ATT_UUID_16(0x2A5B),
/// CSC Feature
ATT_CHAR_CSC_FEAT = ATT_UUID_16(0x2A5C),
/// Sensor Location
ATT_CHAR_SENSOR_LOC = ATT_UUID_16(0x2A5D),
/// PLX Spot-Check Measurement
ATT_CHAR_PLX_SPOT_CHECK_MEASUREMENT_LOC = ATT_UUID_16(0x2A5E),
/// PLX Continuous Measurement
ATT_CHAR_PLX_CONTINUOUS_MEASUREMENT_LOC = ATT_UUID_16(0x2A5F),
/// PLX Features
ATT_CHAR_PLX_FEATURES_LOC = ATT_UUID_16(0x2A60),
/// CP Measurement
ATT_CHAR_CP_MEAS = ATT_UUID_16(0x2A63),
/// CP Vector
ATT_CHAR_CP_VECTOR = ATT_UUID_16(0x2A64),
/// CP Feature
ATT_CHAR_CP_FEAT = ATT_UUID_16(0x2A65),
/// CP Control Point
ATT_CHAR_CP_CNTL_PT = ATT_UUID_16(0x2A66),
/// Location and Speed
ATT_CHAR_LOC_SPEED = ATT_UUID_16(0x2A67),
/// Navigation
ATT_CHAR_NAVIGATION = ATT_UUID_16(0x2A68),
/// Position Quality
ATT_CHAR_POS_QUALITY = ATT_UUID_16(0x2A69),
/// LN Feature
ATT_CHAR_LN_FEAT = ATT_UUID_16(0x2A6A),
/// LN Control Point
ATT_CHAR_LN_CNTL_PT = ATT_UUID_16(0x2A6B),
/// Elevation
ATT_CHAR_ELEVATION = ATT_UUID_16(0x2A6C),
/// Pressure
ATT_CHAR_PRESSURE = ATT_UUID_16(0x2A6D),
/// Temperature
ATT_CHAR_TEMPERATURE = ATT_UUID_16(0x2A6E),
/// Humidity
ATT_CHAR_HUMIDITY = ATT_UUID_16(0x2A6F),
/// True Wind Speed
ATT_CHAR_TRUE_WIND_SPEED = ATT_UUID_16(0x2A70),
/// True Wind Direction
ATT_CHAR_TRUE_WIND_DIR = ATT_UUID_16(0x2A71),
/// Apparent Wind Speed
ATT_CHAR_APRNT_WIND_SPEED = ATT_UUID_16(0x2A72),
/// Apparent Wind Direction
ATT_CHAR_APRNT_WIND_DIRECTION = ATT_UUID_16(0x2A73),
/// Gust Factor
ATT_CHAR_GUST_FACTOR = ATT_UUID_16(0x2A74),
/// Pollen Concentration
ATT_CHAR_POLLEN_CONC = ATT_UUID_16(0x2A75),
/// UV Index
ATT_CHAR_UV_INDEX = ATT_UUID_16(0x2A76),
/// Irradiance
ATT_CHAR_IRRADIANCE = ATT_UUID_16(0x2A77),
/// Rainfall
ATT_CHAR_RAINFALL = ATT_UUID_16(0x2A78),
/// Wind Chill
ATT_CHAR_WIND_CHILL = ATT_UUID_16(0x2A79),
/// Heat Index
ATT_CHAR_HEAT_INDEX = ATT_UUID_16(0x2A7A),
/// Dew Point
ATT_CHAR_DEW_POINT = ATT_UUID_16(0x2A7B),
/// Descriptor Value Changed
ATT_CHAR_DESCRIPTOR_VALUE_CHANGED = ATT_UUID_16(0x2A7D),
/// Aerobic Heart Rate Lower Limit
ATT_CHAR_AEROBIC_HEART_RATE_LOWER_LIMIT = ATT_UUID_16(0x2A7E),
/// Aerobic Threshold
ATT_CHAR_AEROBIC_THRESHOLD = ATT_UUID_16(0x2A7F),
/// Age
ATT_CHAR_AGE = ATT_UUID_16(0x2A80),
/// Anaerobic Heart Rate Lower Limit
ATT_CHAR_ANAEROBIC_HEART_RATE_LOWER_LIMIT = ATT_UUID_16(0x2A81),
/// Anaerobic Heart Rate Upper Limit
ATT_CHAR_ANAEROBIC_HEART_RATE_UPPER_LIMIT = ATT_UUID_16(0x2A82),
/// Anaerobic Threshold
ATT_CHAR_ANAEROBIC_THRESHOLD = ATT_UUID_16(0x2A83),
/// Aerobic Heart Rate Upper Limit
ATT_CHAR_AEROBIC_HEART_RATE_UPPER_LIMIT = ATT_UUID_16(0x2A84),
/// Date Of Birth
ATT_CHAR_DATE_OF_BIRTH = ATT_UUID_16(0x2A85),
/// Date Of Threshold Assessment
ATT_CHAR_DATE_OF_THRESHOLD_ASSESSMENT = ATT_UUID_16(0x2A86),
/// Email Address
ATT_CHAR_EMAIL_ADDRESS = ATT_UUID_16(0x2A87),
/// Fat Burn Heart Rate Lower Limit
ATT_CHAR_FAT_BURN_HEART_RATE_LOWER_LIMIT = ATT_UUID_16(0x2A88),
/// Fat Burn Heart Rate Upper Limit
ATT_CHAR_FAT_BURN_HEART_RATE_UPPER_LIMIT = ATT_UUID_16(0x2A89),
/// First Name
ATT_CHAR_FIRST_NAME = ATT_UUID_16(0x2A8A),
/// Five Zone Heart Rate Limits
ATT_CHAR_FIVE_ZONE_HEART_RATE_LIMITS = ATT_UUID_16(0x2A8B),
/// Gender
ATT_CHAR_GENDER = ATT_UUID_16(0x2A8C),
/// Max Heart Rate
ATT_CHAR_MAX_HEART_RATE = ATT_UUID_16(0x2A8D),
/// Height
ATT_CHAR_HEIGHT = ATT_UUID_16(0x2A8E),
/// Hip Circumference
ATT_CHAR_HIP_CIRCUMFERENCE = ATT_UUID_16(0x2A8F),
/// Last Name
ATT_CHAR_LAST_NAME = ATT_UUID_16(0x2A90),
/// Maximum Recommended Heart Rate
ATT_CHAR_MAXIMUM_RECOMMENDED_HEART_RATE = ATT_UUID_16(0x2A91),
/// Resting Heart Rate
ATT_CHAR_RESTING_HEART_RATE = ATT_UUID_16(0x2A92),
/// Sport Type For Aerobic And Anaerobic Thresholds
ATT_CHAR_SPORT_TYPE_FOR_AEROBIC_AND_ANAEROBIC_THRESHOLDS = ATT_UUID_16(0x2A93),
/// Three Zone Heart Rate Limits
ATT_CHAR_THREE_ZONE_HEART_RATE_LIMITS = ATT_UUID_16(0x2A94),
/// Two Zone Heart Rate Limit
ATT_CHAR_TWO_ZONE_HEART_RATE_LIMIT = ATT_UUID_16(0x2A95),
/// Vo2 Max
ATT_CHAR_VO2_MAX = ATT_UUID_16(0x2A96),
/// Waist Circumference
ATT_CHAR_WAIST_CIRCUMFERENCE = ATT_UUID_16(0x2A97),
/// Weight
ATT_CHAR_WEIGHT = ATT_UUID_16(0x2A98),
/// Database Change Increment
ATT_CHAR_DATABASE_CHANGE_INCREMENT = ATT_UUID_16(0x2A99),
/// User Index
ATT_CHAR_USER_INDEX = ATT_UUID_16(0x2A9A),
/// Body Composition Feature
ATT_CHAR_BODY_COMPOSITION_FEATURE = ATT_UUID_16(0x2A9B),
/// Body Composition Measurement
ATT_CHAR_BODY_COMPOSITION_MEASUREMENT = ATT_UUID_16(0x2A9C),
/// Weight Measurement
ATT_CHAR_WEIGHT_MEASUREMENT = ATT_UUID_16(0x2A9D),
/// Weight Scale Feature
ATT_CHAR_WEIGHT_SCALE_FEATURE = ATT_UUID_16(0x2A9E),
/// User Control Point
ATT_CHAR_USER_CONTROL_POINT = ATT_UUID_16(0x2A9F),
/// Flux Density - 2D
ATT_CHAR_MAGN_FLUX_2D = ATT_UUID_16(0x2AA0),
/// Magnetic Flux Density - 3D
ATT_CHAR_MAGN_FLUX_3D = ATT_UUID_16(0x2AA1),
/// Language string
ATT_CHAR_LANGUAGE = ATT_UUID_16(0x2AA2),
/// Barometric Pressure Trend
ATT_CHAR_BAR_PRES_TREND = ATT_UUID_16(0x2AA3),
/// Central Address Resolution Support
ATT_CHAR_CTL_ADDR_RESOL_SUPP = ATT_UUID_16(0x2AA6),
/// CGM Measurement
ATT_CHAR_CGM_MEASUREMENT = ATT_UUID_16(0x2AA7),
/// CGM Features
ATT_CHAR_CGM_FEATURES = ATT_UUID_16(0x2AA8),
/// CGM Status
ATT_CHAR_CGM_STATUS = ATT_UUID_16(0x2AA9),
/// CGM Session Start
ATT_CHAR_CGM_SESSION_START = ATT_UUID_16(0x2AAA),
/// CGM Session Run
ATT_CHAR_CGM_SESSION_RUN = ATT_UUID_16(0x2AAB),
/// CGM Specific Ops Control Point
ATT_CHAR_CGM_SPECIFIC_OPS_CTRL_PT = ATT_UUID_16(0x2AAC),
/// Resolvable Private Address only
ATT_CHAR_RSLV_PRIV_ADDR_ONLY = ATT_UUID_16(0x2AC9),
/// Mesh Provisioning Data In
ATT_CHAR_MESH_PROV_DATA_IN = ATT_UUID_16(0x2ADB),
/// Mesh Provisioning Data Out
ATT_CHAR_MESH_PROV_DATA_OUT = ATT_UUID_16(0x2ADC),
/// Mesh Proxy Data In
ATT_CHAR_MESH_PROXY_DATA_IN = ATT_UUID_16(0x2ADD),
/// Mesh Proxy Data Out
ATT_CHAR_MESH_PROXY_DATA_OUT = ATT_UUID_16(0x2ADE),
};
/// Format for Characteristic Presentation
enum {
/// unsigned 1-bit: true or false
ATT_FORMAT_BOOL = 0x01,
/// unsigned 2-bit integer
ATT_FORMAT_2BIT,
/// unsigned 4-bit integer
ATT_FORMAT_NIBBLE,
/// unsigned 8-bit integer
ATT_FORMAT_UINT8,
/// unsigned 12-bit integer
ATT_FORMAT_UINT12,
/// unsigned 16-bit integer
ATT_FORMAT_UINT16,
/// unsigned 24-bit integer
ATT_FORMAT_UINT24,
/// unsigned 32-bit integer
ATT_FORMAT_UINT32,
/// unsigned 48-bit integer
ATT_FORMAT_UINT48,
/// unsigned 64-bit integer
ATT_FORMAT_UINT64,
/// unsigned 128-bit integer
ATT_FORMAT_UINT128,
/// signed 8-bit integer
ATT_FORMAT_SINT8,
/// signed 12-bit integer
ATT_FORMAT_SINT12,
/// signed 16-bit integer
ATT_FORMAT_SINT16,
/// signed 24-bit integer
ATT_FORMAT_SINT24,
/// signed 32-bit integer
ATT_FORMAT_SINT32,
/// signed 48-bit integer
ATT_FORMAT_SINT48,
/// signed 64-bit integer
ATT_FORMAT_SINT64,
/// signed 128-bit integer
ATT_FORMAT_SINT128,
/// IEEE-754 32-bit floating point
ATT_FORMAT_FLOAT32,
/// IEEE-754 64-bit floating point
ATT_FORMAT_FLOAT64,
/// IEEE-11073 16-bit SFLOAT
ATT_FORMAT_SFLOAT,
/// IEEE-11073 32-bit FLOAT
ATT_FORMAT_FLOAT,
/// IEEE-20601 format
ATT_FORMAT_DUINT16,
/// UTF-8 string
ATT_FORMAT_UTF8S,
/// UTF-16 string
ATT_FORMAT_UTF16S,
/// Opaque structure
ATT_FORMAT_STRUCT,
/// Last format
ATT_FORMAT_LAST
};
/// Client Characteristic Configuration Codes
enum att_ccc_val
{
/// Stop notification/indication
ATT_CCC_STOP_NTFIND = 0x0000,
/// Start notification
ATT_CCC_START_NTF,
/// Start indication
ATT_CCC_START_IND
};
/*
* Type Definition
****************************************************************************************
*/
/// Attribute length type
typedef uint16_t att_size_t;
/// UUID - 128-bit type
struct att_uuid_128
{
/// 128-bit UUID
uint8_t uuid[ATT_UUID_128_LEN];
};
/// UUID - 32-bit type
struct att_uuid_32
{
/// 32-bit UUID
uint8_t uuid[ATT_UUID_32_LEN];
};
/// Characteristic Value Descriptor
struct att_char_desc
{
/// properties
uint8_t prop;
/// attribute handle
uint8_t attr_hdl[ATT_HANDLE_LEN];
/// attribute type
uint8_t attr_type[ATT_UUID_16_LEN];
};
/// Characteristic Value Descriptor
struct att_char128_desc
{
/// properties
uint8_t prop;
/// attribute handle
uint8_t attr_hdl[ATT_HANDLE_LEN];
/// attribute type
uint8_t attr_type[ATT_UUID_128_LEN];
};
/// Service Value Descriptor - 16-bit
typedef uint16_t att_svc_desc_t;
/// include service entry element
struct att_incl_desc
{
/// start handle value of included service
uint16_t start_hdl;
/// end handle value of included service
uint16_t end_hdl;
/// attribute value UUID
uint16_t uuid;
};
/// include service entry element
struct att_incl128_desc
{
/// start handle value of included service
uint16_t start_hdl;
/// end handle value of included service
uint16_t end_hdl;
};
// -------------------------- PDU HANDLER Definition --------------------------
/// used to know if PDU handler has been found
#define ATT_PDU_HANDLER_NOT_FOUND (0xff)
/// Format of a pdu handler function
typedef int (*att_func_t)(uint8_t conidx, void *pdu);
/// Element of a pdu handler table.
struct att_pdu_handler
{
/// PDU identifier of the message
uint8_t pdu_id;
/// Pointer to the handler function for the pdu above.
att_func_t handler;
};
// --------------------------- Database permissions -----------------------------
/// Macro used to retrieve access permission rights
#define PERM_GET(perm, access)\
(((perm) & (PERM_MASK_ ## access)) >> (PERM_POS_ ## access))
/// Macro used to set a permission value
#define PERM_SET(perm, access, value)\
perm = ((perm & ~(PERM_MASK_ ## access)) | ((value << (PERM_POS_ ## access)) & (PERM_MASK_ ## access)))
/// Macro used to retrieve permission value from access and rights on attribute.
#define PERM(access, right) \
(((PERM_RIGHT_ ## right) << (PERM_POS_ ## access)) & (PERM_MASK_ ## access))
/// Macro used know if permission is set or not.
#define PERM_IS_SET(perm, access, right) \
(((perm) & (((PERM_RIGHT_ ## right) << (PERM_POS_ ## access))) \
& (PERM_MASK_ ## access)) == PERM(access, right))
/// Macro used to create permission value
#define PERM_VAL(access, perm) \
((((perm) << (PERM_POS_ ## access))) & (PERM_MASK_ ## access))
/// Retrieve attribute security level from attribute right and service right
#define ATT_GET_SEC_LVL(att_right, svc_right) \
co_max(((att_right) & PERM_RIGHT_AUTH), ((svc_right) & PERM_RIGHT_AUTH));
/// Retrieve UUID LEN from UUID Length Permission
#define ATT_UUID_LEN(uuid_len_perm) ((uuid_len_perm == 0) ? ATT_UUID_16_LEN : \
((uuid_len_perm == 1) ? ATT_UUID_32_LEN : \
((uuid_len_perm == 2) ? ATT_UUID_128_LEN : 0)))
/// Initialization of attribute element
#define ATT_ELEMT_INIT {{NULL}, false}
/**
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
* |EXT | WS | I | N | WR | WC | RD | B | NP | IP | WP | RP |
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
*
* Bit [0-1] : Read Permission (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
* Bit [2-3] : Write Permission (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
* Bit [4-5] : Indication Permission (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
* Bit [6-7] : Notification Permission (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = SEC_CON)
*
* Bit [8] : Extended properties present (only relevant for a characteristic value)
* Bit [9] : Broadcast permission (only relevant for a characteristic value)
* Bit [10] : Write Command accepted
* Bit [11] : Write Signed accepted
* Bit [12] : Write Request accepted
* Bit [13] : Encryption key Size must be 16 bytes
*/
enum attm_perm_mask
{
/// retrieve all permission info
PERM_MASK_ALL = 0x0000,
/// Read Permission Mask
PERM_MASK_RP = 0x0003,
PERM_POS_RP = 0,
/// Write Permission Mask
PERM_MASK_WP = 0x000C,
PERM_POS_WP = 2,
/// Indication Access Mask
PERM_MASK_IP = 0x0030,
PERM_POS_IP = 4,
/// Notification Access Mask
PERM_MASK_NP = 0x00C0,
PERM_POS_NP = 6,
/// Broadcast descriptor present
PERM_MASK_BROADCAST = 0x0100,
PERM_POS_BROADCAST = 8,
/// Read Access Mask
PERM_MASK_RD = 0x0200,
PERM_POS_RD = 9,
/// Write Command Enabled attribute Mask
PERM_MASK_WRITE_COMMAND = 0x0400,
PERM_POS_WRITE_COMMAND = 10,
/// Write Request Enabled attribute Mask
PERM_MASK_WRITE_REQ = 0x0800,
PERM_POS_WRITE_REQ = 11,
/// Notification Access Mask
PERM_MASK_NTF = 0x1000,
PERM_POS_NTF = 12,
/// Indication Access Mask
PERM_MASK_IND = 0x2000,
PERM_POS_IND = 13,
/// Write Signed Enabled attribute Mask
PERM_MASK_WRITE_SIGNED = 0x4000,
PERM_POS_WRITE_SIGNED = 14,
/// Extended properties descriptor present
PERM_MASK_EXT = 0x8000,
PERM_POS_EXT = 15,
/// Properties
PERM_MASK_PROP = 0xFF00,
PERM_POS_PROP = 8,
};
/**
* Value permission bit field
*
* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
* | RI |UUID_LEN |EKS | MAX_LEN (RI = 1) / Value Offset (RI = 0) |
* +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
*
* Bit [0-11] : Maximum Attribute Length or Value Offset pointer
* Bit [12] : Encryption key Size must be 16 bytes
* Bit [14-13]: UUID Length (0 = 16 bits, 1 = 32 bits, 2 = 128 bits, 3 = RFU)
* Bit [15] : Trigger Read Indication (0 = Value present in Database, 1 = Value not present in Database)
*/
enum attm_value_perm_mask
{
/// Maximum Attribute Length
PERM_MASK_MAX_LEN = 0x0FFF,
PERM_POS_MAX_LEN = 0,
/// Attribute value Offset
PERM_MASK_VAL_OFFSET = 0x0FFF,
PERM_POS_VAL_OFFSET = 0,
/// Check Encryption key size Mask
PERM_MASK_EKS = 0x1000,
PERM_POS_EKS = 12,
/// UUID Length
PERM_MASK_UUID_LEN = 0x6000,
PERM_POS_UUID_LEN = 13,
/// Read trigger Indication
PERM_MASK_RI = 0x8000,
PERM_POS_RI = 15,
};
/**
* Service permissions
*
* 7 6 5 4 3 2 1 0
* +----+----+----+----+----+----+----+----+
* |SEC |UUID_LEN |DIS | AUTH |EKS | MI |
* +----+----+----+----+----+----+----+----+
*
* Bit [0] : Task that manage service is multi-instantiated (Connection index is conveyed)
* Bit [1] : Encryption key Size must be 16 bytes
* Bit [2-3]: Service Permission (0 = NO_AUTH, 1 = UNAUTH, 2 = AUTH, 3 = Secure Connect)
* Bit [4] : Disable the service
* Bit [5-6]: UUID Length (0 = 16 bits, 1 = 32 bits, 2 = 128 bits, 3 = RFU)
* Bit [7] : Secondary Service (0 = Primary Service, 1 = Secondary Service)
*/
enum attm_svc_perm_mask
{
/// Task that manage service is multi-instantiated
PERM_MASK_SVC_MI = 0x01,
PERM_POS_SVC_MI = 0,
/// Check Encryption key size for service Access
PERM_MASK_SVC_EKS = 0x02,
PERM_POS_SVC_EKS = 1,
/// Service Permission authentication
PERM_MASK_SVC_AUTH = 0x0C,
PERM_POS_SVC_AUTH = 2,
/// Disable the service
PERM_MASK_SVC_DIS = 0x10,
PERM_POS_SVC_DIS = 4,
/// Service UUID Length
PERM_MASK_SVC_UUID_LEN = 0x60,
PERM_POS_SVC_UUID_LEN = 5,
/// Service type Secondary
PERM_MASK_SVC_SECONDARY = 0x80,
PERM_POS_SVC_SECONDARY = 7,
};
/// Attribute & Service access mode
enum
{
/// Disable access
PERM_RIGHT_DISABLE = 0,
/// Enable access
PERM_RIGHT_ENABLE = 1,
};
/// Attribute & Service access rights
enum
{
/// No Authentication
PERM_RIGHT_NO_AUTH = 0,
/// Access Requires Unauthenticated link
PERM_RIGHT_UNAUTH = 1,
/// Access Requires Authenticated link
PERM_RIGHT_AUTH = 2,
/// Access Requires Secure Connection link
PERM_RIGHT_SEC_CON = 3,
};
/// Attribute & Service UUID Length
enum
{
/// 16 bits UUID
PERM_UUID_16 = 0,
PERM_RIGHT_UUID_16 = 0,
/// 32 bits UUID
PERM_UUID_32 = 1,
PERM_RIGHT_UUID_32 = 1,
/// 128 bits UUID
PERM_UUID_128 = 2,
PERM_RIGHT_UUID_128 = 2,
/// Invalid
PERM_UUID_RFU = 3,
};
/// execute flags
enum
{
/// Cancel All the Reliable Writes
ATT_CANCEL_ALL_PREPARED_WRITES = 0x00,
/// Write All the Reliable Writes
ATT_EXECUTE_ALL_PREPARED_WRITES
};
/// @} ATT
#endif // ATT_H_