rintcore 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f672b74c95d07cfb62eb006d5209065f57c51bd2
4
- data.tar.gz: 64b07a334627117937c29c59d863b0371df74160
3
+ metadata.gz: a20bcac1c2747c6d8933b54fa95ee260d9f73320
4
+ data.tar.gz: 71914f9bc5e24cfad1d202efa716fb73b91313aa
5
5
  SHA512:
6
- metadata.gz: 874f9595f51204151351828eedcb403d679d608a8b04b611283a476a75872fe8711da16c4b25031628278425ce85d96080a69afadf0acff08622da80cb58d269
7
- data.tar.gz: 84da65e8d7d6ed60c02c06e4b3dcba01d9ce3cd9479961105d0690769d19d2006c477f471069b9362c9958a8cd6f0dcafcb74d7b2a38ad18b4a7f2c7e540145e
6
+ metadata.gz: d55c42be03827ff1a1372906335a7285149b59ce34dee145c525cc183c3f7343b4796ea0826719674116ffb9fb5bfe6b0526575e5c5dc42588cdf28197355f5a
7
+ data.tar.gz: 191454c20c3e97d2c47615736d647e5e76f5996ce92fcd8ebaf3a3e01b33151bdbfdd0168b80047f9b995ee703e3b0764e6548f935952fa18d2588515cf3cfe3
@@ -41,7 +41,8 @@ module RintCore
41
41
  @object.filament_used.each_with_index do |filament,extruder|
42
42
  puts "\tExtruder #{extruder+1}: #{filament.round(decimals)}mm"
43
43
  end
44
- puts "Number of layers: #{@object.layers}\n"\
44
+ puts "\nNumber of layers: #{@object.layers}\n\n"\
45
+ "Estimated duration: #{@object.durration_in_words}\n\n"\
45
46
  "#{@object.raw_data.length} lines / #{@object.lines.length} commands"
46
47
  end
47
48
 
@@ -60,8 +60,17 @@ module RintCore
60
60
  # @!attribute [r] $12
61
61
  # @return [nil] if there's no E parameter of the command.
62
62
  # @return [Float] E parameter of the command.
63
+ # @!attribute [r] $12
64
+ # @return [nil] if there's no S parameter of the command.
65
+ # @return [Fixnum] S parameter of the command.
66
+ # @!attribute [r] $13
67
+ # @return [nil] if there's no P parameter of the command.
68
+ # @return [Fixnum] P parameter of the command.
69
+ # @!attribute [r] $14
70
+ # @return [nil] if there's no string dta for the command.
71
+ # @return [Fixnum] extra string data for the command (ex. "filename.gco" in "M23 filename.gco").
63
72
  attr_reader :raw, :matches, :line, :command, :command_letter, :command_number,
64
- :s_data, :p_data, :x, :y, :z, :e
73
+ :s_data, :p_data, :x, :y, :z, :e, :s, :p, :string_data
65
74
 
66
75
  # Creates a {Line}
67
76
  # @param line [String] a line of GCode.
@@ -1,11 +1,13 @@
1
1
  require 'rint_core/g_code/codes'
2
2
  require 'rint_core/g_code/line'
3
+ require 'rint_core/pretty_output'
3
4
 
4
5
  module RintCore
5
6
  module GCode
6
7
  # A class that represents a processed GCode file.
7
8
  class Object
8
9
  include RintCore::GCode::Codes
10
+ include RintCore::PrettyOutput
9
11
 
10
12
  # An array of the raw Gcode with each line as an element.
11
13
  # @return [Array] of raw GCode without the comments stripped out.
@@ -43,25 +45,29 @@ module RintCore
43
45
  # @!attribute [r] $15
44
46
  # @return [Float] the height of the print.
45
47
  # @!attribute [r] $16
46
- # @return [Fixnum] the number of layers in the print.
48
+ # @return [Fixnum] the number of layers in the print.
49
+ # @!attribute [r] $17
50
+ # @return [Float] the estimated durration of the print in seconds.
47
51
  attr_reader :lines, :x_min, :x_max, :y_min, :y_max, :z_min, :z_max,
