mb.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #include "mb.h"
  2. #include "lock.h"
  3. #include "list.h"
  4. #define MALLOC malloc
  5. #define FREE free
  6. typedef void (*thread_fn_t)(void *arg);
  7. typedef struct {
  8. uint8_t type;
  9. uint8_t mode;
  10. mb_inst_t *hinst;
  11. lock_t lck;
  12. }mb_inf_t;
  13. typedef struct {
  14. rt_thread_t tid;
  15. uint8_t quit;
  16. mb_inf_t inf[MB_ID_MAX];
  17. }mb_handle_t;
  18. static mb_handle_t mbHandle={0};
  19. static int mb_stop(mb_handle_t *h);
  20. static mb_para_t mb_paras[MB_ID_MAX]={
  21. { //MB_ID_POWER
  22. .mode = MB_MODE_MASTER,
  23. .type = MB_TYPE_RTU,
  24. .para = {
  25. .rtu = {
  26. .dev = POWER_PORT, //端口
  27. .baudrate = 115200, //波特率
  28. .parity = 0, //校验位
  29. .pin = -1, //收发控制引脚, <0 表示不使用
  30. .lvl = 0, //发送控制电平
  31. }
  32. }
  33. },
  34. { //MB_ID_SENSOR
  35. .mode = MB_MODE_MASTER,
  36. .type = MB_TYPE_RTU,
  37. .para = {
  38. .rtu = {
  39. .dev = SENSOR_PORT, //端口
  40. .baudrate = 115200, //波特率
  41. .parity = 0, //校验位
  42. .pin = -1, //收发控制引脚, <0 表示不使用
  43. .lvl = 0, //发送控制电平
  44. }
  45. }
  46. },
  47. { //MB_ID_CASCADE
  48. .mode = MB_MODE_SLAVE,
  49. .type = MB_TYPE_RTU,
  50. .para = {
  51. .rtu = {
  52. .dev = CASCADE_PORT, //端口
  53. .baudrate = 115200, //波特率
  54. .parity = 0, //校验位
  55. .pin = -1, //收发控制引脚, <0 表示不使用
  56. .lvl = 0, //发送控制电平
  57. }
  58. }
  59. },
  60. };
  61. int mb_init(void)
  62. {
  63. int i,r;
  64. mb_handle_t *h=&mbHandle;
  65. const char *err[MB_ID_MAX]={"power","sensor","cascade"};
  66. memset(h, 0, sizeof(mb_handle_t));
  67. for(i=0; i<MB_ID_MAX; i++) {
  68. r = mb_setup(i, &mb_paras[i]);
  69. if(r) {
  70. LOGE("___ %s mb setup failed\n", err[i]);
  71. continue;
  72. }
  73. h->inf[i].lck = lock_init();
  74. }
  75. return 0;
  76. }
  77. int mb_setup(int id, mb_para_t *para)
  78. {
  79. int r;
  80. mb_inf_t *pinf=NULL;
  81. mb_backend_param_t param={0};
  82. mb_handle_t *h=&mbHandle;
  83. if(id<0 || id>=MB_ID_MAX || !para) {
  84. return -1;
  85. }
  86. pinf = &h->inf[id];
  87. lock_on(pinf->lck);
  88. pinf->type = para->type;
  89. pinf->mode = para->mode;
  90. if(pinf->type==MB_TYPE_RTU) {
  91. if(pinf->hinst) {
  92. mb_disconn(pinf->hinst);
  93. }
  94. param.rtu = para->para.rtu;
  95. pinf->hinst = mb_create(pinf->type, &param);
  96. if(!pinf->hinst) {
  97. return -1;
  98. }
  99. r = mb_connect(pinf->hinst);
  100. if(r) {
  101. LOGE("___ mb_connect failed\n");
  102. }
  103. }
  104. else if(pinf->type==MB_TYPE_TCP) {
  105. }
  106. else {
  107. r = -1;
  108. }
  109. lock_off(pinf->lck);
  110. return r;
  111. }
  112. int mb_deinit(void)
  113. {
  114. int i;
  115. mb_handle_t *h=&mbHandle;
  116. for(i=0; i<MB_ID_MAX; i++) {
  117. lock_deinit(h->inf[i].lck);
  118. mb_disconn(h->inf[i].hinst);
  119. mb_destory(h->inf[i].hinst);
  120. }
  121. return 0;
  122. }
  123. int mb_read(int id, uint8_t addr, uint16_t reg, uint16_t *data, int cnt, int timeout)
  124. {
  125. int r=-1;
  126. mb_inf_t *pinf=NULL;
  127. mb_handle_t *h=&mbHandle;
  128. if(id<0 || id>=MB_ID_MAX || !data || cnt<=0) {
  129. return -1;
  130. }
  131. pinf = &h->inf[id];
  132. #if 0
  133. rt_tick_t end = rt_tick_get_millisecond()+timeout;
  134. while(1) {
  135. sz = list_size(mh->rx);
  136. if(sz>0) {
  137. break;
  138. }
  139. rt_thread_mdelay(1);
  140. if(timeout>0 && rt_tick_get_millisecond()>end) {
  141. sz = list_size(mh->rx);
  142. break;
  143. }
  144. }
  145. if(sz>0) {
  146. list_node_t *ln=NULL;
  147. r = list_take_node(mh->rx, &ln, 0);
  148. if(r==0) {
  149. node_t *nd=&ln->data;
  150. if(len>=nd->dlen) {
  151. memcpy(data, nd->buf, nd->dlen);
  152. }
  153. else {
  154. r = -1;
  155. }
  156. list_back_node(mh->rx, ln);
  157. }
  158. }
  159. #else
  160. lock_on(pinf->lck);
  161. mb_set_tmo(pinf->hinst, timeout, 50);
  162. mb_set_slave(pinf->hinst, addr);
  163. r = mb_read_regs(pinf->hinst, reg, cnt, data);
  164. lock_off(pinf->lck);
  165. #endif
  166. return r;
  167. }
  168. int mb_write(int id, uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
  169. {
  170. int r=-1;
  171. mb_inf_t *pinf=NULL;
  172. mb_handle_t *h=&mbHandle;
  173. if(id<0 || id>=MB_ID_MAX || !data || cnt<=0) {
  174. return -1;
  175. }
  176. pinf = &h->inf[id];
  177. #if 0
  178. r = list_append(mh->tx, 0, data, len);
  179. #else
  180. lock_on(pinf->lck);
  181. mb_set_slave(pinf->hinst, addr);
  182. r = mb_write_regs(pinf->hinst, reg, cnt, data);
  183. lock_off(pinf->lck);
  184. #endif
  185. return r;
  186. }
  187. int mb_set_addr(int id, uint8_t addr)
  188. {
  189. mb_inf_t *pinf=NULL;
  190. mb_handle_t *h=&mbHandle;
  191. if(id<0 || id>=MB_ID_MAX) {
  192. return -1;
  193. }
  194. pinf = &h->inf[id];
  195. lock_on(pinf->lck);
  196. mb_set_slave(pinf->hinst,addr);
  197. lock_off(pinf->lck);
  198. return 0;
  199. }
  200. int mb_set_cb(int id, const mb_cb_table_t *tab)
  201. {
  202. mb_inf_t *pinf=NULL;
  203. mb_handle_t *h=&mbHandle;
  204. if(id<0 || id>=MB_ID_MAX) {
  205. return -1;
  206. }
  207. pinf = &h->inf[id];
  208. lock_on(pinf->lck);
  209. mb_set_cb_table(pinf->hinst, tab);
  210. lock_off(pinf->lck);
  211. return 0;
  212. }
  213. int mb_set_cascade_cb(int id, mb_cascade_fun_t *fn)
  214. {
  215. mb_inf_t *pinf=NULL;
  216. mb_handle_t *h=&mbHandle;
  217. if(id<0 || id>=MB_ID_MAX) {
  218. return -1;
  219. }
  220. pinf = &h->inf[id];
  221. lock_on(pinf->lck);
  222. mb_set_cb_cascade(pinf->hinst, fn);
  223. lock_off(pinf->lck);
  224. return 0;
  225. }
  226. int mb_slave_poll(int id)
  227. {
  228. mb_inf_t *pinf=NULL;
  229. mb_handle_t *h=&mbHandle;
  230. if(id<0 || id>=MB_ID_MAX) {
  231. return -1;
  232. }
  233. pinf = &h->inf[id];
  234. lock_on(pinf->lck);
  235. mb_slave_fsm(pinf->hinst);
  236. lock_off(pinf->lck);
  237. return 0;
  238. }