mb.c 6.8 KB

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