sensor_cmd.c 19.3 KB
Newer Older
G
guozhanxin 已提交
1
/*
2
 * Copyright (c) 2006-2021, RT-Thread Development Team
G
guozhanxin 已提交
3 4 5 6
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
7 8 9
 * Date           Author         Notes
 * 2019-01-31     flybreak       first version
 * 2019-07-16     WillianChan    Increase the output of sensor information
10
 * 2020-02-22     luhuadong      Add vendor info and sensor types for cmd
G
guozhanxin 已提交
11 12
 */

mysterywolf's avatar
mysterywolf 已提交
13
#include <drivers/sensor.h>
G
guozhanxin 已提交
14

15 16
#define DBG_TAG  "sensor.cmd"
#define DBG_LVL DBG_INFO
G
guozhanxin 已提交
17 18 19 20 21 22 23
#include <rtdbg.h>

#include <stdlib.h>
#include <string.h>

static rt_sem_t sensor_rx_sem = RT_NULL;

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
static const char *sensor_get_type_name(rt_sensor_info_t info)
{
    switch(info->type)
    {
        case RT_SENSOR_CLASS_ACCE:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_ACCE);
        case RT_SENSOR_CLASS_GYRO:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_GYRO);
        case RT_SENSOR_CLASS_MAG:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_MAG);
        case RT_SENSOR_CLASS_TEMP:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_TEMP);
        case RT_SENSOR_CLASS_HUMI:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_HUMI);
        case RT_SENSOR_CLASS_BARO:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_BARO);
        case RT_SENSOR_CLASS_LIGHT:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_LIGHT);
        case RT_SENSOR_CLASS_PROXIMITY:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_PROXIMITY);
        case RT_SENSOR_CLASS_HR:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_HR);
        case RT_SENSOR_CLASS_TVOC:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_TVOC);
        case RT_SENSOR_CLASS_NOISE:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_NOISE);
        case RT_SENSOR_CLASS_STEP:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_STEP);
        case RT_SENSOR_CLASS_FORCE:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_FORCE);
        case RT_SENSOR_CLASS_DUST:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_DUST);
        case RT_SENSOR_CLASS_ECO2:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_ECO2);
        case RT_SENSOR_CLASS_GNSS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_GNSS);
        case RT_SENSOR_CLASS_TOF:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_TOF);
        case RT_SENSOR_CLASS_SPO2:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_SPO2);
        case RT_SENSOR_CLASS_IAQ:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_IAQ);
        case RT_SENSOR_CLASS_ETOH:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_ETOH);
        case RT_SENSOR_CLASS_BP:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_BP);
        case RT_SENSOR_CLASS_NONE:
        default:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_NONE);
    }
}

static const char *sensor_get_vendor_name(rt_sensor_info_t info)
{
    switch(info->vendor)
    {
        case RT_SENSOR_VENDOR_STM:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_STM);
        case RT_SENSOR_VENDOR_BOSCH:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_BOSCH);
        case RT_SENSOR_VENDOR_INVENSENSE:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_INVENSENSE);
        case RT_SENSOR_VENDOR_SEMTECH:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_SEMTECH);
        case RT_SENSOR_VENDOR_GOERTEK:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_GOERTEK);
        case RT_SENSOR_VENDOR_MIRAMEMS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_MIRAMEMS);
        case RT_SENSOR_VENDOR_DALLAS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_DALLAS);
        case RT_SENSOR_VENDOR_ASAIR:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_ASAIR);
        case RT_SENSOR_VENDOR_SHARP:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_SHARP);
        case RT_SENSOR_VENDOR_SENSIRION:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_SENSIRION);
        case RT_SENSOR_VENDOR_TI:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_TI);
        case RT_SENSOR_VENDOR_PLANTOWER:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_PLANTOWER);
        case RT_SENSOR_VENDOR_AMS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_AMS);
        case RT_SENSOR_VENDOR_MAXIM:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_MAXIM);
        case RT_SENSOR_VENDOR_MELEXIS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_MELEXIS);
        case RT_SENSOR_VENDOR_UNKNOWN:
        default:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_UNKNOWN);
    }
}

