kobuki_serial.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. * 2021-05-28 hw630 the first version
  9. */
  10. #include "kobuki_serial.h"
  11. #define DBG_SECTION_NAME "kobuki_serial"
  12. #define DBG_LEVEL DBG_LOG
  13. #include <rtdbg.h>
  14. static struct rt_semaphore rx_sem;
  15. static rt_device_t kobuki_serial;
  16. static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
  17. {
  18. rt_sem_release(&rx_sem);
  19. return RT_EOK;
  20. }
  21. int kobuki_serial_init()
  22. {
  23. kobuki_serial = rt_device_find(KOBUKI_SERIAL_NAME);
  24. if (!kobuki_serial)
  25. {
  26. LOG_E("Failed to open device %s", KOBUKI_SERIAL_NAME);
  27. return -1;
  28. }
  29. rt_sem_init(&rx_sem, "kobuki_rx_sem", 0, RT_IPC_FLAG_FIFO);
  30. rt_device_open(kobuki_serial, RT_DEVICE_FLAG_INT_RX);
  31. rt_device_set_rx_indicate(kobuki_serial, uart_input);
  32. return 0;
  33. }
  34. char kobuki_serial_read(char* ch)
  35. {
  36. int tick = kobuki_get_tick();
  37. while (rt_device_read(kobuki_serial, -1, ch, 1) != 1)
  38. {
  39. rt_sem_take(&rx_sem, KOBUKI_SERIAL_TIMEOUT / 5);
  40. if( (kobuki_get_tick() - tick) > KOBUKI_SERIAL_TIMEOUT)
  41. {
  42. return 0;
  43. }
  44. }
  45. return 1;
  46. }
  47. int kobuki_serial_write_char(uint8_t ch)
  48. {
  49. return rt_device_write(kobuki_serial, 0, &ch, 1);
  50. }
  51. int kobuki_serial_write(uint8_t* dat, int len)
  52. {
  53. return rt_device_write(kobuki_serial, 0, dat, len);
  54. }
  55. void kobuki_serial_close()
  56. {
  57. rt_device_close(kobuki_serial);
  58. rt_sem_detach(&rx_sem);
  59. }
  60. uint32_t kobuki_get_tick()
  61. {
  62. return rt_tick_get();
  63. }