rsmp 0.29.0 → 0.32.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -7
- data/documentation/collecting_message.md +25 -10
- data/documentation/message_distribution.md +8 -8
- data/lib/rsmp/cli.rb +43 -19
- 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 +24 -22
- data/lib/rsmp/site.rb +43 -3
- data/lib/rsmp/site_proxy.rb +4 -4
- data/lib/rsmp/supervisor.rb +5 -5
- data/lib/rsmp/supervisor_proxy.rb +2 -1
- data/lib/rsmp/tlc/signal_priority.rb +19 -3
- data/lib/rsmp/tlc/traffic_controller.rb +29 -15
- data/lib/rsmp/tlc/traffic_controller_site.rb +4 -1
- data/lib/rsmp/version.rb +1 -1
- data/lib/rsmp.rb +7 -6
- metadata +9 -8
- data/lib/rsmp/collect/listener.rb +0 -23
- data/lib/rsmp/collect/notifier.rb +0 -65
@@ -15,7 +15,7 @@ module RSMP
|
|
15
15
|
@signal_groups = []
|
16
16
|
@detector_logics = []
|
17
17
|
@plans = signal_plans
|
18
|
-
@cycle_time = cycle_time
|
18
|
+
@cycle_time = cycle_time || 10
|
19
19
|
@num_traffic_situations = 1
|
20
20
|
|
21
21
|
if inputs
|
@@ -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
|
@@ -18,7 +18,10 @@ module RSMP
|
|
18
18
|
unless main
|
19
19
|
raise ConfigurationError.new "TLC must have a main component"
|
20
20
|
end
|
21
|
+
end
|
21
22
|
|
23
|
+
def site_type_name
|
24
|
+
"TLC"
|
22
25
|
end
|
23
26
|
|
24
27
|
def start
|
@@ -88,7 +91,7 @@ module RSMP
|
|
88
91
|
begin
|
89
92
|
timer(@clock.now)
|
90
93
|
rescue StandardError => e
|
91
|
-
|
94
|
+
distribute_error e, level: :internal
|
92
95
|
ensure
|
93
96
|
# adjust sleep duration to avoid drift. so wake up always happens on the
|
94
97
|
# 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'
|
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.32.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-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async
|
@@ -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
|