| Index: embios/trunk/tools/misc.py | 
| — | — | @@ -0,0 +1,185 @@ | 
|   | 2 | +#!/usr/bin/env python
 | 
|   | 3 | +#
 | 
|   | 4 | +#
 | 
|   | 5 | +#    Copyright 2010 TheSeven, benedikt93, Farthen
 | 
|   | 6 | +#
 | 
|   | 7 | +#
 | 
|   | 8 | +#    This file is part of emBIOS.
 | 
|   | 9 | +#
 | 
|   | 10 | +#    emBIOS is free software: you can redistribute it and/or
 | 
|   | 11 | +#    modify it under the terms of the GNU General Public License as
 | 
|   | 12 | +#    published by the Free Software Foundation, either version 2 of the
 | 
|   | 13 | +#    License, or (at your option) any later version.
 | 
|   | 14 | +#
 | 
|   | 15 | +#    emBIOS is distributed in the hope that it will be useful,
 | 
|   | 16 | +#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|   | 17 | +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
|   | 18 | +#    See the GNU General Public License for more details.
 | 
|   | 19 | +#
 | 
|   | 20 | +#    You should have received a copy of the GNU General Public License
 | 
|   | 21 | +#    along with emBIOS.  If not, see <http://www.gnu.org/licenses/>.
 | 
|   | 22 | +#
 | 
|   | 23 | +#
 | 
|   | 24 | +
 | 
|   | 25 | +"""
 | 
|   | 26 | +    This file includes some reusable functions and classes that might be useful
 | 
|   | 27 | +    to all python scripts
 | 
|   | 28 | +"""
 | 
|   | 29 | +
 | 
|   | 30 | +import sys
 | 
|   | 31 | +
 | 
|   | 32 | +class Logger(object):
 | 
|   | 33 | +    """
 | 
|   | 34 | +        Simple stdout logger.
 | 
|   | 35 | +        Loglevel 4 is most verbose, Loglevel 0: Only say something if there is an error.
 | 
|   | 36 | +        The log function doesn't care about the loglevel and always logs to stdout.
 | 
|   | 37 | +    """
 | 
|   | 38 | +    def __init__(self):
 | 
|   | 39 | +        # Possible values: 0 (only errors), 1 (warnings), 2 (info, recommended for production use), 3 and more (debug)
 | 
|   | 40 | +        self.loglevel = 3
 | 
|   | 41 | +        
 | 
|   | 42 | +    def log(self, text, indent = 0, target = "stdout"):
 | 
|   | 43 | +        text = (indent * " ") + text
 | 
|   | 44 | +        text = text.replace("\n", "\n" + (indent * " "), text.count("\n") - 1)
 | 
|   | 45 | +        if target == "stdout":
 | 
|   | 46 | +            sys.stdout.write(text)
 | 
|   | 47 | +        elif target == "string":
 | 
|   | 48 | +            return text
 | 
|   | 49 | +    
 | 
|   | 50 | +    def debug(self, text, indent = 0, target = "stdout"):
 | 
|   | 51 | +        if self.loglevel >= 3:
 | 
|   | 52 | +            self.log("DEBUG: " + text, indent, target)
 | 
|   | 53 | +    
 | 
|   | 54 | +    def info(self, text, indent = 0, target = "stdout"):
 | 
|   | 55 | +        if self.loglevel >= 2:
 | 
|   | 56 | +            self.log(text, indent, target)
 | 
|   | 57 | +    
 | 
|   | 58 | +    def warn(self, text, indent = 0, target = "stdout"):
 | 
|   | 59 | +        if self.loglevel >= 1:
 | 
|   | 60 | +            self.log("WARNING: " + text, indent, target)
 | 
|   | 61 | +    
 | 
|   | 62 | +    def error(self, text, indent = 0, target = "stdout"):
 | 
|   | 63 | +        self.log("ERROR: " + text, indent, target)
 | 
