.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; }