| Index: embios/trunk/tools/misc.py | 
| — | — | @@ -32,10 +32,11 @@ | 
| 33 | 33 |  class Logger(object):
 | 
| 34 | 34 |      """
 | 
| 35 | 35 |          Simple stdout logger.
 | 
| 36 |   | -        Loglevel 4 is most verbose, Loglevel 0: Only say something if there is an error.
 | 
|   | 36 | +        Loglevel 3 is most verbose, Loglevel 0: Only log something if there is an error.
 | 
|   | 37 | +        Loglevel -1 means that nothing is logged.
 | 
| 37 | 38 |          The log function doesn't care about the loglevel and always logs to stdout.
 | 
| 38 | 39 |      """
 | 
| 39 |   | -    def __init__(self, loglevel = 3, logfile = "tools.log", target = "stdout"):
 | 
|   | 40 | +    def __init__(self, loglevel = 2, target = "stdout", logfile = "tools.log"):
 | 
| 40 | 41 |          """
 | 
| 41 | 42 |              loglevel: Possible values: 0 (only errors), 1 (warnings), 2 (info,
 | 
| 42 | 43 |                        recommended for production use), 3 and more (debug)
 | 
| — | — | @@ -47,17 +48,18 @@ | 
| 48 | 49 |          self.target = target
 | 
| 49 | 50 |          
 | 
| 50 | 51 |      def log(self, text, indent = 0, target = None):
 | 
| 51 |   | -        if target is None: target = self.target
 | 
| 52 |   | -        text = (indent * " ") + text
 | 
| 53 |   | -        text = text.replace("\n", "\n" + (indent * " "), text.count("\n") - 1)
 | 
| 54 |   | -        if target == "stdout":
 | 
| 55 |   | -            sys.stdout.write(text)
 | 
| 56 |   | -        elif target == "file":
 | 
| 57 |   | -            with open(self.logfile, 'a') as f:
 | 
| 58 |   | -                f.write(text)
 | 
| 59 |   | -                f.close()
 | 
| 60 |   | -        elif target == "string":
 | 
| 61 |   | -            return text
 | 
|   | 52 | +        if self.loglevel >= 0:
 | 
|   | 53 | +            if target is None: target = self.target
 | 
|   | 54 | +            text = (indent * " ") + text
 | 
|   | 55 | +            text = text.replace("\n", "\n" + (indent * " "), text.count("\n") - 1)
 | 
|   | 56 | +            if target == "stdout":
 | 
|   | 57 | +                sys.stdout.write(text)
 | 
|   | 58 | +            elif target == "file":
 | 
|   | 59 | +                with open(self.logfile, 'a') as f:
 | 
|   | 60 | +                    f.write(text)
 | 
|   | 61 | +                    f.close()
 | 
|   | 62 | +            elif target == "string":
 | 
|   | 63 | +                return text
 | 
| 62 | 64 |      
 | 
| 63 | 65 |      def debug(self, text, indent = 0, target = None):
 | 
| 64 | 66 |          if self.loglevel >= 3:
 | 
| — | — | @@ -72,7 +74,8 @@ | 
| 73 | 75 |              self.log("WARNING: " + text, indent, target)
 | 
| 74 | 76 |      
 | 
| 75 | 77 |      def error(self, text, indent = 0, target = None):
 | 
| 76 |   | -        self.log("ERROR: " + text, indent, target)
 | 
|   | 78 | +        if self.loglevel >= 0:
 | 
|   | 79 | +            self.log("ERROR: " + text, indent, target)
 | 
| 77 | 80 |  
 | 
| 78 | 81 |  
 | 
| 79 | 82 |  class Bunch(dict):
 | 
| Index: embios/trunk/tools/embios.py | 
| — | — | @@ -124,7 +124,7 @@ | 
| 125 | 125 |      def __init__(self):
 | 
| 126 | 126 |          self.logger = Logger()
 | 
| 127 | 127 |          try:
 | 
| 128 |   | -            self.embios = libembios.Embios()
 | 
|   | 128 | +            self.embios = libembios.Embios(loglevel = 2)
 | 
| 129 | 129 |          except libembios.DeviceNotFoundError:
 | 
| 130 | 130 |              self.logger.error("No emBIOS device found!")
 | 
| 131 | 131 |              exit(1)
 | 
| Index: embios/trunk/tools/libembios.py | 
| — | — | @@ -26,7 +26,7 @@ | 
| 27 | 27 |  import usb.core
 | 
| 28 | 28 |  import libembiosdata
 | 
| 29 | 29 |  
 | 
| 30 |   | -from misc import Bunch, Error, gethwname
 | 
|   | 30 | +from misc import Logger, Bunch, Error, gethwname
 | 
| 31 | 31 |  from functools import wraps
 | 
| 32 | 32 |  
 | 
| 33 | 33 |  class ArgumentError(Error):
 | 
| — | — | @@ -92,8 +92,10 @@ | 
| 93 | 93 |          feature from external. So DON'T EVER use a parameter called 'timeout'
 | 
| 94 | 94 |          in your commands. Variables are ok.
 | 
| 95 | 95 |      """
 | 
