| Index: embios/trunk/tools/embios.py | 
| — | — | @@ -34,6 +34,7 @@ | 
| 35 | 35 | from libembios import Error | 
| 36 | 36 | import libembiosdata | 
| 37 | 37 |  | 
|  | 38 | + | 
| 38 | 39 | class NotImplementedError(Error): | 
| 39 | 40 | pass | 
| 40 | 41 |  | 
| — | — | @@ -252,17 +253,6 @@ | 
| 253 | 254 | return None | 
| 254 | 255 | else: | 
| 255 | 256 | raise ArgumentTypeError("hexadecimal coded integer", "'"+str(something)+"'") | 
| 256 |  | -
 | 
| 257 |  | -    @staticmethod
 | 
| 258 |  | -    def _strcheck(string, values):
 | 
| 259 |  | -        if string in values:
 | 
| 260 |  | -            return string
 | 
| 261 |  | -        else:
 | 
| 262 |  | -            expected = ""
 | 
| 263 |  | -            for item in values:
 | 
| 264 |  | -                expected += "'" + item + "', "
 | 
| 265 |  | -            expected = expected[:-2]
 | 
| 266 |  | -            raise ArgumentTypeError("one out of " + expected, "'" + string + "'")
 | 
| 267 | 257 |  | 
| 268 | 258 | @staticmethod | 
| 269 | 259 | def _hex(integer): | 
| — | — | @@ -362,18 +352,18 @@ | 
| 363 | 353 | raise ArgumentError("Specified integer too long") | 
| 364 | 354 | data = chr(integer) | 
| 365 | 355 | self.embios.write(addr, data) | 
| 366 |  | -        self.logger.info("Integer '"+self._hex(integer)+"' written successfully to "+self._hex(addr))
 | 
|  | 356 | +        self.logger.info("Integer '"+self._hex(integer)+"' written successfully to "+self._hex(addr)+"\n") | 
| 367 | 357 |  | 
| 368 | 358 | @command | 
| 369 | 359 | def downloadint(self, addr): | 
| 370 | 360 | """ | 
| 371 | 361 | Downloads a single integer from the device and prints it to the console window | 
| 372 |  | -            <offset>: the address to download the integer from
 | 
|  | 362 | +            <addr>: the address to download the integer from | 
| 373 | 363 | """ | 
| 374 | 364 | addr = self._hexint(addr) | 
| 375 | 365 | data = self.embios.read(addr, 1) | 
| 376 | 366 | integer = ord(data) | 
| 377 |  | -        self.logger.info("Integer '"+self._hex(integer)+"' read from address "+self._hex(addr))
 | 
|  | 367 | +        self.logger.info("Integer '"+self._hex(integer)+"' read from address "+self._hex(addr)+"\n") | 
| 378 | 368 |  | 
| 379 | 369 | @command | 
| 380 | 370 | def i2cread(self, bus, slave, addr, size): | 
| — | — | @@ -388,8 +378,11 @@ | 
| 389 | 379 | slave = self._hexint(slave) | 
| 390 | 380 | addr = self._hexint(addr) | 
| 391 | 381 | size = self._hexint(size) | 
| 392 |  | -        for i in range(size):
 | 
| 393 |  | -            print("%02X: %02X" % (addr + i, struct.unpack("B", self.embios.i2cread(bus, slave, addr + i, 1))[0]))
 | 
|  | 382 | +        data = self.embios.i2cread(bus, slave, addr, size) | 
|  | 383 | +        bytes = struct.unpack("%dB" % len(data), data) | 
|  | 384 | +        self.logger.info("Data read from I2C:\n") | 
|  | 385 | +        for index, byte in enumerate(bytes): | 
|  | 386 | +            self.logger.info("%02X: %02X\n" % (index, byte)) | 
| 394 | 387 |  | 
| 395 | 388 | @command | 
| 396 | 389 | def i2cwrite(self, bus, slave, addr, *args): | 
| — | — | @@ -399,7 +392,7 @@ | 
| 400 | 393 | <slave> the slave address | 
| 401 | 394 | <addr> the start address on the I2C device | 
| 402 | 395 | <db1> ... <dbN> the data in single bytes, encoded in hex, | 
| 403 |  | -                seperated by whitespaces, eg. 37 56 45 12
 | 
