Commit b0ad17d0 authored by Johan Hedberg's avatar Johan Hedberg Committed by Anas Nashif
Browse files

samples: reel_board/mesh_badge: Add statistics and new message



Add a new "heartbeat" message so that number of hops between nodes can
be discovered. Also add a statistics page which can be toggled using a
long key press, showing local information and the top message senders.

Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent ab615d30
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ CONFIG_BT_MESH_TX_SEG_MSG_COUNT=3
CONFIG_BT_MESH_RX_SEG_MSG_COUNT=3
CONFIG_BT_MESH_CRPL=128
CONFIG_BT_MESH_RPL_STORE_TIMEOUT=120
CONFIG_BT_MESH_MSG_CACHE_SIZE=30

CONFIG_PRINTK=y
CONFIG_SERIAL=y
+2 −0
Original line number Diff line number Diff line
@@ -8,4 +8,6 @@
void board_refresh_display(void);
void board_show_text(const char *text, bool center, s32_t duration);
void board_blink_leds(void);
void board_add_hello(u16_t addr, const char *name);
void board_add_heartbeat(u16_t addr, u8_t hops);
int board_init(void);
+0 −21
Original line number Diff line number Diff line
@@ -21,22 +21,6 @@ static const struct bt_data ad[] = {
	BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR),
};

static size_t first_name_len(const char *name)
{
	size_t len;

	for (len = 0; *name; name++, len++) {
		switch (*name) {
		case ' ':
		case ',':
		case '\n':
			return len;
		}
	}

	return len;
}

static ssize_t read_name(struct bt_conn *conn, const struct bt_gatt_attr *attr,
			 void *buf, u16_t len, u16_t offset)
{
@@ -69,7 +53,6 @@ static ssize_t write_name(struct bt_conn *conn, const struct bt_gatt_attr *attr,
		return BT_GATT_ERR(BT_ATT_ERR_INSUFFICIENT_RESOURCES);
	}

	mesh_set_name(name, first_name_len(name));
	board_refresh_display();

	return len;
@@ -202,11 +185,7 @@ static void bt_ready(int err)
			return;
		}
	} else {
		const char *name = bt_get_name();

		printk("Already provisioned\n");

		mesh_set_name(name, first_name_len(name));
	}

	board_refresh_display();
+94 −29
Original line number Diff line number Diff line
@@ -16,16 +16,18 @@
#include "board.h"

#define MOD_LF            0x0000
#define OP_LF          0xbb
#define OP_VENDOR_MSG  BT_MESH_MODEL_OP_3(OP_LF, BT_COMP_ID_LF)
#define OP_HELLO          0xbb
#define OP_HEARTBEAT      0xbc
#define OP_VND_HELLO      BT_MESH_MODEL_OP_3(OP_HELLO, BT_COMP_ID_LF)
#define OP_VND_HEARTBEAT  BT_MESH_MODEL_OP_3(OP_HEARTBEAT, BT_COMP_ID_LF)

#define DEFAULT_TTL    7
#define DEFAULT_TTL       31
#define GROUP_ADDR        0xc123
#define NET_IDX           0x000
#define APP_IDX           0x000
#define FLAGS             0

static struct k_work publish_work;
static struct k_work hello_work;
static struct k_work mesh_start_work;

static void heartbeat(u8_t hops, u16_t feat)
@@ -75,14 +77,14 @@ static struct bt_mesh_model root_models[] = {
	BT_MESH_MODEL_HEALTH_SRV(&health_srv, &health_pub),
};

