rsmp 0.8.4 → 0.9.1

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yaml +21 -0
  3. data/.ruby-version +1 -1
  4. data/Gemfile.lock +51 -67
  5. data/README.md +2 -12
  6. data/bin/console +1 -1
  7. data/cucumber.yml +1 -0
  8. data/documentation/classes_and_modules.md +4 -4
  9. data/documentation/collecting_message.md +2 -2
  10. data/documentation/tasks.md +149 -0
  11. data/lib/rsmp/archive.rb +3 -3
  12. data/lib/rsmp/cli.rb +32 -4
  13. data/lib/rsmp/collect/aggregated_status_collector.rb +1 -1
  14. data/lib/rsmp/collect/collector.rb +13 -6
  15. data/lib/rsmp/collect/command_response_collector.rb +1 -1
  16. data/lib/rsmp/collect/state_collector.rb +1 -1
  17. data/lib/rsmp/collect/status_collector.rb +2 -1
  18. data/lib/rsmp/components.rb +3 -3
  19. data/lib/rsmp/convert/export/json_schema.rb +4 -4
  20. data/lib/rsmp/convert/import/yaml.rb +1 -1
  21. data/lib/rsmp/deep_merge.rb +1 -0
  22. data/lib/rsmp/error.rb +0 -3
  23. data/lib/rsmp/inspect.rb +1 -1
  24. data/lib/rsmp/logger.rb +5 -5
  25. data/lib/rsmp/logging.rb +1 -1
  26. data/lib/rsmp/message.rb +1 -1
  27. data/lib/rsmp/node.rb +10 -45
  28. data/lib/rsmp/proxy.rb +184 -134
  29. data/lib/rsmp/rsmp.rb +1 -1
  30. data/lib/rsmp/site.rb +23 -60
  31. data/lib/rsmp/site_proxy.rb +33 -37
  32. data/lib/rsmp/supervisor.rb +25 -21
  33. data/lib/rsmp/supervisor_proxy.rb +58 -29
  34. data/lib/rsmp/task.rb +84 -0
  35. data/lib/rsmp/tlc/signal_group.rb +5 -3
  36. data/lib/rsmp/tlc/signal_plan.rb +2 -2
  37. data/lib/rsmp/tlc/traffic_controller.rb +97 -29
  38. data/lib/rsmp/tlc/traffic_controller_site.rb +43 -36
  39. data/lib/rsmp/version.rb +1 -1
  40. data/lib/rsmp.rb +1 -1
  41. data/rsmp.gemspec +7 -7
  42. metadata +21 -20
  43. data/lib/rsmp/site_proxy_wait.rb +0 -0
  44. data/lib/rsmp/wait.rb +0 -16
  45. data/test.rb +0 -27
@@ -23,27 +23,34 @@ module RSMP
23
23
  reset
24
24
  end
25
25
 
26
- def reset
27
- @cycle_counter = 0
28
- @plan = 1
26
+ def reset_modes
29
27
  @dark_mode = true
30
28
  @yellow_flash = false
31
29
  @booting = false
32
- @control_mode = 'control'
33
- @police_key = 0
34
- @intersection = 0
35
30
  @is_starting = false
36
- @emergency_route = false
37
- @emergency_route_number = 0
38
- @traffic_situation = 0
31
+ @control_mode = 'control'
39
32
  @manual_control = false
40
33
  @fixed_time_control = false
41
34
  @isolated_control = false
42
35
  @yellow_flash = false
43
36
  @all_red = false
37
+ @police_key = 0
38
+ end
39
+
40
+ def reset
41
+ reset_modes
42
+
43
+ @cycle_counter = 0
44
+ @plan = 1
45
+ @intersection = 0
46
+ @emergency_route = false
47
+ @emergency_route_number = 0
48
+ @traffic_situation = 0
44
49
 
45
50
  @inputs = '0'*@num_inputs
46
51
  @input_activations = '0'*@num_inputs
52
+ @input_forced = '0'*@num_inputs
53
+ @input_forced_values = '0'*@num_inputs
47
54
  @input_results = '0'*@num_inputs
48
55
 
49
56
  @day_time_table = {}
@@ -76,12 +83,14 @@ module RSMP
76
83
 
77
84
  def timer now
78
85
  # TODO use monotone timer, to avoid jumps in case the user sets the system time
79
- @signal_groups.each { |group| group.timer }
80
86
  time = Time.now.to_i
81
87
  return if time == @time_int
82
88
  @time_int = time
83
89
  move_cycle_counter
84
90
  move_startup_sequence if @startup_sequence_active
