1 /*
2 * Copyright (c) 2024 Alexandre Bailon
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/shell/shell.h>
8
9 #include "led.h"
10 #include "button.h"
11
coap_cmd_led_set(const struct shell * sh,size_t argc,char ** argv)12 static int coap_cmd_led_set(const struct shell *sh, size_t argc, char **argv)
13 {
14 int led_id;
15 int led_state;
16 const char *addr;
17 int err = 0;
18
19 led_id = shell_strtol(argv[1], 10, &err);
20 if (err) {
21 shell_error(sh, "Failed to get a valid LED id: %s", argv[1]);
22 return err;
23 }
24
25 if (!strcmp(argv[2], "on")) {
26 led_state = LED_MSG_STATE_ON;
27 } else if (!strcmp(argv[2], "off")) {
28 led_state = LED_MSG_STATE_OFF;
29 } else if (!strcmp(argv[2], "toggle")) {
30 led_state = LED_MSG_STATE_TOGGLE;
31 } else {
32 shell_error(sh, "Failed to get a valid LED state");
33 return -EINVAL;
34 }
35
36 if (argc <= 3) {
37 addr = "ff03::1";
38 } else {
39 addr = argv[3];
40 }
41
42 return coap_led_set_state(addr, led_id, led_state);
43 }
44
coap_cmd_led_get(const struct shell * sh,size_t argc,char ** argv)45 static int coap_cmd_led_get(const struct shell *sh, size_t argc, char **argv)
46 {
47 int led_id;
48 int led_state;
49 const char *addr;
50 int err = 0;
51
52 led_id = shell_strtol(argv[1], 10, &err);
53 if (err) {
54 shell_error(sh, "Failed to get a valid LED id: %s", argv[1]);
55 return err;
56 }
57
58 if (argc <= 3) {
59 addr = "ff03::1";
60 } else {
61 addr = argv[3];
62 }
63
64 err = coap_led_get_state(addr, led_id, &led_state);
65 if (err) {
66 return err;
67 }
68
69 if (led_state == LED_MSG_STATE_ON) {
70 shell_info(sh, "on");
71 } else {
72 shell_info(sh, "off");
73 }
74
75 return 0;
76 }
77
coap_cmd_btn_get(const struct shell * sh,size_t argc,char ** argv)78 static int coap_cmd_btn_get(const struct shell *sh, size_t argc, char **argv)
79 {
80 int btn_id;
81 int btn_state;
82 const char *addr;
83 int err = 0;
84
85 btn_id = shell_strtol(argv[1], 10, &err);
86 if (err) {
87 shell_error(sh, "Failed to get a valid button id: %s", argv[1]);
88 return err;
89 }
90
91 if (argc <= 3) {
92 addr = "ff03::1";
93 } else {
94 addr = argv[3];
95 }
96
97 err = coap_btn_get_state(addr, btn_id, &btn_state);
98 if (err) {
99 return err;
100 }
101
102 if (btn_state == BTN_MSG_STATE_ON) {
103 shell_info(sh, "on");
104 } else {
105 shell_info(sh, "off");
106 }
107
108 return 0;
109 }
110
111 static const char coap_cmd_led_set_help[] =
112 "Set a LED state using CoAP\n"
113 "led set <led_id> <led_state> [addr]\n"
114 "\tled_id: a number defining the LED to control from CoAP server\n"
115 "\tled_state: on, off or toggle\n"
116 "\taddr: the IPv6 address of CoAP server. If not defined, it will broadcast to all CoAP "
117 "servers\n";
118
119 static const char coap_cmd_led_get_help[] =
120 "Get a LED state using CoAP\n"
121 "led get <led_id> [addr]\n"
122 "\tled_id: a number defining the LED to get from CoAP server\n"
123 "\taddr: the IPv6 address of CoAP server. If not defined, it "
124 "will broadcast to all CoAP servers\n";
125
126 SHELL_STATIC_SUBCMD_SET_CREATE(
127 coap_led_subcmd, SHELL_CMD_ARG(set, NULL, coap_cmd_led_set_help, coap_cmd_led_set, 3, 1),
128 SHELL_CMD_ARG(get, NULL, coap_cmd_led_get_help, coap_cmd_led_get, 2, 1),
129 SHELL_SUBCMD_SET_END);
130
131 static const char coap_cmd_btn_get_help[] =
132 "Get a button state using CoAP\n"
133 "btn get <btn_id> [addr]\n"
134 "\tbtn_id: a number defining the button to get from CoAP server\n"
135 "\taddr: the IPv6 address of CoAP server. If not defined, it "
136 "will broadcast to all CoAP servers\n";
137
138 SHELL_STATIC_SUBCMD_SET_CREATE(coap_btn_subcmd,
139 SHELL_CMD_ARG(get, NULL, coap_cmd_btn_get_help, coap_cmd_btn_get, 2,
140 1),
141 SHELL_SUBCMD_SET_END);
142
143 SHELL_STATIC_SUBCMD_SET_CREATE(coap_subcmd,
144 SHELL_CMD(led, &coap_led_subcmd, "Manage a LED using CoAP", NULL),
145 SHELL_CMD(btn, &coap_btn_subcmd, "Manage a button using CoAP", NULL),
146 SHELL_SUBCMD_SET_END);
147
148 SHELL_CMD_REGISTER(ot_coap, &coap_subcmd, "CoAP sample client", NULL);
149