|
@@ -0,0 +1,324 @@
|
|
|
|
|
+local __WIN32__ = os.getenv("WINDIR") != null
|
|
|
|
|
+
|
|
|
|
|
+//local port_name = __WIN32__ ? "COM1" : "/dev/ttyUSB0";
|
|
|
|
|
+local port_name = __WIN32__ ? "COM1" : "/dev/ttyS0";
|
|
|
|
|
+local platform = __WIN32__ ? "win32" : "linux";
|
|
|
|
|
+
|
|
|
|
|
+function time_stamp(){
|
|
|
|
|
+ local t = os.date("*t");
|
|
|
|
|
+ return format("[%02d.%02d.%d %02d:%02d:%02d] ",
|
|
|
|
|
+ t.day, t.month, t.year,
|
|
|
|
|
+ t.hour, t.min, t.sec);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+local oldprint = print;
|
|
|
|
|
+
|
|
|
|
|
+function myprint(text){
|
|
|
|
|
+ text = time_stamp() + text;
|
|
|
|
|
+ oldprint(text);
|
|
|
|
|
+ local fd = file("test_sqrs232_log.txt", "a+");
|
|
|
|
|
+ fd.write(text + "\n");
|
|
|
|
|
+ fd.close();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+print = myprint;
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+local string_delegate = port_name.getdelegate();
|
|
|
|
|
+string_delegate.lines <- function(str){
|
|
|
|
|
+ return str.find_lua("([^\n]*)\n");
|
|
|
|
|
+}
|
|
|
|
|
+*/
|
|
|
|
|
+
|
|
|
|
|
+function format_test(text, err){
|
|
|
|
|
+ local ret = "\n";
|
|
|
|
|
+ local line_number = 1;
|
|
|
|
|
+ local si = get_last_stackinfo();
|
|
|
|
|
+ local line_err = si.line;
|
|
|
|
|
+
|
|
|
|
|
+ foreach( line in text.split("\n")) {
|
|
|
|
|
+ if (line_number == line_err.tointeger())
|
|
|
|
|
+ ret += format("--> %d. %s (%s)\n", line_number, line, err);
|
|
|
|
|
+ else
|
|
|
|
|
+ ret += format("% 8d. %s\n", line_number, line);
|
|
|
|
|
+ ++line_number;
|
|
|
|
|
+ }
|
|
|
|
|
+ return ret;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function test(text){
|
|
|
|
|
+ local chunk = compilestring(text);
|
|
|
|
|
+ if (chunk == null){
|
|
|
|
|
+ print(format([==[
|
|
|
|
|
+---------------------------------------------------------------
|
|
|
|
|
+%s
|
|
|
|
|
+loadstring error: '%s'
|
|
|
|
|
+---------------------------------------------------------------
|
|
|
|
|
+]==], format_test(text, err), err))
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ chunk();
|
|
|
|
|
+ }
|
|
|
|
|
+ catch(e){
|
|
|
|
|
+ print(format([==[
|
|
|
|
|
+---------------------------------------------------------------
|
|
|
|
|
+%s
|
|
|
|
|
+call error: '%s'
|
|
|
|
|
+---------------------------------------------------------------
|
|
|
|
|
+]==], format_test(text, e), e));
|
|
|
|
|
+ //return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+local baud_rates = [
|
|
|
|
|
+ "SqRs232.RS232_BAUD_9600",
|
|
|
|
|
+ "SqRs232.RS232_BAUD_19200",
|
|
|
|
|
+ "SqRs232.RS232_BAUD_38400",
|
|
|
|
|
+ "SqRs232.RS232_BAUD_57600",
|
|
|
|
|
+ "SqRs232.RS232_BAUD_115200",
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+// It's such a crap, Windows seems to not like 5 data
|
|
|
|
|
+// bits. If you make this test to work with 5 data bits on
|
|
|
|
|
+// Windows, I'll buy you a beer or two...
|
|
|
|
|
+local data_bits;
|
|
|
|
|
+
|
|
|
|
|
+if (platform == "win32"){
|
|
|
|
|
+ data_bits = [
|
|
|
|
|
+ "SqRs232.RS232_DATA_6",
|
|
|
|
|
+ "SqRs232.RS232_DATA_7",
|
|
|
|
|
+ "SqRs232.RS232_DATA_8",
|
|
|
|
|
+ ];
|
|
|
|
|
+}
|
|
|
|
|
+else
|
|
|
|
|
+{
|
|
|
|
|
+ data_bits = [
|
|
|
|
|
+ "SqRs232.RS232_DATA_5",
|
|
|
|
|
+ "SqRs232.RS232_DATA_6",
|
|
|
|
|
+ "SqRs232.RS232_DATA_7",
|
|
|
|
|
+ "SqRs232.RS232_DATA_8",
|
|
|
|
|
+ ];
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+local stop_bits = [
|
|
|
|
|
+ "SqRs232.RS232_STOP_1",
|
|
|
|
|
+ "SqRs232.RS232_STOP_2",
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+local parity_bits = [
|
|
|
|
|
+ "SqRs232.RS232_PARITY_NONE",
|
|
|
|
|
+ "SqRs232.RS232_PARITY_ODD",
|
|
|
|
|
+ "SqRs232.RS232_PARITY_EVEN",
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+local flow_bits = [
|
|
|
|
|
+ "SqRs232.RS232_FLOW_OFF",
|
|
|
|
|
+ "SqRs232.RS232_FLOW_HW",
|
|
|
|
|
+ "SqRs232.RS232_FLOW_XON_XOFF",
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+local dtr_bits = [
|
|
|
|
|
+ "SqRs232.RS232_DTR_ON",
|
|
|
|
|
+ "SqRs232.RS232_DTR_OFF",
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+local rts_bits = [
|
|
|
|
|
+ "SqRs232.RS232_RTS_ON",
|
|
|
|
|
+ "SqRs232.RS232_RTS_OFF",
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+local errors = [
|
|
|
|
|
+ "SqRs232.RS232_ERR_NOERROR",
|
|
|
|
|
+ "SqRs232.RS232_ERR_UNKNOWN",
|
|
|
|
|
+ "SqRs232.RS232_ERR_OPEN",
|
|
|
|
|
+ "SqRs232.RS232_ERR_CLOSE",
|
|
|
|
|
+ "SqRs232.RS232_ERR_FLUSH",
|
|
|
|
|
+ "SqRs232.RS232_ERR_CONFIG",
|
|
|
|
|
+ "SqRs232.RS232_ERR_READ",
|
|
|
|
|
+ "SqRs232.RS232_ERR_WRITE",
|
|
|
|
|
+ "SqRs232.RS232_ERR_SELECT",
|
|
|
|
|
+ "SqRs232.RS232_ERR_TIMEOUT",
|
|
|
|
|
+ "SqRs232.RS232_ERR_IOCTL",
|
|
|
|
|
+ "SqRs232.RS232_ERR_PORT_CLOSED",
|
|
|
|
|
+];
|
|
|
|
|
+
|
|
|
|
|
+assert(
|
|
|
|
|
+ test(format([==[
|
|
|
|
|
+ local p = SqRs232();
|
|
|
|
|
+ p.open("%s");
|
|
|
|
|
+ assert(p.close() == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ ]==], port_name))
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+assert(
|
|
|
|
|
+ test([==[
|
|
|
|
|
+ local p = SqRs232();
|
|
|
|
|
+ p.open("/dev/hell");
|
|
|
|
|
+ ]==])
|
|
|
|
|
+);
|
|
|
|
|
+
|
|
|
|
|
+foreach(baud in baud_rates) {
|
|
|
|
|
+ foreach(data in data_bits) {
|
|
|
|
|
+ foreach(parity in parity_bits) {
|
|
|
|
|
+ foreach(stop in stop_bits) {
|
|
|
|
|
+ foreach(flow in flow_bits) {
|
|
|
|
|
+ foreach(dtr in dtr_bits) {
|
|
|
|
|
+ foreach(rts in rts_bits) {
|
|
|
|
|
+ assert(
|
|
|
|
|
+ test(
|
|
|
|
|
+ format([==[
|
|
|
|
|
+ local p = SqRs232();
|
|
|
|
|
+ p.open("%s");
|
|
|
|
|
+
|
|
|
|
|
+ local bret = p.strerror(p.baud_rate(%s));
|
|
|
|
|
+ local dret = p.strerror(p.data_bits(%s));
|
|
|
|
|
+ local pret = p.strerror(p.parity(%s));
|
|
|
|
|
+ local sret = p.strerror(p.stop_bits(%s));
|
|
|
|
|
+ local fret = p.strerror(p.flow_control(%s));
|
|
|
|
|
+ local dtr_ret = p.strerror(p.dtr(%s));
|
|
|
|
|
+ local rts_ret = p.strerror(p.rts(%s));
|
|
|
|
|
+
|
|
|
|
|
+ local text = p.tostring();
|
|
|
|
|
+ assert(text != null);
|
|
|
|
|
+
|
|
|
|
|
+ local errors = "";
|
|
|
|
|
+ if (bret != "no error") errors = "set baud rate,";
|
|
|
|
|
+ if (dret != "no error") errors += "set data bits,";
|
|
|
|
|
+ if (pret != "no error") errors += "set parity,";
|
|
|
|
|
+ if (sret != "no error") errors += "set stop bits,";
|
|
|
|
|
+ if (fret != "no error") errors += "set flow control";
|
|
|
|
|
+ if (dtr_ret != "no error") errors += "set dtr";
|
|
|
|
|
+ if (rts_ret != "no error") errors += "set rts";
|
|
|
|
|
+
|
|
|
|
|
+ if (errors.len() > 0) print(format(" [!] ERROR: %%s (failed: %%s)", text, errors));
|
|
|
|
|
+ else print(format(" [!] OK: %%s", text));
|
|
|
|
|
+
|
|
|
|
|
+ assert(p.close() == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ ]==], port_name, baud, data, parity, stop, flow, dtr, rts)
|
|
|
|
|
+ )
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+foreach(baud in baud_rates) {
|
|
|
|
|
+ foreach(data in data_bits) {
|
|
|
|
|
+ foreach(parity in parity_bits) {
|
|
|
|
|
+ foreach(stop in stop_bits) {
|
|
|
|
|
+ foreach(flow in flow_bits) {
|
|
|
|
|
+ foreach(dtr in dtr_bits) {
|
|
|
|
|
+ foreach(rts in rts_bits) {
|
|
|
|
|
+ assert(
|
|
|
|
|
+ test(
|
|
|
|
|
+ format([==[
|
|
|
|
|
+ local timeout = 10;
|
|
|
|
|
+ local p = SqRs232();
|
|
|
|
|
+ p.open("%s");
|
|
|
|
|
+
|
|
|
|
|
+ assert(p.baud_rate(%s) == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ assert(p.data_bits(%s) == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ assert(p.parity(%s) == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ assert(p.stop_bits(%s) == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ assert(p.flow_control(%s) == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ assert(p.dtr(%s) == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ assert(p.rts(%s) == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+
|
|
|
|
|
+ local baud = p.baud_rate();
|
|
|
|
|
+ local str_baud1 = p.baud_rate_tostring();
|
|
|
|
|
+ local str_baud2 = p.baud_rate_tostring(baud);
|
|
|
|
|
+ assert(str_baud1 == str_baud2);
|
|
|
|
|
+
|
|
|
|
|
+ local bits = p.data_bits();
|
|
|
|
|
+ local str_bits1 = p.data_bits_tostring();
|
|
|
|
|
+ local str_bits2 = p.data_bits_tostring(bits);
|
|
|
|
|
+ assert(str_bits1 == str_bits2);
|
|
|
|
|
+
|
|
|
|
|
+ local parity = p.parity();
|
|
|
|
|
+ local str_parity1 = p.parity_tostring();
|
|
|
|
|
+ local str_parity2 = p.parity_tostring(parity);
|
|
|
|
|
+ assert(str_parity1 == str_parity2);
|
|
|
|
|
+
|
|
|
|
|
+ local stop = p.stop_bits();
|
|
|
|
|
+ local str_stop1 = p.stop_bits_tostring();
|
|
|
|
|
+ local str_stop2 = p.stop_bits_tostring(stop);
|
|
|
|
|
+ assert(str_stop1 == str_stop2);
|
|
|
|
|
+
|
|
|
|
|
+ local flow = p.flow_control();
|
|
|
|
|
+ local str_flow1 = p.flow_control_tostring();
|
|
|
|
|
+ local str_flow2 = p.flow_control_tostring(flow);
|
|
|
|
|
+ assert(str_flow1 == str_flow2);
|
|
|
|
|
+
|
|
|
|
|
+ local dtr = p.dtr();
|
|
|
|
|
+ local str_dtr1 = p.dtr_tostring();
|
|
|
|
|
+ local str_dtr2 = p.dtr_tostring(dtr);
|
|
|
|
|
+ assert(str_dtr1 == str_dtr2);
|
|
|
|
|
+
|
|
|
|
|
+ local rts = p.rts();
|
|
|
|
|
+ local str_rts1 = p.rts_tostring();
|
|
|
|
|
+ local str_rts2 = p.rts_tostring(rts);
|
|
|
|
|
+ assert(str_rts1 == str_rts2);
|
|
|
|
|
+
|
|
|
|
|
+ local e = p.flush();
|
|
|
|
|
+ assert(e == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+
|
|
|
|
|
+ e, d, l = p.read(1, timeout);
|
|
|
|
|
+ assert(e == SqRs232.RS232_ERR_TIMEOUT);
|
|
|
|
|
+ assert(d == nil);
|
|
|
|
|
+ assert(l == 0);
|
|
|
|
|
+
|
|
|
|
|
+ // not implemented yet...
|
|
|
|
|
+ if (platform != "win32"){
|
|
|
|
|
+ local forced = 1;
|
|
|
|
|
+ e, d, l = p.read(1, timeout, forced)
|
|
|
|
|
+ assert(e == SqRs232.RS232_ERR_TIMEOUT)
|
|
|
|
|
+ assert(d == nil)
|
|
|
|
|
+ assert(l == 0)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ local forced = 0;
|
|
|
|
|
+ e, d, l = p.read(1, timeout, forced);
|
|
|
|
|
+ assert(e == SqRs232.RS232_ERR_TIMEOUT)
|
|
|
|
|
+ assert(d == nil)
|
|
|
|
|
+ assert(l == 0)
|
|
|
|
|
+
|
|
|
|
|
+ e, l = p.write("ynezz")
|
|
|
|
|
+ assert(e == SqRs232.RS232_ERR_NOERROR)
|
|
|
|
|
+
|
|
|
|
|
+ // althought the write is successful it returns 0 bytes written
|
|
|
|
|
+ // in some baud/data/stop/flow combinations...
|
|
|
|
|
+
|
|
|
|
|
+ if (platform != "win32") assert(l == 5);
|
|
|
|
|
+
|
|
|
|
|
+ e, l = p.write("ynezz", timeout)
|
|
|
|
|
+ assert(e == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+
|
|
|
|
|
+ // althought the write is successful it returns 0 bytes written
|
|
|
|
|
+ // in some baud/data/stop/flow combinations...
|
|
|
|
|
+
|
|
|
|
|
+ if (platform != "win32") assert(l == 5);
|
|
|
|
|
+
|
|
|
|
|
+ local text = p.tostring();
|
|
|
|
|
+ assert(text != niull)
|
|
|
|
|
+ print("tostring(p): " + text);
|
|
|
|
|
+
|
|
|
|
|
+ assert(p.close() == SqRs232.RS232_ERR_NOERROR);
|
|
|
|
|
+ ]==], port_name, baud, data, parity, stop, flow, dtr, rts)
|
|
|
|
|
+ )
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+print("[*] All tests passed succesfuly!");
|