rsmp 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yaml +14 -0
  3. data/.ruby-version +1 -1
  4. data/Gemfile.lock +46 -67
  5. data/README.md +2 -2
  6. data/bin/console +1 -1
  7. data/config/tlc.yaml +8 -6
  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 +27 -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/error.rb +0 -3
  22. data/lib/rsmp/inspect.rb +1 -1
  23. data/lib/rsmp/logger.rb +5 -5
  24. data/lib/rsmp/logging.rb +1 -1
  25. data/lib/rsmp/message.rb +1 -1
  26. data/lib/rsmp/node.rb +10 -45
  27. data/lib/rsmp/proxy.rb +184 -134
  28. data/lib/rsmp/rsmp.rb +1 -1
  29. data/lib/rsmp/site.rb +24 -61
  30. data/lib/rsmp/site_proxy.rb +33 -37
  31. data/lib/rsmp/supervisor.rb +25 -21
  32. data/lib/rsmp/supervisor_proxy.rb +55 -29
  33. data/lib/rsmp/task.rb +84 -0
  34. data/lib/rsmp/tlc/signal_group.rb +17 -7
  35. data/lib/rsmp/tlc/signal_plan.rb +2 -2
  36. data/lib/rsmp/tlc/traffic_controller.rb +125 -39
  37. data/lib/rsmp/tlc/traffic_controller_site.rb +51 -35
  38. data/lib/rsmp/version.rb +1 -1
  39. data/lib/rsmp.rb +1 -1
  40. data/rsmp.gemspec +7 -7
  41. metadata +20 -20
  42. data/lib/rsmp/site_proxy_wait.rb +0 -0
  43. data/lib/rsmp/wait.rb +0 -16
  44. data/test.rb +0 -27
@@ -5,9 +5,12 @@ module RSMP
5
5
  # and keeps track of signal plans, detector logics, inputs, etc. which do
6
6
  # not have dedicated components.
7
7
  class TrafficController < Component
8
- attr_reader :pos, :cycle_time, :plan
8
+ attr_reader :pos, :cycle_time, :plan, :cycle_counter,
9
+ :yellow_flash, :dark_mode,
10
+ :startup_sequence_active, :startup_sequence, :startup_sequence_pos
9
11
 
10
- def initialize node:, id:, cycle_time: 10, signal_plans:
12
+ def initialize node:, id:, cycle_time: 10, signal_plans:,
13
+ startup_sequence:, live_output:nil
11
14
  super node: node, id: id, grouped: true
12
15
  @signal_groups = []
13
16
  @detector_logics = []
@@ -15,31 +18,44 @@ module RSMP
15
18
  @cycle_time = cycle_time
16
19
  @num_traffic_situations = 1
17
20
  @num_inputs = 8
21
+ @startup_sequence = startup_sequence
22
+ @live_output = live_output
18
23
  reset
19
24
  end
20
25
 
21
- def reset
22
- @pos = 0
23
- @plan = 0
24
- @dark_mode = false
26
+ def reset_modes
27
+ @dark_mode = true
25
28
  @yellow_flash = false
26
29
  @booting = false
27
- @control_mode = 'control'
28
- @police_key = 0
29
- @intersection = 0
30
30
  @is_starting = false
31
- @emergency_route = false
32
- @emergency_route_number = 0
33
- @traffic_situation = 0
31
+ @control_mode = 'control'
34
32
  @manual_control = false
35
33
  @fixed_time_control = false
36
34
  @isolated_control = false
37
35
  @yellow_flash = false
38
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
39
49
 
40
50
  @inputs = '0'*@num_inputs
41
51
  @input_activations = '0'*@num_inputs
42
52
  @input_results = '0'*@num_inputs
53
+
54
+ @day_time_table = {}
55
+ @startup_sequence_active = false
56
+ @startup_sequence_initiated_at = nil
57
+ @startup_sequence_pos = 0
58
+ @time_int = nil
43
59
  end
44
60
 
45
61
  def clock
@@ -64,46 +80,100 @@ module RSMP
64
80
  end
65
81
 
66
82
  def timer now
