canapp.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * File : canapp.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2015-05-14 aubrcool@qq.com first version
  13. */
  14. #ifdef RT_USING_CAN
  15. #include <board.h>
  16. #include <rtthread.h>
  17. #include <rtdevice.h>
  18. struct can_app_struct
  19. {
  20. const char* name;
  21. struct rt_event event;
  22. struct rt_can_filter_config * filter;
  23. rt_uint8_t eventopt;
  24. };
  25. static struct can_app_struct can_data[2];
  26. static rt_err_t can1ind(rt_device_t dev, void* args, rt_int32_t hdr, rt_size_t size)
  27. {
  28. rt_event_t pevent = (rt_event_t)args;
  29. rt_event_send(pevent, 1 << (hdr));
  30. return RT_EOK;
  31. }
  32. static rt_err_t can2ind(rt_device_t dev, void* args, rt_int32_t hdr, rt_size_t size)
  33. {
  34. rt_event_t pevent = (rt_event_t)args;
  35. rt_event_send(pevent, 1 << (hdr));
  36. return RT_EOK;
  37. }
  38. struct rt_can_filter_item filter1item[4] =
  39. {
  40. RT_CAN_FILTER_STD_INIT(1,can1ind,&can_data[0].event),
  41. RT_CAN_FILTER_STD_INIT(2,can1ind,&can_data[0].event),
  42. RT_CAN_STD_RMT_FILTER_INIT(3,can1ind,&can_data[0].event),
  43. RT_CAN_STD_RMT_DATA_FILTER_INIT(4,can1ind,&can_data[0].event),
  44. };
  45. struct rt_can_filter_item filter2item[4] =
  46. {
  47. RT_CAN_FILTER_STD_INIT(1,can2ind,&can_data[1].event),
  48. RT_CAN_FILTER_STD_INIT(2,can2ind,&can_data[1].event),
  49. RT_CAN_STD_RMT_FILTER_INIT(3,can2ind,&can_data[1].event),
  50. RT_CAN_STD_RMT_DATA_FILTER_INIT(4,can2ind,&can_data[1].event),
  51. };
  52. struct rt_can_filter_config filter1 =
  53. {
  54. .count = 4,
  55. .actived = 1,
  56. .items = filter1item,
  57. };
  58. struct rt_can_filter_config filter2 =
  59. {
  60. .count = 4,
  61. .actived = 1,
  62. .items = filter2item,
  63. };
  64. static struct can_app_struct can_data[2] = {
  65. {
  66. .name = "bxcan1",
  67. .filter = &filter1,
  68. .eventopt = RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  69. },
  70. {
  71. .name = "bxcan2",
  72. .filter = &filter2,
  73. .eventopt = RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
  74. },
  75. };
  76. void rt_can_thread_entry(void* parameter)
  77. {
  78. struct rt_can_msg msg;
  79. struct can_app_struct* canpara = (struct can_app_struct*) parameter;
  80. rt_device_t candev;
  81. rt_uint32_t e;
  82. candev = rt_device_find(canpara->name);
  83. RT_ASSERT(candev);
  84. rt_event_init(&canpara->event, canpara->name, RT_IPC_FLAG_FIFO);
  85. rt_device_open(candev, (RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX));
  86. rt_device_control(candev,RT_CAN_CMD_SET_FILTER,canpara->filter);
  87. while(1) {
  88. if (
  89. rt_event_recv(&canpara->event,
  90. ((1 << canpara->filter->items[0].hdr) |
  91. (1 << canpara->filter->items[1].hdr) |
  92. (1 << canpara->filter->items[2].hdr) |
  93. (1 << canpara->filter->items[3].hdr)),
  94. canpara->eventopt,
  95. RT_WAITING_FOREVER, &e) != RT_EOK
  96. ) {
  97. continue;
  98. }
  99. if(e & (1 << canpara->filter->items[0].hdr)) {
  100. msg.hdr = canpara->filter->items[0].hdr;
  101. while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
  102. rt_device_write(candev, 0, &msg, sizeof(msg));
  103. }
  104. }
  105. if(e & (1 << canpara->filter->items[1].hdr)) {
  106. msg.hdr = canpara->filter->items[1].hdr;
  107. while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
  108. rt_device_write(candev, 0, &msg, sizeof(msg));
  109. }
  110. }
  111. if(e & (1 << canpara->filter->items[2].hdr)) {
  112. msg.hdr = canpara->filter->items[2].hdr;
  113. while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
  114. rt_device_write(candev, 0, &msg, sizeof(msg));
  115. }
  116. }
  117. if(e & (1 << canpara->filter->items[3].hdr)) {
  118. msg.hdr = canpara->filter->items[3].hdr;
  119. while (rt_device_read(candev, 0, &msg, sizeof(msg)) == sizeof(msg)) {
  120. rt_device_write(candev, 0, &msg, sizeof(msg));
  121. }
  122. }
  123. }
  124. }
  125. int rt_can_app_init(void)
  126. {
  127. rt_thread_t tid;
  128. tid = rt_thread_create("canapp1",
  129. rt_can_thread_entry, &can_data[0],
  130. 512, RT_THREAD_PRIORITY_MAX /3 - 1, 20);
  131. if (tid != RT_NULL) rt_thread_startup(tid);
  132. tid = rt_thread_create("canapp2",
  133. rt_can_thread_entry, &can_data[1],
  134. 512, RT_THREAD_PRIORITY_MAX /3 - 1, 20);
  135. if (tid != RT_NULL) rt_thread_startup(tid);
  136. return 0;
  137. }
  138. INIT_APP_EXPORT(rt_can_app_init);
  139. #endif /*RT_USING_CAN*/