|   | 64 | +
 | 
|   | 65 | +
 | 
|   | 66 | +class Bunch(dict):
 | 
|   | 67 | +    """
 | 
|   | 68 | +        This is a dict whose items can also be accessed with
 | 
|   | 69 | +        bunchinstance.something.
 | 
|   | 70 | +    """
 | 
|   | 71 | +    def __init__(self, **kw):
 | 
|   | 72 | +        dict.__init__(self, kw)
 | 
|   | 73 | +        self.__dict__ = self
 | 
|   | 74 | +    
 | 
|   | 75 | +    def __getstate__(self):
 | 
|   | 76 | +        return self
 | 
|   | 77 | +    
 | 
|   | 78 | +    def __setstate__(self, state):
 | 
|   | 79 | +        self.update(state)
 | 
|   | 80 | +        self.__dict__ = self
 | 
|   | 81 | +
 | 
|   | 82 | +
 | 
|   | 83 | +class Error(Exception):
 | 
|   | 84 | +    def __init__(self, value=None):
 | 
|   | 85 | +        self.value = value
 | 
|   | 86 | +    def __str__(self):
 | 
|   | 87 | +        if self.value != None:
 | 
|   | 88 | +            return repr(self.value)
 | 
|   | 89 | +
 | 
|   | 90 | +
 | 
|   | 91 | +def trimdoc(docstring):
 | 
|   | 92 | +    """
 | 
|   | 93 | +        Trims whitespace from docstrings
 | 
|   | 94 | +    """
 | 
|   | 95 | +    if not docstring:
 | 
|   | 96 | +        return ''
 | 
|   | 97 | +    # Convert tabs to spaces (following the normal Python rules)
 | 
|   | 98 | +    # and split into a list of lines:
 | 
|   | 99 | +    lines = docstring.expandtabs().splitlines()
 | 
|   | 100 | +    # Determine minimum indentation (first line doesn't count):
 | 
|   | 101 | +    indent = sys.maxint
 | 
|   | 102 | +    for line in lines[1:]:
 | 
|   | 103 | +        stripped = line.lstrip()
 | 
|   | 104 | +        if stripped:
 | 
|   | 105 | +            indent = min(indent, len(line) - len(stripped))
 | 
|   | 106 | +    # Remove indentation (first line is special):
 | 
|   | 107 | +    trimmed = [lines[0].strip()]
 | 
|   | 108 | +    if indent < sys.maxint:
 | 
|   | 109 | +        for line in lines[1:]:
 | 
|   | 110 | +            trimmed.append(line[indent:].rstrip())
 | 
|   | 111 | +    # Strip off trailing and leading blank lines:
 | 
|   | 112 | +    while trimmed and not trimmed[-1]:
 | 
|   | 113 | +        trimmed.pop()
 | 
|   | 114 | +    while trimmed and not trimmed[0]:
 | 
|   | 115 | +        trimmed.pop(0)
 | 
|   | 116 | +    # Return a single string:
 | 
|   | 117 | +    return '\n'.join(trimmed)
 | 
|   | 118 | +
 | 
|   | 119 | +
 | 
|   | 120 | +def getfuncdoc(funcdict):
 | 
|   | 121 | +    """
 | 
|   | 122 | +        Extracts important information from a dict of functions like the
 | 
|   | 123 | +        docstring and arguments and returns them in a human readable format
 | 
|   | 124 | +    """
 | 
|   | 125 | +    import inspect
 | 
|   | 126 | +    import re
 | 
|   | 127 | +    functions = Bunch()
 | 
|   | 128 | +    for function in funcdict:
 | 
|   | 129 | +        function = funcdict[function].func
 | 
|   | 130 | +        docinfo = Bunch()
 | 
|   | 131 | +        name = function.__name__
 | 
|   | 132 | +        args = inspect.getargspec(function)[0]
 | 
|   | 133 | +        docinfo['varargs'] = False
 | 
