Add preset load functionality.
[bertos.git] / wizard / BProject.py
index 2eb1bdcfb32fd714d3f393937f97629199649fb9..81f2de6cd71fb60c5d93c0630ee6699d660c4ab7 100644 (file)
@@ -40,12 +40,16 @@ import pickle
 
 import DefineException
 
+from LoadException import VersionException, ToolchainException
+
+import const
+
 from bertos_utils import (
                             # Utility functions
-                            isBertosDir, loadCpuInfos, getTagSet, setEnabledModules,
+                            isBertosDir, getTagSet, setEnabledModules, getInfos,
                             loadConfigurationInfos, loadDefineLists, loadModuleDefinition,
                             getCommentList, updateConfigurationValues,
-                            
+
                             # Custom exceptions
                             ParseError, SupportedException
                         )
@@ -54,7 +58,7 @@ class BProject(object):
     """
     Simple class for store and retrieve project informations.
     """
-    
+
     def __init__(self, project_file="", info_dict={}):
         self.infos = {}
         self._cached_queries = {}
@@ -84,7 +88,7 @@ class BProject(object):
         self.loadSourceTree()
         cpu_name = project_data["CPU_NAME"]
         self.infos["CPU_NAME"] = cpu_name
-        cpu_info = loadCpuInfos(self)
+        cpu_info = self.loadCpuInfos()
         for cpu in cpu_info:
             if cpu["CPU_NAME"] == cpu_name:
                 self.infos["CPU_INFOS"] = cpu
@@ -112,6 +116,36 @@ class BProject(object):
         self.loadModuleData(True)
         setEnabledModules(self, project_data["ENABLED_MODULES"])
 
+    def loadProjectPresets(self):
+        """
+        Load the default presets (into the const.PREDEFINED_BOARDS_DIR).
+        """
+        # NOTE: this method does nothing (for now).
+        preset_path = os.path.join(self.infos["SOURCES_PATH"], const.PREDEFINED_BOARDS_DIR)
+        preset_tree = {}
+        if os.path.exists(preset_path):
+            preset_tree = self._loadProjectPresetTree(preset_path)
+        self.infos["PRESET_TREE"] = preset_tree
+
+    def _loadProjectPresetTree(self, path):
+        _tree = {}
+        _tree['info'] = self._loadPresetInfo(os.path.join(path, const.PREDEFINED_BOARD_SPEC_FILE))
+        _tree['info']['filename'] = os.path.basename(path)
+        _tree['children'] = []
+        entries = set(os.listdir(path))
+        for entry in entries:
+            _path = os.path.join(path, entry)
+            if os.path.isdir(_path):
+                sub_entries = set(os.listdir(_path))
+                if const.PREDEFINED_BOARD_SPEC_FILE in sub_entries:
+                    _tree['children'].append(self._loadProjectPresetTree(_path))
+        return _tree
+
+    def _loadPresetInfo(self, preset_spec_file):
+        D = {}
+        execfile(preset_spec_file, {}, D)
+        return D
+
     def loadModuleData(self, edit=False):
         module_info_dict = {}
         list_info_dict = {}
@@ -153,9 +187,6 @@ class BProject(object):
                         list_info_dict.update(list_dict)
                     except ParseError, err:
                         raise DefineException.EnumDefineException(path, err.line_number, err.line)
-        for filename, path in self.findDefinitions("*_" + self.infos["CPU_INFOS"]["TOOLCHAIN"] + ".h"):
-            comment_list = getCommentList(open(path + "/" + filename, "r").read())
-            list_info_dict.update(loadDefineLists(comment_list))
         for tag in self.infos["CPU_INFOS"]["CPU_TAGS"]:
             for filename, path in self.findDefinitions("*_" + tag + ".h"):
                 comment_list = getCommentList(open(path + "/" + filename, "r").read())
@@ -165,13 +196,23 @@ class BProject(object):
         self.infos["CONFIGURATIONS"] = configuration_info_dict
         self.infos["FILES"] = file_dict
 
+    def loadCpuInfos(self):
+        cpuInfos = []
+        for definition in self.findDefinitions(const.CPU_DEFINITION):
+            cpuInfos.append(getInfos(definition))
+        return cpuInfos
+
+    def reloadCpuInfo(self):
+        for cpu_info in self.loadCpuInfos():
+            if cpu_info["CPU_NAME"] == self.infos["CPU_NAME"]:
+                self.infos["CPU_INFOS"] = cpu_info
 
     def setInfo(self, key, value):
         """
         Store the given value with the name key.
         """
         self.infos[key] = value
-    
+
     def info(self, key, default=None):
         """
         Retrieve the value associated with the name key.
@@ -195,7 +236,9 @@ class BProject(object):
         return [(filename, dirname) for dirname in file_dict.get(filename, [])]
 
     def findDefinitions(self, ftype):
-        definitions = self._cached_queries.get(ftype, None)
+        # Maintain a cache for every scanned SOURCES_PATH
+        definitions_dict = self._cached_queries.get(self.infos["SOURCES_PATH"], {})
+        definitions = definitions_dict.get(ftype, None)
         if definitions is not None:
             return definitions
         file_dict = self.infos["FILE_DICT"]
@@ -203,8 +246,13 @@ class BProject(object):
         for filename in file_dict:
             if fnmatch.fnmatch(filename, ftype):
                 definitions += [(filename, dirname) for dirname in file_dict.get(filename, [])]
-        self._cached_queries[ftype] = definitions
+
+        # If no cache for the current SOURCES_PATH create an empty one
+        if not definitions_dict:
+            self._cached_queries[self.infos["SOURCES_PATH"]] = {}
+        # Fill the empty cache with the result
+        self._cached_queries[self.infos["SOURCES_PATH"]][ftype] = definitions
         return definitions
 
     def __repr__(self):
-        return repr(self.infos)
\ No newline at end of file
+        return repr(self.infos)