sensor_cmd.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /*
  2. * Copyright (c) 2006-2018, 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. */
  10. #include "sensor.h"
  11. #define DBG_TAG "sensor.cmd"
  12. #define DBG_LVL DBG_INFO
  13. #include <rtdbg.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. static rt_sem_t sensor_rx_sem = RT_NULL;
  17. static void sensor_show_data(rt_size_t num, rt_sensor_t sensor, struct rt_sensor_data *sensor_data)
  18. {
  19. switch (sensor->info.type)
  20. {
  21. case RT_SENSOR_CLASS_ACCE:
  22. LOG_I("num:%3d, x:%5d, y:%5d, z:%5d, timestamp:%5d", num, sensor_data->data.acce.x, sensor_data->data.acce.y, sensor_data->data.acce.z, sensor_data->timestamp);
  23. break;
  24. case RT_SENSOR_CLASS_GYRO:
  25. LOG_I("num:%3d, x:%8d, y:%8d, z:%8d, timestamp:%5d", num, sensor_data->data.gyro.x, sensor_data->data.gyro.y, sensor_data->data.gyro.z, sensor_data->timestamp);
  26. break;
  27. case RT_SENSOR_CLASS_MAG:
  28. LOG_I("num:%3d, x:%5d, y:%5d, z:%5d, timestamp:%5d", num, sensor_data->data.mag.x, sensor_data->data.mag.y, sensor_data->data.mag.z, sensor_data->timestamp);
  29. break;
  30. case RT_SENSOR_CLASS_HUMI:
  31. LOG_I("num:%3d, humi:%3d.%d%%, timestamp:%5d", num, sensor_data->data.humi / 10, sensor_data->data.humi % 10, sensor_data->timestamp);
  32. break;
  33. case RT_SENSOR_CLASS_TEMP:
  34. LOG_I("num:%3d, temp:%3d.%dC, timestamp:%5d", num, sensor_data->data.temp / 10, sensor_data->data.temp % 10, sensor_data->timestamp);
  35. break;
  36. case RT_SENSOR_CLASS_BARO:
  37. LOG_I("num:%3d, press:%5d, timestamp:%5d", num, sensor_data->data.baro, sensor_data->timestamp);
  38. break;
  39. case RT_SENSOR_CLASS_STEP:
  40. LOG_I("num:%3d, step:%5d, timestamp:%5d", num, sensor_data->data.step, sensor_data->timestamp);
  41. break;
  42. case RT_SENSOR_CLASS_PROXIMITY:
  43. LOG_I("num:%3d, distance:%5d, timestamp:%5d", num, sensor_data->data.proximity, sensor_data->timestamp);
  44. break;
  45. default:
  46. break;
  47. }
  48. }
  49. rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
  50. {
  51. rt_sem_release(sensor_rx_sem);
  52. return 0;
  53. }
  54. static void sensor_fifo_rx_entry(void *parameter)
  55. {
  56. rt_device_t dev = parameter;
  57. rt_sensor_t sensor = parameter;
  58. struct rt_sensor_data *data = RT_NULL;
  59. struct rt_sensor_info info;
  60. rt_size_t res, i;
  61. rt_device_control(dev, RT_SENSOR_CTRL_GET_INFO, &info);
  62. data = rt_malloc(sizeof(struct rt_sensor_data) * info.fifo_max);
  63. if (data == RT_NULL)
  64. {
  65. LOG_E("Memory allocation failed!");
  66. }
  67. while (1)
  68. {
  69. rt_sem_take(sensor_rx_sem, RT_WAITING_FOREVER);
  70. res = rt_device_read(dev, 0, data, info.fifo_max);
  71. for (i = 0; i < res; i++)
  72. {
  73. sensor_show_data(i, sensor, &data[i]);
  74. }
  75. }
  76. }
  77. static void sensor_fifo(int argc, char **argv)
  78. {
  79. static rt_thread_t tid1 = RT_NULL;
  80. rt_device_t dev = RT_NULL;
  81. rt_sensor_t sensor;
  82. dev = rt_device_find(argv[1]);
  83. if (dev == RT_NULL)
  84. {
  85. LOG_E("Can't find device:%s", argv[1]);
  86. return;
  87. }
  88. sensor = (rt_sensor_t)dev;
  89. if (rt_device_open(dev, RT_DEVICE_FLAG_FIFO_RX) != RT_EOK)
  90. {
  91. LOG_E("open device failed!");
  92. return;
  93. }
  94. if (sensor_rx_sem == RT_NULL)
  95. {
  96. sensor_rx_sem = rt_sem_create("sen_rx_sem", 0, RT_IPC_FLAG_FIFO);
  97. }
  98. else
  99. {
  100. LOG_E("The thread is running, please reboot and try again");
  101. return;
  102. }
  103. tid1 = rt_thread_create("sen_rx_thread",
  104. sensor_fifo_rx_entry, sensor,
  105. 1024,
  106. 15, 5);
  107. if (tid1 != RT_NULL)
  108. rt_thread_startup(tid1);
  109. rt_device_set_rx_indicate(dev, rx_callback);
  110. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
  111. }
  112. #ifdef FINSH_USING_MSH
  113. MSH_CMD_EXPORT(sensor_fifo, Sensor fifo mode test function);
  114. #endif
  115. static void sensor_irq_rx_entry(void *parameter)
  116. {
  117. rt_device_t dev = parameter;
  118. rt_sensor_t sensor = parameter;
  119. struct rt_sensor_data data;
  120. rt_size_t res, i = 0;
  121. while (1)
  122. {
  123. rt_sem_take(sensor_rx_sem, RT_WAITING_FOREVER);
  124. res = rt_device_read(dev, 0, &data, 1);
  125. if (res == 1)
  126. {
  127. sensor_show_data(i++, sensor, &data);
  128. }
  129. }
  130. }
  131. static void sensor_int(int argc, char **argv)
  132. {
  133. static rt_thread_t tid1 = RT_NULL;
  134. rt_device_t dev = RT_NULL;
  135. rt_sensor_t sensor;
  136. dev = rt_device_find(argv[1]);
  137. if (dev == RT_NULL)
  138. {
  139. LOG_E("Can't find device:%s", argv[1]);
  140. return;
  141. }
  142. sensor = (rt_sensor_t)dev;
  143. if (sensor_rx_sem == RT_NULL)
  144. {
  145. sensor_rx_sem = rt_sem_create("sen_rx_sem", 0, RT_IPC_FLAG_FIFO);
  146. }
  147. else
  148. {
  149. LOG_E("The thread is running, please reboot and try again");
  150. return;
  151. }
  152. tid1 = rt_thread_create("sen_rx_thread",
  153. sensor_irq_rx_entry, sensor,
  154. 1024,
  155. 15, 5);
  156. if (tid1 != RT_NULL)
  157. rt_thread_startup(tid1);
  158. rt_device_set_rx_indicate(dev, rx_callback);
  159. if (rt_device_open(dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK)
  160. {
  161. LOG_E("open device failed!");
  162. return;
  163. }
  164. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)20);
  165. }
  166. #ifdef FINSH_USING_MSH
  167. MSH_CMD_EXPORT(sensor_int, Sensor interrupt mode test function);
  168. #endif
  169. static void sensor_polling(int argc, char **argv)
  170. {
  171. uint16_t num = 10;
  172. rt_device_t dev = RT_NULL;
  173. rt_sensor_t sensor;
  174. struct rt_sensor_data data;
  175. rt_size_t res, i;
  176. dev = rt_device_find(argv[1]);
  177. if (dev == RT_NULL)
  178. {
  179. LOG_E("Can't find device:%s", argv[1]);
  180. return;
  181. }
  182. if (argc > 2)
  183. num = atoi(argv[2]);
  184. sensor = (rt_sensor_t)dev;
  185. if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
  186. {
  187. LOG_E("open device failed!");
  188. return;
  189. }
  190. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);
  191. for (i = 0; i < num; i++)
  192. {
  193. res = rt_device_read(dev, 0, &data, 1);
  194. if (res != 1)
  195. {
  196. LOG_E("read data failed!size is %d", res);
  197. }
  198. else
  199. {
  200. sensor_show_data(i, sensor, &data);
  201. }
  202. rt_thread_mdelay(100);
  203. }
  204. rt_device_close(dev);
  205. }
  206. #ifdef FINSH_USING_MSH
  207. MSH_CMD_EXPORT(sensor_polling, Sensor polling mode test function);
  208. #endif
  209. static void sensor(int argc, char **argv)
  210. {
  211. static rt_device_t dev = RT_NULL;
  212. struct rt_sensor_data data;
  213. rt_size_t res, i;
  214. /* If the number of arguments less than 2 */
  215. if (argc < 2)
  216. {
  217. rt_kprintf("\n");
  218. rt_kprintf("sensor [OPTION] [PARAM]\n");
  219. rt_kprintf(" probe <dev_name> Probe sensor by given name\n");
  220. rt_kprintf(" info Get sensor info\n");
  221. rt_kprintf(" sr <var> Set range to var\n");
  222. rt_kprintf(" sm <var> Set work mode to var\n");
  223. rt_kprintf(" sp <var> Set power mode to var\n");
  224. rt_kprintf(" sodr <var> Set output date rate to var\n");
  225. rt_kprintf(" read [num] Read [num] times sensor\n");
  226. rt_kprintf(" num default 5\n");
  227. return ;
  228. }
  229. else if (!strcmp(argv[1], "info"))
  230. {
  231. struct rt_sensor_info info;
  232. rt_device_control(dev, RT_SENSOR_CTRL_GET_INFO, &info);
  233. rt_kprintf("vendor :%d\n", info.vendor);
  234. rt_kprintf("model :%s\n", info.model);
  235. rt_kprintf("unit :%d\n", info.unit);
  236. rt_kprintf("range_max :%d\n", info.range_max);
  237. rt_kprintf("range_min :%d\n", info.range_min);
  238. rt_kprintf("period_min:%d\n", info.period_min);
  239. rt_kprintf("fifo_max :%d\n", info.fifo_max);
  240. }
  241. else if (!strcmp(argv[1], "read"))
  242. {
  243. uint16_t num = 5;
  244. if (dev == RT_NULL)
  245. {
  246. LOG_W("Please probe sensor device first!");
  247. return ;
  248. }
  249. if (argc == 3)
  250. {
  251. num = atoi(argv[2]);
  252. }
  253. for (i = 0; i < num; i++)
  254. {
  255. res = rt_device_read(dev, 0, &data, 1);
  256. if (res != 1)
  257. {
  258. LOG_E("read data failed!size is %d", res);
  259. }
  260. else
  261. {
  262. sensor_show_data(i, (rt_sensor_t)dev, &data);
  263. }
  264. rt_thread_mdelay(100);
  265. }
  266. }
  267. else if (argc == 3)
  268. {
  269. if (!strcmp(argv[1], "probe"))
  270. {
  271. rt_uint8_t reg = 0xFF;
  272. if (dev)
  273. {
  274. rt_device_close(dev);
  275. }
  276. dev = rt_device_find(argv[2]);
  277. if (dev == RT_NULL)
  278. {
  279. LOG_E("Can't find device:%s", argv[1]);
  280. return;
  281. }
  282. if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
  283. {
  284. LOG_E("open device failed!");
  285. return;
  286. }
  287. rt_device_control(dev, RT_SENSOR_CTRL_GET_ID, &reg);
  288. LOG_I("device id: 0x%x!", reg);
  289. }
  290. else if (dev == RT_NULL)
  291. {
  292. LOG_W("Please probe sensor first!");
  293. return ;
  294. }
  295. else if (!strcmp(argv[1], "sr"))
  296. {
  297. rt_device_control(dev, RT_SENSOR_CTRL_SET_RANGE, (void *)atoi(argv[2]));
  298. }
  299. else if (!strcmp(argv[1], "sm"))
  300. {
  301. rt_device_control(dev, RT_SENSOR_CTRL_SET_MODE, (void *)atoi(argv[2]));
  302. }
  303. else if (!strcmp(argv[1], "sp"))
  304. {
  305. rt_device_control(dev, RT_SENSOR_CTRL_SET_POWER, (void *)atoi(argv[2]));
  306. }
  307. else if (!strcmp(argv[1], "sodr"))
  308. {
  309. rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)atoi(argv[2]));
  310. }
  311. else
  312. {
  313. LOG_W("Unknown command, please enter 'sensor' get help information!");
  314. }
  315. }
  316. else
  317. {
  318. LOG_W("Unknown command, please enter 'sensor' get help information!");
  319. }
  320. }
  321. #ifdef FINSH_USING_MSH
  322. MSH_CMD_EXPORT(sensor, sensor test function);
  323. #endif