Skip to content

[sensor] fixed sensor cmd delay time #3741

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 14, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions components/drivers/sensors/sensor_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ static void sensor_polling(int argc, char **argv)
rt_sensor_t sensor;
struct rt_sensor_data data;
rt_size_t res, i;
rt_int32_t delay;

dev = rt_device_find(argv[1]);
if (dev == RT_NULL)
Expand All @@ -237,6 +238,7 @@ static void sensor_polling(int argc, char **argv)
num = atoi(argv[2]);

sensor = (rt_sensor_t)dev;
delay = sensor->info.period_min > 100 ? sensor->info.period_min : 100;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

period_min是否都存在?如果未存在,或未初始化怎么样?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

翻阅了目前35个sensor软件包相关代码,在 rt_hw_xxx_init 初始化函数部分,其中34个使用如下方式初始化:

sensor_xxx = rt_calloc(1, sizeof(struct rt_sensor_device));

另一个dht11软件包则如下:

static struct rt_sensor_device dht11_dev;
int rt_hw_dht11_init(const char *name, struct rt_sensor_config *cfg)
{
    rt_err_t result = RT_EOK;
    rt_sensor_t sensor = &dht11_dev;

    rt_memset(sensor, 0x0, sizeof(struct rt_sensor_device));
    ......
}

也就是说,目前所有sensor软件包的 sensor->info.period_min 都是存在的,如果没有显式赋值,则为0。另外,其实sensor软件包在初始化时也有对 sensor->info.period_min 赋值。比如:

        sensor->info.type       = RT_SENSOR_CLASS_DUST;
        sensor->info.vendor     = RT_SENSOR_VENDOR_PLANTOWER;
        sensor->info.model      = "pmsxx";
        sensor->info.unit       = RT_SENSOR_UNIT_NONE;
        sensor->info.intf_type  = RT_SENSOR_INTF_UART;
        sensor->info.range_max  = SENSOR_DUST_RANGE_MAX;
        sensor->info.range_min  = SENSOR_DUST_RANGE_MIN;
        sensor->info.period_min = SENSOR_DUST_PERIOD_MIN;

为了提高软件可靠性,建议后续在sensor软件包制作文档中增加说明,提示软件包开发者必须填充 sensor->info 结构体信息。


if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
{
Expand All @@ -256,7 +258,7 @@ static void sensor_polling(int argc, char **argv)
{
sensor_show_data(i, sensor, &data);
}
rt_thread_mdelay(100);
rt_thread_mdelay(delay);
}
rt_device_close(dev);
}
Expand All @@ -268,7 +270,9 @@ static void sensor(int argc, char **argv)
{
static rt_device_t dev = RT_NULL;
struct rt_sensor_data data;
rt_sensor_t sensor;
rt_size_t res, i;
rt_int32_t delay;

/* If the number of arguments less than 2 */
if (argc < 2)
Expand Down Expand Up @@ -410,6 +414,9 @@ static void sensor(int argc, char **argv)
num = atoi(argv[2]);
}

sensor = (rt_sensor_t)dev;
delay = sensor->info.period_min > 100 ? sensor->info.period_min : 100;

for (i = 0; i < num; i++)
{
res = rt_device_read(dev, 0, &data, 1);
Expand All @@ -419,9 +426,9 @@ static void sensor(int argc, char **argv)
}
else
{
sensor_show_data(i, (rt_sensor_t)dev, &data);
sensor_show_data(i, sensor, &data);
}
rt_thread_mdelay(100);
rt_thread_mdelay(delay);
}
}
else if (argc == 3)
Expand Down