48
52
  :filament_used, :x_travel, :y_travel, :z_travel, :e_travel,
49
- :width, :depth, :height, :layers
53
+ :width, :depth, :height, :layers, :total_duration
50
54
 
51
55
  # Creates a GCode {Object}.
52
56
  # @param data [String] path to a GCode file on the system.
53
57
  # @param data [Array] with each element being a line of GCode.
54
- # @param default_speed [Float] the default speed (in mm/minute) for moves that don't have one declared.
55
58
  # @param auto_process [Boolean] enable/disable auto processing.
59
+ # @param default_speed [Float] the default speed (in mm/minute) for moves that don't have one declared.
60
+ # @param acceleration [Float] the acceleration rate set in the printer' firmware.
56
61
  # @return [Object] if data is valid, returns a GCode {Object}.
57
62
  # @return [false] if data is not an array, path, didn't contain GCode or default_speed wasn't a number grater than 0.
58
- def initialize(data = nil, default_speed = 2400, auto_process = true)
59
- return false if default_speed.nil? && (default_speed.class == Fixnum || default_speed.class == Float) && default_speed <= 0
63
+ def initialize(data = nil, default_speed = 2400, auto_process = true, acceleration = 1500)
64
+ return false if positive_number?(default_speed)
65
+ return false if positive_number?(acceleration)
60
66
  if data.class == String && self.class.is_file?(data)
61
67
  data = self.class.get_file(data)
62
68
  end
63
69
  return false if data.nil? || data.class != Array
64
- set_variables(data, default_speed)
70
+ set_variables(data, default_speed, acceleration)
65
71
  data.each do |line|
66
72
  line = RintCore::GCode::Line.new(line)
67
73
  @lines << set_line_properties(line) if line && !line.command.nil?
@@ -112,6 +118,12 @@ module RintCore
112
118
  @filament_used.length > 1
113
119
  end
114
120
 
121
+ # Returns estimated durration of the print in a human readable format.
122
+ # @return [String] human readable estimated durration of the print.
123
+ def durration_in_words
124
+ seconds_to_words(@total_duration)
125
+ end
126
+
115
127
  private
116
128
 
117
129
  def process
@@ -136,6 +148,9 @@ private
136
148
  when CONTROLLED_MOVE
137
149
  count_layers(line)
138
150
  movement_line(line)
151
+ calculate_time(line)
152
+ when DWELL
153
+ @total_duration += line.p/1000 unless line.p.nil?
139
154
  end
140
155
  end
141
156
 
@@ -148,14 +163,33 @@ private
148
163
  @height = @z_max - @z_min
149
164
  end
150
165
 
166
+ def calculate_time(line)
167
+ @speed_per_second = line.f / 60
168
+ current_travel = hypot3d(@current_x, @current_y, @current_z, @last_x, @last_y, @last_z)
169
+ distance = (2*((@last_speed_per_second+@speed_per_second)*(@speed_per_second-@last_speed_per_second)*0.5)/@acceleration).abs
170
+ if distance <= current_travel && !(@last_speed_per_second+@speed_per_second).zero? && !@speed_per_second.zero?
171
+ move_duration = 2*distance/(@last_speed_per_second+@speed_per_second)
172
+ current_travel -= distance
173
+ move_duration += current_travel/@speed_per_second
174
+ else
175
+ move_duration = Math.sqrt(2*distance/@acceleration)
176
+ end
177
+ @total_duration += move_duration
178
+ end
179
+
151
180
  def count_layers(line)
152
181
  if !line.z.nil? && line.z > @current_z
153
182
  @layers += 1
154
183
  end
155
184
  end
156
185
 
186
+ def hypot3d(x1, y1, z1, x2 = 0.0, y2 = 0.0, z2 = 0.0)
187
+ return Math.hypot(x2-x1, Math.hypot(y2-y1, z2-z1))
188
+ end
189
+
157
190
  def movement_line(line)
158
191
  measure_travel(line)
192
+ set_last_values
159
193
  set_current_position(line)
160
194
  set_limits(line)
161
195
  end
@@ -187,6 +221,17 @@ private
187
221
  end
188
222
  end
