rsmp 0.28.1 → 0.31.0
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 +16 -18
- data/config/tlc.yaml +1 -1
- data/documentation/collecting_message.md +25 -10
- data/documentation/message_distribution.md +8 -8
- data/lib/rsmp/collect/ack_collector.rb +7 -5
- data/lib/rsmp/collect/aggregated_status_collector.rb +4 -2
- data/lib/rsmp/collect/alarm_collector.rb +10 -10
- data/lib/rsmp/collect/{alarm_query.rb → alarm_matcher.rb} +2 -2
- data/lib/rsmp/collect/collector.rb +69 -66
- data/lib/rsmp/collect/{command_query.rb → command_matcher.rb} +2 -2
- data/lib/rsmp/collect/command_response_collector.rb +3 -3
- data/lib/rsmp/collect/distributor.rb +65 -0
- data/lib/rsmp/collect/filter.rb +10 -5
- data/lib/rsmp/collect/{query.rb → matcher.rb} +1 -1
- data/lib/rsmp/collect/queue.rb +39 -0
- data/lib/rsmp/collect/receiver.rb +40 -0
- data/lib/rsmp/collect/state_collector.rb +57 -57
- data/lib/rsmp/collect/status_collector.rb +9 -6
- data/lib/rsmp/collect/{status_query.rb → status_matcher.rb} +2 -2
- data/lib/rsmp/component.rb +4 -0
- data/lib/rsmp/node.rb +1 -1
- data/lib/rsmp/proxy.rb +17 -17
- data/lib/rsmp/site_proxy.rb +4 -4
- data/lib/rsmp/supervisor.rb +4 -4
- data/lib/rsmp/supervisor_proxy.rb +2 -1
- data/lib/rsmp/tlc/signal_priority.rb +19 -3
- data/lib/rsmp/tlc/traffic_controller.rb +28 -14
- data/lib/rsmp/tlc/traffic_controller_site.rb +1 -1
- data/lib/rsmp/version.rb +1 -1
- data/lib/rsmp.rb +7 -6
- data/rsmp.gemspec +5 -5
- metadata +19 -18
- data/lib/rsmp/collect/listener.rb +0 -23
- data/lib/rsmp/collect/notifier.rb +0 -65
@@ -10,19 +10,35 @@ class RSMP::TLC::SignalPriority
|
|
10
10
|
set_state 'received'
|
11
11
|
end
|
12
12
|
|
13
|
+
def prune?
|
14
|
+
@state == 'stale' || @state == 'completed'
|
15
|
+
end
|
16
|
+
|
17
|
+
def cancel
|
18
|
+
if @state == 'activated'
|
19
|
+
set_state 'completed'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
13
23
|
def set_state state
|
14
24
|
@state = state
|
15
25
|
@updated = node.clock.now
|
16
|
-
node.signal_priority_changed self, @state
|
26
|
+
@node.signal_priority_changed self, @state
|
17
27
|
end
|
18
28
|
|
19
29
|
def timer
|
20
30
|
@age = @node.clock.now - @updated
|
21
31
|
case @state
|
22
32
|
when 'received'
|
23
|
-
|
33
|
+
if @age >= 0.5
|
34
|
+
@node.log "Priority request #{@id} activated.", level: :info
|
35
|
+
set_state 'activated'
|
36
|
+
end
|
24
37
|
when 'activated'
|
25
|
-
|
38
|
+
if @age >= 1
|
39
|
+
@node.log "Priority request #{@id} became stale.", level: :info
|
40
|
+
set_state 'stale'
|
41
|
+
end
|
26
42
|
end
|
27
43
|
end
|
28
44
|
end
|
@@ -107,10 +107,7 @@ module RSMP
|
|
107
107
|
|
108
108
|
def timer now
|
109
109
|
# TODO use monotone timer, to avoid jumps in case the user sets the system time
|
110
|
-
|
111
|
-
return if time == @time_int
|
112
|
-
@time_int = time
|
113
|
-
move_cycle_counter
|
110
|
+
return unless move_cycle_counter
|
114
111
|
check_functional_position_timeout
|
115
112
|
move_startup_sequence if @startup_sequence_active
|
116
113
|
|
@@ -118,17 +115,20 @@ module RSMP
|
|
118
115
|
@signal_priorities.each {|priority| priority.timer }
|
119
116
|
|
120
117
|
output_states
|
121
|
-
prune_priorities
|
122
118
|
end
|
123
119
|
|
124
120
|
def signal_priority_changed priority, state
|
125
|
-
#puts "priority #{priority.id} -> #{state}"
|
126
121
|
end
|
127
122
|
|
123
|
+
# remove all stale priority requests
|
128
124
|
def prune_priorities
|
129
|
-
|
130
|
-
|
131
|
-
|
125
|
+
@signal_priorities.delete_if {|priority| priority.prune? }
|
126
|
+
end
|
127
|
+
|
128
|
+
# this method is called by the supervisor proxy each time status updates have been send
|
129
|
+
# we can then prune our priority request list
|
130
|
+
def status_updates_sent
|
131
|
+
prune_priorities
|
132
132
|
end
|
133
133
|
|
134
134
|
def get_priority_list
|
@@ -143,7 +143,9 @@ module RSMP
|
|
143
143
|
|
144
144
|
def move_cycle_counter
|
145
145
|
counter = Time.now.to_i % @cycle_time
|
146
|
+
changed = counter != @cycle_counter
|
146
147
|
@cycle_counter = counter
|
148
|
+
changed
|
147
149
|
end
|
148
150
|
|
149
151
|
def check_functional_position_timeout
|
@@ -251,10 +253,20 @@ module RSMP
|
|
251
253
|
|
252
254
|
def handle_m0001 arg, options={}
|
253
255
|
@node.verify_security_code 2, arg['securityCode']
|
256
|
+
|
257
|
+
# timeout is specified in minutes, but we take 1 to mean 1s
|
258
|
+
# this is not according to the curent rsmp spec, but is done
|
259
|
+
# to speed up testing
|
260
|
+
timeout = arg['timeout'].to_i
|
261
|
+
if timeout == 1
|
262
|
+
timeout = 1
|
263
|
+
else
|
264
|
+
timeout *= 60
|
265
|
+
end
|
266
|
+
|
254
267
|
switch_functional_position arg['status'],
|
255
|
-
timeout:
|
268
|
+
timeout: timeout,
|
256
269
|
source: 'forced'
|
257
|
-
|
258
270
|
end
|
259
271
|
|
260
272
|
def handle_m0002 arg, options={}
|
@@ -510,17 +522,19 @@ module RSMP
|
|
510
522
|
eta = arg['eta']
|
511
523
|
vehicleType = arg['vehicleType']
|
512
524
|
@signal_priorities << SignalPriority.new(node:self, id:id, level:level, eta:eta, vehicleType:vehicleType)
|
513
|
-
log "Priority request for signal group #{signal_group.c_id} received
|
525
|
+
log "Priority request #{id} for signal group #{signal_group.c_id} received.", level: :info
|
514
526
|
end
|
515
527
|
when 'update'
|
516
528
|
if priority
|
517
|
-
log "Priority Request #{id}
|
529
|
+
log "Updating Priority Request #{id}", level: :info
|
530
|
+
|
518
531
|
else
|
519
532
|
raise MessageRejected.new("Cannot update priority request #{id}, not found")
|
520
533
|
end
|
521
534
|
when 'cancel'
|
522
535
|
if priority
|
523
|
-
|
536
|
+
priority.cancel
|
537
|
+
log "Priority request with id #{id} cancelled.", level: :info
|
524
538
|
else
|
525
539
|
raise MessageRejected.new("Cannot cancel priority request #{id}, not found")
|
526
540
|
end
|
@@ -88,7 +88,7 @@ module RSMP
|
|
88
88
|
begin
|
89
89
|
timer(@clock.now)
|
90
90
|
rescue StandardError => e
|
91
|
-
|
91
|
+
distribute_error e, level: :internal
|
92
92
|
ensure
|
93
93
|
# adjust sleep duration to avoid drift. so wake up always happens on the
|
94
94
|
# same fractional second.
|
data/lib/rsmp/version.rb
CHANGED
data/lib/rsmp.rb
CHANGED
@@ -17,15 +17,16 @@ require 'rsmp/logging'
|
|
17
17
|
require 'rsmp/node'
|
18
18
|
require 'rsmp/supervisor'
|
19
19
|
require 'rsmp/components'
|
20
|
-
require 'rsmp/collect/
|
21
|
-
require 'rsmp/collect/
|
20
|
+
require 'rsmp/collect/distributor'
|
21
|
+
require 'rsmp/collect/receiver'
|
22
|
+
require 'rsmp/collect/queue'
|
22
23
|
require 'rsmp/collect/collector'
|
23
24
|
require 'rsmp/collect/state_collector'
|
24
25
|
require 'rsmp/collect/filter'
|
25
|
-
require 'rsmp/collect/
|
26
|
-
require 'rsmp/collect/
|
27
|
-
require 'rsmp/collect/
|
28
|
-
require 'rsmp/collect/
|
26
|
+
require 'rsmp/collect/matcher'
|
27
|
+
require 'rsmp/collect/status_matcher'
|
28
|
+
require 'rsmp/collect/command_matcher'
|
29
|
+
require 'rsmp/collect/alarm_matcher'
|
29
30
|
require 'rsmp/collect/status_collector'
|
30
31
|
require 'rsmp/collect/command_response_collector'
|
31
32
|
require 'rsmp/collect/aggregated_status_collector'
|
data/rsmp.gemspec
CHANGED
@@ -30,16 +30,16 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
31
|
spec.require_paths = ["lib"]
|
32
32
|
|
33
|
-
spec.add_dependency "async", "~> 2.
|
34
|
-
spec.add_dependency "async-io", "~> 1.
|
33
|
+
spec.add_dependency "async", "~> 2.12.0"
|
34
|
+
spec.add_dependency "async-io", "~> 1.43.0"
|
35
35
|
spec.add_dependency "colorize", "~> 1.1"
|
36
|
-
spec.add_dependency "rsmp_schema", "~> 0.
|
36
|
+
spec.add_dependency "rsmp_schema", "~> 0.7.0"
|
37
37
|
|
38
38
|
spec.add_development_dependency "bundler", "~> 2.5.7"
|
39
39
|
spec.add_development_dependency "rake", "~> 13.2.0"
|
40
40
|
spec.add_development_dependency "rspec", "~> 3.13.0"
|
41
|
-
spec.add_development_dependency "rspec-expectations", "~> 3.13.
|
42
|
-
spec.add_development_dependency "timecop", "~> 0.9.
|
41
|
+
spec.add_development_dependency "rspec-expectations", "~> 3.13.1"
|
42
|
+
spec.add_development_dependency "timecop", "~> 0.9.9"
|
43
43
|
spec.add_development_dependency "cucumber", "~> 9.2.0"
|
44
44
|
spec.add_development_dependency "aruba" , "~> 2.2.0"
|
45
45
|
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.
|
4
|
+
version: 0.31.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: 2024-
|
11
|
+
date: 2024-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.12.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.12.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: async-io
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: 1.43.0
|
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.
|
40
|
+
version: 1.43.0
|
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: 0.
|
61
|
+
version: 0.7.0
|
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: 0.
|
68
|
+
version: 0.7.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: bundler
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,28 +114,28 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 3.13.
|
117
|
+
version: 3.13.1
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 3.13.
|
124
|
+
version: 3.13.1
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: timecop
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.9.
|
131
|
+
version: 0.9.9
|
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: 0.9.
|
138
|
+
version: 0.9.9
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: cucumber
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -200,18 +200,19 @@ files:
|
|
200
200
|
- lib/rsmp/collect/ack_collector.rb
|
201
201
|
- lib/rsmp/collect/aggregated_status_collector.rb
|
202
202
|
- lib/rsmp/collect/alarm_collector.rb
|
203
|
-
- lib/rsmp/collect/
|
203
|
+
- lib/rsmp/collect/alarm_matcher.rb
|
204
204
|
- lib/rsmp/collect/collector.rb
|
205
|
-
- lib/rsmp/collect/
|
205
|
+
- lib/rsmp/collect/command_matcher.rb
|
206
206
|
- lib/rsmp/collect/command_response_collector.rb
|
207
|
+
- lib/rsmp/collect/distributor.rb
|
207
208
|
- lib/rsmp/collect/filter.rb
|
208
|
-
- lib/rsmp/collect/
|
209
|
+
- lib/rsmp/collect/matcher.rb
|
209
210
|
- lib/rsmp/collect/message_matchers.rb
|
210
|
-
- lib/rsmp/collect/
|
211
|
-
- lib/rsmp/collect/
|
211
|
+
- lib/rsmp/collect/queue.rb
|
212
|
+
- lib/rsmp/collect/receiver.rb
|
212
213
|
- lib/rsmp/collect/state_collector.rb
|
213
214
|
- lib/rsmp/collect/status_collector.rb
|
214
|
-
- lib/rsmp/collect/
|
215
|
+
- lib/rsmp/collect/status_matcher.rb
|
215
216
|
- lib/rsmp/component.rb
|
216
217
|
- lib/rsmp/component_base.rb
|
217
218
|
- lib/rsmp/component_proxy.rb
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# Receives items from a Notifier, as long as it's
|
2
|
-
# installed as a listener.
|
3
|
-
|
4
|
-
module RSMP
|
5
|
-
class Listener
|
6
|
-
include Inspect
|
7
|
-
|
8
|
-
def initialize notifier, options={}
|
9
|
-
@notifier = notifier
|
10
|
-
end
|
11
|
-
|
12
|
-
def change_notifier notifier
|
13
|
-
@notifier.remove_listener self if @notifier
|
14
|
-
@notifier = notifier
|
15
|
-
end
|
16
|
-
|
17
|
-
def notify message
|
18
|
-
end
|
19
|
-
|
20
|
-
def notify_error error, options={}
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# Distributes messages to listeners
|
2
|
-
|
3
|
-
module RSMP
|
4
|
-
module Notifier
|
5
|
-
attr_reader :listeners
|
6
|
-
|
7
|
-
include Inspect
|
8
|
-
|
9
|
-
def inspect
|
10
|
-
"#<#{self.class.name}:#{self.object_id}, #{inspector(:@listeners)}>"
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize_distributor
|
14
|
-
@listeners = []
|
15
|
-
@defer_notify = false
|
16
|
-
@notify_queue = []
|
17
|
-
end
|
18
|
-
|
19
|
-
def clear_deferred_notify &block
|
20
|
-
@notify_queue = []
|
21
|
-
end
|
22
|
-
|
23
|
-
def deferred_notify &block
|
24
|
-
was, @defer_notify = @defer_notify, true
|
25
|
-
yield
|
26
|
-
dequeue_notify
|
27
|
-
ensure
|
28
|
-
@defer_notify = was
|
29
|
-
@notify_queue = []
|
30
|
-
end
|
31
|
-
|
32
|
-
def dequeue_notify
|
33
|
-
@notify_queue.each { |message| notify_without_defer message }
|
34
|
-
ensure
|
35
|
-
@notify_queue = []
|
36
|
-
end
|
37
|
-
|
38
|
-
def add_listener listener
|
39
|
-
raise ArgumentError unless listener
|
40
|
-
@listeners << listener unless @listeners.include? listener
|
41
|
-
end
|
42
|
-
|
43
|
-
def remove_listener listener
|
44
|
-
raise ArgumentError unless listener
|
45
|
-
@listeners.delete listener
|
46
|
-
end
|
47
|
-
|
48
|
-
def notify message
|
49
|
-
raise ArgumentError unless message
|
50
|
-
if @defer_notify
|
51
|
-
@notify_queue << message
|
52
|
-
else
|
53
|
-
notify_without_defer message
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def notify_without_defer message
|
58
|
-
@listeners.each { |listener| listener.notify message }
|
59
|
-
end
|
60
|
-
|
61
|
-
def distribute_error error, options={}
|
62
|
-
@listeners.each { |listener| listener.notify_error error, options }
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|