This is an automated email from the ASF dual-hosted git repository. ccollins pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit 3bf6cb7869bd676f6824f8a70e3ee542a842bfdb Author: Christopher Collins <ccoll...@apache.org> AuthorDate: Thu Nov 1 14:38:03 2018 -0700 hw/battery: Don't open battery device during init Prior to commit: The battery shell opened the battery device at init time. If the open failed, a sysinit panic was triggered. After commit: The battery shell opens the battery device as needed, per command. If the open fails, the command fails with a `SYS_ENODEV` error. Rationale: A hardware fault may render the battery device inoperable. It is better for the application to decide how to handle this condition rather than the shell triggering a crash. --- hw/battery/src/battery_shell.c | 88 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/hw/battery/src/battery_shell.c b/hw/battery/src/battery_shell.c index 85b5bed..c1979d1 100644 --- a/hw/battery/src/battery_shell.c +++ b/hw/battery/src/battery_shell.c @@ -29,8 +29,6 @@ static int bat_compat_cmd(int argc, char **argv); -struct os_dev *bat; - #if MYNEWT_VAL(SHELL_CMD_HELP) #define HELP(a) &(a) @@ -183,12 +181,28 @@ static void print_property(const struct battery_property *prop) } } +static struct os_dev * +battery_shell_open_dev(void) +{ + struct os_dev *bat; + + bat = os_dev_open("battery_0", 0, NULL); + if (bat == NULL) { + console_printf("Failed to open battery device\n"); + } + + return bat; +} + static int cmd_bat_read(int argc, char **argv) { int rc; int maxp; int i; struct battery_property *prop; + struct os_dev *bat; + + bat = NULL; if (argc < 2) { console_printf("Invalid number of arguments, use read <prop>\n"); @@ -196,6 +210,12 @@ static int cmd_bat_read(int argc, char **argv) goto err; } + bat = battery_shell_open_dev(); + if (bat == NULL) { + rc = SYS_ENODEV; + goto err; + } + if (argc == 2 && strcmp("all", argv[1]) == 0) { maxp = battery_get_property_count(bat, NULL); for (i = 0; i < maxp; ++i) { @@ -229,6 +249,9 @@ static int cmd_bat_read(int argc, char **argv) rc = 0; err: + if (bat != NULL) { + os_dev_close(bat); + } return rc; } @@ -256,14 +279,23 @@ cmd_bat_write(int argc, char ** argv) long long min; long long max; struct battery_property *prop; + struct os_dev *bat; long long int val; + bat = NULL; + if (argc < 3) { console_printf("Invalid number of arguments, use write <prop> <value>\n"); rc = SYS_EINVAL; goto err; } + bat = battery_shell_open_dev(); + if (bat == NULL) { + rc = SYS_ENODEV; + goto err; + } + prop = battery_find_property_by_name(bat, argv[1]); if (prop == NULL) { console_printf("Invalid property name %s\n", argv[1]); @@ -304,29 +336,53 @@ cmd_bat_write(int argc, char ** argv) rc = 0; err: + if (bat != NULL) { + os_dev_close(bat); + } return rc; } static int cmd_bat_list(int argc, char **argv) { int i; - int max = battery_get_property_count(bat, NULL); + int max; struct battery_property *prop; + struct os_dev *bat; char name[20]; + int rc; + + bat = NULL; + + bat = battery_shell_open_dev(); + if (bat == NULL) { + rc = SYS_ENODEV; + goto err; + } + max = battery_get_property_count(bat, NULL); for (i = 0; i < max; ++i) { prop = battery_enum_property(bat, NULL, i); if (prop) { console_printf(" %s\n", battery_prop_get_name(prop, name, 20)); } } - return 0; + + rc = 0; + +err: + if (bat != NULL) { + os_dev_close(bat); + } + return rc; } static int cmd_bat_poll_rate(int argc, char **argv) { int rc; uint32_t rate_in_s; + struct os_dev *bat; + + bat = NULL; if (argc < 2) { console_printf("Missing poll rate argument\n"); @@ -334,6 +390,12 @@ static int cmd_bat_poll_rate(int argc, char **argv) goto err; } + bat = battery_shell_open_dev(); + if (bat == NULL) { + rc = SYS_ENODEV; + goto err; + } + rate_in_s = (uint32_t)parse_ull_bounds(argv[1], 1, 255, &rc); if (rc) { console_printf("Invalid poll rate, use 1..255\n"); @@ -343,6 +405,9 @@ static int cmd_bat_poll_rate(int argc, char **argv) rc = battery_set_poll_rate_ms(bat, rate_in_s * 1000); err: + if (bat != NULL) { + os_dev_close(bat); + } return rc; } @@ -362,6 +427,9 @@ static int cmd_bat_monitor(int argc, char **argv) { int rc; struct battery_property *prop; + struct os_dev *bat; + + bat = NULL; if (argc < 2) { console_printf("Invalid number of arguments, use monitor <prop_nam>\n"); @@ -369,6 +437,12 @@ static int cmd_bat_monitor(int argc, char **argv) goto err; } + bat = battery_shell_open_dev(); + if (bat == NULL) { + rc = SYS_ENODEV; + goto err; + } + prop = battery_find_property_by_name(bat, argv[1]); if (prop == NULL) { if (strcmp(argv[1], "off") == 0) { @@ -393,6 +467,9 @@ static int cmd_bat_monitor(int argc, char **argv) rc = battery_prop_poll_subscribe(&listener, prop); err: + if (bat != NULL) { + os_dev_close(bat); + } return rc; } @@ -460,7 +537,4 @@ battery_shell_register(void) rc = shell_register("bat", bat_cli_commands); rc = shell_cmd_register(&bat_cli_cmd); SYSINIT_PANIC_ASSERT_MSG(rc == 0, "Failed to register battery shell"); - - bat = os_dev_open("battery_0", 0, NULL); - SYSINIT_PANIC_ASSERT_MSG(bat != NULL, "Failed to open battery device"); }