| #!/usr/bin/env python |
| # |
| # Copyright (C) 2015 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. |
| # |
| """Generate Java code from vehicle.h""" |
| import os |
| import re |
| import sys |
| |
| JAVA_HEADER = \ |
| """ |
| /* |
| * Copyright (C) 2015 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. |
| */ |
| |
| // Autogenerated from vehicle.h using |
| // libvehiclenetwork/tool/vehiclehal_code_gen.py. |
| // Do not modify manually. |
| |
| package com.android.car.vehiclenetwork; |
| |
| public class VehicleNetworkConsts { |
| """ |
| |
| JAVA_TRAIL = \ |
| """ |
| } |
| """ |
| |
| RE_PROPERTY_PATTERN = r'/\*\*((.(?!\/\/===))*?)\*/\n\#define\s+VEHICLE_PROPERTY_(\S+)\s+(\(0x\S+\))' |
| RE_ENUM_PATTERN = r'enum\s+(\S+)\s+\{\S*(.*?)\}' |
| RE_ENUM_ENTRY_PATTERN = r'(\S+)\s*=\s*(.*?)[,\n]' |
| RE_AUDIO_EXT_ROUTING_PATTERN = r'\n\#define\s+VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_(\S+)\s+\"(\S+)\"' |
| |
| class PropertyInfo(object): |
| def __init__(self, value, name): |
| self.value = value |
| self.name = name |
| self.type = "" |
| self.changeMode = "" |
| self.access = "" |
| self.unit = "" |
| self.startEnd = 0 # _START/END property |
| self.zoneType = "" |
| |
| def __str__(self): |
| r = ["value:" + self.value] |
| r.append("name:" + self.name) |
| if self.type != "": |
| r.append("type:" + self.type) |
| if self.changeMode != "": |
| r.append("changeMode:" + self.changeMode) |
| if self.access != "": |
| r.append("access:" + self.access) |
| if self.unit != "": |
| r.append("unit:" + self.unit) |
| return " ".join(r) |
| |
| class EnumInfo(object): |
| def __init__(self, name): |
| self.name = name |
| self.enums = [] #(name, value) tuple |
| def addEntry(self, name, value): |
| self.enums.append((name, value)) |
| def __str__(self): |
| r = [self.name + "\n"] |
| for e in self.enums: |
| r.append(" " + e[0] + ":" + e[1] + "\n") |
| return ''.join(r) |
| |
| def toJavaStyleName(name): |
| # do not convert if 1st letter is already upper |
| if name[0].isupper(): |
| return name |
| words = name.split("_") |
| #print words |
| for i in range(len(words)): |
| w = words[i] |
| w = w[0].upper() + w[1:] |
| words[i] = w |
| return ''.join(words) |
| |
| JAVA_INT_DEF = "public static final int " |
| def printProperties(props): |
| for p in props: |
| print JAVA_INT_DEF + p.name + " = " + p.value + ";" |
| |
| #now impement getVehicleValueType |
| print \ |
| """public static int getVehicleValueType(int property) { |
| switch (property) {""" |
| for p in props: |
| if p.type != "": |
| print "case " + p.name + ": return VehicleValueType." + p.type + ";" |
| print \ |
| """default: return VehicleValueType.VEHICLE_VALUE_TYPE_SHOUD_NOT_USE; |
| } |
| } |
| """ |
| #now implement getVehiclePropertyName |
| print \ |
| """public static String getVehiclePropertyName(int property) { |
| switch (property) {""" |
| for p in props: |
| if (p.startEnd == 0): |
| print "case " + p.name + ': return "' + p.name + '";' |
| print \ |
| """default: return "UNKNOWN_PROPERTY"; |
| } |
| } |
| """ |
| #now implement getVehicleChangeMode |
| print \ |
| """public static int[] getVehicleChangeMode(int property) { |
| switch (property) {""" |
| for p in props: |
| if p.changeMode != "": |
| modes = p.changeMode.split('|') |
| modesString = [] |
| for m in modes: |
| modesString.append("VehiclePropChangeMode." + m) |
| print "case " + p.name + ": return new int[] { " + " , ".join(modesString) + " };" |
| print \ |
| """default: return null; |
| } |
| } |
| """ |
| #now implement getVehicleAccess |
| print \ |
| """public static int[] getVehicleAccess(int property) { |
| switch (property) {""" |
| for p in props: |
| if p.access != "": |
| accesses = p.access.split('|') |
| accessesString = [] |
| for a in accesses: |
| accessesString.append("VehiclePropAccess." + a) |
| print "case " + p.name + ": return new int[] { " + " , ".join(accessesString) + " };" |
| print \ |
| """default: return null; |
| } |
| } |
| """ |
| #now implement getVehicleZoneType |
| print \ |
| """public static int getVehicleZoneType(int property) { |
| switch (property) {""" |
| for p in props: |
| if p.zoneType != "": |
| print "case " + p.name + ": return VehicleZoneType." + p.zoneType + " ;" |
| print \ |
| """default: return VehicleZoneType.VEHICLE_ZONE_TYPE_NONE; |
| } |
| } |
| """ |
| |
| def printEnum(e): |
| print "public static class " + toJavaStyleName(e.name) + " {" |
| for entry in e.enums: |
| print JAVA_INT_DEF + entry[0] + " = " + entry[1] + ";" |
| #now implement enumToString |
| print \ |
| """public static String enumToString(int v) { |
| switch(v) {""" |
| valueStore = [] |
| for entry in e.enums: |
| # handling enum with the same value. Print only 1st one. |
| if valueStore.count(entry[1]) == 0: |
| valueStore.append(entry[1]) |
| print "case " + entry[0] + ': return "' + entry[0] + '";' |
| print \ |
| """default: return "UNKNOWN"; |
| } |
| } |
| } |
| """ |
| |
| def printEnums(enums): |
| for e in enums: |
| printEnum(e) |
| |
| def printExtAudioRoutingSources(audio_ext_routing): |
| for r in audio_ext_routing: |
| print "public static final String VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_SOURCE_" + r + ' = "' + r + '";' |
| |
| def main(argv): |
| vehicle_h_path = os.path.dirname(os.path.abspath(__file__)) + "/../../../../../hardware/libhardware/include/hardware/vehicle.h" |
| #print vehicle_h_path |
| f = open(vehicle_h_path, 'r') |
| text = f.read() |
| f.close() |
| vehicle_internal_h_path = os.path.dirname(os.path.abspath(__file__)) + "/../include/vehicle-internal.h" |
| f = open(vehicle_internal_h_path, 'r') |
| text = text + f.read() |
| f.close() |
| |
| props = [] |
| property_re = re.compile(RE_PROPERTY_PATTERN, re.MULTILINE | re.DOTALL) |
| for match in property_re.finditer(text): |
| words = match.group(1).split() |
| name = "VEHICLE_PROPERTY_" + match.group(3) |
| value = match.group(4) |
| if (value[0] == "(" and value[-1] == ")"): |
| value = value[1:-1] |
| prop = PropertyInfo(value, name) |
| i = 0 |
| while i < len(words): |
| if words[i] == "@value_type": |
| i += 1 |
| prop.type = words[i] |
| elif words[i] == "@change_mode": |
| i += 1 |
| prop.changeMode = words[i] |
| elif words[i] == "@access": |
| i += 1 |
| prop.access = words[i] |
| elif words[i] == "@unit": |
| i += 1 |
| prop.unit = words[i] |
| elif words[i] == "@zone_type": |
| i += 1 |
| prop.zoneType = words[i] |
| elif words[i] == "@range_start" or words[i] == "@range_end": |
| prop.startEnd = 1 |
| i += 1 |
| props.append(prop) |
| #for p in props: |
| # print p |
| |
| enums = [] |
| enum_re = re.compile(RE_ENUM_PATTERN, re.MULTILINE | re.DOTALL) |
| enum_entry_re = re.compile(RE_ENUM_ENTRY_PATTERN, re.MULTILINE) |
| for match in enum_re.finditer(text): |
| name = match.group(1) |
| info = EnumInfo(name) |
| for match_entry in enum_entry_re.finditer(match.group(2)): |
| valueName = match_entry.group(1) |
| value = match_entry.group(2) |
| #print valueName, value |
| if value[-1] == ',': |
| value = value[:-1] |
| info.addEntry(valueName, value) |
| enums.append(info) |
| #for e in enums: |
| # print e |
| |
| audio_ext_routing = [] |
| audio_ext_routing_re = re.compile(RE_AUDIO_EXT_ROUTING_PATTERN, re.MULTILINE | re.DOTALL) |
| for match in audio_ext_routing_re.finditer(text): |
| #print match |
| name = match.group(1) |
| value = match.group(2) |
| if name != value: |
| print "Warning, AUDIO_EXT_ROUTING_SOURCE_" + name + " does not match " + value |
| else: |
| audio_ext_routing.append(name) |
| |
| print JAVA_HEADER |
| printProperties(props) |
| print "\n\n" |
| printExtAudioRoutingSources(audio_ext_routing) |
| print "\n\n" |
| printEnums(enums) |
| print JAVA_TRAIL |
| |
| if __name__ == '__main__': |
| main(sys.argv) |