X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=wizard%2Fbertos_utils.py;h=479f88eea08cd3727f86cb3afcb29038cdb491ec;hb=90500b8c052f1ae5ac3870c509cd1f37786f7e3d;hp=89998949b1952aa7adfaeeccc63dd573a174f8e3;hpb=b1ba8881d40708e05b49ae5e42661a53c149c26c;p=bertos.git diff --git a/wizard/bertos_utils.py b/wizard/bertos_utils.py index 89998949..479f88ee 100644 --- a/wizard/bertos_utils.py +++ b/wizard/bertos_utils.py @@ -41,7 +41,7 @@ def findToolchains(pathList): for toolchain in glob.glob(element+ "/" + const.GCC_NAME): if not os.path.islink(toolchain): toolchains.append(toolchain) - return toolchains + return list(set(toolchains)) def getToolchainInfo(output): info = {} @@ -91,4 +91,108 @@ def getInfos(definition): include(definition[0], D) D["CPU_NAME"] = definition[0].split(".")[0] D["DEFINITION_PATH"] = definition[1] + "/" + definition[0] - return D \ No newline at end of file + del D["include"] + return D + +def getDefinitionBlocks(text): + """ + Take a text and return a list of tuple (description, name-value). + """ + block = [] + block_tmp = re.findall(r"/\*{2}\s*([^*]*\*(?:[^/*][^*]*\*+)*)/\s*#define\s+((?:[^/]*?/?)+)\s*?(?:/{2,3}[^<].*?)?$", text, re.MULTILINE) + for comment, define in block_tmp: + block.append((" ".join(re.findall(r"^\s*\*?\s*(.*?)\s*?(?:/{2}.*?)?$", comment, re.MULTILINE)).strip(), define)) + block += re.findall(r"/{3}\s*([^<].*?)\s*#define\s+((?:[^/]*?/?)+)\s*?(?:/{2,3}[^<].*?)?$", text, re.MULTILINE) + block += [(comment, define) for define, comment in re.findall(r"#define\s*(.*?)\s*/{3}<\s*(.+?)\s*?(?:/{2,3}[^<].*?)?$", text, re.MULTILINE)] + return block + +def formatParamNameValue(text): + """ + Take the given string and return a tuple with the name of the parameter in the first position + and the value in the second. + """ + block = re.findall("\s*([^\s]+)\s*(.+?)\s*$", text, re.MULTILINE) + return block[0] + +def getDescriptionInformations(text): + """ + Take the doxygen comment and strip the wizard informations, returning the tuple + (comment, wizard_informations) + """ + index = text.find("$WIZARD") + if index != -1: + exec(text[index + 1:]) + informations = WIZARD + return text[:index].strip(), informations + else: + return text.strip(), {} + +def loadConfigurationInfos(path): + """ + Return the module configurations found in the given file as a dict with the + parameter name as key and a dict containig the fields above as value: + "value": the value of the parameter + "description": the description of the parameter + "informations": a dict containig optional informations: + "type": "int" | "boolean" | "enum" + "min": the minimum value for integer parameters + "max": the maximum value for integer parameters + "long": boolean indicating if the num is a long + "value_list": the name of the enum for enum parameters + """ + configurationInfos = {} + for comment, define in getDefinitionBlocks(open(path, "r").read()): + name, value = formatParamNameValue(define) + description, informations = getDescriptionInformations(comment) + configurationInfos[name] = {} + configurationInfos[name]["value"] = value + configurationInfos[name]["informations"] = informations + configurationInfos[name]["description"] = description + return configurationInfos + +def loadModuleInfos(path): + """ + Return the module infos found in the given file as a dict with the module + name as key and a dict containig the fields above as value or an empty dict + if the given file is not a BeRTOS module: + "depends": a list of modules needed by this module + "configuration": the cfg_*.h with the module configurations + """ + moduleInfos = {} + string = open(path, "r").read() + commentList = re.findall(r"/\*{2}\s*([^*]*\*(?:[^/*][^*]*\*+)*)/", string) + commentList = [" ".join(re.findall(r"^\s*\*?\s*(.*?)\s*?(?:/{2}.*?)?$", comment, re.MULTILINE)).strip() for comment in commentList] + for comment in commentList: + index = comment.find("$WIZARD_MODULE") + if index != -1: + exec(comment[index + 1:]) + moduleInfos[WIZARD_MODULE["name"]] = {"depends": WIZARD_MODULE["depends"], "configuration": WIZARD_MODULE["configuration"]} + return moduleInfos + return {} + +def loadModuleInfosDict(path): + moduleInfosDict = {} + for filename, path in findDefinitions("*.h", path): + moduleInfosDict.update(loadModuleInfos(path + "/" + filename)) + return moduleInfosDict + +def loadDefineLists(path): + """ + Return a dict with the name of the list as key and a list of string as value + """ + string = open(path, "r").read() + commentList = re.findall(r"/\*{2}\s*([^*]*\*(?:[^/*][^*]*\*+)*)/", string) + commentList = [" ".join(re.findall(r"^\s*\*?\s*(.*?)\s*?(?:/{2}.*?)?$", comment, re.MULTILINE)).strip() for comment in commentList] + listDict = {} + for comment in commentList: + index = comment.find("$WIZARD_LIST") + if index != -1: + exec(comment[index + 1:]) + listDict.update(WIZARD_LIST) + return listDict + +def loadDefineListsDict(path): + defineListsDict = {} + for filename, path in findDefinitions("*.h", path): + defineListsDict.update(loadDefineLists(path + "/" + filename)) + return defineListsDict \ No newline at end of file