sensor_cmd.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-01-31 flybreak first version
  9. * 2019-07-16 WillianChan Increase the output of sensor information
  10. * 2020-02-22 luhuadong Add vendor info and sensor types for cmd
  11. */
  12. #include <drivers/sensor.h>
  13. #define DBG_TAG "sensor.cmd"
  14. #define DBG_LVL DBG_INFO
  15. #include <rtdbg.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. static rt_sem_t sensor_rx_sem = RT_NULL;
  19. static const char *sensor_get_type_name(rt_sensor_info_t info)
  20. {
  21. switch(info->type)
  22. {
  23. case RT_SENSOR_CLASS_ACCE:
  24. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_ACCE);
  25. case RT_SENSOR_CLASS_GYRO:
  26. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_GYRO);
  27. case RT_SENSOR_CLASS_MAG:
  28. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_MAG);
  29. case RT_SENSOR_CLASS_TEMP:
  30. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_TEMP);
  31. case RT_SENSOR_CLASS_HUMI:
  32. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_HUMI);
  33. case RT_SENSOR_CLASS_BARO:
  34. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_BARO);
  35. case RT_SENSOR_CLASS_LIGHT:
  36. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_LIGHT);
  37. case RT_SENSOR_CLASS_PROXIMITY:
  38. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_PROXIMITY);
  39. case RT_SENSOR_CLASS_HR:
  40. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_HR);
  41. case RT_SENSOR_CLASS_TVOC:
  42. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_TVOC);
  43. case RT_SENSOR_CLASS_NOISE:
  44. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_NOISE);
  45. case RT_SENSOR_CLASS_STEP:
  46. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_STEP);
  47. case RT_SENSOR_CLASS_FORCE:
  48. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_FORCE);
  49. case RT_SENSOR_CLASS_DUST:
  50. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_DUST);
  51. case RT_SENSOR_CLASS_ECO2:
  52. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_ECO2);
  53. case RT_SENSOR_CLASS_GNSS:
  54. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_GNSS);
  55. case RT_SENSOR_CLASS_TOF:
  56. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_TOF);
  57. case RT_SENSOR_CLASS_SPO2:
  58. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_SPO2);
  59. case RT_SENSOR_CLASS_IAQ:
  60. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_IAQ);
  61. case RT_SENSOR_CLASS_ETOH:
  62. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_ETOH);
  63. case RT_SENSOR_CLASS_BP:
  64. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_BP);
  65. case RT_SENSOR_CLASS_VOLTAGE:
  66. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_VOLTAGE);
  67. case RT_SENSOR_CLASS_CURRENT:
  68. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_CURRENT);
  69. case RT_SENSOR_CLASS_NONE:
  70. default:
  71. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_CLASS_NONE);
  72. }
  73. }
  74. static const char *sensor_get_vendor_name(rt_sensor_info_t info)
  75. {
  76. switch(info->vendor)
  77. {
  78. case RT_SENSOR_VENDOR_VIRTUAL:
  79. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_VIRTUAL);
  80. case RT_SENSOR_VENDOR_ONCHIP:
  81. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_ONCHIP);
  82. case RT_SENSOR_VENDOR_STM:
  83. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_STM);
  84. case RT_SENSOR_VENDOR_BOSCH:
  85. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_BOSCH);
  86. case RT_SENSOR_VENDOR_INVENSENSE:
  87. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_INVENSENSE);
  88. case RT_SENSOR_VENDOR_SEMTECH:
  89. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_SEMTECH);
  90. case RT_SENSOR_VENDOR_GOERTEK:
  91. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_GOERTEK);
  92. case RT_SENSOR_VENDOR_MIRAMEMS:
  93. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_MIRAMEMS);
  94. case RT_SENSOR_VENDOR_DALLAS:
  95. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_DALLAS);
  96. case RT_SENSOR_VENDOR_ASAIR:
  97. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_ASAIR);
  98. case RT_SENSOR_VENDOR_SHARP:
  99. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_SHARP);
  100. case RT_SENSOR_VENDOR_SENSIRION:
  101. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_SENSIRION);
  102. case RT_SENSOR_VENDOR_TI:
  103. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_TI);
  104. case RT_SENSOR_VENDOR_PLANTOWER:
  105. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_PLANTOWER);
  106. case RT_SENSOR_VENDOR_AMS:
  107. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_AMS);
  108. case RT_SENSOR_VENDOR_MAXIM:
  109. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_MAXIM);
  110. case RT_SENSOR_VENDOR_MELEXIS:
  111. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_MELEXIS);
  112. case RT_SENSOR_VENDOR_UNKNOWN:
  113. default:
  114. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_VENDOR_UNKNOWN);
  115. }
  116. }
  117. static const char *sensor_get_unit_name(rt_sensor_info_t info)
  118. {
  119. switch(info->unit)
  120. {
  121. case RT_SENSOR_UNIT_MG:
  122. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MG);
  123. case RT_SENSOR_UNIT_MDPS:
  124. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MDPS);
  125. case RT_SENSOR_UNIT_MGAUSS:
  126. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MGAUSS);
  127. case RT_SENSOR_UNIT_LUX:
  128. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_LUX);
  129. case RT_SENSOR_UNIT_M:
  130. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_M);
  131. case RT_SENSOR_UNIT_CM:
  132. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_CM);
  133. case RT_SENSOR_UNIT_MM:
  134. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MM);
  135. case RT_SENSOR_UNIT_PA:
  136. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PA);
  137. case RT_SENSOR_UNIT_MMHG:
  138. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MMHG);
  139. case RT_SENSOR_UNIT_PERCENTAGE:
  140. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PERCENTAGE);
  141. case RT_SENSOR_UNIT_PERMILLAGE:
  142. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PERMILLAGE);
  143. case RT_SENSOR_UNIT_CELSIUS:
  144. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_CELSIUS);
  145. case RT_SENSOR_UNIT_FAHRENHEIT:
  146. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_FAHRENHEIT);
  147. case RT_SENSOR_UNIT_KELVIN:
  148. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_KELVIN);
  149. case RT_SENSOR_UNIT_HZ:
  150. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_HZ);
  151. case RT_SENSOR_UNIT_V:
  152. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_V);
  153. case RT_SENSOR_UNIT_MV:
  154. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MV);
  155. case RT_SENSOR_UNIT_A:
  156. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_A);
  157. case RT_SENSOR_UNIT_MA:
  158. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MA);
  159. case RT_SENSOR_UNIT_N:
  160. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_N);
  161. case RT_SENSOR_UNIT_MN:
  162. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MN);
  163. case RT_SENSOR_UNIT_BPM:
  164. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_BPM);
  165. case RT_SENSOR_UNIT_PPM:
  166. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PPM);
  167. case RT_SENSOR_UNIT_PPB:
  168. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_PPB);
  169. case RT_SENSOR_UNIT_DMS:
  170. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_DMS);
  171. case RT_SENSOR_UNIT_DD:
  172. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_DD);
  173. case RT_SENSOR_UNIT_MGM3:
  174. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_MGM3);
  175. case RT_SENSOR_UNIT_NONE:
  176. default:
  177. return RT_SENSOR_MACRO_GET_NAME(RT_SENSOR_UNIT_NONE);
  178. }
  179. }
  180. static void sensor_show_data(rt_size_t num, rt_sensor_t sensor, struct rt_sensor_data *sensor_data)
  181. {
  182. const char *unit_name = sensor_get_unit_name(&sensor->info);
  183. switch (sensor->info.type)
  184. {
  185. case RT_SENSOR_CLASS_ACCE:
  186. 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);
  187. break;
  188. case RT_SENSOR_CLASS_GYRO:
  189. 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);
  190. break;
  191. case RT_SENSOR_CLASS_MAG:
  192. 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);
  193. break;
  194. case RT_SENSOR_CLASS_GNSS:
  195. 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);
  196. break;
  197. case RT_SENSOR_CLASS_TEMP:
  198. LOG_I("num:%d, temp:%f%s, timestamp:%u", num, sensor_data->data.temp, unit_name, sensor_data->timestamp);
  199. break;
  200. case RT_SENSOR_CLASS_HUMI:
  201. LOG_I("num:%d, humi:%f%s, timestamp:%u", num, sensor_data->data.humi, unit_name, sensor_data->timestamp);
  202. break;
  203. case RT_SENSOR_CLASS_BARO:
  204. LOG_I("num:%d, press:%f%s, timestamp:%u", num, sensor_data->data.baro, unit_name, sensor_data->timestamp);
  205. break;
  206. case RT_SENSOR_CLASS_LIGHT:
  207. LOG_I("num:%d, light:%f%s, timestamp:%u", num, sensor_data->data.light, unit_name, sensor_data->timestamp);
  208. break;
  209. case RT_SENSOR_CLASS_PROXIMITY:
  210. case RT_SENSOR_CLASS_TOF:
  211. LOG_I("num:%d, distance:%f%s, timestamp:%u", num, sensor_data->data.proximity, unit_name, sensor_data->timestamp);
  212. break;
  213. case RT_SENSOR_CLASS_HR:
  214. LOG_I("num:%d, heart rate:%f%s, timestamp:%u", num, sensor_data->data.hr, unit_name, sensor_data->timestamp);
  215. break;
  216. case RT_SENSOR_CLASS_TVOC:
  217. LOG_I("num:%d, tvoc:%f%s, timestamp:%u", num, sensor_data->data.tvoc, unit_name, sensor_data->timestamp);
  218. break;
  219. case RT_SENSOR_CLASS_NOISE:
  220. LOG_I("num:%d, noise:%f%s, timestamp:%u", num, sensor_data->data.noise, unit_name, sensor_data->timestamp);
  221. break;
  222. case RT_SENSOR_CLASS_STEP:
  223. LOG_I("num:%d, step:%f%s, timestamp:%u", num, sensor_data->data.step, unit_name, sensor_data->timestamp);
  224. break;
  225. case RT_SENSOR_CLASS_FORCE:
  226. LOG_I("num:%d, force:%f%s, timestamp:%u", num, sensor_data->data.force, unit_name, sensor_data->timestamp);
  227. break;
  228. case RT_SENSOR_CLASS_DUST:
  229. LOG_I("num:%d, dust:%f%s, timestamp:%u", num, sensor_data->data.dust, unit_name, sensor_data->timestamp);
  230. break;
  231. case RT_SENSOR_CLASS_ECO2:
  232. LOG_I("num:%d, eco2:%f%s, timestamp:%u", num, sensor_data->data.eco2, unit_name, sensor_data->timestamp);
  233. break;
  234. case RT_SENSOR_CLASS_IAQ:
  235. LOG_I("num:%d, IAQ:%f%s, timestamp:%u", num, sensor_data->data.iaq, unit_name, sensor_data->timestamp);
  236. break;
  237. case RT_SENSOR_CLASS_ETOH:
  238. LOG_I("num:%d, EtOH:%f%s, timestamp:%u", num, sensor_data->data.etoh, unit_name, sensor_data->timestamp);
  239. break;
  240. case RT_SENSOR_CLASS_BP:
  241. 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);
  242. break;
  243. case RT_SENSOR_CLASS_NONE:
  244. default:
  245. LOG_E("Unknown type of sensor!");
  246. break;
  247. }
  248. }
  249. static rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
  250. {
  251. rt_sem_release(sensor_rx_sem);
  252. return 0;
  253. }
  254. static void sensor_fifo_rx_entry(void *parameter)
  255. {
  256. rt_device_t dev = (rt_device_t)parameter;
  257. rt_sensor_t sensor = (rt_sensor_t)parameter;
  258. struct rt_sensor_data *data = RT_NULL;
  259. struct rt_sensor_info info;
  260. rt_size_t res, i;
  261. rt_device_control(dev, RT_SENSOR_CTRL_GET_INFO, &info);
  262. data = (struct rt_sensor_data *)rt_malloc(sizeof(struct rt_sensor_data) * info.fifo_max);
  263. if (data == RT_NULL)
  264. {
  265. LOG_E("Memory allocation failed!");
  266. }
  267. while (1)
  268. {
  269. rt_sem_take(sensor_rx_sem, RT_WAITING_FOREVER);
  270. res = rt_device_read(dev, 0, data, info.fifo_max);
  271. for (i = 0; i < res; i++)
  272. {
  273. sensor_show_data(i, sensor, &data[i]);
  274. }
  275. }
  276. }
  277. static void sensor_fifo(int argc, char **argv)
  278. {
  279. static rt_thread_t tid1 = RT_NULL;
  280. rt_device_t dev = RT_NULL;
  281. rt_sensor_t sensor;
  282. dev = rt_device_find(argv[1]);
  283. if (dev == RT_NULL)
  284. {
  285. LOG_E("Can't find device:%s", argv[1]);
  286. return;
  287. }
  288. sensor = (rt_sensor_t)dev;
  289. if (rt_device_open(dev, RT_DEVICE_FLAG_FIFO_RX) != RT_EOK)
  290. {
  291. LOG_E("open device failed!");
  292. return;
  293. }
  294. if (sensor_rx_sem == RT_NULL)
  295. {
  296. sensor_rx_sem = rt_sem_create("sen_rx_sem", 0, RT_IPC_FLAG_FIFO);
  297. }
  298. else
  299. {
  300. LOG_E("The thread is running, please reboot and try again");
  301. return;
  302. }
  303. tid1 = rt_thread_create("sen_rx_thread",
  304. sensor_fifo_rx_entry, sensor,
  305. 1024,
  306. 15, 5);
  307. if (tid1 != RT_NULL)
  308. rt_thread_startup(tid1);
  309. rt_device_set_rx_indicate(dev, rx_callback);
  310. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
  311. }
  312. #ifdef RT_USING_FINSH
  313. MSH_CMD_EXPORT(sensor_fifo, Sensor fifo mode test function);
  314. #endif
  315. static void sensor_irq_rx_entry(void *parameter)
  316. {
  317. rt_device_t dev = (rt_device_t)parameter;
  318. rt_sensor_t sensor = (rt_sensor_t)parameter;
  319. struct rt_sensor_data data;
  320. rt_size_t res, i = 0;
  321. while (1)
  322. {
  323. rt_sem_take(sensor_rx_sem, RT_WAITING_FOREVER);
  324. res = rt_device_read(dev, 0, &data, 1);
  325. if (res == 1)
  326. {
  327. sensor_show_data(i++, sensor, &data);
  328. }
  329. }
  330. }
  331. static void sensor_int(int argc, char **argv)
  332. {
  333. static rt_thread_t tid1 = RT_NULL;
  334. rt_device_t dev = RT_NULL;
  335. rt_sensor_t sensor;
  336. dev = rt_device_find(argv[1]);
  337. if (dev == RT_NULL)
  338. {
  339. LOG_E("Can't find device:%s", argv[1]);
  340. return;
  341. }
  342. sensor = (rt_sensor_t)dev;
  343. if (sensor_rx_sem == RT_NULL)
  344. {
  345. sensor_rx_sem = rt_sem_create("sen_rx_sem", 0, RT_IPC_FLAG_FIFO);
  346. }
  347. else
  348. {
  349. LOG_E("The thread is running, please reboot and try again");
  350. return;
  351. }
  352. tid1 = rt_thread_create("sen_rx_thread",
  353. sensor_irq_rx_entry, sensor,
  354. 1024,
  355. 15, 5);
  356. if (tid1 != RT_NULL)
  357. rt_thread_startup(tid1);
  358. rt_device_set_rx_indicate(dev, rx_callback);
  359. if (rt_device_open(dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK)
  360. {
  361. LOG_E("open device failed!");
  362. return;
  363. }
  364. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
  365. }
  366. #ifdef RT_USING_FINSH
  367. MSH_CMD_EXPORT(sensor_int, Sensor interrupt mode test function);
  368. #endif
  369. static void sensor_polling(int argc, char **argv)
  370. {
  371. rt_uint16_t num = 10;
  372. rt_device_t dev = RT_NULL;
  373. rt_sensor_t sensor;
  374. struct rt_sensor_data data;
  375. rt_size_t res, i;
  376. rt_int32_t delay;
  377. rt_err_t result;
  378. dev = rt_device_find(argv[1]);
  379. if (dev == RT_NULL)
  380. {
  381. LOG_E("Can't find device:%s", argv[1]);
  382. return;
  383. }
  384. if (argc > 2)
  385. num = atoi(argv[2]);
  386. sensor = (rt_sensor_t)dev;
  387. delay = sensor->info.period_min > 100 ? sensor->info.period_min : 100;
  388. result = rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);
  389. if (result != RT_EOK)
  390. {
  391. LOG_E("open device failed! error code : %d", result);
  392. return;
  393. }
  394. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);
  395. for (i = 0; i < num; i++)
  396. {
  397. res = rt_device_read(dev, 0, &data, 1);
  398. if (res != 1)
  399. {
  400. LOG_E("read data failed!size is %d", res);
  401. }
  402. else
  403. {
  404. sensor_show_data(i, sensor, &data);
  405. }
  406. rt_thread_mdelay(delay);
  407. }
  408. rt_device_close(dev);
  409. }
  410. #ifdef RT_USING_FINSH
  411. MSH_CMD_EXPORT(sensor_polling, Sensor polling mode test function);
  412. #endif
  413. static void sensor(int argc, char **argv)
  414. {
  415. static rt_device_t dev = RT_NULL;
  416. struct rt_sensor_data data;
  417. rt_sensor_t sensor;
  418. rt_size_t res, i;
  419. rt_int32_t delay;
  420. /* If the number of arguments less than 2 */
  421. if (argc < 2)
  422. {
  423. rt_kprintf("\n");
  424. rt_kprintf("sensor [OPTION] [PARAM]\n");
  425. rt_kprintf(" probe <dev_name> Probe sensor by given name\n");
  426. rt_kprintf(" info Get sensor info\n");
  427. rt_kprintf(" range <var> Set range to var\n");
  428. rt_kprintf(" mode <var> Set work mode to var\n");
  429. rt_kprintf(" power <var> Set power mode to var\n");
  430. rt_kprintf(" rate <var> Set output date rate to var\n");
  431. rt_kprintf(" read [num] Read [num] times sensor (default 5)\n");
  432. return ;
  433. }
  434. else if (!strcmp(argv[1], "info"))
  435. {
  436. struct rt_sensor_info info;
  437. if (dev == RT_NULL)
  438. {
  439. LOG_W("Please probe sensor device first!");
  440. return ;
  441. }
  442. rt_device_control(dev, RT_SENSOR_CTRL_GET_INFO, &info);
  443. rt_kprintf("model :%s\n", info.model);
  444. rt_kprintf("type: :%s\n", sensor_get_type_name(&info));
  445. rt_kprintf("vendor :%s\n", sensor_get_vendor_name(&info));
  446. rt_kprintf("unit :%s\n", sensor_get_unit_name(&info));
  447. rt_kprintf("range_max :%d\n", info.range_max);
  448. rt_kprintf("range_min :%d\n", info.range_min);
  449. rt_kprintf("period_min:%dms\n", info.period_min);
  450. rt_kprintf("fifo_max :%d\n", info.fifo_max);
  451. }
  452. else if (!strcmp(argv[1], "read"))
  453. {
  454. rt_uint16_t num = 5;
  455. if (dev == RT_NULL)
  456. {
  457. LOG_W("Please probe sensor device first!");
  458. return ;
  459. }
  460. if (argc == 3)
  461. {
  462. num = atoi(argv[2]);
  463. }
  464. sensor = (rt_sensor_t)dev;
  465. delay = sensor->info.period_min > 100 ? sensor->info.period_min : 100;
  466. for (i = 0; i < num; i++)
  467. {
  468. res = rt_device_read(dev, 0, &data, 1);
  469. if (res != 1)
  470. {
  471. LOG_E("read data failed!size is %d", res);
  472. }
  473. else
  474. {
  475. sensor_show_data(i, sensor, &data);
  476. }
  477. rt_thread_mdelay(delay);
  478. }
  479. }
  480. else if (argc == 3)
  481. {
  482. if (!strcmp(argv[1], "probe"))
  483. {
  484. rt_uint8_t reg = 0xFF;
  485. rt_device_t new_dev;
  486. new_dev = rt_device_find(argv[2]);
  487. if (new_dev == RT_NULL)
  488. {
  489. LOG_E("Can't find device:%s", argv[2]);
  490. return;
  491. }
  492. if (rt_device_open(new_dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
  493. {
  494. LOG_E("open device failed!");
  495. return;
  496. }
  497. rt_device_control(new_dev, RT_SENSOR_CTRL_GET_ID, &reg);
  498. LOG_I("device id: 0x%x!", reg);
  499. if (dev)
  500. {
  501. rt_device_close(dev);
  502. }
  503. dev = new_dev;
  504. }
  505. else if (dev == RT_NULL)
  506. {
  507. LOG_W("Please probe sensor first!");
  508. return ;
  509. }
  510. else if (!strcmp(argv[1], "range"))
  511. {
  512. rt_device_control(dev, RT_SENSOR_CTRL_SET_RANGE, (void *)atoi(argv[2]));
  513. }
  514. else if (!strcmp(argv[1], "mode"))
  515. {
  516. rt_device_control(dev, RT_SENSOR_CTRL_SET_MODE, (void *)atoi(argv[2]));
  517. }
  518. else if (!strcmp(argv[1], "power"))
  519. {
  520. rt_device_control(dev, RT_SENSOR_CTRL_SET_POWER, (void *)atoi(argv[2]));
  521. }
  522. else if (!strcmp(argv[1], "rate"))
  523. {
  524. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)atoi(argv[2]));
  525. }
  526. else
  527. {
  528. LOG_W("Unknown command, please enter 'sensor' get help information!");
  529. }
  530. }
  531. else
  532. {
  533. LOG_W("Unknown command, please enter 'sensor' get help information!");
  534. }
  535. }
  536. #ifdef RT_USING_FINSH
  537. MSH_CMD_EXPORT(sensor, sensor test function);
  538. #endif