Take the default frequency if the value isn't modified by the user
[bertos.git] / wizard / bertos_utils.py
index af65478aae3e377df7231c0a508466c5ed317a61..a9578d13c228e2f3a76bec8221f0ce9cbc7e5a13 100644 (file)
@@ -4,7 +4,7 @@
 # Copyright 2008 Develer S.r.l. (http://www.develer.com/)
 # All rights reserved.
 #
-# $Id:$
+# $Id$
 #
 # Author: Lorenzo Berni <duplo@develer.com>
 #
@@ -14,6 +14,8 @@ import fnmatch
 import glob
 import re
 import shutil
+# Use custom copytree function
+import copytree
 import pickle
 
 import const
@@ -37,7 +39,7 @@ def createBertosProject(project_info):
     # Destination source dir
     srcdir = directory + "/bertos"
     shutil.rmtree(srcdir, True)
-    shutil.copytree(sources_dir + "/bertos", srcdir)
+    copytree.copytree(sources_dir + "/bertos", srcdir, ignore_list=const.IGNORE_LIST)
     # Destination makefile
     makefile = directory + "/Makefile"
     if os.path.exists(makefile):
@@ -49,17 +51,34 @@ def createBertosProject(project_info):
     prjdir = directory + "/" + os.path.basename(directory)
     shutil.rmtree(prjdir, True)
     os.mkdir(prjdir)
+    # Destination hw files
+    hwdir = prjdir + "/hw"
+    shutil.rmtree(hwdir, True)
+    os.mkdir(hwdir)
+    # Copy all the hw files
+    for module, information in project_info.info("MODULES").items():
+        for hwfile in information["hw"]:
+            string = open(sources_dir + "/" + hwfile, "r").read()
+            open(hwdir + "/" + os.path.basename(hwfile), "w").write(string)
     # Destination configurations files
     cfgdir = prjdir + "/cfg"
     shutil.rmtree(cfgdir, True)
     os.mkdir(cfgdir)
+    # Set to 1 the autoenabled for enabled modules
+    for module, information in project_info.info("MODULES").items():
+        if information["enabled"] and "configuration" in information and information["configuration"] != "":
+            configurations = project_info.info("CONFIGURATIONS")
+            configuration = configurations[information["configuration"]]
+            for start, parameter in configuration["paramlist"]:
+                if "type" in configuration[parameter] and configuration[parameter]["type"] == "autoenabled":
+                    configuration[parameter]["value"] = "1"
+            project_info.setInfo("CONFIGURATIONS", configurations)
+    # Copy all the configuration files
     for configuration, information in project_info.info("CONFIGURATIONS").items():
         string = open(sources_dir + "/" + configuration, "r").read()
         for start, parameter in information["paramlist"]:
             infos = information[parameter]
             value = infos["value"]
-            if "type" in infos["informations"] and infos["informations"]["type"] == "autoenabled":
-                value = "1"
             if "unsigned" in infos["informations"].keys() and infos["informations"]["unsigned"]:
                 value += "U"
             if "long" in infos["informations"].keys() and infos["informations"]["long"]:
