mb.c 6.7 KB

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