|   | 134 | +        if inspect.getargspec(function)[1]:
 | 
|   | 135 | +            docinfo['varargs'] = True
 | 
|   | 136 | +        kwargvalues = inspect.getargspec(function)[3]
 | 
|   | 137 | +        kwargs = Bunch()
 | 
|   | 138 | +        if args:
 | 
|   | 139 | +            if kwargvalues:
 | 
|   | 140 | +                argnum = len(args) - len(kwargvalues)
 | 
|   | 141 | +                kwargnum = len(kwargvalues)
 | 
|   | 142 | +                kwargs = dict(zip(args[argnum:], kwargvalues))
 | 
|   | 143 | +            else:
 | 
|   | 144 | +                argnum = len(args)
 | 
|   | 145 | +        else:
 | 
|   | 146 | +            argnum = 0
 | 
|   | 147 | +        docinfo['args'] = args[1:argnum]
 | 
|   | 148 | +        docinfo['kwargs'] = kwargs
 | 
|   | 149 | +        if function.__doc__:
 | 
|   | 150 | +            # strip unneccessary whitespace
 | 
|   | 151 | +            docinfo['documentation'] = trimdoc(function.__doc__)
 | 
|   | 152 | +        else:
 | 
|   | 153 | +            docinfo['documentation'] = None
 | 
|   | 154 | +        functions[name] = docinfo
 | 
|   | 155 | +    return functions
 | 
|   | 156 | +
 | 
|   | 157 | +
 | 
|   | 158 | +def gendoc(funcdict, indentwidth = 4, logtarget = "string"):
 | 
|   | 159 | +    logger = Logger()
 | 
|   | 160 | +    doc = getfuncdoc(funcdict)
 | 
|   | 161 | +    ret = ""
 | 
|   | 162 | +    for function in sorted(doc.items()):
 | 
|   | 163 | +        function = function[0]
 | 
|   | 164 | +        ret += logger.log("def " + function + "(", target = logtarget)
 | 
|   | 165 | +        counter = 0
 | 
|   | 166 | +        if doc[function]['args']:
 | 
|   | 167 | +            for arg in doc[function]['args']:
 | 
|   | 168 | +                if counter > 0:
 | 
|   | 169 | +                    sys.stdout.write(", ")
 | 
|   | 170 | +                counter += 1
 | 
|   | 171 | +                ret += logger.log(arg, target = logtarget)
 | 
|   | 172 | +        if doc[function]['kwargs']:
 | 
|   | 173 | +            for kwarg, kwargvalue in doc[function]['kwargs'].items():
 | 
|   | 174 | +                if counter > 0:
 | 
|   | 175 | +                    sys.stdout.write(", ")
 | 
|   | 176 | +                counter += 1
 | 
|   | 177 | +                ret += logger.log(kwarg + "=" + str(kwargvalue), target = logtarget)
 | 
|   | 178 | +        if doc[function]['varargs']:
 | 
|   | 179 | +            ret += logger.log("*argv", target = logtarget)
 | 
|   | 180 | +        ret += logger.log("):\n", target = logtarget)
 | 
|   | 181 | +        if doc[function]['documentation']:
 | 
|   | 182 | +            ret += logger.log("\"\"\"\n", indent = indentwidth, target = logtarget)
 | 
|   | 183 | +            ret += logger.log(trimdoc(doc[function]['documentation']) + "\n", indent = 2 * indentwidth, target = logtarget)
 | 
|   | 184 | +            ret += logger.log("\"\"\"\n", indent = indentwidth, target = logtarget)
 | 
|   | 185 | +        ret += logger.log("\n", target = logtarget)
 | 
|   | 186 | +    return ret | 
| \ No newline at end of file | 
| Index: embios/trunk/tools/embios.py | 
| — | — | @@ -23,8 +23,6 @@ | 
| 24 | 24 |  
 | 
