rs_232 2.0.5 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +8 -8
- data/README.md +183 -42
- data/atlassian-ide-plugin.xml +5 -0
- data/cucumber.yml +3 -3
- data/ext/rs_232/constants.h +1 -1
- data/ext/rs_232/extconf.rb +29 -62
- data/features/connection.feature +6 -4
- data/features/support/after.rb +1 -2
- data/features/support/env.rb +11 -43
- data/gem_tasks/environment.rake +4 -4
- data/gem_tasks/rspec.rake +1 -1
- data/lib/rs_232/version.rb +1 -1
- data/lib/rs_232.rb +152 -122
- data/rs_232.gemspec +10 -11
- data/rs_232.iml +30 -0
- data/{features → spec}/support/adapter/dev.rb +51 -20
- data/{features → spec}/support/adapter/generic.rb +22 -9
- data/spec/support/adapter.rb +4 -0
- metadata +57 -20
- data/bin/env.rb +0 -9
- data/features/support/adapter/rs_logger.rb +0 -36
- data/features/support/adapter.rb +0 -5
- data/pkg/rs_232-2.0.5.gem +0 -0
data/lib/rs_232.rb
CHANGED
@@ -1,145 +1,175 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'rs_232/version'
|
2
|
+
require 'rs_232.so'
|
3
3
|
|
4
|
-
|
4
|
+
module Rs232
|
5
|
+
|
6
|
+
#== Adapter implementation example:
|
5
7
|
#
|
6
8
|
# @usage:
|
7
9
|
#
|
8
|
-
# instantiate adapter
|
9
|
-
# +adapter+ = +
|
10
|
+
# # instantiate adapter
|
11
|
+
# +adapter+ = +Rs232::Adapter.new("/dev/tty.ACM0")+ #=> [Object]
|
10
12
|
#
|
11
|
-
# write string
|
12
|
-
# +adapter.
|
13
|
+
# # write string
|
14
|
+
# +adapter.write("Hello, World\n")+ #=> 13
|
13
15
|
#
|
14
|
-
# read all available bytes
|
15
|
-
# +adapter.
|
16
|
+
# # read all available bytes
|
17
|
+
# +adapter.read(-1)+ #=> "Bye bye cruel world\n"
|
16
18
|
#
|
17
19
|
#
|
18
|
-
class
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
20
|
+
class Adapter
|
21
|
+
attr_reader :interface
|
22
|
+
# == Top level module ::CommPort constants
|
23
|
+
#
|
24
|
+
# :VERSION,
|
25
|
+
#
|
26
|
+
# :BAUD_110,
|
27
|
+
# :BAUD_300,
|
28
|
+
# :BAUD_600,
|
29
|
+
# :BAUD_1200,
|
30
|
+
# :BAUD_2400,
|
31
|
+
# :BAUD_4800,
|
32
|
+
# :BAUD_9600,
|
33
|
+
# :BAUD_19200,
|
34
|
+
# :BAUD_38400,
|
35
|
+
# :BAUD_57600,
|
36
|
+
# :BAUD_115200,
|
37
|
+
#
|
38
|
+
# :DATA_BITS_5,
|
39
|
+
# :DATA_BITS_6,
|
40
|
+
# :DATA_BITS_7,
|
41
|
+
# :DATA_BITS_8,
|
42
|
+
#
|
43
|
+
# :PAR_NONE,
|
44
|
+
# :PAR_ODD,
|
45
|
+
# :PAR_EVEN,
|
46
|
+
#
|
47
|
+
# :STOP_BITS_1,
|
48
|
+
# :STOP_BITS_3,
|
49
|
+
#
|
50
|
+
# :FLOW_OFF,
|
51
|
+
# :FLOW_HARDWARE,
|
52
|
+
# :FLOW_XONXOFF,
|
53
|
+
#
|
54
|
+
# :Impl
|
55
|
+
#
|
37
56
|
|
38
|
-
# Open and configure interface
|
39
|
-
#
|
40
|
-
# @return [Bool]
|
41
|
-
#
|
42
|
-
def connect
|
43
|
-
@interface.open
|
44
|
-
# custom configuration should be there if required
|
45
|
-
# @interface.baud_rate = BAUD_115200
|
46
|
-
# @interface.data_bits = DATA_BITS_8
|
47
|
-
# @interface.parity = PAR_NONE
|
48
|
-
# @interface.stop_bits = STOP_1
|
49
|
-
# @interface.flow_control = FLOW_OFF
|
50
|
-
@open = open?
|
51
|
-
end
|
52
57
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
@interface.write(bytes)
|
60
|
-
end
|
58
|
+
# == constructor with default params
|
59
|
+
#
|
60
|
+
def initialize(port)
|
61
|
+
@interface = CommPort::Rs232.new(port)
|
62
|
+
connect
|
63
|
+
end
|
61
64
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
@open = open?
|
69
|
-
!open?
|
70
|
-
end
|
65
|
+
# Open and configure interface
|
66
|
+
#
|
67
|
+
# @return [Bool]
|
68
|
+
#
|
69
|
+
def connect
|
70
|
+
@interface.open
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
@interface.baud_rate = CommPort::BAUD_115200
|
73
|
+
@interface.data_bits = CommPort::DATA_BITS_8
|
74
|
+
@interface.parity = CommPort::PAR_NONE
|
75
|
+
@interface.stop_bits = CommPort::STOP_BITS_1
|
76
|
+
@interface.flow_control = CommPort::FLOW_OFF
|
77
77
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
@open = open?
|
79
|
+
end
|
80
|
+
|
81
|
+
# == Write function implementation
|
82
|
+
#
|
83
|
+
# @param [String] bytes
|
84
|
+
# @return [Int]
|
85
|
+
#
|
86
|
+
def write(bytes)
|
87
|
+
@interface.write(bytes)
|
88
|
+
end
|
89
|
+
|
90
|
+
# == Closing interface and freeing structures
|
91
|
+
#
|
92
|
+
# @return [Bool]
|
93
|
+
#
|
94
|
+
def close
|
95
|
+
@interface.close
|
96
|
+
@open = open?
|
97
|
+
!open?
|
98
|
+
end
|
83
99
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
100
|
+
# == Flashing buffer function
|
101
|
+
#
|
102
|
+
def flush
|
103
|
+
@interface.flush
|
104
|
+
end
|
105
|
+
|
106
|
+
# @return [Bool]
|
107
|
+
#
|
108
|
+
def open?
|
109
|
+
@interface && !@interface.closed?
|
110
|
+
end
|
111
|
+
|
112
|
+
# == read() implementation example
|
113
|
+
#
|
114
|
+
# @param +count+ [Int]
|
115
|
+
# @param +blocking+ [Bool]
|
116
|
+
#
|
117
|
+
# @return [String]
|
118
|
+
#
|
119
|
+
# === Alternative implementation:
|
120
|
+
# @usage:
|
121
|
+
#
|
122
|
+
# +timeout+ = blocking_value ? 15000 : 0
|
123
|
+
# +@interface.timeout+ = +timeout+
|
124
|
+
# +@interface.read( +count+ )+
|
125
|
+
#
|
126
|
+
def read(count, blocking = false)
|
127
|
+
array = []
|
128
|
+
|
129
|
+
bytes_count = (count == -1) ? @interface.available? : count
|
130
|
+
|
131
|
+
if blocking
|
132
|
+
bytes = read_io_until(count, count)
|
133
|
+
array.push bytes if bytes
|
134
|
+
else
|
135
|
+
bytes_count.times do
|
136
|
+
byte = @interface.read(1)
|
137
|
+
array.push byte if byte
|
138
|
+
end
|
110
139
|
end
|
140
|
+
array.empty? ? nil : array.join
|
111
141
|
end
|
112
|
-
array.empty? ? nil : array.join
|
113
|
-
end
|
114
142
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
143
|
+
private
|
144
|
+
|
145
|
+
# == simulate blocking function
|
146
|
+
#
|
147
|
+
# @param +count+ [Int]
|
148
|
+
# @param +up_to+ [Int]
|
149
|
+
#
|
150
|
+
# no direct ruby usage
|
151
|
+
#
|
152
|
+
def block_io_until(count, up_to)
|
153
|
+
while @interface.available? < count && up_to > 0
|
154
|
+
up_to -= 1
|
155
|
+
end
|
156
|
+
up_to > 0
|
127
157
|
end
|
128
|
-
up_to > 0
|
129
|
-
end
|
130
158
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
159
|
+
# == simulate blocking function
|
160
|
+
#
|
161
|
+
# @param +count+ [Int]
|
162
|
+
# @param +up_to+ [Int]
|
163
|
+
#
|
164
|
+
# no direct ruby usage
|
165
|
+
#
|
166
|
+
def read_io_until(count, up_to)
|
167
|
+
until block_io_until(count, up_to)
|
168
|
+
sleep 0.001
|
169
|
+
end
|
170
|
+
read(count)
|
141
171
|
end
|
142
|
-
|
172
|
+
|
143
173
|
end
|
144
174
|
|
145
175
|
end
|
data/rs_232.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Rs232::VERSION
|
9
9
|
spec.authors = ['Roman Lishtaba']
|
10
10
|
spec.email = ['roman@lishtaba.com']
|
11
|
-
spec.description = %q{rs-232
|
12
|
-
spec.summary = %q{rs-232
|
11
|
+
spec.description = %q{This is a rs-232 posix implementation as a Ruby extension in C.}
|
12
|
+
spec.summary = %q{This is a rs-232 implementation as a Ruby extension in C.}
|
13
13
|
spec.homepage = 'http://www.lishtaba.com'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
@@ -20,22 +20,21 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.extensions = %w(ext/rs_232/extconf.rb)
|
22
22
|
|
23
|
-
spec.add_development_dependency 'bundler', '>= 1.5.3'
|
24
|
-
spec.add_development_dependency 'rake', '>= 10.1.1'
|
25
|
-
spec.add_development_dependency 'rspec', '>= 2.14.1'
|
26
|
-
spec.add_development_dependency 'cucumber', '>= 1.3.11'
|
27
|
-
spec.add_development_dependency 'rake-compiler', '>= 0.9.2'
|
28
|
-
spec.add_development_dependency 'simplecov', '>= 0.8.2'
|
29
|
-
spec.add_development_dependency 'pry', '>= 0.9.12.6'
|
23
|
+
spec.add_development_dependency 'bundler','~> 1.5', '>= 1.5.3'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.1', '>= 10.1.1'
|
25
|
+
spec.add_development_dependency 'rspec', '~> 2.14', '>= 2.14.1'
|
26
|
+
spec.add_development_dependency 'cucumber', '~> 1.3', '>= 1.3.11'
|
27
|
+
spec.add_development_dependency 'rake-compiler', '~> 0.9', '>= 0.9.2'
|
28
|
+
spec.add_development_dependency 'simplecov', '~> 0.8', '>= 0.8.2'
|
29
|
+
spec.add_development_dependency 'pry', '~> 0.9', '>= 0.9.12.6'
|
30
30
|
|
31
31
|
|
32
32
|
spec.post_install_message = <<-MSG
|
33
33
|
****************************************************************
|
34
34
|
*** INFO: ***
|
35
|
-
*** You've installed
|
35
|
+
*** You've installed binary version of the Rs-232 gem! ***
|
36
36
|
*** Gem version: #{Rs232::VERSION} ***
|
37
37
|
*** Bug reports/questions are welcome: [roman@lishtaba.com] ***
|
38
|
-
*** happy codding!!! ***
|
39
38
|
****************************************************************
|
40
39
|
MSG
|
41
40
|
end
|
data/rs_232.iml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
3
|
+
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
4
|
+
<exclude-output />
|
5
|
+
<content url="file://$MODULE_DIR$" />
|
6
|
+
<orderEntry type="jdk" jdkName="RVM: ruby-2.1.1" jdkType="RUBY_SDK" />
|
7
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
8
|
+
<orderEntry type="library" scope="PROVIDED" name="builder (v3.2.2, RVM: ruby-2.1.1) [gem]" level="application" />
|
9
|
+
<orderEntry type="library" scope="PROVIDED" name="bundler (v1.5.3, RVM: ruby-2.1.1) [gem]" level="application" />
|
10
|
+
<orderEntry type="library" scope="PROVIDED" name="coderay (v1.1.0, RVM: ruby-2.1.1) [gem]" level="application" />
|
11
|
+
<orderEntry type="library" scope="PROVIDED" name="cucumber (v1.3.11, RVM: ruby-2.1.1) [gem]" level="application" />
|
12
|
+
<orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.2.5, RVM: ruby-2.1.1) [gem]" level="application" />
|
13
|
+
<orderEntry type="library" scope="PROVIDED" name="docile (v1.1.3, RVM: ruby-2.1.1) [gem]" level="application" />
|
14
|
+
<orderEntry type="library" scope="PROVIDED" name="gherkin (v2.12.2, RVM: ruby-2.1.1) [gem]" level="application" />
|
15
|
+
<orderEntry type="library" scope="PROVIDED" name="method_source (v0.8.2, RVM: ruby-2.1.1) [gem]" level="application" />
|
16
|
+
<orderEntry type="library" scope="PROVIDED" name="multi_json (v1.9.0, RVM: ruby-2.1.1) [gem]" level="application" />
|
17
|
+
<orderEntry type="library" scope="PROVIDED" name="multi_test (v0.0.3, RVM: ruby-2.1.1) [gem]" level="application" />
|
18
|
+
<orderEntry type="library" scope="PROVIDED" name="pry (v0.9.12.6, RVM: ruby-2.1.1) [gem]" level="application" />
|
19
|
+
<orderEntry type="library" scope="PROVIDED" name="rake (v10.1.1, RVM: ruby-2.1.1) [gem]" level="application" />
|
20
|
+
<orderEntry type="library" scope="PROVIDED" name="rake-compiler (v0.9.2, RVM: ruby-2.1.1) [gem]" level="application" />
|
21
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec (v2.14.1, RVM: ruby-2.1.1) [gem]" level="application" />
|
22
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-core (v2.14.8, RVM: ruby-2.1.1) [gem]" level="application" />
|
23
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v2.14.5, RVM: ruby-2.1.1) [gem]" level="application" />
|
24
|
+
<orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v2.14.6, RVM: ruby-2.1.1) [gem]" level="application" />
|
25
|
+
<orderEntry type="library" scope="PROVIDED" name="simplecov (v0.8.2, RVM: ruby-2.1.1) [gem]" level="application" />
|
26
|
+
<orderEntry type="library" scope="PROVIDED" name="simplecov-html (v0.8.0, RVM: ruby-2.1.1) [gem]" level="application" />
|
27
|
+
<orderEntry type="library" scope="PROVIDED" name="slop (v3.4.7, RVM: ruby-2.1.1) [gem]" level="application" />
|
28
|
+
</component>
|
29
|
+
</module>
|
30
|
+
|
@@ -1,22 +1,47 @@
|
|
1
1
|
class Adapter::Dev < Adapter::Generic
|
2
2
|
attr_reader :interface
|
3
|
-
|
4
|
-
|
5
|
-
#
|
6
|
-
#
|
3
|
+
# == Top level module ::CommPort constants
|
4
|
+
#
|
5
|
+
# :VERSION,
|
6
|
+
#
|
7
|
+
# :BAUD_110,
|
8
|
+
# :BAUD_300,
|
9
|
+
# :BAUD_600,
|
10
|
+
# :BAUD_1200,
|
11
|
+
# :BAUD_2400,
|
12
|
+
# :BAUD_4800,
|
13
|
+
# :BAUD_9600,
|
14
|
+
# :BAUD_19200,
|
15
|
+
# :BAUD_38400,
|
16
|
+
# :BAUD_57600,
|
17
|
+
# :BAUD_115200,
|
18
|
+
#
|
19
|
+
# :DATA_BITS_5,
|
20
|
+
# :DATA_BITS_6,
|
21
|
+
# :DATA_BITS_7,
|
22
|
+
# :DATA_BITS_8,
|
7
23
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# @stop_bits = 1 # STOP_1
|
12
|
-
# @flow_control = 0 # FLOW_OFF
|
24
|
+
# :PAR_NONE,
|
25
|
+
# :PAR_ODD,
|
26
|
+
# :PAR_EVEN,
|
13
27
|
#
|
28
|
+
# :STOP_BITS_1,
|
29
|
+
# :STOP_BITS_3,
|
30
|
+
#
|
31
|
+
# :FLOW_OFF,
|
32
|
+
# :FLOW_HARDWARE,
|
33
|
+
# :FLOW_XONXOFF,
|
34
|
+
#
|
35
|
+
# :Impl
|
36
|
+
#
|
37
|
+
|
38
|
+
|
39
|
+
# == constructor with default params
|
14
40
|
#
|
15
41
|
def initialize(port, &block)
|
16
|
-
@interface
|
42
|
+
@interface = CommPort::Rs232.new(port)
|
43
|
+
super
|
17
44
|
connect
|
18
|
-
$stdout.puts "*** Rs232 instance has been initialized. Build v#{CommPort::VERSION}"
|
19
|
-
super(&block)
|
20
45
|
end
|
21
46
|
|
22
47
|
# Open and configure interface
|
@@ -25,12 +50,15 @@ class Adapter::Dev < Adapter::Generic
|
|
25
50
|
#
|
26
51
|
def connect
|
27
52
|
@interface.open
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
53
|
+
|
54
|
+
notify_with '%s has been received call to %s...' % [self, __method__]
|
55
|
+
|
56
|
+
@interface.baud_rate = CommPort::BAUD_115200
|
57
|
+
@interface.data_bits = CommPort::DATA_BITS_8
|
58
|
+
@interface.parity = CommPort::PAR_NONE
|
59
|
+
@interface.stop_bits = CommPort::STOP_BITS_1
|
60
|
+
@interface.flow_control = CommPort::FLOW_OFF
|
61
|
+
|
34
62
|
@open = open?
|
35
63
|
end
|
36
64
|
|
@@ -48,7 +76,8 @@ class Adapter::Dev < Adapter::Generic
|
|
48
76
|
# @return [Bool]
|
49
77
|
#
|
50
78
|
def close
|
51
|
-
|
79
|
+
notify_with '%s has been received call to %s...' % [self, __method__]
|
80
|
+
|
52
81
|
@interface.close
|
53
82
|
@open = open?
|
54
83
|
!open?
|
@@ -57,6 +86,8 @@ class Adapter::Dev < Adapter::Generic
|
|
57
86
|
# == Flashing buffer function
|
58
87
|
#
|
59
88
|
def flush
|
89
|
+
notify_with '%s has been received call to %s...' % [self, __method__]
|
90
|
+
|
60
91
|
@interface.flush
|
61
92
|
end
|
62
93
|
|
@@ -81,7 +112,7 @@ class Adapter::Dev < Adapter::Generic
|
|
81
112
|
# +@interface.read( +count+ )+
|
82
113
|
#
|
83
114
|
def read(count, blocking = false)
|
84
|
-
array
|
115
|
+
array = []
|
85
116
|
|
86
117
|
bytes_count = (count == -1) ? @interface.available? : count
|
87
118
|
|
@@ -4,20 +4,27 @@ module Adapter
|
|
4
4
|
|
5
5
|
class Generic
|
6
6
|
include MonitorMixin
|
7
|
-
include RsLogger
|
8
7
|
|
9
|
-
|
8
|
+
DEFAULT_NOTIFIER = ->(message) { $stdout.puts message }
|
9
|
+
|
10
|
+
attr_accessor :notifier
|
10
11
|
|
11
12
|
def initialize(*args, &block)
|
12
13
|
Thread.abort_on_exception = true
|
13
|
-
unless instance_variables.include?(:@rxd)
|
14
|
-
|
15
|
-
|
16
|
-
@event = block
|
17
|
-
super(*args)
|
14
|
+
@rxd = true unless instance_variables.include?(:@rxd)
|
15
|
+
@notifier = block || DEFAULT_NOTIFIER
|
16
|
+
super()
|
18
17
|
run
|
19
18
|
end
|
20
19
|
|
20
|
+
def notifier=(value)
|
21
|
+
@notifier = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def notifier
|
25
|
+
@notifier
|
26
|
+
end
|
27
|
+
|
21
28
|
def reading_allowed?
|
22
29
|
@rxd
|
23
30
|
end
|
@@ -34,14 +41,14 @@ module Adapter
|
|
34
41
|
def rx(int, blocking = false)
|
35
42
|
byte = read(int, blocking)
|
36
43
|
if byte
|
37
|
-
|
44
|
+
notify_with "RX [#{byte.length}]: #{byte.inspect}"
|
38
45
|
end
|
39
46
|
byte
|
40
47
|
end
|
41
48
|
|
42
49
|
def tx(bytes)
|
43
50
|
int = write(bytes)
|
44
|
-
|
51
|
+
notify_with "TX [#{int}]: #{bytes.inspect}"
|
45
52
|
int
|
46
53
|
end
|
47
54
|
|
@@ -59,6 +66,12 @@ module Adapter
|
|
59
66
|
end
|
60
67
|
end
|
61
68
|
|
69
|
+
private
|
70
|
+
|
71
|
+
def notify_with(message)
|
72
|
+
@notifier[message]
|
73
|
+
end
|
74
|
+
|
62
75
|
end
|
63
76
|
|
64
77
|
end
|