67
- # TODO
68
- # We should use a monotone timer, to avoid jumps
69
- # in case the user sets the system time
70
- pos = Time.now.to_i % @cycle_time
71
- if pos != @pos
72
- @pos = pos
73
- move pos
74
- end
83
+ # TODO use monotone timer, to avoid jumps in case the user sets the system time
84
+ time = Time.now.to_i
85
+ return if time == @time_int
86
+ @time_int = time
87
+ move_cycle_counter
88
+ move_startup_sequence if @startup_sequence_active
89
+
90
+ @signal_groups.each { |group| group.timer }
91
+
92
+ output_states
93
+ end
94
+
95
+ def move_cycle_counter
96
+ counter = Time.now.to_i % @cycle_time
97
+ @cycle_counter = counter
75
98
  end
76
99
 
77
- def move pos
78
- @signal_groups.each do |group|
79
- group.move pos
100
+ def startup_state
101
+ return unless @startup_sequence_active
102
+ return unless @startup_sequence_pos
103
+ @startup_sequence[ @startup_sequence_pos ]
104
+ end
105
+
106
+ def initiate_startup_sequence
107
+ log "Initiating startup sequence", level: :info
108
+ reset_modes
109
+ @dark_mode = false
110
+ @startup_sequence_active = true
111
+ @startup_sequence_initiated_at = nil
112
+ @startup_sequence_pos = nil
113
+ end
114
+
115
+ def end_startup_sequence
116
+ @startup_sequence_active = false
117
+ @startup_sequence_initiated_at = nil
118
+ @startup_sequence_pos = nil
119
+ @yellow_flash = false
120
+ @dark_mode = false
121
+ end
122
+
123
+ def move_startup_sequence
124
+ was = @startup_sequence_pos
125
+ if @startup_sequence_initiated_at == nil
126
+ @startup_sequence_initiated_at = Time.now.to_i + 1
127
+ @startup_sequence_pos = 0
128
+ else
129
+ @startup_sequence_pos = Time.now.to_i - @startup_sequence_initiated_at
130
+ end
131
+ if @startup_sequence_pos >= @startup_sequence.size
132
+ end_startup_sequence
80
133
  end
81
- #output_states
82
134
  end
83
135
 
84
136
  def output_states
137
+ return unless @live_output
138
+
85
139
  str = @signal_groups.map do |group|
86
- s = "#{group.c_id}:#{group.state}"
87
- if group.state =~ /^[1-9]$/
140
+ state = group.state
141
+ s = "#{group.c_id}:#{state}"
142
+ if state =~ /^[1-9]$/
88
143
  s.colorize(:green)
89
- elsif group.state =~ /^[NOP]$/
144
+ elsif state =~ /^[NOP]$/
90
145
  s.colorize(:yellow)
91
- elsif group.state =~ /^[a]$/
92
- s.colorize(color: :black)
146
+ elsif state =~ /^[ae]$/
147
+ s.colorize(:light_black)
148
+ elsif state =~ /^[f]$/
149
+ s.colorize(:yellow)
150
+ elsif state =~ /^[g]$/
151
+ s.colorize(:red)
93
152
  else
94
153
  s.colorize(:red)
95
154
  end
96
155
  end.join ' '
156
+
157
+ modes = '.'*9
158
+ modes[0] = 'B' if @booting
159
+ modes[1] = 'S' if @startup_sequence_active
160
+ modes[2] = 'D' if @dark_mode
161
+ modes[3] = 'Y' if @yellow_flash
162
+ modes[4] = 'M' if @manual_control
163
+ modes[5] = 'F' if @fixed_time_control
164
+ modes[6] = 'R' if @all_red
165
+ modes[7] = 'I' if @isolated_control
166
+ modes[8] = 'P' if @police_key != 0
167
+
97
168
  plan = "P#{@plan}"
98
- print "#{plan.rjust(4)} #{pos.to_s.rjust(4)} #{str}\r"
169
+
170
+ File.open @live_output, 'w' do |file|
171
+ file.puts "#{modes} #{plan.rjust(2)} #{@cycle_counter.to_s.rjust(3)} #{str}\r"
172
+ end
99
173
  end