91
+
92
+ @signal_groups.each { |group| group.timer }
93
+
85
94
  output_states
86
95
  end
87
96
 
@@ -98,6 +107,8 @@ module RSMP
98
107
 
99
108
  def initiate_startup_sequence
100
109
  log "Initiating startup sequence", level: :info
110
+ reset_modes
111
+ @dark_mode = false
101
112
  @startup_sequence_active = true
102
113
  @startup_sequence_initiated_at = nil
103
114
  @startup_sequence_pos = nil
@@ -107,7 +118,6 @@ module RSMP
107
118
  @startup_sequence_active = false
108
119
  @startup_sequence_initiated_at = nil
109
120
  @startup_sequence_pos = nil
110
-
111
121
  @yellow_flash = false
112
122
  @dark_mode = false
113
123
  end
@@ -127,26 +137,44 @@ module RSMP
127
137
 
128
138
  def output_states
129
139
  return unless @live_output
140
+
130
141
  str = @signal_groups.map do |group|
131
- s = "#{group.c_id}:#{group.state}"
132
- if group.state =~ /^[1-9]$/
142
+ state = group.state
143
+ s = "#{group.c_id}:#{state}"
144
+ if state =~ /^[1-9]$/
133
145
  s.colorize(:green)
134
- elsif group.state =~ /^[NOP]$/
146
+ elsif state =~ /^[NOP]$/
135
147
  s.colorize(:yellow)
136
- elsif group.state =~ /^[ae]$/
137
- s.colorize(:black)
138
- elsif group.state =~ /^[f]$/
148
+ elsif state =~ /^[ae]$/
149
+ s.colorize(:light_black)
150
+ elsif state =~ /^[f]$/
139
151
  s.colorize(:yellow)
140
- elsif group.state =~ /^[g]$/
152
+ elsif state =~ /^[g]$/
141
153
  s.colorize(:red)
142
154
  else
143
155
  s.colorize(:red)
144
156
  end
145
157
  end.join ' '
158
+
159
+ modes = '.'*9
160
+ modes[0] = 'B' if @booting
161
+ modes[1] = 'S' if @startup_sequence_active
162
+ modes[2] = 'D' if @dark_mode
163
+ modes[3] = 'Y' if @yellow_flash
164
+ modes[4] = 'M' if @manual_control
165
+ modes[5] = 'F' if @fixed_time_control
166
+ modes[6] = 'R' if @all_red
167
+ modes[7] = 'I' if @isolated_control
168
+ modes[8] = 'P' if @police_key != 0
169
+
146
170
  plan = "P#{@plan}"
147
171
 
172
+ # create folders if needed
173
+ FileUtils.mkdir_p File.dirname(@live_output)
174
+
175
+ # append a line with the current state to the file
148
176
  File.open @live_output, 'w' do |file|
149
- file.puts "#{plan.rjust(4)} #{pos.to_s.rjust(4)} #{str}\r"
177
+ file.puts "#{modes} #{plan.rjust(2)} #{@cycle_counter.to_s.rjust(3)} #{str}\r"
150
178
  end
151
179
  end
152
180
 
@@ -206,18 +234,27 @@ module RSMP
206
234
  end
207
235
  end
208
236
 
237
+ def recompute_input idx
238
+ if @input_forced[idx] == '1'
239
+ @input_results[idx] = @input_forced_values[idx]
240
+ elsif @input_activations[idx]=='1'
241
+ @input_results[idx] = '1'
242
+ else
243
+ @input_results[idx] = bool_to_digit( @inputs[idx]=='1' )
244
+ end
245
+ end
246
+
209
247
  def handle_m0006 arg
210
248
  @node.verify_security_code 2, arg['securityCode']
211
249
  input = arg['input'].to_i
212
250
  idx = input - 1
213
251
  return unless idx>=0 && input<@num_inputs # TODO should NotAck
214
- @input_activations[idx] = (arg['status']=='True' ? '1' : '0')
215
- result = @input_activations[idx]=='1' || @inputs[idx]=='1'
216
- @input_results[idx] = (result ? '1' : '0')
252
+ @input_activations[idx] = bool_string_to_digit arg['status']
253
+ recompute_input idx
217
254
  if @input_activations[idx]
218
- log "Activate input #{idx}", level: :info
255
+ log "Activating input #{idx+1}", level: :info
219
256
  else
220
- log "Deactivate input #{idx}", level: :info
257
+ log "Deactivating input #{idx+1}", level: :info
221
258
  end
222
259
  end
223
260
 
