/** **************************************************************************************** * * @file att.h * * @brief Attribute Protocol Header file. * **************************************************************************************** */ #ifndef ATT_H_ #define ATT_H_ /* * INCLUDE FILES **************************************************************************************** */ #include /* * DEFINES **************************************************************************************** */ /// Macro used to LSB first 16-bits UUID #define ATT_UUID16(uuid) (uuid) /// Invalid attribute handle #define ATT_INVALID_HDL 0x0000 /// Invalid attribute index(per profile) #define ATT_INVALID_IDX 0xFF /// Range of attribute handle #define ATT_1ST_REQ_START_HDL 0x0001 #define ATT_1ST_REQ_END_HDL 0xFFFF /// Maximum possible attribute handle #define ATT_MAX_ATTR_HDL 0xFFFF /// 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_UUID16_LEN 0x0002 #define ATT_UUID32_LEN 0x0004 #define ATT_UUID128_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_HDL_LEN 0x0003 #define ATT_CODE_AND_HDL_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 #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_uuid16 { ATT_INVALID_UUID = ATT_UUID16(0x0000), /*----------------- SERVICES ---------------------*/ /// Generic Access Profile ATT_SVC_GENERIC_ACCESS = ATT_UUID16(0x1800), /// Attribute Profile ATT_SVC_GENERIC_ATTRIBUTE = ATT_UUID16(0x1801), /// Immediate alert Service ATT_SVC_IMMEDIATE_ALERT = ATT_UUID16(0x1802), /// Link Loss Service ATT_SVC_LINK_LOSS = ATT_UUID16(0x1803), /// Tx Power Service ATT_SVC_TX_POWER = ATT_UUID16(0x1804), /// Current Time Service Service ATT_SVC_CURRENT_TIME = ATT_UUID16(0x1805), /// Reference Time Update Service ATT_SVC_REF_TIME_UPDATE = ATT_UUID16(0x1806), /// Next DST Change Service ATT_SVC_NEXT_DST_CHANGE = ATT_UUID16(0x1807), /// Glucose Service ATT_SVC_GLUCOSE = ATT_UUID16(0x1808), /// Health Thermometer Service ATT_SVC_HEALTH_THERMOM = ATT_UUID16(0x1809), /// Device Information Service ATT_SVC_DEVICE_INFO = ATT_UUID16(0x180A), /// Heart Rate Service ATT_SVC_HEART_RATE = ATT_UUID16(0x180D), /// Phone Alert Status Service ATT_SVC_PHONE_ALERT_STATUS = ATT_UUID16(0x180E), /// Battery Service ATT_SVC_BATTERY_SERVICE = ATT_UUID16(0x180F), /// Blood Pressure Service ATT_SVC_BLOOD_PRESSURE = ATT_UUID16(0x1810), /// Alert Notification Service ATT_SVC_ALERT_NTF = ATT_UUID16(0x1811), /// HID Service ATT_SVC_HID = ATT_UUID16(0x1812), /// Scan Parameters Service ATT_SVC_SCAN_PARAMETERS = ATT_UUID16(0x1813), /// Running Speed and Cadence Service ATT_SVC_RUNNING_SPEED_CADENCE = ATT_UUID16(0x1814), /// Cycling Speed and Cadence Service ATT_SVC_CYCLING_SPEED_CADENCE = ATT_UUID16(0x1816), /// Cycling Power Service ATT_SVC_CYCLING_POWER = ATT_UUID16(0x1818), /// Location and Navigation Service ATT_SVC_LOCATION_AND_NAVIGATION = ATT_UUID16(0x1819), /// Environmental Sensing Service ATT_SVC_ENVIRONMENTAL_SENSING = ATT_UUID16(0x181A), /// Body Composition Service ATT_SVC_BODY_COMPOSITION = ATT_UUID16(0x181B), /// User Data Service ATT_SVC_USER_DATA = ATT_UUID16(0x181C), /// Weight Scale Service ATT_SVC_WEIGHT_SCALE = ATT_UUID16(0x181D), /// Bond Management Service ATT_SVC_BOND_MANAGEMENT = ATT_UUID16(0x181E), /// Continuous Glucose Monitoring Service ATT_SVC_CONTINUOUS_GLUCOSE_MONITORING = ATT_UUID16(0x181F), /// Internet Protocol Support Service ATT_SVC_IP_SUPPORT = ATT_UUID16(0x1820), /// Indoor Positioning Service ATT_SVC_INDOOR_POSITIONING = ATT_UUID16(0x1821), /// Pulse Oximeter Service ATT_SVC_PULSE_OXIMETER = ATT_UUID16(0x1822), /// HTTP Proxy Service ATT_SVC_HTTP_PROXY = ATT_UUID16(0x1823), /// Transport Discovery Service ATT_SVC_TRANSPORT_DISCOVERY = ATT_UUID16(0x1824), /// Object Transfer Service ATT_SVC_OBJECT_TRANSFER = ATT_UUID16(0x1825), /// Mesh Provisioning Service ATT_SVC_MESH_PROVISIONING = ATT_UUID16(0x1827), /// Mesh Proxy Service ATT_SVC_MESH_PROXY = ATT_UUID16(0x1828), /*------------------- UNITS ---------------------*/ /// No defined unit ATT_UNIT_UNITLESS = ATT_UUID16(0x2700), /// Length Unit - Metre ATT_UNIT_METRE = ATT_UUID16(0x2701), /// Mass unit - Kilogram ATT_UNIT_KG = ATT_UUID16(0x2702), /// Time unit - second ATT_UNIT_SECOND = ATT_UUID16(0x2703), /// Electric current unit - Ampere ATT_UNIT_AMPERE = ATT_UUID16(0x2704), /// Thermodynamic Temperature unit - Kelvin ATT_UNIT_KELVIN = ATT_UUID16(0x2705), /// Amount of substance unit - mole ATT_UNIT_MOLE = ATT_UUID16(0x2706), /// Luminous intensity unit - candela ATT_UNIT_CANDELA = ATT_UUID16(0x2707), /// Area unit - square metres ATT_UNIT_SQ_METRE = ATT_UUID16(0x2710), /// Colume unit - cubic metres ATT_UNIT_CUBIC_METRE = ATT_UUID16(0x2710), /// Velocity unit - metres per second ATT_UNIT_METRE_PER_SECOND = ATT_UUID16(0x2711), /// Acceleration unit - metres per second squared ATT_UNIT_METRES_PER_SEC_SQ = ATT_UUID16(0x2712), /// Wavenumber unit - reciprocal metre ATT_UNIT_RECIPROCAL_METRE = ATT_UUID16(0x2713), /// Density unit - kilogram per cubic metre ATT_UNIT_DENS_KG_PER_CUBIC_METRE = ATT_UUID16(0x2714), /// Surface density unit - kilogram per square metre ATT_UNIT_KG_PER_SQ_METRE = ATT_UUID16(0x2715), /// Specific volume unit - cubic metre per kilogram ATT_UNIT_CUBIC_METRE_PER_KG = ATT_UUID16(0x2716), /// Current density unit - ampere per square metre ATT_UNIT_AMPERE_PER_SQ_METRE = ATT_UUID16(0x2717), /// Magnetic field strength unit - Ampere per metre ATT_UNIT_AMPERE_PER_METRE = ATT_UUID16(0x2718), /// Amount concentration unit - mole per cubic metre ATT_UNIT_MOLE_PER_CUBIC_METRE = ATT_UUID16(0x2719), /// Mass Concentration unit - kilogram per cubic metre ATT_UNIT_MASS_KG_PER_CUBIC_METRE = ATT_UUID16(0x271A), /// Luminance unit - candela per square metre ATT_UNIT_CANDELA_PER_SQ_METRE = ATT_UUID16(0x271B), /// Refractive index unit ATT_UNIT_REFRACTIVE_INDEX = ATT_UUID16(0x271C), /// Relative permeability unit ATT_UNIT_RELATIVE_PERMEABILITY = ATT_UUID16(0x271D), /// Plane angle unit - radian ATT_UNIT_RADIAN = ATT_UUID16(0x2720), /// Solid angle unit - steradian ATT_UNIT_STERADIAN = ATT_UUID16(0x2721), /// Frequency unit - Hertz ATT_UNIT_HERTZ = ATT_UUID16(0x2722), /// Force unit - Newton ATT_UNIT_NEWTON = ATT_UUID16(0x2723), /// Pressure unit - Pascal ATT_UNIT_PASCAL = ATT_UUID16(0x2724), /// Energy unit - Joule ATT_UNIT_JOULE = ATT_UUID16(0x2725), /// Power unit - Watt ATT_UNIT_WATT = ATT_UUID16(0x2726), /// electric Charge unit - Coulomb ATT_UNIT_COULOMB = ATT_UUID16(0x2727), /// Electric potential difference - Volt ATT_UNIT_VOLT = ATT_UUID16(0x2728), /// Capacitance unit - Farad ATT_UNIT_FARAD = ATT_UUID16(0x2729), /// electric resistance unit - Ohm ATT_UNIT_OHM = ATT_UUID16(0x272A), /// Electric conductance - Siemens ATT_UNIT_SIEMENS = ATT_UUID16(0x272B), /// Magnetic flux unit - Weber ATT_UNIT_WEBER = ATT_UUID16(0x272C), /// Magnetic flux density unit - Tesla ATT_UNIT_TESLA = ATT_UUID16(0x272D), /// Inductance unit - Henry ATT_UNIT_HENRY = ATT_UUID16(0x272E), /// Temperature unit - degree Celsius ATT_UNIT_CELSIUS = ATT_UUID16(0x272F), /// Luminous flux unit - lumen ATT_UNIT_LUMEN = ATT_UUID16(0x2730), /// Illuminance unit - lux ATT_UNIT_LUX = ATT_UUID16(0x2731), /// Activity referred to a radionuclide unit - becquerel ATT_UNIT_BECQUEREL = ATT_UUID16(0x2732), /// Absorbed dose unit - Gray ATT_UNIT_GRAY = ATT_UUID16(0x2733), /// Dose equivalent unit - Sievert ATT_UNIT_SIEVERT = ATT_UUID16(0x2734), /// Catalytic activity unit - Katal ATT_UNIT_KATAL = ATT_UUID16(0x2735), /// Synamic viscosity unit - Pascal second ATT_UNIT_PASCAL_SECOND = ATT_UUID16(0x2740), /// Moment of force unit - Newton metre ATT_UNIT_NEWTON_METRE = ATT_UUID16(0x2741), /// surface tension unit - Newton per metre ATT_UNIT_NEWTON_PER_METRE = ATT_UUID16(0x2742), /// Angular velocity unit - radian per second ATT_UNIT_RADIAN_PER_SECOND = ATT_UUID16(0x2743), /// Angular acceleration unit - radian per second squared ATT_UNIT_RADIAN_PER_SECOND_SQ = ATT_UUID16(0x2744), /// Heat flux density unit - Watt per square metre ATT_UNIT_WATT_PER_SQ_METRE = ATT_UUID16(0x2745), /// HEat capacity unit - Joule per Kelvin ATT_UNIT_JOULE_PER_KELVIN = ATT_UUID16(0x2746), /// Specific heat capacity unit - Joule per kilogram kelvin ATT_UNIT_JOULE_PER_KG_KELVIN = ATT_UUID16(0x2747), /// Specific Energy unit - Joule per kilogram ATT_UNIT_JOULE_PER_KG = ATT_UUID16(0x2748), /// Thermal conductivity - Watt per metre Kelvin ATT_UNIT_WATT_PER_METRE_KELVIN = ATT_UUID16(0x2749), /// Energy Density unit - joule per cubic metre ATT_UNIT_JOULE_PER_CUBIC_METRE = ATT_UUID16(0x274A), /// Electric field strength unit - volt per metre ATT_UNIT_VOLT_PER_METRE = ATT_UUID16(0x274B), /// Electric charge density unit - coulomb per cubic metre ATT_UNIT_COULOMB_PER_CUBIC_METRE = ATT_UUID16(0x274C), /// Surface charge density unit - coulomb per square metre ATT_UNIT_SURF_COULOMB_PER_SQ_METRE = ATT_UUID16(0x274D), /// Electric flux density unit - coulomb per square metre ATT_UNIT_FLUX_COULOMB_PER_SQ_METRE = ATT_UUID16(0x274E), /// Permittivity unit - farad per metre ATT_UNIT_FARAD_PER_METRE = ATT_UUID16(0x274F), /// Permeability unit - henry per metre ATT_UNIT_HENRY_PER_METRE = ATT_UUID16(0x2750), /// Molar energy unit - joule per mole ATT_UNIT_JOULE_PER_MOLE = ATT_UUID16(0x2751), /// Molar entropy unit - joule per mole kelvin ATT_UNIT_JOULE_PER_MOLE_KELVIN = ATT_UUID16(0x2752), /// Exposure unit - coulomb per kilogram ATT_UNIT_COULOMB_PER_KG = ATT_UUID16(0x2753), /// Absorbed dose rate unit - gray per second ATT_UNIT_GRAY_PER_SECOND = ATT_UUID16(0x2754), /// Radiant intensity unit - watt per steradian ATT_UNIT_WATT_PER_STERADIAN = ATT_UUID16(0x2755), /// Radiance unit - watt per square meter steradian ATT_UNIT_WATT_PER_SQ_METRE_STERADIAN = ATT_UUID16(0x2756), /// Catalytic activity concentration unit - katal per cubic metre ATT_UNIT_KATAL_PER_CUBIC_METRE = ATT_UUID16(0x2757), /// Time unit - minute ATT_UNIT_MINUTE = ATT_UUID16(0x2760), /// Time unit - hour ATT_UNIT_HOUR = ATT_UUID16(0x2761), /// Time unit - day ATT_UNIT_DAY = ATT_UUID16(0x2762), /// Plane angle unit - degree ATT_UNIT_ANGLE_DEGREE = ATT_UUID16(0x2763), /// Plane angle unit - minute ATT_UNIT_ANGLE_MINUTE = ATT_UUID16(0x2764), /// Plane angle unit - second ATT_UNIT_ANGLE_SECOND = ATT_UUID16(0x2765), /// Area unit - hectare ATT_UNIT_HECTARE = ATT_UUID16(0x2766), /// Volume unit - litre ATT_UNIT_LITRE = ATT_UUID16(0x2767), /// Mass unit - tonne ATT_UNIT_TONNE = ATT_UUID16(0x2768), /// Pressure unit - bar ATT_UNIT_BAR = ATT_UUID16(0x2780), /// Pressure unit - millimetre of mercury ATT_UNIT_MM_MERCURY = ATT_UUID16(0x2781), /// Length unit - angstrom ATT_UNIT_ANGSTROM = ATT_UUID16(0x2782), /// Length unit - nautical mile ATT_UNIT_NAUTICAL_MILE = ATT_UUID16(0x2783), /// Area unit - barn ATT_UNIT_BARN = ATT_UUID16(0x2784), /// Velocity unit - knot ATT_UNIT_KNOT = ATT_UUID16(0x2785), /// Logarithmic radio quantity unit - neper ATT_UNIT_NEPER = ATT_UUID16(0x2786), /// Logarithmic radio quantity unit - bel ATT_UNIT_BEL = ATT_UUID16(0x2787), /// Length unit - yard ATT_UNIT_YARD = ATT_UUID16(0x27A0), /// Length unit - parsec ATT_UNIT_PARSEC = ATT_UUID16(0x27A1), /// length unit - inch ATT_UNIT_INCH = ATT_UUID16(0x27A2), /// length unit - foot ATT_UNIT_FOOT = ATT_UUID16(0x27A3), /// length unit - mile ATT_UNIT_MILE = ATT_UUID16(0x27A4), /// pressure unit - pound-force per square inch ATT_UNIT_POUND_FORCE_PER_SQ_INCH = ATT_UUID16(0x27A5), /// velocity unit - kilometre per hour ATT_UNIT_KM_PER_HOUR = ATT_UUID16(0x27A6), /// velocity unit - mile per hour ATT_UNIT_MILE_PER_HOUR = ATT_UUID16(0x27A7), /// angular velocity unit - revolution per minute ATT_UNIT_REVOLUTION_PER_MINUTE = ATT_UUID16(0x27A8), /// energy unit - gram calorie ATT_UNIT_GRAM_CALORIE = ATT_UUID16(0x27A9), /// energy unit - kilogram calorie ATT_UNIT_KG_CALORIE = ATT_UUID16(0x27AA), /// energy unit - kilowatt hour ATT_UNIT_KILOWATT_HOUR = ATT_UUID16(0x27AB), /// thermodynamic temperature unit - degree Fahrenheit ATT_UNIT_FAHRENHEIT = ATT_UUID16(0x27AC), /// percentage ATT_UNIT_PERCENTAGE = ATT_UUID16(0x27AD), /// per mille ATT_UNIT_PER_MILLE = ATT_UUID16(0x27AE), /// period unit - beats per minute) ATT_UNIT_BEATS_PER_MINUTE = ATT_UUID16(0x27AF), /// electric charge unit - ampere hours ATT_UNIT_AMPERE_HOURS = ATT_UUID16(0x27B0), /// mass density unit - milligram per decilitre ATT_UNIT_MILLIGRAM_PER_DECILITRE = ATT_UUID16(0x27B1), /// mass density unit - millimole per litre ATT_UNIT_MILLIMOLE_PER_LITRE = ATT_UUID16(0x27B2), /// time unit - year ATT_UNIT_YEAR = ATT_UUID16(0x27B3), //// time unit - month ATT_UNIT_MONTH = ATT_UUID16(0x27B4), /*---------------- DECLARATIONS -----------------*/ /// Primary service Declaration ATT_DECL_PRIMARY_SERVICE = ATT_UUID16(0x2800), /// Secondary service Declaration ATT_DECL_SECONDARY_SERVICE = ATT_UUID16(0x2801), /// Include Declaration ATT_DECL_INCLUDE = ATT_UUID16(0x2802), /// Characteristic Declaration ATT_DECL_CHARACTERISTIC = ATT_UUID16(0x2803), /*----------------- DESCRIPTORS -----------------*/ /// Characteristic extended properties ATT_DESC_CHAR_EXT_PROPERTIES = ATT_UUID16(0x2900), /// Characteristic user description ATT_DESC_CHAR_USER_DESCRIPTION = ATT_UUID16(0x2901), /// Client characteristic configuration ATT_DESC_CLIENT_CHAR_CFG = ATT_UUID16(0x2902), /// Server characteristic configuration ATT_DESC_SERVER_CHAR_CFG = ATT_UUID16(0x2903), /// Characteristic Presentation Format ATT_DESC_CHAR_PRES_FORMAT = ATT_UUID16(0x2904), /// Characteristic Aggregate Format ATT_DESC_CHAR_AGGREGATE_FORMAT = ATT_UUID16(0x2905), /// Valid Range ATT_DESC_VALID_RANGE = ATT_UUID16(0x2906), /// External Report Reference ATT_DESC_EXT_REPORT_REF = ATT_UUID16(0x2907), /// Report Reference ATT_DESC_REPORT_REF = ATT_UUID16(0x2908), /// Environmental Sensing Configuration ATT_DESC_ES_CONFIGURATION = ATT_UUID16(0x290B), /// Environmental Sensing Measurement ATT_DESC_ES_MEASUREMENT = ATT_UUID16(0x290C), /// Environmental Sensing Trigger Setting ATT_DESC_ES_TRIGGER_SETTING = ATT_UUID16(0x290D), /*--------------- CHARACTERISTICS ---------------*/ /// Device name ATT_CHAR_DEVICE_NAME = ATT_UUID16(0x2A00), /// Appearance ATT_CHAR_APPEARANCE = ATT_UUID16(0x2A01), /// Privacy flag ATT_CHAR_PRIVACY_FLAG = ATT_UUID16(0x2A02), /// Reconnection address ATT_CHAR_RECONNECTION_ADDR = ATT_UUID16(0x2A03), /// Peripheral preferred connection parameters ATT_CHAR_PERIPH_PREF_CON_PARAM = ATT_UUID16(0x2A04), /// Service handles changed ATT_CHAR_SERVICE_CHANGED = ATT_UUID16(0x2A05), /// Alert Level characteristic ATT_CHAR_ALERT_LEVEL = ATT_UUID16(0x2A06), /// Tx Power Level ATT_CHAR_TX_POWER_LEVEL = ATT_UUID16(0x2A07), /// Date Time ATT_CHAR_DATE_TIME = ATT_UUID16(0x2A08), /// Day of Week ATT_CHAR_DAY_WEEK = ATT_UUID16(0x2A09), /// Day Date Time ATT_CHAR_DAY_DATE_TIME = ATT_UUID16(0x2A0A), /// Exact time 256 ATT_CHAR_EXACT_TIME_256 = ATT_UUID16(0x2A0C), /// DST Offset ATT_CHAR_DST_OFFSET = ATT_UUID16(0x2A0D), /// Time zone ATT_CHAR_TIME_ZONE = ATT_UUID16(0x2A0E), /// Local time Information ATT_CHAR_LOCAL_TIME_INFO = ATT_UUID16(0x2A0F), /// Time with DST ATT_CHAR_TIME_WITH_DST = ATT_UUID16(0x2A11), /// Time Accuracy ATT_CHAR_TIME_ACCURACY = ATT_UUID16(0x2A12), /// Time Source ATT_CHAR_TIME_SOURCE = ATT_UUID16(0x2A13), /// Reference Time Information ATT_CHAR_REFERENCE_TIME_INFO = ATT_UUID16(0x2A14), /// Time Update Control Point ATT_CHAR_TIME_UPDATE_CTRL_POINT = ATT_UUID16(0x2A16), /// Time Update State ATT_CHAR_TIME_UPDATE_STATE = ATT_UUID16(0x2A17), /// Glucose Measurement ATT_CHAR_GLUCOSE_MEAS = ATT_UUID16(0x2A18), /// Battery Level ATT_CHAR_BATTERY_LEVEL = ATT_UUID16(0x2A19), /// Battery Power Status ATT_CHAR_BATTERY_POWER_STATE = ATT_UUID16(0x2A1A), /// Battery Level State ATT_CHAR_BATTERY_LEVEL_STATE = ATT_UUID16(0x2A1B), /// Temperature Measurement ATT_CHAR_TEMPERATURE_MEAS = ATT_UUID16(0x2A1C), /// Temperature Type ATT_CHAR_TEMPERATURE_TYPE = ATT_UUID16(0x2A1D), /// Intermediate Temperature ATT_CHAR_INTERMED_TEMPERATURE = ATT_UUID16(0x2A1E), /// Measurement Interval ATT_CHAR_MEAS_INTERVAL = ATT_UUID16(0x2A21), /// Boot Keyboard Input Report ATT_CHAR_BOOT_KB_IN_REPORT = ATT_UUID16(0x2A22), /// System ID ATT_CHAR_SYS_ID = ATT_UUID16(0x2A23), /// Model Number String ATT_CHAR_MODEL_NB = ATT_UUID16(0x2A24), /// Serial Number String ATT_CHAR_SERIAL_NB = ATT_UUID16(0x2A25), /// Firmware Revision String ATT_CHAR_FW_REV = ATT_UUID16(0x2A26), /// Hardware revision String ATT_CHAR_HW_REV = ATT_UUID16(0x2A27), /// Software Revision String ATT_CHAR_SW_REV = ATT_UUID16(0x2A28), /// Manufacturer Name String ATT_CHAR_MANUF_NAME = ATT_UUID16(0x2A29), /// IEEE Regulatory Certification Data List ATT_CHAR_IEEE_CERTIF = ATT_UUID16(0x2A2A), /// CT Time ATT_CHAR_CT_TIME = ATT_UUID16(0x2A2B), /// Magnetic Declination ATT_CHAR_MAGN_DECLINE = ATT_UUID16(0x2A2C), /// Scan Refresh ATT_CHAR_SCAN_REFRESH = ATT_UUID16(0x2A31), /// Boot Keyboard Output Report ATT_CHAR_BOOT_KB_OUT_REPORT = ATT_UUID16(0x2A32), /// Boot Mouse Input Report ATT_CHAR_BOOT_MOUSE_IN_REPORT = ATT_UUID16(0x2A33), /// Glucose Measurement Context ATT_CHAR_GLUCOSE_MEAS_CTX = ATT_UUID16(0x2A34), /// Blood Pressure Measurement ATT_CHAR_BLOOD_PRESSURE_MEAS = ATT_UUID16(0x2A35), /// Intermediate Cuff Pressure ATT_CHAR_INTERMEDIATE_CUFF_PRESSURE = ATT_UUID16(0x2A36), /// Heart Rate Measurement ATT_CHAR_HEART_RATE_MEAS = ATT_UUID16(0x2A37), /// Body Sensor Location ATT_CHAR_BODY_SENSOR_LOCATION = ATT_UUID16(0x2A38), /// Heart Rate Control Point ATT_CHAR_HEART_RATE_CTRL_POINT = ATT_UUID16(0x2A39), /// Alert Status ATT_CHAR_ALERT_STATUS = ATT_UUID16(0x2A3F), /// Ringer Control Point ATT_CHAR_RINGER_CTRL_POINT = ATT_UUID16(0x2A40), /// Ringer Setting ATT_CHAR_RINGER_SETTING = ATT_UUID16(0x2A41), /// Alert Category ID Bit Mask ATT_CHAR_ALERT_CAT_ID_BIT_MASK = ATT_UUID16(0x2A42), /// Alert Category ID ATT_CHAR_ALERT_CAT_ID = ATT_UUID16(0x2A43), /// Alert Notification Control Point ATT_CHAR_ALERT_NTF_CTRL_PT = ATT_UUID16(0x2A44), /// Unread Alert Status ATT_CHAR_UNREAD_ALERT_STATUS = ATT_UUID16(0x2A45), /// New Alert ATT_CHAR_NEW_ALERT = ATT_UUID16(0x2A46), /// Supported New Alert Category ATT_CHAR_SUP_NEW_ALERT_CAT = ATT_UUID16(0x2A47), /// Supported Unread Alert Category ATT_CHAR_SUP_UNREAD_ALERT_CAT = ATT_UUID16(0x2A48), /// Blood Pressure Feature ATT_CHAR_BLOOD_PRESSURE_FEATURE = ATT_UUID16(0x2A49), /// HID Information ATT_CHAR_HID_INFO = ATT_UUID16(0x2A4A), /// Report Map ATT_CHAR_REPORT_MAP = ATT_UUID16(0x2A4B), /// HID Control Point ATT_CHAR_HID_CTRL_PT = ATT_UUID16(0x2A4C), /// Report ATT_CHAR_REPORT = ATT_UUID16(0x2A4D), /// Protocol Mode ATT_CHAR_PROTOCOL_MODE = ATT_UUID16(0x2A4E), /// Scan Interval Window ATT_CHAR_SCAN_INTV_WD = ATT_UUID16(0x2A4F), /// PnP ID ATT_CHAR_PNP_ID = ATT_UUID16(0x2A50), /// Glucose Feature ATT_CHAR_GLUCOSE_FEATURE = ATT_UUID16(0x2A51), /// Record access control point ATT_CHAR_REC_ACCESS_CTRL_PT = ATT_UUID16(0x2A52), /// RSC Measurement ATT_CHAR_RSC_MEAS = ATT_UUID16(0x2A53), /// RSC Feature ATT_CHAR_RSC_FEAT = ATT_UUID16(0x2A54), /// SC Control Point ATT_CHAR_SC_CTRL_PT = ATT_UUID16(0x2A55), /// CSC Measurement ATT_CHAR_CSC_MEAS = ATT_UUID16(0x2A5B), /// CSC Feature ATT_CHAR_CSC_FEAT = ATT_UUID16(0x2A5C), /// Sensor Location ATT_CHAR_SENSOR_LOC = ATT_UUID16(0x2A5D), /// PLX Spot-Check Measurement ATT_CHAR_PLX_SPOT_CHECK_MEASUREMENT_LOC = ATT_UUID16(0x2A5E), /// PLX Continuous Measurement ATT_CHAR_PLX_CONTINUOUS_MEASUREMENT_LOC = ATT_UUID16(0x2A5F), /// PLX Features ATT_CHAR_PLX_FEATURES_LOC = ATT_UUID16(0x2A60), /// CP Measurement ATT_CHAR_CP_MEAS = ATT_UUID16(0x2A63), /// CP Vector ATT_CHAR_CP_VECTOR = ATT_UUID16(0x2A64), /// CP Feature ATT_CHAR_CP_FEAT = ATT_UUID16(0x2A65), /// CP Control Point ATT_CHAR_CP_CTRL_PT = ATT_UUID16(0x2A66), /// Location and Speed ATT_CHAR_LOC_SPEED = ATT_UUID16(0x2A67), /// Navigation ATT_CHAR_NAVIGATION = ATT_UUID16(0x2A68), /// Position Quality ATT_CHAR_POS_QUALITY = ATT_UUID16(0x2A69), /// LN Feature ATT_CHAR_LN_FEAT = ATT_UUID16(0x2A6A), /// LN Control Point ATT_CHAR_LN_CTRL_PT = ATT_UUID16(0x2A6B), /// Elevation ATT_CHAR_ELEVATION = ATT_UUID16(0x2A6C), /// Pressure ATT_CHAR_PRESSURE = ATT_UUID16(0x2A6D), /// Temperature ATT_CHAR_TEMPERATURE = ATT_UUID16(0x2A6E), /// Humidity ATT_CHAR_HUMIDITY = ATT_UUID16(0x2A6F), /// True Wind Speed ATT_CHAR_TRUE_WIND_SPEED = ATT_UUID16(0x2A70), /// True Wind Direction ATT_CHAR_TRUE_WIND_DIR = ATT_UUID16(0x2A71), /// Apparent Wind Speed ATT_CHAR_APRNT_WIND_SPEED = ATT_UUID16(0x2A72), /// Apparent Wind Direction ATT_CHAR_APRNT_WIND_DIRECTION = ATT_UUID16(0x2A73), /// Gust Factor ATT_CHAR_GUST_FACTOR = ATT_UUID16(0x2A74), /// Pollen Concentration ATT_CHAR_POLLEN_CONC = ATT_UUID16(0x2A75), /// UV Index ATT_CHAR_UV_INDEX = ATT_UUID16(0x2A76), /// Irradiance ATT_CHAR_IRRADIANCE = ATT_UUID16(0x2A77), /// Rainfall ATT_CHAR_RAINFALL = ATT_UUID16(0x2A78), /// Wind Chill ATT_CHAR_WIND_CHILL = ATT_UUID16(0x2A79), /// Heat Index ATT_CHAR_HEAT_INDEX = ATT_UUID16(0x2A7A), /// Dew Point ATT_CHAR_DEW_POINT = ATT_UUID16(0x2A7B), /// Descriptor Value Changed ATT_CHAR_DESCRIPTOR_VALUE_CHANGED = ATT_UUID16(0x2A7D), /// Aerobic Heart Rate Lower Limit ATT_CHAR_AEROBIC_HEART_RATE_LOWER_LIMIT = ATT_UUID16(0x2A7E), /// Aerobic Threshhold ATT_CHAR_AEROBIC_THRESHHOLD = ATT_UUID16(0x2A7F), /// Age ATT_CHAR_AGE = ATT_UUID16(0x2A80), /// Anaerobic Heart Rate Lower Limit ATT_CHAR_ANAEROBIC_HEART_RATE_LOWER_LIMIT = ATT_UUID16(0x2A81), /// Anaerobic Heart Rate Upper Limit ATT_CHAR_ANAEROBIC_HEART_RATE_UPPER_LIMIT = ATT_UUID16(0x2A82), /// Anaerobic Threshhold ATT_CHAR_ANAEROBIC_THRESHHOLD = ATT_UUID16(0x2A83), /// Aerobic Heart Rate Upper Limit ATT_CHAR_AEROBIC_HEART_RATE_UPPER_LIMIT = ATT_UUID16(0x2A84), /// Date Of Birth ATT_CHAR_DATE_OF_BIRTH = ATT_UUID16(0x2A85), /// Date Of Threshold Assessment ATT_CHAR_DATE_OF_THRESHOLD_ASSESSMENT = ATT_UUID16(0x2A86), /// Email Address ATT_CHAR_EMAIL_ADDRESS = ATT_UUID16(0x2A87), /// Fat Burn Heart Rate Lower Limit ATT_CHAR_FAT_BURN_HEART_RATE_LOWER_LIMIT = ATT_UUID16(0x2A88), /// Fat Burn Heart Rate Upper Limit ATT_CHAR_FAT_BURN_HEART_RATE_UPPER_LIMIT = ATT_UUID16(0x2A89), /// First Name ATT_CHAR_FIRST_NAME = ATT_UUID16(0x2A8A), /// Five Zone Heart Rate Limits ATT_CHAR_FIVE_ZONE_HEART_RATE_LIMITS = ATT_UUID16(0x2A8B), /// Gender ATT_CHAR_GENDER = ATT_UUID16(0x2A8C), /// Max Heart Rate ATT_CHAR_MAX_HEART_RATE = ATT_UUID16(0x2A8D), /// Height ATT_CHAR_HEIGHT = ATT_UUID16(0x2A8E), /// Hip Circumference ATT_CHAR_HIP_CIRCUMFERENCE = ATT_UUID16(0x2A8F), /// Last Name ATT_CHAR_LAST_NAME = ATT_UUID16(0x2A90), /// Maximum Recommended Heart Rate ATT_CHAR_MAXIMUM_RECOMMENDED_HEART_RATE = ATT_UUID16(0x2A91), /// Resting Heart Rate ATT_CHAR_RESTING_HEART_RATE = ATT_UUID16(0x2A92), /// Sport Type For Aerobic And Anaerobic Thresholds ATT_CHAR_SPORT_TYPE_FOR_AEROBIC_AND_ANAEROBIC_THRESHOLDS = ATT_UUID16(0x2A93), /// Three Zone Heart Rate Limits ATT_CHAR_THREE_ZONE_HEART_RATE_LIMITS = ATT_UUID16(0x2A94), /// Two Zone Heart Rate Limit ATT_CHAR_TWO_ZONE_HEART_RATE_LIMIT = ATT_UUID16(0x2A95), /// Vo2 Max ATT_CHAR_VO2_MAX = ATT_UUID16(0x2A96), /// Waist Circumference ATT_CHAR_WAIST_CIRCUMFERENCE = ATT_UUID16(0x2A97), /// Weight ATT_CHAR_WEIGHT = ATT_UUID16(0x2A98), /// Database Change Increment ATT_CHAR_DATABASE_CHANGE_INCREMENT = ATT_UUID16(0x2A99), /// User Index ATT_CHAR_USER_INDEX = ATT_UUID16(0x2A9A), /// Body Composition Feature ATT_CHAR_BODY_COMPOSITION_FEATURE = ATT_UUID16(0x2A9B), /// Body Composition Measurement ATT_CHAR_BODY_COMPOSITION_MEASUREMENT = ATT_UUID16(0x2A9C), /// Weight Measurement ATT_CHAR_WEIGHT_MEASUREMENT = ATT_UUID16(0x2A9D), /// Weight Scale Feature ATT_CHAR_WEIGHT_SCALE_FEATURE = ATT_UUID16(0x2A9E), /// User Control Point ATT_CHAR_USER_CONTROL_POINT = ATT_UUID16(0x2A9F), /// Flux Density - 2D ATT_CHAR_MAGN_FLUX_2D = ATT_UUID16(0x2AA0), /// Magnetic Flux Density - 3D ATT_CHAR_MAGN_FLUX_3D = ATT_UUID16(0x2AA1), /// Language string ATT_CHAR_LANGUAGE = ATT_UUID16(0x2AA2), /// Barometric Pressure Trend ATT_CHAR_BAR_PRES_TREND = ATT_UUID16(0x2AA3), /// Central Address Resolution Support ATT_CHAR_CTL_ADDR_RESOL_SUPP = ATT_UUID16(0x2AA6), /// CGM Measurement ATT_CHAR_CGM_MEASUREMENT = ATT_UUID16(0x2AA7), /// CGM Features ATT_CHAR_CGM_FEATURES = ATT_UUID16(0x2AA8), /// CGM Status ATT_CHAR_CGM_STATUS = ATT_UUID16(0x2AA9), /// CGM Session Start ATT_CHAR_CGM_SESSION_START = ATT_UUID16(0x2AAA), /// CGM Session Run ATT_CHAR_CGM_SESSION_RUN = ATT_UUID16(0x2AAB), /// CGM Specific Ops Control Point ATT_CHAR_CGM_SPECIFIC_OPS_CTRL_PT = ATT_UUID16(0x2AAC), /// Resolvable Private Address only ATT_CHAR_RSLV_PRIV_ADDR_ONLY = ATT_UUID16(0x2AC9), /// Mesh Provisioning Data In ATT_CHAR_MESH_PROV_DATA_IN = ATT_UUID16(0x2ADB), /// Mesh Provisioning Data Out ATT_CHAR_MESH_PROV_DATA_OUT = ATT_UUID16(0x2ADC), /// Mesh Proxy Data In ATT_CHAR_MESH_PROXY_DATA_IN = ATT_UUID16(0x2ADD), /// Mesh Proxy Data Out ATT_CHAR_MESH_PROXY_DATA_OUT = ATT_UUID16(0x2ADE), /// Client Supported Features ATT_CHAR_CLI_SUP_FEAT = ATT_UUID16(0x2B29), /// Database Hash ATT_CHAR_DB_HASH = ATT_UUID16(0x2B2A), }; /// Format for Characteristic Presentation enum att_format_pres { /// 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 = 0x0001, /// Start indication ATT_CCC_START_IND = 0x0002, }; /* * 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_UUID128_LEN]; }; /// UUID - 32-bit type struct att_uuid_32 { /// 32-bit UUID uint8_t uuid[ATT_UUID32_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_UUID16_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_UUID128_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 declaration ----------------------------- /// macro to define an attribute property /// @param prop Property @see enum att_info_mask (RD, WC, WR, NTF, IND, WS, B, EXT) #define PROP(prop) (ATT_PROP_##prop##_BIT) /// macro to define information option bit /// @param opt Option @see enum svc_info_mask or @see enum att_ext_info_mask #define OPT(opt) (opt##_BIT) /// macro to set attribute security level on a specific permission /// @param lvl Security level @see enum sec_lvl /// @param perm Permission @see enum att_info_mask (only RP, WP, NP, IP authorized) #define ATT_SEC(perm, lvl) (((SEC_##lvl) << (ATT_PERM_##perm##_LSB)) & (ATT_PERM_##perm##_MASK)) /// macro to set attribute UUID type /// @param type UUID type (16, 32, 128) #define ATT_UUID(type) (((UUID_##type) << (ATT_UUID_TYPE_LSB)) & (ATT_UUID_TYPE_MASK)) /// macro to set service security level /// @param lvl Security level @see enum sec_lvl #define SVC_SEC(lvl) (((SEC_##lvl) << (SVC_AUTH_LSB)) & (SVC_AUTH_MASK)) /// macro to set service UUID type /// @param type UUID type (16, 32, 128) #define SVC_UUID(type) (((UUID_##type) << (SVC_UUID_TYPE_LSB)) & (SVC_UUID_TYPE_MASK)) /// UUID Type enum uuid_type { /// 16-bit UUID value UUID_16 = 0x00, /// 32-bit UUID value UUID_32 = 0x01, /// 128-bit UUID value UUID_128 = 0x02, /// Invalid UUID Type UUID_INVALID = 0x03, }; /// security level enum sec_level { /// No Authentication, unencrypted link SEC_NO_AUTH = 0x00, /// Access Requires Unauthenticated link SEC_UNAUTH = 0x01, /// Access Requires Authenticated link SEC_AUTH = 0x02, /// Access Requires Secure Connection link SEC_SECURE_CON = 0x03, }; /** * Attribute information Bit Field * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ * |EXT | WS |IND |NTF | WR | WC | RD | B | NP | IP | WP | RP | * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ * <---------------- PROP ---------------> <---------------- PERM ---------------> * * Bit [0-7] : Attribute Permissions (@see enum sec_level) * Bit [8-15] : Attribute Properties */ enum att_info_mask { /// Permissions ATT_PERM_ALL_MASK = 0x00FF, ATT_PERM_ALL_LSB = 0, /// Read Permission Mask ATT_PERM_RP_MASK = 0x0003, ATT_PERM_RP_LSB = 0, /// Write Permission Mask ATT_PERM_WP_MASK = 0x000C, ATT_PERM_WP_LSB = 2, /// Indication Access Mask ATT_PERM_IP_MASK = 0x0030, ATT_PERM_IP_LSB = 4, /// Notification Access Mask ATT_PERM_NP_MASK = 0x00C0, ATT_PERM_NP_LSB = 6, /// Properties ATT_PROP_ALL_MASK = 0xFF00, ATT_PROP_ALL_LSB = 8, /// Broadcast descriptor present ATT_PROP_BC_BIT = 0x0100, ATT_PROP_BC_POS = 8, /// Read Access Mask ATT_PROP_RD_BIT = 0x0200, ATT_PROP_RD_POS = 9, /// Write Command Enabled attribute Mask ATT_PROP_WC_BIT = 0x0400, ATT_PROP_WC_POS = 10, /// Write Request Enabled attribute Mask ATT_PROP_WR_BIT = 0x0800, ATT_PROP_WR_POS = 11, /// Notification Access Mask ATT_PROP_NTF_BIT = 0x1000, ATT_PROP_NTF_POS = 12, /// Indication Access Mask ATT_PROP_IND_BIT = 0x2000, ATT_PROP_IND_POS = 13, /// Write Signed Enabled attribute Mask ATT_PROP_WS_BIT = 0x4000, ATT_PROP_WS_POS = 14, /// Extended properties descriptor present ATT_PROP_EXT_BIT = 0x8000, ATT_PROP_EXT_POS = 15, }; /** * Attribute extended information Bit Field * * 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ * | IN |UUID_TYPE|EKS | MAX_LEN | * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ */ enum att_ext_info_mask { /// Maximum Attribute Value Length ATT_MAX_LEN_MASK = 0x0FFF, ATT_MAX_LEN_LSB = 0, /// If set, Check Encryption key size ATT_EKS_BIT = 0x1000, ATT_EKS_POS = 12, /// Type of attribute UUID (@see enum uuid_type) ATT_UUID_TYPE_MASK = 0x6000, ATT_UUID_TYPE_LSB = 13, /// If set, Value present in Database ATT_INDB_BIT = 0x8000, ATT_INDB_POS = 15, }; /** * Service information Bit Field * * F E D C B A 9 8 7 6 5 4 3 2 1 0 * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ * | RFU | STATE_EVT |SEC |UUID_TYPE|DIS | AUTH |EKS |HIDE| * +----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ */ enum svc_info_mask { /// If set, Hide Service visibility SVC_HIDE_BIT = 0x01, SVC_HIDE_POS = 0, /// If set, Encryption key Size must be 16 bytes SVC_EKS_BIT = 0x02, SVC_EKS_POS = 1, /// Service Permission authentication (@see enum sec_lvl) SVC_AUTH_MASK = 0x0C, SVC_AUTH_LSB = 2, /// If set, Disable the service SVC_DIS_BIT = 0x10, SVC_DIS_POS = 4, /// Type of service UUID (@see enum uuid_type) SVC_UUID_TYPE_MASK = 0x60, SVC_UUID_TYPE_LSB = 5, /// Service type (0 = Primary Service, 1 = Secondary Service) SVC_SECONDARY_BIT = 0x80, SVC_SECONDARY_POS = 7, /// Service state event - add from v1.4 SVC_EVT_INIT_BIT = 0x0100, SVC_EVT_INIT_POS = 8, SVC_EVT_CREATE_BIT = 0x0200, SVC_EVT_CREATE_POS = 9, SVC_EVT_CLEANUP_BIT = 0x0400, SVC_EVT_CLEANUP_POS = 10, SVC_EVT_DESTROY_BIT = 0x0800, SVC_EVT_DESTROY_POS = 11, }; enum att_prop_bfs { PROP_BC = ATT_PROP_BC_BIT, PROP_RD = ATT_PROP_RD_BIT, PROP_WC = ATT_PROP_WC_BIT, PROP_WR = ATT_PROP_WR_BIT, PROP_NTF = ATT_PROP_NTF_BIT, PROP_IND = ATT_PROP_IND_BIT, PROP_WS = ATT_PROP_WS_BIT, PROP_EXT = ATT_PROP_EXT_BIT, }; enum att_val_pres { VAL_IN = ATT_INDB_BIT, VAL_RI = 0, //PERM(RI, ENABLE), }; /// Attribute element information #define ATT_ELMT(idx, uuid16, _perm, _info) [idx - 1] = { {.uuid=uuid16}, .perm=_perm, .info=_info } #define ATT_ELMT128(idx, p_uuid, _perm, _info) [idx - 1] = { {.uuid128=p_uuid}, .perm=_perm, .info=(ATT_UUID(128) | (_info)) } #define ATT_ELMT_DECL_INCLUDE(idx) ATT_ELMT(idx, ATT_DECL_INCLUDE, PROP_RD, 0) #define ATT_ELMT_DECL_CHAR(idx) ATT_ELMT(idx, ATT_DECL_CHARACTERISTIC, PROP_RD, 0) #define ATT_ELMT_DECL_CHAR_EXT(idx) ATT_ELMT(idx, ATT_DECL_CHARACTERISTIC, PROP_RD | PROP_EXT, 0) #define ATT_ELMT_DESC_CHAR_EXT_PROPS(idx) ATT_ELMT(idx, ATT_DESC_CHAR_EXT_PROPERTIES, PROP_RD, sizeof(uint16_t)) #define ATT_ELMT_DESC_CLI_CHAR_CFG(idx) ATT_ELMT(idx, ATT_DESC_CLIENT_CHAR_CFG, PROP_RD | PROP_WR, sizeof(uint16_t)) #define ATT_ELMT_DESC_SRV_CHAR_CFG(idx) ATT_ELMT(idx, ATT_DESC_SERVER_CHAR_CFG, PROP_RD | PROP_WR, sizeof(uint16_t)) #define ATT_ELMT_DESC_REPORT_REF(idx) ATT_ELMT(idx, ATT_DESC_REPORT_REF, PROP_RD, sizeof(uint16_t)) /// Attribute element max length @see enum att_ext_info_mask #define ATT_MAX_LEN_GET(idx, _atts) ((_atts[idx-1].info & ATT_MAX_LEN_MASK) >> ATT_MAX_LEN_LSB) typedef struct att_decl { /// Attribute UUID (LSB First) union { uint16_t uuid; uint32_t uuid32; const uint8_t *uuid128; }; /// Attribute information (@see enum att_info_mask) uint16_t perm;//info; /// Attribute extended information (@see enum att_ext_info_mask) uint16_t info;//ext_info; } att_decl_t; typedef struct svc_decl { /// Service UUID (LSB First) union { uint16_t uuid; uint32_t uuid32; const uint8_t *uuid128; }; /// Service attributes const att_decl_t *atts; /// Number of attributes - extend to 16bits from v1.4 uint16_t nb_att; /// Service information (@see enum svc_info_mask)- extend to 16bits uint16_t info; } svc_decl_t; struct attm_write_req_ind { /// Data length to be written uint16_t length; /// offset at which the data has to be written uint16_t offset; /// Data to be written in attribute database uint8_t *value; }; enum atts_opcode { ATTS_READ_REQ, ATTS_WRITE_REQ, ATTS_INFO_REQ, ATTS_CMP_EVT, }; struct atts_write_ind { /// Write code(WC, WR, WS, prepWR) uint8_t wrcode; /// More packet (only true in prepWR) uint8_t more; /// Data length to be written uint16_t length; /// Data to be written in attribute database uint8_t *value; }; struct atts_prep_write_ind { struct atts_write_ind data; /// offset at which the data has to be written uint16_t offset; /// Total data length to be written uint16_t total_len; }; struct atts_cmp_evt { /// atts event type(GATT_NOTIFY - 0x12, GATT_INDICATE - 0x13) uint8_t operation; /// Status of the request uint8_t status; /// operation sequence number - provided when operation is started uint16_t seq_num; }; typedef void (*svc_func_t)(uint8_t conidx, uint8_t op_code, uint16_t handle, const void *param); uint8_t attmdb_svc_create(uint16_t *shdl, uint8_t *cfg_flag, const struct svc_decl *svc_desc, svc_func_t svc_func); #endif // ATT_H_