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