1 /*
2 * Copyright (c) 2022 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <stdlib.h>
8 #include <zephyr/shell/shell.h>
9 #include <zephyr/bluetooth/mesh.h>
10 #include <zephyr/bluetooth/mesh/shell.h>
11
12 #include "common/bt_shell_private.h"
13 #include "utils.h"
14
status_print(int err,char * msg,uint16_t addr,struct bt_mesh_large_comp_data_rsp * rsp)15 static void status_print(int err, char *msg, uint16_t addr, struct bt_mesh_large_comp_data_rsp *rsp)
16 {
17 if (err) {
18 bt_shell_error("Failed to send %s Get message (err %d)", msg, err);
19 return;
20 }
21
22 bt_shell_print("%s [0x%04x]: page: %u offset: %u total size: %u", msg, addr, rsp->page,
23 rsp->offset, rsp->total_size);
24 bt_shell_hexdump(rsp->data->data, rsp->data->len);
25 }
26
cmd_large_comp_data_get(const struct shell * sh,size_t argc,char * argv[])27 static int cmd_large_comp_data_get(const struct shell *sh, size_t argc, char *argv[])
28 {
29 NET_BUF_SIMPLE_DEFINE(comp, 64);
30 struct bt_mesh_large_comp_data_rsp rsp = {
31 .data = &comp,
32 };
33 uint8_t page;
34 uint16_t offset;
35 int err = 0;
36
37 net_buf_simple_init(&comp, 0);
38
39 page = shell_strtoul(argv[1], 0, &err);
40 offset = shell_strtoul(argv[2], 0, &err);
41
42 if (err) {
43 shell_warn(sh, "Unable to parse input string argument");
44 return err;
45 }
46
47 err = bt_mesh_large_comp_data_get(bt_mesh_shell_target_ctx.net_idx,
48 bt_mesh_shell_target_ctx.dst, page, offset, &rsp);
49 status_print(err, "Composition Data", bt_mesh_shell_target_ctx.dst, &rsp);
50
51 return err;
52 }
53
cmd_models_metadata_get(const struct shell * sh,size_t argc,char * argv[])54 static int cmd_models_metadata_get(const struct shell *sh, size_t argc, char *argv[])
55 {
56 NET_BUF_SIMPLE_DEFINE(metadata, 64);
57 struct bt_mesh_large_comp_data_rsp rsp = {
58 .data = &metadata,
59 };
60 uint8_t page;
61 uint16_t offset;
62 int err = 0;
63
64 net_buf_simple_init(&metadata, 0);
65
66 page = shell_strtoul(argv[1], 0, &err);
67 offset = shell_strtoul(argv[2], 0, &err);
68
69 if (err) {
70 shell_warn(sh, "Unable to parse input string argument");
71 return err;
72 }
73
74 err = bt_mesh_models_metadata_get(bt_mesh_shell_target_ctx.net_idx,
75 bt_mesh_shell_target_ctx.dst, page, offset, &rsp);
76 status_print(err, "Models Metadata", bt_mesh_shell_target_ctx.dst, &rsp);
77
78 return err;
79 }
80
81 SHELL_STATIC_SUBCMD_SET_CREATE(
82 large_comp_data_cmds,
83 SHELL_CMD_ARG(large-comp-data-get, NULL, "<page> <offset>", cmd_large_comp_data_get, 3, 0),
84 SHELL_CMD_ARG(models-metadata-get, NULL, "<page> <offset>", cmd_models_metadata_get, 3, 0),
85 SHELL_SUBCMD_SET_END);
86
87 SHELL_SUBCMD_ADD((mesh, models), lcd, &large_comp_data_cmds,
88 "Large Comp Data Cli commands",
89 bt_mesh_shell_mdl_cmds_help, 1, 1);
90