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

This commit is contained in:
Meco Man 2022-12-25 14:35:01 -05:00 committed by Man, Jianting (Meco)
parent 20a6f14e89
commit 3a7ee55780
3 changed files with 88 additions and 60 deletions

View File

@ -47,7 +47,7 @@ extern "C" {
#define RT_SENSOR_TYPE_BARO (6) #define RT_SENSOR_TYPE_BARO (6)
#define RT_SENSOR_TYPE_BARO_STR "Barometer" #define RT_SENSOR_TYPE_BARO_STR "Barometer"
#define RT_SENSOR_TYPE_LIGHT (7) #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 (8)
#define RT_SENSOR_TYPE_PROXIMITY_STR "Proximity" #define RT_SENSOR_TYPE_PROXIMITY_STR "Proximity"
#define RT_SENSOR_TYPE_HR (9) #define RT_SENSOR_TYPE_HR (9)

View File

@ -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_err_t result = RT_EOK;
RT_ASSERT(dev != RT_NULL); RT_ASSERT(dev != RT_NULL);
rt_err_t (*local_ctrl)(rt_sensor_t sensor, int cmd, void *arg) = _local_control; rt_err_t (*local_ctrl)(rt_sensor_t sensor, int cmd, void *arg) = _local_control;
rt_uint8_t mode;
if (sensor->module) if (sensor->module)
{ {
@ -349,58 +350,81 @@ static rt_err_t _sensor_control(rt_device_t dev, int cmd, void *args)
switch (cmd) switch (cmd)
{ {
case RT_SENSOR_CTRL_GET_ID: case RT_SENSOR_CTRL_GET_ID:
if (args) if (args)
{ {
result = local_ctrl(sensor, RT_SENSOR_CTRL_GET_ID, args); result = local_ctrl(sensor, RT_SENSOR_CTRL_GET_ID, args);
} }
break; break;
case RT_SENSOR_CTRL_SET_ACCURACY_MODE: case RT_SENSOR_CTRL_SET_ACCURACY_MODE:
/* Configuration sensor power mode */ /* Configuration sensor power mode */
result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_ACCURACY_MODE, args); mode = (rt_uint32_t)args;
if (result == RT_EOK) 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 ||\
RT_SENSOR_MODE_SET_ACCURACY(sensor->info.mode, (rt_uint32_t)args & 0x0F); mode == RT_SENSOR_MODE_ACCURACY_LOWEST || mode == RT_SENSOR_MODE_ACCURACY_NOTRUST))
LOG_D("set accuracy mode code: %d", RT_SENSOR_MODE_GET_ACCURACY(sensor->info.mode)); {
} LOG_E("sensor accuracy mode illegal: %d", mode);
break; return -RT_EINVAL;
case RT_SENSOR_CTRL_SET_POWER_MODE: }
/* Configuration sensor power mode */ result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_ACCURACY_MODE, args);
result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_POWER_MODE, args); if (result == RT_EOK)
if (result == RT_EOK) {
{ RT_SENSOR_MODE_SET_ACCURACY(sensor->info.mode, (rt_uint32_t)args & 0x0F);
RT_SENSOR_MODE_SET_POWER(sensor->info.mode, (rt_uint32_t)args & 0x0F); LOG_D("set accuracy mode code: %d", RT_SENSOR_MODE_GET_ACCURACY(sensor->info.mode));
LOG_D("set power mode code: %d", RT_SENSOR_MODE_GET_POWER(sensor->info.mode)); }
} break;
break; case RT_SENSOR_CTRL_SET_POWER_MODE:
case RT_SENSOR_CTRL_SET_FETCH_MODE: /* Configuration sensor power mode */
/* Configuration sensor power mode */ mode = (rt_uint32_t)args;
result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_FETCH_MODE, args); if (!(mode == RT_SENSOR_MODE_POWER_HIGHEST || mode == RT_SENSOR_MODE_POWER_HIGH ||\
if (result == RT_EOK) mode == RT_SENSOR_MODE_POWER_MEDIUM || mode == RT_SENSOR_MODE_POWER_LOW ||\
{ mode == RT_SENSOR_MODE_POWER_LOWEST || mode == RT_SENSOR_MODE_POWER_DOWN))
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)); LOG_E("sensor power mode illegal: %d", mode);
} return -RT_EINVAL;
break; }
case RT_SENSOR_CTRL_SELF_TEST: result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_POWER_MODE, args);
/* device self test */ if (result == RT_EOK)
result = local_ctrl(sensor, RT_SENSOR_CTRL_SELF_TEST, args); {
break; RT_SENSOR_MODE_SET_POWER(sensor->info.mode, (rt_uint32_t)args & 0x0F);
case RT_SENSOR_CTRL_SOFT_RESET: LOG_D("set power mode code: %d", RT_SENSOR_MODE_GET_POWER(sensor->info.mode));
/* device soft reset */ }
result = local_ctrl(sensor, RT_SENSOR_CTRL_SOFT_RESET, args); break;
break; case RT_SENSOR_CTRL_SET_FETCH_MODE:
default: /* Configuration sensor power mode */
if (cmd > RT_SENSOR_CTRL_USER_CMD_START) mode = (rt_uint32_t)args;
{ if (!(mode == RT_SENSOR_MODE_FETCH_POLLING || mode == RT_SENSOR_MODE_FETCH_INT ||\
/* Custom commands */ mode == RT_SENSOR_MODE_FETCH_FIFO))
result = local_ctrl(sensor, cmd, args); {
} LOG_E("sensor fetch data mode illegal: %d", mode);
else return -RT_EINVAL;
{ }
result = -RT_ERROR; result = local_ctrl(sensor, RT_SENSOR_CTRL_SET_FETCH_MODE, args);
} if (result == RT_EOK)
break; {
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) if (sensor->module)

