Skip to content

Commit 1c5428a

Browse files
author
akira
committed
version 0.9.4
1 parent f58a281 commit 1c5428a

6 files changed

+185
-28
lines changed

ChangeLog

+13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
2002-10-13 akira yamada <[email protected]>
2+
3+
* termios.c
4+
(termios_set_ispeed): fixed typo.
5+
(termios_initialize): 0-cleared "@cc".
6+
(Termios_to_termios): unknown cc-values are treated as 0.
7+
8+
* examples/modem_check.rb: renamed examples/modem_check1.rb.
9+
10+
* examples/modem_check0.rb, exampes/modem_check2.rb: new.
11+
12+
* version 0.9.4.
13+
114
2002-10-12 akira yamada <[email protected]>
215

316
* termios.c: revoked Termios::Termios#set_cc and removed some methods

examples/modem_check0.rb

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
require 'fcntl'
2+
require 'termios'
3+
include Termios
4+
5+
DEVICE = '/dev/modem'
6+
BAUDRATE = B115200
7+
8+
def dev_open(path)
9+
dev = open(DEVICE, File::RDWR | File::NONBLOCK)
10+
mode = dev.fcntl(Fcntl::F_GETFL, 0)
11+
dev.fcntl(Fcntl::F_SETFL, mode & ~File::NONBLOCK)
12+
dev
13+
end
14+
15+
def dump_termios(tio, banner)
16+
puts banner
17+
puts " ispeed = #{BAUDS[tio.ispeed]}, ospeed = #{BAUDS[tio.ospeed]}"
18+
["iflag", "oflag", "cflag", "lflag"].each do |x|
19+
flag = tio.send(x)
20+
flags = []
21+
eval("#{x.upcase}S").each do |f, sym|
22+
flags << sym.to_s if flag & f != 0
23+
end
24+
puts " #{x} = #{flags.sort.join(' | ')}"
25+
end
26+
print " cc ="
27+
cc = tio.cc
28+
cc.each_with_index do |x, idx|
29+
print " #{CCINDEX[idx]}=#{x}" if CCINDEX.include?(idx)
30+
end
31+
puts
32+
end
33+
34+
dev = dev_open(DEVICE)
35+
36+
oldtio = getattr(dev)
37+
dump_termios(oldtio, "current tio:")
38+
39+
newtio = new_termios()
40+
newtio.iflag = IGNPAR
41+
newtio.oflag = 0
42+
newtio.cflag = (CRTSCTS | CS8 | CREAD)
43+
newtio.lflag = 0
44+
newtio.cc[VTIME] = 0
45+
newtio.cc[VMIN] = 1
46+
newtio.ispeed = BAUDRATE
47+
newtio.ospeed = BAUDRATE
48+
dump_termios(newtio, "new tio:")
49+
50+
flush(dev, TCIOFLUSH)
51+
setattr(dev, TCSANOW, newtio)
52+
dump_termios(getattr(dev), "current tio:")
53+
54+
"AT\x0d".each_byte {|c|
55+
c = c.chr
56+
p [:write_char, c]
57+
dev.putc c
58+
d = dev.getc
59+
p [:echo_back, d && d.chr || nil]
60+
}
61+
62+
r = ''
63+
while /OK\x0d\x0a/o !~ r
64+
r << dev.getc.chr
65+
p [:response, r]
66+
end
67+
68+
setattr(dev, TCSANOW, oldtio)
69+
dump_termios(getattr(dev), "current tio:")

examples/modem_check1.rb

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
require 'fcntl'
2+
require 'termios'
3+
4+
DEVICE = '/dev/modem'
5+
BAUDRATE = Termios::B115200
6+
7+
def dev_open(path)
8+
dev = open(DEVICE, File::RDWR | File::NONBLOCK)
9+
mode = dev.fcntl(Fcntl::F_GETFL, 0)
10+
dev.fcntl(Fcntl::F_SETFL, mode & ~File::NONBLOCK)
11+
dev
12+
end
13+
14+
def dump_termios(tio, banner)
15+
puts banner
16+
puts " ispeed = #{Termios::BAUDS[tio.ispeed]}, ospeed = #{Termios::BAUDS[tio.ospeed]}"
17+
["iflag", "oflag", "cflag", "lflag"].each do |x|
18+
flag = tio.send(x)
19+
flags = []
20+
eval("Termios::#{x.upcase}S").each do |f, sym|
21+
flags << sym.to_s if flag & f != 0
22+
end
23+
puts " #{x} = #{flags.sort.join(' | ')}"
24+
end
25+
print " cc ="
26+
cc = tio.cc
27+
cc.each_with_index do |x, idx|
28+
print " #{Termios::CCINDEX[idx]}=#{x}" if Termios::CCINDEX.include?(idx)
29+
end
30+
puts
31+
end
32+
33+
dev = dev_open(DEVICE)
34+
35+
oldtio = Termios::tcgetattr(dev)
36+
dump_termios(oldtio, "current tio:")
37+
38+
newtio = Termios::new_termios()
39+
newtio.iflag = Termios::IGNPAR
40+
newtio.oflag = 0
41+
newtio.cflag = (Termios::CRTSCTS | Termios::CS8 | Termios::CREAD)
42+
newtio.lflag = 0
43+
newtio.cc[Termios::VTIME] = 0
44+
newtio.cc[Termios::VMIN] = 1
45+
newtio.ispeed = BAUDRATE
46+
newtio.ospeed = BAUDRATE
47+
dump_termios(newtio, "new tio:")
48+
49+
Termios::tcflush(dev, Termios::TCIOFLUSH)
50+
Termios::tcsetattr(dev, Termios::TCSANOW, newtio)
51+
dump_termios(Termios::tcgetattr(dev), "current tio:")
52+
53+
"AT\x0d".each_byte {|c|
54+
c = c.chr
55+
p [:write_char, c]
56+
dev.putc c
57+
d = dev.getc
58+
p [:echo_back, d && d.chr || nil]
59+
}
60+
61+
r = ''
62+
while /OK\x0d\x0a/o !~ r
63+
r << dev.getc.chr
64+
p [:response, r]
65+
end
66+
67+
Termios::tcsetattr(dev, Termios::TCSANOW, oldtio)
68+
dump_termios(Termios::tcgetattr(dev), "current tio:")