@@ -85,13 +104,19 @@ def mkGenerator(project_info, makefile):
     """
     mk_data = {}
     mk_data["$pname"] = os.path.basename(project_info.info("PROJECT_PATH"))
+    mk_data["$cpuflag"] = project_info.info("CPU_INFOS")["CPU_FLAG_NAME"]
     mk_data["$cpuname"] = project_info.info("CPU_INFOS")["CORE_CPU"]
+    mk_data["$cpuclockfreq"] = project_info.info("SELECTED_FREQ")
     mk_data["$cflags"] = " ".join(project_info.info("CPU_INFOS")["C_FLAGS"])
     mk_data["$ldflags"] = " ".join(project_info.info("CPU_INFOS")["LD_FLAGS"])
-    mk_data["$csrc"], mk_data["$pcsrc"], mk_data["$asrc"], mk_data["$constants"] = csrcGenerator(project_info)
+    mk_data["$cppflags"] = " ".join(project_info.info("CPU_INFOS")["CPP_FLAGS"])
+    mk_data["$cppaflags"] = " ".join(project_info.info("CPU_INFOS")["CPPA_FLAGS"])
+    mk_data["$cxxflags"] = " ".join(project_info.info("CPU_INFOS")["CXX_FLAGS"])
+    mk_data["$asflags"] = " ".join(project_info.info("CPU_INFOS")["AS_FLAGS"])
+    mk_data["$arflags"] = " ".join(project_info.info("CPU_INFOS")["AR_FLAGS"])
+    mk_data["$csrc"], mk_data["$pcsrc"], mk_data["$cppasrc"], mk_data["$cxxsrc"], mk_data["$asrc"], mk_data["$constants"] = csrcGenerator(project_info)
     mk_data["$prefix"] = project_info.info("TOOLCHAIN")["path"].split("gcc")[0]
     mk_data["$suffix"] = project_info.info("TOOLCHAIN")["path"].split("gcc")[1]
-    mk_data["$cross"] = project_info.info("TOOLCHAIN")["path"].split("gcc")[0]
     mk_data["$main"] = os.path.basename(project_info.info("PROJECT_PATH")) + "/main.c"
     for key in mk_data:
         while makefile.find(key) != -1:
@@ -119,6 +144,10 @@ def csrcGenerator(project_info):
     # file to be included in PCSRC variable
     pcsrc = []
     # files to be included in CPPASRC variable
+    cppasrc = []
+    # files to be included in CXXSRC variable
+    cxxsrc = []
+    # files to be included in ASRC variable
     asrc = []
     # constants to be included at the beginning of the makefile
     constants = {}
@@ -127,12 +156,16 @@ def csrcGenerator(project_info):
         dependency_files = set([])
         # assembly sources
         asm_files = set([])
+        hwdir = os.path.basename(project_info.info("PROJECT_PATH")) + "/hw" 
         if information["enabled"]:
             if "constants" in information:
                 constants.update(information["constants"])
             cfiles, sfiles = findModuleFiles(module, project_info)
             module_files |= set(cfiles)
             asm_files |= set(sfiles)
+            for file in information["hw"]:
+                if file.endswith(".c"):
+                    module_files |= set([hwdir + "/" + os.path.basename(file)])
             for file_dependency in information["depends"]:
                 if file_dependency in files:
                     dependencyCFiles, dependencySFiles = findModuleFiles(file_dependency, project_info)
@@ -145,13 +178,25 @@ def csrcGenerator(project_info):
                     pcsrc.append(file)
             for file in dependency_files:
                 csrc.append(file)
+            for file in project_info.info("CPU_INFOS")["C_SRC"]:
+                csrc.append(file)
+            for file in project_info.info("CPU_INFOS")["PC_SRC"]:
+                pcsrc.append(file)
             for file in asm_files:
-                asrc.append(file)
+                cppasrc.append(file)
+    for file in project_info.info("CPU_INFOS")["CPPA_SRC"]:
+        cppasrc.append(file)
+    for file in project_info.info("CPU_INFOS")["CXX_SRC"]:
+        cxxsrc.append(file)
+    for file in project_info.info("CPU_INFOS")["ASRC"]:
+        asrc.append(file)
     csrc = " \\\n\t".join(csrc) + " \\"
     pcsrc = " \\\n\t".join(pcsrc) + " \\"
+    cppasrc = " \\\n\t".join(cppasrc) + " \\"
+    cxxsrc = " \\\n\t".join(cxxsrc) + " \\"
     asrc = " \\\n\t".join(asrc) + " \\"
     constants = "\n".join([os.path.basename(project_info.info("PROJECT_PATH")) + "_" + key + " = " + str(value) for key, value in constants.items()])
-    return csrc, pcsrc, asrc, constants
+    return csrc, pcsrc, cppasrc, cxxsrc, asrc, constants
 
 def findModuleFiles(module, project_info):
     # Find the files related to the selected module
@@ -311,6 +356,14 @@ def loadModuleDefinition(first_comment):
             if harvard == "both" or harvard == "pgm_memory":
                 module_dict[module_name]["harvard"] = harvard
             del module_definition[const.MODULE_DEFINITION["module_harvard"]]
+        if const.MODULE_DEFINITION["module_hw"] in module_definition.keys():
+            hw = module_definition[const.MODULE_DEFINITION["module_hw"]]
+            del module_definition[const.MODULE_DEFINITION["module_hw"]]
+            if type(hw) == str:
+                hw = (hw, )
+            module_dict[module_name]["hw"] = hw
+        else:
+            module_dict[module_name]["hw"] = ()
         module_dict[module_name]["constants"] = module_definition
         module_dict[module_name]["enabled"] = False
     return to_be_parsed, module_dict