普通文本  |  127行  |  5.64 KB

#!/usr/bin/env python3
#
# Copyright (C) 2017 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# This script generates vhal_consts_x_y.py files for use in vhal_emulator
# They are generated from corresponding data in Vehicle HAL types.hal files
# To run, invoke at a shell by saying:
# $ packages/services/Car/tools/emulator/vhal_const_generate.py
# The script will automatically locate itself and the required HAL files and will write next
# to itself vhal_consts_x.y.py for any version of Vehicle HAL that it knows about
# Those files can then be used with vhal_emulator.py as per that script's documentation

from __future__ import print_function

import datetime

def printHeader(dest):
    year = datetime.datetime.now().year
    print("# Copyright (C) %s The Android Open Source Project" % year, file=dest)
    print("#", file=dest)
    print("# Licensed under the Apache License, Version 2.0 (the \"License\");", file=dest)
    print("# you may not use this file except in compliance with the License.", file=dest)
    print("# You may obtain a copy of the License at", file=dest)
    print("#", file=dest)
    print("#      http://www.apache.org/licenses/LICENSE-2.0", file=dest)
    print("#", file=dest)
    print("# Unless required by applicable law or agreed to in writing, software", file=dest)
    print("# distributed under the License is distributed on an \"AS IS\" BASIS,", file=dest)
    print("# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.", file=dest)
    print("# See the License for the specific language governing permissions and", file=dest)
    print("# limitations under the License.", file=dest)
    print("#", file=dest)
    print("# DO NOT EDIT MANUALLY", file=dest)
    print("# This file was autogenerated by vhal_const_generate.py", file=dest)

def printEnum(doc, name, dest, postprocess=lambda x: x):
    # Construct a value name prefix from the group name
    valueNamePrefix = name.upper() + '_'

    enum_object = doc['enums'][name]
    print("\n# %s" % name, file=dest)
    for case in enum_object.cases:
        print('%s%s = %s' % (valueNamePrefix, case.name,
            postprocess(case.value.resolve(enum_object, doc))),
            file=dest)

import os, os.path
import sys

script_directory = os.path.join(os.path.dirname(os.path.abspath(__file__)))
parent_location = os.path.abspath(os.path.join(script_directory, '..'))
sys.path.append(parent_location)

# hidl_parser depends on a custom Python package that requires installation
# give user guidance should the import fail
try:
    from hidl_parser import parser
except ImportError as e:
    isPly = False
    pipTool = "pip%s" % ("3" if sys.version_info > (3,0) else "")
    if hasattr(e, 'name'):
        if e.name == 'ply': isPly = True
    elif hasattr(e, 'message'):
        if e.message.endswith('ply'): isPly = True
    if isPly:
        print('could not import ply.')
        print('ply is available as part of an Android checkout in external/ply')
        print('or it can be installed via "sudo %s install ply"' % pipTool)
        sys.exit(1)
    else:
        raise e

android_build_top = os.environ.get("ANDROID_BUILD_TOP", None)
if android_build_top is not None:
    vhal_location = os.path.join(android_build_top, 'hardware','interfaces','automotive','vehicle')
else:
    vhal_location = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
        '..','..','..','..','..','hardware','interfaces','automotive','vehicle'
    ))
if not(os.path.exists(vhal_location) and os.path.isdir(vhal_location)):
    print("Vehicle HAL was not found at %s. lunch may provide a correct environment, or files moved" % vhal_location)
    sys.exit(1)

def generateHal20():
    vhal_20_file = os.path.join(vhal_location, '2.0', 'types.hal')
    if not(os.path.exists(vhal_20_file)):
        print("Vehicle HAL was not found at %s. lunch may provide a correct environment, or files moved" % vhal_location)
        sys.exit(1)

    print("Generating constants from Vehicle HAL 2.0 (%s)" % (vhal_20_file))
    vhal_20_doc = parser.parse(vhal_20_file)

    vhal_20_file = open(os.path.join(script_directory, 'vhal_consts_2_0.py'), 'w')

    printHeader(vhal_20_file)

    for group in vhal_20_doc['enums']:
        print(group)
        printEnum(vhal_20_doc, group, vhal_20_file, lambda x : hex(x))

    print("\n# Create a container of value_type constants to be used by vhal_emulator", file=vhal_20_file)
    print("class vhal_types_2_0:", file=vhal_20_file)
    print("    TYPE_STRING  = [VEHICLEPROPERTYTYPE_STRING]", file=vhal_20_file)
    print("    TYPE_BYTES   = [VEHICLEPROPERTYTYPE_BYTES]", file=vhal_20_file)
    print("    TYPE_INT32   = [VEHICLEPROPERTYTYPE_BOOLEAN,", file=vhal_20_file)
    print("                    VEHICLEPROPERTYTYPE_INT32]", file=vhal_20_file)
    print("    TYPE_INT64   = [VEHICLEPROPERTYTYPE_INT64]", file=vhal_20_file)
    print("    TYPE_FLOAT   = [VEHICLEPROPERTYTYPE_FLOAT]", file=vhal_20_file)
    print("    TYPE_INT32S  = [VEHICLEPROPERTYTYPE_INT32_VEC]", file=vhal_20_file)
    print("    TYPE_FLOATS  = [VEHICLEPROPERTYTYPE_FLOAT_VEC]", file=vhal_20_file)
    print("    TYPE_MIXED   = [VEHICLEPROPERTYTYPE_MIXED]", file=vhal_20_file)

generateHal20()