@@ -280,8 +317,39 @@ module RSMP
280
317
  @node.verify_security_code 2, arg['securityCode']
281
318
  end
282
319
 
320
+ def bool_string_to_digit bool
321
+ case bool
322
+ when 'True'
323
+ '1'
324
+ when 'False'
325
+ '0'
326
+ else
327
+ raise RSMP::MessageRejected.new "Invalid boolean '#{bool}', must be 'True' or 'False'"
328
+ end
329
+ end
330
+
331
+ def bool_to_digit bool
332
+ bool ? '1' : '0'
333
+ end
334
+
283
335
  def handle_m0019 arg
284
336
  @node.verify_security_code 2, arg['securityCode']
337
+ input = arg['input'].to_i
338
+ idx = input - 1
339
+ unless idx>=0 && input<@num_inputs # TODO should NotAck
340
+ log "Can't force input #{idx+1}, only have #{@num_inputs} inputs", level: :warning
341
+ return
342
+ end
343
+ @input_forced[idx] = bool_string_to_digit arg['status']
344
+ if @input_forced[idx]
345
+ @input_forced_values[idx] = bool_string_to_digit arg['inputValue']
346
+ end
347
+ recompute_input idx
348
+ if @input_forced[idx]
349
+ log "Forcing input #{idx+1} to #{@input_forced_values[idx]}, #{@input_results}", level: :info
350
+ else
351
+ log "Releasing input #{idx+1}", level: :info
352
+ end
285
353
  end
286
354
 
287
355
  def handle_m0020 arg
@@ -314,9 +382,9 @@ module RSMP
314
382
 
315
383
  def set_input i, value
316
384
  return unless i>=0 && i<@num_inputs
317
- @inputs[i] = (arg['value'] ? '1' : '0')
385
+ @inputs[i] = bool_to_digit arg['value']
318
386
  end
319
-
387
+
320
388
  def set_fixed_time_control status
321
389
  @fixed_time_control = status
322
390
  end
@@ -380,7 +448,7 @@ module RSMP
380
448
  def handle_s0002 status_code, status_name=nil
381
449
  case status_name
382
450
  when 'detectorlogicstatus'
383
- TrafficControllerSite.make_status @detector_logics.map { |dl| dl.value ? '1' : '0' }.join
451
+ TrafficControllerSite.make_status @detector_logics.map { |dl| bool_to_digit(dl.value) }.join
384
452
  end
385
453
  end
386
454
 
@@ -535,7 +603,7 @@ module RSMP
535
603
  def handle_s0021 status_code, status_name=nil
536
604
  case status_name
537
605
  when 'detectorlogics'
538
- TrafficControllerSite.make_status @detector_logics.map { |logic| logic.forced=='True' ? '1' : '0'}.join
606
+ TrafficControllerSite.make_status @detector_logics.map { |logic| bool_to_digit(logic.forced)}.join
539
607
  end
540
608
  end
541
609
 
@@ -589,7 +657,7 @@ module RSMP
589
657
  def handle_s0029 status_code, status_name=nil
590
658
  case status_name
591
659
  when 'status'
592
- TrafficControllerSite.make_status ''
660
+ TrafficControllerSite.make_status @input_forced
593
661
  end
594
662
  end
595
663
 
@@ -18,6 +18,18 @@ module RSMP
18
18
  unless @main
19
19
  raise ConfigurationError.new "TLC must have a main component"
20
20
  end
21
+
22
+ end
23
+
24
+ def start
25
+ super
26
+ start_tlc_timer
27
+ @main.initiate_startup_sequence
28
+ end
29
+
30
+ def stop_subtasks
31
+ stop_tlc_timer
32
+ super
21
33
  end
22
34
 
23
35
  def build_plans signal_plans
@@ -56,49 +68,45 @@ module RSMP
56
68
  end
57
69
  end
58
70
 
59
- def start_action
60
- super
61
- start_timer
62
- @main.initiate_startup_sequence
63
- end
64
-
65
- def start_timer
71
+ def start_tlc_timer
66
72
  task_name = "tlc timer"
67
73
  log "Starting #{task_name} with interval #{@interval} seconds", level: :debug
68
74
 
69
75
  @timer = @task.async do |task|
