powertrain-build 1.13.1__py3-none-any.whl → 1.13.3.dev3__py3-none-any.whl
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.
- powertrain_build/__init__.py +40 -40
- powertrain_build/__main__.py +6 -6
- powertrain_build/a2l.py +582 -582
- powertrain_build/a2l_merge.py +650 -650
- powertrain_build/a2l_templates.py +717 -717
- powertrain_build/build.py +985 -985
- powertrain_build/build_defs.py +309 -309
- powertrain_build/build_proj_config.py +690 -690
- powertrain_build/check_interface.py +575 -575
- powertrain_build/cli.py +141 -141
- powertrain_build/config.py +542 -542
- powertrain_build/core.py +395 -395
- powertrain_build/core_dummy.py +343 -343
- powertrain_build/create_conversion_table.py +73 -73
- powertrain_build/dids.py +916 -916
- powertrain_build/dummy.py +157 -157
- powertrain_build/dummy_spm.py +252 -252
- powertrain_build/environmentcheck.py +52 -52
- powertrain_build/ext_dbg.py +255 -255
- powertrain_build/ext_var.py +327 -327
- powertrain_build/feature_configs.py +301 -301
- powertrain_build/gen_allsysteminfo.py +227 -227
- powertrain_build/gen_label_split.py +449 -449
- powertrain_build/handcode_replacer.py +124 -124
- powertrain_build/html_report.py +133 -133
- powertrain_build/interface/__init__.py +4 -4
- powertrain_build/interface/application.py +511 -511
- powertrain_build/interface/base.py +500 -500
- powertrain_build/interface/csp_api.py +490 -490
- powertrain_build/interface/device_proxy.py +677 -677
- powertrain_build/interface/ems.py +67 -67
- powertrain_build/interface/export_global_vars.py +121 -121
- powertrain_build/interface/generate_adapters.py +132 -132
- powertrain_build/interface/generate_hi_interface.py +87 -87
- powertrain_build/interface/generate_service.py +69 -69
- powertrain_build/interface/generate_wrappers.py +147 -147
- powertrain_build/interface/generation_utils.py +142 -142
- powertrain_build/interface/hal.py +194 -194
- powertrain_build/interface/model_yaml_verification.py +348 -348
- powertrain_build/interface/service.py +296 -296
- powertrain_build/interface/simulink.py +249 -249
- powertrain_build/interface/update_call_sources.py +180 -180
- powertrain_build/interface/update_model_yaml.py +186 -186
- powertrain_build/interface/zone_controller.py +362 -362
- powertrain_build/lib/__init__.py +4 -4
- powertrain_build/lib/helper_functions.py +127 -127
- powertrain_build/lib/logger.py +55 -55
- powertrain_build/matlab_scripts/CodeGen/BuildAutomationPyBuild.m +78 -78
- powertrain_build/matlab_scripts/CodeGen/Generate_A2L.m +154 -154
- powertrain_build/matlab_scripts/CodeGen/generateTLUnit.m +239 -239
- powertrain_build/matlab_scripts/CodeGen/getAsilClassification.m +28 -28
- powertrain_build/matlab_scripts/CodeGen/modelConfiguredForTL.m +28 -28
- powertrain_build/matlab_scripts/CodeGen/moveDefOutports.m +88 -88
- powertrain_build/matlab_scripts/CodeGen/parseCalMeasData.m +410 -410
- powertrain_build/matlab_scripts/CodeGen/parseCoreIdentifiers.m +139 -139
- powertrain_build/matlab_scripts/CodeGen/parseDIDs.m +141 -141
- powertrain_build/matlab_scripts/CodeGen/parseInPorts.m +106 -106
- powertrain_build/matlab_scripts/CodeGen/parseIncludeConfigs.m +25 -25
- powertrain_build/matlab_scripts/CodeGen/parseModelInfo.m +38 -38
- powertrain_build/matlab_scripts/CodeGen/parseNVM.m +81 -81
- powertrain_build/matlab_scripts/CodeGen/parseOutPorts.m +120 -120
- powertrain_build/matlab_scripts/CodeGen/parsePreProcBlks.m +23 -23
- powertrain_build/matlab_scripts/CodeGen/struct2JSON.m +128 -128
- powertrain_build/matlab_scripts/CodeGen/updateCodeSwConfig.m +31 -31
- powertrain_build/matlab_scripts/Init_PyBuild.m +91 -91
- powertrain_build/matlab_scripts/__init__.py +2 -2
- powertrain_build/matlab_scripts/helperFunctions/Get_Full_Name.m +46 -46
- powertrain_build/matlab_scripts/helperFunctions/Get_SrcLines.m +12 -12
- powertrain_build/matlab_scripts/helperFunctions/Init_Models.m +78 -78
- powertrain_build/matlab_scripts/helperFunctions/Init_Projects.m +67 -67
- powertrain_build/matlab_scripts/helperFunctions/Read_Units.m +34 -34
- powertrain_build/matlab_scripts/helperFunctions/SetProjectTimeSamples.m +26 -26
- powertrain_build/matlab_scripts/helperFunctions/Strip_Suffix.m +16 -16
- powertrain_build/matlab_scripts/helperFunctions/followLink.m +118 -118
- powertrain_build/matlab_scripts/helperFunctions/getCodeSwitches.m +50 -50
- powertrain_build/matlab_scripts/helperFunctions/getConsumerBlocks.m +30 -30
- powertrain_build/matlab_scripts/helperFunctions/getDefBlock.m +39 -39
- powertrain_build/matlab_scripts/helperFunctions/getDefOutport.m +58 -58
- powertrain_build/matlab_scripts/helperFunctions/getDstBlocks.m +19 -19
- powertrain_build/matlab_scripts/helperFunctions/getDstLines.m +13 -13
- powertrain_build/matlab_scripts/helperFunctions/getInterfaceSignals.m +37 -37
- powertrain_build/matlab_scripts/helperFunctions/getName.m +37 -37
- powertrain_build/matlab_scripts/helperFunctions/getPath.m +6 -6
- powertrain_build/matlab_scripts/helperFunctions/getProperValue.m +21 -21
- powertrain_build/matlab_scripts/helperFunctions/getSrcBlocks.m +19 -19
- powertrain_build/matlab_scripts/helperFunctions/getSrcLines.m +13 -13
- powertrain_build/matlab_scripts/helperFunctions/loadLibraries.m +10 -10
- powertrain_build/matlab_scripts/helperFunctions/loadjson.m +6 -6
- powertrain_build/matlab_scripts/helperFunctions/modifyEnumStructField.m +21 -21
- powertrain_build/matlab_scripts/helperFunctions/removeConfigDuplicates.m +31 -31
- powertrain_build/matlab_scripts/helperFunctions/sortSystemByClass.m +26 -26
- powertrain_build/matlab_scripts/helperFunctions/tl_getfast.m +89 -89
- powertrain_build/matlab_scripts/helperFunctions/topLevelSystem.m +20 -20
- powertrain_build/matlab_scripts/helperFunctions/updateModels.m +131 -131
- powertrain_build/memory_section.py +224 -224
- powertrain_build/nvm_def.py +729 -729
- powertrain_build/problem_logger.py +86 -86
- powertrain_build/pt_matlab.py +430 -430
- powertrain_build/pt_win32.py +144 -144
- powertrain_build/replace_compu_tab_ref.py +105 -105
- powertrain_build/rte_dummy.py +254 -254
- powertrain_build/sched_funcs.py +209 -207
- powertrain_build/signal.py +7 -7
- powertrain_build/signal_if_html_rep.py +221 -221
- powertrain_build/signal_if_html_rep_all.py +302 -302
- powertrain_build/signal_incons_html_rep.py +180 -180
- powertrain_build/signal_incons_html_rep_all.py +366 -366
- powertrain_build/signal_incons_html_rep_base.py +168 -168
- powertrain_build/signal_inconsistency_check.py +641 -641
- powertrain_build/signal_interfaces.py +864 -864
- powertrain_build/templates/Index_SigCheck_All.html +22 -22
- powertrain_build/templates/Index_SigIf_All.html +19 -19
- powertrain_build/types.py +218 -218
- powertrain_build/unit_configs.py +419 -419
- powertrain_build/user_defined_types.py +660 -660
- powertrain_build/versioncheck.py +66 -66
- powertrain_build/wrapper.py +512 -512
- powertrain_build/xlrd_csv.py +87 -87
- powertrain_build/zone_controller/__init__.py +4 -4
- powertrain_build/zone_controller/calibration.py +176 -176
- powertrain_build/zone_controller/composition_yaml.py +880 -878
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/METADATA +100 -100
- powertrain_build-1.13.3.dev3.dist-info/RECORD +130 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/WHEEL +1 -1
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/LICENSE +202 -202
- powertrain_build-1.13.3.dev3.dist-info/pbr.json +1 -0
- powertrain_build-1.13.1.dist-info/RECORD +0 -130
- powertrain_build-1.13.1.dist-info/pbr.json +0 -1
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/entry_points.txt +0 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/AUTHORS +0 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/NOTICE +0 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/top_level.txt +0 -0
|
@@ -1,249 +1,249 @@
|
|
|
1
|
-
# Copyright 2024 Volvo Car Corporation
|
|
2
|
-
# Licensed under Apache 2.0.
|
|
3
|
-
|
|
4
|
-
"""Module to handle the Simulink interface."""
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
from powertrain_build.lib import logger
|
|
8
|
-
|
|
9
|
-
LOGGER = logger.create_logger("simulink")
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def get_interface(interface_data_types, dp_interface, hal_interface, sfw_interface, method_interface):
|
|
13
|
-
""" Get interface combined for dp, hal and sfw
|
|
14
|
-
|
|
15
|
-
Args:
|
|
16
|
-
interface_data_types (dict): User defined interface data types
|
|
17
|
-
dp_interface (dict): DP interface
|
|
18
|
-
hal_interface (dict): HAL interface
|
|
19
|
-
sfw_interface (dict): SFW interface
|
|
20
|
-
method_interface (dict): Method interface
|
|
21
|
-
Returns:
|
|
22
|
-
output ([dict]): Combined interface
|
|
23
|
-
"""
|
|
24
|
-
output = []
|
|
25
|
-
output = add_dp(output, interface_data_types, split_interface(dp_interface))
|
|
26
|
-
output = add_api(output, interface_data_types, split_interface(hal_interface))
|
|
27
|
-
output = add_api(output, interface_data_types, split_interface(sfw_interface))
|
|
28
|
-
output = add_methods(output, interface_data_types, method_interface)
|
|
29
|
-
|
|
30
|
-
# Cannot have a completely empty adapters file, CSP will break
|
|
31
|
-
if not output:
|
|
32
|
-
if dp_interface:
|
|
33
|
-
output = ensure_raster(output, list(dp_interface.keys())[0] + '_Nothing__Always')
|
|
34
|
-
elif hal_interface:
|
|
35
|
-
output = ensure_raster(output, list(hal_interface.keys())[0] + '_Nothing_Always')
|
|
36
|
-
elif sfw_interface:
|
|
37
|
-
output = ensure_raster(output, list(sfw_interface.keys())[0] + '_Nothing_Always')
|
|
38
|
-
return output
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def split_interface(interface):
|
|
42
|
-
"""Takes a raster interface and splits it based on read strategies.
|
|
43
|
-
|
|
44
|
-
Args:
|
|
45
|
-
interface (dict): DP/HAL/SFW raster interface.
|
|
46
|
-
Returns:
|
|
47
|
-
strategy_split_interface (dict): DP/HAL/SFW interface divided by read strategy.
|
|
48
|
-
"""
|
|
49
|
-
strategy_split_interface = {}
|
|
50
|
-
for raster, raster_data in interface.items():
|
|
51
|
-
for port_type, signals in raster_data.items():
|
|
52
|
-
for signal_spec in signals:
|
|
53
|
-
interface_name = signal_spec.get('api') or signal_spec.get('domain').replace('_', '')
|
|
54
|
-
new_raster = '_'.join([raster, interface_name, signal_spec['strategy']])
|
|
55
|
-
if new_raster not in strategy_split_interface:
|
|
56
|
-
strategy_split_interface[new_raster] = {p: [] for p in raster_data}
|
|
57
|
-
strategy_split_interface[new_raster][port_type].append(signal_spec)
|
|
58
|
-
return strategy_split_interface
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def ensure_raster(output, raster):
|
|
62
|
-
""" Ensure raster exists in the output
|
|
63
|
-
|
|
64
|
-
Args:
|
|
65
|
-
output ([dict]): Combined interface
|
|
66
|
-
raster (str): Name of raster
|
|
67
|
-
Returns:
|
|
68
|
-
output ([dict]): Combined interface
|
|
69
|
-
"""
|
|
70
|
-
for adapter in output:
|
|
71
|
-
if adapter['name'] == raster:
|
|
72
|
-
return output
|
|
73
|
-
output.append(
|
|
74
|
-
{
|
|
75
|
-
"name": raster,
|
|
76
|
-
"ports": {
|
|
77
|
-
"in": {},
|
|
78
|
-
"out": {}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
)
|
|
82
|
-
return output
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def get_adapter(interface, raster):
|
|
86
|
-
""" Get adapter
|
|
87
|
-
|
|
88
|
-
Args:
|
|
89
|
-
interface (dict): Combined interface
|
|
90
|
-
raster (str): Name of raster
|
|
91
|
-
Returns:
|
|
92
|
-
adapter (dict): Adapter for the raster already in the interface
|
|
93
|
-
"""
|
|
94
|
-
for adapter in interface:
|
|
95
|
-
if adapter['name'] == raster:
|
|
96
|
-
return adapter
|
|
97
|
-
raise KeyError(raster)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
def add_dp(output, interface_data_types, interface):
|
|
101
|
-
""" Adds the DP interface to the combined interface
|
|
102
|
-
|
|
103
|
-
Args:
|
|
104
|
-
output ([dict]): Combined interface
|
|
105
|
-
interface_data_types (dict): User defined interface data types
|
|
106
|
-
interface (dict): DP interface
|
|
107
|
-
Returns
|
|
108
|
-
output (dict): Combined interface
|
|
109
|
-
"""
|
|
110
|
-
ports = {
|
|
111
|
-
"consumer": "in",
|
|
112
|
-
"producer": "out"
|
|
113
|
-
}
|
|
114
|
-
for raster, raster_data in interface.items():
|
|
115
|
-
if not isinstance(raster_data, dict):
|
|
116
|
-
LOGGER.debug('Ignoring metadata: %s', raster_data)
|
|
117
|
-
continue
|
|
118
|
-
output = ensure_raster(output, raster)
|
|
119
|
-
adapter = get_adapter(output, raster)
|
|
120
|
-
for port_type, signals in raster_data.items():
|
|
121
|
-
for signal in signals:
|
|
122
|
-
data_type = signal['variable_type']
|
|
123
|
-
primitive = ['signals']
|
|
124
|
-
primitive.append(signal['domain'])
|
|
125
|
-
if signal['group'] is not None:
|
|
126
|
-
primitive.append(signal['group'])
|
|
127
|
-
primitive.append(signal['property'])
|
|
128
|
-
adapter['ports'][ports[port_type]][signal['variable']] = {
|
|
129
|
-
'primitive': '.'.join(primitive),
|
|
130
|
-
'type': data_type
|
|
131
|
-
}
|
|
132
|
-
if 'enums' in interface_data_types and data_type in interface_data_types['enums']:
|
|
133
|
-
csp_enum_definition = add_csp_enum_def(data_type, interface_data_types['enums'][data_type])
|
|
134
|
-
if 'types' not in adapter:
|
|
135
|
-
adapter['types'] = []
|
|
136
|
-
if csp_enum_definition not in adapter['types']:
|
|
137
|
-
adapter['types'].append(csp_enum_definition)
|
|
138
|
-
return output
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def add_api(output, interface_data_types, interface):
|
|
142
|
-
""" Adds the HAL/GenericApi/SFW interface to the combined interface
|
|
143
|
-
|
|
144
|
-
Args:
|
|
145
|
-
output ([dict]): Combined interface
|
|
146
|
-
interface_data_types (dict): User defined interface data types
|
|
147
|
-
interface (dict): HAL interface
|
|
148
|
-
Returns
|
|
149
|
-
output (dict): Combined interface
|
|
150
|
-
"""
|
|
151
|
-
ports = {
|
|
152
|
-
"consumer": "in",
|
|
153
|
-
"producer": "out"
|
|
154
|
-
}
|
|
155
|
-
for raster, raster_data in interface.items():
|
|
156
|
-
if not isinstance(raster_data, dict):
|
|
157
|
-
LOGGER.debug('Ignoring metadata: %s', raster_data)
|
|
158
|
-
continue
|
|
159
|
-
output = ensure_raster(output, raster)
|
|
160
|
-
adapter = get_adapter(output, raster)
|
|
161
|
-
for port_type, signals in raster_data.items():
|
|
162
|
-
for signal in signals:
|
|
163
|
-
data_type = signal['variable_type']
|
|
164
|
-
primitive = [signal['api'].lower()]
|
|
165
|
-
primitive.append(signal['endpoint'].lower())
|
|
166
|
-
if signal['property'] is not None:
|
|
167
|
-
primitive.append(signal['property'].lower())
|
|
168
|
-
adapter['ports'][ports[port_type]][signal['variable']] = {
|
|
169
|
-
'primitive': '.'.join(primitive),
|
|
170
|
-
'type': data_type
|
|
171
|
-
}
|
|
172
|
-
if 'enums' in interface_data_types and data_type in interface_data_types['enums']:
|
|
173
|
-
csp_enum_definition = add_csp_enum_def(data_type, interface_data_types['enums'][data_type])
|
|
174
|
-
if 'types' not in adapter:
|
|
175
|
-
adapter['types'] = []
|
|
176
|
-
if csp_enum_definition not in adapter['types']:
|
|
177
|
-
adapter['types'].append(csp_enum_definition)
|
|
178
|
-
return output
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
def add_methods(output, interface_data_types, methods):
|
|
182
|
-
""" Adds the CSP method call interfaces to the combined interface.
|
|
183
|
-
|
|
184
|
-
Args:
|
|
185
|
-
output ([dict]): Combined interface
|
|
186
|
-
interface_data_types (dict): Dict with enum definitions
|
|
187
|
-
methods (dict): Methods used by the application
|
|
188
|
-
Returns:
|
|
189
|
-
output (dict): Combined interface
|
|
190
|
-
"""
|
|
191
|
-
|
|
192
|
-
if methods == {}:
|
|
193
|
-
return output
|
|
194
|
-
output = ensure_raster(output, 'csp_methods')
|
|
195
|
-
adapter = get_adapter(output, 'csp_methods')
|
|
196
|
-
if 'methods' not in adapter:
|
|
197
|
-
adapter['methods'] = []
|
|
198
|
-
for method_data in methods.values():
|
|
199
|
-
method_spec = {}
|
|
200
|
-
method_spec['name'] = method_data['name']
|
|
201
|
-
method_spec['primitive_method'] = method_data['primitive']
|
|
202
|
-
method_spec['namespace'] = method_data['namespace']
|
|
203
|
-
if 'description' in method_data:
|
|
204
|
-
method_spec['description'] = method_data['description']
|
|
205
|
-
for direction in ['in', 'out']:
|
|
206
|
-
parameters = method_data['ports'][direction]
|
|
207
|
-
if len(parameters) > 0:
|
|
208
|
-
method_spec[direction] = []
|
|
209
|
-
for param_name, param_data in parameters.items():
|
|
210
|
-
param_spec = {}
|
|
211
|
-
param_spec['name'] = param_name
|
|
212
|
-
param_spec['primitive_name'] = param_data['primitive']
|
|
213
|
-
data_type = param_data['type']
|
|
214
|
-
param_spec['type'] = data_type
|
|
215
|
-
method_spec[direction].append(param_spec)
|
|
216
|
-
if data_type in interface_data_types.get('enums', {}):
|
|
217
|
-
csp_enum_definition = add_csp_enum_def(data_type, interface_data_types['enums'][data_type])
|
|
218
|
-
if 'types' not in adapter:
|
|
219
|
-
adapter['types'] = []
|
|
220
|
-
if csp_enum_definition not in adapter['types']:
|
|
221
|
-
adapter['types'].append(csp_enum_definition)
|
|
222
|
-
adapter['methods'].append(method_spec)
|
|
223
|
-
return output
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def add_csp_enum_def(enum_name, interface_enum_definition):
|
|
227
|
-
""" Returns a CSP style enumeration definition, given an interface style enum definition.
|
|
228
|
-
|
|
229
|
-
Args:
|
|
230
|
-
enum_name (str): Name of the enumeration
|
|
231
|
-
interface_enum_definition (dict): Enumeration from interface data types
|
|
232
|
-
Returns:
|
|
233
|
-
csp_enum_definition (dict): Combined interface
|
|
234
|
-
"""
|
|
235
|
-
default = {}
|
|
236
|
-
enumerators = []
|
|
237
|
-
for enum_member_definition in interface_enum_definition:
|
|
238
|
-
if 'default' in enum_member_definition:
|
|
239
|
-
default = {enum_member_definition['in']: enum_member_definition['out']}
|
|
240
|
-
else:
|
|
241
|
-
enumerators.append({enum_member_definition['in']: enum_member_definition['out']})
|
|
242
|
-
|
|
243
|
-
csp_enum_definition = {
|
|
244
|
-
'name': enum_name,
|
|
245
|
-
'kind': 'enum',
|
|
246
|
-
'enumerators': enumerators,
|
|
247
|
-
'default': default
|
|
248
|
-
}
|
|
249
|
-
return csp_enum_definition
|
|
1
|
+
# Copyright 2024 Volvo Car Corporation
|
|
2
|
+
# Licensed under Apache 2.0.
|
|
3
|
+
|
|
4
|
+
"""Module to handle the Simulink interface."""
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
from powertrain_build.lib import logger
|
|
8
|
+
|
|
9
|
+
LOGGER = logger.create_logger("simulink")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_interface(interface_data_types, dp_interface, hal_interface, sfw_interface, method_interface):
|
|
13
|
+
""" Get interface combined for dp, hal and sfw
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
interface_data_types (dict): User defined interface data types
|
|
17
|
+
dp_interface (dict): DP interface
|
|
18
|
+
hal_interface (dict): HAL interface
|
|
19
|
+
sfw_interface (dict): SFW interface
|
|
20
|
+
method_interface (dict): Method interface
|
|
21
|
+
Returns:
|
|
22
|
+
output ([dict]): Combined interface
|
|
23
|
+
"""
|
|
24
|
+
output = []
|
|
25
|
+
output = add_dp(output, interface_data_types, split_interface(dp_interface))
|
|
26
|
+
output = add_api(output, interface_data_types, split_interface(hal_interface))
|
|
27
|
+
output = add_api(output, interface_data_types, split_interface(sfw_interface))
|
|
28
|
+
output = add_methods(output, interface_data_types, method_interface)
|
|
29
|
+
|
|
30
|
+
# Cannot have a completely empty adapters file, CSP will break
|
|
31
|
+
if not output:
|
|
32
|
+
if dp_interface:
|
|
33
|
+
output = ensure_raster(output, list(dp_interface.keys())[0] + '_Nothing__Always')
|
|
34
|
+
elif hal_interface:
|
|
35
|
+
output = ensure_raster(output, list(hal_interface.keys())[0] + '_Nothing_Always')
|
|
36
|
+
elif sfw_interface:
|
|
37
|
+
output = ensure_raster(output, list(sfw_interface.keys())[0] + '_Nothing_Always')
|
|
38
|
+
return output
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def split_interface(interface):
|
|
42
|
+
"""Takes a raster interface and splits it based on read strategies.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
interface (dict): DP/HAL/SFW raster interface.
|
|
46
|
+
Returns:
|
|
47
|
+
strategy_split_interface (dict): DP/HAL/SFW interface divided by read strategy.
|
|
48
|
+
"""
|
|
49
|
+
strategy_split_interface = {}
|
|
50
|
+
for raster, raster_data in interface.items():
|
|
51
|
+
for port_type, signals in raster_data.items():
|
|
52
|
+
for signal_spec in signals:
|
|
53
|
+
interface_name = signal_spec.get('api') or signal_spec.get('domain').replace('_', '')
|
|
54
|
+
new_raster = '_'.join([raster, interface_name, signal_spec['strategy']])
|
|
55
|
+
if new_raster not in strategy_split_interface:
|
|
56
|
+
strategy_split_interface[new_raster] = {p: [] for p in raster_data}
|
|
57
|
+
strategy_split_interface[new_raster][port_type].append(signal_spec)
|
|
58
|
+
return strategy_split_interface
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def ensure_raster(output, raster):
|
|
62
|
+
""" Ensure raster exists in the output
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
output ([dict]): Combined interface
|
|
66
|
+
raster (str): Name of raster
|
|
67
|
+
Returns:
|
|
68
|
+
output ([dict]): Combined interface
|
|
69
|
+
"""
|
|
70
|
+
for adapter in output:
|
|
71
|
+
if adapter['name'] == raster:
|
|
72
|
+
return output
|
|
73
|
+
output.append(
|
|
74
|
+
{
|
|
75
|
+
"name": raster,
|
|
76
|
+
"ports": {
|
|
77
|
+
"in": {},
|
|
78
|
+
"out": {}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
return output
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def get_adapter(interface, raster):
|
|
86
|
+
""" Get adapter
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
interface (dict): Combined interface
|
|
90
|
+
raster (str): Name of raster
|
|
91
|
+
Returns:
|
|
92
|
+
adapter (dict): Adapter for the raster already in the interface
|
|
93
|
+
"""
|
|
94
|
+
for adapter in interface:
|
|
95
|
+
if adapter['name'] == raster:
|
|
96
|
+
return adapter
|
|
97
|
+
raise KeyError(raster)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def add_dp(output, interface_data_types, interface):
|
|
101
|
+
""" Adds the DP interface to the combined interface
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
output ([dict]): Combined interface
|
|
105
|
+
interface_data_types (dict): User defined interface data types
|
|
106
|
+
interface (dict): DP interface
|
|
107
|
+
Returns
|
|
108
|
+
output (dict): Combined interface
|
|
109
|
+
"""
|
|
110
|
+
ports = {
|
|
111
|
+
"consumer": "in",
|
|
112
|
+
"producer": "out"
|
|
113
|
+
}
|
|
114
|
+
for raster, raster_data in interface.items():
|
|
115
|
+
if not isinstance(raster_data, dict):
|
|
116
|
+
LOGGER.debug('Ignoring metadata: %s', raster_data)
|
|
117
|
+
continue
|
|
118
|
+
output = ensure_raster(output, raster)
|
|
119
|
+
adapter = get_adapter(output, raster)
|
|
120
|
+
for port_type, signals in raster_data.items():
|
|
121
|
+
for signal in signals:
|
|
122
|
+
data_type = signal['variable_type']
|
|
123
|
+
primitive = ['signals']
|
|
124
|
+
primitive.append(signal['domain'])
|
|
125
|
+
if signal['group'] is not None:
|
|
126
|
+
primitive.append(signal['group'])
|
|
127
|
+
primitive.append(signal['property'])
|
|
128
|
+
adapter['ports'][ports[port_type]][signal['variable']] = {
|
|
129
|
+
'primitive': '.'.join(primitive),
|
|
130
|
+
'type': data_type
|
|
131
|
+
}
|
|
132
|
+
if 'enums' in interface_data_types and data_type in interface_data_types['enums']:
|
|
133
|
+
csp_enum_definition = add_csp_enum_def(data_type, interface_data_types['enums'][data_type])
|
|
134
|
+
if 'types' not in adapter:
|
|
135
|
+
adapter['types'] = []
|
|
136
|
+
if csp_enum_definition not in adapter['types']:
|
|
137
|
+
adapter['types'].append(csp_enum_definition)
|
|
138
|
+
return output
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def add_api(output, interface_data_types, interface):
|
|
142
|
+
""" Adds the HAL/GenericApi/SFW interface to the combined interface
|
|
143
|
+
|
|
144
|
+
Args:
|
|
145
|
+
output ([dict]): Combined interface
|
|
146
|
+
interface_data_types (dict): User defined interface data types
|
|
147
|
+
interface (dict): HAL interface
|
|
148
|
+
Returns
|
|
149
|
+
output (dict): Combined interface
|
|
150
|
+
"""
|
|
151
|
+
ports = {
|
|
152
|
+
"consumer": "in",
|
|
153
|
+
"producer": "out"
|
|
154
|
+
}
|
|
155
|
+
for raster, raster_data in interface.items():
|
|
156
|
+
if not isinstance(raster_data, dict):
|
|
157
|
+
LOGGER.debug('Ignoring metadata: %s', raster_data)
|
|
158
|
+
continue
|
|
159
|
+
output = ensure_raster(output, raster)
|
|
160
|
+
adapter = get_adapter(output, raster)
|
|
161
|
+
for port_type, signals in raster_data.items():
|
|
162
|
+
for signal in signals:
|
|
163
|
+
data_type = signal['variable_type']
|
|
164
|
+
primitive = [signal['api'].lower()]
|
|
165
|
+
primitive.append(signal['endpoint'].lower())
|
|
166
|
+
if signal['property'] is not None:
|
|
167
|
+
primitive.append(signal['property'].lower())
|
|
168
|
+
adapter['ports'][ports[port_type]][signal['variable']] = {
|
|
169
|
+
'primitive': '.'.join(primitive),
|
|
170
|
+
'type': data_type
|
|
171
|
+
}
|
|
172
|
+
if 'enums' in interface_data_types and data_type in interface_data_types['enums']:
|
|
173
|
+
csp_enum_definition = add_csp_enum_def(data_type, interface_data_types['enums'][data_type])
|
|
174
|
+
if 'types' not in adapter:
|
|
175
|
+
adapter['types'] = []
|
|
176
|
+
if csp_enum_definition not in adapter['types']:
|
|
177
|
+
adapter['types'].append(csp_enum_definition)
|
|
178
|
+
return output
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def add_methods(output, interface_data_types, methods):
|
|
182
|
+
""" Adds the CSP method call interfaces to the combined interface.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
output ([dict]): Combined interface
|
|
186
|
+
interface_data_types (dict): Dict with enum definitions
|
|
187
|
+
methods (dict): Methods used by the application
|
|
188
|
+
Returns:
|
|
189
|
+
output (dict): Combined interface
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
if methods == {}:
|
|
193
|
+
return output
|
|
194
|
+
output = ensure_raster(output, 'csp_methods')
|
|
195
|
+
adapter = get_adapter(output, 'csp_methods')
|
|
196
|
+
if 'methods' not in adapter:
|
|
197
|
+
adapter['methods'] = []
|
|
198
|
+
for method_data in methods.values():
|
|
199
|
+
method_spec = {}
|
|
200
|
+
method_spec['name'] = method_data['name']
|
|
201
|
+
method_spec['primitive_method'] = method_data['primitive']
|
|
202
|
+
method_spec['namespace'] = method_data['namespace']
|
|
203
|
+
if 'description' in method_data:
|
|
204
|
+
method_spec['description'] = method_data['description']
|
|
205
|
+
for direction in ['in', 'out']:
|
|
206
|
+
parameters = method_data['ports'][direction]
|
|
207
|
+
if len(parameters) > 0:
|
|
208
|
+
method_spec[direction] = []
|
|
209
|
+
for param_name, param_data in parameters.items():
|
|
210
|
+
param_spec = {}
|
|
211
|
+
param_spec['name'] = param_name
|
|
212
|
+
param_spec['primitive_name'] = param_data['primitive']
|
|
213
|
+
data_type = param_data['type']
|
|
214
|
+
param_spec['type'] = data_type
|
|
215
|
+
method_spec[direction].append(param_spec)
|
|
216
|
+
if data_type in interface_data_types.get('enums', {}):
|
|
217
|
+
csp_enum_definition = add_csp_enum_def(data_type, interface_data_types['enums'][data_type])
|
|
218
|
+
if 'types' not in adapter:
|
|
219
|
+
adapter['types'] = []
|
|
220
|
+
if csp_enum_definition not in adapter['types']:
|
|
221
|
+
adapter['types'].append(csp_enum_definition)
|
|
222
|
+
adapter['methods'].append(method_spec)
|
|
223
|
+
return output
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def add_csp_enum_def(enum_name, interface_enum_definition):
|
|
227
|
+
""" Returns a CSP style enumeration definition, given an interface style enum definition.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
enum_name (str): Name of the enumeration
|
|
231
|
+
interface_enum_definition (dict): Enumeration from interface data types
|
|
232
|
+
Returns:
|
|
233
|
+
csp_enum_definition (dict): Combined interface
|
|
234
|
+
"""
|
|
235
|
+
default = {}
|
|
236
|
+
enumerators = []
|
|
237
|
+
for enum_member_definition in interface_enum_definition:
|
|
238
|
+
if 'default' in enum_member_definition:
|
|
239
|
+
default = {enum_member_definition['in']: enum_member_definition['out']}
|
|
240
|
+
else:
|
|
241
|
+
enumerators.append({enum_member_definition['in']: enum_member_definition['out']})
|
|
242
|
+
|
|
243
|
+
csp_enum_definition = {
|
|
244
|
+
'name': enum_name,
|
|
245
|
+
'kind': 'enum',
|
|
246
|
+
'enumerators': enumerators,
|
|
247
|
+
'default': default
|
|
248
|
+
}
|
|
249
|
+
return csp_enum_definition
|