static void vnd_message(struct bt_mesh_model *model,
static void vnd_hello(struct bt_mesh_model *model,
		      struct bt_mesh_msg_ctx *ctx,
		      struct net_buf_simple *buf)
{
	char str[32];
	size_t len;

	printk("Vendor message from 0x%04x\n", ctx->addr);
	printk("Hello message from 0x%04x\n", ctx->addr);

	if (ctx->addr == bt_mesh_model_elem(model)->addr) {
		printk("Ignoring message from self\n");
@@ -91,6 +93,10 @@ static void vnd_message(struct bt_mesh_model *model,

	len = min(buf->len, 8);
	memcpy(str, buf->data, len);
	str[len] = '\0';

	board_add_hello(ctx->addr, str);

	strcpy(str + len, " says hi!");

	board_show_text(str, false, K_SECONDS(3));
@@ -98,13 +104,45 @@ static void vnd_message(struct bt_mesh_model *model,
	board_blink_leds();
}

static void vnd_heartbeat(struct bt_mesh_model *model,
			  struct bt_mesh_msg_ctx *ctx,
			  struct net_buf_simple *buf)
{
	u8_t init_ttl, hops;

	/* Ignore messages from self */
	if (ctx->addr == bt_mesh_model_elem(model)->addr) {
		return;
	}

	init_ttl = net_buf_simple_pull_u8(buf);
	hops = init_ttl - ctx->recv_ttl + 1;

	printk("Heartbeat from 0x%04x over %u hop%s\n", ctx->addr,
	       hops, hops == 1 ? "" : "s");

	board_add_heartbeat(ctx->addr, hops);
}

static const struct bt_mesh_model_op vnd_ops[] = {
	{ OP_VENDOR_MSG, 1, vnd_message },
	{ OP_VND_HELLO, 1, vnd_hello },
	{ OP_VND_HEARTBEAT, 1, vnd_heartbeat },
	BT_MESH_MODEL_OP_END,
};

/* Limit the payload to 11 bytes so that it doesn't get segmented */
BT_MESH_MODEL_PUB_DEFINE(vnd_pub, NULL, 3 + 8);
static int pub_update(struct bt_mesh_model *mod)
{
	struct net_buf_simple *msg = mod->pub->msg;

	printk("Preparing to send heartbeat\n");

	bt_mesh_model_msg_init(msg, OP_VND_HEARTBEAT);
	net_buf_simple_add_u8(msg, DEFAULT_TTL);

	return 0;
}

BT_MESH_MODEL_PUB_DEFINE(vnd_pub, pub_update, 3 + 1);

static struct bt_mesh_model vnd_models[] = {
	BT_MESH_MODEL_VND(BT_COMP_ID_LF, MOD_LF, vnd_ops, &vnd_pub, NULL),
@@ -120,9 +158,37 @@ static const struct bt_mesh_comp comp = {
	.elem_count = ARRAY_SIZE(elements),
};

static void publish_message(struct k_work *work)
static size_t first_name_len(const char *name)
{
	size_t len;

	for (len = 0; *name; name++, len++) {
		switch (*name) {
		case ' ':
		case ',':
		case '\n':
			return len;
		}
	}

	return len;
}

static void send_hello(struct k_work *work)
{
	if (bt_mesh_model_publish(&vnd_models[0]) == 0) {
	NET_BUF_SIMPLE_DEFINE(msg, 3 + 8 + 4);
	struct bt_mesh_msg_ctx ctx = {
		.net_idx = NET_IDX,
		.app_idx = APP_IDX,
		.addr = GROUP_ADDR,
		.send_ttl = DEFAULT_TTL,
	};
	const char *name = bt_get_name();

	bt_mesh_model_msg_init(&msg, OP_VND_HELLO);
	net_buf_simple_add_mem(&msg, name, first_name_len(name));

	if (bt_mesh_model_send(&vnd_models[0], &ctx, &msg, NULL, NULL) == 0) {
		board_show_text("Saying \"hi!\" to everyone", false,
				K_SECONDS(2));
	} else {
@@ -130,9 +196,9 @@ static void publish_message(struct k_work *work)
	}
}

void mesh_publish(void)
void mesh_send_hello(void)
{
	k_work_submit(&publish_work);
	k_work_submit(&hello_work);
}

static int provision_and_configure(void)
@@ -150,6 +216,7 @@ static int provision_and_configure(void)
		.addr = GROUP_ADDR,
		.app_idx = APP_IDX,
		.ttl = DEFAULT_TTL,
		.period = BT_MESH_PUB_PERIOD_SEC(10),
	};
	u8_t dev_key[16];
	u16_t addr;
@@ -223,16 +290,14 @@ void mesh_start(void)
	k_work_submit(&mesh_start_work);
}

void mesh_set_name(const char *name, size_t len)
bool mesh_is_initialized(void)
{
	bt_mesh_model_msg_init(vnd_pub.msg, OP_VENDOR_MSG);
	len = min(len, net_buf_simple_tailroom(vnd_pub.msg));
	net_buf_simple_add_mem(vnd_pub.msg, name, len);
	return elements[0].addr != BT_MESH_ADDR_UNASSIGNED;
}

bool mesh_is_initialized(void)
u16_t mesh_get_addr(void)
{
	return elements[0].addr != BT_MESH_ADDR_UNASSIGNED;
	return elements[0].addr;
}

int mesh_init(void)
@@ -242,7 +307,7 @@ int mesh_init(void)
		.uuid = dev_uuid,
	};

	k_work_init(&publish_work, publish_message);
	k_work_init(&hello_work, send_hello);
	k_work_init(&mesh_start_work, start_mesh);

	return bt_mesh_init(&prov, &comp);
+2 −2
Original line number Diff line number Diff line
@@ -4,9 +4,9 @@
 * SPDX-License-Identifier: Apache-2.0
 */

void mesh_publish(void);
void mesh_set_name(const char *name, size_t len);
void mesh_send_hello(void);

u16_t mesh_get_addr(void);
bool mesh_is_initialized(void);
void mesh_start(void);
int mesh_init(void);
Loading