comm.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
  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/comm.h"
  12. #include "wonx_configure.h"
  13. #include "WonX.h"
  14. #include "WonXSerialPort.h"
  15. #include "WWSerialPort.h"
  16. #include "UNIXSerialPort.h"
  17. #include "etc.h"
  18. /*****************************************************************************/
  19. /* 互換関数の定義 */
  20. /*****************************************************************************/
  21. /*
  22. * Xサーバとの同期の整合性がとれなくなるなどの問題が考えられるので,
  23. * 互換関数の内部は UNIXTimer_Pause(), UNIXTimer_Unpause() でくくり,
  24. * タイマ割り込みを一時停止して処理を行う.また,unpause するまえに,
  25. * かならず sync するようにする.
  26. */
  27. /*
  28. * タイマの一時停止の2重解除の問題が出てくるので,
  29. * 互換関数から互換関数を呼んではいけない.
  30. * (一時停止はネストされるが,いちおう)
  31. * 似たような処理をする関数の場合は,必ず static な別関数に処理をまとめ,
  32. * そっちを呼び出すようにすること.
  33. * 引数の表示の問題もあるしね.
  34. */
  35. void comm_open(void)
  36. {
  37. WonXSerialPort wonx_serial_port;
  38. WWSerialPort ww_serial_port;
  39. UNIXSerialPort unix_serial_port;
  40. if (!WonX_IsCreated()) WonX_Create();
  41. /* タイマを一時停止する */
  42. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  43. printf("call : comm_open() : \n");
  44. fflush(stdout);
  45. wonx_serial_port = WonX_GetWonXSerialPort();
  46. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  47. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  48. if (WWSerialPort_IsOpened(ww_serial_port))
  49. WonX_Warning("comm_open", "WW serial port has already opened.");
  50. WWSerialPort_Open(ww_serial_port);
  51. if (UNIXSerialPort_IsOpened(unix_serial_port))
  52. WonX_Warning("comm_open", "UNIX serial port has already opened.");
  53. UNIXSerialPort_Open(unix_serial_port);
  54. WonXDisplay_Sync(WonX_GetWonXDisplay());
  55. printf("call : comm_open() : return value = none\n");
  56. fflush(stdout);
  57. /* タイマをもとに戻す */
  58. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  59. return;
  60. }
  61. void comm_close(void)
  62. {
  63. WonXSerialPort wonx_serial_port;
  64. WWSerialPort ww_serial_port;
  65. UNIXSerialPort unix_serial_port;
  66. if (!WonX_IsCreated()) WonX_Create();
  67. /* タイマを一時停止する */
  68. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  69. printf("call : comm_close() : \n");
  70. fflush(stdout);
  71. wonx_serial_port = WonX_GetWonXSerialPort();
  72. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  73. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  74. if (!WWSerialPort_IsClosed(ww_serial_port))
  75. WonX_Warning("comm_close", "WW serial port is not opened.");
  76. WWSerialPort_Close(ww_serial_port);
  77. if (!UNIXSerialPort_IsClosed(unix_serial_port))
  78. WonX_Warning("comm_close", "UNIX serial port is not opened.");
  79. UNIXSerialPort_Close(unix_serial_port);
  80. WonXDisplay_Sync(WonX_GetWonXDisplay());
  81. printf("call : comm_close() : return value = none\n");
  82. fflush(stdout);
  83. /* タイマをもとに戻す */
  84. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  85. return;
  86. }
  87. static void comm_output(unsigned char c)
  88. {
  89. WonXSerialPort wonx_serial_port;
  90. UNIXSerialPort unix_serial_port;
  91. wonx_serial_port = WonX_GetWonXSerialPort();
  92. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  93. UNIXSerialPort_SendCharacter(unix_serial_port, c);
  94. return;
  95. }
  96. static int comm_input(int timeout)
  97. {
  98. WonXSerialPort wonx_serial_port;
  99. UNIXSerialPort unix_serial_port;
  100. int c;
  101. wonx_serial_port = WonX_GetWonXSerialPort();
  102. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  103. c = UNIXSerialPort_ReceiveCharacter(unix_serial_port,
  104. WONX_SERIAL_PORT_TIMETICKS * timeout);
  105. return (c);
  106. }
  107. int comm_send_char(unsigned char c)
  108. {
  109. WonXSerialPort wonx_serial_port;
  110. WWSerialPort ww_serial_port;
  111. UNIXSerialPort unix_serial_port;
  112. int ret;
  113. if (!WonX_IsCreated()) WonX_Create();
  114. /* タイマを一時停止する */
  115. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  116. printf("call : comm_send_char() : character = \'");
  117. wonx_print_character(stdout, c);
  118. printf("\'\n");
  119. fflush(stdout);
  120. wonx_serial_port = WonX_GetWonXSerialPort();
  121. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  122. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  123. if (!WWSerialPort_IsOpened(ww_serial_port))
  124. WonX_Error("comm_send_char", "WW serial port is not opened.");
  125. if (!UNIXSerialPort_IsOpened(unix_serial_port))
  126. WonX_Error("comm_send_char", "UNIX 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. WonXSerialPort wonx_serial_port;
  142. WWSerialPort ww_serial_port;
  143. UNIXSerialPort unix_serial_port;
  144. int c;
  145. int ret;
  146. if (!WonX_IsCreated()) WonX_Create();
  147. /* タイマを一時停止する */
  148. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  149. printf("call : comm_receive_char() : \n");
  150. fflush(stdout);
  151. wonx_serial_port = WonX_GetWonXSerialPort();
  152. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  153. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  154. if (!WWSerialPort_IsOpened(ww_serial_port))
  155. WonX_Error("comm_receive_char", "WW serial port is not opened.");
  156. if (!UNIXSerialPort_IsOpened(unix_serial_port))
  157. WonX_Error("comm_receive_char", "UNIX serial port is not opened.");
  158. c = comm_input(WWSerialPort_GetReceiveTimeout(ww_serial_port));
  159. if (c == -1) ret = ERR_SIO_TIMEOUT;
  160. else ret = c;
  161. WonXDisplay_Sync(WonX_GetWonXDisplay());
  162. printf("call : comm_receive_char() : return value = %d\n", ret);
  163. fflush(stdout);
  164. /* タイマをもとに戻す */
  165. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  166. return (ret);
  167. }
  168. int comm_receive_with_timeout(int timeout)
  169. {
  170. WonXSerialPort wonx_serial_port;
  171. WWSerialPort ww_serial_port;
  172. UNIXSerialPort unix_serial_port;
  173. int c;
  174. int ret;
  175. if (!WonX_IsCreated()) WonX_Create();
  176. /* タイマを一時停止する */
  177. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  178. printf("call : comm_receive_with_timeout() : timeout = %d\n", timeout);
  179. fflush(stdout);
  180. wonx_serial_port = WonX_GetWonXSerialPort();
  181. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  182. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  183. if (!WWSerialPort_IsOpened(ww_serial_port))
  184. WonX_Error("comm_receive_with_timeout", "WW serial port is not opened.");
  185. if (!UNIXSerialPort_IsOpened(unix_serial_port))
  186. WonX_Error("comm_receive_with_timeout", "UNIX serial port is not opened.");
  187. c = comm_input(timeout);
  188. if (c == -1) ret = ERR_SIO_TIMEOUT;
  189. else ret = c;
  190. WonXDisplay_Sync(WonX_GetWonXDisplay());
  191. printf("call : comm_receive_with_timeout() : return value = %d\n", ret);
  192. fflush(stdout);
  193. /* タイマをもとに戻す */
  194. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  195. return (ret);
  196. }
  197. int comm_send_string(char * string)
  198. {
  199. WonXSerialPort wonx_serial_port;
  200. WWSerialPort ww_serial_port;
  201. UNIXSerialPort unix_serial_port;
  202. int ret;
  203. char * p;
  204. int i;
  205. if (!WonX_IsCreated()) WonX_Create();
  206. /* タイマを一時停止する */
  207. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  208. printf("call : comm_send_string() : string = \"");
  209. for (p = string; *p != '\0'; p++) wonx_print_character(stdout, *p);
  210. printf("\"\n");
  211. fflush(stdout);
  212. wonx_serial_port = WonX_GetWonXSerialPort();
  213. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  214. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  215. if (!WWSerialPort_IsOpened(ww_serial_port))
  216. WonX_Error("comm_send_string", "WW serial port is not opened.");
  217. if (!UNIXSerialPort_IsOpened(unix_serial_port))
  218. WonX_Error("comm_send_string", "UNIX serial port is not opened.");
  219. printf("output to serial port : \"");
  220. for (i = 0; string[i]; i++) {
  221. comm_output(string[i]);
  222. }
  223. printf("\"\n");
  224. fflush(stdout);
  225. ret = 0;
  226. WonXDisplay_Sync(WonX_GetWonXDisplay());
  227. printf("call : comm_send_string() : return value = %d\n", ret);
  228. fflush(stdout);
  229. /* タイマをもとに戻す */
  230. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  231. return (ret);
  232. }
  233. int comm_send_block(void * buffer, int size)
  234. {
  235. WonXSerialPort wonx_serial_port;
  236. WWSerialPort ww_serial_port;
  237. UNIXSerialPort unix_serial_port;
  238. int ret;
  239. int i;
  240. if (!WonX_IsCreated()) WonX_Create();
  241. /* タイマを一時停止する */
  242. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  243. printf("call : comm_send_block() : buffer = %p, size = %d\n", buffer, size);
  244. fflush(stdout);
  245. wonx_serial_port = WonX_GetWonXSerialPort();
  246. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  247. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  248. if (!WWSerialPort_IsOpened(ww_serial_port))
  249. WonX_Error("comm_send_block", "WW serial port is not opened.");
  250. if (!UNIXSerialPort_IsOpened(unix_serial_port))
  251. WonX_Error("comm_send_block", "UNIX serial port is not opened.");
  252. printf("output to serial port : \"");
  253. for (i = 0; i < size; i++) {
  254. comm_output(((char *)buffer)[i]);
  255. }
  256. printf("\"\n");
  257. fflush(stdout);
  258. ret = 0;
  259. WonXDisplay_Sync(WonX_GetWonXDisplay());
  260. printf("call : comm_send_block() : return value = %d\n", ret);
  261. fflush(stdout);
  262. /* タイマをもとに戻す */
  263. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  264. return (ret);
  265. }
  266. int comm_receive_block(void * buffer, int size)
  267. {
  268. WonXSerialPort wonx_serial_port;
  269. WWSerialPort ww_serial_port;
  270. UNIXSerialPort unix_serial_port;
  271. int ret;
  272. int c;
  273. int i;
  274. if (!WonX_IsCreated()) WonX_Create();
  275. /* タイマを一時停止する */
  276. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  277. printf("call : comm_receive_block() : buffer = %p, size = %d\n",
  278. buffer, size);
  279. fflush(stdout);
  280. wonx_serial_port = WonX_GetWonXSerialPort();
  281. ww_serial_port = WonXSerialPort_GetWWSerialPort(wonx_serial_port);
  282. unix_serial_port = WonXSerialPort_GetUNIXSerialPort(wonx_serial_port);
  283. if (!WWSerialPort_IsOpened(ww_serial_port))
  284. WonX_Error("comm_receive_block", "WW serial port is not opened.");
  285. if (!UNIXSerialPort_IsOpened(unix_serial_port))
  286. WonX_Error("comm_receive_block", "UNIX serial port is not opened.");
  287. ret = 0;
  288. for (i = 0; i < size; i++) {
  289. c = comm_input(WWSerialPort_GetReceiveTimeout(ww_serial_port));
  290. if (c == -1) {
  291. ret = ERR_SIO_TIMEOUT;
  292. break;
  293. }
  294. ((char *)buffer)[i] = c;
  295. }
  296. WonXDisplay_Sync(WonX_GetWonXDisplay());
  297. printf("call : comm_receive_block() : return value = %d\n", ret);
  298. fflush(stdout);
  299. /* タイマをもとに戻す */
  300. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  301. return (ret);
  302. }
  303. void comm_set_timeout(int recv_timeout, int send_timeout)
  304. {
  305. WWSerialPort ww_serial_port;
  306. if (!WonX_IsCreated()) WonX_Create();
  307. /* タイマを一時停止する */
  308. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  309. printf("call : comm_set_timeout() : receive_timeout = %d, send_timeout = %d\n", recv_timeout, send_timeout);
  310. fflush(stdout);
  311. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  312. WWSerialPort_SetReceiveTimeout(ww_serial_port, recv_timeout);
  313. WWSerialPort_SetSendTimeout( ww_serial_port, send_timeout);
  314. WonXDisplay_Sync(WonX_GetWonXDisplay());
  315. printf("call : comm_set_timeout() : return value = none\n");
  316. fflush(stdout);
  317. /* タイマをもとに戻す */
  318. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  319. return;
  320. }
  321. void comm_set_baudrate(int baudrate)
  322. {
  323. WWSerialPort ww_serial_port;
  324. if (!WonX_IsCreated()) WonX_Create();
  325. /* タイマを一時停止する */
  326. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  327. printf("call : comm_set_baudrate() : baudrate = %d\n", baudrate);
  328. fflush(stdout);
  329. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  330. switch (baudrate) {
  331. case COMM_SPEED_9600: WWSerialPort_SetBaudrate9600( ww_serial_port); break;
  332. case COMM_SPEED_38400: WWSerialPort_SetBaudrate38400(ww_serial_port); break;
  333. default: WonX_Error("comm_set_baudrate", "Invalid baudrate");
  334. }
  335. WonXDisplay_Sync(WonX_GetWonXDisplay());
  336. printf("call : comm_set_baudrate() : return value = none\n");
  337. fflush(stdout);
  338. /* タイマをもとに戻す */
  339. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  340. return;
  341. }
  342. int comm_get_baudrate(void)
  343. {
  344. WWSerialPort ww_serial_port;
  345. int ret = 0;
  346. if (!WonX_IsCreated()) WonX_Create();
  347. /* タイマを一時停止する */
  348. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  349. printf("call : comm_get_baudrate() : \n");
  350. fflush(stdout);
  351. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  352. if (WWSerialPort_IsBaudrate9600(ww_serial_port))
  353. ret = COMM_SPEED_9600;
  354. else if (WWSerialPort_IsBaudrate38400(ww_serial_port))
  355. ret = COMM_SPEED_38400;
  356. else WonX_Error("comm_get_baudrate", "Invalid baudrate");
  357. WonXDisplay_Sync(WonX_GetWonXDisplay());
  358. printf("call : comm_get_baudrate() : return value = %d\n", ret);
  359. fflush(stdout);
  360. /* タイマをもとに戻す */
  361. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  362. return (ret);
  363. }
  364. void comm_set_cancel_key(unsigned int pattern)
  365. {
  366. WWSerialPort ww_serial_port;
  367. if (!WonX_IsCreated()) WonX_Create();
  368. /* タイマを一時停止する */
  369. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  370. printf("call : comm_set_cancel_key() : pattern = %u\n", (int)pattern);
  371. fflush(stdout);
  372. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  373. WWSerialPort_SetCancelKey(ww_serial_port, pattern);
  374. WonXDisplay_Sync(WonX_GetWonXDisplay());
  375. printf("call : comm_set_cancel_key() : return value = none\n");
  376. fflush(stdout);
  377. /* タイマをもとに戻す */
  378. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  379. return;
  380. }
  381. unsigned int comm_get_cancel_key(void)
  382. {
  383. WWSerialPort ww_serial_port;
  384. unsigned int ret;
  385. if (!WonX_IsCreated()) WonX_Create();
  386. /* タイマを一時停止する */
  387. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  388. printf("call : comm_get_cancel_key() : \n");
  389. fflush(stdout);
  390. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  391. /* ここに処理を書く */
  392. ret = WWSerialPort_GetCancelKey(ww_serial_port);
  393. WonXDisplay_Sync(WonX_GetWonXDisplay());
  394. printf("call : comm_get_cancel_key() : return value = %u\n", (int)ret);
  395. fflush(stdout);
  396. /* タイマをもとに戻す */
  397. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  398. return (ret);
  399. }
  400. int comm_xmodem(void * xmodem)
  401. {
  402. WWSerialPort ww_serial_port;
  403. int ret;
  404. if (!WonX_IsCreated()) WonX_Create();
  405. /* タイマを一時停止する */
  406. UNIXTimer_Pause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  407. printf("call : comm_xmodem() : xmodem = %p\n", xmodem);
  408. fflush(stdout);
  409. ww_serial_port = WonXSerialPort_GetWWSerialPort(WonX_GetWonXSerialPort());
  410. /* 未サポート */
  411. printf("call : comm_xmodem() : not supported.\n");
  412. fflush(stdout);
  413. ret = 0;
  414. WonXDisplay_Sync(WonX_GetWonXDisplay());
  415. printf("call : comm_xmodem() : return value = %d\n", ret);
  416. fflush(stdout);
  417. /* タイマをもとに戻す */
  418. UNIXTimer_Unpause(WonXSystem_GetUNIXTimer(WonX_GetWonXSystem()));
  419. return (ret);
  420. }
  421. /*****************************************************************************/
  422. /* ここまで */
  423. /*****************************************************************************/
  424. /*****************************************************************************/
  425. /* End of File. */
  426. /*****************************************************************************/