tfmini.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * @Descripttion:
  3. * @version:
  4. * @Author: Joe
  5. * @Date: 2021-11-30 10:59:13
  6. * @LastEditors: Joe
  7. * @LastEditTime: 2021-11-30 17:49:20
  8. */
  9. #include "tfmini.h"
  10. #include "env.h"
  11. #define DBG_TAG "tfmini"
  12. #define DBG_LVL DBG_INFO
  13. #include <rtdbg.h>
  14. // 操作S.ObsStatus
  15. /* 设备名称 */
  16. #define DEV_NAME "can2"
  17. #define rx_size 50
  18. #define CAN2_RX_THREAD_PRIORITY 6
  19. #define TFMINI_RORWARD_ID 0X11
  20. #define TFMINI_RIGHT_ID 0x12
  21. #define TFMINI_BACK_ID 0x13
  22. #define TFMINI_LEFT_ID 0x14
  23. /* 定义设备控制块 */
  24. static rt_device_t dev; /* CAN 设备句柄 */
  25. static rt_thread_t can2_rx_thread = RT_NULL; //解析
  26. static rt_sem_t sem = RT_NULL;
  27. /*CAN相关*/
  28. typedef struct
  29. {
  30. rt_uint16_t rxcnt; //接收数
  31. rt_uint16_t delcnt; //处理数
  32. }RXDATA_TypeDef;
  33. static RXDATA_TypeDef rx = {0};
  34. static struct rt_can_msg rx_msg[rx_size];
  35. static TFMINI_TypeDef tfmini_for;
  36. static TFMINI_TypeDef tfmini_back;
  37. static TFMINI_TypeDef tfmini_left;
  38. static TFMINI_TypeDef tfmini_right;
  39. static uint16_t flag = 0;
  40. TFMINI_TypeDef get_tfmini_for(void)
  41. {
  42. return tfmini_for;
  43. }
  44. TFMINI_TypeDef get_tfmini_back(void)
  45. {
  46. return tfmini_back;
  47. }
  48. TFMINI_TypeDef get_tfmini_left(void)
  49. {
  50. return tfmini_left;
  51. }
  52. TFMINI_TypeDef get_tfmini_right(void)
  53. {
  54. return tfmini_right;
  55. }
  56. void dist_parse(TFMINI_TypeDef *tfmini,struct rt_can_msg msg)
  57. {
  58. tfmini->dist = (msg.data[1]<<8) + msg.data[0]; /* 距离 */
  59. tfmini->strength = (msg.data[3]<<8) + msg.data[2]; /* 信号 */
  60. if((tfmini->strength >100) && (tfmini->strength <65533)) //正常,不正常的值不取
  61. {
  62. if((tfmini->dist < Cfg.reduce_dist) && (tfmini->dist > Cfg.stop_dist+5))
  63. {
  64. tfmini->reduce_cnt++;
  65. if(tfmini->reduce_cnt > 3)
  66. {
  67. /* 减速 */
  68. S.ObsStatus = OBS_STATUS_FAR;
  69. }
  70. }
  71. else
  72. {
  73. tfmini->reduce_cnt = 0;
  74. if(tfmini->dist < Cfg.stop_dist)
  75. {
  76. tfmini->stop_cnt++;
  77. if(tfmini->stop_cnt > 3)
  78. {
  79. /* 停止 */
  80. S.ObsStatus = OBS_STATUS_NEAR;
  81. }
  82. }
  83. else
  84. {
  85. tfmini->stop_cnt = 0;
  86. }
  87. }
  88. }
  89. }
  90. uint8_t tfmini_parse(struct rt_can_msg msg)
  91. {
  92. uint8_t temp = 1;
  93. if(msg.ide!=RT_CAN_STDID)
  94. return temp;
  95. switch (msg.id)
  96. {
  97. case TFMINI_RORWARD_ID : /* 前 */
  98. dist_parse(&tfmini_for,msg);
  99. break;
  100. case TFMINI_RIGHT_ID: /* 右 */
  101. dist_parse(&tfmini_right,msg);
  102. break;
  103. case TFMINI_BACK_ID: /* 后 */
  104. dist_parse(&tfmini_back,msg);
  105. break;
  106. case TFMINI_LEFT_ID: /* 左 */
  107. dist_parse(&tfmini_left,msg);
  108. break;
  109. default:
  110. break;
  111. }
  112. //数据解析
  113. return temp;
  114. }
  115. /* 接收数据回调函数 */
  116. static rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
  117. {
  118. /* 从 CAN 读取一帧数据 */
  119. rt_device_read(dev, 0, &rx_msg[rx.rxcnt], sizeof(rx_msg[rx.rxcnt]));
  120. rx.rxcnt++;
  121. if(rx.rxcnt >= rx_size)
  122. {
  123. rx.rxcnt = 0;
  124. }
  125. /* CAN 接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
  126. rt_sem_release(sem);
  127. return RT_EOK;
  128. }
  129. /* 线程入口 */
  130. static void can2_rx_thread_entry(void* parameter)
  131. {
  132. while(1)
  133. {
  134. rt_sem_take(sem,RT_WAITING_FOREVER);
  135. if(rx.delcnt!=rx.rxcnt) //有新数据
  136. {
  137. tfmini_parse(rx_msg[rx.delcnt]); //协议解析
  138. rx.delcnt++; //下一条
  139. if(rx.delcnt>=rx_size)
  140. {
  141. rx.delcnt = 0;
  142. }
  143. }
  144. }
  145. }
  146. static void tfminix_param_init(TFMINI_TypeDef *tfmini)
  147. {
  148. tfmini->dist = 0;
  149. tfmini->stop_cnt = 0;
  150. tfmini->reduce_cnt = 0;
  151. tfmini->strength = 0;
  152. }
  153. static void tfmini_param_init(void)
  154. {
  155. tfminix_param_init(&tfmini_for);
  156. tfminix_param_init(&tfmini_right);
  157. tfminix_param_init(&tfmini_back);
  158. tfminix_param_init(&tfmini_left);
  159. }
  160. /****************************************
  161. * can_config
  162. *函数功能 : 配置初始化
  163. *参数描述 : 无
  164. *返回值 : 无
  165. ****************************************/
  166. static void can2_config(void)
  167. {
  168. /* step1:查找CAN设备 */
  169. dev = rt_device_find(DEV_NAME); //查找CAN口设备
  170. if (dev)
  171. {
  172. LOG_I("find %s OK", DEV_NAME);
  173. }
  174. else
  175. {
  176. LOG_E("find %s failed!", DEV_NAME);
  177. }
  178. /* step2:打开CAN口设备。以中断接收及发送模式打开CAN设备 */
  179. rt_device_open(dev, RT_DEVICE_FLAG_INT_TX | RT_DEVICE_FLAG_INT_RX);
  180. /*step3:设置 CAN 通信的波特率为 500kbit/s*/
  181. rt_device_control(dev, RT_CAN_CMD_SET_BAUD, (void *)CAN500kBaud);
  182. /* step4:设置接收回调函数 */
  183. rt_device_set_rx_indicate(dev, rx_callback);
  184. /* step5:设置硬件过滤表 */
  185. #ifdef RT_CAN_USING_HDR
  186. struct rt_can_filter_item items[5] =
  187. {
  188. RT_CAN_FILTER_ITEM_INIT(0x100, 0, 0, 1, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x100~0x1ff,hdr 为 - 1,设置默认过滤表 */
  189. RT_CAN_FILTER_ITEM_INIT(0x300, 0, 0, 1, 0x700, RT_NULL, RT_NULL), /* std,match ID:0x300~0x3ff,hdr 为 - 1 */
  190. RT_CAN_FILTER_ITEM_INIT(0x211, 0, 0, 1, 0x7ff, RT_NULL, RT_NULL), /* std,match ID:0x211,hdr 为 - 1 */
  191. RT_CAN_FILTER_STD_INIT(0x486, RT_NULL, RT_NULL), /* std,match ID:0x486,hdr 为 - 1 */
  192. {0x555, 0, 0, 1, 0x7ff, 7,} /* std,match ID:0x555,hdr 为 7,指定设置 7 号过滤表 */
  193. };
  194. struct rt_can_filter_config cfg = {5, 1, items}; /* 一共有 5 个过滤表 */
  195. /* 设置硬件过滤表 */
  196. rt_device_control(can_dev, RT_CAN_CMD_SET_FILTER, &cfg);
  197. #endif
  198. }
  199. /****************************************
  200. * tfmini_init
  201. *函数功能 : 配置初始化
  202. *参数描述 : 无
  203. *返回值 : 无
  204. ****************************************/
  205. int tfmini_init(void)
  206. {
  207. tfmini_param_init();
  208. can2_config();//配置初始化
  209. //创建信号量
  210. sem = rt_sem_create("sem",/* 计数信号量名字 */
  211. 0, /* 信号量初始值,默认有一个信号量 */
  212. RT_IPC_FLAG_FIFO); /* 信号量模式 FIFO(0x00)*/
  213. can2_rx_thread = /* 线程控制块指针 */
  214. rt_thread_create( "can2_rx_thread", /* 线程名字 */
  215. can2_rx_thread_entry, /* 线程入口函数 */
  216. RT_NULL, /* 线程入口函数参数 */
  217. 2048, /* 线程栈大小 */
  218. CAN2_RX_THREAD_PRIORITY, /* 线程的优先级 */
  219. 20); /* 线程时间片 */
  220. /* 启动线程,开启调度 */
  221. if (can2_rx_thread != RT_NULL)
  222. {
  223. rt_thread_startup(can2_rx_thread);
  224. LOG_I("can2_rx_thread create.");
  225. }
  226. return RT_EOK;
  227. }
  228. INIT_APP_EXPORT(tfmini_init);