rsmp 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71af49e549129bf32f9137a2799c91b43ba19e5e7adb15f777a181919c19dbd0
4
- data.tar.gz: 15c8f8c96ed3838f0b0b948b5d0e9be895ec965a9f651a529a44b214426242ec
3
+ metadata.gz: f9afdedb545513c5574db59a28f07515866dbd34d8908767813275518ee590cd
4
+ data.tar.gz: e6fa96a531f450ce114601a57f91045ade415bb9317c5155a57a05054acf6481
5
5
  SHA512:
6
- metadata.gz: 33206373986495e8c8d9871c83d465d2961db86c2713e0056eb1e5a0fb6f153dc506c05f549bc52f6963f7aeb7e1b7f78f387b479893babe8f0d77cd0efbffe3
7
- data.tar.gz: 125e125b49bb0a5d99234d8aa4bac4a3107de077fb7adc55a1e70cbf0544c0b163355cfac4a94eeae1e412b8951e4f5fab8d2846187e2d7479c626e0adf81530
6
+ metadata.gz: c3a2fbb33b4789e0cc0200156f759014eab17b51a23f78e486fd8fa67e54da1ac241bdd1c1b6c77ce0b0534d8447607b8806105433920ef7d00733183c2e67de
7
+ data.tar.gz: c6cf57cc0b98b54c541293283b7810de1ce218a3c22454d925db5727706b1d29793493d2cc0bff6f96e932c8dc6e9f5dffab005ebba79785617f9292c056575c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rsmp (0.9.9)
4
+ rsmp (0.9.10)
5
5
  async (~> 1.29.1)
6
6
  async-io (~> 1.32.2)
7
7
  colorize (~> 0.8.1)
@@ -0,0 +1,134 @@
1
+ module RSMP
2
+ module TLC
3
+ # class that maintains the state of TLC inputs
4
+ # indexing is 1-based since that's how the RSMP messages are specified
5
+ class Inputs
6
+ attr_reader :size
7
+
8
+ def initialize size
9
+ @size = size
10
+ reset
11
+ end
12
+
13
+ def reset
14
+ string_size = @size+1
15
+ @value = '0'*string_size
16
+ @forced = '0'*string_size
17
+ @forced_value = '0'*string_size
18
+ @actual = '0'*string_size
19
+ end
20
+
21
+ def set input, value
22
+ check_input input
23
+ report_change(input) do
24
+ @value[input] = to_digit value
25
+ update_actual input
26
+ end
27
+ end
28
+
29
+ def set_forcing input, force=true, forced_value=true
30
+ check_input input
31
+ report_change(input) do
32
+ @forced[input] = to_digit force
33
+ @forced_value[input] = to_digit forced_value
34
+ update_actual input
35
+ end
36
+ end
37
+
38
+ def force input, forced_value=true
39
+ report_change(input) do
40
+ set_forcing input, true, forced_value
41
+ end
42
+ end
43
+
44
+ def release input
45
+ report_change(input) do
46
+ set_forcing input, false, false
47
+ end
48
+ end
49
+
50
+ def value input
51
+ check_input input
52
+ from_digit @value[input]
53
+ end
54
+
55
+ def forced? input
56
+ check_input input
57
+ from_digit @forced[input]
58
+ end
59
+
60
+ def forced_value input
61
+ check_input input
62
+ from_digit @forced_value[input]
63
+ end
64
+
65
+ def actual input
66
+ check_input input
67
+ from_digit @actual[input]
68
+ end
69
+
70
+ def report input
71
+ {
72
+ value: value(input),
73
+ forced: forced?(input),
74
+ forced_value: forced_value(input),
75
+ actual:actual(input)
76
+ }
77
+ end
78
+
79
+ def value_string
80
+ @value[1..-1]
81
+ end
82
+
83
+ def value_string
84
+ @value[1..-1]
85
+ end
86
+
87
+ def forced_string
88
+ @forced[1..-1]
89
+ end
90
+
91
+ def forced_value_string
92
+ @forced[1..-1]
93
+ end
94
+
95
+ def actual_string
96
+ @actual[1..-1]
97
+ end
98
+
99
+ protected
100
+
101
+ def check_input input
102
+ raise ArgumentError.new("Input index #{input} must be in the range 1-#{@size}") if input<1 || input>@size
103
+ end
104
+
105
+ def from_digit input
106
+ input == '1'
107
+ end
108
+
109
+ def to_digit input
110
+ input ? '1' : '0'
111
+ end
112
+
113
+ def update_actual input
114
+ if from_digit @forced[input]
115
+ @actual[input] = @forced_value[input]
116
+ else
117
+ @actual[input] = @value[input]
118
+ end
119
+ end
120
+
121
+ def report_change input, &block
122
+ before = @actual[input]
123
+ yield
124
+ if @actual[input] != before
125
+ from_digit @actual[input]
126
+ else
127
+ nil
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+
@@ -19,12 +19,12 @@ module RSMP
19
19
  @num_traffic_situations = 1
