olindgre 2ece01e1d7 Make powertrain-build not overlap with pybuild in site-packages
Change-Id: I7b59f3f04f0f787d35db0b9389f295bf1ad24f56
2024-09-17 10:25:04 +02:00

126 lines
3.5 KiB
Python

# Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0.
# -*- coding: utf-8 -*-
"""Python module used for calculating interfaces for CSP"""
from pathlib import Path
from os import path
from powertrain_build.interface.hal import HALA
from powertrain_build.interface.device_proxy import DPAL
from powertrain_build.interface.service import ServiceFramework
from powertrain_build.interface import simulink
from powertrain_build.lib import logger
from powertrain_build.interface import generation_utils
from powertrain_build.lib.helper_functions import deep_json_update
LOGGER = logger.create_logger("CSP adapters")
def parse_args():
"""Parse arguments
Returns:
Namespace: the parsed arguments
"""
parser = generation_utils.base_parser()
parser.add_argument(
"--dp-interface",
help="Add dp interface to adapter specification",
action="store_true"
)
parser.add_argument(
"--hal-interface",
help="Add dp interface to adapter specification",
action="store_true"
)
parser.add_argument(
"--service-interface",
help="Add sfw interface to adapter specification",
action="store_true"
)
parser.add_argument(
"output",
help="Output file with interface specifications",
type=Path
)
parser.add_argument(
"--update-config",
help="Update project config file with path to adapter specifications",
action="store_true"
)
return parser.parse_args()
def main():
""" Main function for stand alone execution.
Mostly useful for testing and generation of dummy hal specifications
"""
args = parse_args()
app = generation_utils.process_app(args.config)
adapters(args, app)
def update_project_config(args):
""" Update project config file with relative location to adapter specification file, linux styled path.
Args:
args (Namespace): Arguments from command line
"""
config_dir = Path(args.config).resolve().parents[0]
output_dir = Path(args.output).resolve().parents[0]
rel_dir = Path(path.relpath(output_dir, config_dir))
rel_path = rel_dir / Path(args.output).name
rel_path_linux = rel_path.as_posix()
deep_json_update(
args.config,
{'ProjectInfo': {'adapterSpec': rel_path_linux}}
)
def adapters(args, app):
""" Generate specification for adapter generation.
Args:
args (Namespace): Arguments from command line
app (Application): Application to generate specification for
"""
if args.dp_interface:
dp = DPAL(app)
dp_interface = generation_utils.get_interface(app, dp)
else:
dp_interface = {}
if args.hal_interface:
hala = HALA(app)
hal_interface = generation_utils.get_interface(app, hala)
else:
hal_interface = {}
if args.service_interface:
sfw = ServiceFramework(app)
sfw_interface = generation_utils.get_interface(app, sfw)
method_interface = generation_utils.get_method_interface(app)
else:
sfw_interface = {}
method_interface = {}
interface_data_types = app.pybuild['user_defined_types'].get_interface_data_types()
adapters = simulink.get_interface(
interface_data_types,
dp_interface,
hal_interface,
sfw_interface,
method_interface
)
generation_utils.write_to_file(adapters, args.output, is_yaml=True)
if args.update_config:
update_project_config(args)
if __name__ == "__main__":
main()