static const char *sensor_get_unit_name(rt_sensor_info_t info)
{
    switch(info->unit)
    {
        case RT_SENSOR_UNIT_MG:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MG);
        case RT_SENSOR_UNIT_MDPS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MDPS);
        case RT_SENSOR_UNIT_MGAUSS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MGAUSS);
        case RT_SENSOR_UNIT_LUX:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_LUX);
        case RT_SENSOR_UNIT_CM:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_CM);
        case RT_SENSOR_UNIT_MM:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MM);
        case RT_SENSOR_UNIT_PA:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PA);
        case RT_SENSOR_UNIT_MMHG:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MMHG);
        case RT_SENSOR_UNIT_PERMILLAGE:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PERMILLAGE);
        case RT_SENSOR_UNIT_PERCENTAGE:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PERCENTAGE);
        case RT_SENSOR_UNIT_CELSIUS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_CELSIUS);
        case RT_SENSOR_UNIT_FAHRENHEIT:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_FAHRENHEIT);
        case RT_SENSOR_UNIT_KELVIN:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_KELVIN);
        case RT_SENSOR_UNIT_HZ:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_HZ);
        case RT_SENSOR_UNIT_BPM:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_BPM);
        case RT_SENSOR_UNIT_MN:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MN);
        case RT_SENSOR_UNIT_N:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_N);
        case RT_SENSOR_UNIT_PPM:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PPM);
        case RT_SENSOR_UNIT_PPB:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PPB);
        case RT_SENSOR_UNIT_DMS:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_DMS);
        case RT_SENSOR_UNIT_DD:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_DD);
        case RT_SENSOR_UNIT_MGM3:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MGM3);
        case RT_SENSOR_UNIT_NONE:
        default:
            return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_NONE);
    }
}