20
20
 
21
21
  if inputs
22
- @num_inputs = inputs['total'] || 8
22
+ num_inputs = inputs['total']
23
23
  @input_programming = inputs['programming']
24
24
  else
25
- @num_inputs = 8
26
25
  @input_programming = nil
27
26
  end
27
+ @inputs = TLC::Inputs.new num_inputs || 8
28
28
 
29
29
  @startup_sequence = startup_sequence
30
30
  @live_output = live_output
@@ -48,25 +48,18 @@ module RSMP
48
48
 
49
49
  def reset
50
50
  reset_modes
51
-
52
51
  @cycle_counter = 0
53
52
  @plan = 1
54
53
  @intersection = 0
55
54
  @emergency_route = false
56
55
  @emergency_route_number = 0
57
56
  @traffic_situation = 0
58
-
59
- @inputs = '0'*@num_inputs
60
- @input_activations = '0'*@num_inputs
61
- @input_forced = '0'*@num_inputs
62
- @input_forced_values = '0'*@num_inputs
63
- @input_results = '0'*@num_inputs
64
-
65
57
  @day_time_table = {}
66
58
  @startup_sequence_active = false
67
59
  @startup_sequence_initiated_at = nil
68
60
  @startup_sequence_pos = 0
69
61
  @time_int = nil
62
+ @inputs.reset
70
63
  end
71
64
 
72
65
  def dark?
@@ -263,43 +256,34 @@ module RSMP
263
256
  end
264
257
  end
265
258
 
266
- def recompute_input idx
267
- if @input_forced[idx] == '1'
268
- @input_results[idx] = @input_forced_values[idx]
269
- elsif @input_activations[idx]=='1'
270
- @input_results[idx] = '1'
271
- else
272
- @input_results[idx] = bool_to_digit( @inputs[idx]=='1' )
259
+ def input_logic input, change
260
+ return unless @input_programming && change != nil
261
+ actions = @input_programming[input]
262
+ return unless actions
263
+ if actions['raise']
264
+ alarm_code = actions['raise']
265
+ if change
266
+ log "Activating alarm #{alarm_code}, because input #{input} was activated", level: :info
267
+ else
268
+ log "Deactivating alarm #{alarm_code}, because input #{input} was deactivated", level: :info
269
+ end
273
270
  end
274
271
  end
275
272
 
276
273
  def handle_m0006 arg
277
274
  @node.verify_security_code 2, arg['securityCode']
278
275
  input = arg['input'].to_i
279
- unless input>0 && input<=@num_inputs
280
- raise MessageRejected.new("Input #{idx} is invalid, must be in the range 1-#{@num_inputs}")
281
- end
282
- idx = input - 1
283
- @input_activations[idx] = bool_string_to_digit arg['status']
284
- recompute_input idx
285
- activate = @input_activations[idx] == '1'
286
- if activate
276
+ status = string_to_bool arg['status']
277
+ unless input>=1 && input<=@inputs.size
278
+ raise MessageRejected.new("Input must be in the range 1-#{@inputs.size}")
279
+ end
280
+ if status
287
281
  log "Activating input #{input}", level: :info
288
282
  else
289
283
  log "Deactivating input #{input}", level: :info
290
284
  end
291
-
292
- if @input_programming
293
- actions = @input_programming[input]
294
- if actions && actions['raise']
295
- alarm_code = actions['raise']
296
- if activate
297
- log "Activating alarm #{alarm_code}, due to input #{input} programming", level: :info
298
- else
299
- log "Deactivating alarm #{alarm_code}, due to input #{input} programming", level: :info
300
- end
301
- end
302
- end
285
+ change = @inputs.set input, status
286
+ input_logic input, change if change != nil
303
287
  end
