From 2186d70c5918c4b9ada4d13bc9628f570835a799 Mon Sep 17 00:00:00 2001 From: adamdunkels Date: Tue, 23 Feb 2010 18:22:16 +0000 Subject: [PATCH] Added per-packet power profile tracing --- apps/powertrace/powertrace.c | 77 +++++++++++++++++++++++++++++++++--- apps/powertrace/powertrace.h | 9 ++++- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/apps/powertrace/powertrace.c b/apps/powertrace/powertrace.c index a7c9971c2..9dbcdfd64 100644 --- a/apps/powertrace/powertrace.c +++ b/apps/powertrace/powertrace.c @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: powertrace.c,v 1.1 2010/02/20 14:15:45 adamdunkels Exp $ + * $Id: powertrace.c,v 1.2 2010/02/23 18:22:16 adamdunkels Exp $ */ /** @@ -41,6 +41,8 @@ #include "contiki.h" #include "sys/compower.h" #include "node-id.h" +#include "powertrace.h" +#include "net/rime.h" #include @@ -81,11 +83,11 @@ print_power(void) node_id, seqno++, cpu, lpm, transmit, listen, idle_transmit, idle_listen, (int)((100L * (transmit + listen)) / time), - (int)((10000L * (transmit + listen) / time) - (100L * (transmit + listen)) / time), - (int)((100L * (transmit)) / time), - (int)((10000L * (transmit)) / time - (100L * (transmit)) / time), - (int)((100L * (listen)) / time), - (int)((10000L * (listen)) / time - (100L * (listen)) / time)); + (int)((10000L * (transmit + listen) / time) - (100L * (transmit + listen) / time) * 100), + (int)((100L * transmit) / time), + (int)((10000L * transmit) / time - (100L * transmit / time) * 100), + (int)((100L * listen) / time), + (int)((10000L * listen) / time - (100L * listen / time) * 100)); } /*---------------------------------------------------------------------------*/ PROCESS_THREAD(powertrace_process, ev, data) @@ -116,3 +118,66 @@ powertrace_start(clock_time_t period) process_start(&powertrace_process, (void *)&period); } /*---------------------------------------------------------------------------*/ +static void +sniffprint(char *prefix, int seqno) +{ + const rimeaddr_t *sender, *receiver, *esender, *ereceiver; + + sender = packetbuf_addr(PACKETBUF_ADDR_SENDER); + receiver = packetbuf_addr(PACKETBUF_ADDR_RECEIVER); + esender = packetbuf_addr(PACKETBUF_ADDR_ESENDER); + ereceiver = packetbuf_addr(PACKETBUF_ADDR_ERECEIVER); + + + printf("%s %d %u %d %d %d.%d %u %u\n", + prefix, + node_id, seqno, + packetbuf_attr(PACKETBUF_ATTR_CHANNEL), + packetbuf_attr(PACKETBUF_ATTR_PACKET_TYPE), + esender->u8[0], esender->u8[1], + packetbuf_attr(PACKETBUF_ATTR_TRANSMIT_TIME), + packetbuf_attr(PACKETBUF_ATTR_LISTEN_TIME)); +} +/*---------------------------------------------------------------------------*/ +static void +input_sniffer(void) +{ + static int seqno = 0; + sniffprint("I", seqno++); + + if(packetbuf_attr(PACKETBUF_ATTR_CHANNEL) == 0) { + int i; + uint8_t *dataptr; + + printf("x %d ", packetbuf_totlen()); + dataptr = packetbuf_hdrptr(); + printf("%02x ", dataptr[0]); + for(i = 1; i < packetbuf_totlen(); ++i) { + printf("%02x ", dataptr[i]); + } + printf("\n"); + } +} +/*---------------------------------------------------------------------------*/ +static void +output_sniffer(void) +{ + static int seqno = 0; + sniffprint("O", seqno++); +} +/*---------------------------------------------------------------------------*/ +RIME_SNIFFER(s, input_sniffer, output_sniffer); +/*---------------------------------------------------------------------------*/ +void +powertrace_sniff(powertrace_onoff_t onoff) +{ + switch(onoff) { + case POWERTRACE_ON: + rime_sniffer_add(&s); + break; + case POWERTRACE_OFF: + rime_sniffer_remove(&s); + break; + } +} +/*---------------------------------------------------------------------------*/ diff --git a/apps/powertrace/powertrace.h b/apps/powertrace/powertrace.h index cefa6854c..59b989c11 100644 --- a/apps/powertrace/powertrace.h +++ b/apps/powertrace/powertrace.h @@ -28,7 +28,7 @@ * * This file is part of the Contiki operating system. * - * $Id: powertrace.h,v 1.1 2010/02/20 14:15:45 adamdunkels Exp $ + * $Id: powertrace.h,v 1.2 2010/02/23 18:22:16 adamdunkels Exp $ */ /** @@ -45,4 +45,11 @@ void powertrace_start(clock_time_t perioc); +typedef enum { + POWERTRACE_ON, + POWERTRACE_OFF +} powertrace_onoff_t; + +void powertrace_sniff(powertrace_onoff_t onoff); + #endif /* POWERTRACE_H */