G
guozhanxin 已提交
170 171
static void sensor_show_data(rt_size_t num, rt_sensor_t sensor, struct rt_sensor_data *sensor_data)
{
172
    const char *unit_name = sensor_get_unit_name(&sensor->info);
G
guozhanxin 已提交
173 174
    switch (sensor->info.type)
    {
G
guozhanxin 已提交
175
    case RT_SENSOR_CLASS_ACCE:
176
        LOG_I("num:%d, x:%f, y:%f, z:%f %s, timestamp:%u", num, sensor_data->data.acce.x, sensor_data->data.acce.y, sensor_data->data.acce.z, unit_name, sensor_data->timestamp);
G
guozhanxin 已提交
177
        break;
G
guozhanxin 已提交
178
    case RT_SENSOR_CLASS_GYRO:
179
        LOG_I("num:%d, x:%f, y:%f, z:%f %s, timestamp:%u", num, sensor_data->data.gyro.x, sensor_data->data.gyro.y, sensor_data->data.gyro.z, unit_name, sensor_data->timestamp);
G
guozhanxin 已提交
180
        break;
G
guozhanxin 已提交
181
    case RT_SENSOR_CLASS_MAG:
182
        LOG_I("num:%d, x:%f, y:%f, z:%f %s, timestamp:%u", num, sensor_data->data.mag.x, sensor_data->data.mag.y, sensor_data->data.mag.z, unit_name, sensor_data->timestamp);
G
guozhanxin 已提交
183
        break;
184
    case RT_SENSOR_CLASS_GNSS:
185
        LOG_I("num:%d, lon:%f, lat:%f %s, timestamp:%u", num, sensor_data->data.coord.longitude, sensor_data->data.coord.latitude, unit_name, sensor_data->timestamp);
186
        break;
G
guozhanxin 已提交
187
    case RT_SENSOR_CLASS_TEMP:
188
        LOG_I("num:%d, temp:%f%s, timestamp:%u", num, sensor_data->data.temp, unit_name, sensor_data->timestamp);
189 190
        break;
    case RT_SENSOR_CLASS_HUMI:
191
        LOG_I("num:%d, humi:%f%s, timestamp:%u", num, sensor_data->data.humi, unit_name, sensor_data->timestamp);
G
guozhanxin 已提交
192
        break;
G
guozhanxin 已提交
193
    case RT_SENSOR_CLASS_BARO:
194
        LOG_I("num:%d, press:%f%s, timestamp:%u", num, sensor_data->data.baro, unit_name, sensor_data->timestamp);
G
guozhanxin 已提交
195
        break;
196
    case RT_SENSOR_CLASS_LIGHT:
197
        LOG_I("num:%d, light:%f%s, timestamp:%u", num, sensor_data->data.light, unit_name, sensor_data->timestamp);
G
guozhanxin 已提交
198
        break;
199
    case RT_SENSOR_CLASS_PROXIMITY:
P
Prry 已提交
200
    case RT_SENSOR_CLASS_TOF:
201
        LOG_I("num:%d, distance:%f%s, timestamp:%u", num, sensor_data->data.proximity, unit_name, sensor_data->timestamp);
202
        break;
203
    case RT_SENSOR_CLASS_HR:
204
        LOG_I("num:%d, heart rate:%f%s, timestamp:%u", num, sensor_data->data.hr, unit_name, sensor_data->timestamp);
205 206
        break;
    case RT_SENSOR_CLASS_TVOC:
207
        LOG_I("num:%d, tvoc:%f%s, timestamp:%u", num, sensor_data->data.tvoc, unit_name, sensor_data->timestamp);
208 209
        break;
    case RT_SENSOR_CLASS_NOISE:
210
        LOG_I("num:%d, noise:%f%s, timestamp:%u", num, sensor_data->data.noise, unit_name, sensor_data->timestamp);
211 212
        break;
    case RT_SENSOR_CLASS_STEP:
213
        LOG_I("num:%d, step:%f%s, timestamp:%u", num, sensor_data->data.step, unit_name, sensor_data->timestamp);
214
        break;
215
    case RT_SENSOR_CLASS_FORCE:
216
        LOG_I("num:%d, force:%f%s, timestamp:%u", num, sensor_data->data.force, unit_name, sensor_data->timestamp);
217
        break;
218
    case RT_SENSOR_CLASS_DUST:
219
        LOG_I("num:%d, dust:%f%s, timestamp:%u", num, sensor_data->data.dust, unit_name, sensor_data->timestamp);
220 221
        break;
    case RT_SENSOR_CLASS_ECO2:
222
        LOG_I("num:%d, eco2:%f%s, timestamp:%u", num, sensor_data->data.eco2, unit_name, sensor_data->timestamp);
223
        break;
S
Sherman 已提交
224
    case RT_SENSOR_CLASS_IAQ:
225
        LOG_I("num:%d, IAQ:%f%s, timestamp:%u", num, sensor_data->data.iaq, unit_name, sensor_data->timestamp);
S
Sherman 已提交
226 227
        break;
    case RT_SENSOR_CLASS_ETOH:
228
        LOG_I("num:%d, EtOH:%f%s, timestamp:%u", num, sensor_data->data.etoh, unit_name, sensor_data->timestamp);
S
Sherman 已提交
229
        break;
230
    case RT_SENSOR_CLASS_BP:
231
        LOG_I("num:%d, bp.sbp:%f, bp.dbp:%f %s, timestamp:%u", num, sensor_data->data.bp.sbp, sensor_data->data.bp.dbp, unit_name, sensor_data->timestamp);
232
        break;
233
    case RT_SENSOR_CLASS_NONE:
G
guozhanxin 已提交
234
    default:
mysterywolf's avatar
mysterywolf 已提交
235
        LOG_E("Unknown type of sensor!");
G
guozhanxin 已提交
236 237 238 239
        break;
    }
}

240
static rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
G
guozhanxin 已提交
241 242 243 244 245 246 247
{
    rt_sem_release(sensor_rx_sem);
    return 0;
}

static void sensor_fifo_rx_entry(void *parameter)
{
248 249
    rt_device_t dev = (rt_device_t)parameter;
    rt_sensor_t sensor = (rt_sensor_t)parameter;
G
guozhanxin 已提交
250 251 252
    struct rt_sensor_data *data = RT_NULL;
    struct rt_sensor_info info;
    rt_size_t res, i;
253

G
guozhanxin 已提交
254
    rt_device_control(dev, RT_SENSOR_CTRL_GET_INFO, &info);
G
guozhanxin 已提交
255

256
    data = (struct rt_sensor_data *)rt_malloc(sizeof(struct rt_sensor_data) * info.fifo_max);
G
guozhanxin 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
    if (data == RT_NULL)
    {
        LOG_E("Memory allocation failed!");
    }

    while (1)
    {
        rt_sem_take(sensor_rx_sem, RT_WAITING_FOREVER);

        res = rt_device_read(dev, 0, data, info.fifo_max);
        for (i = 0; i < res; i++)
        {
            sensor_show_data(i, sensor, &data[i]);
        }
    }
}

