5.2.1 - Updated I2C files
Dependents: mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510
tools/arm_pack_manager/__init__.py@1:f30bdcd2b33b, 2017-02-27 (annotated)
- Committer:
- jacobjohnson
- Date:
- Mon Feb 27 17:45:05 2017 +0000
- Revision:
- 1:f30bdcd2b33b
- Parent:
- 0:098463de4c5d
changed the inputscale from 1 to 7 in analogin_api.c. This will need to be changed later, and accessed from the main level, but for now this allows the adc to read a value from 0 to 3.7V, instead of just up to 1V.;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
group-onsemi | 0:098463de4c5d | 1 | from urllib2 import urlopen, URLError |
group-onsemi | 0:098463de4c5d | 2 | from bs4 import BeautifulSoup |
group-onsemi | 0:098463de4c5d | 3 | from os.path import join, dirname, basename |
group-onsemi | 0:098463de4c5d | 4 | from os import makedirs |
group-onsemi | 0:098463de4c5d | 5 | from errno import EEXIST |
group-onsemi | 0:098463de4c5d | 6 | from threading import Thread |
group-onsemi | 0:098463de4c5d | 7 | from Queue import Queue |
group-onsemi | 0:098463de4c5d | 8 | from re import compile, sub |
group-onsemi | 0:098463de4c5d | 9 | from sys import stderr, stdout |
group-onsemi | 0:098463de4c5d | 10 | from fuzzywuzzy import process |
group-onsemi | 0:098463de4c5d | 11 | from itertools import takewhile |
group-onsemi | 0:098463de4c5d | 12 | import argparse |
group-onsemi | 0:098463de4c5d | 13 | from json import dump, load |
group-onsemi | 0:098463de4c5d | 14 | from zipfile import ZipFile |
group-onsemi | 0:098463de4c5d | 15 | from tempfile import gettempdir |
group-onsemi | 0:098463de4c5d | 16 | |
group-onsemi | 0:098463de4c5d | 17 | RootPackURL = "http://www.keil.com/pack/index.idx" |
group-onsemi | 0:098463de4c5d | 18 | |
group-onsemi | 0:098463de4c5d | 19 | LocalPackDir = dirname(__file__) |
group-onsemi | 0:098463de4c5d | 20 | LocalPackIndex = join(LocalPackDir, "index.json") |
group-onsemi | 0:098463de4c5d | 21 | LocalPackAliases = join(LocalPackDir, "aliases.json") |
group-onsemi | 0:098463de4c5d | 22 | |
group-onsemi | 0:098463de4c5d | 23 | |
group-onsemi | 0:098463de4c5d | 24 | protocol_matcher = compile("\w*://") |
group-onsemi | 0:098463de4c5d | 25 | def strip_protocol(url) : |
group-onsemi | 0:098463de4c5d | 26 | return protocol_matcher.sub("", str(url)) |
group-onsemi | 0:098463de4c5d | 27 | |
group-onsemi | 0:098463de4c5d | 28 | def largest_version(content) : |
group-onsemi | 0:098463de4c5d | 29 | return sorted([t['version'] for t in content.package.releases('release')], reverse=True)[0] |
group-onsemi | 0:098463de4c5d | 30 | |
group-onsemi | 0:098463de4c5d | 31 | def do_queue(Class, function, interable) : |
group-onsemi | 0:098463de4c5d | 32 | q = Queue() |
group-onsemi | 0:098463de4c5d | 33 | threads = [Class(q, function) for each in range(20)] |
group-onsemi | 0:098463de4c5d | 34 | for each in threads : |
group-onsemi | 0:098463de4c5d | 35 | each.setDaemon(True) |
group-onsemi | 0:098463de4c5d | 36 | each.start() |
group-onsemi | 0:098463de4c5d | 37 | for thing in interable : |
group-onsemi | 0:098463de4c5d | 38 | q.put(thing) |
group-onsemi | 0:098463de4c5d | 39 | q.join() |
group-onsemi | 0:098463de4c5d | 40 | |
group-onsemi | 0:098463de4c5d | 41 | class Reader (Thread) : |
group-onsemi | 0:098463de4c5d | 42 | def __init__(self, queue, func) : |
group-onsemi | 0:098463de4c5d | 43 | Thread.__init__(self) |
group-onsemi | 0:098463de4c5d | 44 | self.queue = queue |
group-onsemi | 0:098463de4c5d | 45 | self.func = func |
group-onsemi | 0:098463de4c5d | 46 | def run(self) : |
group-onsemi | 0:098463de4c5d | 47 | while True : |
group-onsemi | 0:098463de4c5d | 48 | url = self.queue.get() |
group-onsemi | 0:098463de4c5d | 49 | self.func(url) |
group-onsemi | 0:098463de4c5d | 50 | self.queue.task_done() |
group-onsemi | 0:098463de4c5d | 51 | |
group-onsemi | 0:098463de4c5d | 52 | |
group-onsemi | 0:098463de4c5d | 53 | class Cache () : |
group-onsemi | 0:098463de4c5d | 54 | """ The Cache object is the only relevant API object at the moment |
group-onsemi | 0:098463de4c5d | 55 | |
group-onsemi | 0:098463de4c5d | 56 | Constructing the Cache object does not imply any caching. |
group-onsemi | 0:098463de4c5d | 57 | A user of the API must explicitly call caching functions. |
group-onsemi | 0:098463de4c5d | 58 | |
group-onsemi | 0:098463de4c5d | 59 | :param silent: A boolean that, when True, significantly reduces the printing of this Object |
group-onsemi | 0:098463de4c5d | 60 | :type silent: bool |
group-onsemi | 0:098463de4c5d | 61 | :param no_timeouts: A boolean that, when True, disables the default connection timeout and low speed timeout for downloading things. |
group-onsemi | 0:098463de4c5d | 62 | :type no_timeouts: bool |
group-onsemi | 0:098463de4c5d | 63 | """ |
group-onsemi | 0:098463de4c5d | 64 | def __init__ (self, silent, no_timeouts) : |
group-onsemi | 0:098463de4c5d | 65 | self.silent = silent |
group-onsemi | 0:098463de4c5d | 66 | self.counter = 0 |
group-onsemi | 0:098463de4c5d | 67 | self.total = 1 |
group-onsemi | 0:098463de4c5d | 68 | self._index = {} |
group-onsemi | 0:098463de4c5d | 69 | self._aliases = {} |
group-onsemi | 0:098463de4c5d | 70 | self.urls = None |
group-onsemi | 0:098463de4c5d | 71 | self.no_timeouts = no_timeouts |
group-onsemi | 0:098463de4c5d | 72 | self.data_path = gettempdir() |
group-onsemi | 0:098463de4c5d | 73 | |
group-onsemi | 0:098463de4c5d | 74 | def display_counter (self, message) : |
group-onsemi | 0:098463de4c5d | 75 | stdout.write("{} {}/{}\r".format(message, self.counter, self.total)) |
group-onsemi | 0:098463de4c5d | 76 | stdout.flush() |
group-onsemi | 0:098463de4c5d | 77 | |
group-onsemi | 0:098463de4c5d | 78 | def cache_file (self, url) : |
group-onsemi | 0:098463de4c5d | 79 | """Low level interface to caching a single file. |
group-onsemi | 0:098463de4c5d | 80 | |
group-onsemi | 0:098463de4c5d | 81 | :param url: The URL to cache. |
group-onsemi | 0:098463de4c5d | 82 | :type url: str |
group-onsemi | 0:098463de4c5d | 83 | :rtype: None |
group-onsemi | 0:098463de4c5d | 84 | """ |
group-onsemi | 0:098463de4c5d | 85 | if not self.silent : print("Caching {}...".format(url)) |
group-onsemi | 0:098463de4c5d | 86 | dest = join(self.data_path, strip_protocol(url)) |
group-onsemi | 0:098463de4c5d | 87 | try : |
group-onsemi | 0:098463de4c5d | 88 | makedirs(dirname(dest)) |
group-onsemi | 0:098463de4c5d | 89 | except OSError as exc : |
group-onsemi | 0:098463de4c5d | 90 | if exc.errno == EEXIST : pass |
group-onsemi | 0:098463de4c5d | 91 | else : raise |
group-onsemi | 0:098463de4c5d | 92 | try: |
group-onsemi | 0:098463de4c5d | 93 | with open(dest, "wb+") as fd : |
group-onsemi | 0:098463de4c5d | 94 | fd.write(urlopen(url).read()) |
group-onsemi | 0:098463de4c5d | 95 | except URLError as e: |
group-onsemi | 0:098463de4c5d | 96 | stderr.write(e.reason) |
group-onsemi | 0:098463de4c5d | 97 | self.counter += 1 |
group-onsemi | 0:098463de4c5d | 98 | self.display_counter("Caching Files") |
group-onsemi | 0:098463de4c5d | 99 | |
group-onsemi | 0:098463de4c5d | 100 | def pdsc_to_pack (self, url) : |
group-onsemi | 0:098463de4c5d | 101 | """Find the URL of the specified pack file described by a PDSC. |
group-onsemi | 0:098463de4c5d | 102 | |
group-onsemi | 0:098463de4c5d | 103 | The PDSC is assumed to be cached and is looked up in the cache by its URL. |
group-onsemi | 0:098463de4c5d | 104 | |
group-onsemi | 0:098463de4c5d | 105 | :param url: The url used to look up the PDSC. |
group-onsemi | 0:098463de4c5d | 106 | :type url: str |
group-onsemi | 0:098463de4c5d | 107 | :return: The url of the PACK file. |
group-onsemi | 0:098463de4c5d | 108 | :rtype: str |
group-onsemi | 0:098463de4c5d | 109 | """ |
group-onsemi | 0:098463de4c5d | 110 | content = self.pdsc_from_cache(url) |
group-onsemi | 0:098463de4c5d | 111 | new_url = content.package.url.get_text() |
group-onsemi | 0:098463de4c5d | 112 | if not new_url.endswith("/") : |
group-onsemi | 0:098463de4c5d | 113 | new_url = new_url + "/" |
group-onsemi | 0:098463de4c5d | 114 | return (new_url + content.package.vendor.get_text() + "." + |
group-onsemi | 0:098463de4c5d | 115 | content.package.find('name').get_text() + "." + |
group-onsemi | 0:098463de4c5d | 116 | largest_version(content) + ".pack") |
group-onsemi | 0:098463de4c5d | 117 | |
group-onsemi | 0:098463de4c5d | 118 | def cache_pdsc_and_pack (self, url) : |
group-onsemi | 0:098463de4c5d | 119 | self.cache_file(url) |
group-onsemi | 0:098463de4c5d | 120 | try : |
group-onsemi | 0:098463de4c5d | 121 | self.cache_file(self.pdsc_to_pack(url)) |
group-onsemi | 0:098463de4c5d | 122 | except AttributeError : |
group-onsemi | 0:098463de4c5d | 123 | stderr.write("[ ERROR ] {} does not appear to be a conforming .pdsc file\n".format(url)) |
group-onsemi | 0:098463de4c5d | 124 | self.counter += 1 |
group-onsemi | 0:098463de4c5d | 125 | |
group-onsemi | 0:098463de4c5d | 126 | def get_urls(self): |
group-onsemi | 0:098463de4c5d | 127 | """Extract the URLs of all know PDSC files. |
group-onsemi | 0:098463de4c5d | 128 | |
group-onsemi | 0:098463de4c5d | 129 | Will pull the index from the internet if it is not cached. |
group-onsemi | 0:098463de4c5d | 130 | |
group-onsemi | 0:098463de4c5d | 131 | :return: A list of all PDSC URLs |
group-onsemi | 0:098463de4c5d | 132 | :rtype: [str] |
group-onsemi | 0:098463de4c5d | 133 | """ |
group-onsemi | 0:098463de4c5d | 134 | if not self.urls : |
group-onsemi | 0:098463de4c5d | 135 | try : root_data = self.pdsc_from_cache(RootPackURL) |
group-onsemi | 0:098463de4c5d | 136 | except IOError : root_data = self.cache_and_parse(RootPackURL) |
group-onsemi | 0:098463de4c5d | 137 | self.urls = ["/".join([pdsc.get('url').strip("/"), |
group-onsemi | 0:098463de4c5d | 138 | pdsc.get('name').strip("/")]) |
group-onsemi | 0:098463de4c5d | 139 | for pdsc in root_data.find_all("pdsc")] |
group-onsemi | 0:098463de4c5d | 140 | return self.urls |
group-onsemi | 0:098463de4c5d | 141 | |
group-onsemi | 0:098463de4c5d | 142 | def _extract_dict(self, device, filename, pack) : |
group-onsemi | 0:098463de4c5d | 143 | to_ret = dict(pdsc_file=filename, pack_file=pack) |
group-onsemi | 0:098463de4c5d | 144 | try : to_ret["memory"] = dict([(m["id"], dict(start=m["start"], |
group-onsemi | 0:098463de4c5d | 145 | size=m["size"])) |
group-onsemi | 0:098463de4c5d | 146 | for m in device("memory")]) |
group-onsemi | 0:098463de4c5d | 147 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 148 | try: algorithms = device("algorithm") |
group-onsemi | 0:098463de4c5d | 149 | except: |
group-onsemi | 0:098463de4c5d | 150 | try: algorithms = device.parent("algorithm") |
group-onsemi | 0:098463de4c5d | 151 | except: pass |
group-onsemi | 0:098463de4c5d | 152 | else: |
group-onsemi | 0:098463de4c5d | 153 | if not algorithms: |
group-onsemi | 0:098463de4c5d | 154 | try: algorithms = device.parent("algorithm") |
group-onsemi | 0:098463de4c5d | 155 | except: pass |
group-onsemi | 0:098463de4c5d | 156 | try : to_ret["algorithm"] = dict([(algo.get("name").replace('\\','/'), |
group-onsemi | 0:098463de4c5d | 157 | dict(start=algo["start"], |
group-onsemi | 0:098463de4c5d | 158 | size=algo["size"], |
group-onsemi | 0:098463de4c5d | 159 | ramstart=algo.get("ramstart",None), |
group-onsemi | 0:098463de4c5d | 160 | ramsize=algo.get("ramsize",None), |
group-onsemi | 0:098463de4c5d | 161 | default=algo.get("default",1))) |
group-onsemi | 0:098463de4c5d | 162 | for algo in algorithms]) |
group-onsemi | 0:098463de4c5d | 163 | except (KeyError, TypeError, IndexError) as e: pass |
group-onsemi | 0:098463de4c5d | 164 | try: to_ret["debug"] = device.parent.parent.debug["svd"] |
group-onsemi | 0:098463de4c5d | 165 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 166 | try: to_ret["debug"] = device.parent.debug["svd"] |
group-onsemi | 0:098463de4c5d | 167 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 168 | try: to_ret["debug"] = device.debug["svd"] |
group-onsemi | 0:098463de4c5d | 169 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 170 | |
group-onsemi | 0:098463de4c5d | 171 | to_ret["compile"] = {} |
group-onsemi | 0:098463de4c5d | 172 | try: compile_l1 = device.parent("compile") |
group-onsemi | 0:098463de4c5d | 173 | except (KeyError, TypeError, IndexError) as e : compile_l1 = [] |
group-onsemi | 0:098463de4c5d | 174 | try: compile_l2 = device.parent.parent("compile") |
group-onsemi | 0:098463de4c5d | 175 | except (KeyError, TypeError, IndexError) as e : compile_l2 = [] |
group-onsemi | 0:098463de4c5d | 176 | compile = compile_l2 + compile_l1 |
group-onsemi | 0:098463de4c5d | 177 | for c in compile: |
group-onsemi | 0:098463de4c5d | 178 | try: to_ret["compile"]["header"] = c["header"] |
group-onsemi | 0:098463de4c5d | 179 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 180 | try: to_ret["compile"]["define"] = c["define"] |
group-onsemi | 0:098463de4c5d | 181 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 182 | |
group-onsemi | 0:098463de4c5d | 183 | try: to_ret["core"] = device.parent.processor['dcore'] |
group-onsemi | 0:098463de4c5d | 184 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 185 | try: to_ret["core"] = device.parent.parent.processor['dcore'] |
group-onsemi | 0:098463de4c5d | 186 | except (KeyError, TypeError, IndexError) as e : pass |
group-onsemi | 0:098463de4c5d | 187 | |
group-onsemi | 0:098463de4c5d | 188 | to_ret["processor"] = {} |
group-onsemi | 0:098463de4c5d | 189 | try: proc_l1 = device("processor") |
group-onsemi | 0:098463de4c5d | 190 | except (KeyError, TypeError, IndexError) as e: proc_l1 = [] |
group-onsemi | 0:098463de4c5d | 191 | try: proc_l2 = device.parent("processor") |
group-onsemi | 0:098463de4c5d | 192 | except (KeyError, TypeError, IndexError) as e: proc_l2 = [] |
group-onsemi | 0:098463de4c5d | 193 | try: proc_l3 = device.parent.parent("processor") |
group-onsemi | 0:098463de4c5d | 194 | except (KeyError, TypeError, IndexError) as e: proc_l3 = [] |
group-onsemi | 0:098463de4c5d | 195 | proc = proc_l3 + proc_l2 + proc_l1 |
group-onsemi | 0:098463de4c5d | 196 | for p in proc: |
group-onsemi | 0:098463de4c5d | 197 | try: to_ret["processor"]["fpu"] = p['dfpu'] |
group-onsemi | 0:098463de4c5d | 198 | except (KeyError, TypeError, IndexError) as e: pass |
group-onsemi | 0:098463de4c5d | 199 | try: to_ret["processor"]["endianness"] = p['dendian'] |
group-onsemi | 0:098463de4c5d | 200 | except (KeyError, TypeError, IndexError) as e: pass |
group-onsemi | 0:098463de4c5d | 201 | try: to_ret["processor"]["clock"] = p['dclock'] |
group-onsemi | 0:098463de4c5d | 202 | except (KeyError, TypeError, IndexError) as e: pass |
group-onsemi | 0:098463de4c5d | 203 | |
group-onsemi | 0:098463de4c5d | 204 | try: to_ret["vendor"] = device.parent['dvendor'] |
group-onsemi | 0:098463de4c5d | 205 | except (KeyError, TypeError, IndexError) as e: pass |
group-onsemi | 0:098463de4c5d | 206 | try: to_ret["vendor"] = device.parent.parent['dvendor'] |
group-onsemi | 0:098463de4c5d | 207 | except (KeyError, TypeError, IndexError) as e: pass |
group-onsemi | 0:098463de4c5d | 208 | |
group-onsemi | 0:098463de4c5d | 209 | if not to_ret["processor"]: |
group-onsemi | 0:098463de4c5d | 210 | del to_ret["processor"] |
group-onsemi | 0:098463de4c5d | 211 | |
group-onsemi | 0:098463de4c5d | 212 | if not to_ret["compile"]: |
group-onsemi | 0:098463de4c5d | 213 | del to_ret["compile"] |
group-onsemi | 0:098463de4c5d | 214 | |
group-onsemi | 0:098463de4c5d | 215 | to_ret['debug-interface'] = [] |
group-onsemi | 0:098463de4c5d | 216 | |
group-onsemi | 0:098463de4c5d | 217 | return to_ret |
group-onsemi | 0:098463de4c5d | 218 | |
group-onsemi | 0:098463de4c5d | 219 | def _generate_index_helper(self, d) : |
group-onsemi | 0:098463de4c5d | 220 | try : |
group-onsemi | 0:098463de4c5d | 221 | pack = self.pdsc_to_pack(d) |
group-onsemi | 0:098463de4c5d | 222 | self._index.update(dict([(dev['dname'], self._extract_dict(dev, d, pack)) for dev in |
group-onsemi | 0:098463de4c5d | 223 | (self.pdsc_from_cache(d)("device"))])) |
group-onsemi | 0:098463de4c5d | 224 | except AttributeError as e : |
group-onsemi | 0:098463de4c5d | 225 | stderr.write("[ ERROR ] file {}\n".format(d)) |
group-onsemi | 0:098463de4c5d | 226 | print(e) |
group-onsemi | 0:098463de4c5d | 227 | self.counter += 1 |
group-onsemi | 0:098463de4c5d | 228 | self.display_counter("Generating Index") |
group-onsemi | 0:098463de4c5d | 229 | |
group-onsemi | 0:098463de4c5d | 230 | def _generate_aliases_helper(self, d) : |
group-onsemi | 0:098463de4c5d | 231 | try : |
group-onsemi | 0:098463de4c5d | 232 | mydict = [] |
group-onsemi | 0:098463de4c5d | 233 | for dev in self.pdsc_from_cache(d)("board"): |
group-onsemi | 0:098463de4c5d | 234 | try : |
group-onsemi | 0:098463de4c5d | 235 | mydict.append((dev['name'], dev.mounteddevice['dname'])) |
group-onsemi | 0:098463de4c5d | 236 | except (KeyError, TypeError, IndexError) as e: |
group-onsemi | 0:098463de4c5d | 237 | pass |
group-onsemi | 0:098463de4c5d | 238 | self._aliases.update(dict(mydict)) |
group-onsemi | 0:098463de4c5d | 239 | except (AttributeError, TypeError) as e : |
group-onsemi | 0:098463de4c5d | 240 | pass |
group-onsemi | 0:098463de4c5d | 241 | self.counter += 1 |
group-onsemi | 0:098463de4c5d | 242 | self.display_counter("Scanning for Aliases") |
group-onsemi | 0:098463de4c5d | 243 | |
group-onsemi | 0:098463de4c5d | 244 | def get_flash_algorthim_binary(self, device_name) : |
group-onsemi | 0:098463de4c5d | 245 | """Retrieve the flash algorithm file for a particular part. |
group-onsemi | 0:098463de4c5d | 246 | |
group-onsemi | 0:098463de4c5d | 247 | Assumes that both the PDSC and the PACK file associated with that part are in the cache. |
group-onsemi | 0:098463de4c5d | 248 | |
group-onsemi | 0:098463de4c5d | 249 | :param device_name: The exact name of a device |
group-onsemi | 0:098463de4c5d | 250 | :type device_name: str |
group-onsemi | 0:098463de4c5d | 251 | :return: A file-like object that, when read, is the ELF file that describes the flashing algorithm |
group-onsemi | 0:098463de4c5d | 252 | :rtype: ZipExtFile |
group-onsemi | 0:098463de4c5d | 253 | """ |
group-onsemi | 0:098463de4c5d | 254 | pack = self.pack_from_cache(self.index[device_name]) |
group-onsemi | 0:098463de4c5d | 255 | return pack.open(device['algorithm']['file']) |
group-onsemi | 0:098463de4c5d | 256 | |
group-onsemi | 0:098463de4c5d | 257 | def get_svd_file(self, device_name) : |
group-onsemi | 0:098463de4c5d | 258 | """Retrieve the flash algorithm file for a particular part. |
group-onsemi | 0:098463de4c5d | 259 | |
group-onsemi | 0:098463de4c5d | 260 | Assumes that both the PDSC and the PACK file associated with that part are in the cache. |
group-onsemi | 0:098463de4c5d | 261 | |
group-onsemi | 0:098463de4c5d | 262 | :param device_name: The exact name of a device |
group-onsemi | 0:098463de4c5d | 263 | :type device_name: str |
group-onsemi | 0:098463de4c5d | 264 | :return: A file-like object that, when read, is the ELF file that describes the flashing algorithm |
group-onsemi | 0:098463de4c5d | 265 | :rtype: ZipExtFile |
group-onsemi | 0:098463de4c5d | 266 | """ |
group-onsemi | 0:098463de4c5d | 267 | pack = self.pack_from_cache(self.index[device_name]) |
group-onsemi | 0:098463de4c5d | 268 | return pack.open(device['debug']) |
group-onsemi | 0:098463de4c5d | 269 | |
group-onsemi | 0:098463de4c5d | 270 | def generate_index(self) : |
group-onsemi | 0:098463de4c5d | 271 | self._index = {} |
group-onsemi | 0:098463de4c5d | 272 | self.counter = 0 |
group-onsemi | 0:098463de4c5d | 273 | do_queue(Reader, self._generate_index_helper, self.get_urls()) |
group-onsemi | 0:098463de4c5d | 274 | with open(LocalPackIndex, "wb+") as out: |
group-onsemi | 0:098463de4c5d | 275 | self._index["version"] = "0.1.0" |
group-onsemi | 0:098463de4c5d | 276 | dump(self._index, out) |
group-onsemi | 0:098463de4c5d | 277 | stdout.write("\n") |
group-onsemi | 0:098463de4c5d | 278 | |
group-onsemi | 0:098463de4c5d | 279 | def generate_aliases(self) : |
group-onsemi | 0:098463de4c5d | 280 | self._aliases = {} |
group-onsemi | 0:098463de4c5d | 281 | self.counter = 0 |
group-onsemi | 0:098463de4c5d | 282 | do_queue(Reader, self._generate_aliases_helper, self.get_urls()) |
group-onsemi | 0:098463de4c5d | 283 | with open(LocalPackAliases, "wb+") as out: |
group-onsemi | 0:098463de4c5d | 284 | dump(self._aliases, out) |
group-onsemi | 0:098463de4c5d | 285 | stdout.write("\n") |
group-onsemi | 0:098463de4c5d | 286 | |
group-onsemi | 0:098463de4c5d | 287 | def find_device(self, match) : |
group-onsemi | 0:098463de4c5d | 288 | choices = process.extract(match, self.index.keys(), limit=len(self.index)) |
group-onsemi | 0:098463de4c5d | 289 | choices = sorted([(v, k) for k, v in choices], reverse=True) |
group-onsemi | 0:098463de4c5d | 290 | if choices : choices = list(takewhile(lambda t: t[0] == choices[0][0], choices)) |
group-onsemi | 0:098463de4c5d | 291 | return [(v, self.index[v]) for k,v in choices] |
group-onsemi | 0:098463de4c5d | 292 | |
group-onsemi | 0:098463de4c5d | 293 | def dump_index_to_file(self, file) : |
group-onsemi | 0:098463de4c5d | 294 | with open(file, "wb+") as out: |
group-onsemi | 0:098463de4c5d | 295 | dump(self.index, out) |
group-onsemi | 0:098463de4c5d | 296 | |
group-onsemi | 0:098463de4c5d | 297 | @property |
group-onsemi | 0:098463de4c5d | 298 | def index(self) : |
group-onsemi | 0:098463de4c5d | 299 | """An index of most of the important data in all cached PDSC files. |
group-onsemi | 0:098463de4c5d | 300 | |
group-onsemi | 0:098463de4c5d | 301 | :Example: |
group-onsemi | 0:098463de4c5d | 302 | |
group-onsemi | 0:098463de4c5d | 303 | >>> from ArmPackManager import Cache |
group-onsemi | 0:098463de4c5d | 304 | >>> a = Cache() |
group-onsemi | 0:098463de4c5d | 305 | >>> a.index["LPC1768"] |
group-onsemi | 0:098463de4c5d | 306 | {u'algorithm': {u'RAMsize': u'0x0FE0', |
group-onsemi | 0:098463de4c5d | 307 | u'RAMstart': u'0x10000000', |
group-onsemi | 0:098463de4c5d | 308 | u'name': u'Flash/LPC_IAP_512.FLM', |
group-onsemi | 0:098463de4c5d | 309 | u'size': u'0x80000', |
group-onsemi | 0:098463de4c5d | 310 | u'start': u'0x00000000'}, |
group-onsemi | 0:098463de4c5d | 311 | u'compile': [u'Device/Include/LPC17xx.h', u'LPC175x_6x'], |
group-onsemi | 0:098463de4c5d | 312 | u'debug': u'SVD/LPC176x5x.svd', |
group-onsemi | 0:098463de4c5d | 313 | u'pdsc_file': u'http://www.keil.com/pack/Keil.LPC1700_DFP.pdsc', |
group-onsemi | 0:098463de4c5d | 314 | u'memory': {u'IRAM1': {u'size': u'0x8000', u'start': u'0x10000000'}, |
group-onsemi | 0:098463de4c5d | 315 | u'IRAM2': {u'size': u'0x8000', u'start': u'0x2007C000'}, |
group-onsemi | 0:098463de4c5d | 316 | u'IROM1': {u'size': u'0x80000', u'start': u'0x00000000'}}} |
group-onsemi | 0:098463de4c5d | 317 | |
group-onsemi | 0:098463de4c5d | 318 | |
group-onsemi | 0:098463de4c5d | 319 | """ |
group-onsemi | 0:098463de4c5d | 320 | if not self._index : |
group-onsemi | 0:098463de4c5d | 321 | with open(LocalPackIndex) as i : |
group-onsemi | 0:098463de4c5d | 322 | self._index = load(i) |
group-onsemi | 0:098463de4c5d | 323 | return self._index |
group-onsemi | 0:098463de4c5d | 324 | @property |
group-onsemi | 0:098463de4c5d | 325 | def aliases(self) : |
group-onsemi | 0:098463de4c5d | 326 | """An index of most of the important data in all cached PDSC files. |
group-onsemi | 0:098463de4c5d | 327 | |
group-onsemi | 0:098463de4c5d | 328 | :Example: |
group-onsemi | 0:098463de4c5d | 329 | |
group-onsemi | 0:098463de4c5d | 330 | >>> from ArmPackManager import Cache |
group-onsemi | 0:098463de4c5d | 331 | >>> a = Cache() |
group-onsemi | 0:098463de4c5d | 332 | >>> a.index["LPC1768"] |
group-onsemi | 0:098463de4c5d | 333 | {u'algorithm': {u'RAMsize': u'0x0FE0', |
group-onsemi | 0:098463de4c5d | 334 | u'RAMstart': u'0x10000000', |
group-onsemi | 0:098463de4c5d | 335 | u'name': u'Flash/LPC_IAP_512.FLM', |
group-onsemi | 0:098463de4c5d | 336 | u'size': u'0x80000', |
group-onsemi | 0:098463de4c5d | 337 | u'start': u'0x00000000'}, |
group-onsemi | 0:098463de4c5d | 338 | u'compile': [u'Device/Include/LPC17xx.h', u'LPC175x_6x'], |
group-onsemi | 0:098463de4c5d | 339 | u'debug': u'SVD/LPC176x5x.svd', |
group-onsemi | 0:098463de4c5d | 340 | u'pdsc_file': u'http://www.keil.com/pack/Keil.LPC1700_DFP.pdsc', |
group-onsemi | 0:098463de4c5d | 341 | u'memory': {u'IRAM1': {u'size': u'0x8000', u'start': u'0x10000000'}, |
group-onsemi | 0:098463de4c5d | 342 | u'IRAM2': {u'size': u'0x8000', u'start': u'0x2007C000'}, |
group-onsemi | 0:098463de4c5d | 343 | u'IROM1': {u'size': u'0x80000', u'start': u'0x00000000'}}} |
group-onsemi | 0:098463de4c5d | 344 | |
group-onsemi | 0:098463de4c5d | 345 | |
group-onsemi | 0:098463de4c5d | 346 | """ |
group-onsemi | 0:098463de4c5d | 347 | if not self._aliases : |
group-onsemi | 0:098463de4c5d | 348 | with open(join(self.data_path, "aliases.json")) as i : |
group-onsemi | 0:098463de4c5d | 349 | self._aliases = load(i) |
group-onsemi | 0:098463de4c5d | 350 | return self._aliases |
group-onsemi | 0:098463de4c5d | 351 | |
group-onsemi | 0:098463de4c5d | 352 | def cache_everything(self) : |
group-onsemi | 0:098463de4c5d | 353 | """Cache every PACK and PDSC file known. |
group-onsemi | 0:098463de4c5d | 354 | |
group-onsemi | 0:098463de4c5d | 355 | Generates an index afterwards. |
group-onsemi | 0:098463de4c5d | 356 | |
group-onsemi | 0:098463de4c5d | 357 | .. note:: This process may use 4GB of drive space and take upwards of 10 minutes to complete. |
group-onsemi | 0:098463de4c5d | 358 | """ |
group-onsemi | 0:098463de4c5d | 359 | self.cache_pack_list(self.get_urls()) |
group-onsemi | 0:098463de4c5d | 360 | self.generate_index() |
group-onsemi | 0:098463de4c5d | 361 | self.generate_aliases() |
group-onsemi | 0:098463de4c5d | 362 | |
group-onsemi | 0:098463de4c5d | 363 | def cache_descriptors(self) : |
group-onsemi | 0:098463de4c5d | 364 | """Cache every PDSC file known. |
group-onsemi | 0:098463de4c5d | 365 | |
group-onsemi | 0:098463de4c5d | 366 | Generates an index afterwards. |
group-onsemi | 0:098463de4c5d | 367 | |
group-onsemi | 0:098463de4c5d | 368 | .. note:: This process may use 11MB of drive space and take upwards of 1 minute. |
group-onsemi | 0:098463de4c5d | 369 | """ |
group-onsemi | 0:098463de4c5d | 370 | self.cache_descriptor_list(self.get_urls()) |
group-onsemi | 0:098463de4c5d | 371 | self.generate_index() |
group-onsemi | 0:098463de4c5d | 372 | self.generate_aliases() |
group-onsemi | 0:098463de4c5d | 373 | |
group-onsemi | 0:098463de4c5d | 374 | def cache_descriptor_list(self, list) : |
group-onsemi | 0:098463de4c5d | 375 | """Cache a list of PDSC files. |
group-onsemi | 0:098463de4c5d | 376 | |
group-onsemi | 0:098463de4c5d | 377 | :param list: URLs of PDSC files to cache. |
group-onsemi | 0:098463de4c5d | 378 | :type list: [str] |
group-onsemi | 0:098463de4c5d | 379 | """ |
group-onsemi | 0:098463de4c5d | 380 | self.total = len(list) |
group-onsemi | 0:098463de4c5d | 381 | self.display_counter("Caching Files") |
group-onsemi | 0:098463de4c5d | 382 | do_queue(Reader, self.cache_file, list) |
group-onsemi | 0:098463de4c5d | 383 | stdout.write("\n") |
group-onsemi | 0:098463de4c5d | 384 | |
group-onsemi | 0:098463de4c5d | 385 | def cache_pack_list(self, list) : |
group-onsemi | 0:098463de4c5d | 386 | """Cache a list of PACK files, referenced by their PDSC URL |
group-onsemi | 0:098463de4c5d | 387 | |
group-onsemi | 0:098463de4c5d | 388 | :param list: URLs of PDSC files to cache. |
group-onsemi | 0:098463de4c5d | 389 | :type list: [str] |
group-onsemi | 0:098463de4c5d | 390 | """ |
group-onsemi | 0:098463de4c5d | 391 | self.total = len(list) * 2 |
group-onsemi | 0:098463de4c5d | 392 | self.display_counter("Caching Files") |
group-onsemi | 0:098463de4c5d | 393 | do_queue(Reader, self.cache_pdsc_and_pack, list) |
group-onsemi | 0:098463de4c5d | 394 | stdout.write("\n") |
group-onsemi | 0:098463de4c5d | 395 | |
group-onsemi | 0:098463de4c5d | 396 | def pdsc_from_cache(self, url) : |
group-onsemi | 0:098463de4c5d | 397 | """Low level inteface for extracting a PDSC file from the cache. |
group-onsemi | 0:098463de4c5d | 398 | |
group-onsemi | 0:098463de4c5d | 399 | Assumes that the file specified is a PDSC file and is in the cache. |
group-onsemi | 0:098463de4c5d | 400 | |
group-onsemi | 0:098463de4c5d | 401 | :param url: The URL of a PDSC file. |
group-onsemi | 0:098463de4c5d | 402 | :type url: str |
group-onsemi | 0:098463de4c5d | 403 | :return: A parsed representation of the PDSC file. |
group-onsemi | 0:098463de4c5d | 404 | :rtype: BeautifulSoup |
group-onsemi | 0:098463de4c5d | 405 | """ |
group-onsemi | 0:098463de4c5d | 406 | dest = join(self.data_path, strip_protocol(url)) |
group-onsemi | 0:098463de4c5d | 407 | with open(dest, "r") as fd : |
group-onsemi | 0:098463de4c5d | 408 | return BeautifulSoup(fd, "html.parser") |
group-onsemi | 0:098463de4c5d | 409 | |
group-onsemi | 0:098463de4c5d | 410 | def pack_from_cache(self, url) : |
group-onsemi | 0:098463de4c5d | 411 | """Low level inteface for extracting a PACK file from the cache. |
group-onsemi | 0:098463de4c5d | 412 | |
group-onsemi | 0:098463de4c5d | 413 | Assumes that the file specified is a PACK file and is in the cache. |
group-onsemi | 0:098463de4c5d | 414 | |
group-onsemi | 0:098463de4c5d | 415 | :param url: The URL of a PACK file. |
group-onsemi | 0:098463de4c5d | 416 | :type url: str |
group-onsemi | 0:098463de4c5d | 417 | :return: A parsed representation of the PACK file. |
group-onsemi | 0:098463de4c5d | 418 | :rtype: ZipFile |
group-onsemi | 0:098463de4c5d | 419 | """ |
group-onsemi | 0:098463de4c5d | 420 | return ZipFile(join(self.data_path, |
group-onsemi | 0:098463de4c5d | 421 | strip_protocol(device['pack_file']))) |
group-onsemi | 0:098463de4c5d | 422 | |
group-onsemi | 0:098463de4c5d | 423 | def gen_dict_from_cache() : |
group-onsemi | 0:098463de4c5d | 424 | pdsc_files = pdsc_from_cache(RootPackUrl) |
group-onsemi | 0:098463de4c5d | 425 | |
group-onsemi | 0:098463de4c5d | 426 | def cache_and_parse(self, url) : |
group-onsemi | 0:098463de4c5d | 427 | """A low level shortcut that Caches and Parses a PDSC file. |
group-onsemi | 0:098463de4c5d | 428 | |
group-onsemi | 0:098463de4c5d | 429 | :param url: The URL of the PDSC file. |
group-onsemi | 0:098463de4c5d | 430 | :type url: str |
group-onsemi | 0:098463de4c5d | 431 | :return: A parsed representation of the PDSC file. |
group-onsemi | 0:098463de4c5d | 432 | :rtype: BeautifulSoup |
group-onsemi | 0:098463de4c5d | 433 | """ |
group-onsemi | 0:098463de4c5d | 434 | self.cache_file(url) |
group-onsemi | 0:098463de4c5d | 435 | return self.pdsc_from_cache(url) |
group-onsemi | 0:098463de4c5d | 436 |