| 25 | 25 |  import sys
 | 
| 26 | 26 |  import os
 | 
| 27 |   | -import inspect
 | 
| 28 |   | -import re
 | 
| 29 | 27 |  import time
 | 
| 30 | 28 |  import struct
 | 
| 31 | 29 |  import locale
 | 
| — | — | @@ -32,8 +30,8 @@ | 
| 33 | 31 |  from functools import wraps
 | 
| 34 | 32 |  
 | 
| 35 | 33 |  import libembios
 | 
| 36 |   | -from libembios import Error
 | 
| 37 | 34 |  import libembiosdata
 | 
|   | 35 | +from misc import Error, Logger, getfuncdoc
 | 
| 38 | 36 |  
 | 
| 39 | 37 |  
 | 
| 40 | 38 |  class NotImplementedError(Error):
 | 
| — | — | @@ -59,38 +57,8 @@ | 
| 60 | 58 |          It is auto generated from various places.
 | 
| 61 | 59 |      """
 | 
| 62 | 60 |      logger = Logger()
 | 
| 63 |   | -    cmddict= Commandline.cmddict
 | 
| 64 |   | -    doc = {}
 | 
| 65 |   | -    # This sorts the output of various internal functions
 | 
| 66 |   | -    # and puts everything in easy readable form
 | 
| 67 |   | -    for function in cmddict:
 | 
| 68 |   | -        function = cmddict[function].func
 | 
| 69 |   | -        docinfo = {}
 | 
| 70 |   | -        name = function.__name__
 | 
| 71 |   | -        args = inspect.getargspec(function)[0]
 | 
| 72 |   | -        docinfo['varargs'] = False
 | 
| 73 |   | -        if inspect.getargspec(function)[1]:
 | 
| 74 |   | -            docinfo['varargs'] = True
 | 
| 75 |   | -        kwargvalues = inspect.getargspec(function)[3]
 | 
| 76 |   | -        kwargs = {}
 | 
| 77 |   | -        if args:
 | 
| 78 |   | -            if kwargvalues:
 | 
| 79 |   | -                argnum = len(args) - len(kwargvalues)
 | 
| 80 |   | -                kwargnum = len(kwargvalues)
 | 
| 81 |   | -                kwargs = dict(zip(args[argnum:], kwargvalues))
 | 
| 82 |   | -            else:
 | 
| 83 |   | -                argnum = len(args)
 | 
| 84 |   | -        else:
 | 
| 85 |   | -            argnum = 0
 | 
| 86 |   | -        docinfo['args'] = args[1:argnum]
 | 
| 87 |   | -        docinfo['kwargs'] = kwargs
 | 
| 88 |   | -        if function.__doc__:
 | 
| 89 |   | -            # strip unneccessary whitespace
 | 
| 90 |   | -            docinfo['documentation'] = re.sub(r'\n        ', '\n', function.__doc__)
 | 
| 91 |   | -        else:
 | 
| 92 |   | -            docinfo['documentation'] = None
 | 
| 93 |   | -        doc[name] = docinfo
 | 
| 94 |   | -
 | 
|   | 61 | +    cmddict = Commandline.cmddict
 | 
|   | 62 | +    doc = getfuncdoc(cmddict)
 | 
| 95 | 63 |      if not specific:
 | 
| 96 | 64 |          logger.log("Please provide a command and (if needed) parameters as command line arguments\n\n")
 | 
| 97 | 65 |          logger.log("Available commands:\n\n")
 | 
| — | — | @@ -99,7 +67,7 @@ | 
| 100 | 68 |      for function in sorted(doc.items()):
 | 
| 101 | 69 |          function = function[0]
 | 
| 102 | 70 |          if specific == False or specific == function:
 | 
| 103 |   | -            logger.log("  " + function + " ")
 | 
|   | 71 | +            logger.log(function + " ", 2)
 | 
| 104 | 72 |              for arg in doc[function]['args']:
 | 
| 105 | 73 |                  logger.log("<" + arg + "> ")
 | 
| 106 | 74 |              if doc[function]['kwargs']:
 | 
| — | — | @@ -107,9 +75,10 @@ | 
| 108 | 76 |                      logger.log("[" + kwarg + "] ")
 | 
| 109 | 77 |              if doc[function]['varargs']:
 | 
| 110 | 78 |                  logger.log("<db1> ... <dbN>")
 | 
|   | 79 | +            logger.log("\n")
 | 
| 111 | 80 |              if doc[function]['documentation']:
 | 
| 112 |   | -                logger.log(doc[function]['documentation']+"\n")
 | 
| 113 |   | -    
 | 
|   | 81 | +                logger.log(doc[function]['documentation']+"\n", 4)
 | 
|   | 82 | +            logger.log("\n")
 | 
| 114 | 83 |      logger.log("\n")
 | 
| 115 | 84 |  
 | 
| 116 | 85 |      if errormsg:
 | 
| — | — | @@ -117,35 +86,6 @@ | 
| 118 | 87 |      exit(2)
 | 
| 119 | 88 |  
 | 
| 120 | 89 |  
 | 
| 121 |   | -class Logger(object):
 | 
| 122 |   | -    """
 | 