static void sensor_fifo(int argc, char **argv)
{
    static rt_thread_t tid1 = RT_NULL;
    rt_device_t dev = RT_NULL;
    rt_sensor_t sensor;

    dev = rt_device_find(argv[1]);
    if (dev == RT_NULL)
    {
        LOG_E("Can't find device:%s", argv[1]);
        return;
    }
    sensor = (rt_sensor_t)dev;
287

288 289 290 291 292
    if (rt_device_open(dev, RT_DEVICE_FLAG_FIFO_RX) != RT_EOK)
    {
        LOG_E("open device failed!");
        return;
    }
G
guozhanxin 已提交
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313

    if (sensor_rx_sem == RT_NULL)
    {
        sensor_rx_sem = rt_sem_create("sen_rx_sem", 0, RT_IPC_FLAG_FIFO);
    }
    else
    {
        LOG_E("The thread is running, please reboot and try again");
        return;
    }

    tid1 = rt_thread_create("sen_rx_thread",
                            sensor_fifo_rx_entry, sensor,
                            1024,
                            15, 5);

    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);

    rt_device_set_rx_indicate(dev, rx_callback);

G
guozhanxin 已提交
314
    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
G
guozhanxin 已提交
315
}
马志远 已提交
316
#ifdef RT_USING_FINSH
S
Sherman 已提交
317
    MSH_CMD_EXPORT(sensor_fifo, Sensor fifo mode test function);
G
guozhanxin 已提交
318 319 320 321
#endif

static void sensor_irq_rx_entry(void *parameter)
{
322 323
    rt_device_t dev = (rt_device_t)parameter;
    rt_sensor_t sensor = (rt_sensor_t)parameter;
G
guozhanxin 已提交
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
    struct rt_sensor_data data;
    rt_size_t res, i = 0;

    while (1)
    {
        rt_sem_take(sensor_rx_sem, RT_WAITING_FOREVER);

        res = rt_device_read(dev, 0, &data, 1);
        if (res == 1)
        {
            sensor_show_data(i++, sensor, &data);
        }
    }
}

static void sensor_int(int argc, char **argv)
{
    static rt_thread_t tid1 = RT_NULL;
    rt_device_t dev = RT_NULL;
    rt_sensor_t sensor;

    dev = rt_device_find(argv[1]);
    if (dev == RT_NULL)
    {
        LOG_E("Can't find device:%s", argv[1]);
        return;
    }
    sensor = (rt_sensor_t)dev;

    if (sensor_rx_sem == RT_NULL)
    {
        sensor_rx_sem = rt_sem_create("sen_rx_sem", 0, RT_IPC_FLAG_FIFO);
    }
    else
    {
        LOG_E("The thread is running, please reboot and try again");
        return;
    }

    tid1 = rt_thread_create("sen_rx_thread",
                            sensor_irq_rx_entry, sensor,
                            1024,
                            15, 5);

    if (tid1 != RT_NULL)
        rt_thread_startup(tid1);

    rt_device_set_rx_indicate(dev, rx_callback);

    if (rt_device_open(dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK)
    {
        LOG_E("open device failed!");
        return;
    }
G
guozhanxin 已提交
378
    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
G
guozhanxin 已提交
379
}
马志远 已提交
380
#ifdef RT_USING_FINSH
S
Sherman 已提交
381
    MSH_CMD_EXPORT(sensor_int, Sensor interrupt mode test function);
G
guozhanxin 已提交
382 383 384 385
#endif

static void sensor_polling(int argc, char **argv)
{
G
guo 已提交
386
    rt_uint16_t num = 10;
G
guozhanxin 已提交
387 388 389 390
    rt_device_t dev = RT_NULL;
    rt_sensor_t sensor;
    struct rt_sensor_data data;
    rt_size_t res, i;
L
luhuadong 已提交
391
    rt_int32_t delay;
392
    rt_err_t result;
G
guozhanxin 已提交
393 394 395 396 397 398 399 400 401 402 403

    dev = rt_device_find(argv[1]);
    if (dev == RT_NULL)
    {
        LOG_E("Can't find device:%s", argv[1]);
        return;
    }
    if (argc > 2)
        num = atoi(argv[2]);

    sensor = (rt_sensor_t)dev;
L
luhuadong 已提交
404
    delay  = sensor->info.period_min > 100 ? sensor->info.period_min : 100;
G
guozhanxin 已提交
405

406 407
    result = rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);
    if (result != RT_EOK)
G
guozhanxin 已提交
408
    {
409
        LOG_E("open device failed! error code : %d", result);
G
guozhanxin 已提交
410 411
        return;
    }
G
guozhanxin 已提交
412
    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);
