5.2.1 - Updated I2C files

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

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?

UserRevisionLine numberNew 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