machine_setup 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +27 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +54 -0
- data/TODO +9 -0
- data/VERSION +1 -0
- data/bin/setup_config_gen.rb +30 -0
- data/examples/underleaver/underleaver.setup.param +105 -0
- data/examples/underleaver/underleaver.setup.param.de.yml +207 -0
- data/examples/underleaver/underleaver.setup.param.en.yml +218 -0
- data/lib/setup_configuration.rb +20 -0
- data/lib/setup_configuration/setup_config.rb +183 -0
- data/lib/setup_configuration/suite_generator.rb +252 -0
- data/lib/setup_configuration/templates/deutsch.lng.erb +99 -0
- data/lib/setup_configuration/templates/english.lng.erb +99 -0
- data/lib/setup_configuration/templates/mps3.ini.erb +38 -0
- data/lib/setup_configuration/translation.rb +38 -0
- data/setup.rb +101 -0
- data/test/setup_configuration/setup_configuration_test.rb +36 -0
- data/test/test_helper.rb +1 -0
- metadata +86 -0
@@ -0,0 +1,218 @@
|
|
1
|
+
en:
|
2
|
+
|
3
|
+
#Tabs aka categories
|
4
|
+
common:
|
5
|
+
name: "Common"
|
6
|
+
|
7
|
+
drives:
|
8
|
+
name: "Drives Underleaver"
|
9
|
+
|
10
|
+
#parameter
|
11
|
+
underleaver_config:
|
12
|
+
name: "Underleaver virtual=1 / real=0"
|
13
|
+
comment: "Unit�s Place:\n
|
14
|
+
x0: Controller with real drives and covers\n
|
15
|
+
x1: Controller simulates all selected drives and covers\n
|
16
|
+
\n
|
17
|
+
Ten�s Place:\n
|
18
|
+
0x: CanBus on\n
|
19
|
+
1x: CanBus off\n
|
20
|
+
\n
|
21
|
+
Hundred�s Place:\n
|
22
|
+
1xx: The controller simulates all drives."
|
23
|
+
|
24
|
+
distance_photo_sensor:
|
25
|
+
name: "Distance of photo sensor"
|
26
|
+
comment: "Configuration of photo sensor.\n
|
27
|
+
\n
|
28
|
+
X: Describes the distance [mm] from photo sensor to the paper exit."
|
29
|
+
|
30
|
+
distance_blade_to_sheet_drive:
|
31
|
+
name: "Distance of blade"
|
32
|
+
comment: "Configuration of Blade\n
|
33
|
+
\n
|
34
|
+
X: Describes the distance [mm] from blade to the paper feed drive."
|
35
|
+
|
36
|
+
distance_sheet_drive_to_sheet_exit:
|
37
|
+
name: "Distance of sheet drive"
|
38
|
+
comment: "Configuration of foil drive\n
|
39
|
+
\n
|
40
|
+
X: Describes the distance [mm] from the paper feed drive to paper exit."
|
41
|
+
|
42
|
+
time_for_cutting_unit:
|
43
|
+
name: "Time of cutting unit"
|
44
|
+
comment: "Configuration of cutting unit.\n
|
45
|
+
\n
|
46
|
+
X: Describes the time [ms] to lift up the cutting unit."
|
47
|
+
|
48
|
+
paper_jam_detection_active:
|
49
|
+
name: "Paper jam monitoring"
|
50
|
+
comment: "Configuration of paper jam sensor\n
|
51
|
+
\n
|
52
|
+
0: Deselect the paper jam monitoring.\n
|
53
|
+
1: Select the paper jam monitoring."
|
54
|
+
|
55
|
+
paper_jam_detection_signal_length:
|
56
|
+
name: "Paper jam signal duration"
|
57
|
+
comment: "Configuration of paper jam sensor\n
|
58
|
+
\n
|
59
|
+
X: Describes the signal duration [ms] that defines a paper jam.\n
|
60
|
+
0: The signal duration will be defined by an internal value.\n
|
61
|
+
\n
|
62
|
+
Value is given in milliseconds."
|
63
|
+
|
64
|
+
paper_jam_detection_check_time:
|
65
|
+
name: "Paper jam check time after 'last' product"
|
66
|
+
comment: "Configuration of paper jam sensor\n
|
67
|
+
\n
|
68
|
+
Paper jam checks for the current product are executed at the beginning of the next product.\n
|
69
|
+
But when there is no product following the current product this parameter allows you to define a timer.\n
|
70
|
+
Started after finishing the current product after the expiration of this time the paper jam checks are executed.\n
|
71
|
+
A value of 3000 means that 3 seconds after the last product a paper jam check is executed.\n
|
72
|
+
\n
|
73
|
+
The value is given in milliseconds."
|
74
|
+
|
75
|
+
ext_enabling_following_unit:
|
76
|
+
name: "External behavior to downstream unit"
|
77
|
+
comment: "Configuration of external behavior (downstream)\n
|
78
|
+
\n
|
79
|
+
Select/Deselect the enable signal from the downstream unit.\n
|
80
|
+
\n
|
81
|
+
0: The underleaver works standalone or has no downstream unit.\n
|
82
|
+
1: The underleaver has a downstream unit and react to enable signal."
|
83
|
+
|
84
|
+
ext_enabling_following_unit_method:
|
85
|
+
name: "Configuration of enable signal"
|
86
|
+
comment: "Configuration of external behavior (downstream)\n
|
87
|
+
\n
|
88
|
+
0: Impulse - Switch the enabling signal at any impulse (on->off oder off->on)\n
|
89
|
+
1: Negative continuously signal - enables by 0V\n
|
90
|
+
2: Positiv continuously signal - enables by 12V"
|
91
|
+
|
92
|
+
ext_enabling_following_unit_delay:
|
93
|
+
name: "Configuration of enable delay"
|
94
|
+
comment: "Configuration of external behavior (downstream)\n
|
95
|
+
\n
|
96
|
+
X: Describes the time [ms] to wait for reacting to the enabling signal. Not till then the underleaver continuous conveyance."
|
97
|
+
|
98
|
+
ext_enabling_previous_unit:
|
99
|
+
name: "External behavior to upstream unit"
|
100
|
+
comment: "Configuration of external behavior (upstream)\n
|
101
|
+
\n
|
102
|
+
0: Impulse - Switch the enabling signal at any impulse (on->off oder off->on)\n
|
103
|
+
1: Negative continuously signal - enables by 0V\n
|
104
|
+
2: Positiv continuously signal - enables by 12V"
|
105
|
+
|
106
|
+
paper_roll_drive_config:
|
107
|
+
name: "Paper roll drive - Select/Deselect"
|
108
|
+
comment: &COMMON_DRIVE_CONFIG "Unit�s Place: 'Select/Deselect drive'\n
|
109
|
+
\n
|
110
|
+
XXX0: Drive doesn't exist.\n
|
111
|
+
XXX1: Drive exists as a servo.\n
|
112
|
+
XXX2: Drive exists as a frequency converter.\n
|
113
|
+
\n
|
114
|
+
Ten�s and Hundred�s Place: 'Typ of Drive'\n
|
115
|
+
\n
|
116
|
+
X00X = NORD_MOTOR_037\n
|
117
|
+
X01X = NORD_MOTOR_075\n
|
118
|
+
X02X = LENZE_063C32\n
|
119
|
+
X03X = LENZE_047C22\n
|
120
|
+
X04X = LENZE_063C22\n
|
121
|
+
X05X = INTERROLL_TM111_037_2_081\n
|
122
|
+
X06X = INTERROLL_TM082_012_2_056\n
|
123
|
+
X07X = LENZE_063C22_GEBER\n
|
124
|
+
X08X = LENZE_063C22_POSI\n
|
125
|
+
X17X = INTERROLL_111_2P_037_133V\n
|
126
|
+
X18X = INTERROLL_111_2P_037_133V_GEBER\n
|
127
|
+
X19X = INTERROLL_111_2P_037_133V_POSI\n
|
128
|
+
X20X = INTERROLL_111_2P_037_133V_GEBER_AUF_C400\n
|
129
|
+
X21X = HARMONIC_DRIVE_FHA_11C_D200_GEBER\n
|
130
|
+
\n
|
131
|
+
Thousend�s Place:\n
|
132
|
+
\n
|
133
|
+
0XXX = without PTC\n
|
134
|
+
1XXX = with PTC"
|
135
|
+
|
136
|
+
paper_roll_drive_distance_revolution:
|
137
|
+
name: "Paper roll drive - Distance per revolution [mm]"
|
138
|
+
comment: &COMMON_DISTANCE_REVOLUTION "X= Distance X per revolution [in mm]"
|
139
|
+
|
140
|
+
paper_roll_drive_gear_in:
|
141
|
+
name: "Paper roll drive - Gear IN"
|
142
|
+
comment: &COMMON_GEAR_IN "Number of teeth motor sided."
|
143
|
+
|
144
|
+
paper_roll_drive_gear_out:
|
145
|
+
name: "Paper roll drive - Gear OUT"
|
146
|
+
comment: &COMMON_GEAR_OUT "Number of teeth - drive shaft sided."
|
147
|
+
|
148
|
+
blade_drive_config:
|
149
|
+
name: "Blade drive - Select/Deselect"
|
150
|
+
comment: *COMMON_DRIVE_CONFIG
|
151
|
+
|
152
|
+
blade_drive_diameter:
|
153
|
+
name: "Blade drive - Diameter [mm]"
|
154
|
+
comment: "X= Diameter X of blade drive [in mm]"
|
155
|
+
|
156
|
+
blade_drive_gear_in:
|
157
|
+
name: "Blade drive - Gear IN"
|
158
|
+
comment: *COMMON_GEAR_IN
|
159
|
+
|
160
|
+
blade_drive_gear_out:
|
161
|
+
name: "Blade drive - Gear OUT"
|
162
|
+
comment: *COMMON_GEAR_OUT
|
163
|
+
|
164
|
+
paper_feed_drive_config:
|
165
|
+
name: "Paper feed drive - Select/Deselect"
|
166
|
+
comment: *COMMON_DRIVE_CONFIG
|
167
|
+
|
168
|
+
paper_feed_drive_distance_revolution:
|
169
|
+
name: "Paper feed drive - Distance per revolution [mm]"
|
170
|
+
comment: *COMMON_DISTANCE_REVOLUTION
|
171
|
+
|
172
|
+
paper_feed_drive_gear_in:
|
173
|
+
name: "Paper feed drive - Gear IN"
|
174
|
+
comment: *COMMON_GEAR_IN
|
175
|
+
|
176
|
+
paper_feed_drive_gear_out:
|
177
|
+
name: "Paper feed drive - Gear OUT"
|
178
|
+
comment: *COMMON_GEAR_OUT
|
179
|
+
|
180
|
+
transport_drive_config:
|
181
|
+
name: "Transport drive - Select/Deselect"
|
182
|
+
comment: *COMMON_DRIVE_CONFIG
|
183
|
+
|
184
|
+
transport_drive_distance_revolution:
|
185
|
+
name: "Transport drive - Distance per revolution [mm]"
|
186
|
+
comment: *COMMON_DISTANCE_REVOLUTION
|
187
|
+
|
188
|
+
transport_drive_gear_in:
|
189
|
+
name: "Transport drive - Gear IN"
|
190
|
+
comment: *COMMON_GEAR_IN
|
191
|
+
|
192
|
+
transport_drive_gear_out:
|
193
|
+
name: "Transport drive - Gear OUT"
|
194
|
+
comment: *COMMON_GEAR_OUT
|
195
|
+
|
196
|
+
transport_drive_belt_length:
|
197
|
+
name: "Transport drive - Length of belt [mm]"
|
198
|
+
comment: "Specify the length of the transport conveyor [in mm]"
|
199
|
+
|
200
|
+
infeed_drive_config:
|
201
|
+
name: "Infeed drive - Select/Deselect"
|
202
|
+
comment: *COMMON_DRIVE_CONFIG
|
203
|
+
|
204
|
+
infeed_drive_distance_revolution:
|
205
|
+
name: "Infeed drive - Distance per revolution [mm]"
|
206
|
+
comment: *COMMON_DISTANCE_REVOLUTION
|
207
|
+
|
208
|
+
infeed_drive_gear_in:
|
209
|
+
name: "Infeed drive - Gear IN"
|
210
|
+
comment: *COMMON_GEAR_IN
|
211
|
+
|
212
|
+
infeed_drive_gear_out:
|
213
|
+
name: "Infeed drive - Gear OUT"
|
214
|
+
comment: *COMMON_GEAR_OUT
|
215
|
+
|
216
|
+
infeed_drive_belt_length:
|
217
|
+
name: "Infeed drive - Length of belt [mm]"
|
218
|
+
comment: "Specify the length of the Infeed conveyor [in mm]"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SetupConfiguration
|
2
|
+
end
|
3
|
+
|
4
|
+
def SetupConfiguration(name, &block)
|
5
|
+
suite=SetupConfiguration::Suite.instance
|
6
|
+
suite.name=name
|
7
|
+
suite.instance_eval(&block)
|
8
|
+
suite.validate_params()
|
9
|
+
rescue
|
10
|
+
raise
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'pp'
|
14
|
+
require 'singleton'
|
15
|
+
require 'erb'
|
16
|
+
require 'fileutils'
|
17
|
+
require 'i18n'
|
18
|
+
require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/setup_config')
|
19
|
+
require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/suite_generator')
|
20
|
+
require File.expand_path(File.dirname(__FILE__) + '/setup_configuration/translation')
|
@@ -0,0 +1,183 @@
|
|
1
|
+
module SetupConfiguration
|
2
|
+
|
3
|
+
def self.description_ranges()
|
4
|
+
[(0..199), (200..599), (600..1299)]
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.parameter_range()
|
8
|
+
Range.new(description_ranges().first().first(), description_ranges().last().last())
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
class SetupConfiguration::Suite
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
attr_accessor :categories
|
17
|
+
attr_accessor :settings
|
18
|
+
attr_accessor :name
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
self.categories= Hash.new { |hash, key| hash[key] = [] }
|
22
|
+
self.settings= SetupConfiguration::Setting.new()
|
23
|
+
end
|
24
|
+
|
25
|
+
def category(category, &category_params)
|
26
|
+
if category_params then
|
27
|
+
# puts "executes category in Suite: #{category}"
|
28
|
+
|
29
|
+
#this code calls instance_eval and delivers the context object
|
30
|
+
parameter_factory = SetupConfiguration::ParameterFactory.new()
|
31
|
+
parameter_factory.instance_eval(&category_params)
|
32
|
+
categories[category] << parameter_factory.params()
|
33
|
+
|
34
|
+
# this .instance_eval call returns the last value of the last executed code (an array from method param in Parameters)
|
35
|
+
#categories[category] << SetupConfiguration::Parameters.new().instance_eval(&category_params)
|
36
|
+
|
37
|
+
# flatten is needed: Parameters#param returns an array which is inserted in an array...
|
38
|
+
categories[category].flatten!
|
39
|
+
else
|
40
|
+
puts "WARNING: Empty category '#{category}' will be ignored. "
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def setting(&setting_params)
|
45
|
+
settings.instance_eval(&setting_params) if setting_params
|
46
|
+
end
|
47
|
+
|
48
|
+
# Gets all known parameters.
|
49
|
+
def parameters()
|
50
|
+
categories.values.flatten
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Finds a Parameter with the given key.
|
55
|
+
# If there is no such parameter the method returns nil.
|
56
|
+
#
|
57
|
+
def find_param(key)
|
58
|
+
find_param_by_key(key)
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Finds a Parameter with the given key.
|
63
|
+
# If there is no such parameter the method returns nil.
|
64
|
+
#
|
65
|
+
def find_param_by_key(key)
|
66
|
+
self.parameters().select(){|p| p.key.eql?(key)}.first
|
67
|
+
end
|
68
|
+
|
69
|
+
#
|
70
|
+
# Finds a Parameter with the given number.
|
71
|
+
# If there is no such parameter the method returns nil.
|
72
|
+
#
|
73
|
+
def find_param_by_number(number)
|
74
|
+
self.parameters().select(){|p| p.number.eql?(number)}.first
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
# Validates the uniqueness of parameter keys and numbers.
|
79
|
+
#
|
80
|
+
def validate_params()
|
81
|
+
|
82
|
+
keys=[]
|
83
|
+
numbers=[]
|
84
|
+
#valid parameter numbers start at 1
|
85
|
+
valid_param_numbers=Range.new(SetupConfiguration.parameter_range().first()+1, SetupConfiguration.parameter_range().last)
|
86
|
+
|
87
|
+
self.parameters().each() do |p|
|
88
|
+
|
89
|
+
throw RuntimeError.new("ERROR: parameter number '#{p.number}' not supported. Number must be in range #{valid_param_numbers}") unless valid_param_numbers.member?(p.number)
|
90
|
+
|
91
|
+
if keys.include? p.key
|
92
|
+
# todo error handling
|
93
|
+
throw RuntimeError.new("ERROR: parameter key '#{p.key}' defined more than once")
|
94
|
+
else
|
95
|
+
keys << p.key
|
96
|
+
end
|
97
|
+
|
98
|
+
if numbers.include? p.number
|
99
|
+
# todo error handling
|
100
|
+
throw RuntimeError.new("ERROR: parameter number '#{p.number}' defined more than once")
|
101
|
+
else
|
102
|
+
numbers << p.number
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
class SetupConfiguration::Setting
|
111
|
+
|
112
|
+
attr_reader :minimum
|
113
|
+
attr_reader :maximum
|
114
|
+
attr_reader :balance_minimum
|
115
|
+
attr_reader :balance_maximum
|
116
|
+
|
117
|
+
def initialize
|
118
|
+
@minimum=(0..0)
|
119
|
+
@maximum=(0..0)
|
120
|
+
@balance_minimum=(0..0)
|
121
|
+
@balance_maximum=(0..0)
|
122
|
+
end
|
123
|
+
|
124
|
+
def min(range)
|
125
|
+
@minimum=range
|
126
|
+
end
|
127
|
+
|
128
|
+
def max(range)
|
129
|
+
@maximum=range
|
130
|
+
end
|
131
|
+
|
132
|
+
def balance_min(range)
|
133
|
+
@balance_minimum=range
|
134
|
+
end
|
135
|
+
|
136
|
+
def balance_max(range)
|
137
|
+
@balance_maximum=range
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
class SetupConfiguration::ParameterFactory
|
142
|
+
|
143
|
+
attr_accessor :params
|
144
|
+
|
145
|
+
def initialize
|
146
|
+
self.params= []
|
147
|
+
end
|
148
|
+
|
149
|
+
def param(parameter, number, ¶meter_def)
|
150
|
+
# puts "executed param in Parameters: #{parameter}"
|
151
|
+
# evaluate given block in Parameter context and return new parameter
|
152
|
+
p = SetupConfiguration::Parameter.new(parameter)
|
153
|
+
p.number=(number)
|
154
|
+
p.instance_eval(¶meter_def) if parameter_def
|
155
|
+
params << p
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
class SetupConfiguration::Parameter
|
161
|
+
|
162
|
+
attr_accessor :key
|
163
|
+
attr_accessor :number
|
164
|
+
attr_reader :dependency
|
165
|
+
attr_reader :machine_type
|
166
|
+
|
167
|
+
def initialize(name)
|
168
|
+
# depends upon no other parameter
|
169
|
+
@dependency=:none
|
170
|
+
# valid on all machines
|
171
|
+
@machine_type=0
|
172
|
+
@key= name
|
173
|
+
end
|
174
|
+
|
175
|
+
def depends_on(dependency)
|
176
|
+
@dependency=dependency
|
177
|
+
end
|
178
|
+
|
179
|
+
def for_machine_type(machine_type)
|
180
|
+
@machine_type=machine_type
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
@@ -0,0 +1,252 @@
|
|
1
|
+
module SetupConfiguration::Generator
|
2
|
+
@output_path=""
|
3
|
+
|
4
|
+
def output_path
|
5
|
+
@output_path
|
6
|
+
end
|
7
|
+
|
8
|
+
def output_path=(out)
|
9
|
+
@output_path=out
|
10
|
+
end
|
11
|
+
|
12
|
+
class TemplateBinding
|
13
|
+
|
14
|
+
attr_accessor :suite
|
15
|
+
attr_accessor :output
|
16
|
+
|
17
|
+
def categories
|
18
|
+
suite.categories.keys()
|
19
|
+
end
|
20
|
+
|
21
|
+
# Support templating of member data.
|
22
|
+
def get_binding
|
23
|
+
binding
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
class ParameterTemplateBinding < TemplateBinding
|
29
|
+
attr_accessor :lang
|
30
|
+
attr_accessor :parameter_range
|
31
|
+
|
32
|
+
def initialize(lang, range, output)
|
33
|
+
@lang=lang
|
34
|
+
@parameter_range=range
|
35
|
+
@output=output
|
36
|
+
end
|
37
|
+
|
38
|
+
def lang_name
|
39
|
+
SetupConfiguration::Translation.language_name(lang)
|
40
|
+
end
|
41
|
+
|
42
|
+
def cat_name(key)
|
43
|
+
name, desc=SetupConfiguration::Translation::Translator.new().translate(key, @lang)
|
44
|
+
name
|
45
|
+
end
|
46
|
+
|
47
|
+
def name(number)
|
48
|
+
p_name= translate(number) { |name, desc| name }
|
49
|
+
p_name.empty? ? "placeholder for mps3.exe" : p_name
|
50
|
+
end
|
51
|
+
|
52
|
+
def description(number)
|
53
|
+
translate(number) do |name, desc|
|
54
|
+
escape(desc)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def translate(number, &extractor)
|
59
|
+
#todo use suite as singleton!
|
60
|
+
p=self.suite.find_param_by_number(number)
|
61
|
+
if p
|
62
|
+
key=p.key
|
63
|
+
translation = SetupConfiguration::Translation::Translator.new().translate(key, @lang)
|
64
|
+
if extractor
|
65
|
+
extractor.call( translation)
|
66
|
+
else
|
67
|
+
translation
|
68
|
+
end
|
69
|
+
else
|
70
|
+
""
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
#
|
77
|
+
# Zeilenumbr�che werden mit '��' dargestellt
|
78
|
+
#
|
79
|
+
def escape(message)
|
80
|
+
message.gsub(/\n\s?/, '��')
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
class MPSTemplateBinding < TemplateBinding
|
86
|
+
|
87
|
+
|
88
|
+
def languages
|
89
|
+
SetupConfiguration::Translation.language_names.values
|
90
|
+
end
|
91
|
+
|
92
|
+
def settings
|
93
|
+
self.suite.settings
|
94
|
+
end
|
95
|
+
|
96
|
+
def param_infos(category_key)
|
97
|
+
parameters=suite.categories[category_key]
|
98
|
+
depends, machine_type, number=[], [], []
|
99
|
+
parameters.each() do |param|
|
100
|
+
machine_type << param.machine_type
|
101
|
+
number << param.number
|
102
|
+
depends << depends_on(param.dependency)
|
103
|
+
end
|
104
|
+
[prepare(depends), prepare(machine_type), prepare(number) ]
|
105
|
+
end
|
106
|
+
|
107
|
+
:private
|
108
|
+
|
109
|
+
def prepare(array)
|
110
|
+
array.join(',')
|
111
|
+
end
|
112
|
+
|
113
|
+
def depends_on(key)
|
114
|
+
|
115
|
+
if :none.eql?(key) then
|
116
|
+
-1
|
117
|
+
else
|
118
|
+
param=suite.find_param(key)
|
119
|
+
if param
|
120
|
+
param.number
|
121
|
+
else
|
122
|
+
puts "ERROR: parameter with key '#{key}' not found."
|
123
|
+
# depends on no other parameter
|
124
|
+
-1
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
# [:de, "deutsch", (0..199), "deutsch1.lng"],
|
132
|
+
# [:de, "deutsch", (200..599), "deutsch2.lng"],
|
133
|
+
# [:de, "deutsch", (600..1299), "deutsch3.lng"],
|
134
|
+
# [:en, "english", (0..199), "english1.lng"],
|
135
|
+
# [:en, "english", (200..599), "english2.lng"],
|
136
|
+
# [:en, "english", (600..1299), "english3.lng"],
|
137
|
+
def description_bindings()
|
138
|
+
SetupConfiguration::Translation.languages().collect() do |lang|
|
139
|
+
SetupConfiguration.description_ranges().collect() do |range|
|
140
|
+
# constructs the output file names
|
141
|
+
out= "#{SetupConfiguration::Translation.language_name(lang)}#{SetupConfiguration.description_ranges().index(range)+1}.lng"
|
142
|
+
ParameterTemplateBinding.new(lang, range, out)
|
143
|
+
end
|
144
|
+
end.flatten()
|
145
|
+
end
|
146
|
+
|
147
|
+
def description_template
|
148
|
+
%q{
|
149
|
+
[<%= lang_name.upcase %>]
|
150
|
+
<% parameter_range.each do |number| %>
|
151
|
+
HILFEPARAM<%= number %>=<%= description(number) %>
|
152
|
+
<% end %>
|
153
|
+
}.gsub(/^\s*/, '')
|
154
|
+
end
|
155
|
+
|
156
|
+
def parameter_bindings()
|
157
|
+
SetupConfiguration::Translation.languages().collect() do |lang|
|
158
|
+
# constructs the output file names
|
159
|
+
out= "#{SetupConfiguration::Translation.language_name(lang)}.lng"
|
160
|
+
ParameterTemplateBinding.new(lang, SetupConfiguration.parameter_range(), out)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def parameter_template(lang)
|
165
|
+
template=File.join(File.dirname(__FILE__), "templates", "#{lang.to_s}.lng.erb")
|
166
|
+
if File.file?(template)
|
167
|
+
File.read(template)
|
168
|
+
else
|
169
|
+
puts "WARNING: Template file #{template} expected but not found"
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def mps_template()
|
174
|
+
template=File.join(File.dirname(__FILE__), "templates", "mps3.ini.erb")
|
175
|
+
if File.file?(template)
|
176
|
+
File.read(template)
|
177
|
+
else
|
178
|
+
puts "WARNING: Template file #{template} expected but not found"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def mps_binding()
|
183
|
+
mps=MPSTemplateBinding.new
|
184
|
+
mps.output="mps3.ini"
|
185
|
+
mps
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
class SetupConfiguration::SuiteGenerator
|
193
|
+
include SetupConfiguration::Generator
|
194
|
+
|
195
|
+
attr_accessor :suite
|
196
|
+
attr_accessor :do_not_run
|
197
|
+
|
198
|
+
def initialize
|
199
|
+
self.do_not_run = false
|
200
|
+
self.suite = SetupConfiguration::Suite.instance
|
201
|
+
end
|
202
|
+
|
203
|
+
def self.do_not_run
|
204
|
+
self.do_not_run=true
|
205
|
+
end
|
206
|
+
|
207
|
+
def generate
|
208
|
+
return "no output" if self.do_not_run
|
209
|
+
|
210
|
+
description_bindings().each() do |bind|
|
211
|
+
bind.suite=self.suite
|
212
|
+
rhtml = ERB.new(description_template, nil, "<>")
|
213
|
+
|
214
|
+
File.open(File.join(output_path, bind.output), "w") do |f|
|
215
|
+
f << rhtml.result(bind.get_binding)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
# extras:
|
220
|
+
# -every PARAMETER key needs a value!
|
221
|
+
# -use Windows line terminators CRLF - \r\n
|
222
|
+
# - do not use [] - output is an INI-file
|
223
|
+
parameter_bindings().each() do |bind|
|
224
|
+
bind.suite=self.suite
|
225
|
+
template = parameter_template(bind.lang_name())
|
226
|
+
if template then
|
227
|
+
rhtml = ERB.new( template, nil, "<>")
|
228
|
+
|
229
|
+
File.open(File.join(output_path, bind.output), "w") do |f|
|
230
|
+
f << rhtml.result(bind.get_binding)
|
231
|
+
end
|
232
|
+
else
|
233
|
+
puts "WARNING: No template found. Generation of #{bind.output} aborted."
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
bind=mps_binding()
|
238
|
+
bind.suite=self.suite
|
239
|
+
mps_template=mps_template()
|
240
|
+
if mps_template then
|
241
|
+
rhtml = ERB.new( mps_template, nil, "<>")
|
242
|
+
|
243
|
+
File.open(File.join(output_path, bind.output), "w") do |f|
|
244
|
+
f << rhtml.result(bind.get_binding)
|
245
|
+
end
|
246
|
+
else
|
247
|
+
puts "WARNING: No template found. Generation of #{bind.output} aborted."
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|