G
guozhanxin 已提交
413 414 415 416 417 418 419 420 421 422 423 424

    for (i = 0; i < num; i++)
    {
        res = rt_device_read(dev, 0, &data, 1);
        if (res != 1)
        {
            LOG_E("read data failed!size is %d", res);
        }
        else
        {
            sensor_show_data(i, sensor, &data);
        }
L
luhuadong 已提交
425
        rt_thread_mdelay(delay);
G
guozhanxin 已提交
426 427 428
    }
    rt_device_close(dev);
}
马志远 已提交
429
#ifdef RT_USING_FINSH
S
Sherman 已提交
430
    MSH_CMD_EXPORT(sensor_polling, Sensor polling mode test function);
G
guozhanxin 已提交
431 432 433 434 435 436
#endif

static void sensor(int argc, char **argv)
{
    static rt_device_t dev = RT_NULL;
    struct rt_sensor_data data;
L
luhuadong 已提交
437
    rt_sensor_t sensor;
G
guozhanxin 已提交
438
    rt_size_t res, i;
L
luhuadong 已提交
439
    rt_int32_t delay;
G
guozhanxin 已提交
440 441 442 443 444 445 446 447

    /* If the number of arguments less than 2 */
    if (argc < 2)
    {
        rt_kprintf("\n");
        rt_kprintf("sensor  [OPTION] [PARAM]\n");
        rt_kprintf("         probe <dev_name>      Probe sensor by given name\n");
        rt_kprintf("         info                  Get sensor info\n");
mysterywolf's avatar
mysterywolf 已提交
448 449 450 451 452
        rt_kprintf("         range <var>           Set range to var\n");
        rt_kprintf("         mode <var>            Set work mode to var\n");
        rt_kprintf("         power <var>           Set power mode to var\n");
        rt_kprintf("         rate <var>            Set output date rate to var\n");
        rt_kprintf("         read [num]            Read [num] times sensor (default 5)\n");
G
guozhanxin 已提交
453 454 455 456 457
        return ;
    }
    else if (!strcmp(argv[1], "info"))
    {
        struct rt_sensor_info info;
458 459 460 461 462
        if (dev == RT_NULL)
        {
            LOG_W("Please probe sensor device first!");
            return ;
        }
G
guozhanxin 已提交
463
        rt_device_control(dev, RT_SENSOR_CTRL_GET_INFO, &info);
464
        rt_kprintf("model     :%s\n", info.model);
465 466 467
        rt_kprintf("type:     :%s\n", sensor_get_type_name(&info));
        rt_kprintf("vendor    :%s\n", sensor_get_vendor_name(&info));
        rt_kprintf("unit      :%s\n", sensor_get_unit_name(&info));
G
guozhanxin 已提交
468 469
        rt_kprintf("range_max :%d\n", info.range_max);
        rt_kprintf("range_min :%d\n", info.range_min);
470
        rt_kprintf("period_min:%dms\n", info.period_min);
G
guozhanxin 已提交
471 472 473 474
        rt_kprintf("fifo_max  :%d\n", info.fifo_max);
    }
    else if (!strcmp(argv[1], "read"))
    {
G
guo 已提交
475
        rt_uint16_t num = 5;
G
guozhanxin 已提交
476 477 478 479 480 481 482 483 484 485 486

        if (dev == RT_NULL)
        {
            LOG_W("Please probe sensor device first!");
            return ;
        }
        if (argc == 3)
        {
            num = atoi(argv[2]);
        }

L
luhuadong 已提交
487 488 489
        sensor = (rt_sensor_t)dev;
        delay  = sensor->info.period_min > 100 ? sensor->info.period_min : 100;

G
guozhanxin 已提交
490 491 492 493 494 495 496 497 498
        for (i = 0; i < num; i++)
        {
            res = rt_device_read(dev, 0, &data, 1);
            if (res != 1)
            {
                LOG_E("read data failed!size is %d", res);
            }
            else
            {
L
luhuadong 已提交
499
                sensor_show_data(i, sensor, &data);
G
guozhanxin 已提交
500
            }
L
luhuadong 已提交
501
            rt_thread_mdelay(delay);
G
guozhanxin 已提交
502 503 504 505 506 507 508
        }
    }
    else if (argc == 3)
    {
        if (!strcmp(argv[1], "probe"))
        {
            rt_uint8_t reg = 0xFF;
mysterywolf's avatar
mysterywolf 已提交
509
            rt_device_t new_dev;
G
guozhanxin 已提交
510

mysterywolf's avatar
mysterywolf 已提交
511 512
            new_dev = rt_device_find(argv[2]);
            if (new_dev == RT_NULL)
G
guozhanxin 已提交
513
            {
514
                LOG_E("Can't find device:%s", argv[2]);
G
guozhanxin 已提交
515 516
                return;
            }
mysterywolf's avatar
mysterywolf 已提交
517
            if (rt_device_open(new_dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
G
guozhanxin 已提交
518 519 520 521
            {
                LOG_E("open device failed!");
                return;
            }
mysterywolf's avatar
mysterywolf 已提交
522
            rt_device_control(new_dev, RT_SENSOR_CTRL_GET_ID, &reg);
G
guozhanxin 已提交
523
            LOG_I("device id: 0x%x!", reg);
mysterywolf's avatar
mysterywolf 已提交
524 525 526 527 528
            if (dev)
            {
                rt_device_close(dev);
            }
            dev = new_dev;
G
guozhanxin 已提交
529 530 531 532 533 534
        }
        else if (dev == RT_NULL)
        {
            LOG_W("Please probe sensor first!");
            return ;
        }
mysterywolf's avatar
mysterywolf 已提交
535
        else if (!strcmp(argv[1], "range"))
G
guozhanxin 已提交
536
        {
G
guozhanxin 已提交
537
            rt_device_control(dev, RT_SENSOR_CTRL_SET_RANGE, (void *)atoi(argv[2]));
G
guozhanxin 已提交
538
        }
mysterywolf's avatar
mysterywolf 已提交
539
        else if (!strcmp(argv[1], "mode"))
G
guozhanxin 已提交
540
        {
G
guozhanxin 已提交
541
            rt_device_control(dev, RT_SENSOR_CTRL_SET_MODE, (void *)atoi(argv[2]));
G
guozhanxin 已提交
542
        }
mysterywolf's avatar
mysterywolf 已提交
543
        else if (!strcmp(argv[1], "power"))
G
guozhanxin 已提交
544
        {
G
guozhanxin 已提交
545
            rt_device_control(dev, RT_SENSOR_CTRL_SET_POWER, (void *)atoi(argv[2]));
G
guozhanxin 已提交
546
        }
mysterywolf's avatar
mysterywolf 已提交
547
        else if (!strcmp(argv[1], "rate"))
G
guozhanxin 已提交
548
        {
G
guozhanxin 已提交
549
            rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)atoi(argv[2]));
G
guozhanxin 已提交
550 551 552 553 554 555 556 557 558 559 560
        }
        else
        {
            LOG_W("Unknown command, please enter 'sensor' get help information!");
        }
    }
    else
    {
        LOG_W("Unknown command, please enter 'sensor' get help information!");
    }
}
马志远 已提交
561
#ifdef RT_USING_FINSH
S
Sherman 已提交
562
    MSH_CMD_EXPORT(sensor, sensor test function);
G
guozhanxin 已提交
563
#endif