Skip to content

Commit 54f1a4a

Browse files
Vudentznashif
authored andcommitted
Bluetooth: shell: Add support for printing the write rate
This makes the gatt metrics also available for gatt write-without-rsp-cb so it now prints the rate of each write: uart:~$ gatt write-without-response-cb 1e ff 10 10 Write #1: 16 bytes (0 bps) Write #2: 32 bytes (3445948416 bps) Write #3: 48 bytes (2596929536 bps) Write #4: 64 bytes (6400 bps) Write #5: 80 bytes (8533 bps) Write #6: 96 bytes (10666 bps) Write #7: 112 bytes (8533 bps) Write #8: 128 bytes (9955 bps) Write #9: 144 bytes (11377 bps) Write #10: 160 bytes (7680 bps) Write #11: 176 bytes (8533 bps) Write #12: 192 bytes (9386 bps) Write Complete (err 0) Write #13: 208 bytes (8533 bps) Write #14: 224 bytes (9244 bps) Write #15: 240 bytes (9955 bps) Write #16: 256 bytes (8000 bps) Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent ac25b93 commit 54f1a4a

File tree

1 file changed

+62
-31
lines changed

1 file changed

+62
-31
lines changed

subsys/bluetooth/shell/gatt.c

+62-31
Original file line numberDiff line numberDiff line change
@@ -404,9 +404,60 @@ static int cmd_write(const struct shell *shell, size_t argc, char *argv[])
404404
return err;
405405
}
406406

407+
static struct write_stats {
408+
uint32_t count;
409+
uint32_t len;
410+
uint32_t total;
411+
uint32_t rate;
412+
} write_stats;
413+
414+
static void update_write_stats(uint16_t len)
415+
{
416+
static uint32_t cycle_stamp;
417+
uint32_t delta;
418+
419+
delta = k_cycle_get_32() - cycle_stamp;
420+
delta = (uint32_t)k_cyc_to_ns_floor64(delta);
421+
422+
if (!delta) {
423+
delta = 1;
424+
}
425+
426+
write_stats.count++;
427+
write_stats.total += len;
428+
429+
/* if last data rx-ed was greater than 1 second in the past,
430+
* reset the metrics.
431+
*/
432+
if (delta > 1000000000) {
433+
write_stats.len = 0U;
434+
write_stats.rate = 0U;
435+
cycle_stamp = k_cycle_get_32();
436+
} else {
437+
write_stats.len += len;
438+
write_stats.rate = ((uint64_t)write_stats.len << 3) *
439+
1000000000U / delta;
440+
}
441+
}
442+
443+
static void reset_write_stats(void)
444+
{
445+
memset(&write_stats, 0, sizeof(write_stats));
446+
}
447+
448+
static void print_write_stats(void)
449+
{
450+
shell_print(ctx_shell, "Write #%u: %u bytes (%u bps)",
451+
write_stats.count, write_stats.total, write_stats.rate);
452+
}
453+
407454
static void write_without_rsp_cb(struct bt_conn *conn, void *user_data)
408455
{
409-
shell_print(ctx_shell, "Write transmission complete");
456+
uint16_t len = POINTER_TO_UINT(user_data);
457+
458+
update_write_stats(len);
459+
460+
print_write_stats();
410461
}
411462

412463
static int cmd_write_without_rsp(const struct shell *shell,
@@ -428,6 +479,7 @@ static int cmd_write_without_rsp(const struct shell *shell,
428479
if (!sign) {
429480
if (!strcmp(argv[0], "write-without-response-cb")) {
430481
func = write_without_rsp_cb;
482+
reset_write_stats();
431483
}
432484
}
433485

@@ -458,10 +510,14 @@ static int cmd_write_without_rsp(const struct shell *shell,
458510
while (repeat--) {
459511
err = bt_gatt_write_without_response_cb(default_conn, handle,
460512
gatt_write_buf, len,
461-
sign, func, NULL);
513+
sign, func,
514+
UINT_TO_POINTER(len));
462515
if (err) {
463516
break;
464517
}
518+
519+
k_yield();
520+
465521
}
466522

467523
shell_print(shell, "Write Complete (err %d)", err);
@@ -844,40 +900,19 @@ static ssize_t read_met(struct bt_conn *conn, const struct bt_gatt_attr *attr,
844900
value_len);
845901
}
846902

847-
static u32_t write_count;
848-
static u32_t write_len;
849-
static u32_t write_rate;
850-
851903
static ssize_t write_met(struct bt_conn *conn, const struct bt_gatt_attr *attr,
852904
const void *buf, u16_t len, u16_t offset,
853905
u8_t flags)
854906
{
855907
u8_t *value = attr->user_data;
856-
static u32_t cycle_stamp;
857-
u32_t delta;
858908

859909
if (offset + len > sizeof(met_char_value)) {
860910
return BT_GATT_ERR(BT_ATT_ERR_INVALID_OFFSET);
861911
}
862912

863913
memcpy(value + offset, buf, len);
864914

865-
delta = k_cycle_get_32() - cycle_stamp;
866-
delta = (u32_t)k_cyc_to_ns_floor64(delta);
867-
868-
/* if last data rx-ed was greater than 1 second in the past,
869-
* reset the metrics.
870-
*/
871-
if (delta > 1000000000) {
872-
write_count = 0U;
873-
write_len = 0U;
874-
write_rate = 0U;
875-
cycle_stamp = k_cycle_get_32();
876-
} else {
877-
write_count++;
878-
write_len += len;
879-
write_rate = ((u64_t)write_len << 3) * 1000000000U / delta;
880-
}
915+
update_write_stats(len);
881916

882917
return len;
883918
}
@@ -898,10 +933,8 @@ static int cmd_metrics(const struct shell *shell, size_t argc, char *argv[])
898933
int err = 0;
899934

900935
if (argc < 2) {
901-
shell_print(shell, "Write: count= %u, len= %u, rate= %u bps.",
902-
write_count, write_len, write_rate);
903-
904-
return -ENOEXEC;
936+
print_write_stats();
937+
return 0;
905938
}
906939

907940
if (!strcmp(argv[1], "on")) {
@@ -1063,9 +1096,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(gatt_cmds,
10631096
SHELL_CMD_ARG(set, NULL, "<handle> [data...]", cmd_set, 2, 255),
10641097
SHELL_CMD_ARG(show-db, NULL, "[uuid] [num_matches]", cmd_show_db, 1, 2),
10651098
#if defined(CONFIG_BT_GATT_DYNAMIC_DB)
1066-
SHELL_CMD_ARG(metrics, NULL,
1067-
"register vendr char and measure rx <value: on, off>",
1068-
cmd_metrics, 2, 0),
1099+
SHELL_CMD_ARG(metrics, NULL, "[value: on, off]", cmd_metrics, 1, 1),
10691100
SHELL_CMD_ARG(register, NULL,
10701101
"register pre-predefined test service",
10711102
cmd_register_test_svc, 1, 0),

0 commit comments

Comments
 (0)