From da91bb6d1ec2edda204eb50bb1ec6a0e00a4d557 Mon Sep 17 00:00:00 2001 From: NĂ©lio Laranjeiro Date: Fri, 6 Mar 2009 22:57:57 +0100 Subject: tools/trace: Ended the interpretor part of the trace tool. --- tools/trace/doc/trace.txt | 2 ++ tools/trace/example/trace.trc | 2 +- tools/trace/tcreator/tcreator.py | 3 +- tools/trace/tcreator/template.h | 2 +- tools/trace/tcreator/writer.py | 17 +++++++-- tools/trace/tinter/thost.py | 74 ++++++++++++++++++++++++++++++++++++++-- tools/trace/tinter/tinter.py | 62 ++++++++++++++++----------------- tools/trace/tinter/utils.py | 15 ++++++++ tools/trace/trace.py | 55 +++++++++++------------------ 9 files changed, 156 insertions(+), 76 deletions(-) create mode 100644 tools/trace/tinter/utils.py (limited to 'tools') diff --git a/tools/trace/doc/trace.txt b/tools/trace/doc/trace.txt index e773b779..c932e1b6 100644 --- a/tools/trace/doc/trace.txt +++ b/tools/trace/doc/trace.txt @@ -27,6 +27,8 @@ To interpret the memory data python trace.py inter +The interpreted data is directly print on the std output. + Trace definition file --------------------- diff --git a/tools/trace/example/trace.trc b/tools/trace/example/trace.trc index db92823e..58b9e19a 100644 --- a/tools/trace/example/trace.trc +++ b/tools/trace/example/trace.trc @@ -1,3 +1,3 @@ EVENT asserv__right_motor speed 4 position 4 acceleration 2 "Right motor speed : %d, position : %d, acceleration : %d" EVENT asserv__left_motor speed 4 position 4 acceleration 2 "Left motor speed : %d, position : %d, acceleration : %d" -EVENT ia__ia_cmd arg1 2 arg2 1 arg3 4 "IA cmd, arg1 : %d, arg2 : %d, arg3 : %d" +EVENT ia__ia_cmd arg1 2 arg2 2 arg3 4 "IA cmd, arg1 : %d, arg2 : %d, arg3 : %d" diff --git a/tools/trace/tcreator/tcreator.py b/tools/trace/tcreator/tcreator.py index be771afb..d0d8807c 100644 --- a/tools/trace/tcreator/tcreator.py +++ b/tools/trace/tcreator/tcreator.py @@ -7,7 +7,6 @@ except: print "--> You should run yapps on lib/parser.g" class TCreator: - def __init__(self, infile, outfile, enum_name = "trace_id_t"): self.__infile = infile self.__outfile = outfile @@ -21,7 +20,7 @@ class TCreator: w = Writer (self.__outfile, self.__enum_name) outstring = w.parse_list (data) - if self.__outfile != "": + if self.__outfile != None: w.write_file (outstring) else: w.print_file (outstring) diff --git a/tools/trace/tcreator/template.h b/tools/trace/tcreator/template.h index 579acfad..3e83692e 100644 --- a/tools/trace/tcreator/template.h +++ b/tools/trace/tcreator/template.h @@ -3,7 +3,7 @@ /* %%template%% */ /* {{{ * - * Copyright (C) 2008 APBTeam + * Copyright (C) %%year%% APBTeam * * APBTeam: * Web: http://apbteam.org/ diff --git a/tools/trace/tcreator/writer.py b/tools/trace/tcreator/writer.py index 8bfaf0fb..eef1de63 100644 --- a/tools/trace/tcreator/writer.py +++ b/tools/trace/tcreator/writer.py @@ -1,11 +1,12 @@ import sys +import time from lib.traceclass import * class Writer: """Template writer""" - def __init__ (self, name, enum_name = "trace_id"): + def __init__ (self, name, enum_name): self.__name = name self.__enum_name = enum_name @@ -21,10 +22,20 @@ class Writer: f = open ('tcreator/template.h', 'r') template = f.read() f.close() - define = self.__name.replace('.', '_') + + if self.__name != None: + define = self.__name.replace('.', '_') + else: + define = "trace.h" template = template.replace('%%template%%', define) - template = template.replace('%%enum_name%%', self.__enum_name) + + if self.__enum_name == None: + template = template.replace('%%enum_name%%', "trace_id_t") + else: + template = template.replace('%%enum_name%%', self.__enum_name) + template = template.replace('%%data%%', string) + template = template.replace('%%year%%', time.strftime ('%Y')) return template diff --git a/tools/trace/tinter/thost.py b/tools/trace/tinter/thost.py index 5608874c..bbbdf0d0 100644 --- a/tools/trace/tinter/thost.py +++ b/tools/trace/tinter/thost.py @@ -1,2 +1,72 @@ -def thost_dump_memory(): - return "000000000100000002000301000000020000000300040200FEDA0056789A" +import serial +import time +from proto import * +from utils import * + +FLASH_MEMORY_HIGH = 0x1fffff +FLASH_BUFFER_SIZE = 128 +FLASH_CMD_INIT = 0 +FLASH_CMD_READ = 1 + +def flash_memory_addr (val): + return (val & FLASH_MEMORY_HIGH) + +def log (x): + print x + +class THost: + """Class to connect to the flash memory.""" + def __init__(self): + self.__proto = Proto (serial.Serial ('/dev/ttyACM0'), time.time, 0.1) + self.__memory = list() + self.__status = False + self.__addr_init = 0 + self.__addr_end = 0 + + def __dump_callback (self, *memory): + """Callback call on each data reception""" + for i in range(len (memory)): + self.__memory.append (memory[i]) + + def __flash_status (self, status): + """Get the flash status.""" + print "Flash activate : ", status + self.__status = status + + def __flash_log_init (self, *addr): + """Get the flash log start address.""" + # Don't request the code start + addr = reverse_tupple (addr) + self.__addr_init = get_size (addr, 3) + + def __flash_log_end (self, *addr): + """Get the flash log end address.""" + addr = reverse_tupple (addr) + self.__addr_end = get_size (addr, 3) + + def dump_memory(self): + """Dump the flash memory.""" + # Initialise the flash access. + self.__proto.register ('r', FLASH_BUFFER_SIZE * 'B', self.__dump_callback) + self.__proto.register ('s', 'b', self.__flash_status) + self.__proto.register ('i', 3*'B', self.__flash_log_init) + self.__proto.register ('e', 3*'B', self.__flash_log_end) + print "Callback registered" + print "Initialise the Flash memory" + self.__proto.send ('l', 'b', FLASH_CMD_INIT) + self.__proto.wait (lambda: True) + + if self.__status == True: + print "Dumping from " + str (self.__addr_init) + " to " + str (self.__addr_end) + + i = self.__addr_init + while i != self.__addr_end: + self.__proto.send ('l', 'bI', FLASH_CMD_READ, (i << 8) | FLASH_BUFFER_SIZE) + i = flash_memory_addr (i + FLASH_BUFFER_SIZE) + self.__proto.wait (lambda: True) + else: + self.__memory = None + + def get_trace (self): + """Return the traces dumped from the flash memory.""" + return reverse_tupple (self.__memory[4:len (self.__memory)]) diff --git a/tools/trace/tinter/tinter.py b/tools/trace/tinter/tinter.py index ecf99696..28197fd2 100644 --- a/tools/trace/tinter/tinter.py +++ b/tools/trace/tinter/tinter.py @@ -1,16 +1,20 @@ import sys from thost import * +from utils import * try: from lib.parser import * except: print "--> You should run yapps on lib/parser.g" + class TInter: - def __init__(self, infile): + def __init__(self, infile, outfile): self.__infile = infile self.__events = None + self.__outfile = outfile + self.__file = None def __events_get (self): infile = open (self.__infile, 'r') @@ -20,43 +24,37 @@ class TInter: def __event_print (self, events, memory): if len(memory) > 0: - cmd = int (memory[0:2], 16) - if cmd < len(events) - 1: + cmd = get_size (memory, 2) + if cmd < len(events): e = events[cmd] string = e.string_get() - memory = memory[2:len(memory)] for i in range (0, e.param_nb()): p = e.param_get(i) - size = p.length() * 2 - val = memory[0:size] - memory = memory[size:len(memory)] - string = string.replace('%d', str(int(val, 16)), 1) - return [memory, string] + size = p.length() + val = get_size (memory, size) + string = string.replace('%d', str(val), 1) + + if self.__file == None: + print string[1:len(string)-1] + else: + self.__file.write (string[1:len(string)-1] + "\n") + + return memory else: return None - def __get_last_trace (self, data): - while len (data): - memory = data.split('f33ff22f') - memory = memory[len(memory) - 1] - return memory - - def trace_print (self, file=None): + def trace_print (self): events = self.__events_get () + host = THost() + host.dump_memory() + memory = host.get_trace () - if file == None: - memory = thost_dump_memory() - else: - file = open (file, 'r') - memory = file.read() - file.close() - memory = self.__get_last_trace (memory) - - while len(memory) > 0: - data = self.__event_print(events, memory) - if data != None: - string = data[1] - memory = data[0] - print string[1:len(string)-1] - else: - memory = "" + if self.__outfile != None: + self.__file = open (self.__outfile, 'w') + self.__file.write ('APBTeam v1.0 Log interpretor\n') + + while memory != None: + memory = self.__event_print(events, memory) + + if self.__file != None: + self.__file.close () diff --git a/tools/trace/tinter/utils.py b/tools/trace/tinter/utils.py new file mode 100644 index 00000000..dd01eb5c --- /dev/null +++ b/tools/trace/tinter/utils.py @@ -0,0 +1,15 @@ +def get_size (mem, size): + if size == 1: + return mem.pop() + elif size == 2: + return ((mem.pop() << 8) | mem.pop()) + elif size == 3: + return ((mem.pop() << 16) | (mem.pop() << 8) | mem.pop()) + elif size == 4: + return ((mem.pop() << 24) | (mem.pop() << 16) | (mem.pop() << 8) | mem.pop()) + +def reverse_tupple (tupple): + mem = [] + for i in tupple: + mem = [i] + mem + return mem diff --git a/tools/trace/trace.py b/tools/trace/trace.py index 86bffb35..6850a4cd 100644 --- a/tools/trace/trace.py +++ b/tools/trace/trace.py @@ -1,45 +1,30 @@ #!/bin/usr/env python +from optparse import OptionParser import sys +sys.path.append ('../../host/') from tcreator.tcreator import * from tinter.tinter import * -def create_parse_args(list = None): - infile = "" - outfile = "" - enum_name = "" - if list == None: - return None - else: - for i in range (0, len(list)): - if list[i] == "-e": - enum_name = list[i+1] - if list[i] == "-o": - outfile = list[i+1] - else: - infile = list[i] - return [infile, outfile, enum_name] +print "Trace System v1.0 by APBTeam\n" +parser = OptionParser() +parser.add_option("-e", "--enum-name", dest="enum_name", + help="provide the enumerator name", metavar="ENUM") +parser.add_option("-o", "--output", dest="outfile", + help="Store the eunerator on the output file") +parser.add_option("-i", "--infile", dest="infile", + help="Read the data from the file") +parser.add_option("-t", "--type", dest="type", + help="create to create the enumeration, inter to read the log from the flash.") -print "Trace System v1.0 by APBTeam\n" +[options, args] = parser.parse_args() -if len(sys.argv) > 1: - argc = len(sys.argv) - if sys.argv[1] == "create": - if (argc >= 2) and (argc <= 7): - data = create_parse_args(sys.argv) - cre = TCreator (data[0], data[1], data[2]) - cre.create () - else: - raise Exception ("Not enough arguments") - if sys.argv[1] == "inter": - if argc >= 2: - inter = TInter (sys.argv[2]) - if argc == 2: - inter.trace_print(None) - else: - inter.trace_print(sys.argv[3]) - else: - raise Exception ("Not enough arguments") +if options.type == 'create': + cre = TCreator (options.infile, options.outfile, options.enum_name) + cre.create () +elif options.type == "inter": + inter = TInter (options.infile, options.outfile) + inter.trace_print() else: - raise Exception ("Not enough arguments") + print "see the help\n python trace --help" -- cgit v1.2.3