.h文件中
1.定义函数指针
使用 typedef 函数定义函数指针类型
//获得固件版本号(协议版本号,软件版本号,硬件版本号,产品型号)
typedef uint8 (*get_version_t)( firmware_type_t firmware_type,uint8 *version,uint8 len );
2.定义函数指针结构体
使用 typedef 函数定义函数指针结构体类型
//蓝牙电源项目通用的接口,UUID从FF00~FF14
typedef struct
{
get_version_t get_version; //获得固件版本号(协议版本号,软件版本号,硬件版本号,产品型号)
……
}power_commonCBs_t;
3.定义数据结构体
使用 typedef 函数定义数据结构体类型
//读写操作选择,get:获取操作 set:写入操作
typedef enum
{
get,
set
}opcode_t;
//需要掉电保存的不常变数据(FLASH-ID数据页擦除约20ms,数据写入约560us)
typedef struct
{
uint8 prot_ver[AES_DATA_LEN]; //协议版本号
uint8 soft_ver[AES_DATA_LEN]; //软件版本号
uint8 hard_ver[AES_DATA_LEN]; //硬件版本号
uint8 prod_ver[AES_DATA_LEN]; //产品型号
uint8 device_name[AES_DATA_LEN]; //设备名字
uint8 machine_id[AES_DATA_LEN]; //机械ID(蓝牙地址AES加密后)
}snv_const_data_t;
4.定义协议总接口
使用 typedef 函数定义 由函数指针组成的结构体组成的总接口结构体类型
typedef struct
{
power_commonCBs_t *power_commonCBs;
power_optionalCBs_t *power_optionalCBs;
power_extraCBs_t *power_extraCBs;
}bt_al_t;
5.声明所需的 数据结构体及总接口函数 为全局变量
extern snv_const_data_t snv_const_data; //数据结构体
extern bt_al_t* get_btal(void); //总接口函数
.c文件中
1.对数据结构体进行初始化赋值
//数据初始化,分别为不常变数据、常变数据与激活数据
snv_const_data_t snv_const_data =
{
.prot_ver = "1.2.3.4.5", //协议版本号
.soft_ver = "2.3.4.5.6", //软件版本号
.hard_ver = "3.4.5.6.7", //硬件版本号
.prod_ver = "4.5.6.7.8", //产品型号
#if battery_total_number>2
.device_name = "Charger_D4S", //设备名字
#else
.device_name = "Charger_D2S", //设备名字
#endif
.machine_id = {0}, //机械ID(蓝牙地址AES加密后)
};
2.声明对应函数指针的本文件函数
void power_btal_init(void);
static uint8 get_versionCB( firmware_type_t firmware_type,uint8 *version,uint8 len );
static uint8 device_nameCB( opcode_t op,uint8 *device_name,uint8 len );
3.对函数指针结构体进行初始化赋值
即将声明的本文件函数与对应的函数指针联系起来
static power_commonCBs_t power_commonCB =
{
.get_version = get_versionCB, //获得固件版本号(协议版本号,软件版本号,硬件版本号,产品型号)
.device_name = device_nameCB, //设备名读写操作
……
};
4.对函数指针结构组成的函数指针结构体 即总接口进行初始化赋值
static bt_al_t bt_al=
{
.power_commonCBs = &power_commonCB, //公用部分函数实现
.power_optionalCBs = NULL, //功能部分函数实现
.power_extraCBs = NULL //其他功能函数实现
};
5.功能函数的具体实现
/******************************************************************************
*name: get_btal
*introduce: 获取控制总接口
*parameter: none
*return: &bt_al:控制总接口地址
*******************************************************************************/
bt_al_t* get_btal( void )
{
return &bt_al;
}