examples/modem_check.rb examples/modem_check2.rb

+14-12
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
require 'termios'
33

44
DEVICE = '/dev/modem'
5-
BAUDRATE = Termios::B9600
5+
BAUDRATE = Termios::B115200
66

77
def dev_open(path)
88
dev = open(DEVICE, File::RDWR | File::NONBLOCK)
@@ -13,7 +13,7 @@ def dev_open(path)
1313

1414
def dump_termios(tio, banner)
1515
puts banner
16-
puts " ispeed = #{Termios::BAUD[tio.ispeed]}, ospeed = #{Termios::BAUD[tio.ospeed]}"
16+
puts " ispeed = #{Termios::BAUDS[tio.ispeed]}, ospeed = #{Termios::BAUDS[tio.ospeed]}"
1717
["iflag", "oflag", "cflag", "lflag"].each do |x|
1818
flag = tio.send(x)
1919
flags = []
@@ -31,23 +31,25 @@ def dump_termios(tio, banner)
3131
end
3232

3333
dev = dev_open(DEVICE)
34+
dev.extend Termios
3435

35-
oldtio = Termios::getattr(dev)
36+
oldtio = dev.tcgetattr
3637
dump_termios(oldtio, "current tio:")
3738

3839
newtio = Termios::new_termios()
3940
newtio.iflag = Termios::IGNPAR
4041
newtio.oflag = 0
41-
newtio.cflag = (BAUDRATE | Termios::CRTSCTS |
42-
Termios::CS8 | Termios::CREAD)
42+
newtio.cflag = (Termios::CRTSCTS | Termios::CS8 | Termios::CREAD)
4343
newtio.lflag = 0
44-
newtio.set_cc(Termios::VTIME, 0)
45-
newtio.set_cc(Termios::VMIN, 1)
44+
newtio.cc[Termios::VTIME] = 0
45+
newtio.cc[Termios::VMIN] = 1
46+
newtio.ispeed = BAUDRATE
47+
newtio.ospeed = BAUDRATE
4648
dump_termios(newtio, "new tio:")
4749

48-
Termios::flush(dev, Termios::TCIOFLUSH)
49-
Termios::setattr(dev, Termios::TCSANOW, newtio)
50-
dump_termios(Termios::getattr(dev), "current tio:")
50+
dev.tcflush(Termios::TCIOFLUSH)
51+
dev.tcsetattr(Termios::TCSANOW, newtio)
52+
dump_termios(dev.tcgetattr, "current tio:")
5153

