chan.c 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101
  1. #include "chan.h"
  2. #include "log.h"
  3. #include "mb.h"
  4. #include "mbctx.h"
  5. #include "plt.h"
  6. #include "port.h"
  7. #define EXPORT_PATH "/sys/class/gpio/export" // export文件路径
  8. #define UNEXPORT_PATH "/sys/class/gpio/unexport" // unexport文件路径
  9. #define DIR_OUT "out"
  10. #define DIR_IN "in"
  11. #define SA struct sockaddr
  12. /*
  13. #define _FC_READ_COILS 0x01
  14. #define _FC_READ_DISCRETE_INPUTS 0x02
  15. #define _FC_READ_HOLDING_REGISTERS 0x03
  16. #define _FC_READ_INPUT_REGISTERS 0x04
  17. #define _FC_WRITE_SINGLE_COIL 0x05
  18. #define _FC_WRITE_SINGLE_REGISTER 0x06
  19. #define _FC_READ_EXCEPTION_STATUS 0x07
  20. #define _FC_WRITE_MULTIPLE_COILS 0x0F
  21. #define _FC_WRITE_MULTIPLE_REGISTERS 0x10
  22. #define _FC_REPORT_SLAVE_ID 0x11
  23. #define _FC_WRITE_AND_READ_REGISTERS 0x17
  24. */
  25. int channbr;
  26. struct chan_t chan[CHAN_NBR_MAX + 1];
  27. static struct chanthrd_param_t chanthrd_param[CHAN_NBR_MAX + 1];
  28. void chan_lock(int idx)
  29. {
  30. pthread_mutex_lock(&chan[idx].mutex);
  31. }
  32. void chan_unlock(int idx)
  33. {
  34. pthread_mutex_unlock(&chan[idx].mutex);
  35. }
  36. static void chan_dump(char *buf_dst, unsigned char *buf_src, int len)
  37. {
  38. char buf_t[16];
  39. int i;
  40. buf_dst[0] = 0;
  41. for (i = 0; i < len; i++)
  42. {
  43. sprintf(buf_t, "%02X ", buf_src[i]);
  44. strcat(buf_dst, buf_t);
  45. }
  46. }
  47. static int chan_set_baud(int fd, int speed)
  48. {
  49. int i;
  50. int status;
  51. struct termios Opt;
  52. int speed_arr[] = {B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200};
  53. int name_arr[] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200};
  54. tcgetattr(fd, &Opt);
  55. for (i = 0; i < sizeof(speed_arr) / sizeof(int); i++)
  56. {
  57. if (speed == name_arr[i])
  58. {
  59. tcflush(fd, TCIOFLUSH);
  60. cfsetispeed(&Opt, speed_arr[i]);
  61. cfsetospeed(&Opt, speed_arr[i]);
  62. status = tcsetattr(fd, TCSANOW, &Opt);
  63. if (status != 0)
  64. {
  65. perror("tcsetattr fail\n");
  66. return -1;
  67. }
  68. else
  69. {
  70. return 0;
  71. }
  72. }
  73. tcflush(fd, TCIOFLUSH);
  74. }
  75. return -1;
  76. }
  77. static int chan_set_parity(int fd, int databits, int stopbits, int parity)
  78. {
  79. struct termios options;
  80. if (tcgetattr(fd, &options) != 0)
  81. {
  82. perror("SetupSerial 1");
  83. return -1;
  84. }
  85. options.c_cflag &= ~CSIZE;
  86. switch (databits)
  87. {
  88. case 7:
  89. options.c_cflag |= CS7;
  90. break;
  91. case 8:
  92. options.c_cflag |= CS8;
  93. break;
  94. default:
  95. fprintf(stderr, "Unsupported data size\n");
  96. return -1;
  97. }
  98. switch (parity)
  99. {
  100. case 'n':
  101. case 'N':
  102. options.c_cflag &= ~PARENB;
  103. options.c_iflag &= ~INPCK;
  104. break;
  105. case 'o':
  106. case 'O':
  107. options.c_cflag |= (PARODD | PARENB);
  108. options.c_iflag |= INPCK;
  109. break;
  110. case 'e':
  111. case 'E':
  112. options.c_cflag |= PARENB;
  113. options.c_cflag &= ~PARODD;
  114. options.c_iflag |= INPCK;
  115. break;
  116. case 'S':
  117. case 's':
  118. options.c_cflag &= ~PARENB;
  119. options.c_cflag &= ~CSTOPB;
  120. break;
  121. default:
  122. fprintf(stderr, "Unsupported parity\n");
  123. return -1;
  124. }
  125. switch (stopbits)
  126. {
  127. case 1:
  128. options.c_cflag &= ~CSTOPB;
  129. break;
  130. case 2:
  131. options.c_cflag |= CSTOPB;
  132. break;
  133. default:
  134. fprintf(stderr, "Unsupported stop bits\n");
  135. return -1;
  136. }
  137. options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
  138. options.c_oflag &= ~OPOST;
  139. options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
  140. /* Set input parity option */
  141. if (parity != 'n')
  142. options.c_iflag |= INPCK;
  143. options.c_cc[VTIME] = 150; // 15 seconds
  144. options.c_cc[VMIN] = 0;
  145. tcflush(fd, TCIFLUSH); /* Update the options and do it NOW */
  146. if (tcsetattr(fd, TCSANOW, &options) != 0)
  147. {
  148. perror("SetupSerial 3");
  149. return -1;
  150. }
  151. return 0;
  152. }
  153. int chan_open_serial(char *dev, int baud, int bits, char parity, int stop)
  154. {
  155. struct termios tty;
  156. int serial_port = open(dev, O_RDWR);
  157. if (serial_port < 0)
  158. {
  159. log_dbg("open dev : %s fail, error:%i %s", dev, errno, strerror(errno));
  160. return -1;
  161. }
  162. // Read in existing settings, and handle any error
  163. if (tcgetattr(serial_port, &tty) != 0)
  164. {
  165. log_dbg("Error %i from tcgetattr: %s\n", errno, strerror(errno));
  166. close(dev);
  167. return -2;
  168. }
  169. switch (parity)
  170. {
  171. case 'O':
  172. case 'o':
  173. tty.c_cflag |= PARENB;
  174. tty.c_iflag |= INPCK;
  175. tty.c_cflag |= PARODD;
  176. break;
  177. case 'E':
  178. case 'e':
  179. tty.c_cflag |= PARENB;
  180. tty.c_iflag |= INPCK;
  181. tty.c_cflag &= ~PARODD;
  182. break;
  183. case 'N':
  184. case 'n':
  185. tty.c_cflag &= ~PARENB; // Clear parity bit, disabling parity (most common)
  186. break;
  187. default:
  188. log_dbg("unsupported parity :%c\n", parity);
  189. close(dev);
  190. return -3;
  191. }
  192. if (stop != 1)
  193. {
  194. log_dbg("unsupported stop bit :%d\n", stop);
  195. close(dev);
  196. return -4;
  197. }
  198. else
  199. {
  200. tty.c_cflag &= ~CSTOPB; // Clear stop field, only one stop bit used in communication (most common)
  201. }
  202. switch (bits)
  203. {
  204. case 7:
  205. tty.c_cflag &= ~CSIZE; // Clear all bits that set the data size
  206. tty.c_cflag |= CS7; // 8 bits per byte (most common)
  207. break;
  208. case 8:
  209. tty.c_cflag &= ~CSIZE; // Clear all bits that set the data size
  210. tty.c_cflag |= CS8; // 8 bits per byte (most common)
  211. break;
  212. default:
  213. log_dbg("unsupported bit number:%d\n", bits);
  214. close(dev);
  215. return -5;
  216. }
  217. tty.c_cflag &= ~CRTSCTS; // Disable RTS/CTS hardware flow control (most common)
  218. tty.c_cflag |= CREAD | CLOCAL; // Turn on READ & ignore ctrl lines (CLOCAL = 1)
  219. tty.c_lflag &= ~ICANON;
  220. tty.c_lflag &= ~ECHO; // Disable echo
  221. tty.c_lflag &= ~ECHOE; // Disable erasure
  222. tty.c_lflag &= ~ECHONL; // Disable new-line echo
  223. tty.c_lflag &= ~ISIG; // Disable interpretation of INTR, QUIT and SUSP
  224. tty.c_iflag &= ~(IXON | IXOFF | IXANY); // Turn off s/w flow ctrl
  225. tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); // Disable any special handling of received bytes
  226. tty.c_oflag &= ~OPOST; // Prevent special interpretation of output bytes (e.g. newline chars)
  227. tty.c_oflag &= ~ONLCR; // Prevent conversion of newline to carriage return/line feed
  228. // tty.c_oflag &= ~OXTABS; // Prevent conversion of tabs to spaces (NOT PRESENT ON LINUX)
  229. // tty.c_oflag &= ~ONOEOT; // Prevent removal of C-d chars (0x004) in output (NOT PRESENT ON LINUX)
  230. tty.c_cc[VTIME] = 10; // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.
  231. tty.c_cc[VMIN] = 0;
  232. // Set in/out baud rate to be 9600
  233. switch (baud)
  234. {
  235. case 1200:
  236. cfsetispeed(&tty, B1200);
  237. cfsetospeed(&tty, B1200);
  238. break;
  239. case 2400:
  240. cfsetispeed(&tty, B2400);
  241. cfsetospeed(&tty, B2400);
  242. break;
  243. case 4800:
  244. cfsetispeed(&tty, B4800);
  245. cfsetospeed(&tty, B4800);
  246. break;
  247. case 9600:
  248. cfsetispeed(&tty, B9600);
  249. cfsetospeed(&tty, B9600);
  250. break;
  251. case 19200:
  252. cfsetispeed(&tty, B19200);
  253. cfsetospeed(&tty, B19200);
  254. break;
  255. case 115200:
  256. cfsetispeed(&tty, B115200);
  257. cfsetospeed(&tty, B115200);
  258. break;
  259. default:
  260. log_dbg("unsupported baud:%d\n", baud);
  261. close(dev);
  262. return -6;
  263. }
  264. // Save tty settings, also checking for error
  265. if (tcsetattr(serial_port, TCSANOW, &tty) != 0)
  266. {
  267. log_dbg("Error %i from tcsetattr: %s\n", errno, strerror(errno));
  268. close(dev);
  269. return -7;
  270. }
  271. return serial_port;
  272. }
  273. #define PF_CAN 29
  274. #define AF_CAN PF_CAN
  275. #define SIOCSCANBAUDRATE (SIOCDEVPRIVATE + 0)
  276. #define SIOCGCANBAUDRATE (SIOCDEVPRIVATE + 1)
  277. #define SOL_CAN_RAW (SOL_CAN_BASE + CAN_RAW)
  278. #define CAN_RAW_FILTER 1
  279. #define CAN_RAW_RECV_OWN_MSGS 0x4
  280. typedef __u32 can_baudrate_t;
  281. struct ifreq ifr[CHAN_NBR_MAX + 1];
  282. static struct chanthrd_param_t s_chanthrd_param[CHAN_NBR_MAX + 1];
  283. static int chan_dbcb_0(void *para, int ncolumn, char **columnvalue, char *columnname[])
  284. {
  285. int i;
  286. struct dbcbparam_t *pcbparam = (struct dbcbparam_t *)para;
  287. struct chan_t *ch;
  288. pcbparam->nrow++;
  289. log_dbg("%s, ++,row:%d;col:%d", __func__, pcbparam->nrow, ncolumn);
  290. ch = &chan[pcbparam->nrow];
  291. for (i = 0; i < ncolumn; i++)
  292. {
  293. if (strcmp("info", columnname[i]) == 0)
  294. {
  295. strcpy(ch->szinfo, columnvalue[i]);
  296. }
  297. else if (strcmp("dev", columnname[i]) == 0)
  298. {
  299. strcpy(ch->szdev, columnvalue[i]);
  300. }
  301. else if (strcmp("mode", columnname[i]) == 0)
  302. {
  303. strcpy(ch->szmode, columnvalue[i]);
  304. ch->mode = chan_mode_str2nbr(ch->szmode);
  305. }
  306. else if (strcmp("port", columnname[i]) == 0)
  307. {
  308. ch->port = atoi(columnvalue[i]);
  309. }
  310. else if (strcmp("baud", columnname[i]) == 0)
  311. {
  312. ch->baud = atoi(columnvalue[i]);
  313. }
  314. else if (strcmp("parity", columnname[i]) == 0)
  315. {
  316. strcpy(ch->szparity, columnvalue[i]);
  317. }
  318. else if (strcmp("servip", columnname[i]) == 0)
  319. {
  320. strcpy(ch->servip, columnvalue[i]);
  321. }
  322. else if (strcmp("servport", columnname[i]) == 0)
  323. {
  324. ch->servport = atoi(columnvalue[i]);
  325. }
  326. else if (strcmp("restart_times", columnname[i]) == 0)
  327. {
  328. ch->restart_times = atoi(columnvalue[i]);
  329. }
  330. else if (strcmp("retry_times", columnname[i]) == 0)
  331. {
  332. ch->retry_times = atoi(columnvalue[i]);
  333. }
  334. }
  335. pcbparam->ret = 0;
  336. log_dbg("%s, --,ret:%d", __func__, pcbparam->ret);
  337. return 0;
  338. }
  339. static void *chan_socketcan_rxthrd(void *thrdparam)
  340. {
  341. struct chanthrd_param_t *pparam = (struct chanthrd_param_t *)thrdparam;
  342. int i = 0;
  343. int rc = 0;
  344. struct can_frame frame;
  345. int chanidx = pparam->idx;
  346. struct chan_t *ch = &chan[chanidx];
  347. int sock = ch->sockfd;
  348. int is_ext_frm = 0;
  349. unsigned int id = 0;
  350. chan_socketcan_ringbuffer_element_t e;
  351. char tmpbuf[256];
  352. log_dbg("%s, ++, idx:%d", __func__, chanidx);
  353. while (1)
  354. {
  355. // usleep(2000);
  356. memset(&frame, 0, sizeof(struct can_frame));
  357. rc = read(sock, &frame, sizeof(struct can_frame));
  358. if (rc > 0)
  359. {
  360. if (chanidx == 22 && ch->dbg)
  361. {
  362. // log_dbg("%s, read rc:%d, idx:%d, id:%d", __func__, rc, chanidx, frame.can_id);
  363. }
  364. }
  365. if (frame.can_dlc)
  366. {
  367. // log_dbg("%s, read rc:%d, can_dlc:%d", __func__, rc, frame.can_dlc);
  368. if (ch->dbg)
  369. {
  370. is_ext_frm = (frame.can_id & CAN_EFF_FLAG) ? 1 : 0;
  371. if (is_ext_frm)
  372. {
  373. id = frame.can_id & CAN_EFF_MASK;
  374. }
  375. else
  376. {
  377. id = frame.can_id & CAN_SFF_MASK;
  378. }
  379. tmpbuf[0] = 0;
  380. dump(tmpbuf, frame.data, frame.can_dlc);
  381. log_dbg("%s, ID:0x%08X, data:%s", __func__, id, tmpbuf);
  382. }
  383. chan_lock(chanidx);
  384. e.frame = frame;
  385. chan_socketcan_rxrb_queue(chanidx, e);
  386. chan_unlock(chanidx);
  387. }
  388. else
  389. {
  390. usleep(2000);
  391. }
  392. }
  393. return NULL;
  394. }
  395. static void *chan_tcpservcan_rxthrd(void *thrdparam)
  396. {
  397. struct chanthrd_param_t *pparam = (struct chanthrd_param_t *)thrdparam;
  398. int i = 0;
  399. int rc = 0;
  400. struct can_frame frame;
  401. int chanidx = pparam->idx;
  402. struct chan_t *ch = &chan[chanidx];
  403. int sock = ch->sockfd;
  404. int is_ext_frm = 0;
  405. unsigned int id = 0;
  406. chan_tcpservcan_ringbuffer_element_t e;
  407. char tmpbuf[256];
  408. log_dbg("%s, ++, idx:%d", __func__, chanidx);
  409. while (1)
  410. {
  411. memset(&frame, 0, sizeof(struct can_frame));
  412. rc = read(sock, &frame, sizeof(struct can_frame));
  413. if (frame.can_dlc)
  414. {
  415. if (ch->dbg)
  416. {
  417. is_ext_frm = (frame.can_id & CAN_EFF_FLAG) ? 1 : 0;
  418. if (is_ext_frm)
  419. {
  420. id = frame.can_id & CAN_EFF_MASK;
  421. }
  422. else
  423. {
  424. id = frame.can_id & CAN_SFF_MASK;
  425. }
  426. tmpbuf[0] = 0;
  427. dump(tmpbuf, frame.data, frame.can_dlc);
  428. log_dbg("%s, ID:0x%08X, data:%s", __func__, id, tmpbuf);
  429. }
  430. chan_lock(chanidx);
  431. e.frame = frame;
  432. chan_tcpservcan_rxrb_queue(chanidx, e);
  433. chan_unlock(chanidx);
  434. }
  435. }
  436. return NULL;
  437. }
  438. static void *chan_tcpservcan_txthrd(void *thrdparam)
  439. {
  440. struct chanthrd_param_t *pparam = (struct chanthrd_param_t *)thrdparam;
  441. struct can_frame frame;
  442. int chanidx = pparam->idx;
  443. struct chan_t *ch = &chan[chanidx];
  444. int sock = ch->sockfd;
  445. chan_tcpservcan_ringbuffer_element_t e_arr[32];
  446. int n2write;
  447. int ntry2write;
  448. int i;
  449. log_dbg("%s, ++, idx:%d", __func__, chanidx);
  450. while (1)
  451. {
  452. // cnt = 0;
  453. chan_lock(chanidx);
  454. n2write = chan_tcpservcan_txrb_num_items(chanidx);
  455. if (n2write > 0)
  456. {
  457. ntry2write = n2write > (sizeof(e_arr) / sizeof(chan_tcpservcan_ringbuffer_element_t)) ? (sizeof(e_arr) / sizeof(chan_tcpservcan_ringbuffer_element_t)) : n2write;
  458. chan_tcpservcan_txrb_dequeue_arr(chanidx, e_arr, ntry2write);
  459. }
  460. else
  461. {
  462. ntry2write = 0;
  463. }
  464. chan_unlock(chanidx);
  465. if (ntry2write > 0)
  466. {
  467. for (i = 0; i < ntry2write; i++)
  468. {
  469. write(sock, &e_arr[i].frame, sizeof(struct can_frame));
  470. log_dbg("%s, idx:%d, tx %d bytes", __func__, chanidx, sizeof(struct can_frame));
  471. }
  472. }
  473. usleep(3000); /* 3ms */
  474. }
  475. return NULL;
  476. }
  477. static void *chan_socketcan_txthrd(void *thrdparam)
  478. {
  479. struct chanthrd_param_t *pparam = (struct chanthrd_param_t *)thrdparam;
  480. struct can_frame frame;
  481. int chanidx = pparam->idx;
  482. struct chan_t *ch = &chan[chanidx];
  483. int sock = ch->sockfd;
  484. chan_socketcan_ringbuffer_element_t e;
  485. int cnt = 0;
  486. log_dbg("%s, ++, idx:%d", __func__, chanidx);
  487. int nbytes = 0;
  488. while (1)
  489. {
  490. cnt = 3;
  491. chan_lock(chanidx);
  492. if (chan_socketcan_txrb_dequeue(chanidx, &e) != 0)
  493. {
  494. while (cnt--)
  495. {
  496. nbytes = write(sock, &e.frame, sizeof(chan_socketcan_ringbuffer_element_t));
  497. if (nbytes != sizeof(chan_socketcan_ringbuffer_element_t))
  498. {
  499. log_info("%s,write err(%d)", __func__, nbytes);
  500. }
  501. else
  502. {
  503. if (chanidx == 22 && ch->dbg)
  504. {
  505. log_dbg("%s, idx:%d, tx %d bytes, id : %u", __func__, chanidx, nbytes, e.frame.can_id);
  506. }
  507. break;
  508. }
  509. }
  510. }
  511. chan_unlock(chanidx);
  512. usleep(1000);
  513. }
  514. return NULL;
  515. }
  516. static void *chan_serial_rxthrd(void *thrdparam)
  517. {
  518. struct chanthrd_param_t *pparam = (struct chanthrd_param_t *)thrdparam;
  519. int chan_idx = pparam->idx;
  520. struct chan_t *ch = &chan[chan_idx];
  521. int fd = ch->fd;
  522. chan_serial_ringbuffer_element_t e;
  523. int nread;
  524. char buff[128];
  525. char dump_buf[1024];
  526. int i;
  527. log_dbg("%s, ++, idx:%d, serial", __func__, chan_idx);
  528. while (true)
  529. {
  530. if ((nread = read(fd, buff, 100)) > 0)
  531. {
  532. if (ch->dbg > 0)
  533. {
  534. chan_dump(dump_buf, buff, nread);
  535. log_dbg("%s, idx:%d, rx %d bytes:%s", __func__, chan_idx, nread, dump_buf);
  536. }
  537. chan_lock(chan_idx);
  538. for (i = 0; i < nread; i++)
  539. {
  540. e.c = buff[i];
  541. chan_serial_rxrb_queue(chan_idx, e);
  542. }
  543. chan_unlock(chan_idx);
  544. }
  545. usleep(2000); /* 2ms */
  546. }
  547. return NULL;
  548. }
  549. static void *chan_serial_txthrd(void *thrdparam)
  550. {
  551. struct chanthrd_param_t *pparam = (struct chanthrd_param_t *)thrdparam;
  552. int chan_idx = pparam->idx;
  553. struct chan_t *ch = &chan[chan_idx];
  554. int fd = ch->fd;
  555. chan_serial_ringbuffer_element_t e_arr[128];
  556. int towrite;
  557. int needtowrite;
  558. char buff[128];
  559. char dump_buf[1024];
  560. int i;
  561. log_dbg("%s, ++, idx:%d, serial", __func__, chan_idx);
  562. while (true)
  563. {
  564. chan_lock(chan_idx);
  565. needtowrite = chan_serial_txrb_num_items(chan_idx);
  566. if (needtowrite > 0)
  567. {
  568. towrite = needtowrite > sizeof(buff) ? sizeof(buff) : needtowrite;
  569. chan_serial_txrb_dequeue_arr(chan_idx, e_arr, towrite);
  570. }
  571. else
  572. {
  573. towrite = 0;
  574. }
  575. chan_unlock(chan_idx);
  576. if (towrite > 0)
  577. {
  578. for (i = 0; i < towrite; i++)
  579. {
  580. buff[i] = e_arr[i].c;
  581. }
  582. write(fd, buff, towrite);
  583. if (ch->dbg > 0)
  584. {
  585. chan_dump(dump_buf, buff, towrite);
  586. log_dbg("%s, idx:%d, tx %d bytes:%s", __func__, chan_idx, towrite, dump_buf);
  587. }
  588. }
  589. usleep(2000);
  590. }
  591. return NULL;
  592. }
  593. // void chan_set_mbs( int idx, int devm, int devidx )
  594. //{
  595. // chan[idx].mbsdevm = devm;
  596. // chan[idx].mbsdevidx = devidx;
  597. // }
  598. int chan_set_nbr(int nbr)
  599. {
  600. channbr = nbr;
  601. return 0;
  602. }
  603. int chan_get_nbr()
  604. {
  605. return channbr;
  606. }
  607. int chan_init(void)
  608. {
  609. int result = 0;
  610. int ret = 0;
  611. int i = 0;
  612. // int* channbr = &STA.channbr;
  613. struct chan_t *ch;
  614. char *errmsg = NULL;
  615. char sql[1024];
  616. struct dbcbparam_t cbparam;
  617. sqlite3 *db = NULL;
  618. log_dbg("%s, ++", __func__);
  619. plt_lock_ctndb();
  620. db = plt_get_ctndb();
  621. sprintf(sql, "select * from chan");
  622. cbparam.nrow = 0;
  623. result = sqlite3_exec(db, sql, chan_dbcb_0, (void *)&cbparam, &errmsg);
  624. plt_unlock_ctndb();
  625. if (result != SQLITE_OK)
  626. {
  627. ret = -1;
  628. }
  629. else if (cbparam.ret != 0)
  630. {
  631. ret = -2;
  632. }
  633. else
  634. {
  635. chan_set_nbr(cbparam.nrow);
  636. for (i = 1; i <= chan_get_nbr(); i++)
  637. {
  638. ch = &chan[i];
  639. ch->errcnt = 0;
  640. ch->dbg = 0;
  641. ch->ctx = NULL;
  642. ch->started = 0;
  643. pthread_mutex_init(&ch->mutex, NULL);
  644. if (chan_start(i) < 0)
  645. {
  646. log_dbg("%s, chan idx:%d, start fail ", __func__, i);
  647. }
  648. // pthread_mutex_init(&ch->mutexdat, NULL);
  649. // if( chan_start(i) < 0 ){
  650. // }else{
  651. // log_dbg("%s, idx:%d, start ok",__func__,i);
  652. // }
  653. }
  654. }
  655. log_dbg("%s--, ret:%d", __func__, ret);
  656. return ret;
  657. }
  658. // func code:0x06
  659. int chan_write_single_register(int idx, int slaveaddr, int regaddr, int regval)
  660. {
  661. int rc;
  662. int ret = 0;
  663. struct chan_t *ch = &chan[idx];
  664. if (ch->ctx == NULL)
  665. {
  666. ret = -1;
  667. }
  668. else
  669. {
  670. modbus_set_slave(ch->ctx, slaveaddr);
  671. rc = modbus_write_register(ch->ctx, regaddr, regval);
  672. modbus_flush(ch->ctx);
  673. if (rc != 1)
  674. {
  675. ch->errcnt++;
  676. ret = -3;
  677. }
  678. }
  679. // log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, rc:%d, regval:%d",
  680. // __func__,idx,slaveaddr,regaddr,rc,regval);
  681. return ret;
  682. }
  683. // func code:0x06
  684. int chan_write_single_register_with_retry(int idx, int slaveaddr, int regaddr, int regval)
  685. {
  686. int rc;
  687. int ret = -1;
  688. struct chan_t *ch = &chan[idx];
  689. int retry_times = ch->retry_times;
  690. int restart_times = ch->restart_times;
  691. if (ch->ctx == NULL)
  692. {
  693. ret = -2;
  694. }
  695. else
  696. {
  697. while (restart_times-- > 0)
  698. {
  699. while (retry_times-- > 0)
  700. {
  701. if (ch->ctx != NULL)
  702. {
  703. modbus_set_slave(ch->ctx, slaveaddr);
  704. rc = modbus_write_register(ch->ctx, regaddr, regval);
  705. modbus_flush(ch->ctx);
  706. if (rc != 1)
  707. {
  708. ch->errcnt++;
  709. usleep(100000); /* 100ms */
  710. }
  711. else
  712. {
  713. ret = 0; /* ok */
  714. goto leave;
  715. }
  716. }
  717. }
  718. usleep(100000); /* 100ms */
  719. chan_start(idx);
  720. retry_times = ch->retry_times;
  721. }
  722. }
  723. leave:
  724. if (ret < 0)
  725. {
  726. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, rc:%d, regval:%d",
  727. __func__, idx, slaveaddr, regaddr, rc, regval);
  728. }
  729. return ret;
  730. }
  731. // func code:0x10
  732. int chan_write_multi_registers(int idx, int slaveaddr, int regaddr, int nb, unsigned short *regval)
  733. {
  734. int rc;
  735. int ret = 0;
  736. struct chan_t *ch = &chan[idx];
  737. if (ch->ctx == NULL)
  738. {
  739. ret = -1;
  740. }
  741. else
  742. {
  743. modbus_set_slave(ch->ctx, slaveaddr);
  744. rc = modbus_write_registers(ch->ctx, regaddr, nb, regval);
  745. modbus_flush(ch->ctx);
  746. if (rc != nb)
  747. {
  748. ch->errcnt++;
  749. ret = -2;
  750. }
  751. }
  752. if (ch->dbg == 1)
  753. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, rc:%d",
  754. __func__,
  755. idx,
  756. slaveaddr,
  757. regaddr,
  758. nb,
  759. rc);
  760. return ret;
  761. }
  762. // FUNC CODE: 0x02
  763. int chan_read_input_bits(int idx, int slaveaddr, int regaddr, int nb, unsigned char *dest)
  764. {
  765. int rc;
  766. int ret = 0;
  767. struct chan_t *ch = &chan[idx];
  768. if (ch->ctx == NULL)
  769. {
  770. ret = -1;
  771. }
  772. else
  773. {
  774. modbus_set_slave(ch->ctx, slaveaddr);
  775. rc = modbus_read_input_bits(ch->ctx, regaddr, nb, dest);
  776. if (rc != nb)
  777. {
  778. _error_print(ch->ctx, __func__);
  779. ch->errcnt++;
  780. ret = -2;
  781. }
  782. modbus_flush(ch->ctx);
  783. }
  784. if (ret < 0)
  785. {
  786. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, rc:%d",
  787. __func__,
  788. idx,
  789. slaveaddr,
  790. regaddr,
  791. nb,
  792. rc);
  793. }
  794. return rc;
  795. }
  796. int chan_read_input_bits_with_retry(int idx, int slaveaddr, int regaddr, int nb, unsigned char *dest)
  797. {
  798. int rc;
  799. int ret = -1;
  800. struct chan_t *ch = &chan[idx];
  801. int retry_times = ch->retry_times;
  802. int restart_times = ch->restart_times;
  803. while (restart_times-- > 0)
  804. {
  805. while (retry_times-- > 0)
  806. {
  807. if (ch->ctx != NULL)
  808. {
  809. modbus_set_slave(ch->ctx, slaveaddr);
  810. rc = chan_read_input_bits(idx, slaveaddr, regaddr, nb, dest);
  811. modbus_flush(ch->ctx);
  812. if (rc != nb)
  813. {
  814. ch->errcnt++;
  815. usleep(100000); /* 100ms */
  816. }
  817. else
  818. {
  819. ret = 0; /* ok */
  820. goto leave;
  821. }
  822. }
  823. }
  824. usleep(100000); /* 100ms */
  825. chan_start(idx);
  826. retry_times = ch->retry_times;
  827. }
  828. leave:
  829. if (ret < 0)
  830. {
  831. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, fail",
  832. __func__, idx, slaveaddr, regaddr, nb);
  833. }
  834. return ret;
  835. }
  836. // FUNC CODE: 0x04
  837. int chan_read_input_registers(int idx, int slaveaddr, int regaddr, int nb, unsigned short *dest)
  838. {
  839. int rc;
  840. int ret = 0;
  841. struct chan_t *ch = &chan[idx];
  842. if (ch->ctx == NULL)
  843. {
  844. ret = -1;
  845. }
  846. else
  847. {
  848. modbus_set_slave(ch->ctx, slaveaddr);
  849. rc = modbus_read_input_registers(ch->ctx, regaddr, nb, dest);
  850. modbus_flush(ch->ctx);
  851. if (rc != nb)
  852. {
  853. ch->errcnt++;
  854. ret = -2;
  855. }
  856. }
  857. if (ret < 0)
  858. {
  859. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, rc:%d",
  860. __func__,
  861. idx,
  862. slaveaddr,
  863. regaddr,
  864. nb,
  865. rc);
  866. }
  867. return ret;
  868. }
  869. int chan_read_input_registers_with_retry(int idx, int slaveaddr, int regaddr, int nb, unsigned short *regval)
  870. {
  871. int rc;
  872. int ret = -1;
  873. struct chan_t *ch = &chan[idx];
  874. int retry_times = ch->retry_times;
  875. int restart_times = ch->restart_times;
  876. while (restart_times-- > 0)
  877. {
  878. while (retry_times-- > 0)
  879. {
  880. if (ch->ctx != NULL)
  881. {
  882. modbus_set_slave(ch->ctx, slaveaddr);
  883. rc = modbus_read_input_registers(ch->ctx, regaddr, nb, regval);
  884. modbus_flush(ch->ctx);
  885. if (rc != nb)
  886. {
  887. ch->errcnt++;
  888. usleep(100000); /* 100ms */
  889. }
  890. else
  891. {
  892. ret = 0; /* ok */
  893. goto leave;
  894. }
  895. }
  896. }
  897. usleep(100000); /* 100ms */
  898. chan_start(idx);
  899. retry_times = ch->retry_times;
  900. }
  901. leave:
  902. if (ret < 0)
  903. {
  904. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, fail",
  905. __func__, idx, slaveaddr, regaddr, nb);
  906. }
  907. return ret;
  908. }
  909. // func code:0x01
  910. // nb : bits count
  911. int chan_read_bits(int idx, int slaveaddr, int regaddr, int nb, unsigned char *dest)
  912. {
  913. int rc;
  914. int ret = 0;
  915. struct chan_t *ch = &chan[idx];
  916. if (ch->ctx == NULL)
  917. {
  918. ret = -1;
  919. }
  920. else
  921. {
  922. modbus_set_slave(ch->ctx, slaveaddr);
  923. rc = modbus_read_bits(ch->ctx, regaddr, nb, dest);
  924. modbus_flush(ch->ctx);
  925. if (rc != nb)
  926. {
  927. ch->errcnt++;
  928. ret = -2;
  929. }
  930. }
  931. if (ret < 0)
  932. {
  933. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, rc:%d",
  934. __func__,
  935. idx,
  936. slaveaddr,
  937. regaddr,
  938. nb,
  939. rc);
  940. }
  941. return ret;
  942. }
  943. // func code:0x05
  944. // nb : bits count
  945. int chan_write_bit(int idx, int slaveaddr, int addr, int status)
  946. {
  947. int rc;
  948. int ret = 0;
  949. struct chan_t *ch = &chan[idx];
  950. if (ch->ctx == NULL)
  951. {
  952. ret = -1;
  953. }
  954. else
  955. {
  956. modbus_set_slave(ch->ctx, slaveaddr);
  957. rc = modbus_write_bit(ch->ctx, addr, status);
  958. modbus_flush(ch->ctx);
  959. if (rc <= 0)
  960. {
  961. ch->errcnt++;
  962. ret = -2;
  963. }
  964. }
  965. if (ret < 0)
  966. {
  967. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, status:%d, ret:%d",
  968. __func__,
  969. idx,
  970. slaveaddr,
  971. addr,
  972. status,
  973. ret);
  974. }
  975. return ret;
  976. }
  977. int chan_write_bits(int idx, int slaveaddr, int addr, int nb, unsigned char *status)
  978. {
  979. int rc;
  980. int ret = 0;
  981. struct chan_t *ch = &chan[idx];
  982. if (ch->ctx == NULL)
  983. {
  984. ret = -1;
  985. }
  986. else
  987. {
  988. modbus_set_slave(ch->ctx, slaveaddr);
  989. rc = modbus_write_bits(ch->ctx, addr, nb, status);
  990. modbus_flush(ch->ctx);
  991. if (rc <= 0)
  992. {
  993. ch->errcnt++;
  994. ret = -2;
  995. }
  996. }
  997. if (ret < 0)
  998. {
  999. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, status:%hhn, ret:%d",
  1000. __func__,
  1001. idx,
  1002. slaveaddr,
  1003. addr,
  1004. status,
  1005. ret);
  1006. }
  1007. return ret;
  1008. }
  1009. int chan_read_gpio(int idx, int *val)
  1010. {
  1011. chan_lock(idx);
  1012. // log_dbg("read gpio, chan idx %d\n", idx);
  1013. char buf[4096] = {0};
  1014. sprintf(buf, "/sys/class/gpio/gpio%s/value", chan[idx].szdev);
  1015. int fd_value = -1;
  1016. if (chan[idx].mode != CHANMODE_DO && chan[idx].mode != CHANMODE_DI)
  1017. {
  1018. log_dbg("channel %d is not DIDO mode\n", idx);
  1019. chan_unlock(idx);
  1020. return -1;
  1021. }
  1022. fd_value = open(buf, O_RDONLY);
  1023. if (fd_value == -1)
  1024. {
  1025. log_dbg("read value %s\n", strerror(errno));
  1026. chan_unlock(idx);
  1027. return -1;
  1028. }
  1029. memset(buf, 0, sizeof(buf));
  1030. lseek(fd_value, 0, SEEK_SET);
  1031. int rdsize = read(fd_value, buf, sizeof(buf));
  1032. // log_dbg("read value size : %d\n", rdsize);
  1033. if (rdsize < 0)
  1034. {
  1035. log_dbg("read value %s\n", strerror(errno));
  1036. close(fd_value);
  1037. chan_unlock(idx);
  1038. return -1;
  1039. }
  1040. // log_dbg("gpio%s value: %s\n", chan[idx].szdev, buf);
  1041. close(fd_value);
  1042. *val = atoi(buf);
  1043. chan_unlock(idx);
  1044. return 0;
  1045. }
  1046. int chan_write_gpio(int idx, int val)
  1047. {
  1048. chan_lock(idx);
  1049. // log_dbg("write gpio, chan idx %d\n", idx);
  1050. char buf[4096] = {0};
  1051. sprintf(buf, "/sys/class/gpio/gpio%s/value", chan[idx].szdev);
  1052. int fd_value = -1;
  1053. if (chan[idx].mode != CHANMODE_DO)
  1054. {
  1055. log_dbg("channel %d is not DO mode\n", idx);
  1056. chan_unlock(idx);
  1057. return -1;
  1058. }
  1059. else
  1060. {
  1061. fd_value = open(buf, O_RDWR);
  1062. if (fd_value == -1)
  1063. {
  1064. log_dbg("value %s\n", strerror(errno));
  1065. chan_unlock(idx);
  1066. return -1;
  1067. }
  1068. sprintf(buf, "%d", val);
  1069. if (write(fd_value, buf, sizeof(buf)) == -1)
  1070. {
  1071. log_dbg("write value %s\n", strerror(errno));
  1072. close(fd_value);
  1073. chan_unlock(idx);
  1074. return -1;
  1075. }
  1076. // log_dbg("write value %s success\n", buf);
  1077. }
  1078. close(fd_value);
  1079. chan_unlock(idx);
  1080. return 0;
  1081. }
  1082. int chan_read_holdingregisters(int idx, int slaveaddr, int regaddr, int nb, unsigned short *regval)
  1083. {
  1084. int rc;
  1085. int ret = 0;
  1086. struct chan_t *ch = &chan[idx];
  1087. if (ch->ctx == NULL)
  1088. {
  1089. ret = -1;
  1090. }
  1091. else
  1092. {
  1093. modbus_set_slave(ch->ctx, slaveaddr);
  1094. rc = modbus_read_registers(ch->ctx, regaddr, nb, regval);
  1095. modbus_flush(ch->ctx);
  1096. if (rc != nb)
  1097. {
  1098. ch->errcnt++;
  1099. ret = -2;
  1100. }
  1101. }
  1102. if (ret < 0)
  1103. {
  1104. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, rc:%d",
  1105. __func__, idx, slaveaddr, regaddr, nb, rc);
  1106. }
  1107. return ret;
  1108. }
  1109. int chan_read_holdingregisters_with_retry(int idx, int slaveaddr, int regaddr, int nb, unsigned short *regval)
  1110. {
  1111. int rc;
  1112. int ret = -1;
  1113. struct chan_t *ch = &chan[idx];
  1114. int retry_times = ch->retry_times;
  1115. int restart_times = ch->restart_times;
  1116. while (restart_times-- > 0)
  1117. {
  1118. while (retry_times-- > 0)
  1119. {
  1120. if (ch->ctx != NULL)
  1121. {
  1122. modbus_set_slave(ch->ctx, slaveaddr);
  1123. rc = modbus_read_registers(ch->ctx, regaddr, nb, regval);
  1124. modbus_flush(ch->ctx);
  1125. if (rc != nb)
  1126. {
  1127. ch->errcnt++;
  1128. usleep(100000); /* 100ms */
  1129. }
  1130. else
  1131. {
  1132. ret = 0; /* ok */
  1133. goto leave;
  1134. }
  1135. }
  1136. }
  1137. usleep(100000); /* 100ms */
  1138. chan_start(idx);
  1139. retry_times = ch->retry_times;
  1140. }
  1141. leave:
  1142. if (ret < 0)
  1143. {
  1144. log_dbg("%s, idx:%d, slaveaddr:%d, regaddr:%d, nb:%d, fail",
  1145. __func__, idx, slaveaddr, regaddr, nb);
  1146. }
  1147. return ret;
  1148. }
  1149. int chan_enable_dbg(int idx)
  1150. {
  1151. int ret = 0;
  1152. struct chan_t *ch = &chan[idx];
  1153. if (ch->ctx != NULL)
  1154. {
  1155. ch->dbg = 1;
  1156. modbus_set_debug(ch->ctx, 1);
  1157. }
  1158. else
  1159. {
  1160. ch->dbg = 1;
  1161. }
  1162. return ret;
  1163. }
  1164. int chan_disable_dbg(int idx)
  1165. {
  1166. int ret = 0;
  1167. struct chan_t *ch = &chan[idx];
  1168. if (ch->ctx != NULL)
  1169. {
  1170. ch->dbg = 0;
  1171. modbus_set_debug(ch->ctx, 0);
  1172. }
  1173. else
  1174. {
  1175. ch->dbg = 0;
  1176. }
  1177. return ret;
  1178. }
  1179. int chan_set_dbg(int idx, int enable)
  1180. {
  1181. int ret = 0;
  1182. struct chan_t *ch = &chan[idx];
  1183. ch->dbg = enable;
  1184. if (ch->ctx != NULL)
  1185. {
  1186. modbus_set_debug(ch->ctx, enable);
  1187. }
  1188. return ret;
  1189. }
  1190. int chan_set_en(int idx, int enable)
  1191. {
  1192. int ret = 0;
  1193. struct chan_t *ch = &chan[idx];
  1194. ch->en = enable;
  1195. log_dbg("%s, idx:%d, enable:%d", __func__, idx, enable);
  1196. return ret;
  1197. }
  1198. int chan_get_en(int idx)
  1199. {
  1200. struct chan_t *ch = &chan[idx];
  1201. return ch->en;
  1202. }
  1203. void chan_serial_rxrb_init(int idx)
  1204. {
  1205. chan_serial_ringbuffer_init(chan[idx].serial_rxrb);
  1206. }
  1207. void chan_serial_txrb_init(int idx)
  1208. {
  1209. chan_serial_ringbuffer_init(chan[idx].serial_txrb);
  1210. }
  1211. void chan_serial_rxrb_queue(int idx, chan_serial_ringbuffer_element_t e)
  1212. {
  1213. chan_serial_ringbuffer_queue(chan[idx].serial_rxrb, e);
  1214. }
  1215. int chan_serial_rxrb_dequeue_arr(int idx, chan_serial_ringbuffer_element_t *e, int len)
  1216. {
  1217. return chan_serial_ringbuffer_dequeue_arr(chan[idx].serial_rxrb, e, len);
  1218. }
  1219. int chan_serial_rxrb_num_items(int idx)
  1220. {
  1221. return chan_serial_ringbuffer_num_items(chan[idx].serial_rxrb);
  1222. }
  1223. int chan_serial_txrb_num_items(int idx)
  1224. {
  1225. return chan_serial_ringbuffer_num_items(chan[idx].serial_txrb);
  1226. }
  1227. int chan_serial_txrb_dequeue_arr(int idx, chan_serial_ringbuffer_element_t *e, int len)
  1228. {
  1229. return chan_serial_ringbuffer_dequeue_arr(chan[idx].serial_txrb, e, len);
  1230. }
  1231. void chan_serial_txrb_queue_arr(int idx, chan_serial_ringbuffer_element_t *e, int len)
  1232. {
  1233. chan_serial_ringbuffer_queue_arr(chan[idx].serial_txrb, e, len);
  1234. }
  1235. void chan_socketcan_rxrb_init(int idx)
  1236. {
  1237. chan_socketcan_ringbuffer_init(chan[idx].socketcan_rxrb);
  1238. }
  1239. void chan_socketcan_txrb_init(int idx)
  1240. {
  1241. chan_socketcan_ringbuffer_init(chan[idx].socketcan_txrb);
  1242. }
  1243. void chan_socketcan_rxrb_queue(int idx, chan_socketcan_ringbuffer_element_t e)
  1244. {
  1245. chan_socketcan_ringbuffer_queue(chan[idx].socketcan_rxrb, e);
  1246. }
  1247. void chan_socketcan_rxrb_queue_arr(int idx, chan_socketcan_ringbuffer_element_t *e, int len)
  1248. {
  1249. chan_socketcan_ringbuffer_queue_arr(chan[idx].socketcan_rxrb, e, len);
  1250. }
  1251. int chan_socketcan_rxrb_dequeue(int idx, chan_socketcan_ringbuffer_element_t *e)
  1252. {
  1253. return chan_socketcan_ringbuffer_dequeue(chan[idx].socketcan_rxrb, e);
  1254. }
  1255. int chan_socketcan_rxrb_dequeue_arr(int idx, chan_socketcan_ringbuffer_element_t *e, int len)
  1256. {
  1257. return chan_socketcan_ringbuffer_dequeue_arr(chan[idx].socketcan_rxrb, e, len);
  1258. }
  1259. int chan_socketcan_txrb_num_items(int idx)
  1260. {
  1261. return chan_socketcan_ringbuffer_num_items(chan[idx].socketcan_txrb);
  1262. }
  1263. int chan_socketcan_rxrb_num_items(int idx)
  1264. {
  1265. return chan_socketcan_ringbuffer_num_items(chan[idx].socketcan_rxrb);
  1266. }
  1267. int chan_socketcan_txrb_dequeue_arr(int idx, chan_socketcan_ringbuffer_element_t *e, int len)
  1268. {
  1269. return chan_socketcan_ringbuffer_dequeue_arr(chan[idx].socketcan_txrb, e, len);
  1270. }
  1271. int chan_socketcan_txrb_dequeue(int idx, chan_socketcan_ringbuffer_element_t *e)
  1272. {
  1273. return chan_socketcan_ringbuffer_dequeue(chan[idx].socketcan_txrb, e);
  1274. }
  1275. void chan_socketcan_txrb_queue(int idx, chan_socketcan_ringbuffer_element_t e)
  1276. {
  1277. return chan_socketcan_ringbuffer_queue(chan[idx].socketcan_txrb, e);
  1278. }
  1279. void chan_tcpservcan_rxrb_init(int idx)
  1280. {
  1281. chan_tcpservcan_ringbuffer_init(chan[idx].tcpservcan_rxrb);
  1282. }
  1283. void chan_tcpservcan_txrb_init(int idx)
  1284. {
  1285. chan_tcpservcan_ringbuffer_init(chan[idx].tcpservcan_txrb);
  1286. }
  1287. void chan_tcpservcan_rxrb_queue(int idx, chan_tcpservcan_ringbuffer_element_t e)
  1288. {
  1289. chan_tcpservcan_ringbuffer_queue(chan[idx].tcpservcan_rxrb, e);
  1290. }
  1291. int chan_tcpservcan_txrb_num_items(int idx)
  1292. {
  1293. return chan_tcpservcan_ringbuffer_num_items(chan[idx].tcpservcan_txrb);
  1294. }
  1295. int chan_tcpservcan_txrb_dequeue_arr(int idx, chan_tcpservcan_ringbuffer_element_t *e, int len)
  1296. {
  1297. return chan_tcpservcan_ringbuffer_dequeue_arr(chan[idx].tcpservcan_txrb, e, len);
  1298. }
  1299. int chan_start(int idx)
  1300. {
  1301. pthread_t xthrd;
  1302. struct hostent *he;
  1303. struct sockaddr_in my_addr;
  1304. struct timeval t;
  1305. int sock;
  1306. struct sockaddr_can addr;
  1307. int ret = 0;
  1308. int rc = 0;
  1309. struct chan_t *ch = NULL;
  1310. char buf[128];
  1311. struct timeval timeout = {1, 0};
  1312. int recv_own_msgs = 0; // set loop back: 1 enable 0 disable
  1313. const UCHAR ucSlaveID[] = {0xAA, 0xBB, 0xCC};
  1314. struct sockaddr_in servaddr;
  1315. int slaveadr = 0;
  1316. log_dbg("%s, ++, idx:%d", __func__, idx);
  1317. ch = &chan[idx];
  1318. ch->started = 0;
  1319. if (ch->mode == CHANMODE_SERIAL)
  1320. {
  1321. log_dbg("%s, idx:%d, mode:%s, dev:%s, parity:%s, baud:%d", __func__, idx, ch->szmode, ch->szdev, ch->szparity, ch->baud);
  1322. sprintf(buf, "/dev/%s", ch->szdev);
  1323. // ch->fd = open(buf, O_RDWR);
  1324. ch->fd = chan_open_serial(buf, ch->baud, 8, ch->szparity[0], 1);
  1325. if (ch->fd < 0)
  1326. {
  1327. log_dbg("%s, idx:%d, open %s fail", __func__, idx, buf);
  1328. ch->fd = 0;
  1329. ret = -1;
  1330. }
  1331. else
  1332. {
  1333. // if(chan_set_baud(ch->fd,ch->baud) < 0){
  1334. // log_dbg("%s, idx:%d, set baud %s %d fail", __func__, idx, buf,ch->baud);
  1335. // close(ch->fd);
  1336. // ch->fd = 0;
  1337. // }else if( chan_set_parity(ch->fd, 8, 1, ch->szparity[0]) < 0 ){
  1338. // log_dbg("%s, idx:%d, set parity %s %s fail", __func__, idx, buf, ch->szparity);
  1339. // close(ch->fd);
  1340. // ch->fd = 0;
  1341. // ret = -1;
  1342. // }else{
  1343. ch->serial_rxrb = (chan_serial_ringbuffer_t *)malloc(sizeof(chan_serial_ringbuffer_t));
  1344. if (ch->serial_rxrb != NULL)
  1345. {
  1346. chan_serial_rxrb_init(idx);
  1347. ch->serial_txrb = (chan_serial_ringbuffer_t *)malloc(sizeof(chan_serial_ringbuffer_t));
  1348. if (ch->serial_txrb != NULL)
  1349. {
  1350. chan_serial_txrb_init(idx);
  1351. }
  1352. else
  1353. {
  1354. log_dbg("%s, idx:%d, malloc tx ringbuffer fail", __func__, idx);
  1355. free(ch->serial_rxrb);
  1356. ret = -1;
  1357. }
  1358. }
  1359. else
  1360. {
  1361. log_dbg("%s, idx:%d, malloc rx ringbuffer fail", __func__, idx);
  1362. ret = -1;
  1363. }
  1364. chanthrd_param[idx].idx = idx;
  1365. if (pthread_create(&xthrd, NULL, chan_serial_rxthrd, &chanthrd_param[idx]) != 0)
  1366. {
  1367. log_dbg("%s, chan_serial_rxthrd create fail", __func__);
  1368. ret = -1;
  1369. }
  1370. else if (pthread_create(&xthrd, NULL, chan_serial_txthrd, &chanthrd_param[idx]) != 0)
  1371. {
  1372. log_dbg("%s, chan_serial_rxthrd create fail", __func__);
  1373. ret = -1;
  1374. }
  1375. //}
  1376. }
  1377. }
  1378. else if (ch->mode == CHANMODE_SOCKET_CAN)
  1379. {
  1380. log_dbg("%s, idx:%d, mode:%s, dev:%s", __func__, idx, ch->szmode, ch->szdev);
  1381. sock = socket(PF_CAN, SOCK_RAW, CAN_RAW);
  1382. if (sock < 0)
  1383. {
  1384. printf("error\n");
  1385. ret = -1;
  1386. }
  1387. else
  1388. {
  1389. addr.can_family = AF_CAN;
  1390. strcpy(ifr[idx].ifr_name, ch->szdev);
  1391. rc = ioctl(sock, SIOCGIFINDEX, &ifr[idx]); // get index
  1392. if (rc && ifr[idx].ifr_ifindex == 0)
  1393. {
  1394. log_dbg("%s, idx:%d, rc && ifr[idx].ifr_ifindex == 0", __func__, idx);
  1395. close(sock);
  1396. ret = -1;
  1397. }
  1398. else
  1399. {
  1400. addr.can_ifindex = ifr[idx].ifr_ifindex;
  1401. setsockopt(sock, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &recv_own_msgs, sizeof(recv_own_msgs));
  1402. if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
  1403. {
  1404. log_dbg("%s, idx:%d, bind error", __func__, idx);
  1405. close(sock);
  1406. ret = -1;
  1407. }
  1408. else
  1409. {
  1410. ch->sockfd = sock;
  1411. ch->socketcan_rxrb = (chan_socketcan_ringbuffer_t *)malloc(sizeof(chan_socketcan_ringbuffer_t));
  1412. if (ch->socketcan_rxrb != NULL)
  1413. {
  1414. chan_socketcan_rxrb_init(idx);
  1415. ch->socketcan_txrb = (chan_socketcan_ringbuffer_t *)malloc(sizeof(chan_socketcan_ringbuffer_t));
  1416. if (ch->socketcan_txrb != NULL)
  1417. {
  1418. chan_socketcan_txrb_init(idx);
  1419. }
  1420. else
  1421. {
  1422. log_dbg("%s, idx:%d, malloc tx ringbuffer fail", __func__, idx);
  1423. free(ch->socketcan_rxrb);
  1424. ret = -1;
  1425. }
  1426. }
  1427. else
  1428. {
  1429. log_dbg("%s, idx:%d, malloc rx ringbuffer fail", __func__, idx);
  1430. ret = -1;
  1431. }
  1432. chanthrd_param[idx].idx = idx;
  1433. if (pthread_create(&xthrd, NULL, chan_socketcan_rxthrd, &chanthrd_param[idx]) != 0)
  1434. {
  1435. log_dbg("%s, chan_socketcan_rxthrd create fail", __func__);
  1436. ret = -1;
  1437. }
  1438. else if (pthread_create(&xthrd, NULL, chan_socketcan_txthrd, &chanthrd_param[idx]) != 0)
  1439. {
  1440. log_dbg("%s, chan_socketcan_rxthrd create fail", __func__);
  1441. ret = -1;
  1442. }
  1443. }
  1444. }
  1445. }
  1446. }
  1447. else if (ch->mode == CHANMODE_TCPSERV_CAN)
  1448. {
  1449. log_dbg("%s, idx:%d, mode:%s, host:%s, port:%d", __func__, idx, ch->szmode, ch->servip, ch->servport);
  1450. sock = socket(AF_INET, SOCK_STREAM, 0);
  1451. if (sock < 0)
  1452. {
  1453. log_dbg("%s, tcpserv_can socket fail", __func__);
  1454. ret = -1;
  1455. }
  1456. else
  1457. {
  1458. bzero(&servaddr, sizeof(servaddr));
  1459. servaddr.sin_family = AF_INET;
  1460. servaddr.sin_port = htons(ch->servport);
  1461. inet_pton(AF_INET, ch->servip, &servaddr.sin_addr);
  1462. rc = connect(sock, (SA *)&servaddr, sizeof(servaddr));
  1463. if (rc < 0)
  1464. {
  1465. log_dbg("%s, tcpserv_can connect fail", __func__);
  1466. ret = -1;
  1467. }
  1468. else
  1469. {
  1470. ch->sockfd = sock;
  1471. ch->tcpservcan_rxrb = (chan_tcpservcan_ringbuffer_t *)malloc(sizeof(chan_tcpservcan_ringbuffer_t));
  1472. if (ch->tcpservcan_rxrb != NULL)
  1473. {
  1474. chan_tcpservcan_rxrb_init(idx);
  1475. ch->tcpservcan_txrb = (chan_tcpservcan_ringbuffer_t *)malloc(sizeof(chan_tcpservcan_ringbuffer_t));
  1476. if (ch->tcpservcan_txrb != NULL)
  1477. {
  1478. chan_tcpservcan_txrb_init(idx);
  1479. }
  1480. else
  1481. {
  1482. log_dbg("%s, idx:%d, malloc tx ringbuffer fail", __func__, idx);
  1483. free(ch->tcpservcan_rxrb);
  1484. ret = -1;
  1485. }
  1486. }
  1487. else
  1488. {
  1489. log_dbg("%s, idx:%d, malloc rx ringbuffer fail", __func__, idx);
  1490. ret = -1;
  1491. }
  1492. chanthrd_param[idx].idx = idx;
  1493. if (pthread_create(&xthrd, NULL, chan_tcpservcan_rxthrd, &chanthrd_param[idx]) != 0)
  1494. {
  1495. log_dbg("%s, chan_tcpservcan_rxthrd create fail", __func__);
  1496. ret = -1;
  1497. }
  1498. else if (pthread_create(&xthrd, NULL, chan_tcpservcan_txthrd, &chanthrd_param[idx]) != 0)
  1499. {
  1500. log_dbg("%s, chan_tcpservcan_rxthrd create fail", __func__);
  1501. ret = -1;
  1502. }
  1503. }
  1504. }
  1505. }
  1506. else if (ch->mode == CHANMODE_MODBUS_RTU)
  1507. {
  1508. sprintf(buf, "/dev/%s", ch->szdev);
  1509. log_dbg("%s, idx:%d, mode:%s, dev:%s", __func__, idx, ch->szmode, buf);
  1510. if (ch->ctx != NULL)
  1511. {
  1512. log_dbg("%s, idx:%d, modbus rtu, ctx:0x%08X, cleared", __func__, idx, (unsigned int)(ch->ctx));
  1513. modbus_close(ch->ctx);
  1514. modbus_free(ch->ctx);
  1515. ch->ctx = NULL;
  1516. }
  1517. ch->ctx = modbus_new_rtu(buf, ch->baud, ch->szparity[0], 8, 1);
  1518. if (ch->ctx == NULL)
  1519. {
  1520. modbus_set_debug(ch->ctx, 1);
  1521. log_dbg("%s, idx:%d, modbus rtu new fail", __func__, idx);
  1522. ch->started = 0;
  1523. }
  1524. else if (modbus_connect(ch->ctx) == -1)
  1525. {
  1526. log_dbg("%s, idx:%d, modbus rtu connect fail", __func__, idx);
  1527. modbus_free(ch->ctx);
  1528. ch->ctx = NULL;
  1529. }
  1530. else
  1531. {
  1532. t.tv_sec = 0;
  1533. t.tv_usec = 1000000; // 20s, 为了减少一些慢速设备超时导致的大量的日志
  1534. modbus_set_response_timeout(ch->ctx, &t);
  1535. }
  1536. }
  1537. else if (strcmp(ch->szmode, "modbus_rtu_udp") == 0)
  1538. {
  1539. // sprintf(buf,"/dev/%s",chn->szPort);
  1540. ch->ctx = modbus_new_rtuudp(ch->servip, ch->servport);
  1541. if (ch->ctx == NULL)
  1542. {
  1543. ret = -3;
  1544. }
  1545. else if (modbus_connect(ch->ctx) == -1)
  1546. {
  1547. ret = -4;
  1548. modbus_free(ch->ctx);
  1549. }
  1550. else
  1551. {
  1552. t.tv_sec = 0;
  1553. t.tv_usec = 1000000; // 1000ms
  1554. modbus_set_response_timeout(ch->ctx, &t);
  1555. }
  1556. }
  1557. else if (strcmp(ch->szmode, "modbus_rtu_tcp") == 0)
  1558. {
  1559. // sprintf(buf,"/dev/%s",chn->szPort);
  1560. ch->ctx = modbus_new_rtutcp(ch->servip, ch->servport);
  1561. if (ch->ctx == NULL)
  1562. {
  1563. ret = -5;
  1564. }
  1565. else if (modbus_connect(ch->ctx) == -1)
  1566. {
  1567. ret = -6;
  1568. modbus_free(ch->ctx);
  1569. }
  1570. else
  1571. {
  1572. t.tv_sec = 0;
  1573. t.tv_usec = 1000000; // 1000ms
  1574. modbus_set_response_timeout(ch->ctx, &t);
  1575. }
  1576. }
  1577. else if (ch->mode == CHANMODE_MODBUS_TCP)
  1578. {
  1579. if (ch->ctx != NULL)
  1580. {
  1581. log_dbg("%s, idx:%d, modbus tcp, ctx:0x%08X, cleared", __func__, idx, (unsigned int)(ch->ctx));
  1582. modbus_close(ch->ctx);
  1583. modbus_free(ch->ctx);
  1584. ch->ctx = NULL;
  1585. }
  1586. ch->ctx = modbus_new_tcp(ch->servip, ch->servport);
  1587. if (ch->ctx == NULL)
  1588. {
  1589. log_dbg("%s, idx:%d, modbus tcp new fail", __func__, idx);
  1590. ch->started = 0;
  1591. }
  1592. else if (modbus_connect(ch->ctx) == -1)
  1593. {
  1594. log_dbg("%s, idx:%d, modbus tcp connect fail", __func__, idx);
  1595. modbus_free(ch->ctx);
  1596. ch->ctx = NULL;
  1597. ch->started = 0;
  1598. }
  1599. else
  1600. {
  1601. log_dbg("%s, idx:%d, modbus tcp, ctx:0x%08X, start ok", __func__, idx, (unsigned int)(ch->ctx));
  1602. ch->started = 1;
  1603. }
  1604. }
  1605. else if (ch->mode == CHANMODE_DI || ch->mode == CHANMODE_DO)
  1606. {
  1607. char buf[4096] = {0};
  1608. struct stat file_info;
  1609. sprintf(buf, "/sys/class/gpio/gpio%s", ch->szdev);
  1610. if (stat(buf, &file_info) != -1)
  1611. {
  1612. log_dbg("stat : gpio path exported: %s\n", buf);
  1613. // if (file_info.st_mode & S_IFDIR)
  1614. // {
  1615. // log_dbg("%s, gpio%s has been exported\n", ch->szdev);
  1616. // }
  1617. }
  1618. else
  1619. {
  1620. log_dbg("%s, exporting gpio%s \n", __func__, ch->szdev);
  1621. int fd_export = open(EXPORT_PATH, O_WRONLY);
  1622. if (fd_export == -1)
  1623. {
  1624. log_dbg("open path %s failed : %s\n", EXPORT_PATH, strerror(errno));
  1625. return -1;
  1626. }
  1627. if (write(fd_export, ch->szdev, strlen(ch->szdev)) == -1)
  1628. {
  1629. log_dbg("write path %s\n", strerror(errno));
  1630. close(fd_export);
  1631. return -1;
  1632. }
  1633. log_dbg("export / unexport %s success\n", ch->szdev);
  1634. close(fd_export);
  1635. }
  1636. // 设置gpio方向
  1637. log_dbg("set gpio%s direction\n", ch->szdev);
  1638. sprintf(buf, "/sys/class/gpio/gpio%s/direction", ch->szdev);
  1639. log_dbg("direction path: %s\n", buf);
  1640. int fd_direction = open(buf, O_RDWR);
  1641. if (fd_direction == -1)
  1642. {
  1643. log_dbg("direction %s\n", strerror(errno));
  1644. return -1;
  1645. }
  1646. if (ch->mode == CHANMODE_DI)
  1647. {
  1648. sprintf(buf, "%s", DIR_IN);
  1649. }
  1650. else
  1651. {
  1652. sprintf(buf, "%s", DIR_OUT);
  1653. }
  1654. if (write(fd_direction, buf, strlen(buf)) == -1)
  1655. {
  1656. log_dbg("write direction %s\n", strerror(errno));
  1657. close(fd_direction);
  1658. return -1;
  1659. }
  1660. log_dbg("set gpio%s direction success\n", ch->szdev);
  1661. close(fd_direction);
  1662. ret = 0;
  1663. }
  1664. else
  1665. {
  1666. log_dbg("%s, unknown ch mode :%s", __func__, ch->szmode);
  1667. ret = -1;
  1668. }
  1669. leave:
  1670. log_dbg("%s, --,idx:%d, ret:%d", __func__, idx, ret);
  1671. return ret;
  1672. }
  1673. int chan_mode_str2nbr(char *szmode)
  1674. {
  1675. int mode = CHANMODE_UNKNOWN;
  1676. if (szmode == NULL)
  1677. {
  1678. return CHANMODE_UNKNOWN;
  1679. }
  1680. if (strcmp(szmode, "serial") == 0)
  1681. {
  1682. mode = CHANMODE_SERIAL;
  1683. }
  1684. else if (strcmp(szmode, "socket_can") == 0)
  1685. {
  1686. mode = CHANMODE_SOCKET_CAN;
  1687. }
  1688. else if (strcmp(szmode, "tcp_can") == 0)
  1689. {
  1690. mode = CHANMODE_TCPSERV_CAN;
  1691. }
  1692. else if (strcmp(szmode, "modbus_rtu") == 0)
  1693. {
  1694. mode = CHANMODE_MODBUS_RTU;
  1695. }
  1696. else if (strcmp(szmode, "modbus_tcp") == 0)
  1697. {
  1698. mode = CHANMODE_MODBUS_TCP;
  1699. }
  1700. else if (strcmp(szmode, "di") == 0)
  1701. {
  1702. mode = CHANMODE_DI;
  1703. }
  1704. else if (strcmp(szmode, "do") == 0)
  1705. {
  1706. mode = CHANMODE_DO;
  1707. }
  1708. else
  1709. {
  1710. mode = CHANMODE_UNKNOWN;
  1711. }
  1712. return mode;
  1713. }
  1714. int chan_reset(int idx)
  1715. {
  1716. struct timeval t;
  1717. int ret = 0;
  1718. char buf[32];
  1719. struct chan_t *ch = &chan[idx];
  1720. log_dbg("%s, ++, idx:%d", __func__, idx);
  1721. if (strcmp(ch->szmode, "modbus_tcp") == 0)
  1722. {
  1723. ch->rstcnt += 1;
  1724. if (ch->ctx != NULL)
  1725. {
  1726. modbus_close(ch->ctx);
  1727. modbus_free(ch->ctx);
  1728. }
  1729. ch->ctx = modbus_new_tcp(ch->servip, ch->servport);
  1730. if (ch->ctx == NULL)
  1731. {
  1732. ret = -1;
  1733. }
  1734. else if (modbus_connect(ch->ctx) == -1)
  1735. {
  1736. modbus_free(ch->ctx);
  1737. ch->ctx = NULL;
  1738. ret = -2;
  1739. }
  1740. else
  1741. {
  1742. log_dbg("%s, idx:%d, ctx:0x%08X init success", __func__, idx, (unsigned int)(ch->ctx));
  1743. }
  1744. }
  1745. else
  1746. {
  1747. ret = -10;
  1748. }
  1749. log_dbg("%s, --, idx:%d, ret:%d", __func__, idx, ret);
  1750. return ret;
  1751. }
  1752. int chan_get_mode(int idx)
  1753. {
  1754. return chan[idx].mode;
  1755. }
  1756. char *chan_get_info_str(int idx)
  1757. {
  1758. if (idx > chan_get_nbr())
  1759. {
  1760. return NULL;
  1761. }
  1762. else
  1763. {
  1764. return chan[idx].szinfo;
  1765. }
  1766. }
  1767. char *chan_get_servip_str(int idx)
  1768. {
  1769. if (idx > chan_get_nbr())
  1770. {
  1771. return NULL;
  1772. }
  1773. else
  1774. {
  1775. return chan[idx].servip;
  1776. }
  1777. }
  1778. int chan_get_servport(int idx)
  1779. {
  1780. if (idx > chan_get_nbr())
  1781. {
  1782. return -1;
  1783. }
  1784. else
  1785. {
  1786. return chan[idx].servport;
  1787. }
  1788. }
  1789. int chan_get_baud(int idx)
  1790. {
  1791. if (idx > chan_get_nbr())
  1792. {
  1793. return -1;
  1794. }
  1795. else
  1796. {
  1797. return chan[idx].baud;
  1798. }
  1799. }
  1800. char *chan_get_parity_str(int idx)
  1801. {
  1802. if (idx > chan_get_nbr())
  1803. {
  1804. return NULL;
  1805. }
  1806. else
  1807. {
  1808. return chan[idx].szparity;
  1809. }
  1810. }
  1811. char *chan_get_dev_str(int idx)
  1812. {
  1813. if (idx > chan_get_nbr())
  1814. {
  1815. return NULL;
  1816. }
  1817. else
  1818. {
  1819. return chan[idx].szdev;
  1820. }
  1821. }
  1822. int chan_get_port(int idx)
  1823. {
  1824. if (idx > chan_get_nbr())
  1825. {
  1826. return -1;
  1827. }
  1828. else
  1829. {
  1830. return chan[idx].port;
  1831. }
  1832. }
  1833. char *chan_get_mode_str(int idx)
  1834. {
  1835. if (idx > chan_get_nbr())
  1836. {
  1837. return NULL;
  1838. }
  1839. else
  1840. {
  1841. return chan[idx].szmode;
  1842. }
  1843. }
  1844. int chan_get_errcnt(int idx)
  1845. {
  1846. if (idx > chan_get_nbr())
  1847. {
  1848. return -1;
  1849. }
  1850. else
  1851. {
  1852. return chan[idx].errcnt;
  1853. }
  1854. }
  1855. int chan_get_started(int idx)
  1856. {
  1857. if (idx > chan_get_nbr())
  1858. {
  1859. return -1;
  1860. }
  1861. else
  1862. {
  1863. return chan[idx].started;
  1864. }
  1865. }
  1866. int chan_get_restart_times(int idx)
  1867. {
  1868. if (idx > chan_get_nbr())
  1869. {
  1870. return -1;
  1871. }
  1872. else
  1873. {
  1874. return chan[idx].restart_times;
  1875. }
  1876. }
  1877. int chan_get_retry_times(int idx)
  1878. {
  1879. if (idx > chan_get_nbr())
  1880. {
  1881. return -1;
  1882. }
  1883. else
  1884. {
  1885. return chan[idx].retry_times;
  1886. }
  1887. }
  1888. int chan_get_dbg(int idx)
  1889. {
  1890. if (idx > chan_get_nbr())
  1891. {
  1892. return -1;
  1893. }
  1894. else
  1895. {
  1896. return chan[idx].dbg;
  1897. }
  1898. }
  1899. int chan_get_tool_data(int idx, char *buf)
  1900. {
  1901. struct chan_t *ch = &chan[idx];
  1902. sprintf(buf, " [%d]info:%s mode:%s dev:%s port:%d servip:%s servport:%d baud:%d dbg:%d started:%d errcnt:0x%08X retry_times:%d restart_times:%d\n",
  1903. idx, ch->szinfo, ch->szmode, ch->szdev, ch->port, ch->servip, ch->servport,
  1904. ch->baud, ch->dbg, ch->started, ch->errcnt, ch->retry_times, ch->restart_times);
  1905. }
  1906. int chan_get_tool_all_data(char *buf)
  1907. {
  1908. int i = 0;
  1909. char buf_temp[1024];
  1910. sprintf(buf, "" REVERSE " CHAN " NONE " nbr:%d\n", channbr);
  1911. for (i = 1; i <= chan_get_nbr(); i++)
  1912. {
  1913. chan_get_tool_data(i, buf_temp);
  1914. // printf("%s",buf_temp);
  1915. strcat(buf, buf_temp);
  1916. }
  1917. return 0;
  1918. }
  1919. int chan_get_bkds_data(char *buf)
  1920. {
  1921. char buf_temp[4096];
  1922. int i = 0;
  1923. sprintf(buf, "\"chan\":[");
  1924. for (i = 1; i <= chan_get_nbr(); i++)
  1925. {
  1926. memset(buf_temp, 0, sizeof(buf_temp));
  1927. sprintf(buf_temp, "{\"info\":\"%s\",\"servip\":\"%s\",\"servport\":%d,\"baud\":%d,\"parity\":\"%s\",\
  1928. \"dev\":\"%s\",\"port\":%d,\"mode\":\"%s\",\"errcnt\":%d,\"started\":%d,\
  1929. \"restart_times\":%d,\"retry_times\":%d,\"dbg\":%d}",
  1930. chan_get_info_str(i), chan_get_servip_str(i), chan_get_servport(i), chan_get_baud(i), chan_get_parity_str(i),
  1931. chan_get_dev_str(i), chan_get_port(i), chan_get_mode_str(i), chan_get_errcnt(i), chan_get_started(i),
  1932. chan_get_restart_times(i), chan_get_retry_times(i), chan_get_dbg(i));
  1933. strcat(buf, buf_temp);
  1934. if (i < chan_get_nbr())
  1935. {
  1936. strcat(buf, ",");
  1937. }
  1938. };
  1939. strcat(buf, "]");
  1940. return 0;
  1941. }