machine_setup 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/bin/setup_config_gen +7 -7
- data/lib/setup_configuration.rb +1 -0
- data/lib/setup_configuration/binary_coded_values.rb +43 -0
- data/lib/setup_configuration/encoding.rb +1 -1
- data/lib/setup_configuration/generator_module.rb +9 -9
- data/lib/setup_configuration/legacy/importer.rb +32 -57
- data/lib/setup_configuration/legacy/legacy.rb +1 -0
- data/lib/setup_configuration/legacy/parameter.rb +17 -4
- data/lib/setup_configuration/legacy/parameter_extractor.rb +83 -0
- data/lib/setup_configuration/legacy/templates/setup.param.erb +6 -0
- data/lib/setup_configuration/mps_template_binding.rb +55 -4
- data/lib/setup_configuration/parameter_template_binding.rb +7 -6
- data/lib/setup_configuration/setup_code_generator.rb +1 -1
- data/lib/setup_configuration/setup_config.rb +76 -11
- data/lib/setup_configuration/suite_generator.rb +1 -1
- data/lib/setup_configuration/templates/mps3.ini.erb +7 -1
- data/lib/setup_configuration/translation.rb +12 -8
- data/test/setup_configuration/legacy/data/v1/mps3.ini +35 -0
- data/test/setup_configuration/legacy/data/v2/mps3.ini +41 -0
- data/test/setup_configuration/legacy/importer_test.rb +54 -0
- data/test/setup_configuration/mps_template_binding_test.rb +28 -0
- data/test/setup_configuration/options_test.rb +40 -0
- data/test/setup_configuration/roles_test.rb +64 -0
- data/test/test_helper.rb +1 -1
- metadata +76 -90
@@ -21,6 +21,12 @@ SetupConfiguration :<%= @name.to_sym %>, :<%= @abbreviation.to_sym %> do
|
|
21
21
|
<% if param.type? %>
|
22
22
|
for_machine_type <%= compute_machine_types(param.machine_type) %>
|
23
23
|
<% end %>
|
24
|
+
<% if param.options? %>
|
25
|
+
has_options <%= render_options(param.options) %>
|
26
|
+
<% end %>
|
27
|
+
<% if param.roles? %>
|
28
|
+
enabled_for_role <%= render_roles(param.roles) %>
|
29
|
+
<% end %>
|
24
30
|
end
|
25
31
|
<% else %>
|
26
32
|
|
@@ -7,7 +7,8 @@ module SetupConfiguration
|
|
7
7
|
class MPSTemplateBinding < TemplateBinding
|
8
8
|
|
9
9
|
def initialize
|
10
|
-
yield self
|
10
|
+
yield self if block_given?
|
11
|
+
@max_number_parameters_per_tab=50
|
11
12
|
end
|
12
13
|
|
13
14
|
def languages
|
@@ -20,15 +21,18 @@ module SetupConfiguration
|
|
20
21
|
|
21
22
|
def param_infos(category_key)
|
22
23
|
parameters=suite.categories[category_key]
|
23
|
-
depends, machine_type, number=[], [], []
|
24
|
+
depends, machine_type, number, options, roles=[], [], [], [], []
|
24
25
|
parameters.each() do |param|
|
25
26
|
machine_type << param.machine_type
|
26
27
|
number << param.number
|
27
28
|
depends << depends_on(param.dependency)
|
29
|
+
options << param.options
|
30
|
+
roles << param.roles
|
28
31
|
end
|
29
32
|
#TODO compute value for max_number_parameters_per_tab of value maximum_numbers_per_category
|
30
|
-
max_number_parameters_per_tab
|
31
|
-
|
33
|
+
bundle = [depends, machine_type, number, options, roles].collect() { |arr| arr.in_groups_of(@max_number_parameters_per_tab, false) }
|
34
|
+
bundle = sanitize(bundle)
|
35
|
+
bundle.collect(){ |v| v.collect(){ |arr| prepare(arr) } }
|
32
36
|
end
|
33
37
|
|
34
38
|
private
|
@@ -53,6 +57,53 @@ module SetupConfiguration
|
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
60
|
+
def sanitize(bundle)
|
61
|
+
count_params = bundle.first.flatten.length
|
62
|
+
if count_params <= @max_number_parameters_per_tab
|
63
|
+
bundle
|
64
|
+
else
|
65
|
+
depends, machine_type, number, options, roles = *bundle
|
66
|
+
# iterating with each_cons(2) would be much nicer, but how do I get the index for shifting...
|
67
|
+
length = number.length
|
68
|
+
number.each_with_index() do |param_num, index|
|
69
|
+
if index < length-1
|
70
|
+
next_number_dup = number[index+1].dup
|
71
|
+
# use next_number_dup for iteration as we are changing number[index+1]
|
72
|
+
# iterate second array until the parameter group ends
|
73
|
+
next_number_dup.each() do |second|
|
74
|
+
group = param_group?(param_num.last, second)
|
75
|
+
if group
|
76
|
+
bundle.each() do |member|
|
77
|
+
member[index] << member[index+1].shift
|
78
|
+
end
|
79
|
+
else
|
80
|
+
break
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
bundle
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Does these two parameters belong to the same "parameter group"?
|
91
|
+
# The definition of a parameter group (as needed for working around 'grouping bug' in new setup editor):
|
92
|
+
# Two parameters shall be grouped together if:
|
93
|
+
# - two 'physical' consecutive parameters have also consecutive parameter numbers
|
94
|
+
# and
|
95
|
+
# - these two parameters have the same dependency
|
96
|
+
# or
|
97
|
+
# the second parameter depends on the first parameter
|
98
|
+
def param_group?(last, first)
|
99
|
+
p1 = find_param_by_number(last)
|
100
|
+
p2 = find_param_by_number(first)
|
101
|
+
# parameters have sequenced numbers
|
102
|
+
result = (p1.number - p2.number).abs.eql?(1)
|
103
|
+
# parameters have same dependency or second parameter depends on first parameter
|
104
|
+
result && ( p1.dependency.eql?(p2.dependency) || p2.dependency.eql?(p1.key))
|
105
|
+
end
|
106
|
+
|
56
107
|
end
|
57
108
|
end
|
58
109
|
end
|
@@ -22,22 +22,23 @@ module SetupConfiguration
|
|
22
22
|
|
23
23
|
def cat_name(cat)
|
24
24
|
name, desc=@translator.translate(cat.name, @lang)
|
25
|
-
$stderr.puts("WARNING: missing translation for key
|
25
|
+
$stderr.puts("WARNING: missing translation for key #{@lang}.#{cat.name}.#{Translation::Translator::NAME}") if name.eql?(cat.name.to_s)
|
26
26
|
name
|
27
27
|
end
|
28
28
|
|
29
29
|
def name(number)
|
30
30
|
p_name= translate(number) { |name, desc| name }
|
31
|
-
|
32
|
-
|
31
|
+
param = find_param_by_number(number)
|
32
|
+
if param && p_name.eql?(param.key.to_s)
|
33
|
+
$stderr.puts("WARNING: missing translation for key #{@lang}.#{param.key.to_s}.#{Translation::Translator::NAME}")
|
33
34
|
end
|
34
|
-
p_name.empty? ?
|
35
|
+
p_name.empty? ? 'placeholder for mps3.exe' : p_name
|
35
36
|
end
|
36
37
|
|
37
38
|
def description(number)
|
38
39
|
translate(number) do |name, desc|
|
39
40
|
begin
|
40
|
-
$stderr.puts("WARNING: missing translation for key
|
41
|
+
$stderr.puts("WARNING: missing translation for key #{@lang}.#{find_param_by_number(number).key.to_s}.#{Translation::Translator::COMMENT}") if desc.empty?
|
41
42
|
rescue
|
42
43
|
raise RuntimeError.new("ERROR: reading translation failed '#{desc.inspect()}'")
|
43
44
|
end
|
@@ -56,7 +57,7 @@ module SetupConfiguration
|
|
56
57
|
translation
|
57
58
|
end
|
58
59
|
else
|
59
|
-
|
60
|
+
''
|
60
61
|
end
|
61
62
|
end
|
62
63
|
|
@@ -19,11 +19,13 @@ module SetupConfiguration
|
|
19
19
|
attr_accessor :name
|
20
20
|
attr_accessor :abbreviation
|
21
21
|
attr_accessor :next_category_number
|
22
|
+
attr_reader :maximum_numbers_per_category
|
22
23
|
|
23
24
|
def initialize
|
24
25
|
self.categories= Hash.new { |hash, key| hash[key] = [] }
|
25
26
|
self.settings= Setting.new()
|
26
27
|
self.next_category_number = 0
|
28
|
+
@maximum_numbers_per_category = 150
|
27
29
|
end
|
28
30
|
|
29
31
|
def category(category, &category_params)
|
@@ -46,7 +48,7 @@ module SetupConfiguration
|
|
46
48
|
end
|
47
49
|
|
48
50
|
def category_by_name(name)
|
49
|
-
cat = self.categories.keys.
|
51
|
+
cat = self.categories.keys.detect(){|c| c.name.eql?(name)}
|
50
52
|
unless cat
|
51
53
|
cat = Category.new
|
52
54
|
cat.number = self.next_category_number!
|
@@ -66,7 +68,7 @@ module SetupConfiguration
|
|
66
68
|
end
|
67
69
|
|
68
70
|
# Gets all known parameters.
|
69
|
-
def parameters
|
71
|
+
def parameters
|
70
72
|
# cache parameters so sorting is necessary only once - this saves a lot of time...
|
71
73
|
@parameters ||= categories.values.flatten.sort
|
72
74
|
end
|
@@ -84,7 +86,7 @@ module SetupConfiguration
|
|
84
86
|
# If there is no such parameter the method returns nil.
|
85
87
|
#
|
86
88
|
def find_param_by_key(key)
|
87
|
-
self.parameters().
|
89
|
+
self.parameters().detect(){|p| p.key.eql?(key)}
|
88
90
|
end
|
89
91
|
|
90
92
|
#
|
@@ -92,16 +94,16 @@ module SetupConfiguration
|
|
92
94
|
# If there is no such parameter the method returns nil.
|
93
95
|
#
|
94
96
|
def find_param_by_number(number)
|
95
|
-
self.parameters().
|
97
|
+
self.parameters().detect(){|p| p.number.eql?(number)}
|
96
98
|
end
|
97
99
|
|
98
100
|
#
|
99
101
|
# Validates the uniqueness of parameter keys and numbers.
|
100
102
|
#
|
101
|
-
def validate_params
|
103
|
+
def validate_params
|
102
104
|
|
103
105
|
categories.each() do |key, value|
|
104
|
-
throw RuntimeError.new("ERROR: category '#{key}' contains more than
|
106
|
+
throw RuntimeError.new("ERROR: category '#{key}' contains more than #{maximum_numbers_per_category} parameters. Reduce parameter count.") if value.size >maximum_numbers_per_category
|
105
107
|
end
|
106
108
|
|
107
109
|
keys=[]
|
@@ -137,7 +139,7 @@ module SetupConfiguration
|
|
137
139
|
end#validate_params
|
138
140
|
|
139
141
|
def assign_param_ref(ref)
|
140
|
-
param = self.parameters().
|
142
|
+
param = self.parameters().detect(){|p| p.key.eql?(ref.key) && p.param?}
|
141
143
|
|
142
144
|
if param
|
143
145
|
ref.assign(param)
|
@@ -205,7 +207,7 @@ module SetupConfiguration
|
|
205
207
|
attr_accessor :name
|
206
208
|
attr_accessor :parameter
|
207
209
|
|
208
|
-
def initialize
|
210
|
+
def initialize
|
209
211
|
@parameter = []
|
210
212
|
end
|
211
213
|
|
@@ -246,13 +248,13 @@ module SetupConfiguration
|
|
246
248
|
#
|
247
249
|
def drive(drive, number, added_props=[], ¶meter_def)
|
248
250
|
|
249
|
-
key = symbol(drive,
|
250
|
-
drive_selection = symbol(key,
|
251
|
+
key = symbol(drive, 'drive')
|
252
|
+
drive_selection = symbol(key, 'selection')
|
251
253
|
|
252
254
|
drive_param=param(drive_selection, number)
|
253
255
|
drive_param.instance_eval(¶meter_def) if parameter_def
|
254
256
|
|
255
|
-
properties=[%w(distance revolution), %w(gear in), %w(gear out),
|
257
|
+
properties=[%w(distance revolution), %w(gear in), %w(gear out), 'length', 'motortype']
|
256
258
|
properties += added_props if added_props
|
257
259
|
properties.each_with_index do |prop, index|
|
258
260
|
parameter = param(symbol(key, *prop), number + index + 1) { depends_on drive_selection }
|
@@ -268,6 +270,39 @@ module SetupConfiguration
|
|
268
270
|
end
|
269
271
|
end
|
270
272
|
|
273
|
+
class SoftwareOptions
|
274
|
+
include BinaryCodedValues
|
275
|
+
|
276
|
+
OPTIONS = {:do_not_copy => 1, :needs_licence => 2}
|
277
|
+
|
278
|
+
def values
|
279
|
+
OPTIONS
|
280
|
+
end
|
281
|
+
|
282
|
+
# TODO check for maximum and raise error
|
283
|
+
def compute_options(number)
|
284
|
+
value(number)
|
285
|
+
end
|
286
|
+
|
287
|
+
end
|
288
|
+
|
289
|
+
class Roles
|
290
|
+
include BinaryCodedValues
|
291
|
+
|
292
|
+
ROLES = {:foreman => 1, :service => 2, :application_engineer => 4, :test_bay => 8, :developer => 16}
|
293
|
+
|
294
|
+
def values
|
295
|
+
ROLES
|
296
|
+
end
|
297
|
+
|
298
|
+
# TODO check for maximum and raise error
|
299
|
+
def compute_roles(number)
|
300
|
+
value(number)
|
301
|
+
end
|
302
|
+
|
303
|
+
|
304
|
+
end
|
305
|
+
|
271
306
|
class Parameter
|
272
307
|
include Enumerable
|
273
308
|
include ParameterMachineTypeBridge
|
@@ -276,14 +311,20 @@ module SetupConfiguration
|
|
276
311
|
attr_accessor :number
|
277
312
|
attr_reader :dependency
|
278
313
|
attr_reader :machine_type
|
314
|
+
attr_reader :options
|
315
|
+
attr_reader :roles
|
279
316
|
|
280
317
|
def initialize(name, number)
|
281
318
|
# depends upon no other parameter
|
282
319
|
@dependency=:none
|
283
320
|
# valid on all machines
|
284
321
|
@machine_type=0
|
322
|
+
@options=0
|
323
|
+
@roles=0
|
285
324
|
@key= name
|
286
325
|
@number=number
|
326
|
+
@role = Roles.new
|
327
|
+
@option = SoftwareOptions.new
|
287
328
|
end
|
288
329
|
|
289
330
|
def depends_on(dependency)
|
@@ -294,6 +335,22 @@ module SetupConfiguration
|
|
294
335
|
@machine_type=machine_type
|
295
336
|
end
|
296
337
|
|
338
|
+
def has_options(*opt)
|
339
|
+
# use @options as initial value: multiple calls to has_options are possible and result value is chained
|
340
|
+
# (and not reset if using '0' as explicit initial value)
|
341
|
+
@options = opt.uniq.inject(@options) do |sum, o|
|
342
|
+
sum + @option.number(o)
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def enabled_for_role(*roles)
|
347
|
+
# use @roles as initial value: multiple calls to enabled_for_role are possible and result value is chained
|
348
|
+
# (and not reset if using '0' as explicit initial value)
|
349
|
+
@roles = roles.uniq.inject(@roles) do |sum, r|
|
350
|
+
sum + @role.number(r)
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
297
354
|
def <=>(parameter)
|
298
355
|
self.number <=> parameter.number
|
299
356
|
end
|
@@ -334,6 +391,14 @@ module SetupConfiguration
|
|
334
391
|
assigned? ? @param.dependency : :none
|
335
392
|
end
|
336
393
|
|
394
|
+
def options
|
395
|
+
assigned? ? @param.options : 0
|
396
|
+
end
|
397
|
+
|
398
|
+
def roles
|
399
|
+
assigned? ? @param.roles : 0
|
400
|
+
end
|
401
|
+
|
337
402
|
def <=>(parameter)
|
338
403
|
self.number <=> parameter.number
|
339
404
|
end
|
@@ -26,13 +26,19 @@ BEGIN_TYP<%= machine_type.sequence_number_coded %>=<%= machine_type.range.first
|
|
26
26
|
|
27
27
|
[PARAMANZEIGE]
|
28
28
|
<% categories.each_with_index do |category, index| %>
|
29
|
-
<% dependencies, machine_types, parameters = param_infos(category) %>
|
29
|
+
<% dependencies, machine_types, parameters, options, roles = param_infos(category) %>
|
30
|
+
4CF<%= index%>a=<%= roles[0] %>
|
31
|
+
3CF<%= index%>a=<%= options[0] %>
|
30
32
|
2CF<%= index%>a=<%= dependencies[0] %>
|
31
33
|
1CF<%= index%>a=<%= machine_types[0] %>
|
32
34
|
TAB<%= index%>a=<%= parameters[0] %>
|
35
|
+
4CF<%= index%>b=<%= roles[1] %>
|
36
|
+
3CF<%= index%>b=<%= options[1] %>
|
33
37
|
2CF<%= index%>b=<%= dependencies[1] %>
|
34
38
|
1CF<%= index%>b=<%= machine_types[1] %>
|
35
39
|
TAB<%= index%>b=<%= parameters[1] %>
|
40
|
+
4CF<%= index%>c=<%= roles[2] %>
|
41
|
+
3CF<%= index%>c=<%= options[2] %>
|
36
42
|
2CF<%= index%>c=<%= dependencies[2] %>
|
37
43
|
1CF<%= index%>c=<%= machine_types[2] %>
|
38
44
|
TAB<%= index%>c=<%= parameters[2] %>
|
@@ -4,7 +4,7 @@ module SetupConfiguration
|
|
4
4
|
|
5
5
|
module Translation
|
6
6
|
|
7
|
-
FILE_EXTENSION=
|
7
|
+
FILE_EXTENSION='setup.param'.freeze
|
8
8
|
|
9
9
|
def self.translation_file(config_name, lang)
|
10
10
|
"#{config_name}.#{FILE_EXTENSION}.#{lang}.yml"
|
@@ -15,26 +15,26 @@ module SetupConfiguration
|
|
15
15
|
end
|
16
16
|
|
17
17
|
# Returns all supported setup languages.
|
18
|
-
def self.languages
|
19
|
-
language_defs
|
18
|
+
def self.languages
|
19
|
+
language_defs.keys
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.language_name(lang)
|
23
|
-
language_defs
|
23
|
+
language_defs[lang]
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.language_abbreviation(lang_name)
|
27
|
-
language_defs.invert
|
27
|
+
language_defs.invert[lang_name.downcase]
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.language_names
|
30
|
+
def self.language_names
|
31
31
|
language_defs.values.sort
|
32
32
|
end
|
33
33
|
|
34
34
|
private
|
35
35
|
|
36
|
-
def self.language_defs
|
37
|
-
{:de =>
|
36
|
+
def self.language_defs
|
37
|
+
{:de => 'deutsch', :en => 'english'}
|
38
38
|
end
|
39
39
|
|
40
40
|
class Translator
|
@@ -44,6 +44,10 @@ module SetupConfiguration
|
|
44
44
|
COMMENT = :comment.freeze
|
45
45
|
EMPTY = ''
|
46
46
|
|
47
|
+
if I18n.respond_to?(:enforce_available_locales)
|
48
|
+
I18n.enforce_available_locales = true
|
49
|
+
end
|
50
|
+
|
47
51
|
# Adds a file with translations.
|
48
52
|
def self.i18n_load_path(path)
|
49
53
|
I18n.load_path << path
|
@@ -0,0 +1,35 @@
|
|
1
|
+
[EINSTELLUNG]
|
2
|
+
TABSTART=2
|
3
|
+
DRUCK=0
|
4
|
+
DATKONVERT=0
|
5
|
+
|
6
|
+
[SPRACHE]
|
7
|
+
AKTUELL=0
|
8
|
+
SPRACHE0=DEUTSCH
|
9
|
+
SPRACHE1=ENGLISH
|
10
|
+
|
11
|
+
[MINMAXWERTE]
|
12
|
+
BEGIN_MIN=0
|
13
|
+
END_MIN=0
|
14
|
+
BEGIN_MAX=0
|
15
|
+
END_MAX=0
|
16
|
+
BEGIN_WAAG_MIN=3000
|
17
|
+
END_WAAG_MIN=3029
|
18
|
+
BEGIN_WAAG_MAX=3030
|
19
|
+
END_WAAG_MAX=3059
|
20
|
+
|
21
|
+
[MASCHINENTYP]
|
22
|
+
BEGIN_TYP0=1000
|
23
|
+
BEGIN_TYP1=2000
|
24
|
+
BEGIN_TYP2=3000
|
25
|
+
|
26
|
+
[PARAMANZEIGE]
|
27
|
+
2CF1a=-1,-1,-1,31
|
28
|
+
1CF1a=0,0,0,0
|
29
|
+
TAB1a=29,30,31,32
|
30
|
+
2CF1b=
|
31
|
+
1CF1b=
|
32
|
+
TAB1b=
|
33
|
+
2CF1c=
|
34
|
+
1CF1c=
|
35
|
+
TAB1c=
|