100
174
 
101
175
  def format_signal_group_status
102
- if @yellow_flash
103
- 'c' * @signal_groups.size
104
- else
105
- @signal_groups.map { |group| group.state }.join
106
- end
176
+ @signal_groups.map { |group| group.state }.join
107
177
  end
108
178
 
109
179
  def handle_command command_code, arg
@@ -214,6 +284,18 @@ module RSMP
214
284
 
215
285
  def handle_m0017 arg
216
286
  @node.verify_security_code 2, arg['securityCode']
287
+ arg['status'].split(',').each do |item|
288
+ elems = item.split('-')
289
+ nr = elems[0].to_i
290
+ plan = elems[1].to_i
291
+ hour = elems[2].to_i
292
+ min = elems[3].to_i
293
+ if nr<0 || nr>12
294
+ raise InvalidMessage.new "time table id must be between 0 and 12, got #{nr}"
295
+ end
296
+ #p "nr: #{nr}, plan #{plan} at #{hour}:#{min}"
297
+ @day_time_table[nr] = {plan: plan, hour: hour, min:min}
298
+ end
217
299
  end
218
300
 
219
301
  def handle_m0018 arg
@@ -256,7 +338,7 @@ module RSMP
256
338
  return unless i>=0 && i<@num_inputs
257
339
  @inputs[i] = (arg['value'] ? '1' : '0')
258
340
  end
259
-
341
+
260
342
  def set_fixed_time_control status
261
343
  @fixed_time_control = status
262
344
  end
@@ -276,6 +358,7 @@ module RSMP
276
358
  log "Switching to mode #{mode}", level: :info
277
359
  case mode
278
360
  when 'NormalControl'
361
+ initiate_startup_sequence if @yellow_flash || @dark_mode
279
362
  @yellow_flash = false
280
363
  @dark_mode = false
281
364
  when 'YellowFlash'
@@ -308,9 +391,9 @@ module RSMP
308
391
  when 'signalgroupstatus'
309
392
  TrafficControllerSite.make_status format_signal_group_status
310
393
  when 'cyclecounter'
311
- TrafficControllerSite.make_status @pos.to_s
394
+ TrafficControllerSite.make_status @cycle_counter.to_s
312
395
  when 'basecyclecounter'
313
- TrafficControllerSite.make_status @pos.to_s
396
+ TrafficControllerSite.make_status @cycle_counter.to_s
314
397
  when 'stage'
315
398
  TrafficControllerSite.make_status 0.to_s
316
399
  end
@@ -511,7 +594,10 @@ module RSMP
511
594
  def handle_s0027 status_code, status_name=nil
512
595
  case status_name
513
596
  when 'status'
514
- TrafficControllerSite.make_status '00-00-00-00'
597
+ status = @day_time_table.map do |i,item|
598
+ "#{i}-#{item[:plan]}-#{item[:hour]}-#{item[:min]}"
599
+ end.join(',')
600
+ TrafficControllerSite.make_status status
515
601
  end
516
602
  end
517
603
 
@@ -5,14 +5,31 @@ module RSMP
5
5
  attr_accessor :main, :signal_plans
6
6
 
7
7
  def initialize options={}
8
+ # setup options before calling super initializer,
9
+ # since build of components depend on options
8
10
  @sxl = 'traffic_light_controller'
9
11
  @security_codes = options[:site_settings]['security_codes']
10
12
  @interval = options[:site_settings].dig('intervals','timer') || 1
13
+ @startup_sequence = options[:site_settings]['startup_sequence'] || 'efg'
11
14
  build_plans options[:site_settings].dig('signal_plans')
15
+
12
16
  super options
17
+
13
18
  unless @main
14
19
  raise ConfigurationError.new "TLC must have a main component"
15
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
16
33
  end
17
34
 
18
35
  def build_plans signal_plans
@@ -37,7 +54,9 @@ module RSMP
37
54
  when 'main'
38
55
  @main = TrafficController.new node: self, id: id,
39
56
  cycle_time: settings['cycle_time'],
