DA1458x BASS Database的组成结构 -- Battery Service 分析(一)

来源:互联网 发布:百度一下软件 编辑:程序博客网 时间:2024/06/14 14:26

Overview

本文基于DA1458x SDK 5.0.4。
Battery Service 以下简称BAS or BASS。BASS的代码主要有以下两个组C文件组成
BASS
另,BASS是依赖于APP_TASK任务来调度管理的。具体框架如下图(摘自Dialog官方文档)
DA1458X_SDK_ARCH

Full BAS Database Description (BAS Database 分析)

BASS的Database的变量名为 bas_att_db,由以下5个成员组成

No. Name Description 1 BAS_IDX_SVC Battery Service Declaration 2 BAS_IDX_BATT_LVL_CHAR Battery Level Characteristic Declaration 3 BAS_IDX_BATT_LVL_VAL Battery Level Characteristic Value 4 BAS_IDX_BATT_LVL_NTF_CFG Battery Level Characteristic - Client Characteristic Configuration Descriptor 5 BAS_IDX_BATT_LVL_PRES_FMT Battery Level Characteristic - Characteristic Presentation Format Descriptor

这个变量非常重要,本文我们就围绕着它来一步步来分析。

bas_att_db结构体数组索引

首先这是一个结构体数组的索引,该索引采取的是枚举类型,方便阅读和理解。

/// Battery Service Attributes Indexesenum{    BAS_IDX_SVC,    BAS_IDX_BATT_LVL_CHAR,    BAS_IDX_BATT_LVL_VAL,    BAS_IDX_BATT_LVL_NTF_CFG,    BAS_IDX_BATT_LVL_PRES_FMT,    BAS_IDX_NB,};

接下来我们看下attm_desc这个结构体的定义

struct attm_desc 结构体的定义

这个结构体的定义如下

 /// Attribute description (used to create database) struct attm_desc {     /// Element UUID     uint16_t uuid;     /// Attribute permission     uint16_t perm;     /// Maximum length of the element     att_size_t max_length;     /// Current length of the element     att_size_t length;     /// Element value array     uint8_t* value; };

我们可以看到,第一个成员是16位UUID,用来记录这个Attribute(属性)的UUID;
第二个成员是Attribute permission(属性权限);
第三个成员是Maximum length of the element(元素的最大长度);
第四个成员是Current length of the element(当前元素的长处);
第五个成员是Element Value array(元素数组)。

uuid和perm为16bit无符号整型变量,value为uint8_t数组指针,att_size_t类型其实uint16_t

/// Attribute length typetypedef uint16_t att_size_t;

bas_att_db定义

定义如下(bass.c文件中)

/* * BAS ATTRIBUTES DEFINITION **************************************************************************************** *//// Full BAS Database Description - Used to add attributes into the databaseconst struct attm_desc bas_att_db[BAS_IDX_NB] ={    // Battery Service Declaration    [BAS_IDX_SVC]                  =   {ATT_DECL_PRIMARY_SERVICE, PERM(RD, ENABLE), sizeof(bas_svc),                                        sizeof(bas_svc), (uint8_t *)&bas_svc},    // Battery Level Characteristic Declaration    [BAS_IDX_BATT_LVL_CHAR]        =   {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(bas_batt_level_char),                                        sizeof(bas_batt_level_char), (uint8_t *)&bas_batt_level_char},    // Battery Level Characteristic Value    [BAS_IDX_BATT_LVL_VAL]         =   {ATT_CHAR_BATTERY_LEVEL, PERM(RD, ENABLE), sizeof(uint8_t),                                        0, NULL},    // Battery Level Characteristic - Client Characteristic Configuration Descriptor    [BAS_IDX_BATT_LVL_NTF_CFG]     =   {ATT_DESC_CLIENT_CHAR_CFG, PERM(RD, ENABLE)|PERM(WR, ENABLE), sizeof(uint16_t),                                        0, NULL},    // Battery Level Characteristic - Characteristic Presentation Format Descriptor    [BAS_IDX_BATT_LVL_PRES_FMT]    =   {ATT_DESC_CHAR_PRES_FORMAT, PERM(RD, ENABLE), sizeof(struct prf_char_pres_fmt),                                        0, NULL},};

由上述定义我们来一个个分析bas_att_db的五个成员变量。

[BAS_IDX_SVC]

首先是[BAS_IDX_SVC]成员变量。
BAS_IDX_SVC的value是bas_svc 变量,具体如下:

const att_svc_desc_t bas_svc = ATT_SVC_BATTERY_SERVICE;

我们可以看到bas_svc 被赋值为一个枚举类型变量,具体值为0x180F。
类似的还有ATT_SVC_GENERIC_ACCESS、ATT_SVC_GENERIC_ATTRIBUTE、ATT_SVC_DEVICE_INFO、ATT_SVC_HID等。
具体定义如下:

/// Common 16-bit Universal Unique Identifierenum {    ATT_INVALID_UUID = 0,    /*----------------- SERVICES ---------------------*/    /// Generic Access Profile    ATT_SVC_GENERIC_ACCESS                      = 0x1800,    /// Attribute Profile    ATT_SVC_GENERIC_ATTRIBUTE,    ...    /// Device Information Service    ATT_SVC_DEVICE_INFO                         = 0x180A,    ...    /// Battery Service    ATT_SVC_BATTERY_SERVICE,    /// Blood Pressure Service    ATT_SVC_BLOOD_PRESSURE                      = 0x1810,    /// Alert Notification Service    ATT_SVC_ALERT_NTF                           = 0x1811,    /// HID Service    ATT_SVC_HID                                 = 0x1812,    ...}

example

[BAS_IDX_BATT_LVL_CHAR]

关于BAS_IDX_BATT_LVL_CHAR成员,它的value比较特殊,是att_char_desc结构体变量强转为(uint8_t *)。该变量定义如下:

/// Battery Level characteristicconst struct att_char_desc bas_batt_level_char = ATT_CHAR(ATT_CHAR_PROP_RD, 0, ATT_CHAR_BATTERY_LEVEL);

struct att_char_desc定义如下:

/// Characteristic Value Descriptorstruct 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];//UUID值};

定义bas_batt_level_char变量时,使用ATT_CHAR宏函数填充结构体,原型如下

/// macro to fill an attribute characteristic#define ATT_CHAR(prop, handle, type) {(prop),                                           \                                     {(uint8_t)((handle)), (uint8_t)((handle) >> 8)},  \                                     {(uint8_t)((type)), (uint8_t)((type) >> 8)}       };

[BAS_IDX_BATT_LVL_VAL]、[BAS_IDX_BATT_LVL_NTF_CFG]、[BAS_IDX_BATT_LVL_PRES_FMT]

这个三个变量都没填充value值

小结

成员 定义 描述 [BAS_IDX_SVC] {ATT_DECL_PRIMARY_SERVICE,PERM(RD, ENABLE),sizeof(bas_svc),sizeof(bas_svc),(uint8_t *)&bas_svc} Battery Service Declaration [BAS_IDX_BATT_LVL_CHAR] {ATT_DECL_CHARACTERISTIC, PERM(RD, ENABLE), sizeof(bas_batt_level_char),sizeof(bas_batt_level_char), (uint8_t *)&bas_batt_level_char} Battery Level Characteristic Declaration [BAS_IDX_BATT_LVL_VAL] {ATT_CHAR_BATTERY_LEVEL, PERM(RD, ENABLE), sizeof(uint8_t),0, NULL} Battery Level Characteristic Value [BAS_IDX_BATT_LVL_NTF_CFG] {ATT_DESC_CLIENT_CHAR_CFG,PERM(RD, ENABLE)|PERM(WR, ENABLE),sizeof(uint16_t),0, NULL} Battery Level Characteristic - Client Characteristic Configuration Descriptor [BAS_IDX_BATT_LVL_PRES_FMT] {ATT_DESC_CHAR_PRES_FORMAT, PERM(RD, ENABLE), sizeof(struct prf_char_pres_fmt),0, NULL} Battery Level Characteristic - Characteristic Presentation Format Descriptor

Database类型总结

UUID 类型 值 ATT_DECL_PRIMARY_SERVICE DECLARATIONS 0x2800 ATT_DECL_CHARACTERISTIC DECLARATIONS 0x2803 ATT_CHAR_BATTERY_LEVEL CHARACTERISTICS 0x2A19 ATT_DESC_CLIENT_CHAR_CFG DESCRIPTORS 0x2902 ATT_DESC_CHAR_PRES_FORMAT DESCRIPTORS 0x2904