comm.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  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. return (c);
  114. }
  115. int comm_send_char(unsigned char c)
  116. {
  117. int ret;
  118. WWSerialPort ww_serial_port;
  119. if (!Wonx_IsCreated()) Wonx_Create();
  120. /* タイマを一時停止する */
  121. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  122. printf("call : comm_send_char() : character = 0x%02x\n", (int)c);
  123. fflush(stdout);
  124. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  125. if (!WWSerialPort_IsON(ww_serial_port))
  126. Wonx_Error("comm_send_char", "Serial port is not opened.");
  127. printf("output to serial port : ");
  128. comm_output(c);
  129. printf("\n");
  130. fflush(stdout);
  131. ret = 0;
  132. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  133. printf("call : comm_send_char() : return value = %d\n", ret);
  134. fflush(stdout);
  135. /* タイマをもとに戻す */
  136. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  137. return (ret);
  138. }
  139. int comm_receive_char(void)
  140. {
  141. WWSerialPort ww_serial_port;
  142. int c;
  143. int ret;
  144. if (!Wonx_IsCreated()) Wonx_Create();
  145. /* タイマを一時停止する */
  146. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  147. printf("call : comm_receive_char() : \n");
  148. fflush(stdout);
  149. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  150. if (!WWSerialPort_IsON(ww_serial_port))
  151. Wonx_Error("comm_receive_char", "Serial port is not opened.");
  152. c = comm_input(WWSerialPort_GetReceiveTimeout(ww_serial_port));
  153. if (c == -1) ret = ERR_SIO_TIMEOUT;
  154. else ret = c;
  155. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  156. printf("call : comm_receive_char() : return value = %d\n", ret);
  157. fflush(stdout);
  158. /* タイマをもとに戻す */
  159. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  160. return (ret);
  161. }
  162. int comm_receive_with_timeout(int timeout)
  163. {
  164. WWSerialPort ww_serial_port;
  165. int c;
  166. int ret;
  167. if (!Wonx_IsCreated()) Wonx_Create();
  168. /* タイマを一時停止する */
  169. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  170. printf("call : comm_receive_with_timeout() : timeout = %d\n", timeout);
  171. fflush(stdout);
  172. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  173. if (!WWSerialPort_IsON(ww_serial_port))
  174. Wonx_Error("comm_receive_with_timeout", "Serial port is not opened.");
  175. c = comm_input(timeout);
  176. if (c == -1) ret = ERR_SIO_TIMEOUT;
  177. else ret = c;
  178. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  179. printf("call : comm_receive_with_timeout() : return value = %d\n", ret);
  180. fflush(stdout);
  181. /* タイマをもとに戻す */
  182. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  183. return (ret);
  184. }
  185. int comm_send_string(char * string)
  186. {
  187. WWSerialPort ww_serial_port;
  188. int ret;
  189. int i;
  190. if (!Wonx_IsCreated()) Wonx_Create();
  191. /* タイマを一時停止する */
  192. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  193. printf("call : comm_send_string() : string = %s\n", string);
  194. fflush(stdout);
  195. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  196. if (!WWSerialPort_IsON(ww_serial_port))
  197. Wonx_Error("comm_send_string", "Serial port is not opened.");
  198. printf("output to serial port : ");
  199. for (i = 0; string[i]; i++) {
  200. comm_output(string[i]);
  201. }
  202. printf("\n");
  203. fflush(stdout);
  204. ret = 0;
  205. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  206. printf("call : comm_send_string() : return value = %d\n", ret);
  207. fflush(stdout);
  208. /* タイマをもとに戻す */
  209. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  210. return (ret);
  211. }
  212. int comm_send_block(void * buffer, int size)
  213. {
  214. WWSerialPort ww_serial_port;
  215. int ret;
  216. int i;
  217. if (!Wonx_IsCreated()) Wonx_Create();
  218. /* タイマを一時停止する */
  219. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  220. printf("call : comm_send_block() : buffer = %p, size = %d\n", buffer, size);
  221. fflush(stdout);
  222. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  223. if (!WWSerialPort_IsON(ww_serial_port))
  224. Wonx_Error("comm_send_block", "Serial port is not opened.");
  225. printf("output to serial port : ");
  226. for (i = 0; i < size; i++) {
  227. comm_output(((char *)buffer)[i]);
  228. }
  229. printf("\n");
  230. fflush(stdout);
  231. ret = 0;
  232. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  233. printf("call : comm_send_block() : return value = %d\n", ret);
  234. fflush(stdout);
  235. /* タイマをもとに戻す */
  236. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  237. return (ret);
  238. }
  239. int comm_receive_block(void * buffer, int size)
  240. {
  241. WWSerialPort ww_serial_port;
  242. int ret;
  243. int c;
  244. int i;
  245. if (!Wonx_IsCreated()) Wonx_Create();
  246. /* タイマを一時停止する */
  247. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  248. printf("call : comm_receive_block() : buffer = %p, size = %d\n",
  249. buffer, size);
  250. fflush(stdout);
  251. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  252. if (!WWSerialPort_IsON(ww_serial_port))
  253. Wonx_Error("comm_receive_block", "Serial port is not opened.");
  254. ret = 0;
  255. for (i = 0; i < size; i++) {
  256. c = comm_input(WWSerialPort_GetReceiveTimeout(ww_serial_port));
  257. if (c == -1) {
  258. ret = ERR_SIO_TIMEOUT;
  259. break;
  260. }
  261. ((char *)buffer)[i] = c;
  262. }
  263. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  264. printf("call : comm_receive_block() : return value = %d\n", ret);
  265. fflush(stdout);
  266. /* タイマをもとに戻す */
  267. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  268. return (ret);
  269. }
  270. void comm_set_timeout(int recv_timeout, int send_timeout)
  271. {
  272. WWSerialPort ww_serial_port;
  273. if (!Wonx_IsCreated()) Wonx_Create();
  274. /* タイマを一時停止する */
  275. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  276. printf("call : comm_set_timeout() : receive_timeout = %d, send_timeout = %d\n", recv_timeout, send_timeout);
  277. fflush(stdout);
  278. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  279. WWSerialPort_SetReceiveTimeout(ww_serial_port, recv_timeout);
  280. WWSerialPort_SetSendTimeout( ww_serial_port, send_timeout);
  281. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  282. printf("call : comm_set_timeout() : return value = none\n");
  283. fflush(stdout);
  284. /* タイマをもとに戻す */
  285. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  286. return;
  287. }
  288. void comm_set_baudrate(int baudrate)
  289. {
  290. WWSerialPort ww_serial_port;
  291. if (!Wonx_IsCreated()) Wonx_Create();
  292. /* タイマを一時停止する */
  293. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  294. printf("call : comm_set_baudrate() : baudrate = %d\n", baudrate);
  295. fflush(stdout);
  296. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  297. switch (baudrate) {
  298. case COMM_SPEED_9600: WWSerialPort_SetBaudrate9600( ww_serial_port); break;
  299. case COMM_SPEED_38400: WWSerialPort_SetBaudrate38400(ww_serial_port); break;
  300. default: Wonx_Error("comm_set_baudrate", "Invalid baudrate");
  301. }
  302. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  303. printf("call : comm_set_baudrate() : return value = none\n");
  304. fflush(stdout);
  305. /* タイマをもとに戻す */
  306. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  307. return;
  308. }
  309. int comm_get_baudrate(void)
  310. {
  311. WWSerialPort ww_serial_port;
  312. int ret = 0;
  313. if (!Wonx_IsCreated()) Wonx_Create();
  314. /* タイマを一時停止する */
  315. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  316. printf("call : comm_get_baudrate() : \n");
  317. fflush(stdout);
  318. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  319. if (WWSerialPort_IsBaudrate9600(ww_serial_port))
  320. ret = COMM_SPEED_9600;
  321. else if (WWSerialPort_IsBaudrate38400(ww_serial_port))
  322. ret = COMM_SPEED_38400;
  323. else Wonx_Error("comm_get_baudrate", "Invalid baudrate");
  324. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  325. printf("call : comm_get_baudrate() : return value = %d\n", ret);
  326. fflush(stdout);
  327. /* タイマをもとに戻す */
  328. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  329. return (ret);
  330. }
  331. void comm_set_cancel_key(unsigned int pattern)
  332. {
  333. WWSerialPort ww_serial_port;
  334. if (!Wonx_IsCreated()) Wonx_Create();
  335. /* タイマを一時停止する */
  336. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  337. printf("call : comm_set_cancel_key() : pattern = %u\n", (int)pattern);
  338. fflush(stdout);
  339. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  340. WWSerialPort_SetCancelKey(ww_serial_port, pattern);
  341. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  342. printf("call : comm_set_cancel_key() : return value = none\n");
  343. fflush(stdout);
  344. /* タイマをもとに戻す */
  345. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  346. return;
  347. }
  348. unsigned int comm_get_cancel_key(void)
  349. {
  350. WWSerialPort ww_serial_port;
  351. unsigned int ret;
  352. if (!Wonx_IsCreated()) Wonx_Create();
  353. /* タイマを一時停止する */
  354. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  355. printf("call : comm_get_cancel_key() : \n");
  356. fflush(stdout);
  357. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  358. /* ここに処理を書く */
  359. ret = WWSerialPort_GetCancelKey(ww_serial_port);
  360. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  361. printf("call : comm_get_cancel_key() : return value = %u\n", (int)ret);
  362. fflush(stdout);
  363. /* タイマをもとに戻す */
  364. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  365. return (ret);
  366. }
  367. int comm_xmodem(void * xmodem)
  368. {
  369. WWSerialPort ww_serial_port;
  370. int ret;
  371. if (!Wonx_IsCreated()) Wonx_Create();
  372. /* タイマを一時停止する */
  373. UNIXTimer_Pause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  374. printf("call : comm_xmodem() : xmodem = %p\n", xmodem);
  375. fflush(stdout);
  376. ww_serial_port = WonxSerialPort_GetWWSerialPort(Wonx_GetWonxSerialPort());
  377. /* 未サポート */
  378. printf("call : comm_xmodem() : not supported.\n");
  379. fflush(stdout);
  380. ret = 0;
  381. WonxDisplay_Sync(Wonx_GetWonxDisplay());
  382. printf("call : comm_xmodem() : return value = %d\n", ret);
  383. fflush(stdout);
  384. /* タイマをもとに戻す */
  385. UNIXTimer_Unpause(WonxSystem_GetUNIXTimer(Wonx_GetWonxSystem()));
  386. return (ret);
  387. }
  388. /*****************************************************************************/
  389. /* ここまで */
  390. /*****************************************************************************/
  391. /*****************************************************************************/
  392. /* End of File. */
  393. /*****************************************************************************/