| 123 |   | -        Simple stdout logger.
 | 
| 124 |   | -        Loglevel 4 is most verbose, Loglevel 0: Only say something if there is an error.
 | 
| 125 |   | -        The log function doesn't care about the loglevel and always logs to stdout.
 | 
| 126 |   | -    """
 | 
| 127 |   | -    def __init__(self):
 | 
| 128 |   | -        # Possible values: 0 (only errors), 1 (warnings), 2 (info, recommended for production use), 3 and more (debug)
 | 
| 129 |   | -        self.loglevel = 3
 | 
| 130 |   | -        
 | 
| 131 |   | -    def log(self, text):
 | 
| 132 |   | -        sys.stdout.write(text)
 | 
| 133 |   | -    
 | 
| 134 |   | -    def debug(self, text):
 | 
| 135 |   | -        if self.loglevel >= 3:
 | 
| 136 |   | -            self.log("DEBUG: " + text)
 | 
| 137 |   | -    
 | 
| 138 |   | -    def info(self, text):
 | 
| 139 |   | -        if self.loglevel >= 2:
 | 
| 140 |   | -            self.log(text)
 | 
| 141 |   | -    
 | 
| 142 |   | -    def warn(self, text):
 | 
| 143 |   | -        if self.loglevel >= 1:
 | 
| 144 |   | -            self.log("WARNING: " + text)
 | 
| 145 |   | -    
 | 
| 146 |   | -    def error(self, text):
 | 
| 147 |   | -        self.log("ERROR: " + text)
 | 
| 148 |   | -
 | 
| 149 |   | -
 | 
| 150 | 90 |  def command(func):
 | 
| 151 | 91 |      """
 | 
| 152 | 92 |          Decorator for all commands.
 | 
| — | — | @@ -506,17 +446,17 @@ | 
| 507 | 447 |                           % (len(threads), cpuload * 100, coreload * 100, threadload * 100))
 | 
| 508 | 448 |          self.logger.info("Thread dump:\n")
 | 
| 509 | 449 |          for thread in threads:
 | 
| 510 |   | -            self.logger.info("  "+thread.name+":\n")
 | 
| 511 |   | -            self.logger.info("    Thread id: "      + str(thread.id)+"\n")
 | 
| 512 |   | -            self.logger.info("    Thread type: "    + thread.type+"\n")
 | 
| 513 |   | -            self.logger.info("    Thread state: "   + thread.state+"\n")
 | 
| 514 |   | -            self.logger.info("    Block type: "     + thread.block_type+"\n")
 | 
| 515 |   | -            self.logger.info("    Blocked by: "     + self._hex(thread.blocked_by_ptr)+"\n")
 | 
