comm.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. /*****************************************************************************/
  2. /* ここから */
  3. /*****************************************************************************/
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <ctype.h>
  8. #include <unistd.h>
  9. #include <sys/types.h>
  10. #include <sys/time.h>
  11. #include "wonx_include/comm.h"
  12. #include "wonx_configure.h"
  13. #include "WonX.h"
  14. #include "etc.h"
  15. /*****************************************************************************/
  16. /* 互換関数の定義 */
  17. /*****************************************************************************/
  18. /*
  19. * Xサーバとの同期の整合性がとれなくなるなどの問題が考えられるので,
  20. * 互換関数の内部は UNIXTimer_Pause(), UNIXTimer_Unpause() でくくり,
  21. * タイマ割り込みを一時停止して処理を行う.また,unpause するまえに,
  22. * かならず sync するようにする.
  23. */
  24. /*
  25. * タイマの一時停止の2重解除の問題が出てくるので,
  26. * 互換関数から互換関数を呼んではいけない.
  27. * (一時停止はネストされるが,いちおう)
  28. * 似たような処理をする関数の場合は,必ず static な別関数に処理をまとめ,
  29. * そっちを呼び出すようにすること.
  30. * 引数の表示の問題もあるしね.
  31. */
  32. void comm_open(void)
  33. {
  34. WWSerialPort ww_serial_port;
  35. if (!WonX_IsCreated()) WonX_Create();
  36. /* タイマを一時停止する */
  37. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  38. printf("call : comm_open() : \n");
  39. fflush(stdout);
  40. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  41. if (WWSerialPort_IsON(ww_serial_port))
  42. WonX_Error("comm_open", "Serial port has already opened.");
  43. WWSerialPort_ON(ww_serial_port);
  44. WonXDisplay_Sync(WonX_GetWonXDisplay());
  45. printf("call : comm_open() : return value = none\n");
  46. fflush(stdout);
  47. /* タイマをもとに戻す */
  48. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  49. return;
  50. }
  51. void comm_close(void)
  52. {
  53. WWSerialPort ww_serial_port;
  54. if (!WonX_IsCreated()) WonX_Create();
  55. /* タイマを一時停止する */
  56. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  57. printf("call : comm_close() : \n");
  58. fflush(stdout);
  59. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  60. if (!WWSerialPort_IsON(ww_serial_port))
  61. WonX_Error("comm_close", "Serial port is not opened.");
  62. WWSerialPort_OFF(ww_serial_port);
  63. WonXDisplay_Sync(WonX_GetWonXDisplay());
  64. printf("call : comm_close() : return value = none\n");
  65. fflush(stdout);
  66. /* タイマをもとに戻す */
  67. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  68. return;
  69. }
  70. static void comm_output(unsigned char c)
  71. {
  72. if (c == '\n') printf("\\n");
  73. else if (c == '\r') printf("\\r");
  74. else if (c == '\t') printf("\\t");
  75. else if (isprint(c)) fputc(c, stdout);
  76. else printf("^%02x", (int)c);
  77. fflush(stdout);
  78. return;
  79. }
  80. static int comm_input(int timeout)
  81. {
  82. int tmp;
  83. int c;
  84. fd_set bitmap;
  85. struct timeval t;
  86. struct timeval * t_p;
  87. /*
  88. * 0 のときは,即時
  89. * -1 のときは,無期限待ち
  90. */
  91. if (timeout == -1) {
  92. t_p = NULL;
  93. } else {
  94. tmp = WONX_SERIAL_PORT_TIMETICKS * timeout;
  95. t.tv_sec = tmp / 1000;
  96. t.tv_usec = (tmp % 1000) * 1000;
  97. t_p = &t;
  98. }
  99. FD_ZERO(&bitmap);
  100. FD_SET(fileno(stdin), &bitmap);
  101. /*
  102. * FreeBSD3.4 で実験したところ,
  103. * アラームシグナルを使用する場合,select()でのブロック中に
  104. * アラームシグナルが発生すると,その直後にselect()もタイムアウト
  105. * してしまうので,注意.
  106. * (select() がタイムアウトした後にアラームシグナルが発生する場合は,
  107. * 正常に動作した)
  108. * 論理上は問題が無いが,期待した時間だけ待ってくれないという現象が
  109. * 起きる可能性がある.
  110. */
  111. select(fileno(stdin) + 1, &bitmap, NULL, NULL, t_p);
  112. c = FD_ISSET(fileno(stdin), &bitmap) ? fgetc(stdin) : -1;
  113. c = (c == '\n') ? '\r' : c;
  114. return (c);
  115. }
  116. int comm_send_char(unsigned char c)
  117. {
  118. int ret;
  119. WWSerialPort ww_serial_port;
  120. if (!WonX_IsCreated()) WonX_Create();
  121. /* タイマを一時停止する */
  122. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  123. printf("call : comm_send_char() : character = 0x%02x\n", (int)c);
  124. fflush(stdout);
  125. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  126. if (!WWSerialPort_IsON(ww_serial_port))
  127. WonX_Error("comm_send_char", "Serial port is not opened.");
  128. printf("output to serial port : ");
  129. comm_output(c);
  130. printf("\n");
  131. fflush(stdout);
  132. ret = 0;
  133. WonXDisplay_Sync(WonX_GetWonXDisplay());
  134. printf("call : comm_send_char() : return value = %d\n", ret);
  135. fflush(stdout);
  136. /* タイマをもとに戻す */
  137. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  138. return (ret);
  139. }
  140. int comm_receive_char(void)
  141. {
  142. WWSerialPort ww_serial_port;
  143. int c;
  144. int ret;
  145. if (!WonX_IsCreated()) WonX_Create();
  146. /* タイマを一時停止する */
  147. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  148. printf("call : comm_receive_char() : \n");
  149. fflush(stdout);
  150. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  151. if (!WWSerialPort_IsON(ww_serial_port))
  152. WonX_Error("comm_receive_char", "Serial port is not opened.");
  153. c = comm_input(WWSerialPort_GetReceiveTimeout(ww_serial_port));
  154. if (c == -1) ret = ERR_SIO_TIMEOUT;
  155. else ret = c;
  156. WonXDisplay_Sync(WonX_GetWonXDisplay());
  157. printf("call : comm_receive_char() : return value = %d\n", ret);
  158. fflush(stdout);
  159. /* タイマをもとに戻す */
  160. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  161. return (ret);
  162. }
  163. int comm_receive_with_timeout(int timeout)
  164. {
  165. WWSerialPort ww_serial_port;
  166. int c;
  167. int ret;
  168. if (!WonX_IsCreated()) WonX_Create();
  169. /* タイマを一時停止する */
  170. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  171. printf("call : comm_receive_with_timeout() : timeout = %d\n", timeout);
  172. fflush(stdout);
  173. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  174. if (!WWSerialPort_IsON(ww_serial_port))
  175. WonX_Error("comm_receive_with_timeout", "Serial port is not opened.");
  176. c = comm_input(timeout);
  177. if (c == -1) ret = ERR_SIO_TIMEOUT;
  178. else ret = c;
  179. WonXDisplay_Sync(WonX_GetWonXDisplay());
  180. printf("call : comm_receive_with_timeout() : return value = %d\n", ret);
  181. fflush(stdout);
  182. /* タイマをもとに戻す */
  183. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  184. return (ret);
  185. }
  186. int comm_send_string(char * string)
  187. {
  188. WWSerialPort ww_serial_port;
  189. int ret;
  190. int i;
  191. if (!WonX_IsCreated()) WonX_Create();
  192. /* タイマを一時停止する */
  193. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  194. printf("call : comm_send_string() : string = %s\n", string);
  195. fflush(stdout);
  196. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  197. if (!WWSerialPort_IsON(ww_serial_port))
  198. WonX_Error("comm_send_string", "Serial port is not opened.");
  199. printf("output to serial port : ");
  200. for (i = 0; string[i]; i++) {
  201. comm_output(string[i]);
  202. }
  203. printf("\n");
  204. fflush(stdout);
  205. ret = 0;
  206. WonXDisplay_Sync(WonX_GetWonXDisplay());
  207. printf("call : comm_send_string() : return value = %d\n", ret);
  208. fflush(stdout);
  209. /* タイマをもとに戻す */
  210. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  211. return (ret);
  212. }
  213. int comm_send_block(void * buffer, int size)
  214. {
  215. WWSerialPort ww_serial_port;
  216. int ret;
  217. int i;
  218. if (!WonX_IsCreated()) WonX_Create();
  219. /* タイマを一時停止する */
  220. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  221. printf("call : comm_send_block() : buffer = %p, size = %d\n", buffer, size);
  222. fflush(stdout);
  223. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  224. if (!WWSerialPort_IsON(ww_serial_port))
  225. WonX_Error("comm_send_block", "Serial port is not opened.");
  226. printf("output to serial port : ");
  227. for (i = 0; i < size; i++) {
  228. comm_output(((char *)buffer)[i]);
  229. }
  230. printf("\n");
  231. fflush(stdout);
  232. ret = 0;
  233. WonXDisplay_Sync(WonX_GetWonXDisplay());
  234. printf("call : comm_send_block() : return value = %d\n", ret);
  235. fflush(stdout);
  236. /* タイマをもとに戻す */
  237. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  238. return (ret);
  239. }
  240. int comm_receive_block(void * buffer, int size)
  241. {
  242. WWSerialPort ww_serial_port;
  243. int ret;
  244. int c;
  245. int i;
  246. if (!WonX_IsCreated()) WonX_Create();
  247. /* タイマを一時停止する */
  248. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  249. printf("call : comm_receive_block() : buffer = %p, size = %d\n",
  250. buffer, size);
  251. fflush(stdout);
  252. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  253. if (!WWSerialPort_IsON(ww_serial_port))
  254. WonX_Error("comm_receive_block", "Serial port is not opened.");
  255. ret = 0;
  256. for (i = 0; i < size; i++) {
  257. c = comm_input(WWSerialPort_GetReceiveTimeout(ww_serial_port));
  258. if (c == -1) {
  259. ret = ERR_SIO_TIMEOUT;
  260. break;
  261. }
  262. ((char *)buffer)[i] = c;
  263. }
  264. WonXDisplay_Sync(WonX_GetWonXDisplay());
  265. printf("call : comm_receive_block() : return value = %d\n", ret);
  266. fflush(stdout);
  267. /* タイマをもとに戻す */
  268. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  269. return (ret);
  270. }
  271. void comm_set_timeout(int recv_timeout, int send_timeout)
  272. {
  273. WWSerialPort ww_serial_port;
  274. if (!WonX_IsCreated()) WonX_Create();
  275. /* タイマを一時停止する */
  276. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  277. printf("call : comm_set_timeout() : receive_timeout = %d, send_timeout = %d\n", recv_timeout, send_timeout);
  278. fflush(stdout);
  279. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  280. WWSerialPort_SetReceiveTimeout(ww_serial_port, recv_timeout);
  281. WWSerialPort_SetSendTimeout( ww_serial_port, send_timeout);
  282. WonXDisplay_Sync(WonX_GetWonXDisplay());
  283. printf("call : comm_set_timeout() : return value = none\n");
  284. fflush(stdout);
  285. /* タイマをもとに戻す */
  286. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  287. return;
  288. }
  289. void comm_set_baudrate(int baudrate)
  290. {
  291. WWSerialPort ww_serial_port;
  292. if (!WonX_IsCreated()) WonX_Create();
  293. /* タイマを一時停止する */
  294. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  295. printf("call : comm_set_baudrate() : baudrate = %d\n", baudrate);
  296. fflush(stdout);
  297. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  298. switch (baudrate) {
  299. case COMM_SPEED_9600: WWSerialPort_SetBaudrate9600( ww_serial_port); break;
  300. case COMM_SPEED_38400: WWSerialPort_SetBaudrate38400(ww_serial_port); break;
  301. default: WonX_Error("comm_set_baudrate", "Invalid baudrate");
  302. }
  303. WonXDisplay_Sync(WonX_GetWonXDisplay());
  304. printf("call : comm_set_baudrate() : return value = none\n");
  305. fflush(stdout);
  306. /* タイマをもとに戻す */
  307. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  308. return;
  309. }
  310. int comm_get_baudrate(void)
  311. {
  312. WWSerialPort ww_serial_port;
  313. int ret = 0;
  314. if (!WonX_IsCreated()) WonX_Create();
  315. /* タイマを一時停止する */
  316. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  317. printf("call : comm_get_baudrate() : \n");
  318. fflush(stdout);
  319. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  320. if (WWSerialPort_IsBaudrate9600(ww_serial_port))
  321. ret = COMM_SPEED_9600;
  322. else if (WWSerialPort_IsBaudrate38400(ww_serial_port))
  323. ret = COMM_SPEED_38400;
  324. else WonX_Error("comm_get_baudrate", "Invalid baudrate");
  325. WonXDisplay_Sync(WonX_GetWonXDisplay());
  326. printf("call : comm_get_baudrate() : return value = %d\n", ret);
  327. fflush(stdout);
  328. /* タイマをもとに戻す */
  329. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  330. return (ret);
  331. }
  332. void comm_set_cancel_key(unsigned int pattern)
  333. {
  334. WWSerialPort ww_serial_port;
  335. if (!WonX_IsCreated()) WonX_Create();
  336. /* タイマを一時停止する */
  337. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  338. printf("call : comm_set_cancel_key() : pattern = %u\n", (int)pattern);
  339. fflush(stdout);
  340. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  341. WWSerialPort_SetCancelKey(ww_serial_port, pattern);
  342. WonXDisplay_Sync(WonX_GetWonXDisplay());
  343. printf("call : comm_set_cancel_key() : return value = none\n");
  344. fflush(stdout);
  345. /* タイマをもとに戻す */
  346. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  347. return;
  348. }
  349. unsigned int comm_get_cancel_key(void)
  350. {
  351. WWSerialPort ww_serial_port;
  352. unsigned int ret;
  353. if (!WonX_IsCreated()) WonX_Create();
  354. /* タイマを一時停止する */
  355. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  356. printf("call : comm_get_cancel_key() : \n");
  357. fflush(stdout);
  358. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  359. /* ここに処理を書く */
  360. ret = WWSerialPort_GetCancelKey(ww_serial_port);
  361. WonXDisplay_Sync(WonX_GetWonXDisplay());
  362. printf("call : comm_get_cancel_key() : return value = %u\n", (int)ret);
  363. fflush(stdout);
  364. /* タイマをもとに戻す */
  365. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  366. return (ret);
  367. }
  368. int comm_xmodem(void * xmodem)
  369. {
  370. WWSerialPort ww_serial_port;
  371. int ret;
  372. if (!WonX_IsCreated()) WonX_Create();
  373. /* タイマを一時停止する */
  374. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  375. printf("call : comm_xmodem() : xmodem = %p\n", xmodem);
  376. fflush(stdout);
  377. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  378. /* 未サポート */
  379. printf("call : comm_xmodem() : not supported.\n");
  380. fflush(stdout);
  381. ret = 0;
  382. WonXDisplay_Sync(WonX_GetWonXDisplay());
  383. printf("call : comm_xmodem() : return value = %d\n", ret);
  384. fflush(stdout);
  385. /* タイマをもとに戻す */
  386. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  387. return (ret);
  388. }
  389. /*****************************************************************************/
  390. /* ここまで */
  391. /*****************************************************************************/
  392. /*****************************************************************************/
  393. /* End of File. */
  394. /*****************************************************************************/