diff --git a/drivers/led/led_shell.c b/drivers/led/led_shell.c index 75b613aea8b37..f0898d1af7a0b 100644 --- a/drivers/led/led_shell.c +++ b/drivers/led/led_shell.c @@ -19,6 +19,8 @@ enum { arg_idx_dev = 1, arg_idx_led = 2, arg_idx_value = 3, + arg_idx_delay_on = 3, + arg_idx_delay_off = 4, }; static int parse_common_args(const struct shell *sh, char **argv, @@ -85,6 +87,45 @@ static int cmd_on(const struct shell *sh, size_t argc, char **argv) return err; } +static int cmd_blink(const struct shell *sh, size_t argc, char **argv) +{ + const struct device *dev; + uint32_t led, delay_on, delay_off; + char *end_ptr; + int err; + + err = parse_common_args(sh, argv, &dev, &led); + if (err < 0) { + return err; + } + + delay_on = strtoul(argv[arg_idx_delay_on], &end_ptr, 0); + if (*end_ptr != '\0') { + shell_error(sh, "Invalid delay_on parameter %s", argv[arg_idx_delay_on]); + return -EINVAL; + } + + if (argc > arg_idx_delay_off) { + delay_off = strtoul(argv[arg_idx_delay_off], &end_ptr, 0); + if (*end_ptr != '\0') { + shell_error(sh, "Invalid delay_off parameter %s", argv[arg_idx_delay_off]); + return -EINVAL; + } + } else { + delay_off = delay_on; + } + + shell_print(sh, "%s: blinking LED %d with %d ms on and %d ms off", + dev->name, led, delay_on, delay_off); + + err = led_blink(dev, led, delay_on, delay_off); + if (err) { + shell_error(sh, "Error: %d", err); + } + + return err; +} + static const char *led_color_to_str(uint8_t color) { switch (color) { @@ -353,6 +394,10 @@ SHELL_STATIC_SUBCMD_SET_CREATE( 3, 0), SHELL_CMD_ARG(on, &dsub_device_name, SHELL_HELP("Turn on LED", " "), cmd_on, 3, 0), + SHELL_CMD_ARG(blink, &dsub_device_name, + SHELL_HELP("Blink LED on and off", + " []"), + cmd_blink, 4, 1), SHELL_CMD_ARG(get_info, &dsub_device_name, SHELL_HELP("Get LED information", " "), cmd_get_info, 3, 0), SHELL_CMD_ARG(set_brightness, &dsub_device_name,