| 96 |   | -    def __init__(self):
 | 
| 97 |   | -        self.lib = Lib()
 | 
|   | 96 | +    def __init__(self, loglevel = 2, logtarget = "stdout", logfile = "tools.log"):
 | 
|   | 97 | +        self.logger = Logger(loglevel, logtarget, logfile)
 | 
|   | 98 | +        self.logger.debug("Initializing Embios object\n")
 | 
|   | 99 | +        self.lib = Lib(self.logger)
 | 
| 98 | 100 |          
 | 
| 99 | 101 |          self.getversioninfo()
 | 
| 100 | 102 |          self.getpacketsizeinfo()
 | 
| — | — | @@ -152,7 +154,9 @@ | 
| 153 | 155 |          self.lib.dev.version.majorv = resp.majorv
 | 
| 154 | 156 |          self.lib.dev.version.minorv = resp.minorv
 | 
| 155 | 157 |          self.lib.dev.version.patchv = resp.patchv
 | 
|   | 158 | +        self.logger.debug("Device Software Type ID = " + str(resp.swtypeid) + "\n")
 | 
| 156 | 159 |          self.lib.dev.swtypeid = resp.swtypeid
 | 
|   | 160 | +        self.logger.debug("Device Hardware Type ID = " + str(resp.hwtypeid) + "\n")
 | 
| 157 | 161 |          self.lib.dev.hwtypeid = resp.hwtypeid
 | 
| 158 | 162 |          return resp
 | 
| 159 | 163 |      
 | 
| — | — | @@ -162,9 +166,13 @@ | 
| 163 | 167 |              It also sets the properties of the device object accordingly.
 | 
