应用程序编写小技巧

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值