Browse Source

[sensor] 优化control参数检查和sensor list命令

Meco Man 2 years ago
parent
commit
3a7ee55780

+ 1 - 1
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)

+ 76 - 52
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)

+ 11 - 7
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 <dev_name>      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"))