tools/android-app/cloud/gen-aaos-vhal-info.py (98 lines of code) (raw):
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
import json
import re
# Before running this script to generate the output files, firstly create a file called
# aaos-vhal-types.h with the content from:
# https://cs.android.com/android/platform/superproject/main/+/main:prebuilts/vndk/v30/x86/include/generated-headers/hardware/interfaces/automotive/vehicle/2.0/android.hardware.automotive.vehicle@2.0_genc++_headers/gen/android/hardware/automotive/vehicle/2.0/types.h
with open("aaos-vhal-types.h") as fp:
text = fp.read()
result_sizes = {
"INFO_FUEL_TYPE": 4,
"INFO_EV_CONNECTOR_TYPE": 4,
"INFO_EXTERIOR_DIMENSIONS": 8,
"INFO_MULTI_EV_PORT_LOCATIONS": 2,
"WHEEL_TICK": 5,
"HVAC_FAN_DIRECTION_AVAILABLE": 4,
"AP_POWER_STATE_REQ": 2,
"AP_POWER_STATE_REPORT": 2,
"CLUSTER_DISPLAY_STATE": 9,
}
area_sizes = {
"SEAT": 9,
"WHEEL": 4,
"WINDOW": 10,
"DOOR": 8,
"MIRROR": 3,
}
ignore = [
"HW_ROTARY_INPUT",
"HW_KEY_INPUT",
"HW_CUSTOM_INPUT",
"SUPPORT_CUSTOMIZE_VENDOR_PERMISSION",
"EVS_SERVICE_REQUEST",
"CLUSTER_SWITCH_UI",
"CLUSTER_REQUEST_DISPLAY",
]
decoders = []
nodes = [
{"branch": {"fullyQualifiedName": "Vehicle.VHAL", "description": "Android Automotive OS VHAL"}}
]
fqns = ""
matches = re.findall(
r" ([A-Z0-9_]+) = ([0-9]+) \/\*.+VehiclePropertyType:"
r"([A-Z0-9_]+).+VehicleArea:([A-Z]+).+\*\/",
text,
)
for match in matches:
prop_name = match[0]
prop_id = int(match[1])
prop_type = match[2]
prop_area = match[3]
if prop_name == "INFO_DRIVER_SEAT": # Special case for INFO_DRIVER_SEAT
prop_area = "GLOBAL"
if (
prop_type not in ["BOOLEAN", "INT32", "FLOAT", "INT32_VEC", "INT64_VEC"]
or prop_name in ignore
):
print(f"Ignoring {prop_name}: {prop_id}, {prop_type}")
continue
if "VEC" in prop_type and prop_name not in result_sizes:
print(f"Error: no size defined for {prop_name}")
exit(-1)
for area_index in [-1] if prop_area not in area_sizes else range(area_sizes[prop_area]):
for result_index in (
[-1] if prop_name not in result_sizes else range(result_sizes[prop_name])
):
full_name = (
prop_name
+ ("" if area_index == -1 else f"_{area_index}")
+ ("" if result_index == -1 else f"_{result_index}")
)
fqn = "Vehicle.VHAL." + full_name
fqns += fqn + "\n"
custom_decoder = (
f"{prop_id}"
f":{0 if area_index == -1 else area_index}"
f":{0 if result_index == -1 else result_index}"
)
decoders.append(
{
"fullyQualifiedName": fqn,
"type": "CUSTOM_DECODING_SIGNAL",
"interfaceId": "AAOS-VHAL",
"customDecodingSignal": {
"id": custom_decoder,
},
}
)
nodes.append(
{
"sensor": {
"dataType": "INT64" if "INT64" in prop_type else "DOUBLE",
"fullyQualifiedName": fqn,
"description": full_name,
}
}
)
with open("custom-decoders-aaos-vhal.json", "w") as fp:
json.dump(decoders, fp, indent=2)
with open("custom-nodes-aaos-vhal.json", "w") as fp:
json.dump(nodes, fp, indent=2)
with open("aaos-vhal-fqns.txt", "w") as fp:
fp.write(fqns)