70
- task.annotate task_name
71
- next_time = Time.now.to_f
72
- loop do
73
- begin
74
- timer(@clock.now)
75
- rescue EOFError => e
76
- log "Connection closed: #{e}", level: :warning
77
- rescue IOError => e
78
- log "IOError", level: :warning
79
- rescue Errno::ECONNRESET
80
- log "Connection reset by peer", level: :warning
81
- rescue Errno::EPIPE => e
82
- log "Broken pipe", level: :warning
83
- rescue StandardError => e
84
- notify_error e, level: :internal
85
- ensure
86
- # adjust sleep duration to avoid drift. so wake up always happens on the
87
- # same fractional second.
88
- # note that Time.now is not monotonic. If the clock is changed,
89
- # either manaully or via NTP, the sleep interval might jump.
90
- # an alternative is to use ::Process.clock_gettime(::Process::CLOCK_MONOTONIC),
91
- # to get the current time. this ensures a constant interval, but
92
- # if the clock is changed, the wake up would then happen on a different
93
- # fractional second
94
- next_time += @interval
95
- duration = next_time - Time.now.to_f
96
- task.sleep duration
97
- end
76
+ task.annotate task_name
77
+ run_tlc_timer task
78
+ end
79
+ end
80
+
81
+ def run_tlc_timer task
82
+ next_time = Time.now.to_f
83
+ loop do
84
+ begin
85
+ timer(@clock.now)
86
+ rescue StandardError => e
87
+ notify_error e, level: :internal
88
+ ensure
89
+ # adjust sleep duration to avoid drift. so wake up always happens on the
90
+ # same fractional second.
91
+ # note that Time.now is not monotonic. If the clock is changed,
92
+ # either manaully or via NTP, the sleep interval might jump.
93
+ # an alternative is to use ::Process.clock_gettime(::Process::CLOCK_MONOTONIC),
94
+ # to get the current time. this ensures a constant interval, but
95
+ # if the clock is changed, the wake up would then happen on a different
96
+ # fractional second
97
+ next_time += @interval
98
+ duration = next_time - Time.now.to_f
99
+ task.sleep duration
98
100
  end
99
101
  end
100
102
  end
101
103
 
104
+ def stop_tlc_timer
105
+ return unless @timer
106
+ @timer.stop
107
+ @timer = nil
108
+ end
109
+
102
110
  def timer now
103
111
  return unless @main
104
112
  @main.timer now
@@ -142,7 +150,6 @@ module RSMP
142
150
  when :restart
143
151
  log "Restarting TLC", level: :info
144
152
  restart
145
- initiate_startup_sequence
146
153
  end
147
154
  end
148
155
  end
data/lib/rsmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.8.4"
2
+ VERSION = "0.9.1"
3
3
  end
data/lib/rsmp.rb CHANGED
@@ -10,10 +10,10 @@ require 'json_schemer'
10
10
  require 'async/queue'
11
11
 
12
12
  require 'rsmp/rsmp'
13
+ require 'rsmp/task'
13
14
  require 'rsmp/deep_merge'
14
15
  require 'rsmp/inspect'
15
16
  require 'rsmp/logging'
16
- require 'rsmp/wait'
17
17
  require 'rsmp/node'
18
18
  require 'rsmp/supervisor'
19
19
  require 'rsmp/components'
data/rsmp.gemspec CHANGED
@@ -31,16 +31,16 @@ Gem::Specification.new do |spec|
31
31
  spec.require_paths = ["lib"]
32
32
 
33
33
  spec.add_dependency "async", "~> 1.29.1"
34
- spec.add_dependency "async-io", "~> 1.32.1"
34
+ spec.add_dependency "async-io", "~> 1.32.2"
35
35
  spec.add_dependency "colorize", "~> 0.8.1"
36
- spec.add_dependency "thor", "~> 1.0.1"
36
+ spec.add_dependency "thor", "~> 1.2.1"
37
37
  spec.add_dependency "rsmp_schemer"
38
38
 
39
- spec.add_development_dependency "bundler", "~> 2.2.21"
40
- spec.add_development_dependency "rake", "~> 13.0.3"
39
+ spec.add_development_dependency "bundler", "~> 2.3.6"
40
+ spec.add_development_dependency "rake", "~> 13.0.6"
41
41
  spec.add_development_dependency "rspec", "~> 3.10.0"
42
- spec.add_development_dependency "rspec-expectations", "~> 3.10.1"
42
+ spec.add_development_dependency "rspec-expectations", "~> 3.10.2"
43
43
  spec.add_development_dependency "timecop", "~> 0.9.4"