| 164 | 168 |          """
 | 
| 165 | 169 |          resp = self.lib.monitorcommand(struct.pack("IIII", 1, 1, 0, 0), "HHII", ("coutmax", "cinmax", "doutmax", "dinmax"))
 | 
|   | 170 | +        self.logger.debug("Device cout packet size limit = " + str(resp.coutmax) + "\n")
 | 
| 166 | 171 |          self.lib.dev.packetsizelimit.cout = resp.coutmax
 | 
|   | 172 | +        self.logger.debug("Device cin packet size limit = " + str(resp.cinmax) + "\n")
 | 
| 167 | 173 |          self.lib.dev.packetsizelimit.cin = resp.cinmax
 | 
|   | 174 | +        self.logger.debug("Device din packet size limit = " + str(resp.doutmax) + "\n")
 | 
| 168 | 175 |          self.lib.dev.packetsizelimit.din = resp.dinmax
 | 
|   | 176 | +        self.logger.debug("Device dout packet size limit = " + str(resp.dinmax) + "\n")
 | 
| 169 | 177 |          self.lib.dev.packetsizelimit.dout = resp.doutmax
 | 
| 170 | 178 |          return resp
 | 
| 171 | 179 |      
 | 
| — | — | @@ -172,6 +180,7 @@ | 
| 173 | 181 |      def getusermemrange(self):
 | 
| 174 | 182 |          """ This returns the memory range the user has access to. """
 | 
| 175 | 183 |          resp = self.lib.monitorcommand(struct.pack("IIII", 1, 2, 0, 0), "III", ("lower", "upper", None))
 | 
|   | 184 | +        self.logger.debug("Device user memory = 0x%x - 0x%x\n" % (resp.lower, resp.upper))
 | 
| 176 | 185 |          self.lib.dev.usermem.lower = resp.lower
 | 
| 177 | 186 |          self.lib.dev.usermem.upper = resp.upper
 | 
| 178 | 187 |          return resp
 | 
| — | — | @@ -802,7 +811,9 @@ | 
| 803 | 812 |      
 | 
| 804 | 813 |  
 | 
| 805 | 814 |  class Lib(object):
 | 
| 806 |   | -    def __init__(self):
 | 
|   | 815 | +    def __init__(self, logger):
 | 
|   | 816 | +        self.logger = logger
 | 
|   | 817 | +        self.logger.debug("Initializing Lib object\n")
 | 
| 807 | 818 |          self.idVendor = 0xFFFF
 | 
| 808 | 819 |          self.idProduct = 0xE000
 | 
| 809 | 820 |          
 | 
| — | — | @@ -811,10 +822,11 @@ | 
| 812 | 823 |          self.connect()
 | 
| 813 | 824 |      
 | 
| 814 | 825 |      def connect(self):
 | 
| 815 |   | -        self.dev = Dev(self.idVendor, self.idProduct)
 | 
|   | 826 | +        self.dev = Dev(self.idVendor, self.idProduct, self.logger)
 | 
| 816 | 827 |          self.connected = True
 | 
| 817 | 828 |      
 | 
| 818 | 829 |      def monitorcommand(self, cmd, rcvdatatypes=None, rcvstruct=None):
 | 
|   | 830 | +        self.logger.debug("Sending monitorcommand\n")
 | 
| 819 | 831 |          writelen = self.dev.cout(cmd)
 | 
| 820 | 832 |          if rcvdatatypes:
 | 
| 821 | 833 |              rcvdatatypes = "I" + rcvdatatypes # add the response
 | 
| — | — | @@ -822,6 +834,7 @@ | 
| 823 | 835 |              data = struct.unpack(rcvdatatypes, data)
 | 
| 824 | 836 |              response = data[0]
 | 
| 825 | 837 |              if libembiosdata.responsecodes[response] == "ok":
 | 
|   | 838 | +                self.logger.debug("Response: OK\n")
 | 
| 826 | 839 |                  if rcvstruct:
 | 
| 827 | 840 |                      datadict = Bunch()
 | 
| 828 | 841 |                      counter = 1 # start with 1, 0 is the id
 | 
| — | — | @@ -833,20 +846,29 @@ | 
| 834 | 847 |                  else:
 | 
| 835 | 848 |                      return data
 | 
| 836 | 849 |              elif libembiosdata.responsecodes[response] == "unsupported":
 | 
|   | 850 | +                self.logger.debug("Response: UNSUPPORTED\n")
 | 
| 837 | 851 |                  raise DeviceError("The device does not support this command.")
 | 
| 838 | 852 |              elif libembiosdata.responsecodes[response] == "invalid":
 | 
|   | 853 | +                self.logger.debug("Response: INVALID\n")
 | 
| 839 | 854 |                  raise DeviceError("Invalid command! This should NOT happen!")
 | 
| 840 | 855 |              elif libembiosdata.responsecodes[response] == "busy":
 | 
|   | 856 | +                self.logger.debug("Response: BUSY\n")
 | 
| 841 | 857 |                  raise DeviceError("Device busy")
 | 
|   | 858 | +            else:
 | 
|   | 859 | +                self.logger.debug("Response: UNKOWN\n")
 | 
|   | 860 | +                raise DeviceError("Invalid response! This should NOT happen!")
 | 
| 842 | 861 |          else:
 | 
| 843 | 862 |              return writelen
 | 
| 844 | 863 |  
 | 
| 845 | 864 |  
 | 
| 846 | 865 |  class Dev(object):
 | 
| 847 |   | -    def __init__(self, idVendor, idProduct):
 | 
|   | 866 | +    def __init__(self, idVendor, idProduct, logger):
 | 
| 848 | 867 |          self.idVendor = idVendor
 | 
| 849 | 868 |          self.idProduct = idProduct
 | 
| 850 | 869 |          
 | 
|   | 870 | +        self.logger = logger
 | 
|   | 871 | +        self.logger.debug("Initializing Dev object\n")
 | 
|   | 872 | +        
 | 
| 851 | 873 |          self.interface = 0
 | 
| 852 | 874 |          self.timeout = 100
 | 
| 853 | 875 |  
 | 
| — | — | @@ -853,6 +875,7 @@ | 
| 854 | 876 |          self.connect()
 | 
| 855 | 877 |          self.findEndpoints()
 | 
| 856 | 878 |          
 | 
|   | 879 | +        self.logger.debug("Successfully connected to device\n")
 | 
| 857 | 880 |          
 | 
| 858 | 881 |          # Device properties
 | 
| 859 | 882 |          self.packetsizelimit = Bunch()
 | 
| — | — | @@ -877,6 +900,7 @@ | 
| 878 | 901 |          self.disconnect()
 | 
| 879 | 902 |      
 | 
| 880 | 903 |      def findEndpoints(self):
 | 
|   | 904 | +        self.logger.debug("Searching for device endpoints:\n")
 | 
| 881 | 905 |          epcounter = 0
 | 
| 882 | 906 |          self.endpoint = Bunch()
 | 
| 883 | 907 |          for cfg in self.dev:
 | 
| — | — | @@ -883,12 +907,16 @@ | 
| 884 | 908 |              for intf in cfg:
 | 
| 885 | 909 |                  for ep in intf:
 | 
| 886 | 910 |                      if epcounter == 0:
 | 
|   | 911 | +                        self.logger.debug("Found cout endpoint at 0x%x\n" % ep.bEndpointAddress)
 | 
| 887 | 912 |                          self.endpoint.cout = ep.bEndpointAddress
 | 
| 888 | 913 |                      elif epcounter == 1:
 | 
|   | 914 | +                        self.logger.debug("Found cin endpoint at 0x%x\n" % ep.bEndpointAddress)
 | 
| 889 | 915 |                          self.endpoint.cin = ep.bEndpointAddress
 | 
| 890 | 916 |                      elif epcounter == 2:
 | 
|   | 917 | +                        self.logger.debug("Found dout endpoint at 0x%x\n" % ep.bEndpointAddress)
 | 
| 891 | 918 |                          self.endpoint.dout = ep.bEndpointAddress
 | 
| 892 | 919 |                      elif epcounter == 3:
 | 
|   | 920 | +                        self.logger.debug("Found din endpoint at 0x%x\n" % ep.bEndpointAddress)
 | 
| 893 | 921 |                          self.endpoint.din = ep.bEndpointAddress
 | 
| 894 | 922 |                      epcounter += 1
 | 
| 895 | 923 |          if epcounter <= 3:
 | 
| — | — | @@ -895,9 +923,12 @@ | 
| 896 | 924 |              raise DeviceError("Not all endpoints found in the descriptor. Only "+str(epcounter)+" found, we need 4")
 | 
| 897 | 925 |      
 | 
| 898 | 926 |      def connect(self):
 | 
|   | 927 | +        self.logger.debug("Looking for emBIOS device\n")
 | 
| 899 | 928 |          self.dev = usb.core.find(idVendor=self.idVendor, idProduct=self.idProduct)
 | 
| 900 | 929 |          if self.dev is None:
 | 
| 901 | 930 |              raise DeviceNotFoundError()
 | 
|   | 931 | +        self.logger.debug("Device Found!\n")
 | 
|   | 932 | +        self.logger.debug("Setting first configuration\n")
 | 
| 902 | 933 |          self.dev.set_configuration()
 | 
| 903 | 934 |      
 | 
| 904 | 935 |      def disconnect(self):
 | 
| — | — | @@ -916,21 +947,25 @@ | 
| 917 | 948 |          return read
 | 
| 918 | 949 |      
 | 
| 919 | 950 |      def cout(self, data):
 | 
|   | 951 | +        self.logger.debug("Sending data to cout endpoint with the size " + str(len(data)) + "\n")
 | 
| 920 | 952 |          if self.packetsizelimit.cout and len(data) > self.packetsizelimit.cout:
 | 
| 921 | 953 |              raise SendError("Packet too big")
 | 
| 922 | 954 |          return self.send(self.endpoint.cout, data)
 | 
| 923 | 955 |      
 | 
| 924 | 956 |      def cin(self, size):
 | 
|   | 957 | +        self.logger.debug("Receiving data on the cin endpoint with the size " + str(size) + "\n")
 | 
| 925 | 958 |          if self.packetsizelimit.cin and size > self.packetsizelimit.cin:
 | 
| 926 | 959 |              raise ReceiveError("Packet too big")
 | 
| 927 | 960 |          return self.receive(self.endpoint.cin, size)
 | 
| 928 | 961 |      
 | 
| 929 | 962 |      def dout(self, data):
 | 
|   | 963 | +        self.logger.debug("Sending data to cout endpoint with the size " + str(len(data)) + "\n")
 | 
| 930 | 964 |          if self.packetsizelimit.dout and len(data) > self.packetsizelimit.dout:
 | 
| 931 | 965 |              raise SendError("Packet too big")
 | 
| 932 | 966 |          return self.send(self.endpoint.dout, data)
 | 
| 933 | 967 |      
 | 
| 934 | 968 |      def din(self, size):
 | 
|   | 969 | +        self.logger.debug("Receiving data on the din endpoint with the size " + str(size) + "\n")
 | 
| 935 | 970 |          if self.packetsizelimit.din and size > self.packetsizelimit.din:
 | 
| 936 | 971 |              raise ReceiveError("Packet too big")
 | 
| 937 | 972 |          return self.receive(self.endpoint.din, size)
 |