rsmp 0.29.0 → 0.32.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 +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
|