| 516 |   | -            self.logger.info("    Priority: "       + str(thread.priority)+"/255\n")
 | 
| 517 |   | -            self.logger.info("    Current CPU load: %.1f%%\n" % ((thread.cpuload * 100) / 255.))
 | 
| 518 |   | -            self.logger.info("    CPU time (total): "+str(datetime.timedelta(microseconds = thread.cputime_total))+"\n")
 | 
| 519 |   | -            self.logger.info("    Stack address: "  + self._hex(thread.stackaddr)+"\n")
 | 
| 520 |   | -            self.logger.info("    Registers:\n")
 | 
|   | 450 | +            self.logger.info(thread.name+":\n", 2)
 | 
|   | 451 | +            self.logger.info("Thread id: "      + str(thread.id)+"\n", 4)
 | 
|   | 452 | +            self.logger.info("Thread type: "    + thread.type+"\n", 4)
 | 
|   | 453 | +            self.logger.info("Thread state: "   + thread.state+"\n", 4)
 | 
|   | 454 | +            self.logger.info("Block type: "     + thread.block_type+"\n", 4)
 | 
|   | 455 | +            self.logger.info("Blocked by: "     + self._hex(thread.blocked_by_ptr)+"\n", 4)
 | 
|   | 456 | +            self.logger.info("Priority: "       + str(thread.priority)+"/255\n", 4)
 | 
|   | 457 | +            self.logger.info("Current CPU load: %.1f%%\n" % ((thread.cpuload * 100) / 255.), 4)
 | 
|   | 458 | +            self.logger.info("CPU time (total): "+str(datetime.timedelta(microseconds = thread.cputime_total))+"\n", 4)
 | 
|   | 459 | +            self.logger.info("Stack address: "  + self._hex(thread.stackaddr)+"\n", 4)
 | 
|   | 460 | +            self.logger.info("Registers:\n", 4)
 | 
| 521 | 461 |              for registerrange in range(4):
 | 
| 522 | 462 |                  self.logger.info("      ")
 | 
| 523 | 463 |                  for register in range(registerrange, 16, 4):
 | 
| — | — | @@ -523,7 +463,7 @@ | 
| 524 | 464 |                      registerrepr = "r"+str(register)
 | 
| 525 | 465 |                      self.logger.info("{0:3s}: 0x{1:08X}   ".format(registerrepr, thread.regs["r"+str(register)]))
 | 
| 526 | 466 |                  self.logger.info("\n")
 | 
| 527 |   | -            self.logger.info("     cpsr: 0x{0:08X}".format(thread.regs.cpsr))
 | 
|   | 467 | +            self.logger.info("cpsr: 0x{0:08X}".format(thread.regs.cpsr), 6)
 | 
| 528 | 468 |              self.logger.info("\n")
 | 
| 529 | 469 |      
 | 
| 530 | 470 |      @command
 | 
| Index: embios/trunk/tools/libembios.py | 
| — | — | @@ -26,15 +26,9 @@ | 
| 27 | 27 |  import usb.core
 | 
| 28 | 28 |  import libembiosdata
 | 
| 29 | 29 |  
 | 
|   | 30 | +from misc import Bunch, Error
 | 
| 30 | 31 |  from functools import wraps
 | 
| 31 | 32 |  
 | 
| 32 |   | -class Error(Exception):
 | 
| 33 |   | -    def __init__(self, value=None):
 | 
| 34 |   | -        self.value = value
 | 
| 35 |   | -    def __str__(self):
 | 
| 36 |   | -        if self.value != None:
 | 
| 37 |   | -            return repr(self.value)
 | 
| 38 |   | -
 | 
| 39 | 33 |  class ArgumentError(Error):
 | 
| 40 | 34 |      pass
 | 
| 41 | 35 |  
 | 