|  | 396 | +                seperated by whitespaces, eg. 37 5A 4F EB | 
| 404 | 397 | """ | 
| 405 | 398 | bus = self._hexint(bus) | 
| 406 | 399 | slave = self._hexint(slave) | 
| — | — | @@ -407,7 +400,9 @@ | 
| 408 | 401 | data = "" | 
| 409 | 402 | for arg in args: | 
| 410 | 403 | data += chr(self._hexint(arg)) | 
|  | 404 | +        self.logger.info("Writing data to I2C...\n") | 
| 411 | 405 | self.embios.i2cwrite(bus, slave, addr, data) | 
|  | 406 | +        self.logger.info("done\n") | 
| 412 | 407 |  | 
| 413 | 408 | @command | 
| 414 | 409 | def console(self): | 
| — | — | @@ -428,7 +423,7 @@ | 
| 429 | 424 | for word in args: | 
| 430 | 425 | text += word + " " | 
| 431 | 426 | text = text[:-1] | 
| 432 |  | -        self.logger.info("Writing '"+text+"' to the usb console\n")
 | 
|  | 427 | +        self.logger.info("Writing '"+ text +"' to the usb console\n") | 
| 433 | 428 | self.embios.usbcwrite(text) | 
| 434 | 429 |  | 
| 435 | 430 | @command | 
| — | — | @@ -464,7 +459,8 @@ | 
| 465 | 460 | <bitmask>: the bitmask of the consoles to be flushed | 
| 466 | 461 | """ | 
| 467 | 462 | bitmask = self._hexint(bitmask) | 
| 468 |  | -        raise NotImplementedError
 | 
|  | 463 | +        self.logger.info("Flushing consoles identified with the bitmask "+self._hex(bitmask)+"\n") | 
|  | 464 | +        self.embios.cflush(bitmask) | 
| 469 | 465 |  | 
| 470 | 466 | @command | 
| 471 | 467 | def getprocinfo(self): | 
| — | — | @@ -514,7 +510,8 @@ | 
| 515 | 511 | Suspends/resumes the thread with thread ID <threadid> | 
| 516 | 512 | """ | 
| 517 | 513 | threadid = self._hexint(threadid) | 
| 518 |  | -        self.embios.resumethread(threadid)
 | 
|  | 514 | +        self.logger.info("Suspending the thread with the threadid "+self._hex(threadid)+"\n") | 
|  | 515 | +        self.embios.suspendthread(threadid) | 
| 519 | 516 |  | 
| 520 | 517 | @command | 
| 521 | 518 | def resumethread(self, threadid): | 
| — | — | @@ -522,6 +519,7 @@ | 
| 523 | 520 | Resumes the thread with thread ID <threadid> | 
| 524 | 521 | """ | 
| 525 | 522 | threadid = self._hexint(threadid) | 
|  | 523 | +        self.logger.info("Resuming the thread with the threadid "+self._hex(threadid)+"\n") | 
| 526 | 524 | self.embios.resumethread(threadid) | 
| 527 | 525 |  | 
| 528 | 526 | @command | 
| — | — | @@ -530,6 +528,7 @@ | 
| 531 | 529 | Kills the thread with thread ID <threadid> | 
| 532 | 530 | """ | 
| 533 | 531 | threadid = self._hexint(threadid) | 
|  | 532 | +        self.logger.info("Killing the thread with the threadid " + self._hex(threadid) + "\n") | 
| 534 | 533 | self.embios.killthread(threadid) | 
| 535 | 534 |  | 
| 536 | 535 | @command | 
| — | — | @@ -549,16 +548,45 @@ | 
| 550 | 549 | stackpointer = self._hexint(stackpointer) | 
| 551 | 550 | stacksize = self._hexint(stacksize) | 
| 552 | 551 | priority = self._hexint(priority) | 
| 553 |  | -        self.embios.createthread(nameptr, entrypoint, stackptr, stacksize, type, priority, state)
 | 
|  | 552 | +        data = self.embios.createthread(nameptr, entrypoint, stackptr, stacksize, type, priority, state) | 
|  | 553 | +        name = self.embios.readstring(nameptr) | 
|  | 554 | +        self.logger.info("Created a thread with the threadid " + data.id + ", the name \"" + name + "\", the entrypoint at " + self._hex(entrypoint) + ", the stack at " + self._hex(stackpointer) + " with a size of " + self._hex(stacksize) + " and a priority of " + self._hex(priority) + "\n") | 
| 554 | 555 |  | 
| 555 | 556 | @command | 
| 556 | 557 | def run(self, filename): | 
| 557 | 558 | """ | 
| 558 | 559 | Uploads the emBIOS application <filename> to | 
| 559 |  | -            the beginning of the user memory and executes it
 | 
