summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNélio Laranjeiro2010-04-12 00:10:43 +0200
committerNélio Laranjeiro2010-04-12 00:10:43 +0200
commit3f9ec36bf414b08ac2ee0f62927997b8e0c127cb (patch)
tree17a6dfc9bb865081ed5a8b2b6d634b3e0d187720
parent0eb3874c27be75da36f39093ecfb603dc8fe7012 (diff)
{tools/trace, digital/avr/modules/trace}: print trace on host execution, closes #92
-rw-r--r--digital/avr/modules/trace/Makefile.module2
-rw-r--r--digital/avr/modules/trace/test/Makefile6
-rw-r--r--digital/avr/modules/trace/test/flood.c2
-rw-r--r--digital/avr/modules/trace/test/test-trace.c4
-rw-r--r--digital/avr/modules/trace/trace.h12
-rw-r--r--tools/trace/example/trace.trc4
-rw-r--r--tools/trace/tcreator/tcreator.py20
-rw-r--r--tools/trace/tcreator/template.c (renamed from digital/avr/modules/trace/test/events.h)19
-rw-r--r--tools/trace/tcreator/template.h16
-rw-r--r--tools/trace/tcreator/writer.py78
-rw-r--r--tools/trace/tinter/tinter.py3
-rw-r--r--tools/trace/trace.py13
12 files changed, 107 insertions, 72 deletions
diff --git a/digital/avr/modules/trace/Makefile.module b/digital/avr/modules/trace/Makefile.module
index e5fcdfc2..2465f835 100644
--- a/digital/avr/modules/trace/Makefile.module
+++ b/digital/avr/modules/trace/Makefile.module
@@ -1 +1 @@
-trace_SOURCES=trace.c
+trace_SOURCES=trace.c events.host.c
diff --git a/digital/avr/modules/trace/test/Makefile b/digital/avr/modules/trace/test/Makefile
index c3ea960e..dec8b36b 100644
--- a/digital/avr/modules/trace/test/Makefile
+++ b/digital/avr/modules/trace/test/Makefile
@@ -1,4 +1,5 @@
BASE = ../../..
+TOOLS= $(BASE)/../../tools
AVR_PROGS = test_trace flood
HOST_PROGS = test_trace flood
@@ -13,4 +14,9 @@ AVR_MCU = atmega128
# -Os : size
OPTIMIZE = -O2
+events:
+ python $(TOOLS)/trace/trace.py -i $(TOOLS)/trace/example/trace.trc -t create -o
+ mv events.h ..
+ mv events.host.c ..
+
include $(BASE)/make/Makefile.gen
diff --git a/digital/avr/modules/trace/test/flood.c b/digital/avr/modules/trace/test/flood.c
index 6cc88a32..7675808a 100644
--- a/digital/avr/modules/trace/test/flood.c
+++ b/digital/avr/modules/trace/test/flood.c
@@ -26,12 +26,12 @@
#include "io.h"
#include "modules/flash/flash.h"
#include "modules/trace/trace.h"
+#include "modules/trace/events.h"
#include "modules/proto/proto.h"
#include "modules/utils/utils.h"
#include "modules/utils/byte.h"
#include "modules/uart/uart.h"
-#include "events.h"
void
flood (void)
diff --git a/digital/avr/modules/trace/test/test-trace.c b/digital/avr/modules/trace/test/test-trace.c
index 932b99a5..7bfde18b 100644
--- a/digital/avr/modules/trace/test/test-trace.c
+++ b/digital/avr/modules/trace/test/test-trace.c
@@ -28,14 +28,12 @@
#include "io.h"
#include "modules/flash/flash.h"
#include "modules/trace/trace.h"
+#include "modules/trace/events.h"
#include "modules/proto/proto.h"
#include "modules/utils/utils.h"
#include "modules/utils/byte.h"
#include "modules/uart/uart.h"
-
-#include "events.h"
-
void
flood (void)
{
diff --git a/digital/avr/modules/trace/trace.h b/digital/avr/modules/trace/trace.h
index ce83bdaa..069f5e7c 100644
--- a/digital/avr/modules/trace/trace.h
+++ b/digital/avr/modules/trace/trace.h
@@ -28,6 +28,7 @@
* You can find the example on the website :
* http://gcc.gnu.org/ml/gcc-patches/2000-11/msg00016.html
*/
+#include "modules/trace/events.h"
#define PASTE_EXPAND(a, b) PASTE(a, b)
#define PASTE(a, b) a ## b
@@ -40,8 +41,19 @@
#define _TRACE_ARGS_COUNT2(_ ,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9, n,...) n
+#ifndef HOST
#define TRACE(args...) \
PASTE_EXPAND(TRACE_PRINT, TRACE_ARGS_COUNT(args...)) (args)
+#else /* HOST */
+#include <stdio.h>
+extern char *trace_table[];
+#define TRACE(id, args...) \
+ do {\
+ fprintf (stderr, trace_table[id], ## args);\
+ PASTE_EXPAND(TRACE_PRINT, TRACE_ARGS_COUNT(id, ## args...))\
+ (id, ## args);\
+ } while (0)
+#endif /* HOST */
#define TRACE_PRINT1(args)\
({TRACE_PRINT_ARG_TYPE(args);})
diff --git a/tools/trace/example/trace.trc b/tools/trace/example/trace.trc
index cb9e9bdb..96644f4a 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 asserv__right_motor speed 4 position 4 acceleration 2 "Right motor speed : %d, position : %d, acceleration : %d\n"
+EVENT asserv__left_motor speed 4 position 4 acceleration 2 "Left motor speed : %d, position : %d, acceleration : %d\n"
EVENT ia__ia_cmd arg1 2 arg2 2 arg3 4 [ia]
diff --git a/tools/trace/tcreator/tcreator.py b/tools/trace/tcreator/tcreator.py
index d0d8807c..45778ace 100644
--- a/tools/trace/tcreator/tcreator.py
+++ b/tools/trace/tcreator/tcreator.py
@@ -7,20 +7,18 @@ except:
print "--> You should run yapps on lib/parser.g"
class TCreator:
- def __init__(self, infile, outfile, enum_name = "trace_id_t"):
+ def __init__(self, infile):
self.__infile = infile
- self.__outfile = outfile
- self.__enum_name = enum_name
- def create (self):
+ def create (self, outfile):
infile = open (self.__infile, 'r')
data = parse ('parser', infile.read())
infile.close()
-
- w = Writer (self.__outfile, self.__enum_name)
- outstring = w.parse_list (data)
-
- if self.__outfile != None:
- w.write_file (outstring)
+ w = Writer ()
+ id_table = w.parse_event_identifiers (data)
+ string_table = w.parse_event_string (data)
+ string_table_nb = str (len (data))
+ if outfile:
+ w.write_file (id_table, string_table, string_table_nb)
else:
- w.print_file (outstring)
+ w.print_file (id_table, string_table, string_table_nb)
diff --git a/digital/avr/modules/trace/test/events.h b/tools/trace/tcreator/template.c
index d5a972a1..d3f4eaec 100644
--- a/digital/avr/modules/trace/test/events.h
+++ b/tools/trace/tcreator/template.c
@@ -1,9 +1,7 @@
-#ifndef events_h
-#define events_h
-/* events_h */
-/* {{{
+/* events.c */
+/* avr.trace - AVR TRACE use. {{{
*
- * Copyright (C) 2008 APBTeam
+ * Copyright (C) 2010 APBTeam
*
* APBTeam:
* Web: http://apbteam.org/
@@ -24,13 +22,8 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* }}} */
+#include "modules/trace/events.h"
-enum events_t
-{
- TRACE_ASSERV__RIGHT_MOTOR,
- TRACE_ASSERV__LEFT_MOTOR,
- TRACE_IA__IA_CMD,
- TRACE_NB
+char *trace_table[%%NB%%] = {
+%%DATA%%
};
-
-#endif /* events_h */
diff --git a/tools/trace/tcreator/template.h b/tools/trace/tcreator/template.h
index 3e83692e..aa62d8eb 100644
--- a/tools/trace/tcreator/template.h
+++ b/tools/trace/tcreator/template.h
@@ -1,6 +1,6 @@
-#ifndef %%template%%
-#define %%template%%
-/* %%template%% */
+#ifndef events_h
+#define events_h
+/* trace_events_h */
/* {{{
*
* Copyright (C) %%year%% APBTeam
@@ -25,9 +25,13 @@
*
* }}} */
-enum %%enum_name%%
+enum trace_id_t
{
-%%data%%
+%%ids%%
};
-#endif /* %%template%% */
+#ifndef HOST
+extern char *trace_table[%%NB%%];
+#endif /* !HOST */
+
+#endif /* events_h */
diff --git a/tools/trace/tcreator/writer.py b/tools/trace/tcreator/writer.py
index 8e6d70b3..db5fc21e 100644
--- a/tools/trace/tcreator/writer.py
+++ b/tools/trace/tcreator/writer.py
@@ -9,45 +9,73 @@ templatedir = os.path.split (__file__)[0]
class Writer:
"""Template writer"""
- def __init__ (self, name, enum_name):
- self.__name = name
- self.__enum_name = enum_name
+ def __init__ (self):
+ self.__header_name = "events.h"
+ self.__file_name = "events.host.c"
- def parse_list (self, event_list = None):
+ def parse_event_identifiers (self, event_list = None):
+ """Parse the event list and construct a string to embedded in a
+ header file."""
if event_list != None:
string = ""
+ prefix = " "
for i in range (0, len (event_list)):
- string += " TRACE_" + event_list[i].name() + ",\n"
- string += " TRACE_NB"
+ string += prefix + "TRACE_" + event_list[i].name() + ",\n"
+ string += prefix + "TRACE_NB"
return string.upper()
- def __read_template__ (self, string):
+ def __parse_event_string_cb (self, event):
+ """Create a default string interpretation for callbacks events."""
+ assert event.callback
+ string = "\"" + event.name ()
+ for i in range (event.param_nb ()):
+ string += " %d"
+ string += "\\n\","
+ return string
+
+ def parse_event_string (self, event_list = None):
+ """Parse the event list and construct a string containing on each line
+ the string interpretation for a human."""
+ if event_list != None:
+ string = ""
+ prefix = " "
+ for i in event_list:
+ if i.callback:
+ string += prefix + self.__parse_event_string_cb (i)
+ else:
+ string += prefix + i.string_get () + ",\n"
+ return string
+
+ def __read_template_header (self, string, string_nb):
f = open (templatedir + '/template.h', 'r')
template = f.read()
f.close()
-
- if self.__name != None:
- define = self.__name.replace('.', '_')
- else:
- define = "trace.h"
- template = template.replace('%%template%%', define)
-
- 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('%%ids%%', string)
template = template.replace('%%year%%', time.strftime ('%Y'))
+ template = template.replace('%%NB%%', string_nb);
return template
+ def __read_template_file (self, string_table, string_nb):
+ f = open (templatedir + '/template.c', 'r')
+ template = f.read()
+ f.close()
+ template = template.replace('%%NB%%', string_nb);
+ template = template.replace('%%DATA%%', string_table)
+ return template
- def write_file (self, string):
- template = self.__read_template__(string)
- f = open (self.__name, 'w')
+ def __write (self, template, outfile):
+ f = open (outfile, 'w')
f.write (template)
f.close()
- def print_file (self, string):
- template = self.__read_template__(string)
+ def write_file (self, id_table, string_table, string_table_nb):
+ template = self.__read_template_header (id_table, string_table_nb)
+ self.__write (template, self.__header_name)
+ template = self.__read_template_file (string_table, string_table_nb)
+ self.__write (template, self.__file_name)
+
+ def print_file (self, id_table, string_table, string_table_nb):
+ template = self.__read_template_header (id_table, string_table_nb)
+ print template
+ template = self.__read_template_file (string_table, string_table_nb)
print template
diff --git a/tools/trace/tinter/tinter.py b/tools/trace/tinter/tinter.py
index 8efd12c1..f2387644 100644
--- a/tools/trace/tinter/tinter.py
+++ b/tools/trace/tinter/tinter.py
@@ -10,10 +10,9 @@ except:
class TInter:
- def __init__(self, infile, outfile, prgm, cb = None):
+ def __init__(self, infile, prgm, cb = None):
self.__infile = infile
self.__events = None
- self.__outfile = outfile
self.__file = None
self.__host = THost(prgm)
diff --git a/tools/trace/trace.py b/tools/trace/trace.py
index 4e252ddb..d3d2736c 100644
--- a/tools/trace/trace.py
+++ b/tools/trace/trace.py
@@ -12,11 +12,8 @@ print "Trace System by APBTeam\n"
usage = "usage: %prog [options] [host program]"
parser = OptionParser(usage=usage)
-parser.add_option("-e", "--enum-name", dest="enum_name",
- help="provide the enumerator name" + CREATE_MODE,
- metavar="ENUM")
-parser.add_option("-o", "--output", dest="outfile",
- help="Store the enumerator on the output file" + CREATE_MODE)
+parser.add_option("-o", "--output", dest="outfile", action="store_true",
+ help="generate events.h and events.c files" + CREATE_MODE)
parser.add_option("-i", "--infile", dest="infile",
help="Read the data from the file")
parser.add_option("-t", "--type", dest="type",
@@ -33,10 +30,10 @@ if options.type == "inter":
assert args
if options.type == 'create':
- cre = TCreator (options.infile, options.outfile, options.enum_name)
- cre.create ()
+ cre = TCreator (options.infile)
+ cre.create (options.outfile)
elif options.type == "inter":
- inter = TInter (options.infile, options.outfile, args[0], options.cb)
+ inter = TInter (options.infile, args[0], options.cb)
if options.list_trace:
inter.available_traces ()
elif options.trace != None: