DA1458x BASS Database的組成結構 -- Battery Service 分析(一)

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 Indexes
enum
{
    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 type
typedef uint16_t att_size_t;

bas_att_db定義

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

/*
 * BAS ATTRIBUTES DEFINITION
 ****************************************************************************************
 */

/// Full BAS Database Description - Used to add attributes into the database
const 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 Identifier
enum {
    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 characteristic
const 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 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];//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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章