189
223
 
224
+ def positive_number?(number, grater_than = 0)
225
+ number.nil? && (number.is_a?(Fixnum) || number.is_a?(Float)) && number >= grater_than
226
+ end
227
+
228
+ def set_last_values
229
+ @last_x = @current_x
230
+ @last_y = @current_y
231
+ @last_z = @current_z
232
+ @last_speed_per_second = @speed_per_second
233
+ end
234
+
190
235
  def set_positions(line)
191
236
  @current_x = to_mm(line.x) unless line.x.nil?
192
237
  @current_y = to_mm(line.y) unless line.y.nil?
@@ -245,6 +290,10 @@ private
245
290
  @current_y = 0
246
291
  @current_z = 0
247
292
  @current_e = 0
293
+ @last_x = 0
294
+ @last_y = 0
295
+ @last_z = 0
296
+ @last_e = 0
248
297
  @x_min = 999999999
249
298
  @y_min = 999999999
250
299
  @z_min = 0
@@ -253,14 +302,21 @@ private
253
302
  @z_max = -999999999
254
303
  @filament_used = []
255
304
  @layers = 0
305
+ # Time
306
+ @speed_per_second = 0.0
307
+ @last_speed_per_second = 0.0
308
+ @move_duration = 0.0
309
+ @total_duration = 0.0
310
+ @acceleration = 1500.0 #mm/s/s ASSUMING THE DEFAULT FROM SPRINTER !!!!
256
311
  end
257
312
 
258
- def set_variables(data, default_speed)
313
+ def set_variables(data, default_speed, acceleration)
259
314
  @raw_data = data
260
315
  @imperial = false
261
316
  @relative = false
262
317
  @tool_number = 0
263
318
  @speed = default_speed.to_f
319
+ @acceleration = acceleration
264
320
  @lines = []
265
321
  end
266
322
 
@@ -0,0 +1,17 @@
1
+ module RintCore
2
+ # provides methods to make human readable output.
3
+ module PrettyOutput
4
+
5
+ private
6
+
7
+ def seconds_to_words(seconds)
8
+ [[60, :seconds], [60, :minutes], [24, :hours], [1000, :days]].map{ |count, name|
9
+ if seconds > 0
10
+ seconds, n = seconds.divmod(count)
11
+ "#{n.to_i} #{name}"
12
+ end
13
+ }.compact.reverse.join(' ')
14
+ end
15
+
16
+ end
17
+ end
@@ -1,10 +1,12 @@
1
1
  require 'rint_core/driver'
2
2
  require 'active_support/configurable'
3
+ require 'rint_core/pretty_output'
3
4
 
4
5
  module RintCore
5
6
  # Interface for directly intereacting with the printer.
6
7
  class Printer
7
8
  include RintCore::Driver
9
+ include RintCore::PrettyOutput
8
10
  include ActiveSupport::Configurable
9
11
 
10
12
  # @!macro config_accessor
@@ -94,13 +96,7 @@ module RintCore
94
96
  # @return [String] human readable time since print started, or "0 seconds" if not printing.
95
97
  def time_from_start
96
98
  @start_time = Time.now unless printing?
97
- secs = Time.now - @start_time
98
- [[60, :seconds], [60, :minutes], [24, :hours], [1000, :days]].map{ |count, name|
99
- if secs > 0
100
- secs, n = secs.divmod(count)
101
- "#{n.to_i} #{name}"
102
- end
103
- }.compact.reverse.join(' ')
99
+ seconds_to_words(Time.now-@start_time)
104
100
  end
105
101
 
106
102
  class << self
@@ -1,4 +1,4 @@
1
1
  module RintCore
2
2
  # Current release version of the gem.
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rintcore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kaz Walker
@@ -107,6 +107,7 @@ files:
107
107
  - lib/rint_core/g_code/codes.rb
108
108
  - lib/rint_core/g_code/line.rb
109
109
  - lib/rint_core/g_code/object.rb
110
+ - lib/rint_core/pretty_output.rb
110
111
  - lib/rint_core/printer.rb
111
112
  - lib/rint_core/version.rb
112
113
  - rintcore.gemspec