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,154 +1,154 @@
1
- % Copyright 2024 Volvo Car Corporation
2
- % Licensed under Apache 2.0.
3
-
4
- function Generate_A2L(CodegenFunction, A2lStylesheetName, model_ending)
5
- if nargin < 3
6
- model_ending = '_Tmp';
7
- end
8
- fprintf('\n\nGeneration of %s started\n\n', [CodegenFunction '.a2l']);
9
- workspace = getenv('WORKSPACE');
10
- tl_config_dir = fullfile([workspace, '/ConfigDocuments/TL4_3_settings']);
11
- if exist(tl_config_dir, 'dir')
12
- TargetInfoDir = fullfile([tl_config_dir '/TargetInfo']);
13
- TargetConfigDir = fullfile([tl_config_dir '/TargetConfig']);
14
- else
15
- TargetInfoDir = fullfile([getenv('TL_ROOT') '/Matlab/TL/ApplicationBuilder/BoardPackages/HostPC64/MSVC']);
16
- TargetConfigDir = fullfile([getenv('TL_ROOT') '/Matlab/TL/TargetConfiguration/x86_64/MSVC']);
17
- end
18
-
19
- ApplicationName = [CodegenFunction model_ending];
20
- BuildName = ['Build' CodegenFunction model_ending];
21
- dsdd_manage_build('Create',...
22
- 'Name', BuildName,...
23
- 'Application', ApplicationName,...
24
- 'TargetInfoDir', TargetInfoDir,...
25
- 'TargetConfigDir', TargetConfigDir);
26
-
27
- simulinkToTargetLinkDataTypes = struct(...
28
- 'int', 'Int32',...
29
- 'int32', 'Int32',...
30
- 'uint16', 'UInt16',...
31
- 'int16', 'Int16',...
32
- 'uint8', 'UInt8',...
33
- 'int8', 'Int8'...
34
- );
35
- enumDataTypesObj = dsdd('CreateEnumDataTypes', ['/' ApplicationName '/' BuildName]);
36
- enumNames = GetUsedEnumerations(CodegenFunction);
37
- for idx = 1:length(enumNames)
38
- enumName = enumNames{idx};
39
- enumMemberNames = enumeration(enumName);
40
- if isempty(enumMemberNames)
41
- error([...
42
- 'Cannot get enum name %s from model %s.',...
43
- 'Enum name should match the unit in applicable blocks, e.g. -,$EnumName.'...
44
- ], enumName, modelName);
45
- end
46
- if ismember('calculateUnderlyingDataType', methods(enumName)) && enumMemberNames(1).calculateUnderlyingDataType()
47
- underlyingDataType = CalculateUnderlyingDataType(enumName, enumMemberNames);
48
- else
49
- simulinkDataType = Simulink.data.getEnumTypeInfo(enumName, 'StorageType');
50
- underlyingDataType = simulinkToTargetLinkDataTypes.(simulinkDataType);
51
- end
52
- [hDDTypedef, ~, ~] = tlEnumDataType('CreateDDTypedef',...
53
- 'SLEnumType', enumName,...
54
- 'TypedefGroup', ['/' ApplicationName '/' BuildName '/EnumDataTypes'],...
55
- 'CreateTemplate', 'off');
56
- dsdd('SetUnderlyingEnumDataType', hDDTypedef, underlyingDataType);
57
- dsdd('SetTag', hDDTypedef, [enumName '_tag']);
58
- end
59
-
60
- dsdd_export_a2l_file(...
61
- 'Application', ApplicationName,...
62
- 'Build', BuildName,...
63
- 'TargetInfoDir', TargetInfoDir,...
64
- 'TargetConfigDir', TargetConfigDir,...
65
- 'StyleSheet', A2lStylesheetName,...
66
- 'File', [CodegenFunction '.a2l'],...
67
- 'ProjectFrame', 'off',...
68
- 'OverwriteCalProperties', 'on',...
69
- 'MergeA2lModules', 'on',...
70
- 'asap2version', '1.40',...
71
- 'UseLookupStructures', 'off',...
72
- 'ExternalVariables', 'on',...
73
- 'UseUnderlyingEnumDataTypeInfo', 'on');
74
-
75
- % Delete created enums, these can cause problems for upcoming code generation calls on models
76
- % using the same enumerations.
77
- dsdd('Delete', enumDataTypesObj);
78
- fprintf('\n\nGeneration of %s finished\n\n', [CodegenFunction '.a2l']);
79
- end
80
-
81
- function usedEnumerations = GetUsedEnumerations(modelName)
82
- %GETUSEDENUMERATIONS Get all enumeration names used in a given model.
83
- unsupportedByTLAPI = {'TL_DummyTrigger', 'TL_Enable', 'TL_Function', 'TL_SimFrame'};
84
- tlBlocksTmp = find_system(modelName, 'FindAll', 'on', 'LookUnderMasks', 'All', 'RegExp', 'on', 'MaskType', 'TL_*');
85
- supportedTlBlocksTmp = tlBlocksTmp(ismember(get_param(tlBlocksTmp, 'MaskType'), unsupportedByTLAPI)==0);
86
- % Get enumerations from TL_BusInport blocks
87
- busEnumerations = {};
88
- busInportBlocks = supportedTlBlocksTmp(strcmp(get_param(supportedTlBlocksTmp, 'MaskType'), 'TL_BusInport'));
89
- for idx = 1:length(busInportBlocks)
90
- for idy = 1:tl_get(busInportBlocks(idx), 'numoutputs')
91
- dataType = tl_get(busInportBlocks(idx), ['output(' num2str(idy) ').type']);
92
- unitTmp = tl_get(busInportBlocks(idx), ['output(' num2str(idy) ').unit']);
93
- if isempty(unitTmp)
94
- continue
95
- end
96
- unit = erase(unitTmp, ['-', ',', '$']);
97
- if strcmp(dataType, 'IMPLICIT_ENUM') && ~isempty(unit) && ~ismember(unit, busEnumerations)
98
- busEnumerations{end+1} = unit;
99
- end
100
- end
101
- end
102
- % Get enumerations from standard TL blocks
103
- supportedTlBlocks = supportedTlBlocksTmp(~strcmp(get_param(supportedTlBlocksTmp, 'MaskType'), 'TL_BusInport'));
104
- [allDataTypes, invalidIndices, ~] = tl_get(supportedTlBlocks, 'output.type');
105
- validTlBlocks = supportedTlBlocks(~invalidIndices);
106
- validDataTypes = allDataTypes(~invalidIndices);
107
- enumBlocks = validTlBlocks(strcmp(validDataTypes, 'IMPLICIT_ENUM'));
108
- unitsTmp = tl_get(enumBlocks, 'output.unit');
109
- if ~iscell(unitsTmp)
110
- unitsTmp = {unitsTmp};
111
- end
112
- if ~isempty(unitsTmp)
113
- units = unitsTmp(cellfun(@(x) ~isempty(x), unitsTmp));
114
- enumerations = unique(erase(units, ['-', ',', '$']));
115
- else
116
- enumerations = {};
117
- end
118
- usedEnumerations = unique([busEnumerations enumerations]);
119
- end
120
-
121
- function underlyingDataType = CalculateUnderlyingDataType(enumName, enumMemberNames)
122
- %CALCULATEUNDERLYINGDATATYPE Calculate best fitting data type given a name of an enumeration.
123
- % This is done by find min and max values, than choosing a fitting data type, as small as possible.
124
- % int32 is super class of Simulink.IntEnumType
125
- enumMemberValues = int32(enumMemberNames);
126
- minValue = min(enumMemberValues);
127
- maxValue = max(enumMemberValues);
128
-
129
- % TODO Consider forcing signed like CS (or ARXML, from database?) does, seems to be int8 specifically
130
- underlyingDataType = '';
131
- if minValue >= 0
132
- if maxValue <= 255
133
- underlyingDataType = 'UInt8';
134
- elseif maxValue <= 65535
135
- underlyingDataType = 'UInt16';
136
- end
137
- elseif minValue >= -128
138
- if maxValue <= 127
139
- underlyingDataType = 'Int8';
140
- elseif maxValue <= 32767
141
- underlyingDataType = 'Int16';
142
- end
143
- elseif minValue >= -32768
144
- if maxValue <= 32767
145
- underlyingDataType = 'Int16';
146
- end
147
- end
148
-
149
- if isempty(underlyingDataType)
150
- error(...
151
- 'Unhandled enum size, name: %s, min: %s, max: %s. Valid types are uint8/16 and int8/16',...
152
- enumName, minValue, maxValue);
153
- end
154
- end
1
+ % Copyright 2024 Volvo Car Corporation
2
+ % Licensed under Apache 2.0.
3
+
4
+ function Generate_A2L(CodegenFunction, A2lStylesheetName, model_ending)
5
+ if nargin < 3
6
+ model_ending = '_Tmp';
7
+ end
8
+ fprintf('\n\nGeneration of %s started\n\n', [CodegenFunction '.a2l']);
9
+ workspace = getenv('WORKSPACE');
10
+ tl_config_dir = fullfile([workspace, '/ConfigDocuments/TL4_3_settings']);
11
+ if exist(tl_config_dir, 'dir')
12
+ TargetInfoDir = fullfile([tl_config_dir '/TargetInfo']);
13
+ TargetConfigDir = fullfile([tl_config_dir '/TargetConfig']);
14
+ else
15
+ TargetInfoDir = fullfile([getenv('TL_ROOT') '/Matlab/TL/ApplicationBuilder/BoardPackages/HostPC64/MSVC']);
16
+ TargetConfigDir = fullfile([getenv('TL_ROOT') '/Matlab/TL/TargetConfiguration/x86_64/MSVC']);
17
+ end
18
+
19
+ ApplicationName = [CodegenFunction model_ending];
20
+ BuildName = ['Build' CodegenFunction model_ending];
21
+ dsdd_manage_build('Create',...
22
+ 'Name', BuildName,...
23
+ 'Application', ApplicationName,...
24
+ 'TargetInfoDir', TargetInfoDir,...
25
+ 'TargetConfigDir', TargetConfigDir);
26
+
27
+ simulinkToTargetLinkDataTypes = struct(...
28
+ 'int', 'Int32',...
29
+ 'int32', 'Int32',...
30
+ 'uint16', 'UInt16',...
31
+ 'int16', 'Int16',...
32
+ 'uint8', 'UInt8',...
33
+ 'int8', 'Int8'...
34
+ );
35
+ enumDataTypesObj = dsdd('CreateEnumDataTypes', ['/' ApplicationName '/' BuildName]);
36
+ enumNames = GetUsedEnumerations(CodegenFunction);
37
+ for idx = 1:length(enumNames)
38
+ enumName = enumNames{idx};
39
+ enumMemberNames = enumeration(enumName);
40
+ if isempty(enumMemberNames)
41
+ error([...
42
+ 'Cannot get enum name %s from model %s.',...
43
+ 'Enum name should match the unit in applicable blocks, e.g. -,$EnumName.'...
44
+ ], enumName, modelName);
45
+ end
46
+ if ismember('calculateUnderlyingDataType', methods(enumName)) && enumMemberNames(1).calculateUnderlyingDataType()
47
+ underlyingDataType = CalculateUnderlyingDataType(enumName, enumMemberNames);
48
+ else
49
+ simulinkDataType = Simulink.data.getEnumTypeInfo(enumName, 'StorageType');
50
+ underlyingDataType = simulinkToTargetLinkDataTypes.(simulinkDataType);
51
+ end
52
+ [hDDTypedef, ~, ~] = tlEnumDataType('CreateDDTypedef',...
53
+ 'SLEnumType', enumName,...
54
+ 'TypedefGroup', ['/' ApplicationName '/' BuildName '/EnumDataTypes'],...
55
+ 'CreateTemplate', 'off');
56
+ dsdd('SetUnderlyingEnumDataType', hDDTypedef, underlyingDataType);
57
+ dsdd('SetTag', hDDTypedef, [enumName '_tag']);
58
+ end
59
+
60
+ dsdd_export_a2l_file(...
61
+ 'Application', ApplicationName,...
62
+ 'Build', BuildName,...
63
+ 'TargetInfoDir', TargetInfoDir,...
64
+ 'TargetConfigDir', TargetConfigDir,...
65
+ 'StyleSheet', A2lStylesheetName,...
66
+ 'File', [CodegenFunction '.a2l'],...
67
+ 'ProjectFrame', 'off',...
68
+ 'OverwriteCalProperties', 'on',...
69
+ 'MergeA2lModules', 'on',...
70
+ 'asap2version', '1.40',...
71
+ 'UseLookupStructures', 'off',...
72
+ 'ExternalVariables', 'on',...
73
+ 'UseUnderlyingEnumDataTypeInfo', 'on');
74
+
75
+ % Delete created enums, these can cause problems for upcoming code generation calls on models
76
+ % using the same enumerations.
77
+ dsdd('Delete', enumDataTypesObj);
78
+ fprintf('\n\nGeneration of %s finished\n\n', [CodegenFunction '.a2l']);
79
+ end
80
+
81
+ function usedEnumerations = GetUsedEnumerations(modelName)
82
+ %GETUSEDENUMERATIONS Get all enumeration names used in a given model.
83
+ unsupportedByTLAPI = {'TL_DummyTrigger', 'TL_Enable', 'TL_Function', 'TL_SimFrame'};
84
+ tlBlocksTmp = find_system(modelName, 'FindAll', 'on', 'LookUnderMasks', 'All', 'RegExp', 'on', 'MaskType', 'TL_*');
85
+ supportedTlBlocksTmp = tlBlocksTmp(ismember(get_param(tlBlocksTmp, 'MaskType'), unsupportedByTLAPI)==0);
86
+ % Get enumerations from TL_BusInport blocks
87
+ busEnumerations = {};
88
+ busInportBlocks = supportedTlBlocksTmp(strcmp(get_param(supportedTlBlocksTmp, 'MaskType'), 'TL_BusInport'));
89
+ for idx = 1:length(busInportBlocks)
90
+ for idy = 1:tl_get(busInportBlocks(idx), 'numoutputs')
91
+ dataType = tl_get(busInportBlocks(idx), ['output(' num2str(idy) ').type']);
92
+ unitTmp = tl_get(busInportBlocks(idx), ['output(' num2str(idy) ').unit']);
93
+ if isempty(unitTmp)
94
+ continue
95
+ end
96
+ unit = erase(unitTmp, ['-', ',', '$']);
97
+ if strcmp(dataType, 'IMPLICIT_ENUM') && ~isempty(unit) && ~ismember(unit, busEnumerations)
98
+ busEnumerations{end+1} = unit;
99
+ end
100
+ end
101
+ end
102
+ % Get enumerations from standard TL blocks
103
+ supportedTlBlocks = supportedTlBlocksTmp(~strcmp(get_param(supportedTlBlocksTmp, 'MaskType'), 'TL_BusInport'));
104
+ [allDataTypes, invalidIndices, ~] = tl_get(supportedTlBlocks, 'output.type');
105
+ validTlBlocks = supportedTlBlocks(~invalidIndices);
106
+ validDataTypes = allDataTypes(~invalidIndices);
107
+ enumBlocks = validTlBlocks(strcmp(validDataTypes, 'IMPLICIT_ENUM'));
108
+ unitsTmp = tl_get(enumBlocks, 'output.unit');
109
+ if ~iscell(unitsTmp)
110
+ unitsTmp = {unitsTmp};
111
+ end
112
+ if ~isempty(unitsTmp)
113
+ units = unitsTmp(cellfun(@(x) ~isempty(x), unitsTmp));
114
+ enumerations = unique(erase(units, ['-', ',', '$']));
115
+ else
116
+ enumerations = {};
117
+ end
118
+ usedEnumerations = unique([busEnumerations enumerations]);
119
+ end
120
+
121
+ function underlyingDataType = CalculateUnderlyingDataType(enumName, enumMemberNames)
122
+ %CALCULATEUNDERLYINGDATATYPE Calculate best fitting data type given a name of an enumeration.
123
+ % This is done by find min and max values, than choosing a fitting data type, as small as possible.
124
+ % int32 is super class of Simulink.IntEnumType
125
+ enumMemberValues = int32(enumMemberNames);
126
+ minValue = min(enumMemberValues);
127
+ maxValue = max(enumMemberValues);
128
+
129
+ % TODO Consider forcing signed like CS (or ARXML, from database?) does, seems to be int8 specifically
130
+ underlyingDataType = '';
131
+ if minValue >= 0
132
+ if maxValue <= 255
133
+ underlyingDataType = 'UInt8';
134
+ elseif maxValue <= 65535
135
+ underlyingDataType = 'UInt16';
136
+ end
137
+ elseif minValue >= -128
138
+ if maxValue <= 127
139
+ underlyingDataType = 'Int8';
140
+ elseif maxValue <= 32767
141
+ underlyingDataType = 'Int16';
142
+ end
143
+ elseif minValue >= -32768
144
+ if maxValue <= 32767
145
+ underlyingDataType = 'Int16';
146
+ end
147
+ end
148
+
149
+ if isempty(underlyingDataType)
150
+ error(...
151
+ 'Unhandled enum size, name: %s, min: %s, max: %s. Valid types are uint8/16 and int8/16',...
152
+ enumName, minValue, maxValue);
153
+ end
154
+ end