一、在nrf52832的light_switch示例中加入新的element,并且在新元素中加入通用开关模块,
注意事项:此示例是在nrf5_SDK_for_Mesh_v4.0.0环境下进行,首先需要在ses中增加NRF的BLE_SDK(因为mesh是基于BLE的)。点击Tools下的Options,找到Building下Global Macros选项加入你的BLE_SDK的地址。
main.c
- 定义新的ONOFF_SERVER_1_LED 指定为
#define ONOFF_SERVER_1_LED (BSP_LED_1)
- 声明set和get指令后的回调函数,
static void app_onoff_server_set_cb_1(const app_onoff_server_t * p_server, bool onoff);
static void app_onoff_server_get_cb_1(const app_onoff_server_t * p_server, bool * p_present_onoff);
- 指定新的server结构
APP_ONOFF_SERVER_DEF(m_onoff_server_1,
APP_CONFIG_FORCE_SEGMENTATION,
APP_CONFIG_MIC_SIZE,
app_onoff_server_set_cb_1,
app_onoff_server_get_cb_1,
app_onoff_server_transition_cb)
- 在set和get函数中操作led
static void app_onoff_server_set_cb_1(const app_onoff_server_t * p_server, bool onoff)
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Setting GPIO value: %d\n", onoff)
hal_led_pin_set(ONOFF_SERVER_1_LED, onoff);
}
static void app_onoff_server_get_cb1(const app_onoff_server_t * p_server, bool * p_present_onoff)
{
*p_present_onoff = hal_led_pin_get(ONOFF_SERVER_1_LED);
}
- 在app_model_init初始化server,这里1即为元素的编号
ERROR_CHECK(app_onoff_init(&m_onoff_server_1, 1));
nrf_mesh_config_app.h:
6.最后在nrf_mesh_config_app.h中修改如下,其中ACCESS_MODEL_COUNT是总模块数,示例默认是有三个模块,Configuration、Health Server、General On Off Server,然后再加上我们添加的又一个General On Off Server,所以将其修改为4个;之后因为我们是新增加的一个元素,并非将模块加入原来的元素,所以元素应为2,而ACCESS_SUBSCRIPTION_LIST_COUNT是订阅列表,可以修改为ACCESS_MODEL_COUNT的数量。
#define ACCESS_MODEL_COUNT (4)
#define ACCESS_ELEMENT_COUNT (2)
#define ACCESS_SUBSCRIPTION_LIST_COUNT (ACCESS_MODEL_COUNT)
如果是mesh_5.0_sdk则需要更改下面这个
#define GENERIC_ONOFF_SERVER_INSTANCES_MAX (2)
其实还可以添加自己的一些模块,比如传感器等,最新的mesh_sdk 5.0版本已经有sensor的示例,下载链接.
二、下面是在传感器示例同一元素中增加传感器步骤
1 sensor_common.h中定义sensor_id.
#define SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID (0x0076)
main.c
2 在sensor_descriptor_t结构体中增加传感器id,和数组,增加定时器1相关配置,
{
//传感器的id似乎现在只能官方定义
.property_id = SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID,
.positive_tolerance = UNSPECIFIED,
.negative_tolerance = UNSPECIFIED,
.sampling_function = UNSPECIFIED,
.measurement_period = UNSPECIFIED,
.update_interval = UNSPECIFIED
}
static uint16_t property_array[] = {2, SENSOR_MOTION_SENSED_PROPERTY_ID,SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID};
APP_TIMER_DEF(m_sensor_server_0_cadence_timer_1);
APP_TIMER_DEF(m_sensor_server_0_min_interval_timer_1);
static app_timer_id_t cadence_timer_ids[2] =
{
&m_sensor_server_0_cadence_timer_0_data,
&m_sensor_server_0_cadence_timer_1_data,
};
app_sensor_utils.c
3 在range_vector_bytes_get()函数和delta_vector_bytes_get()函数中增加对应的传感器回调,这里注意SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID
传感器是需要两个字节,所以要*2,如果其他传感器要传输更多字节数,则修改这个n值。
range_vector_bytes_get:
case SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID:
return 2*sizeof(pir_data_size_t);
delta_vector_bytes_get
case SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID:
return trigger_type ? sizeof(uint16_t) : sizeof(pir_data_size_t);
4 最后在sensor_initialize()函数中增加如下部分即可
case SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID :
{
p = cadence_new(property_id);
/* Should a .h file specify the initial values? */
p->fast_period_exponent = 0;
p->trigger_type = 0;
p->min_interval_exponent = 10; /*2^10ms = 512ms */
p->p_server = p_server;
p->timer.p_timer_id = &p_server->p_cadence_timer_ids[i];
p->timer.p_context = p;
p->timer.cb = cadence_timer_cb;
(void) model_timer_create(&p->timer);
p->min_interval_timer.p_timer_id = &p_server->p_min_interval_timer_ids[i];
p->min_interval_timer.p_context = p;
p->min_interval_timer.cb = min_interval_timer_cb;
(void) model_timer_create(&p->min_interval_timer);
p->in_fast_region = motion_sensor_in_fast_region;
p->delta_trigger_fast = motion_sensor_delta_trigger_fast;
p_server->state.marshalled_list_bytes += p->marshalled_bytes;
list_add(&p_server->state.p_cadence_list, &p->list_node);
break;
}