304
288
 
305
289
  def handle_m0007 arg
@@ -361,6 +345,17 @@ module RSMP
361
345
  @node.verify_security_code 2, arg['securityCode']
362
346
  end
363
347
 
348
+ def string_to_bool bool_str
349
+ case bool_str
350
+ when 'True'
351
+ true
352
+ when 'False'
353
+ false
354
+ else
355
+ raise RSMP::MessageRejected.new "Invalid boolean '#{bool}', must be 'True' or 'False'"
356
+ end
357
+ end
358
+
364
359
  def bool_string_to_digit bool
365
360
  case bool
366
361
  when 'True'
@@ -379,20 +374,18 @@ module RSMP
379
374
  def handle_m0019 arg
380
375
  @node.verify_security_code 2, arg['securityCode']
381
376
  input = arg['input'].to_i
382
- idx = input - 1
383
- unless input>0 && input<=@num_inputs
384
- raise MessageRejected.new("Can't force input #{input}, only have #{@num_inputs} inputs")
385
- end
386
- @input_forced[idx] = bool_string_to_digit arg['status']
387
- if @input_forced[idx]
388
- @input_forced_values[idx] = bool_string_to_digit arg['inputValue']
377
+ force = string_to_bool arg['status']
378
+ forced_value = string_to_bool arg['inputValue']
379
+ unless input>=1 && input<=@inputs.size
380
+ raise MessageRejected.new("Input must be in the range 1-#{@inputs.size}")
389
381
  end
390
- recompute_input idx
391
- if @input_forced[idx]
392
- log "Forcing input #{input} to #{@input_forced_values[idx]}", level: :info
382
+ if force
383
+ log "Forcing input #{input} to #{forced_value}", level: :info
393
384
  else
394
385
  log "Releasing input #{input}", level: :info
395
386
  end
387
+ change = @inputs.set_forcing input, force, forced_value
388
+ input_logic input, change if change != nil
396
389
  end
397
390
 
398
391
  def handle_m0020 arg
@@ -502,7 +495,7 @@ module RSMP
502
495
  def handle_s0003 status_code, status_name=nil
503
496
  case status_name
504
497
  when 'inputstatus'
505
- TrafficControllerSite.make_status @input_results
498
+ TrafficControllerSite.make_status @inputs.actual_string
506
499
  when 'extendedinputstatus'
507
500
  TrafficControllerSite.make_status 0.to_s
508
501
  end
@@ -704,7 +697,7 @@ module RSMP
704
697
  def handle_s0029 status_code, status_name=nil
705
698
  case status_name
706
699
  when 'status'
707
- TrafficControllerSite.make_status @input_forced
700
+ TrafficControllerSite.make_status @inputs.forced_string
708
701
  end
709
702
  end
710
703
 
data/lib/rsmp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RSMP
2
- VERSION = "0.9.9"
2
+ VERSION = "0.9.10"
3
3
  end
data/lib/rsmp.rb CHANGED
@@ -44,6 +44,7 @@ require 'rsmp/tlc/traffic_controller'
44
44
  require 'rsmp/tlc/detector_logic'
45
45
  require 'rsmp/tlc/signal_group'
46
46
  require 'rsmp/tlc/signal_plan'
47
+ require 'rsmp/tlc/inputs'
47
48
 
48
49
  require 'rsmp/convert/import/yaml'
49
50
  require 'rsmp/convert/export/json_schema'
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.9.9
4
+ version: 0.9.10
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-03-10 00:00:00.000000000 Z
11
+ date: 2022-03-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -243,6 +243,7 @@ files:
243
243
  - lib/rsmp/supervisor_proxy.rb
244
244
  - lib/rsmp/task.rb
245
245
  - lib/rsmp/tlc/detector_logic.rb
246
+ - lib/rsmp/tlc/inputs.rb
246
247
  - lib/rsmp/tlc/signal_group.rb
247
248
  - lib/rsmp/tlc/signal_plan.rb
248
249
  - lib/rsmp/tlc/traffic_controller.rb