5254
"AT\x0d".each_byte {|c|
5355
c = c.chr
@@ -63,5 +65,5 @@ def dump_termios(tio, banner)
6365
p [:response, r]
6466
end
6567

66-
Termios::setattr(dev, Termios::TCSANOW, oldtio)
67-
dump_termios(Termios::getattr(dev), "current tio:")
68+
dev.tcsetattr(Termios::TCSANOW, oldtio)
69+
dump_termios(dev.tcgetattr, "current tio:")

examples/secret_input1.rb

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
# to input secretly [ruby-list:15968]
22
require 'termios'
3-
include Termios
43

5-
oldt = getattr($stdin)
4+
oldt = Termios.tcgetattr($stdin)
65
newt = oldt.dup
7-
newt.lflag &= ~ECHO
8-
setattr($stdin, TCSANOW, newt)
6+
newt.lflag &= ~Termios::ECHO
7+
Termios.tcsetattr($stdin, Termios::TCSANOW, newt)
98
print "noecho> "
109
a = $stdin.gets
11-
setattr($stdin, TCSANOW, oldt)
10+
Termios.tcsetattr($stdin, Termios::TCSANOW, oldt)
1211
print "\n"
1312
p a

termios.c

+17-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
A termios library for Ruby.
44
Copyright (C) 1999, 2000, 2002 akira yamada.
5-
$Id: termios.c,v 1.7 2002-10-12 14:17:29 akira Exp $
5+
$Id: termios.c,v 1.8 2002-10-12 15:15:25 akira Exp $
66
77
*/
88

@@ -16,7 +16,6 @@ static VALUE mTermios;
1616
static VALUE cTermios;
1717
static VALUE tcsetattr_opt, tcflush_qs, tcflow_act;
1818
static ID id_iflag, id_oflag, id_cflag, id_lflag, id_cc, id_ispeed, id_ospeed;
19-
static ID id_to_i;
2019

2120
static VALUE
2221
termios_set_iflag(self, value)
@@ -73,7 +72,7 @@ termios_set_ispeed(self, value)
7372
VALUE self, value;
7473
{
7574
Check_Type(value, T_FIXNUM);
76-
rb_ivar_set(self, id_ospeed, value);
75+
rb_ivar_set(self, id_ispeed, value);
7776

7877
return value;
7978
}
@@ -96,8 +95,12 @@ termios_initialize(argc, argv, self)
9695
{
9796
VALUE c_iflag, c_oflag, c_cflag, c_lflag, c_cc, c_ispeed, c_ospeed;
9897
VALUE cc_ary;
98+
int i;
9999

100100
cc_ary = rb_ary_new2(NCCS);
101+
for (i = 0; i < NCCS; i++) {
102+
rb_ary_store(cc_ary, i, INT2FIX(0));
103+
}
101104

102105
rb_ivar_set(self, id_iflag, Qnil);
103106
rb_ivar_set(self, id_oflag, Qnil);
@@ -176,7 +179,12 @@ Termios_to_termios(obj, t)
176179

177180
cc_ary = rb_ivar_get(obj, id_cc);
178181
for (i = 0; i < NCCS; i++) {
179-
t->c_cc[i] = NUM2INT(rb_funcall(RARRAY(cc_ary)->ptr[i], id_to_i, 0));
182+
if (TYPE(RARRAY(cc_ary)->ptr[i]) == T_FIXNUM) {
183+
t->c_cc[i] = NUM2INT(RARRAY(cc_ary)->ptr[i]);
184+
}
185+
else {
186+
t->c_cc[i] = 0;
187+
}
180188
}
181189

182190
cfsetispeed(t, FIX2INT(rb_ivar_get(obj, id_ispeed)));
@@ -422,8 +430,6 @@ Init_termios()
422430
{
423431
VALUE ccindex, iflags, oflags, cflags, lflags, bauds;
424432

425-
id_to_i = rb_intern("to_i");
426-
427433
/* module Termios */
428434

429435
mTermios = rb_define_module("Termios");
@@ -442,23 +448,23 @@ Init_termios()
442448

443449
rb_define_module_function(mTermios,"tcdrain", termios_s_tcdrain, 1);
444450
rb_define_module_function(mTermios, "drain", termios_s_tcdrain, 1);
445-
rb_define_method(mTermios, "tcdrain", termios_s_tcdrain, 0);
451+
rb_define_method(mTermios, "tcdrain", termios_tcdrain, 0);
446452

447453
rb_define_module_function(mTermios,"tcflush", termios_s_tcflush, 2);
448454
rb_define_module_function(mTermios, "flush", termios_s_tcflush, 2);
449-
rb_define_method(mTermios, "tcflush", termios_s_tcflush, 1);
455+
rb_define_method(mTermios, "tcflush", termios_tcflush, 1);
450456

451457
rb_define_module_function(mTermios,"tcflow", termios_s_tcflow, 2);
452458
rb_define_module_function(mTermios, "flow", termios_s_tcflow, 2);
453-
rb_define_method(mTermios, "tcflow", termios_s_tcflow, 1);
459+
rb_define_method(mTermios, "tcflow", termios_tcflow, 1);
454460

455461
rb_define_module_function(mTermios,"tcgetpgrp", termios_s_tcgetpgrp, 1);
456462
rb_define_module_function(mTermios, "getpgrp", termios_s_tcgetpgrp, 1);
457-
rb_define_method(mTermios, "tcgetpgrp", termios_s_tcgetpgrp, 0);
463+
rb_define_method(mTermios, "tcgetpgrp", termios_tcgetpgrp, 0);
458464

459465
rb_define_module_function(mTermios,"tcsetpgrp", termios_s_tcsetpgrp, 2);
460466
rb_define_module_function(mTermios, "setpgrp", termios_s_tcsetpgrp, 2);
461-
rb_define_method(mTermios, "tcsetpgrp", termios_s_tcsetpgrp, 1);
467+
rb_define_method(mTermios, "tcsetpgrp", termios_tcsetpgrp, 1);
462468

463469
rb_define_module_function(mTermios,"new_termios",termios_s_newtermios, -1);
464470

0 commit comments

Comments
 (0)