|  | 560 | +            the memory and executes it | 
| 560 | 561 | """ | 
| 561 |  | -        #self.execimage(addr)
 | 
| 562 |  | -        raise NotImplementedError
 | 
|  | 562 | +        try: | 
|  | 563 | +            f = open(filename, 'rb') | 
|  | 564 | +        except IOError: | 
|  | 565 | +            raise ArgumentError("File not readable. Does it exist?") | 
|  | 566 | +        try: | 
|  | 567 | +            appheader = struct.unpack("<8sIIIIIIIIII", f.read(48)) | 
|  | 568 | +            header = appheader[0] | 
|  | 569 | +            if header != "emBIexec": | 
|  | 570 | +                raise ArgumentError("The specified file is not an emBIOS application") | 
|  | 571 | +            baseaddr = appheader[2] | 
|  | 572 | +            threadnameptr = appheader[8] | 
|  | 573 | +            f.seek(threadnameptr - baseaddr) | 
|  | 574 | +            name = "" | 
|  | 575 | +            while True: | 
|  | 576 | +                char = f.read(1) | 
|  | 577 | +                if ord(char) == 0: | 
|  | 578 | +                    break | 
|  | 579 | +                name += char | 
|  | 580 | +            self.logger.info("Writing emBIOS application \"" + name + "\" to the memory at " + self._hex(baseaddr) + "...") | 
|  | 581 | +            f.seek(0) | 
|  | 582 | +            self.embios.write(baseaddr, f.read()) | 
|  | 583 | +        except IOError: | 
|  | 584 | +            raise ArgumentError("The specified file is not an emBIOS application") | 
|  | 585 | +        except struct.error: | 
|  | 586 | +            raise ArgumentError("The specified file is not an emBIOS application") | 
|  | 587 | +        finally: | 
|  | 588 | +            f.close() | 
|  | 589 | +        self.logger.info("done\n") | 
|  | 590 | +        self.execimage(baseaddr) | 
| 563 | 591 |  | 
| 564 | 592 | @command | 
| 565 | 593 | def execimage(self, addr): | 
| Index: embios/trunk/tools/libembios.py | 
| — | — | @@ -219,12 +219,11 @@ | 
| 220 | 220 |  | 
| 221 | 221 | def i2cread(self, index, slaveaddr, startaddr, size): | 
| 222 | 222 | """ Reads data from an i2c slave """ | 
| 223 |  | -        if size > 256 or size < 1:
 | 
| 224 |  | -            raise ValueError("Size must be a number between 1 and 256")
 | 
| 225 |  | -        if size == 256:
 | 
| 226 |  | -            size = 0
 | 
| 227 |  | -        resp = self.lib.monitorcommand(struct.pack("IBBBBII", 8, index, slaveaddr, startaddr, size, 0, 0), "III%ds" % size, (None, None, None, "data"))
 | 
| 228 |  | -        return resp.data
 | 
|  | 223 | +        data = "" | 
|  | 224 | +        for i in range(size): | 
|  | 225 | +            resp = self.lib.monitorcommand(struct.pack("IBBBBII", 8, index, slaveaddr, startaddr + i, 1, 0, 0), "III1s", (None, None, None, "data")) | 
|  | 226 | +            data += resp.data | 
|  | 227 | +        return data | 
| 229 | 228 |  | 
| 230 | 229 | def i2cwrite(self, index, slaveaddr, startaddr, data): | 
| 231 | 230 | """ Writes data to an i2c slave """ |