chan.c 54 KB

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