44
- spec.add_development_dependency "cucumber", "~> 6.1.0"
45
- spec.add_development_dependency "aruba" , "~> 1.1.2"
44
+ spec.add_development_dependency "cucumber", "~> 7.1.0"
45
+ spec.add_development_dependency "aruba" , "~> 2.0.0"
46
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rsmp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Emil Tin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-13 00:00:00.000000000 Z
11
+ date: 2022-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.32.1
33
+ version: 1.32.2
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.32.1
40
+ version: 1.32.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: colorize
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.0.1
61
+ version: 1.2.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.0.1
68
+ version: 1.2.1
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rsmp_schemer
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,28 +86,28 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 2.2.21
89
+ version: 2.3.6
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 2.2.21
96
+ version: 2.3.6
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 13.0.3
103
+ version: 13.0.6
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 13.0.3
110
+ version: 13.0.6
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 3.10.1
131
+ version: 3.10.2
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 3.10.1
138
+ version: 3.10.2
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: timecop
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -156,28 +156,28 @@ dependencies:
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: 6.1.0
159
+ version: 7.1.0
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: 6.1.0
166
+ version: 7.1.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: aruba
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: 1.1.2
173
+ version: 2.0.0
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: 1.1.2
180
+ version: 2.0.0
181
181
  description: Easy RSMP site and supervisor communication.
182
182
  email:
183
183
  - zf0f@kk.dk
@@ -186,6 +186,7 @@ executables:
186
186
  extensions: []
187
187
  extra_rdoc_files: []
188
188
  files:
189
+ - ".github/workflows/rspec.yaml"
189
190
  - ".gitignore"
190
191
  - ".gitmodules"
191
192
  - ".rspec"
@@ -200,9 +201,11 @@ files:
200
201
  - bin/setup
201
202
  - config/supervisor.yaml
202
203
  - config/tlc.yaml
204
+ - cucumber.yml
203
205
  - documentation/classes_and_modules.md
204
206
  - documentation/collecting_message.md
205
207
  - documentation/message_distribution.md
208
+ - documentation/tasks.md
206
209
  - exe/rsmp
207
210
  - lib/rsmp.rb
208
211
  - lib/rsmp/archive.rb
@@ -234,18 +237,16 @@ files:
234
237
  - lib/rsmp/rsmp.rb
235
238
  - lib/rsmp/site.rb
236
239
  - lib/rsmp/site_proxy.rb
237
- - lib/rsmp/site_proxy_wait.rb
238
240
  - lib/rsmp/supervisor.rb
239
241
  - lib/rsmp/supervisor_proxy.rb
242
+ - lib/rsmp/task.rb
240
243
  - lib/rsmp/tlc/detector_logic.rb
241
244
  - lib/rsmp/tlc/signal_group.rb
242
245
  - lib/rsmp/tlc/signal_plan.rb
243
246
  - lib/rsmp/tlc/traffic_controller.rb
244
247
  - lib/rsmp/tlc/traffic_controller_site.rb
245
248
  - lib/rsmp/version.rb
246
- - lib/rsmp/wait.rb
247
249
  - rsmp.gemspec
248
- - test.rb
249
250
  homepage: https://github.com/rsmp-nordic/rsmp
250
251
  licenses:
251
252
  - MIT
@@ -269,7 +270,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
269
270
  - !ruby/object:Gem::Version
270
271
  version: '0'
271
272
  requirements: []
272
- rubygems_version: 3.2.32
273
+ rubygems_version: 3.3.3
273
274
  signing_key:
274
275
  specification_version: 4
275
276
  summary: RoadSide Message Protocol (RSMP) library.
File without changes
data/lib/rsmp/wait.rb DELETED
@@ -1,16 +0,0 @@
1
- module RSMP
2
- module Wait
3
- # wait for an async condition to signal, then yield to block
4
- # if block returns true we're done. otherwise, wait again
5
- def wait_for condition, timeout, &block
6
- raise RuntimeError.new("Can't wait for condition because task is not running") unless @task.running?
7
- @task.with_timeout(timeout) do
8
- while @task.running? do
9
- value = condition.wait
10
- result = yield value
11
- return result if result # return result of check, if not nil
12
- end
13
- end
14
- end
15
- end
16
- end
data/test.rb DELETED
@@ -1,27 +0,0 @@
1
- class A
2
- def go &block
3
- @block = block # block will be converted automatically to a Proc
4
- indirect
5
- end
6
-
7
- def call
8
- @block.call
9
- end
10
-
11
- def indirect
12
- call
13
- end
14
-
15
- end
16
-
17
- a = A.new
18
-
19
- a.go do
20
- break # this is ok. break causes the block to exit, and the encasing method to return - go() will exit
21
- end
22
-
23
- # this raises an error. the block we passed to go() will be called again, and it tries to break
24
- # but we're not inside a method we can exit from
25
-
26
-
27
- a.indirect