#!/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/vehicle_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+(\S+)' RE_ENUM_PATTERN = r'enum\s+(\S+)\s+\{\S*(.*?)\}' RE_ENUM_ENTRY_PATTERN = r'(\S+)\s*=\s*(.*?)[,\n]' 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 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; } } """ 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 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(2) value = match.group(3) 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] == "@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 print JAVA_HEADER printProperties(props) printEnums(enums) print JAVA_TRAIL if __name__ == '__main__': main(sys.argv)