From 3a7ee55780b96183b6c600aee4b875dff5c97d0a Mon Sep 17 00:00:00 2001 From: Meco Man <920369182@qq.com> Date: Sun, 25 Dec 2022 14:35:01 -0500 Subject: [PATCH] =?UTF-8?q?[sensor]=20=E4=BC=98=E5=8C=96control=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E6=A3=80=E6=9F=A5=E5=92=8Csensor=20list=E5=91=BD?= =?UTF-8?q?=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/include/drivers/sensor.h | 2 +- components/drivers/sensor/sensor.c | 128 ++++++++++++-------- components/drivers/sensor/sensor_cmd.c | 18 +-- 3 files changed, 88 insertions(+), 60 deletions(-) diff --git a/components/drivers/include/drivers/sensor.h b/components/drivers/include/drivers/sensor.h index 30d114fa47..289e6254bb 100644 --- a/components/drivers/include/drivers/sensor.h +++ b/components/drivers/include/drivers/sensor.h @@ -47,7 +47,7 @@ extern "C" { #define RT_SENSOR_TYPE_BARO (6) #define RT_SENSOR_TYPE_BARO_STR "Barometer" #define RT_SENSOR_TYPE_LIGHT (7) -#define RT_SENSOR_TYPE_LIGHT_STR "Ambient light" +#define RT_SENSOR_TYPE_LIGHT_STR "Ambient Light" #define RT_SENSOR_TYPE_PROXIMITY (8) #define RT_SENSOR_TYPE_PROXIMITY_STR "Proximity" #define RT_SENSOR_TYPE_HR (9) diff --git a/components/drivers/sensor/sensor.c b/components/drivers/sensor/sensor.c index a3d84d670f..8bd99d2c48 100644 --- a/components/drivers/sensor/sensor.c +++ b/components/drivers/sensor/sensor.c @@ -337,6 +337,7 @@ static rt_err_t _sensor_control(rt_device_t dev, int cmd, void *args) rt_err_t result = RT_EOK; RT_ASSERT(dev != RT_NULL); rt_err_t (*local_ctrl)(rt_sensor_t sensor, int cmd, void *arg) = _local_control; + rt_uint8_t mode; if (sensor->module) { @@ -349,58 +350,81 @@ static rt_err_t _sensor_control(rt_device_t dev, int cmd, void *args) switch (cmd) { - case RT_SENSOR_CTRL_GET_ID: - if (args) - { - result = local_ctrl(sensor, RT_SENSOR_CTRL_GET_ID, args); - } - break; - case RT_SENSOR_CTRL_SET_ACCURACY_MODE: - /* Configuration sensor power mode */ - result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_ACCURACY_MODE, args); - if (result == RT_EOK) - { - RT_SENSOR_MODE_SET_ACCURACY(sensor->info.mode, (rt_uint32_t)args & 0x0F); - LOG_D("set accuracy mode code: %d", RT_SENSOR_MODE_GET_ACCURACY(sensor->info.mode)); - } - break; - case RT_SENSOR_CTRL_SET_POWER_MODE: - /* Configuration sensor power mode */ - result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_POWER_MODE, args); - if (result == RT_EOK) - { - RT_SENSOR_MODE_SET_POWER(sensor->info.mode, (rt_uint32_t)args & 0x0F); - LOG_D("set power mode code: %d", RT_SENSOR_MODE_GET_POWER(sensor->info.mode)); - } - break; - case RT_SENSOR_CTRL_SET_FETCH_MODE: - /* Configuration sensor power mode */ - result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_FETCH_MODE, args); - if (result == RT_EOK) - { - RT_SENSOR_MODE_SET_FETCH(sensor->info.mode, (rt_uint32_t)args & 0x0F); - LOG_D("set fetch mode code: %d", RT_SENSOR_MODE_GET_FETCH(sensor->info.mode)); - } - break; - case RT_SENSOR_CTRL_SELF_TEST: - /* device self test */ - result = local_ctrl(sensor, RT_SENSOR_CTRL_SELF_TEST, args); - break; - case RT_SENSOR_CTRL_SOFT_RESET: - /* device soft reset */ - result = local_ctrl(sensor, RT_SENSOR_CTRL_SOFT_RESET, args); - break; - default: - if (cmd > RT_SENSOR_CTRL_USER_CMD_START) - { - /* Custom commands */ - result = local_ctrl(sensor, cmd, args); - } - else - { - result = -RT_ERROR; - } - break; + case RT_SENSOR_CTRL_GET_ID: + if (args) + { + result = local_ctrl(sensor, RT_SENSOR_CTRL_GET_ID, args); + } + break; + case RT_SENSOR_CTRL_SET_ACCURACY_MODE: + /* Configuration sensor power mode */ + mode = (rt_uint32_t)args; + if (!(mode == RT_SENSOR_MODE_ACCURACY_HIGHEST || mode == RT_SENSOR_MODE_ACCURACY_HIGH ||\ + mode == RT_SENSOR_MODE_ACCURACY_MEDIUM || mode == RT_SENSOR_MODE_ACCURACY_LOW ||\ + mode == RT_SENSOR_MODE_ACCURACY_LOWEST || mode == RT_SENSOR_MODE_ACCURACY_NOTRUST)) + { + LOG_E("sensor accuracy mode illegal: %d", mode); + return -RT_EINVAL; + } + result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_ACCURACY_MODE, args); + if (result == RT_EOK) + { + RT_SENSOR_MODE_SET_ACCURACY(sensor->info.mode, (rt_uint32_t)args & 0x0F); + LOG_D("set accuracy mode code: %d", RT_SENSOR_MODE_GET_ACCURACY(sensor->info.mode)); + } + break; + case RT_SENSOR_CTRL_SET_POWER_MODE: + /* Configuration sensor power mode */ + mode = (rt_uint32_t)args; + if (!(mode == RT_SENSOR_MODE_POWER_HIGHEST || mode == RT_SENSOR_MODE_POWER_HIGH ||\ + mode == RT_SENSOR_MODE_POWER_MEDIUM || mode == RT_SENSOR_MODE_POWER_LOW ||\ + mode == RT_SENSOR_MODE_POWER_LOWEST || mode == RT_SENSOR_MODE_POWER_DOWN)) + { + LOG_E("sensor power mode illegal: %d", mode); + return -RT_EINVAL; + } + result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_POWER_MODE, args); + if (result == RT_EOK) + { + RT_SENSOR_MODE_SET_POWER(sensor->info.mode, (rt_uint32_t)args & 0x0F); + LOG_D("set power mode code: %d", RT_SENSOR_MODE_GET_POWER(sensor->info.mode)); + } + break; + case RT_SENSOR_CTRL_SET_FETCH_MODE: + /* Configuration sensor power mode */ + mode = (rt_uint32_t)args; + if (!(mode == RT_SENSOR_MODE_FETCH_POLLING || mode == RT_SENSOR_MODE_FETCH_INT ||\ + mode == RT_SENSOR_MODE_FETCH_FIFO)) + { + LOG_E("sensor fetch data mode illegal: %d", mode); + return -RT_EINVAL; + } + result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_FETCH_MODE, args); + if (result == RT_EOK) + { + RT_SENSOR_MODE_SET_FETCH(sensor->info.mode, (rt_uint32_t)args & 0x0F); + LOG_D("set fetch mode code: %d", RT_SENSOR_MODE_GET_FETCH(sensor->info.mode)); + } + break; + case RT_SENSOR_CTRL_SELF_TEST: + /* device self test */ + result = local_ctrl(sensor, RT_SENSOR_CTRL_SELF_TEST, args); + break; + case RT_SENSOR_CTRL_SOFT_RESET: + /* device soft reset */ + result = local_ctrl(sensor, RT_SENSOR_CTRL_SOFT_RESET, args); + break; + default: + if (cmd > RT_SENSOR_CTRL_USER_CMD_START) + { + /* Custom commands */ + result = local_ctrl(sensor, cmd, args); + } + else + { + result = -RT_EINVAL; + } + break; } if (sensor->module) diff --git a/components/drivers/sensor/sensor_cmd.c b/components/drivers/sensor/sensor_cmd.c index fbf2433db3..994645ed3b 100644 --- a/components/drivers/sensor/sensor_cmd.c +++ b/components/drivers/sensor/sensor_cmd.c @@ -535,9 +535,12 @@ static void sensor_cmd_warning_unknown(void) { LOG_W("Unknown command, please enter 'sensor' get help information!"); rt_kprintf("sensor [OPTION] [PARAM]\n"); + rt_kprintf(" list list all sensor devices\n"); rt_kprintf(" probe probe sensor by given name\n"); rt_kprintf(" info get sensor information\n"); rt_kprintf(" read [num] read [num] times sensor (default 5)\n"); + rt_kprintf(" power [mode] set or get power mode\n"); + rt_kprintf(" accuracy [mode] set or get accuracy mode\n"); } static void sensor_cmd_warning_probe(void) @@ -625,8 +628,8 @@ static void sensor(int argc, char **argv) if(information == RT_NULL) return; - rt_kprintf("device name sensor name sensor type resolution mode \n"); - rt_kprintf("----------- ------------- ------------------ ------------- ---------- \n"); + rt_kprintf("device name sensor name sensor type mode resolution range\n"); + rt_kprintf("----------- ------------- ------------------ ---- ---------- ----------\n"); for (node = information->object_list.next; node != &(information->object_list); node = node->next) @@ -636,12 +639,13 @@ static void sensor(int argc, char **argv) if (sensor_dev->parent.type != RT_Device_Class_Sensor) continue; - rt_kprintf("%-*.*s %-*s %-*s %f%-*s %s + %s + %s\n", + rt_kprintf("%-*.*s %-*s %-*s %u%u%u %-*f %.*f - %.*f%-*s\n", RT_NAME_MAX+3, RT_NAME_MAX, sensor_dev->parent.parent.name, - 14, sensor_dev->info.name, - 17, sensor_get_type_name(&sensor_dev->info), - sensor_dev->info.accuracy.resolution, 5, sensor_get_unit_name(&sensor_dev->info), - sensor_get_accuracy_mode_name(&sensor_dev->info), sensor_get_power_mode_name(&sensor_dev->info), sensor_get_fetch_mode_name(&sensor_dev->info)); + 13, sensor_dev->info.name, + 18, sensor_get_type_name(&sensor_dev->info), + RT_SENSOR_MODE_GET_ACCURACY(sensor_dev->info.mode), RT_SENSOR_MODE_GET_POWER(sensor_dev->info.mode), RT_SENSOR_MODE_GET_FETCH(sensor_dev->info.mode), + 10, sensor_dev->info.accuracy.resolution, + 2, sensor_dev->info.scale.range_min, 2, sensor_dev->info.scale.range_max, 5, sensor_get_unit_name(&sensor_dev->info)); } } else if (!strcmp(argv[1], "probe")) -- GitLab