应用程序编写小技巧

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

猜你喜欢

转载自blog.csdn.net/weixin_38491862/article/details/80089920