40
- signal_plans: @signal_plans
57
+ startup_sequence: @startup_sequence,
58
+ signal_plans: @signal_plans,
59
+ live_output: @site_settings['live_output']
41
60
  when 'signal_group'
42
61
  group = SignalGroup.new node: self, id: id
43
62
  @main.add_signal_group group
@@ -49,48 +68,45 @@ module RSMP
49
68
  end
50
69
  end
51
70
 
52
- def start_action
53
- super
54
- start_timer
55
- end
56
-
57
- def start_timer
71
+ def start_tlc_timer
58
72
  task_name = "tlc timer"
59
73
  log "Starting #{task_name} with interval #{@interval} seconds", level: :debug
60
74
 
61
75
  @timer = @task.async do |task|
62
- task.annotate task_name
63
- next_time = Time.now.to_f
64
- loop do
65
- begin
66
- timer(@clock.now)
67
- rescue EOFError => e
68
- log "Connection closed: #{e}", level: :warning
69
- rescue IOError => e
70
- log "IOError", level: :warning
71
- rescue Errno::ECONNRESET
72
- log "Connection reset by peer", level: :warning
73
- rescue Errno::EPIPE => e
74
- log "Broken pipe", level: :warning
75
- rescue StandardError => e
76
- notify_error e, level: :internal
77
- ensure
78
- # adjust sleep duration to avoid drift. so wake up always happens on the
79
- # same fractional second.
80
- # note that Time.now is not monotonic. If the clock is changed,
81
- # either manaully or via NTP, the sleep interval might jump.
82
- # an alternative is to use ::Process.clock_gettime(::Process::CLOCK_MONOTONIC),
83
- # to get the current time. this ensures a constant interval, but
84
- # if the clock is changed, the wake up would then happen on a different
85
- # fractional second
86
- next_time += @interval
87
- duration = next_time - Time.now.to_f
88
- task.sleep duration
89
- 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
90
100
  end
91
101
  end
92
102
  end
93
103
 
104
+ def stop_tlc_timer
105
+ return unless @timer
106
+ @timer.stop
107
+ @timer = nil
108
+ end
109
+
94
110
  def timer now
95
111
  return unless @main
96
112
  @main.timer now
data/lib/rsmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.8.3"
2
+ VERSION = "0.9.0"
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.3
4
+ version: 0.9.0
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-11 00:00:00.000000000 Z
11
+ date: 2022-01-31 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"
@@ -203,6 +204,7 @@ files:
203
204
  - documentation/classes_and_modules.md
204
205
  - documentation/collecting_message.md
205
206
  - documentation/message_distribution.md
207
+ - documentation/tasks.md
206
208
  - exe/rsmp
207
209
  - lib/rsmp.rb
208
210
  - lib/rsmp/archive.rb
@@ -234,18 +236,16 @@ files:
234
236
  - lib/rsmp/rsmp.rb
235
237
  - lib/rsmp/site.rb
236
238
  - lib/rsmp/site_proxy.rb
237
- - lib/rsmp/site_proxy_wait.rb
238
239
  - lib/rsmp/supervisor.rb
239
240
  - lib/rsmp/supervisor_proxy.rb
241
+ - lib/rsmp/task.rb
240
242
  - lib/rsmp/tlc/detector_logic.rb
241
243
  - lib/rsmp/tlc/signal_group.rb
242
244
  - lib/rsmp/tlc/signal_plan.rb
243
245
  - lib/rsmp/tlc/traffic_controller.rb
244
246
  - lib/rsmp/tlc/traffic_controller_site.rb
245
247
  - lib/rsmp/version.rb
246
- - lib/rsmp/wait.rb
247
248
  - rsmp.gemspec
248
- - test.rb
249
249
  homepage: https://github.com/rsmp-nordic/rsmp
250
250
  licenses:
251
251
  - MIT
@@ -269,7 +269,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
269
269
  - !ruby/object:Gem::Version
270
270
  version: '0'
271
271
  requirements: []
272
- rubygems_version: 3.2.32
272
+ rubygems_version: 3.3.3
273
273
  signing_key:
274
274
  specification_version: 4
275
275
  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