View File

@ -535,9 +535,12 @@ static void sensor_cmd_warning_unknown(void)
{ {
LOG_W("Unknown command, please enter 'sensor' get help information!"); LOG_W("Unknown command, please enter 'sensor' get help information!");
rt_kprintf("sensor [OPTION] [PARAM]\n"); 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(" probe <dev_name> probe sensor by given name\n");
rt_kprintf(" info get sensor information\n"); rt_kprintf(" info get sensor information\n");
rt_kprintf(" read [num] read [num] times sensor (default 5)\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) static void sensor_cmd_warning_probe(void)
@ -625,8 +628,8 @@ static void sensor(int argc, char **argv)
if(information == RT_NULL) if(information == RT_NULL)
return; return;
rt_kprintf("device name sensor name sensor type resolution mode \n"); rt_kprintf("device name sensor name sensor type mode resolution range\n");
rt_kprintf("----------- ------------- ------------------ ------------- ---------- \n"); rt_kprintf("----------- ------------- ------------------ ---- ---------- ----------\n");
for (node = information->object_list.next; for (node = information->object_list.next;
node != &(information->object_list); node != &(information->object_list);
node = node->next) node = node->next)
@ -636,12 +639,13 @@ static void sensor(int argc, char **argv)
if (sensor_dev->parent.type != RT_Device_Class_Sensor) if (sensor_dev->parent.type != RT_Device_Class_Sensor)
continue; 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, RT_NAME_MAX+3, RT_NAME_MAX, sensor_dev->parent.parent.name,
14, sensor_dev->info.name, 13, sensor_dev->info.name,
17, sensor_get_type_name(&sensor_dev->info), 18, sensor_get_type_name(&sensor_dev->info),
sensor_dev->info.accuracy.resolution, 5, sensor_get_unit_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),
sensor_get_accuracy_mode_name(&sensor_dev->info), sensor_get_power_mode_name(&sensor_dev->info), sensor_get_fetch_mode_name(&sensor_dev->info)); 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")) else if (!strcmp(argv[1], "probe"))