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,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
|