test-rs232.nut 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. __WIN32__ <- os.getenv("WINDIR") != null
  2. //local port_name = __WIN32__ ? "COM1" : "/dev/ttyUSB0";
  3. //local port_name = __WIN32__ ? "COM1" : "/dev/ttyS0";
  4. port_name <- __WIN32__ ? "COM1" : "/dev/ttyACM0";
  5. platform <- __WIN32__ ? "win32" : "linux";
  6. function time_stamp(){
  7. local t = os.date("*t");
  8. return format("[%02d.%02d.%d %02d:%02d:%02d] ",
  9. t.day, t.month, t.year,
  10. t.hour, t.min, t.sec);
  11. }
  12. local oldprint = print;
  13. function myprint(text){
  14. text = time_stamp() + text;
  15. oldprint(text);
  16. local fd = file("test_sqrs232_log.txt", "a+");
  17. fd.write(text + "\n");
  18. fd.close();
  19. }
  20. print = myprint;
  21. /*
  22. local string_delegate = port_name.getdelegate();
  23. string_delegate.lines <- function(str){
  24. return str.find_lua("([^\n]*)\n");
  25. }
  26. */
  27. function format_test(text, err){
  28. local ret = "\n";
  29. local line_number = 1;
  30. local si = get_last_stackinfo();
  31. local line_err = si.line;
  32. foreach( line in text.split('\n')) {
  33. if (line_number == line_err.tointeger())
  34. ret += format("--> %d. %s (%s)\n", line_number, line, err);
  35. else
  36. ret += format("% 8d. %s\n", line_number, line);
  37. ++line_number;
  38. }
  39. return ret;
  40. }
  41. function test(text){
  42. local chunk = compilestring(text);
  43. if (chunk == null){
  44. print(format([==[
  45. ---------------------------------------------------------------
  46. %s
  47. loadstring error: '%s'
  48. ---------------------------------------------------------------
  49. ]==], format_test(text, err), err))
  50. return false;
  51. }
  52. try {
  53. chunk();
  54. }
  55. catch(e){
  56. print(format([==[
  57. ---------------------------------------------------------------
  58. %s
  59. call error: '%s'
  60. ---------------------------------------------------------------
  61. ]==], format_test(text, e), e));
  62. //return false;
  63. }
  64. return true;
  65. }
  66. local baud_rates = [
  67. "SqRs232.RS232_BAUD_9600",
  68. "SqRs232.RS232_BAUD_19200",
  69. "SqRs232.RS232_BAUD_38400",
  70. "SqRs232.RS232_BAUD_57600",
  71. "SqRs232.RS232_BAUD_115200",
  72. ];
  73. // It's such a crap, Windows seems to not like 5 data
  74. // bits. If you make this test to work with 5 data bits on
  75. // Windows, I'll buy you a beer or two...
  76. local data_bits;
  77. if (platform == "win32"){
  78. data_bits = [
  79. "SqRs232.RS232_DATA_6",
  80. "SqRs232.RS232_DATA_7",
  81. "SqRs232.RS232_DATA_8",
  82. ];
  83. }
  84. else
  85. {
  86. data_bits = [
  87. "SqRs232.RS232_DATA_5",
  88. "SqRs232.RS232_DATA_6",
  89. "SqRs232.RS232_DATA_7",
  90. "SqRs232.RS232_DATA_8",
  91. ];
  92. }
  93. local stop_bits = [
  94. "SqRs232.RS232_STOP_1",
  95. "SqRs232.RS232_STOP_2",
  96. ];
  97. local parity_bits = [
  98. "SqRs232.RS232_PARITY_NONE",
  99. "SqRs232.RS232_PARITY_ODD",
  100. "SqRs232.RS232_PARITY_EVEN",
  101. ];
  102. local flow_bits = [
  103. "SqRs232.RS232_FLOW_OFF",
  104. "SqRs232.RS232_FLOW_HW",
  105. "SqRs232.RS232_FLOW_XON_XOFF",
  106. ];
  107. local dtr_bits = [
  108. "SqRs232.RS232_DTR_ON",
  109. "SqRs232.RS232_DTR_OFF",
  110. ];
  111. local rts_bits = [
  112. "SqRs232.RS232_RTS_ON",
  113. "SqRs232.RS232_RTS_OFF",
  114. ];
  115. local errors = [
  116. "SqRs232.RS232_ERR_NOERROR",
  117. "SqRs232.RS232_ERR_UNKNOWN",
  118. "SqRs232.RS232_ERR_OPEN",
  119. "SqRs232.RS232_ERR_CLOSE",
  120. "SqRs232.RS232_ERR_FLUSH",
  121. "SqRs232.RS232_ERR_CONFIG",
  122. "SqRs232.RS232_ERR_READ",
  123. "SqRs232.RS232_ERR_WRITE",
  124. "SqRs232.RS232_ERR_SELECT",
  125. "SqRs232.RS232_ERR_TIMEOUT",
  126. "SqRs232.RS232_ERR_IOCTL",
  127. "SqRs232.RS232_ERR_PORT_CLOSED",
  128. ];
  129. assert(
  130. test(format([==[
  131. local p = SqRs232();
  132. p.open("%s");
  133. assert(p.close() == SqRs232.RS232_ERR_NOERROR);
  134. ]==], port_name))
  135. );
  136. assert(
  137. test([==[
  138. local p = SqRs232();
  139. p.open("/dev/hell");
  140. ]==])
  141. );
  142. foreach(baud in baud_rates) {
  143. foreach(data in data_bits) {
  144. foreach(parity in parity_bits) {
  145. foreach(stop in stop_bits) {
  146. foreach(flow in flow_bits) {
  147. foreach(dtr in dtr_bits) {
  148. foreach(rts in rts_bits) {
  149. assert(
  150. test(
  151. format([==[
  152. local p = SqRs232();
  153. p.open("%s");
  154. local bret = p.strerror(p.baud_rate(%s));
  155. local dret = p.strerror(p.data_bits(%s));
  156. local pret = p.strerror(p.parity(%s));
  157. local sret = p.strerror(p.stop_bits(%s));
  158. local fret = p.strerror(p.flow_control(%s));
  159. local dtr_ret = p.strerror(p.dtr(%s));
  160. local rts_ret = p.strerror(p.rts(%s));
  161. local text = p.tostring();
  162. assert(text != null);
  163. local errors = "";
  164. if (bret != "no error") errors = "set baud rate,";
  165. if (dret != "no error") errors += "set data bits,";
  166. if (pret != "no error") errors += "set parity,";
  167. if (sret != "no error") errors += "set stop bits,";
  168. if (fret != "no error") errors += "set flow control";
  169. if (dtr_ret != "no error") errors += "set dtr";
  170. if (rts_ret != "no error") errors += "set rts";
  171. if (errors.len() > 0) print(format(" [!] ERROR: %%s (failed: %%s)", text, errors));
  172. else print(format(" [!] OK: %%s", text));
  173. assert(p.close() == SqRs232.RS232_ERR_NOERROR);
  174. ]==], port_name, baud, data, parity, stop, flow, dtr, rts)
  175. )
  176. );
  177. }
  178. }
  179. }
  180. }
  181. }
  182. }
  183. }
  184. foreach(baud in baud_rates) {
  185. foreach(data in data_bits) {
  186. foreach(parity in parity_bits) {
  187. foreach(stop in stop_bits) {
  188. foreach(flow in flow_bits) {
  189. foreach(dtr in dtr_bits) {
  190. foreach(rts in rts_bits) {
  191. assert(
  192. test(
  193. format([==[
  194. local timeout = 10;
  195. local p = SqRs232();
  196. p.open("%s");
  197. assert(p.baud_rate(%s) == SqRs232.RS232_ERR_NOERROR);
  198. assert(p.data_bits(%s) == SqRs232.RS232_ERR_NOERROR);
  199. assert(p.parity(%s) == SqRs232.RS232_ERR_NOERROR);
  200. assert(p.stop_bits(%s) == SqRs232.RS232_ERR_NOERROR);
  201. assert(p.flow_control(%s) == SqRs232.RS232_ERR_NOERROR);
  202. assert(p.dtr(%s) == SqRs232.RS232_ERR_NOERROR);
  203. assert(p.rts(%s) == SqRs232.RS232_ERR_NOERROR);
  204. local baud = p.baud_rate();
  205. local str_baud1 = p.baud_rate_tostring();
  206. local str_baud2 = p.baud_rate_tostring(baud);
  207. assert(str_baud1 == str_baud2);
  208. local bits = p.data_bits();
  209. local str_bits1 = p.data_bits_tostring();
  210. local str_bits2 = p.data_bits_tostring(bits);
  211. assert(str_bits1 == str_bits2);
  212. local parity = p.parity();
  213. local str_parity1 = p.parity_tostring();
  214. local str_parity2 = p.parity_tostring(parity);
  215. assert(str_parity1 == str_parity2);
  216. local stop = p.stop_bits();
  217. local str_stop1 = p.stop_bits_tostring();
  218. local str_stop2 = p.stop_bits_tostring(stop);
  219. assert(str_stop1 == str_stop2);
  220. local flow = p.flow_control();
  221. local str_flow1 = p.flow_control_tostring();
  222. local str_flow2 = p.flow_control_tostring(flow);
  223. assert(str_flow1 == str_flow2);
  224. local dtr = p.dtr();
  225. local str_dtr1 = p.dtr_tostring();
  226. local str_dtr2 = p.dtr_tostring(dtr);
  227. assert(str_dtr1 == str_dtr2);
  228. local rts = p.rts();
  229. local str_rts1 = p.rts_tostring();
  230. local str_rts2 = p.rts_tostring(rts);
  231. assert(str_rts1 == str_rts2);
  232. local e = p.flush();
  233. assert(e == SqRs232.RS232_ERR_NOERROR);
  234. local data = p.read(1, timeout);
  235. if(type(data) == "integer") assert(data == SqRs232.RS232_ERR_TIMEOUT);
  236. //assert(d == nil);
  237. //assert(l == 0);
  238. // not implemented yet...
  239. if (platform != "win32"){
  240. local forced = true;
  241. data = p.read(1, timeout, forced)
  242. if(type(data) == "integer") assert(data == SqRs232.RS232_ERR_TIMEOUT)
  243. //assert(d == nil)
  244. //assert(l == 0)
  245. }
  246. local forced = false;
  247. data = p.read(1, timeout, forced);
  248. if(type(data) == "integer") assert(data == SqRs232.RS232_ERR_TIMEOUT)
  249. //assert(d == nil)
  250. //assert(l == 0)
  251. e = p.write("ynezz")
  252. if(e < 0) assert(e == SqRs232.RS232_ERR_NOERROR)
  253. // althought the write is successful it returns 0 bytes written
  254. // in some baud/data/stop/flow combinations...
  255. if (platform != "win32") assert(e == 5);
  256. e = p.write("ynezz", timeout)
  257. if(e < 0) assert(e == SqRs232.RS232_ERR_NOERROR);
  258. // althought the write is successful it returns 0 bytes written
  259. // in some baud/data/stop/flow combinations...
  260. if (platform != "win32") assert(e == 5);
  261. local text = p.tostring();
  262. assert(text != null)
  263. print("tostring(p): " + text);
  264. assert(p.close() == SqRs232.RS232_ERR_NOERROR);
  265. ]==], port_name, baud, data, parity, stop, flow, dtr, rts)
  266. )
  267. );
  268. }
  269. }
  270. }
  271. }
  272. }
  273. }
  274. }
  275. print("[*] All tests passed succesfuly!");