Enable enums in interface for zone controller
* Option to map TL generated enums to rte counterparts using 'mapEnumsToRteCounterpart' in project config. This allows using enums directly in the interface. * Added option to 'includeAllEnums' in project config. This adds all enums found in enumDefDir to header files, allowing projects to add their use in interfaces before they are added to model code. Change-Id: I0cac83e3be3514cbc15e02de6d5f7ca519c3cea6
This commit is contained in:
parent
cee323b493
commit
e95b0f0394
docs
powertrain_build
tests
powertrain_build
zone_controller
@ -38,6 +38,7 @@ Example BaseConfig.json:
|
||||
"prjUnitSrcDir": "../../Models/*/Vc*/pybuild_src",
|
||||
"prjUnitCfgDir": "../../Models/*/Vc*/pybuild_cfg",
|
||||
"prjUnitMdlDir": "../../Models/*/Vc*",
|
||||
"enumDefDir": "../../Models/Common/VcEnumDefinitions",
|
||||
"prjLocalDefs": "*_LocalDefs.h",
|
||||
"prjCodeswitches": "SPM_Codeswitch_Setup*.csv",
|
||||
"coreDummyFileName" : "VcCoreDummy",
|
||||
@ -123,7 +124,9 @@ This key is used to set individual options to match the old ECU types, see examp
|
||||
"generateRteCheckpointIds": false,
|
||||
"generateYamlInterfaceFile": false,
|
||||
"propagateTagName": true,
|
||||
"useA2lSymbolLinks": true
|
||||
"useA2lSymbolLinks": true,
|
||||
"mapToRteEnums": false,
|
||||
"includeAllEnums": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -188,6 +191,16 @@ Default is False.
|
||||
Use "SYMBOL_LINK" in the generated A2L file.
|
||||
Default is False.
|
||||
|
||||
#### mapToRteEnums
|
||||
|
||||
Map TL generated enum values in source code (all caps) to RTE style enums (camel case enum members defined as ints) when
|
||||
those are defined, instead of defining the enum class from its TL-counterpart. This overwrites how the enum members are
|
||||
mapped to integers as defined in the project.
|
||||
|
||||
#### includeAllEnums
|
||||
|
||||
Include all enums found in the location pointed at by enumDefDir, even if the enums are not in use in the project.
|
||||
|
||||
## Rasters json File
|
||||
|
||||
### SampleTimes
|
||||
@ -283,6 +296,10 @@ This file is a json file containing all the relevant meta data for the function.
|
||||
E.g. input parameters, output parameters, calibration labels, local measurement variables, etc...
|
||||
The unit definition file must match the filename pattern "config_*.json".
|
||||
|
||||
#### enumDefDir
|
||||
|
||||
Path to folder containing TL enum definition.
|
||||
|
||||
#### coreDummyFileName
|
||||
|
||||
Defines the file names of the dummy Core Identifier c code, which is generated by the build environment.
|
||||
|
@ -904,7 +904,13 @@ def build(
|
||||
zc_nvm = ZCNVMDef(build_cfg, unit_cfg, project_nvm_defintions)
|
||||
axis_data = merged_a2l.get_characteristic_axis_data()
|
||||
composition_yaml = CompositionYaml(
|
||||
build_cfg, signal_if.composition_spec, unit_cfg, zc_core, zc_dids, zc_nvm, axis_data
|
||||
build_cfg,
|
||||
signal_if.composition_spec,
|
||||
unit_cfg, zc_core,
|
||||
zc_dids,
|
||||
zc_nvm,
|
||||
axis_data,
|
||||
udt.get_enumerations()
|
||||
)
|
||||
LOG.info("******************************************************")
|
||||
composition_yaml.generate_yaml()
|
||||
|
@ -74,6 +74,8 @@ class BuildProjConfig:
|
||||
'generateYamlInterfaceFile': False,
|
||||
'propagateTagName': False,
|
||||
'useA2lSymbolLinks': False,
|
||||
'mapToRteEnums': False,
|
||||
'includeAllEnums': False
|
||||
}
|
||||
|
||||
def _get_code_generation_config(self):
|
||||
|
@ -52,6 +52,7 @@ class UserDefinedTypes(ProblemLogger):
|
||||
self._build_prj_cfg = build_prj_config
|
||||
self._unit_configs = unit_configs
|
||||
self.enums_per_unit = {}
|
||||
self.common_enums = self._read_enums_from_definitions()
|
||||
self.structs_per_unit = {}
|
||||
self._parse_all_user_defined_types()
|
||||
self.common_header_files = []
|
||||
@ -369,47 +370,59 @@ class UserDefinedTypes(ProblemLogger):
|
||||
|
||||
return underlying_data_type
|
||||
|
||||
def _get_default_enum_value_tmp(self, enum_name):
|
||||
"""Get default value of given enumeration name.
|
||||
|
||||
Requires "enumDefDir" in the ProjectCfg.json file.
|
||||
def _read_enums_from_definitions(self):
|
||||
""" Reads all enums from .m files where they are defined. Requires projectInfo.enumDefDir in
|
||||
ProjectCfg.json file.
|
||||
Files defining simulink class enumerations are expected to follow a template.
|
||||
|
||||
TODO: Remove this function when there is a default enum value in every config_*.json file.
|
||||
|
||||
Args:
|
||||
enum_name (str): Name of an enumeration.
|
||||
Returns:
|
||||
default_value_str (str): Default value (string) for the given enumeration name.
|
||||
None if value could not be extracted.
|
||||
common_enums (dict): Dictionary containing all enums defined in the enum definition directory.
|
||||
|
||||
"""
|
||||
common_enums = {}
|
||||
if self._build_prj_cfg.get_enum_def_dir() is None:
|
||||
self.warning(
|
||||
'Cannot extract default enumeration value for %s. Missing "enumDefDir" in ProjectCfg.json.',
|
||||
enum_name
|
||||
'Cannot parse enumerations from .m files. Missing "enumDefDir" in project config.'
|
||||
)
|
||||
return None
|
||||
return {}
|
||||
|
||||
enum_def_file = Path(self._build_prj_cfg.get_enum_def_dir(), f'{enum_name}.m')
|
||||
if not enum_def_file.is_file():
|
||||
self.warning('Cannot extract default enumeration value. File not found: %s', str(enum_def_file))
|
||||
return None
|
||||
|
||||
with enum_def_file.open(mode='r', encoding='ISO-8859-1') as fh:
|
||||
enum_def_content = fh.read()
|
||||
get_default_value = re.search(
|
||||
r'function ([A-Za-z0-9]+) = getDefaultValue\(\)[\s\n]*'
|
||||
r'\1 = [A-Za-z0-9]+\.([A-Za-z0-9]+);[\s\n]*'
|
||||
r'end',
|
||||
enum_def_content,
|
||||
flags=re.MULTILINE
|
||||
)
|
||||
if get_default_value is None:
|
||||
self.warning('Cannot extract default enumeration values in: %s', str(enum_def_file))
|
||||
return None
|
||||
|
||||
_unused, default_value = get_default_value.groups()
|
||||
return f'{enum_name.upper()}_{default_value.upper()}'
|
||||
enum_files = Path(self._build_prj_cfg.get_enum_def_dir()).rglob('*.m')
|
||||
for enum_file in enum_files:
|
||||
with enum_file.open(mode='r', encoding='ISO-8859-1') as fh:
|
||||
enum_file_content = fh.read()
|
||||
enum_name = enum_file.stem
|
||||
members_part = re.search(
|
||||
r'\s+enumeration\n'
|
||||
r'(\s*\w+\(\d+\)\n)+'
|
||||
r'\s+end',
|
||||
enum_file_content,
|
||||
flags=re.MULTILINE
|
||||
)
|
||||
if not members_part:
|
||||
self.warning('Cannot extract enumeration members from %s', str(enum_file))
|
||||
continue
|
||||
members = re.findall(r'(\w+)\((\d+)\)', members_part.group(0))
|
||||
member_dict = {enum_name + '_' + member[0]: int(member[1]) for member in members}
|
||||
get_default_value = re.search(
|
||||
r'function ([A-Za-z0-9]+) = getDefaultValue\(\)[\s\n]*'
|
||||
r'\1 = [A-Za-z0-9]+\.([A-Za-z0-9]+);[\s\n]*'
|
||||
r'end',
|
||||
enum_file_content,
|
||||
flags=re.MULTILINE
|
||||
)
|
||||
if get_default_value is None:
|
||||
self.warning('Cannot extract default enumeration values in: %s', str(enum_file))
|
||||
return None
|
||||
default_value = get_default_value.groups()[1]
|
||||
default_member = f'{enum_name}_{default_value}'
|
||||
enum_members = [(member_name, member_value) for member_name, member_value in member_dict.items()]
|
||||
underlying_data_type = self._calculate_underlying_data_type('target_link', enum_name, enum_members)
|
||||
common_enums[enum_name] = {
|
||||
"underlying_data_type": underlying_data_type,
|
||||
"default_value": default_member,
|
||||
"members": member_dict
|
||||
}
|
||||
return common_enums
|
||||
|
||||
def get_default_enum_value(self, unit, enum_name):
|
||||
"""Get default value of given enumeration name by searching in the unit configuration.
|
||||
@ -441,12 +454,14 @@ class UserDefinedTypes(ProblemLogger):
|
||||
|
||||
self.warning(
|
||||
'Cannot extract default enumeration value for %s in %s. '
|
||||
'Either the enumeration or its default value is missing in the unit configuration file. '
|
||||
'Trying to parse simulink enumeration definition files.',
|
||||
'Either the enumeration or its default value is missing in the unit configuration file. ',
|
||||
enum_name,
|
||||
unit
|
||||
)
|
||||
return self._get_default_enum_value_tmp(enum_name)
|
||||
common_default = self.common_enums.get(enum_name, {}).get('default', None)
|
||||
if common_default is not None:
|
||||
return common_default.upper()
|
||||
return None
|
||||
|
||||
def get_enumerations(self):
|
||||
"""Get all enumeration defined in the project, together with unit usage.
|
||||
@ -464,6 +479,15 @@ class UserDefinedTypes(ProblemLogger):
|
||||
else:
|
||||
enumerations[enum_name] = deepcopy(enum_data)
|
||||
enumerations[enum_name]['units'] = [unit]
|
||||
if self._build_prj_cfg.get_code_generation_config("includeAllEnums"):
|
||||
for enum_name, enum_data in self.common_enums.items():
|
||||
if enum_name not in enumerations:
|
||||
self.warning(
|
||||
"Enumeration %s is not used in any unit. Included since 'includeAllEnums' is set in config.",
|
||||
enum_name
|
||||
)
|
||||
enumerations[enum_name] = deepcopy(enum_data)
|
||||
enumerations[enum_name]['units'] = []
|
||||
return enumerations
|
||||
|
||||
def get_interface_data_types(self):
|
||||
@ -529,18 +553,43 @@ class UserDefinedTypes(ProblemLogger):
|
||||
file_path (Path): Path to file to generate.
|
||||
"""
|
||||
enumerations = self.get_enumerations()
|
||||
rte_interface_enums = self._build_prj_cfg.get_code_generation_config("mapToRteEnums")
|
||||
if not self._build_prj_cfg.get_enum_def_dir() and rte_interface_enums:
|
||||
self.warning(
|
||||
"No enum definition directory specified. Cannot generate all enums in decinition directory."
|
||||
)
|
||||
rte_interface_enums = False
|
||||
guard = f"{file_path.stem.upper()}_H"
|
||||
with file_path.open('w') as fh:
|
||||
fh.write(self._get_header_file_header(guard))
|
||||
if rte_interface_enums:
|
||||
composition_name = self._build_prj_cfg.get_composition_config("softwareComponentName")
|
||||
fh.write(f'#include "Rte_{ composition_name }_Type.h"\n')
|
||||
fh.write('/* VCC Enumerations */\n')
|
||||
for enum_name, enum_data in enumerations.items():
|
||||
fh.write('\n')
|
||||
fh.write(f'typedef enum {enum_name}_tag {{\n')
|
||||
nr_of_enum_members = len(enum_data['members'])
|
||||
for idx, enum_member_name in enumerate(enum_data['members']):
|
||||
ending = ', ' if idx < nr_of_enum_members - 1 else ' '
|
||||
fh.write(f" {enum_member_name} = {enum_data['members'][enum_member_name]}{ending}\n")
|
||||
fh.write(f'}} {enum_name};\n')
|
||||
members = enum_data['members']
|
||||
member_strs = ', \n'.join([f" {member.upper()} = {value}" for member, value in members.items()])
|
||||
enum_definition = (
|
||||
f'\n'
|
||||
f'typedef enum {enum_name}_tag {{\n'
|
||||
f'{member_strs} \n'
|
||||
f'}} {enum_name};\n'
|
||||
)
|
||||
if rte_interface_enums:
|
||||
enum = self.common_enums[enum_name]
|
||||
enum_member_0 = [member for member, value in enum["members"].items() if value == 0][0]
|
||||
rte_translation = '\n'.join(
|
||||
f"#define {member.upper()} {member}" for member in enum["members"].keys()
|
||||
)
|
||||
enum_definition = (
|
||||
f'\n'
|
||||
f'#ifndef {enum_member_0}\n'
|
||||
f'{enum_definition}\n'
|
||||
f'#else\n'
|
||||
f'{rte_translation}\n'
|
||||
f'#endif /* {enum_member_0} */\n'
|
||||
)
|
||||
fh.write(enum_definition)
|
||||
fh.write(f'#endif /* {guard} */\n')
|
||||
|
||||
def generate_common_header_files(self):
|
||||
|
@ -15,7 +15,7 @@ from powertrain_build.zone_controller.calibration import ZoneControllerCalibrati
|
||||
class CompositionYaml(ProblemLogger):
|
||||
"""Class for handling ZoneController composition yaml generation."""
|
||||
|
||||
def __init__(self, build_cfg, composition_spec, unit_cfg, zc_core, zc_dids, zc_nvm, a2l_axis_data):
|
||||
def __init__(self, build_cfg, composition_spec, unit_cfg, zc_core, zc_dids, zc_nvm, a2l_axis_data, enums):
|
||||
"""Init.
|
||||
|
||||
Args:
|
||||
@ -26,6 +26,7 @@ class CompositionYaml(ProblemLogger):
|
||||
zc_dids (ZCDIDs): Object with zone controller diagnostic DID information.
|
||||
zc_nvm (ZCNVMDef): Object with NVM definition information.
|
||||
a2l_axis_data (dict): Dict with characteristic axis data from A2L file.
|
||||
enums (dict): Dict with enum data.
|
||||
"""
|
||||
self.tl_to_autosar_base_types = {
|
||||
"Bool": "boolean",
|
||||
@ -44,6 +45,7 @@ class CompositionYaml(ProblemLogger):
|
||||
self.zc_core = zc_core
|
||||
self.zc_dids = zc_dids
|
||||
self.zc_nvm = zc_nvm
|
||||
self.enums = enums
|
||||
self.a2l_axis_data = a2l_axis_data
|
||||
base_data_types = self.get_base_data_types() # Might not be necessary in the long run
|
||||
self.data_types = {
|
||||
@ -188,6 +190,10 @@ class CompositionYaml(ProblemLogger):
|
||||
re.compile(r"^\s*CVC_CAL[A-Z_]*\s+\w+\s+(?P<name>\w+)\[(?P<rows>[\d]+)\]\[(?P<cols>[\d]+)\]\s*=\s*"),
|
||||
self._get_matrix_init_values,
|
||||
),
|
||||
(
|
||||
re.compile(r"^\s*CVC_CAL[A-Z_]*\s+\w+\s+(?P<name>\w+)\s*=\s*(?P<enum>[a-zA-Z_$][\w_]*?)*;"),
|
||||
lambda regex_match, _: regex_match.group("enum"),
|
||||
),
|
||||
]
|
||||
|
||||
init_values = {}
|
||||
@ -592,9 +598,12 @@ class CompositionYaml(ProblemLogger):
|
||||
signal_name (string): Name of signal to process.
|
||||
info (dict): signal data.
|
||||
Returns:
|
||||
|
||||
class_info (dict): Updated dictionary with variables.
|
||||
data_types (dict): Updated dictionary with data types.
|
||||
"""
|
||||
if info["type"] in self.enums.keys():
|
||||
return class_info, data_types
|
||||
if "Bool" in info["type"]:
|
||||
upper = 1
|
||||
lower = 0
|
||||
|
@ -166,8 +166,10 @@ class TestUserDefinedTypes(unittest.TestCase):
|
||||
def setUp(self):
|
||||
"""Set-up common data structures for all tests in the test case."""
|
||||
self.build_cfg = MagicMock(spec_set=BuildProjConfig)
|
||||
self.build_cfg.get_enum_def_dir = MagicMock(return_value='.')
|
||||
self.build_cfg.get_root_dir = MagicMock(return_value='.')
|
||||
self.build_cfg.get_enum_def_dir = MagicMock(return_value='../../reference_files/enums/')
|
||||
self.build_cfg.get_code_generation_config = MagicMock(return_value=False)
|
||||
|
||||
self.unit_cfg = MagicMock(spec_set=UnitConfigs)
|
||||
self.unit_cfg.get_unit_code_generator.return_value = 'target_link'
|
||||
UserDefinedTypes.clear_log()
|
||||
@ -183,6 +185,8 @@ class TestUserDefinedTypes(unittest.TestCase):
|
||||
'VcTestModel1': str(Path(REF_DIR, 'SS1', 'test_model1'))
|
||||
}
|
||||
)
|
||||
codegen_config = {'mapToRteEnums': False, 'includeAllEnums': False}
|
||||
self.build_cfg.get_code_generation_config = MagicMock(side_effect=(lambda x: codegen_config.get(x, {})))
|
||||
udt = UserDefinedTypes(self.build_cfg, self.unit_cfg)
|
||||
expected_enums = {
|
||||
'VcTestModel': {
|
||||
@ -626,7 +630,122 @@ class TestUserDefinedTypes(unittest.TestCase):
|
||||
'} EnumTestThree;\n',
|
||||
'#endif /* VCENUMERATIONS_H */\n'
|
||||
]
|
||||
self.assertEqual("".join(result), "".join(expected))
|
||||
|
||||
def test_map_to_rte_enums(self):
|
||||
|
||||
"""Test the _generate_target_link_enum_header_file method, mapping enums to rte headers.
|
||||
|
||||
NOTE: This method is part of UserDefinedTypes.generate_common_header_files, which is not tested on its own.
|
||||
"""
|
||||
codegen_config = {'mapToRteEnums': True, 'includeAllEnums': True}
|
||||
self.build_cfg.get_code_generation_config = MagicMock(side_effect=(lambda x: codegen_config.get(x, {})))
|
||||
composition_config = {'softwareComponentName': 'SWCName'}
|
||||
self.build_cfg.get_composition_config = MagicMock(side_effect=(lambda x: composition_config.get(x, '')))
|
||||
|
||||
self.build_cfg.get_unit_src_dirs = MagicMock(
|
||||
return_value={'VcTestModel2': str(Path(REF_DIR, 'SS1', 'test_model2'))}
|
||||
)
|
||||
unit_cfg = self.unit_cfg
|
||||
type(unit_cfg).base_types_headers = '#include "basetypes.h"\n'
|
||||
udt = UserDefinedTypes(self.build_cfg, unit_cfg)
|
||||
udt.common_enums = {
|
||||
'EnumTest': {
|
||||
'underlying_data_type': 'UInt8',
|
||||
'members': {
|
||||
'EnumTest_ClimaOff': 0,
|
||||
'EnumTest_ClimaHeatgToHvacAndHvBatt': 1,
|
||||
'EnumTest_ClimaHeatgToHvBatt': 2,
|
||||
'EnumTest_ClimaHeatgToHvac': 3,
|
||||
'EnumTest_ClimaFlow': 4,
|
||||
'EnumTest_Degas': 5,
|
||||
'EnumTest_FailSafe': 6
|
||||
},
|
||||
'default_value': 'EnumTest_ClimaOff'
|
||||
},
|
||||
'EnumTestThree': {
|
||||
'underlying_data_type': 'UInt8',
|
||||
'members': {
|
||||
'ENUMTESTTHREE_DTELECCOOLG': 0,
|
||||
'ENUMTESTTHREE_DTELECPASCOOLG': 1,
|
||||
'ENUMTESTTHREE_DTELECHEATG': 2,
|
||||
'ENUMTESTTHREE_DTELECPASHEATG': 3,
|
||||
'ENUMTESTTHREE_DTELECACTVHEATG': 4,
|
||||
'ENUMTESTTHREE_DTELECPASACTVHEATG': 5,
|
||||
'ENUMTESTTHREE_DTELECPAS': 6,
|
||||
'ENUMTESTTHREE_DEGAS': 7,
|
||||
'ENUMTESTTHREE_FAILSAFE': 8,
|
||||
'ENUMTESTTHREE_EXTRAVERSUSUNITONE': 9
|
||||
},
|
||||
'default_value': None,
|
||||
'units': ['VcTestModel2']
|
||||
}
|
||||
}
|
||||
result = []
|
||||
m_open = mock_open()
|
||||
m_open.return_value.write = result.append
|
||||
with patch.object(Path, 'open', m_open, create=True):
|
||||
udt._generate_enum_header_file(Path("VcEnumerations.h"))
|
||||
|
||||
self.maxDiff = None
|
||||
expected = [
|
||||
'#ifndef VCENUMERATIONS_H\n',
|
||||
'#define VCENUMERATIONS_H\n',
|
||||
'#include "basetypes.h"\n',
|
||||
'#include "Rte_SWCName_Type.h"\n',
|
||||
'/* VCC Enumerations */\n',
|
||||
'\n',
|
||||
'#ifndef EnumTest_ClimaOff\n',
|
||||
'\n',
|
||||
'typedef enum EnumTest_tag {\n',
|
||||
" ENUMTEST_CLIMAOFF = 0, \n",
|
||||
" ENUMTEST_CLIMAHEATGTOHVACANDHVBATT = 1, \n",
|
||||
" ENUMTEST_CLIMAHEATGTOHVBATT = 2, \n",
|
||||
" ENUMTEST_CLIMAHEATGTOHVAC = 3, \n",
|
||||
" ENUMTEST_CLIMAFLOW = 4, \n",
|
||||
" ENUMTEST_DEGAS = 5, \n",
|
||||
" ENUMTEST_FAILSAFE = 6 \n",
|
||||
'} EnumTest;\n',
|
||||
'\n',
|
||||
'#else\n',
|
||||
'#define ENUMTEST_CLIMAOFF EnumTest_ClimaOff\n',
|
||||
'#define ENUMTEST_CLIMAHEATGTOHVACANDHVBATT EnumTest_ClimaHeatgToHvacAndHvBatt\n',
|
||||
'#define ENUMTEST_CLIMAHEATGTOHVBATT EnumTest_ClimaHeatgToHvBatt\n',
|
||||
'#define ENUMTEST_CLIMAHEATGTOHVAC EnumTest_ClimaHeatgToHvac\n',
|
||||
'#define ENUMTEST_CLIMAFLOW EnumTest_ClimaFlow\n',
|
||||
'#define ENUMTEST_DEGAS EnumTest_Degas\n',
|
||||
'#define ENUMTEST_FAILSAFE EnumTest_FailSafe\n',
|
||||
'#endif /* EnumTest_ClimaOff */\n',
|
||||
'\n',
|
||||
'#ifndef ENUMTESTTHREE_DTELECCOOLG\n',
|
||||
'\n',
|
||||
'typedef enum EnumTestThree_tag {\n',
|
||||
" ENUMTESTTHREE_DTELECCOOLG = 0, \n",
|
||||
" ENUMTESTTHREE_DTELECPASCOOLG = 1, \n",
|
||||
" ENUMTESTTHREE_DTELECHEATG = 2, \n",
|
||||
" ENUMTESTTHREE_DTELECPASHEATG = 3, \n",
|
||||
" ENUMTESTTHREE_DTELECACTVHEATG = 4, \n",
|
||||
" ENUMTESTTHREE_DTELECPASACTVHEATG = 5, \n",
|
||||
" ENUMTESTTHREE_DTELECPAS = 6, \n",
|
||||
" ENUMTESTTHREE_DEGAS = 7, \n",
|
||||
" ENUMTESTTHREE_FAILSAFE = 8, \n",
|
||||
" ENUMTESTTHREE_EXTRAVERSUSUNITONE = 9 \n",
|
||||
'} EnumTestThree;\n',
|
||||
'\n',
|
||||
'#else\n',
|
||||
'#define ENUMTESTTHREE_DTELECCOOLG ENUMTESTTHREE_DTELECCOOLG\n',
|
||||
'#define ENUMTESTTHREE_DTELECPASCOOLG ENUMTESTTHREE_DTELECPASCOOLG\n',
|
||||
'#define ENUMTESTTHREE_DTELECHEATG ENUMTESTTHREE_DTELECHEATG\n',
|
||||
'#define ENUMTESTTHREE_DTELECPASHEATG ENUMTESTTHREE_DTELECPASHEATG\n',
|
||||
'#define ENUMTESTTHREE_DTELECACTVHEATG ENUMTESTTHREE_DTELECACTVHEATG\n',
|
||||
'#define ENUMTESTTHREE_DTELECPASACTVHEATG ENUMTESTTHREE_DTELECPASACTVHEATG\n',
|
||||
'#define ENUMTESTTHREE_DTELECPAS ENUMTESTTHREE_DTELECPAS\n',
|
||||
'#define ENUMTESTTHREE_DEGAS ENUMTESTTHREE_DEGAS\n',
|
||||
'#define ENUMTESTTHREE_FAILSAFE ENUMTESTTHREE_FAILSAFE\n',
|
||||
'#define ENUMTESTTHREE_EXTRAVERSUSUNITONE ENUMTESTTHREE_EXTRAVERSUSUNITONE\n',
|
||||
'#endif /* ENUMTESTTHREE_DTELECCOOLG */\n',
|
||||
'#endif /* VCENUMERATIONS_H */\n'
|
||||
]
|
||||
self.assertEqual("".join(result), "".join(expected))
|
||||
|
||||
def test_generate_enum_header_file_ec(self):
|
||||
@ -727,7 +846,6 @@ class TestUserDefinedTypes(unittest.TestCase):
|
||||
'} EnumTestThree;\n',
|
||||
'#endif /* VCENUMERATIONS_H */\n'
|
||||
]
|
||||
|
||||
self.assertEqual("".join(result), "".join(expected))
|
||||
|
||||
def test_generate_struct_header_file_tl(self):
|
||||
@ -766,7 +884,6 @@ class TestUserDefinedTypes(unittest.TestCase):
|
||||
'};\n',
|
||||
'#endif /* VCSTRUCTS_H */\n'
|
||||
]
|
||||
|
||||
self.assertEqual("".join(result), "".join(expected))
|
||||
|
||||
def test_get_enumerations(self):
|
||||
@ -901,8 +1018,8 @@ class TestUserDefinedTypes(unittest.TestCase):
|
||||
|
||||
result = udt.get_default_enum_value(unit, 'SimulinkEnumTwo')
|
||||
self.assertIsNone(result)
|
||||
# interface_data_types.yml "not found" and real warnings (not in config and no m-file)
|
||||
self.assertDictEqual({'critical': 0, 'warning': 3}, udt.get_nbr_problems())
|
||||
# interface_data_types.yml "not found" and real warning (no m-file)
|
||||
self.assertDictEqual({'critical': 0, 'warning': 2}, udt.get_nbr_problems())
|
||||
|
||||
def test_convert_interface_enum_to_simulink(self):
|
||||
"""Test the convert_interface_enum_to_simulink method."""
|
||||
@ -922,3 +1039,24 @@ class TestUserDefinedTypes(unittest.TestCase):
|
||||
}
|
||||
result = udt.convert_interface_enum_to_simulink(INTERFACE_ENUM['EnumTest'])
|
||||
self.assertDictEqual(expected, result)
|
||||
|
||||
def test_read_enums_from_definitions(self):
|
||||
"""Test the read_enums_from_definitions method."""
|
||||
udt = UserDefinedTypes(self.build_cfg, self.unit_cfg)
|
||||
expected = {
|
||||
'EnumTest': {
|
||||
'underlying_data_type': 'UInt8',
|
||||
'members': {
|
||||
'EnumTest_ClimaOff': 0,
|
||||
'EnumTest_ClimaHeatgToHvacAndHvBatt': 1,
|
||||
'EnumTest_ClimaHeatgToHvBatt': 2,
|
||||
'EnumTest_ClimaHeatgToHvac': 3,
|
||||
'EnumTest_ClimaFlow': 4,
|
||||
'EnumTest_Degas': 5,
|
||||
'EnumTest_FailSafe': 6
|
||||
},
|
||||
'default_value': 'EnumTest_ClimaOff'
|
||||
}
|
||||
}
|
||||
result = udt._read_enums_from_definitions()
|
||||
self.assertDictEqual(expected, result)
|
||||
|
@ -111,7 +111,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
return_value=self.calibration_definitions
|
||||
):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
|
||||
def test_check_unsupported_fields(self):
|
||||
@ -140,7 +140,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
"""Checking that the dict is generated correctly with custom names."""
|
||||
self.build_cfg.get_composition_config.side_effect = mock_get_composition_config_custom_names
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
self.assertDictEqual(composition_yaml.expected_custom_names_result, result)
|
||||
@ -155,7 +155,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
return_value=self.calibration_definitions
|
||||
):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
self.assertDictEqual(composition_yaml.expected_cal_result, result)
|
||||
@ -169,7 +169,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
self.calibration_definitions + composition_yaml_with_a2l_axis_data.calibration_definitions
|
||||
with patch.object(CompositionYaml, "_get_all_calibration_definitions", return_value=calibration_definitions):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, a2l_axis_data
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, a2l_axis_data, {}
|
||||
)
|
||||
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
@ -191,7 +191,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
return_value=self.calibration_definitions
|
||||
):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
self.assertDictEqual(composition_yaml_with_calls_all_fields.expected_result, result)
|
||||
@ -210,7 +210,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
return_value=self.calibration_definitions
|
||||
):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
self.assertDictEqual(composition_yaml_with_calls_no_optional_fields.expected_result, result)
|
||||
@ -225,7 +225,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
return_value=self.calibration_definitions
|
||||
):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
self.assertDictEqual(composition_yaml_with_dids.expected_result, result)
|
||||
@ -240,7 +240,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
return_value=self.calibration_definitions
|
||||
):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
self.assertDictEqual(composition_yaml_with_dtcs.expected_result, result)
|
||||
@ -258,7 +258,7 @@ class TestCompositionYaml(unittest.TestCase):
|
||||
return_value=self.calibration_definitions
|
||||
):
|
||||
self.composition_yaml = CompositionYaml(
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}
|
||||
self.build_cfg, self.zc_spec, self.unit_cfg, self.zc_core, self.zc_dids, self.nvm_def, {}, {}
|
||||
)
|
||||
result = self.composition_yaml.gather_yaml_info()
|
||||
self.assertDictEqual(composition_yaml_with_nvm.expected_result, result)
|
||||
|
Loading…
x
Reference in New Issue
Block a user