| — | — | @@ -49,25 +43,8 @@ | 
| 50 | 44 |  
 | 
| 51 | 45 |  class ReceiveError(Error):
 | 
| 52 | 46 |      pass
 | 
| 53 |   | -
 | 
| 54 |   | -
 | 
| 55 |   | -class Bunch(dict):
 | 
| 56 |   | -    """
 | 
| 57 |   | -        This is a dict whose items can also be accessed with
 | 
| 58 |   | -        bunchinstance.something.
 | 
| 59 |   | -    """
 | 
| 60 |   | -    def __init__(self, **kw):
 | 
| 61 |   | -        dict.__init__(self, kw)
 | 
| 62 |   | -        self.__dict__ = self
 | 
| 63 | 47 |      
 | 
| 64 |   | -    def __getstate__(self):
 | 
| 65 |   | -        return self
 | 
| 66 |   | -    
 | 
| 67 |   | -    def __setstate__(self, state):
 | 
| 68 |   | -        self.update(state)
 | 
| 69 |   | -        self.__dict__ = self
 | 
| 70 | 48 |  
 | 
| 71 |   | -
 | 
| 72 | 49 |  def command(timeout = None):
 | 
| 73 | 50 |      """
 | 
| 74 | 51 |          Decorator for all commands.
 | 
| — | — | @@ -96,6 +73,8 @@ | 
| 97 | 74 |              if timeout is not None:
 | 
| 98 | 75 |                  self.lib.dev.timeout = oldtimeout
 | 
| 99 | 76 |              return ret
 | 
|   | 77 | +        func._command = True
 | 
|   | 78 | +        wrapper.func = func
 | 
| 100 | 79 |          return wrapper
 | 
| 101 | 80 |      return decorator
 | 
| 102 | 81 |  
 | 
| — | — | @@ -962,31 +941,45 @@ | 
| 963 | 942 |  
 | 
| 964 | 943 |  
 | 
| 965 | 944 |  if __name__ == "__main__":
 | 
| 966 |   | -    # Some tests
 | 
| 967 |   | -    import sys
 | 
| 968 |   | -    embios = Embios()
 | 
| 969 |   | -    resp = embios.getversioninfo()
 | 
| 970 |   | -    sys.stdout.write("Embios device version information: " + libembiosdata.swtypes[resp.swtypeid] + " v" + str(resp.majorv) + "." + str(resp.minorv) + 
 | 
| 971 |   | -                     "." + str(resp.patchv) + " r" + str(resp.revision) + " running on " + libembiosdata.hwtypes[resp.hwtypeid] + "\n")
 | 
| 972 |   | -    resp = embios.getusermemrange()
 | 
| 973 |   | -    sys.stdout.write("Usermemrange: "+hex(resp.lower)+" - "+hex(resp.upper)+"\n")
 | 
| 974 |   | -    memaddr = resp.lower
 | 
| 975 |   | -    maxlen = resp.upper - resp.lower
 | 
| 976 |   | -    f = open("./embios.py", "rb")
 | 
| 977 |   | -    sys.stdout.write("Loading test file (embios.py) to send over USB...\n")
 | 
| 978 |   | -    datastr = f.read()[:maxlen]
 | 
| 979 |   | -    sys.stdout.write("Sending data...\n")
 | 
| 980 |   | -    embios.write(memaddr, datastr)
 | 
| 981 |   | -    sys.stdout.write("Encrypting data with the hardware key...\n")
 | 
| 982 |   | -    embios.aesencrypt(memaddr, len(datastr), 0)
 | 
| 983 |   | -    sys.stdout.write("Reading data back and saving it to 'libembios-test-encrypted.bin'...\n")
 | 
| 984 |   | -    f = open("./libembios-test-encrypted.bin", "wb")
 | 
| 985 |   | -    f.write(embios.read(memaddr, len(datastr)))
 | 
| 986 |   | -    sys.stdout.write("Decrypting the data again...\n")
 | 
| 987 |   | -    embios.aesdecrypt(memaddr, len(datastr), 0)
 | 
| 988 |   | -    sys.stdout.write("Reading data back from device...\n")
 | 
| 989 |   | -    readdata = embios.read(memaddr, len(datastr))
 | 
| 990 |   | -    if readdata == datastr:
 | 
| 991 |   | -        sys.stdout.write("Data matches!")
 | 
| 992 |   | -    else:
 | 
| 993 |   | -        sys.stdout.write("Data does NOT match. Something went wrong") | 
| \ No newline at end of file | 
|   | 945 | +    from misc import Logger
 | 
|   | 946 | +    logger = Logger()
 | 
|   | 947 | +    if sys.argv[1] == "test":
 | 
|   | 948 | +        # Some tests
 | 
|   | 949 | +        import sys
 | 
|   | 950 | +        embios = Embios()
 | 
|   | 951 | +        resp = embios.getversioninfo()
 | 
|   | 952 | +        logger.log("Embios device version information: " + libembiosdata.swtypes[resp.swtypeid] + " v" + str(resp.majorv) + "." + str(resp.minorv) + 
 | 
|   | 953 | +                         "." + str(resp.patchv) + " r" + str(resp.revision) + " running on " + libembiosdata.hwtypes[resp.hwtypeid] + "\n")
 | 
|   | 954 | +        resp = embios.getusermemrange()
 | 
|   | 955 | +        logger.log("Usermemrange: "+hex(resp.lower)+" - "+hex(resp.upper)+"\n")
 | 
|   | 956 | +        memaddr = resp.lower
 | 
|   | 957 | +        maxlen = resp.upper - resp.lower
 | 
|   | 958 | +        f = open("./embios.py", "rb")
 | 
|   | 959 | +        logger.log("Loading test file (embios.py) to send over USB...\n")
 | 
|   | 960 | +        datastr = f.read()[:maxlen]
 | 
|   | 961 | +        logger.log("Sending data...\n")
 | 
|   | 962 | +        embios.write(memaddr, datastr)
 | 
|   | 963 | +        logger.log("Encrypting data with the hardware key...\n")
 | 
|   | 964 | +        embios.aesencrypt(memaddr, len(datastr), 0)
 | 
|   | 965 | +        logger.log("Reading data back and saving it to 'libembios-test-encrypted.bin'...\n")
 | 
|   | 966 | +        f = open("./libembios-test-encrypted.bin", "wb")
 | 
|   | 967 | +        f.write(embios.read(memaddr, len(datastr)))
 | 
|   | 968 | +        logger.log("Decrypting the data again...\n")
 | 
|   | 969 | +        embios.aesdecrypt(memaddr, len(datastr), 0)
 | 
|   | 970 | +        logger.log("Reading data back from device...\n")
 | 
|   | 971 | +        readdata = embios.read(memaddr, len(datastr))
 | 
|   | 972 | +        if readdata == datastr:
 | 
|   | 973 | +            logger.log("Data matches!")
 | 
|   | 974 | +        else:
 | 
|   | 975 | +            logger.log("Data does NOT match. Something went wrong")
 | 
|   | 976 | +    
 | 
|   | 977 | +    elif sys.argv[1] == "gendoc":
 | 
|   | 978 | +        # Generates Documentation
 | 
|   | 979 | +        from misc import gendoc
 | 
|   | 980 | +        logger.log("Generating documentation\n")
 | 
|   | 981 | +        cmddict = {}
 | 
|   | 982 | +        for attr, value in Embios.__dict__.iteritems():
 | 
|   | 983 | +            if getattr(value, 'func', False):
 | 
|   | 984 | +                if getattr(value.func, '_command', False):
 | 
|   | 985 | +                    cmddict[value.func.__name__] = value
 | 
|   | 986 | +        logger.log(gendoc(cmddict)) | 
| \ No newline at end of file |