MYNEWT-667 SensorAPI: Shell: - Invalid type in read crashes device and print type in user friendly manner - Error handling was not taken care of Sensor type is bit field, printing it out as individual bits is better than printing the entire bitmap - Also allow printing accepting type in hex, use strtol() instead of atoi() for parsing type
Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/3f4a64d4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/3f4a64d4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/3f4a64d4 Branch: refs/heads/nrf_cputime Commit: 3f4a64d442d513cb39bbd7ae265a5c9c4da38318 Parents: c9fbdfc Author: Vipul Rahane <vipulrah...@apache.org> Authored: Mon Mar 13 14:44:45 2017 -0700 Committer: Vipul Rahane <vipulrah...@apache.org> Committed: Mon Mar 13 14:47:02 2017 -0700 ---------------------------------------------------------------------- hw/drivers/sensors/tcs34725/src/tcs34725.c | 2 +- hw/sensor/src/sensor_shell.c | 40 +++++++++++++++++++++---- 2 files changed, 35 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3f4a64d4/hw/drivers/sensors/tcs34725/src/tcs34725.c ---------------------------------------------------------------------- diff --git a/hw/drivers/sensors/tcs34725/src/tcs34725.c b/hw/drivers/sensors/tcs34725/src/tcs34725.c index 7a4c07f..d67ecd9 100644 --- a/hw/drivers/sensors/tcs34725/src/tcs34725.c +++ b/hw/drivers/sensors/tcs34725/src/tcs34725.c @@ -753,7 +753,7 @@ tcs34725_calc_colortemp_lux(struct sensor_color_data *scd, struct tcs34725 *tcs3 } /* Shock absorber */ - os_time_delay((256 - (uint16_t)agc_list[agc_cur].ta_time) * 2.4 * 2 * OS_TICKS_PER_SEC); + os_time_delay((256 - ((uint16_t)agc_list[agc_cur].ta_time) * 2.4 * 2 * OS_TICKS_PER_SEC)/1000 + 1); rc = tcs34725_get_rawdata(&scd->scd_r, &scd->scd_g, &scd->scd_b, &scd->scd_c, tcs34725); if (rc) { http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/3f4a64d4/hw/sensor/src/sensor_shell.c ---------------------------------------------------------------------- diff --git a/hw/sensor/src/sensor_shell.c b/hw/sensor/src/sensor_shell.c index fbddd96..8e65752 100644 --- a/hw/sensor/src/sensor_shell.c +++ b/hw/sensor/src/sensor_shell.c @@ -59,8 +59,19 @@ sensor_display_help(void) static void sensor_cmd_display_sensor(struct sensor *sensor) { - console_printf("sensor dev = %s, type = 0x%llx\n", sensor->s_dev->od_name, - sensor->s_types); + int type; + int i; + + console_printf("sensor dev = %s, type = ", sensor->s_dev->od_name); + + for (i = 0; i < 32; i++) { + type = (0x1 << i) & sensor->s_types; + if (type) { + console_printf("0x%x ", type); + } + } + + console_printf("\n"); } static void @@ -243,7 +254,7 @@ sensor_shell_read_listener(struct sensor *sensor, void *arg, void *data) return (0); } -static void +static int sensor_cmd_read(char *name, sensor_type_t type, int nsamples) { struct sensor *sensor; @@ -261,6 +272,14 @@ sensor_cmd_read(char *name, sensor_type_t type, int nsamples) */ memset(&ctx, 0, sizeof(ctx)); + if (!(type & sensor->s_types)) { + rc = SYS_EINVAL; + /* Directly return without trying to unregister */ + console_printf("Read req for wrng type 0x%x from selected sensor: %s\n", + (int)type, name); + return rc; + } + ctx.type = type; listener.sl_sensor_type = type; @@ -269,11 +288,14 @@ sensor_cmd_read(char *name, sensor_type_t type, int nsamples) rc = sensor_register_listener(sensor, &listener); if (rc != 0) { - goto err; + return rc; } while (1) { rc = sensor_read(sensor, type, NULL, NULL, OS_TIMEOUT_NEVER); + if (rc) { + goto err; + } if (ctx.num_entries >= nsamples) { break; } @@ -281,8 +303,10 @@ sensor_cmd_read(char *name, sensor_type_t type, int nsamples) sensor_unregister_listener(sensor, &listener); + return 0; err: - return; + sensor_unregister_listener(sensor, &listener); + return rc; } int @@ -370,7 +394,11 @@ sensor_cmd_exec(int argc, char **argv) rc = SYS_EINVAL; goto err; } - sensor_cmd_read(argv[2], (sensor_type_t) atoi(argv[3]), atoi(argv[4])); + + rc = sensor_cmd_read(argv[2], (sensor_type_t) strtol(argv[3], NULL, 0), atoi(argv[4])); + if (rc) { + goto err; + } } else if (!strcmp(argv[1], "i2cscan")) { rc = sensor_cmd_i2cscan(argc, argv); if (rc) {