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.
Files changed (132) hide show
  1. powertrain_build/__init__.py +40 -40
  2. powertrain_build/__main__.py +6 -6
  3. powertrain_build/a2l.py +582 -582
  4. powertrain_build/a2l_merge.py +650 -650
  5. powertrain_build/a2l_templates.py +717 -717
  6. powertrain_build/build.py +985 -985
  7. powertrain_build/build_defs.py +309 -309
  8. powertrain_build/build_proj_config.py +690 -690
  9. powertrain_build/check_interface.py +575 -575
  10. powertrain_build/cli.py +141 -141
  11. powertrain_build/config.py +542 -542
  12. powertrain_build/core.py +395 -395
  13. powertrain_build/core_dummy.py +343 -343
  14. powertrain_build/create_conversion_table.py +73 -73
  15. powertrain_build/dids.py +916 -916
  16. powertrain_build/dummy.py +157 -157
  17. powertrain_build/dummy_spm.py +252 -252
  18. powertrain_build/environmentcheck.py +52 -52
  19. powertrain_build/ext_dbg.py +255 -255
  20. powertrain_build/ext_var.py +327 -327
  21. powertrain_build/feature_configs.py +301 -301
  22. powertrain_build/gen_allsysteminfo.py +227 -227
  23. powertrain_build/gen_label_split.py +449 -449
  24. powertrain_build/handcode_replacer.py +124 -124
  25. powertrain_build/html_report.py +133 -133
  26. powertrain_build/interface/__init__.py +4 -4
  27. powertrain_build/interface/application.py +511 -511
  28. powertrain_build/interface/base.py +500 -500
  29. powertrain_build/interface/csp_api.py +490 -490
  30. powertrain_build/interface/device_proxy.py +677 -677
  31. powertrain_build/interface/ems.py +67 -67
  32. powertrain_build/interface/export_global_vars.py +121 -121
  33. powertrain_build/interface/generate_adapters.py +132 -132
  34. powertrain_build/interface/generate_hi_interface.py +87 -87
  35. powertrain_build/interface/generate_service.py +69 -69
  36. powertrain_build/interface/generate_wrappers.py +147 -147
  37. powertrain_build/interface/generation_utils.py +142 -142
  38. powertrain_build/interface/hal.py +194 -194
  39. powertrain_build/interface/model_yaml_verification.py +348 -348
  40. powertrain_build/interface/service.py +296 -296
  41. powertrain_build/interface/simulink.py +249 -249
  42. powertrain_build/interface/update_call_sources.py +180 -180
  43. powertrain_build/interface/update_model_yaml.py +186 -186
  44. powertrain_build/interface/zone_controller.py +362 -362
  45. powertrain_build/lib/__init__.py +4 -4
  46. powertrain_build/lib/helper_functions.py +127 -127
  47. powertrain_build/lib/logger.py +55 -55
  48. powertrain_build/matlab_scripts/CodeGen/BuildAutomationPyBuild.m +78 -78
  49. powertrain_build/matlab_scripts/CodeGen/Generate_A2L.m +154 -154
  50. powertrain_build/matlab_scripts/CodeGen/generateTLUnit.m +239 -239
  51. powertrain_build/matlab_scripts/CodeGen/getAsilClassification.m +28 -28
  52. powertrain_build/matlab_scripts/CodeGen/modelConfiguredForTL.m +28 -28
  53. powertrain_build/matlab_scripts/CodeGen/moveDefOutports.m +88 -88
  54. powertrain_build/matlab_scripts/CodeGen/parseCalMeasData.m +410 -410
  55. powertrain_build/matlab_scripts/CodeGen/parseCoreIdentifiers.m +139 -139
  56. powertrain_build/matlab_scripts/CodeGen/parseDIDs.m +141 -141
  57. powertrain_build/matlab_scripts/CodeGen/parseInPorts.m +106 -106
  58. powertrain_build/matlab_scripts/CodeGen/parseIncludeConfigs.m +25 -25
  59. powertrain_build/matlab_scripts/CodeGen/parseModelInfo.m +38 -38
  60. powertrain_build/matlab_scripts/CodeGen/parseNVM.m +81 -81
  61. powertrain_build/matlab_scripts/CodeGen/parseOutPorts.m +120 -120
  62. powertrain_build/matlab_scripts/CodeGen/parsePreProcBlks.m +23 -23
  63. powertrain_build/matlab_scripts/CodeGen/struct2JSON.m +128 -128
  64. powertrain_build/matlab_scripts/CodeGen/updateCodeSwConfig.m +31 -31
  65. powertrain_build/matlab_scripts/Init_PyBuild.m +91 -91
  66. powertrain_build/matlab_scripts/__init__.py +2 -2
  67. powertrain_build/matlab_scripts/helperFunctions/Get_Full_Name.m +46 -46
  68. powertrain_build/matlab_scripts/helperFunctions/Get_SrcLines.m +12 -12
  69. powertrain_build/matlab_scripts/helperFunctions/Init_Models.m +78 -78
  70. powertrain_build/matlab_scripts/helperFunctions/Init_Projects.m +67 -67
  71. powertrain_build/matlab_scripts/helperFunctions/Read_Units.m +34 -34
  72. powertrain_build/matlab_scripts/helperFunctions/SetProjectTimeSamples.m +26 -26
  73. powertrain_build/matlab_scripts/helperFunctions/Strip_Suffix.m +16 -16
  74. powertrain_build/matlab_scripts/helperFunctions/followLink.m +118 -118
  75. powertrain_build/matlab_scripts/helperFunctions/getCodeSwitches.m +50 -50
  76. powertrain_build/matlab_scripts/helperFunctions/getConsumerBlocks.m +30 -30
  77. powertrain_build/matlab_scripts/helperFunctions/getDefBlock.m +39 -39
  78. powertrain_build/matlab_scripts/helperFunctions/getDefOutport.m +58 -58
  79. powertrain_build/matlab_scripts/helperFunctions/getDstBlocks.m +19 -19
  80. powertrain_build/matlab_scripts/helperFunctions/getDstLines.m +13 -13
  81. powertrain_build/matlab_scripts/helperFunctions/getInterfaceSignals.m +37 -37
  82. powertrain_build/matlab_scripts/helperFunctions/getName.m +37 -37
  83. powertrain_build/matlab_scripts/helperFunctions/getPath.m +6 -6
  84. powertrain_build/matlab_scripts/helperFunctions/getProperValue.m +21 -21
  85. powertrain_build/matlab_scripts/helperFunctions/getSrcBlocks.m +19 -19
  86. powertrain_build/matlab_scripts/helperFunctions/getSrcLines.m +13 -13
  87. powertrain_build/matlab_scripts/helperFunctions/loadLibraries.m +10 -10
  88. powertrain_build/matlab_scripts/helperFunctions/loadjson.m +6 -6
  89. powertrain_build/matlab_scripts/helperFunctions/modifyEnumStructField.m +21 -21
  90. powertrain_build/matlab_scripts/helperFunctions/removeConfigDuplicates.m +31 -31
  91. powertrain_build/matlab_scripts/helperFunctions/sortSystemByClass.m +26 -26
  92. powertrain_build/matlab_scripts/helperFunctions/tl_getfast.m +89 -89
  93. powertrain_build/matlab_scripts/helperFunctions/topLevelSystem.m +20 -20
  94. powertrain_build/matlab_scripts/helperFunctions/updateModels.m +131 -131
  95. powertrain_build/memory_section.py +224 -224
  96. powertrain_build/nvm_def.py +729 -729
  97. powertrain_build/problem_logger.py +86 -86
  98. powertrain_build/pt_matlab.py +430 -430
  99. powertrain_build/pt_win32.py +144 -144
  100. powertrain_build/replace_compu_tab_ref.py +105 -105
  101. powertrain_build/rte_dummy.py +254 -254
  102. powertrain_build/sched_funcs.py +209 -207
  103. powertrain_build/signal.py +7 -7
  104. powertrain_build/signal_if_html_rep.py +221 -221
  105. powertrain_build/signal_if_html_rep_all.py +302 -302
  106. powertrain_build/signal_incons_html_rep.py +180 -180
  107. powertrain_build/signal_incons_html_rep_all.py +366 -366
  108. powertrain_build/signal_incons_html_rep_base.py +168 -168
  109. powertrain_build/signal_inconsistency_check.py +641 -641
  110. powertrain_build/signal_interfaces.py +864 -864
  111. powertrain_build/templates/Index_SigCheck_All.html +22 -22
  112. powertrain_build/templates/Index_SigIf_All.html +19 -19
  113. powertrain_build/types.py +218 -218
  114. powertrain_build/unit_configs.py +419 -419
  115. powertrain_build/user_defined_types.py +660 -660
  116. powertrain_build/versioncheck.py +66 -66
  117. powertrain_build/wrapper.py +512 -512
  118. powertrain_build/xlrd_csv.py +87 -87
  119. powertrain_build/zone_controller/__init__.py +4 -4
  120. powertrain_build/zone_controller/calibration.py +176 -176
  121. powertrain_build/zone_controller/composition_yaml.py +880 -878
  122. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/METADATA +100 -100
  123. powertrain_build-1.13.3.dev3.dist-info/RECORD +130 -0
  124. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/WHEEL +1 -1
  125. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/LICENSE +202 -202
  126. powertrain_build-1.13.3.dev3.dist-info/pbr.json +1 -0
  127. powertrain_build-1.13.1.dist-info/RECORD +0 -130
  128. powertrain_build-1.13.1.dist-info/pbr.json +0 -1
  129. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/entry_points.txt +0 -0
  130. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/AUTHORS +0 -0
  131. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/NOTICE +0 -0
  132. {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