rintcore 0.0.1 → 0.0.2
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 +7 -0
- data/.ruby-version +1 -0
- data/CONTRIBUTING.md +10 -6
- data/README.md +24 -4
- data/bin/rintcore +5 -0
- data/lib/rint_core/cli.rb +87 -0
- data/lib/rint_core/driver.rb +22 -0
- data/lib/rint_core/driver/operating_system.rb +30 -0
- data/lib/rint_core/driver/operations.rb +209 -0
- data/lib/rint_core/driver/parsing.rb +39 -0
- data/lib/rint_core/driver/queueing.rb +73 -0
- data/lib/rint_core/driver/state.rb +71 -0
- data/lib/rint_core/g_code.rb +3 -2
- data/lib/rint_core/g_code/codes.rb +2 -2
- data/lib/rint_core/g_code/line.rb +83 -0
- data/lib/rint_core/g_code/object.rb +173 -0
- data/lib/rint_core/printer.rb +59 -0
- data/lib/rint_core/version.rb +1 -1
- data/rintcore.gemspec +3 -1
- metadata +53 -28
- data/lib/rint_core/printer_driver.rb +0 -312
data/lib/rint_core/version.rb
CHANGED
data/rintcore.gemspec
CHANGED
@@ -6,7 +6,7 @@ require 'rint_core/version'
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "rintcore"
|
8
8
|
gem.version = RintCore::VERSION
|
9
|
-
gem.authors = ["Kaz Walker"
|
9
|
+
gem.authors = ["Kaz Walker"]
|
10
10
|
gem.email = ["kaz.walker@doopli.co"]
|
11
11
|
gem.description = %q{RepRap/GCode utilities written in Ruby.}
|
12
12
|
gem.summary = %q{A Ruby implementation of PrintCore.}
|
@@ -18,5 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
gem.add_runtime_dependency 'serialport', '1.1.0'
|
20
20
|
gem.add_runtime_dependency 'activesupport'
|
21
|
+
gem.add_runtime_dependency 'thor'
|
21
22
|
gem.add_development_dependency 'rake'
|
23
|
+
gem.add_development_dependency 'rspec'
|
22
24
|
end
|
metadata
CHANGED
@@ -1,21 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rintcore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Kaz Walker
|
9
|
-
- Rob Gilson
|
10
8
|
autorequire:
|
11
9
|
bindir: bin
|
12
10
|
cert_chain: []
|
13
|
-
date: 2013-02-
|
11
|
+
date: 2013-02-26 00:00:00.000000000 Z
|
14
12
|
dependencies:
|
15
13
|
- !ruby/object:Gem::Dependency
|
16
14
|
name: serialport
|
17
15
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
16
|
requirements:
|
20
17
|
- - '='
|
21
18
|
- !ruby/object:Gem::Version
|
@@ -23,7 +20,6 @@ dependencies:
|
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
23
|
requirements:
|
28
24
|
- - '='
|
29
25
|
- !ruby/object:Gem::Version
|
@@ -31,82 +27,111 @@ dependencies:
|
|
31
27
|
- !ruby/object:Gem::Dependency
|
32
28
|
name: activesupport
|
33
29
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
30
|
requirements:
|
36
|
-
- -
|
31
|
+
- - '>='
|
37
32
|
- !ruby/object:Gem::Version
|
38
33
|
version: '0'
|
39
34
|
type: :runtime
|
40
35
|
prerelease: false
|
41
36
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
37
|
requirements:
|
44
|
-
- -
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: thor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
45
53
|
- !ruby/object:Gem::Version
|
46
54
|
version: '0'
|
47
55
|
- !ruby/object:Gem::Dependency
|
48
56
|
name: rake
|
49
57
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
53
74
|
- !ruby/object:Gem::Version
|
54
75
|
version: '0'
|
55
76
|
type: :development
|
56
77
|
prerelease: false
|
57
78
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
79
|
requirements:
|
60
|
-
- -
|
80
|
+
- - '>='
|
61
81
|
- !ruby/object:Gem::Version
|
62
82
|
version: '0'
|
63
83
|
description: RepRap/GCode utilities written in Ruby.
|
64
84
|
email:
|
65
85
|
- kaz.walker@doopli.co
|
66
|
-
executables:
|
86
|
+
executables:
|
87
|
+
- rintcore
|
67
88
|
extensions: []
|
68
89
|
extra_rdoc_files: []
|
69
90
|
files:
|
70
91
|
- .gitignore
|
92
|
+
- .ruby-version
|
71
93
|
- CONTRIBUTING.md
|
72
94
|
- Gemfile
|
73
95
|
- LICENSE.md
|
74
96
|
- README.md
|
75
97
|
- Rakefile
|
98
|
+
- bin/rintcore
|
76
99
|
- lib/rint_core.rb
|
100
|
+
- lib/rint_core/cli.rb
|
101
|
+
- lib/rint_core/driver.rb
|
102
|
+
- lib/rint_core/driver/operating_system.rb
|
103
|
+
- lib/rint_core/driver/operations.rb
|
104
|
+
- lib/rint_core/driver/parsing.rb
|
105
|
+
- lib/rint_core/driver/queueing.rb
|
106
|
+
- lib/rint_core/driver/state.rb
|
77
107
|
- lib/rint_core/g_code.rb
|
78
108
|
- lib/rint_core/g_code/codes.rb
|
79
|
-
- lib/rint_core/
|
109
|
+
- lib/rint_core/g_code/line.rb
|
110
|
+
- lib/rint_core/g_code/object.rb
|
111
|
+
- lib/rint_core/printer.rb
|
80
112
|
- lib/rint_core/version.rb
|
81
113
|
- rintcore.gemspec
|
82
114
|
homepage: https://github.com/KazW/RintCore
|
83
115
|
licenses: []
|
116
|
+
metadata: {}
|
84
117
|
post_install_message:
|
85
118
|
rdoc_options: []
|
86
119
|
require_paths:
|
87
120
|
- lib
|
88
121
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
122
|
requirements:
|
91
|
-
- -
|
123
|
+
- - '>='
|
92
124
|
- !ruby/object:Gem::Version
|
93
125
|
version: '0'
|
94
|
-
segments:
|
95
|
-
- 0
|
96
|
-
hash: -1346737977531935577
|
97
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
127
|
requirements:
|
100
|
-
- -
|
128
|
+
- - '>='
|
101
129
|
- !ruby/object:Gem::Version
|
102
130
|
version: '0'
|
103
|
-
segments:
|
104
|
-
- 0
|
105
|
-
hash: -1346737977531935577
|
106
131
|
requirements: []
|
107
132
|
rubyforge_project:
|
108
|
-
rubygems_version:
|
133
|
+
rubygems_version: 2.0.0
|
109
134
|
signing_key:
|
110
|
-
specification_version:
|
135
|
+
specification_version: 4
|
111
136
|
summary: A Ruby implementation of PrintCore.
|
112
137
|
test_files: []
|
@@ -1,312 +0,0 @@
|
|
1
|
-
require 'rint_core/g_code/codes'
|
2
|
-
require 'serialport'
|
3
|
-
require 'active_support/core_ext/object/blank'
|
4
|
-
require 'active_support/configurable'
|
5
|
-
|
6
|
-
module RintCore
|
7
|
-
class PrinterDriver
|
8
|
-
include ActiveSupport::Configurable
|
9
|
-
|
10
|
-
# Callbacks are typically given a string argument, usually the current line
|
11
|
-
config_accessor :port, :baud, :start_callback, :temperature_callback,
|
12
|
-
:receive_callback, :send_callback, :error_callback,
|
13
|
-
:end_callback, :online_callback, :debug_callback,
|
14
|
-
:connect_callback
|
15
|
-
|
16
|
-
def control_ttyhup(port, disable_hup)
|
17
|
-
if /linux/ =~ RUBY_PLATFORM
|
18
|
-
if disable_hup
|
19
|
-
`stty -F #{port} -hup`
|
20
|
-
else
|
21
|
-
`stty -F #{port} hup`
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def enable_hup(port)
|
27
|
-
control_ttyhup(port, true)
|
28
|
-
end
|
29
|
-
|
30
|
-
def disable_hup(port)
|
31
|
-
control_ttyhup(port, false)
|
32
|
-
end
|
33
|
-
|
34
|
-
def initialize(port = nil, baud = nil)
|
35
|
-
@baud = nil
|
36
|
-
@port = nil
|
37
|
-
@printer = nil # Serial instance connected to the printer, nil when disconnected
|
38
|
-
@clear = 0 # clear to send, enabled after responses
|
39
|
-
@online = false # The printer has responded to the initial command and is active
|
40
|
-
@printing = false # is a print currently running, true if printing, false if paused
|
41
|
-
@main_queue = []
|
42
|
-
@priority_queue = []
|
43
|
-
@queue_index = 0
|
44
|
-
@line_number = 0
|
45
|
-
@resend_from = -1
|
46
|
-
@paused = false
|
47
|
-
@sent_lines = []
|
48
|
-
@log = []
|
49
|
-
@sent = []
|
50
|
-
@loud = false # emit sent and received lines to terminal
|
51
|
-
@greetings = ['start','Grbl ']
|
52
|
-
@wait = 0 # default wait period for send(), send_now()
|
53
|
-
@read_thread = nil
|
54
|
-
@stop_read_thread = false
|
55
|
-
@print_thread = nil
|
56
|
-
@good_response = 'ok'
|
57
|
-
@resend_response = ['rs','resend']
|
58
|
-
@sleep_time = 0.001
|
59
|
-
@encoding = 'us-ascii'
|
60
|
-
connect(port, baud) if port.present? && baud.present?
|
61
|
-
end
|
62
|
-
|
63
|
-
def disconnect
|
64
|
-
if @printer
|
65
|
-
if @read_thread
|
66
|
-
@stop_read_thread = true
|
67
|
-
@read_thread.join
|
68
|
-
@read_thread = nil
|
69
|
-
end
|
70
|
-
@printer.close
|
71
|
-
end
|
72
|
-
@printer = nil
|
73
|
-
@online = false
|
74
|
-
@printing = false
|
75
|
-
end
|
76
|
-
|
77
|
-
def connect(port = nil, baud = nil)
|
78
|
-
disconnect if @printer
|
79
|
-
@port = port if port.present?
|
80
|
-
@baud = baud if baud.present?
|
81
|
-
@port = self.port if self.port.present?
|
82
|
-
@baud = self.baud if self.baud.present?
|
83
|
-
if @port.present? && @baud.present?
|
84
|
-
disable_hup(@port)
|
85
|
-
@printer = SerialPort.new(@port, @baud)
|
86
|
-
@printer.read_timeout = 0
|
87
|
-
@stop_read_thread = false
|
88
|
-
@read_thread = Thread.new(_listen)
|
89
|
-
eval(connect_callback) if connect_callback.present?
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def reset
|
94
|
-
@printer.dtr = 0
|
95
|
-
sleep 0.2
|
96
|
-
@printer.dtr = 1
|
97
|
-
end
|
98
|
-
|
99
|
-
def _readline
|
100
|
-
begin
|
101
|
-
line = @printer.readline
|
102
|
-
if line.length > 1
|
103
|
-
@log.push line
|
104
|
-
eval(receive_callback+'(line)') if receive_callback.present?
|
105
|
-
end
|
106
|
-
line # return the line
|
107
|
-
rescue EOFError, Errno::ENODEV => e
|
108
|
-
# TODO: Do something useful
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def _listen_can_continue?
|
113
|
-
!@stop_read_thread && @printer
|
114
|
-
end
|
115
|
-
|
116
|
-
def _listen_until_online
|
117
|
-
catch 'BreakOut' do
|
118
|
-
while !@online && _listen_can_continue? do
|
119
|
-
_send(RintCore::GCode::Codes::GET_EXT_TEMP)
|
120
|
-
empty_lines = 0
|
121
|
-
while _listen_can_continue? do
|
122
|
-
line = _readline
|
123
|
-
throw 'BreakOut' if line.nil?
|
124
|
-
line.blank? ? empty_lines += 1 : empty_lines = 0
|
125
|
-
throw 'BreakOut' if empty_lines == 5
|
126
|
-
if line.start_with?(*@greetings, @good_response)
|
127
|
-
eval(online_callback) if online_callback.present?
|
128
|
-
@online = true
|
129
|
-
return true
|
130
|
-
end
|
131
|
-
sleep 0.25
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
def _listen
|
138
|
-
@clear = true
|
139
|
-
_listen_until_online unless @printing
|
140
|
-
while _listen_can_continue? do
|
141
|
-
line = _readline
|
142
|
-
break if line.nil?
|
143
|
-
eval(debug_callback+'(line)') if line.start_with?('DEBUG_') && debug_callback.present?
|
144
|
-
@clear = true if line.start_with?(*@greetings, @good_response)
|
145
|
-
eval(temperature_callback+'(line)') if line.start_with?(@good_response) && line.include?('T:') && temperature_callback.present?
|
146
|
-
eval(error_callback+'(line)') if line.start_with?('Error') && error_callback.present?
|
147
|
-
if line.downcase.start_with?(*@resend_response)
|
148
|
-
line = line.sub('N:', ' ').sub('N', ' ').sub(':', ' ')
|
149
|
-
linewords = line.split
|
150
|
-
@resend_from = linewords.pop(0).to_i
|
151
|
-
@clear = true
|
152
|
-
end
|
153
|
-
end
|
154
|
-
@clear = true
|
155
|
-
end
|
156
|
-
|
157
|
-
def _checksum(command)
|
158
|
-
command.bytes.inject{|a,b| a^b}.to_s
|
159
|
-
end
|
160
|
-
|
161
|
-
def start_print(data, start_index = 0)
|
162
|
-
return false if @printing || !@online || !@printer
|
163
|
-
@printing = true
|
164
|
-
@main_queue = [] + data
|
165
|
-
@line_number = 0
|
166
|
-
@queue_index = start_index
|
167
|
-
@resend_from = -1
|
168
|
-
_send(RintCore::GCode::Codes::SET_LINE_NUM, -1, true)
|
169
|
-
return true if data.blank?
|
170
|
-
@clear = false
|
171
|
-
@print_thread = Thread.new(_print)
|
172
|
-
return true
|
173
|
-
end
|
174
|
-
|
175
|
-
def pause
|
176
|
-
return false unless @printing
|
177
|
-
@paused = true
|
178
|
-
@printing = false
|
179
|
-
@print_thread.join
|
180
|
-
@print_thread = nil
|
181
|
-
end
|
182
|
-
|
183
|
-
def resume
|
184
|
-
return false unless @paused
|
185
|
-
@paused = false
|
186
|
-
@printing = true
|
187
|
-
@print_thread = Thread.new(_print)
|
188
|
-
end
|
189
|
-
|
190
|
-
def send(command, wait = 0)
|
191
|
-
if @online
|
192
|
-
if @printing
|
193
|
-
@main_queue.push(command)
|
194
|
-
else
|
195
|
-
while @printer && @printing && !@clear do
|
196
|
-
sleep(@sleep_time)
|
197
|
-
end
|
198
|
-
wait = @wait if wait == 0 && @wait > 0
|
199
|
-
@clear = false if wait > 0
|
200
|
-
_send(command, @line_number, true)
|
201
|
-
@line_number += 1
|
202
|
-
while wait > 0 && @printer && @printing && !@clear do
|
203
|
-
sleep @sleep_time
|
204
|
-
wait -= 1
|
205
|
-
end
|
206
|
-
end
|
207
|
-
else
|
208
|
-
# TODO: log something about not being connected to printer
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
def send_now(command, wait = 0)
|
213
|
-
if @online
|
214
|
-
if @printing
|
215
|
-
@priority_queue.append(command)
|
216
|
-
else
|
217
|
-
while @printer && @printing && !@clear do
|
218
|
-
sleep(@sleep_time)
|
219
|
-
end
|
220
|
-
wait = @wait if wait == 0 && @wait > 0
|
221
|
-
@clear = false if wait > 0
|
222
|
-
_send(command)
|
223
|
-
while wait > 0 && @printer && @printing && !@clear do
|
224
|
-
sleep @sleep_time
|
225
|
-
wait -= 1
|
226
|
-
end
|
227
|
-
end
|
228
|
-
else
|
229
|
-
# TODO: log something about not being connected to printer
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
def _print
|
234
|
-
eval(start_callback) if start_callback.present?
|
235
|
-
while @printing && @printer && @online do
|
236
|
-
_send_next
|
237
|
-
end
|
238
|
-
@sent_lines = []
|
239
|
-
@log = []
|
240
|
-
@sent = []
|
241
|
-
@print_thread.join
|
242
|
-
@print_thread = nil
|
243
|
-
eval(end_callback) if end_callback.present?
|
244
|
-
return true
|
245
|
-
end
|
246
|
-
|
247
|
-
def _send_next
|
248
|
-
return false unless @printer
|
249
|
-
while @printer && @printing && !@clear do
|
250
|
-
sleep(@sleep_time)
|
251
|
-
end
|
252
|
-
@clear = false
|
253
|
-
unless @printing && @printer && @online
|
254
|
-
@clear = true
|
255
|
-
return true
|
256
|
-
end
|
257
|
-
if @resendfrom < @lineno && @resendfrom > -1
|
258
|
-
_send(@sent_lines[@resend_from], @resend_from, false)
|
259
|
-
@resend_from += 1
|
260
|
-
return true
|
261
|
-
end
|
262
|
-
@resend_from = -1
|
263
|
-
unless @priority_queue.blank?
|
264
|
-
_send(@priority_queue.pop(0))
|
265
|
-
return true
|
266
|
-
end
|
267
|
-
if @printing && @queue_index < @main_queue.length
|
268
|
-
current_line = @main_queue[@queue_index]
|
269
|
-
current_line = current_line.split(RintCore::GCode::Codes::COMMENT_SYMBOL)[0]
|
270
|
-
unless current_line.blank?
|
271
|
-
_send(current_line, @line_number, true)
|
272
|
-
@line_number += 1
|
273
|
-
else
|
274
|
-
@clear = true
|
275
|
-
end
|
276
|
-
@queue_index += 1
|
277
|
-
else
|
278
|
-
@printing = false
|
279
|
-
@clear = true
|
280
|
-
unless @paused
|
281
|
-
@queue_index = 0
|
282
|
-
@line_number = 0
|
283
|
-
_send(RintCore::GCode::Codes::SET_LINE_NUM, -1, true)
|
284
|
-
end
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
def _send(command, line_number = 0, calc_checksum = false)
|
289
|
-
if calc_checksum
|
290
|
-
prefix = 'N' + line_number.to_s + ' ' + command
|
291
|
-
command = prefix + '*' + _checksum(prefix)
|
292
|
-
@sent_lines[line_number] = command unless command.include?(RintCore::GCode::Codes::SET_LINE_NUM)
|
293
|
-
end
|
294
|
-
if @printer
|
295
|
-
@sent.push(command)
|
296
|
-
eval(send_callback+'(command)') if send_callback.present?
|
297
|
-
command = command+"\n"
|
298
|
-
command = command.encode(@encoding)
|
299
|
-
@printer.write(command)
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
def online?
|
304
|
-
@online
|
305
|
-
end
|
306
|
-
|
307
|
-
def printing?
|
308
|
-
@printing
|
309
|
-
end
|
310
|
-
|
311
|
-
end
|
312
|
-
end
|