如何添加 ANT+ Profile¶
1 概述¶
ANT+是基于各个profile协议实现的。本文档旨在介绍如何在SDK中自行添加一个profile。从而配合上层应用实现一个ANT+的设备。
2 Profile的代码结构¶
3 创建一个新的profile¶
3.1 需要创建那些目录和文件¶
根据上图的结构层次可以看出我们实现一个profile其实就是实现中间层的三个部分。
Page:page是ANT+发送数据的基本单元。每个profile都规定了需要发送那些page,所以我们需要创建page目录和文件。
Simulator:simulator是一个传感器模拟器,这是一个可选单元,实际应用中可以不实现本单元,完全由实际传感器逻辑代替。
Profile:Profile单元是整个profile实现的关键逻辑实现。
小技巧
Profile的目录和文件创建可以参考现有的profile。
代码目录:modules/hal/panchip/panplat/pan1080/ant/ant_profile
注:因系统限制原因,新加文件时文件名不要过长,否则会引起编译错误。
3.2 代码文件加入cmake¶
新添加的代码文件需要加入ant/CMakeLists.txt
才会参与编译,zephyr_include_directories
添加头文件所在目录,zephyr_library_sources
添加新增的代码文件
zephyr_include_directories(
ant_profile/ant_hrm/pages
ant_profile/ant_hrm/simulator
)
zephyr_library_sources(
ant_profile/ant_hrm/ant_hrm.c
ant_profile/ant_hrm/simulator/ant_hrm_simulator.c
ant_profile/ant_hrm/pages/ant_hrm_page_0.c
ant_profile/ant_hrm/pages/ant_hrm_page_1.c
ant_profile/ant_hrm/pages/ant_hrm_page_2.c
ant_profile/ant_hrm/pages/ant_hrm_page_3.c
ant_profile/ant_hrm/pages/ant_hrm_page_4.c
)
3.3 各部分分别需要实现什么¶
Page单元
Page单元将实现协议规定的所有必须page的编码和解码,例如每个page都应该实现如下两个接口。
/** * @brief Function for encoding page 1 * * @param[in] p_page_data Pointer to the page data * @param[out] P_page_buffer Pointer to the page buffer */ void ant_bsc_page_1_encode(uint8_t *p_page_buffer, ant_bsc_page1_data_t *p_page_data); /** * @brief Function for decoding page 1 * * @param[in] p_page_buffer Pointer to the page buffer * @param[out] p_page_data Pointer to the page data */ void ant_bsc_page_1_decode(uint8_t const *p_page_buffer, ant_bsc_page1_data_t *p_page_data);
Simulator单元
Simulator单元将实现传感器采集数据的自动更新。例如每个simulator都应该实现如下数据更新接口。
/** * @brief Function for updateing data of simulator. * * @param bsc_profile Pointer to the bsc profile instance. * @param update_mode update mode, 0 - manual, 1 - auto */ void ant_bsc_update_simulator(ant_bsc_profile_t *bsc_profile, uint8_t update_mode);
Profile单元
Profile单元将实现整个profile的核心逻辑。需要实现的接口函数如下:
数据发送事件的接口函数,此函数将由应用层在需要数据发送时调用。同时需要实现相关联的一系列page选择,发送编码等函数。
/** * @brief Function for handling the sensor ANT events. * * @param[in] p_ant_evt Event received from the ANT stack. * @param[in] p_context Pointer to the profile instance. */ void ant_bsc_sensor_evt_handler(ant_evt_t *p_ant_evt, void *p_context);
profile的初始化接口函数,此函数实现了相关初始值的赋值以及指定通道的初始化。
/** * @brief Function for bsc sensor initialize. * * @param[in] profile Pointer to the profile instance. * @param[in] channel_config Pointer to the channel configuration structure. * @return uint8_t 0 SUCCESS, other FAIL */ uint8_t ant_bsc_sensor_init(ant_bsc_profile_t *profile, ant_channel_config_t *channel_config);
profile的开启接口函数,此函数实现了指定通道的开启。
/** * @brief Function for openqing the profile instance channel for ANT BSC sersor. * * @param[in] profile Pointer to the profile instance. * @return uint8_t 0 SUCCESS, other FAIL */ uint8_t ant_bsc_sensor_open(ant_bsc_profile_t *profile);
小技巧
详细的代码实现请参考目前已实现的profile源码。