rsmp_schema 0.1.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/rsmp_schema/convert/export/json_schema.rb +96 -54
- data/lib/rsmp_schema/schema.rb +80 -24
- data/lib/rsmp_schema/version.rb +1 -1
- data/lib/rsmp_schema.rb +2 -0
- data/schemas/tlc/1.0.10/sxl.yaml +20 -40
- data/schemas/tlc/1.0.13/sxl.yaml +20 -40
- data/schemas/tlc/1.0.14/sxl.yaml +20 -40
- data/schemas/tlc/1.0.15/sxl.yaml +20 -40
- data/schemas/tlc/1.0.7/sxl.yaml +20 -40
- data/schemas/tlc/1.0.8/sxl.yaml +20 -40
- data/schemas/tlc/1.0.9/sxl.yaml +20 -40
- data/schemas/tlc/1.1/commands/M0001.json +1 -1
- data/schemas/tlc/1.1/statuses/S0032.json +1 -1
- data/schemas/tlc/1.1/statuses/S0033.json +93 -0
- data/schemas/tlc/1.1/statuses/S0205.json +8 -2
- data/schemas/tlc/1.1/statuses/S0206.json +8 -2
- data/schemas/tlc/1.1/statuses/S0207.json +8 -2
- data/schemas/tlc/1.1/statuses/S0208.json +72 -18
- data/schemas/tlc/1.1/statuses/statuses.json +16 -0
- data/schemas/tlc/1.1/sxl.yaml +186 -121
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c5718eb96e00289525b0997cc296fcc93b029966d40c80a544d7b075d4c870b
|
4
|
+
data.tar.gz: c64cabf0d6cf081bd1434401eb9794691ac126dcf2fe64316ddbfe3fbef31f5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 454414a51cf1e8ffa4f978a997ca702726058d82a0e1e0e6645fc74122e945d42584b38926a97a464ecbb591ec3afaf23e85a4639f704815abf431895c3e2f52
|
7
|
+
data.tar.gz: a48f7a8aa43283cd5448376c7f26f7c060d10fda7caf7e95f1b0f6e54c81432af867a9cbfa25ff6cb7608d1868e04fa1c9b6b5677e7550358e11073b18539634
|
data/Gemfile.lock
CHANGED
@@ -21,67 +21,61 @@ module RSMP
|
|
21
21
|
JSON.generate(item,@@json_options)
|
22
22
|
end
|
23
23
|
|
24
|
+
# convert a yaml item to json schema
|
24
25
|
def self.build_value item
|
25
26
|
out = {}
|
27
|
+
out['description'] = item['description'] if item['description']
|
26
28
|
|
27
|
-
if item['
|
28
|
-
|
29
|
+
if item['type'] =~/_list$/
|
30
|
+
handle_string_list item, out
|
31
|
+
else
|
32
|
+
handle_types item, out
|
33
|
+
handle_enum item, out
|
34
|
+
handle_pattern item, out
|
29
35
|
end
|
36
|
+
wrap_refs out
|
37
|
+
end
|
30
38
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
value_list = item["values"].keys.join('|')
|
45
|
-
out['pattern'] = /(?-mix:^(#{value_list})(?:,(#{value_list}))*$)/
|
46
|
-
end
|
47
|
-
|
48
|
-
if item["pattern"]
|
49
|
-
puts "Warning: Pattern not support for lists: #{item.inspect}"
|
50
|
-
end
|
39
|
+
# convert an item which is not a string-list, to json schema
|
40
|
+
def self.handle_types item, out
|
41
|
+
case item['type']
|
42
|
+
when "string", "base64"
|
43
|
+
out["type"] = "string"
|
44
|
+
when "boolean"
|
45
|
+
out["$ref"] = "../../../core/3.1.1/definitions.json#/boolean"
|
46
|
+
when "timestamp"
|
47
|
+
out["$ref"] = "../../../core/3.1.1/definitions.json#/timestamp"
|
48
|
+
when "integer", "ordinal", "unit", "scale", "long"
|
49
|
+
out["$ref"] = "../../../core/3.1.1/definitions.json#/integer"
|
50
|
+
when 'array' # a json array
|
51
|
+
build_json_array item['items'], out
|
51
52
|
else
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
when "boolean"
|
56
|
-
out["$ref"] = "../../../core/3.1.1/definitions.json#/boolean"
|
57
|
-
when "timestamp"
|
58
|
-
out["$ref"] = "../../../core/3.1.1/definitions.json#/timestamp"
|
59
|
-
when "integer", "ordinal", "unit", "scale", "long"
|
60
|
-
out["$ref"] = "../../../core/3.1.1/definitions.json#/integer"
|
61
|
-
else
|
62
|
-
out["type"] = "string"
|
63
|
-
end
|
64
|
-
|
65
|
-
if item["values"]
|
66
|
-
case item["values"]
|
67
|
-
when Hash
|
68
|
-
out["enum"] = item["values"].keys.sort
|
69
|
-
when Array
|
70
|
-
out["enum"] = item["values"].sort
|
71
|
-
else
|
72
|
-
raise "Error: Values must be specified as either a Hash or an Array"
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
53
|
+
out["type"] = "string"
|
54
|
+
end
|
55
|
+
end
|
76
56
|
|
77
|
-
|
78
|
-
|
79
|
-
|
57
|
+
# convert an yaml item with type: array to json schema
|
58
|
+
def self.build_json_array item, out
|
59
|
+
required = item.select { |k,v| v['optional'] != true }.keys.sort
|
60
|
+
out.merge!({
|
61
|
+
"type" => "array",
|
62
|
+
"items" => {
|
63
|
+
"type" => "object",
|
64
|
+
"required" => required,
|
65
|
+
"additionalProperties": false
|
66
|
+
}
|
67
|
+
})
|
68
|
+
out["items"]["properties"] = {}
|
69
|
+
item.each_pair do |key,v|
|
70
|
+
out["items"]["properties"][key] = build_value(v)
|
80
71
|
end
|
72
|
+
out
|
73
|
+
end
|
81
74
|
|
82
|
-
|
83
|
-
|
84
|
-
|
75
|
+
# with draft-07 and older, using a $ref mean all other properties are ignored.
|
76
|
+
# to avoid this we need to use an allOf.
|
77
|
+
# this is changed from draft-08, but unfortunately, there is still no Ruby validator for that
|
78
|
+
def self.wrap_refs out
|
85
79
|
if out.keys.include? '$ref'
|
86
80
|
ref = out.delete '$ref'
|
87
81
|
{ "allOf" => [out,{"$ref"=>ref}]}
|
@@ -90,6 +84,47 @@ module RSMP
|
|
90
84
|
end
|
91
85
|
end
|
92
86
|
|
87
|
+
# convert a yaml item with list: true to json schema
|
88
|
+
def self.handle_string_list item, out
|
89
|
+
case item['type']
|
90
|
+
when "boolean_list"
|
91
|
+
out["$ref"] = "../../../core/3.1.1/definitions.json#/boolean_list"
|
92
|
+
when "integer_list"
|
93
|
+
out["$ref"] = "../../../core/3.1.1/definitions.json#/integer_list"
|
94
|
+
when "string_list"
|
95
|
+
out["$ref"] = "../../../core/3.1.1/definitions.json#/string_list"
|
96
|
+
else
|
97
|
+
raise "Error: List of #{item['type']} is not supported: #{item.inspect}"
|
98
|
+
end
|
99
|
+
|
100
|
+
if item["values"]
|
101
|
+
value_list = item["values"].keys.join('|')
|
102
|
+
out['pattern'] = /(?-mix:^(#{value_list})(?:,(#{value_list}))*$)/
|
103
|
+
end
|
104
|
+
|
105
|
+
puts "Warning: Pattern not support for lists: #{item.inspect}" if item["pattern"]
|
106
|
+
end
|
107
|
+
|
108
|
+
# convert yaml values to jsons schema enum
|
109
|
+
def self.handle_enum item, out
|
110
|
+
if item["values"]
|
111
|
+
case item["values"]
|
112
|
+
when Hash
|
113
|
+
out["enum"] = item["values"].keys.sort
|
114
|
+
when Array
|
115
|
+
out["enum"] = item["values"].sort
|
116
|
+
else
|
117
|
+
raise "Error: Values must be specified as either a Hash or an Array"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# convert yaml pattern to jsons schema
|
123
|
+
def self.handle_pattern item, out
|
124
|
+
out["pattern"] = item["pattern"] if item["pattern"]
|
125
|
+
end
|
126
|
+
|
127
|
+
# convert yaml alarm/status/command item to corresponding jsons schema
|
93
128
|
def self.build_item item, property_key: 'v'
|
94
129
|
json = { "allOf" => [ { "description" => item['description'] } ] }
|
95
130
|
if item['arguments']
|
@@ -104,6 +139,7 @@ module RSMP
|
|
104
139
|
json
|
105
140
|
end
|
106
141
|
|
142
|
+
# convert alarms to json schema
|
107
143
|
def self.output_alarms out, items
|
108
144
|
list = items.keys.sort.map do |key|
|
109
145
|
{
|
@@ -121,11 +157,13 @@ module RSMP
|
|
121
157
|
items.each_pair { |key,item| output_alarm out, key, item }
|
122
158
|
end
|
123
159
|
|
160
|
+
# convert an alarm to json schema
|
124
161
|
def self.output_alarm out, key, item
|
125
162
|
json = build_item item
|
126
163
|
out["alarms/#{key}.json"] = output_json json
|
127
164
|
end
|
128
165
|
|
166
|
+
# convert statuses to json schema
|
129
167
|
def self.output_statuses out, items
|
130
168
|
list = [ { "properties" => { "sCI" => { "enum"=> items.keys.sort }}} ]
|
131
169
|
items.keys.sort.each do |key|
|
@@ -139,11 +177,13 @@ module RSMP
|
|
139
177
|
items.each_pair { |key,item| output_status out, key, item }
|
140
178
|
end
|
141
179
|
|
180
|
+
# convert a status to json schema
|
142
181
|
def self.output_status out, key, item
|
143
182
|
json = build_item item, property_key:'s'
|
144
183
|
out["statuses/#{key}.json"] = output_json json
|
145
184
|
end
|
146
185
|
|
186
|
+
# convert commands to json schema
|
147
187
|
def self.output_commands out, items
|
148
188
|
list = [ { "properties" => { "cCI" => { "enum"=> items.keys.sort }}} ]
|
149
189
|
items.keys.sort.each do |key|
|
@@ -164,12 +204,14 @@ module RSMP
|
|
164
204
|
items.each_pair { |key,item| output_command out, key, item }
|
165
205
|
end
|
166
206
|
|
207
|
+
# convert a command to json schema
|
167
208
|
def self.output_command out, key, item
|
168
209
|
json = build_item item
|
169
210
|
json["allOf"].first["properties"]['cO'] = { "const" => item['command'] }
|
170
211
|
out["commands/#{key}.json"] = output_json json
|
171
212
|
end
|
172
213
|
|
214
|
+
# output the json schema root
|
173
215
|
def self.output_root out, meta
|
174
216
|
json = {
|
175
217
|
"name"=> meta['name'],
|
@@ -197,6 +239,7 @@ module RSMP
|
|
197
239
|
out["sxl.json"] = output_json json
|
198
240
|
end
|
199
241
|
|
242
|
+
# generate the json schema from a string containing yaml
|
200
243
|
def self.generate sxl
|
201
244
|
out = {}
|
202
245
|
output_root out, sxl[:meta]
|
@@ -206,6 +249,7 @@ module RSMP
|
|
206
249
|
out
|
207
250
|
end
|
208
251
|
|
252
|
+
# convert yaml to json schema and write files to a folder
|
209
253
|
def self.write sxl, folder
|
210
254
|
out = generate sxl
|
211
255
|
out.each_pair do |relative_path,str|
|
@@ -215,9 +259,7 @@ module RSMP
|
|
215
259
|
file.puts str
|
216
260
|
end
|
217
261
|
end
|
218
|
-
|
219
262
|
end
|
220
|
-
|
221
263
|
end
|
222
264
|
end
|
223
265
|
end
|
data/lib/rsmp_schema/schema.rb
CHANGED
@@ -6,32 +6,66 @@ end
|
|
6
6
|
module RSMP::Schema
|
7
7
|
@@schemas = nil
|
8
8
|
|
9
|
-
def self.
|
10
|
-
|
9
|
+
def self.setup
|
10
|
+
@@schemas = {}
|
11
11
|
schemas_path = File.expand_path( File.join(__dir__,'..','..','schemas') )
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
12
|
+
Dir.glob("#{schemas_path}/*").select {|f| File.directory? f}.each do |type_path|
|
13
|
+
type = File.basename(type_path).to_sym
|
14
|
+
@@schemas[type] = {}
|
15
|
+
Dir.glob("#{type_path}/*").select {|f| File.directory? f}.each do |schema_path|
|
16
|
+
version = File.basename(schema_path)
|
17
|
+
if type == :core
|
18
|
+
file = 'rsmp.json'
|
19
|
+
else
|
20
|
+
file = 'sxl.json'
|
21
|
+
end
|
22
|
+
@@schemas[type][version] = JSONSchemer.schema(
|
23
|
+
Pathname.new(File.join(schema_path,file))
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# get all schemas, oganized by type and version
|
30
|
+
def self.schemas
|
31
|
+
raise RuntimeError.new("No schemas available, perhaps Schema.setup was never called?") unless @@schemas
|
32
|
+
@@schemas
|
33
|
+
end
|
34
|
+
|
35
|
+
# get array of core schema versions
|
36
|
+
def self.core_versions
|
37
|
+
versions :core
|
38
|
+
end
|
39
|
+
|
40
|
+
# get earliest core schema version
|
41
|
+
def self.earliest_core_version
|
42
|
+
earliest_version :core
|
33
43
|
end
|
34
44
|
|
45
|
+
# get latesty core schema version
|
46
|
+
def self.latest_core_version
|
47
|
+
latest_version :core
|
48
|
+
end
|
49
|
+
|
50
|
+
# get array of schema versions for a particular schema type
|
51
|
+
def self.versions type
|
52
|
+
schemas = find_schemas!(type).keys
|
53
|
+
sort_versions(schemas)
|
54
|
+
end
|
55
|
+
|
56
|
+
# get earliest schema version for a particular schema type
|
57
|
+
def self.earliest_version type
|
58
|
+
schemas = find_schemas!(type).keys
|
59
|
+
sort_versions(schemas).first
|
60
|
+
end
|
61
|
+
|
62
|
+
# get latest schema version for a particular schema type
|
63
|
+
def self.latest_version type
|
64
|
+
schemas = find_schemas!(type).keys
|
65
|
+
sort_versions(schemas).last
|
66
|
+
end
|
67
|
+
|
68
|
+
# validate an rsmp messages using a schema object
|
35
69
|
def self.validate_using_schema message, schema
|
36
70
|
raise ArgumentError.new("message missing") unless message
|
37
71
|
raise ArgumentError.new("schema missing") unless schema
|
@@ -44,17 +78,28 @@ module RSMP::Schema
|
|
44
78
|
end
|
45
79
|
end
|
46
80
|
|
81
|
+
# sort version strings
|
82
|
+
def self.sort_versions versions
|
83
|
+
versions.sort_by { |k| Gem::Version.new(k) }
|
84
|
+
end
|
85
|
+
|
86
|
+
# find schemas versions for particular schema type
|
87
|
+
# return nil if type not found
|
47
88
|
def self.find_schemas type
|
48
89
|
raise ArgumentError.new("type missing") unless type
|
49
|
-
schemas[type.to_sym]
|
90
|
+
schemas = @@schemas[type.to_sym]
|
50
91
|
end
|
51
92
|
|
93
|
+
# find schemas versions for particular schema type
|
94
|
+
# raise error if not found
|
52
95
|
def self.find_schemas! type
|
53
96
|
schemas = find_schemas type
|
54
97
|
raise UnknownSchemaTypeError.new("Unknown schema type #{type}") unless schemas
|
55
98
|
schemas
|
56
99
|
end
|
57
100
|
|
101
|
+
# find schema for a particular schema and version
|
102
|
+
# return nil if not found
|
58
103
|
def self.find_schema type, version, options={}
|
59
104
|
raise ArgumentError.new("version missing") unless version
|
60
105
|
version = sanitize_version version if options[:lenient]
|
@@ -65,11 +110,18 @@ module RSMP::Schema
|
|
65
110
|
nil
|
66
111
|
end
|
67
112
|
|
113
|
+
# get major.minor.patch part of a version string, where patch is optional
|
114
|
+
# ignore trailing characters, e.g.
|
115
|
+
# 3.1.3.32A => 3.1.3
|
116
|
+
# 3.1A3r3 >= 3.1
|
117
|
+
# return nil if string doesn't match
|
68
118
|
def self.sanitize_version version
|
69
119
|
matched = /^\d+\.\d+(\.\d+)?/.match version
|
70
120
|
matched.to_s if matched
|
71
121
|
end
|
72
122
|
|
123
|
+
# find schema for a particular schema and version
|
124
|
+
# raise error if not found
|
73
125
|
def self.find_schema! type, version, options={}
|
74
126
|
schema = find_schema type, version, options
|
75
127
|
raise ArgumentError.new("version missing") unless version
|
@@ -82,10 +134,14 @@ module RSMP::Schema
|
|
82
134
|
raise UnknownSchemaVersionError.new("Unknown schema version #{type} #{version}")
|
83
135
|
end
|
84
136
|
|
137
|
+
# true if a particular schema type and version found
|
85
138
|
def self.has_schema? type, version, options={}
|
86
139
|
find_schema(type,version, options) != nil
|
87
140
|
end
|
88
141
|
|
142
|
+
# validate using a particular schema and version
|
143
|
+
# raises error if schema is not found
|
144
|
+
# return nil if validation succeds, otherwise returns an array of errors
|
89
145
|
def self.validate message, schemas, options={}
|
90
146
|
raise ArgumentError.new("message missing") unless message
|
91
147
|
raise ArgumentError.new("schemas missing") unless schemas
|
data/lib/rsmp_schema/version.rb
CHANGED
data/lib/rsmp_schema.rb
CHANGED
data/schemas/tlc/1.0.10/sxl.yaml
CHANGED
@@ -177,15 +177,13 @@ objects:
|
|
177
177
|
During maintenance work the controller might be using dark mode (no output to the signal heads).
|
178
178
|
arguments:
|
179
179
|
intersection:
|
180
|
-
|
181
|
-
type: integer
|
180
|
+
type: integer_list
|
182
181
|
description: |-
|
183
182
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
184
183
|
Other value: Intersection number
|
185
184
|
range: "[0-255]"
|
186
185
|
status:
|
187
|
-
|
188
|
-
type: boolean
|
186
|
+
type: boolean_list
|
189
187
|
description: |-
|
190
188
|
False: Traffic Light Controller in dark mode
|
191
189
|
True: Traffic Light Controller not in dark mode
|
@@ -196,15 +194,13 @@ objects:
|
|
196
194
|
Signal timings is controlled manually by service personnel using the operating panel of the controller.
|
197
195
|
arguments:
|
198
196
|
intersection:
|
199
|
-
|
200
|
-
type: integer
|
197
|
+
type: integer_list
|
201
198
|
description: |-
|
202
199
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
203
200
|
Other value: Intersection number
|
204
201
|
range: "[0-255]"
|
205
202
|
status:
|
206
|
-
|
207
|
-
type: boolean
|
203
|
+
type: boolean_list
|
208
204
|
description: |-
|
209
205
|
False: Manual control inactive
|
210
206
|
True: Manual control active
|
@@ -215,15 +211,13 @@ objects:
|
|
215
211
|
Usually only used in case normal detectors can't be used, e.g. during maintenance work.
|
216
212
|
arguments:
|
217
213
|
intersection:
|
218
|
-
|
219
|
-
type: integer
|
214
|
+
type: integer_list
|
220
215
|
description: |-
|
221
216
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
222
217
|
Other value: Intersection number
|
223
218
|
range: "[0-255]"
|
224
219
|
status:
|
225
|
-
|
226
|
-
type: boolean
|
220
|
+
type: boolean_list
|
227
221
|
description: |-
|
228
222
|
False: Fixed time control inactive
|
229
223
|
True: Fixed time control active
|
@@ -234,15 +228,13 @@ objects:
|
|
234
228
|
Used to determine if the controller is operating independently or operating with other controllers (coordination).
|
235
229
|
arguments:
|
236
230
|
intersection:
|
237
|
-
|
238
|
-
type: integer
|
231
|
+
type: integer_list
|
239
232
|
description: |-
|
240
233
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
241
234
|
Other value: Intersection number
|
242
235
|
range: "[0-255]"
|
243
236
|
status:
|
244
|
-
|
245
|
-
type: boolean
|
237
|
+
type: boolean_list
|
246
238
|
description: |-
|
247
239
|
False: Isolated control disabled
|
248
240
|
True: Isolated control enabled (Vehicle actuated control or Fixed time control)
|
@@ -253,15 +245,13 @@ objects:
|
|
253
245
|
Yellow flash may be used during a serious fault (depending on configuration) or maintenance work. It can also be manually set using M0001.
|
254
246
|
arguments:
|
255
247
|
intersection:
|
256
|
-
|
257
|
-
type: integer
|
248
|
+
type: integer_list
|
258
249
|
description: |-
|
259
250
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
260
251
|
Other value: Intersection number
|
261
252
|
range: "[0-255]"
|
262
253
|
status:
|
263
|
-
|
264
|
-
type: boolean
|
254
|
+
type: boolean_list
|
265
255
|
description: |-
|
266
256
|
False: Yellow flash disabled
|
267
257
|
True: Yellow flash enabled
|
@@ -272,15 +262,13 @@ objects:
|
|
272
262
|
All red can be manually set using the controllers operating panel during maintenance work.
|
273
263
|
arguments:
|
274
264
|
intersection:
|
275
|
-
|
276
|
-
type: integer
|
265
|
+
type: integer_list
|
277
266
|
description: |-
|
278
267
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
279
268
|
Other value: Intersection number
|
280
269
|
range: "[0-255]"
|
281
270
|
status:
|
282
|
-
|
283
|
-
type: boolean
|
271
|
+
type: boolean_list
|
284
272
|
description: |-
|
285
273
|
False: All red disabled
|
286
274
|
True: All red enabled
|
@@ -291,15 +279,13 @@ objects:
|
|
291
279
|
The "police key" is a external control switch present in some controllers that manually switches the controller to either dark mode or yellow flash.
|
292
280
|
arguments:
|
293
281
|
intersection:
|
294
|
-
|
295
|
-
type: integer
|
282
|
+
type: integer_list
|
296
283
|
description: |-
|
297
284
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
298
285
|
Other value: Intersection number
|
299
286
|
range: "[0-255]"
|
300
287
|
status:
|
301
|
-
|
302
|
-
type: integer
|
288
|
+
type: integer_list
|
303
289
|
values:
|
304
290
|
0: disabled
|
305
291
|
1: dark mode
|
@@ -367,15 +353,13 @@ objects:
|
|
367
353
|
Can be used for the management system to check the current control mode (startup, normal, standby, failure, test).
|
368
354
|
arguments:
|
369
355
|
intersection:
|
370
|
-
|
371
|
-
type: integer
|
356
|
+
type: integer_list
|
372
357
|
description: |-
|
373
358
|
0: Not applicable (only one intersection exists or applicable for all intersection of the traffic light controller)
|
374
359
|
Other value: Intersection number
|
375
360
|
range: "[0-255]"
|
376
361
|
controlmode:
|
377
|
-
|
378
|
-
type: string
|
362
|
+
type: string_list
|
379
363
|
values:
|
380
364
|
startup: Startup mode
|
381
365
|
control: Normal control
|
@@ -469,29 +453,25 @@ objects:
|
|
469
453
|
Requires security code 2.
|
470
454
|
arguments:
|
471
455
|
status:
|
472
|
-
|
456
|
+
type: string_list
|
473
457
|
description: Set operating mode
|
474
|
-
type: string
|
475
458
|
values:
|
476
459
|
NormalControl: Normal Control
|
477
460
|
YellowFlash: Enables yellow flash
|
478
461
|
Dark: Enables dark mode
|
479
462
|
securityCode:
|
480
|
-
|
463
|
+
type: string_list
|
481
464
|
description: Security code 2
|
482
|
-
type: string
|
483
465
|
timeout:
|
484
|
-
|
466
|
+
type: integer_list
|
485
467
|
description: |-
|
486
468
|
Time in minutes until controller automatically reverts to previous functional position.
|
487
469
|
0=no automatic return
|
488
|
-
type: integer
|
489
470
|
min: 0
|
490
471
|
max: 1440
|
491
472
|
intersection:
|
492
|
-
|
473
|
+
type: integer_list
|
493
474
|
description: Intersection number
|
494
|
-
type: integer
|
495
475
|
min: 0
|
496
476
|
max: 255
|
497
477
|
command: setValue
|