mb.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #include "mb.h"
  2. #include "list.h"
  3. #include "modbus.h"
  4. typedef struct {
  5. mb_inst_t *hinst;
  6. uint8_t type;
  7. uint8_t mode;
  8. uint8_t quit;
  9. rt_thread_t tid;
  10. handle_t rx;
  11. handle_t tx;
  12. }mb_handle_t;
  13. static mb_handle_t mbHandle={0};
  14. typedef void (*thread_fn_t)(void *arg);
  15. static void mb_thread(void *arg)
  16. {
  17. mb_handle_t *h=(mb_handle_t*)arg;
  18. while(h->quit==0) {
  19. if(h->mode==MB_MODE_MASTER) {
  20. }
  21. else {
  22. mb_slave_fsm(h->hinst);
  23. }
  24. }
  25. mb_destory(h->hinst);
  26. h->quit = 2;
  27. }
  28. static void mb_start(mb_handle_t *h, int flag)
  29. {
  30. if(flag) {
  31. h->tid = rt_thread_create(NULL, mb_thread, h, 2048, 5, 20);
  32. if(h->tid==NULL) {
  33. //LOG_E("___ thread create failed\n");
  34. }
  35. h->quit = 0;
  36. rt_thread_startup(h->tid);
  37. }
  38. else {
  39. h->quit = 1;
  40. while(h->quit!=2);
  41. rt_thread_delete(h->tid);
  42. }
  43. }
  44. void* mb_init(char *dev, int type, int mode)
  45. {
  46. list_cfg_t lc={0,LIST_FULL_FIFO,10};
  47. mb_handle_t *h=(mb_handle_t*)rt_malloc(sizeof(mb_handle_t));
  48. if(h) {
  49. h->type = (type==MB_TYPE_RTU)?MB_BACKEND_TYPE_RTU:MB_BACKEND_TYPE_TCP;
  50. h->mode = mode;
  51. mb_backend_param_t param = {
  52. .rtu.dev = "uart2",
  53. .rtu.baudrate = 9600,
  54. .rtu.parity = 0,
  55. .rtu.pin = -1,
  56. .rtu.lvl = 0
  57. };
  58. h->rx = list_init(&lc);
  59. h->tx = list_init(&lc);
  60. h->hinst = mb_create(h->type, &param);
  61. if(h->mode==MB_MODE_MASTER) {
  62. }
  63. else {
  64. }
  65. mb_start(h, 1);
  66. }
  67. return h;
  68. }
  69. int mb_deinit(void *h)
  70. {
  71. mb_handle_t *mh=(mb_handle_t*)h;
  72. if(!mh) {
  73. return -1;
  74. }
  75. mb_start(mh, 0);
  76. list_free(mh->rx);
  77. list_free(mh->tx);
  78. rt_free(mh);
  79. return 0;
  80. }
  81. //
  82. int mb_read(void *h, void *data, int len, int timeout)
  83. {
  84. int r=-1,sz=0;
  85. mb_handle_t *mh=(mb_handle_t*)h;
  86. if(!mh || !data || len<=0) {
  87. return -1;
  88. }
  89. rt_tick_t end = rt_tick_get_millisecond()+timeout;
  90. while(1) {
  91. sz = list_size(mh->rx);
  92. if(sz>0) {
  93. break;
  94. }
  95. rt_thread_mdelay(1);
  96. if(timeout>0 && rt_tick_get_millisecond()>end) {
  97. sz = list_size(mh->rx);
  98. break;
  99. }
  100. }
  101. if(sz>0) {
  102. list_node_t *ln=NULL;
  103. r = list_take_node(mh->rx, &ln, 0);
  104. if(r==0) {
  105. node_t *nd=&ln->data;
  106. if(len>=nd->dlen) {
  107. memcpy(data, nd->buf, nd->dlen);
  108. }
  109. else {
  110. r = -1;
  111. }
  112. list_back_node(mh->rx, ln);
  113. }
  114. }
  115. return r;
  116. }
  117. int mb_write(void *h, void *data, int len)
  118. {
  119. mb_handle_t *mh=(mb_handle_t*)h;
  120. if(!mh) {
  121. return -1;
  122. }
  123. return list_append(mh->tx, 0, data, len);
  124. }