diff --git a/examples/energest-demo/Makefile b/examples/energest-demo/Makefile deleted file mode 100644 index 3c4403234..000000000 --- a/examples/energest-demo/Makefile +++ /dev/null @@ -1,55 +0,0 @@ - -ifndef CONTIKI -CONTIKI = ../.. -endif - -zip: all jar - rm -rf contiki-energest-demo - mkdir contiki-energest-demo - cp nodeid/*.ihex contiki-energest-demo - cp energest-demo.ihex contiki-energest-demo - cp README contiki-energest-demo - cp -r handouts contiki-energest-demo/ - mkdir contiki-energest-demo/tools - cp -r $(CONTIKI)/tools/sky contiki-energest-demo/tools - cp dist/*.jar contiki-energest-demo - cp Makefile.contiki-energest-demo contiki-energest-demo/Makefile - zip -r contiki-energest-demo.zip contiki-energest-demo - -all: burn-nodeids javaapp energest-demo.ihex - -upload: energest-demo.upload - -burn-nodeids: - (cd nodeid; $(MAKE)) - -rundemo: zip - cd contiki-energest-demo; make rundemo - -jar: - ant jar - -javaapp: - ant compile - -# Ensure that ./contiki-conf.h is included -CFLAGS+=-I. - -ifndef TARGET -TARGET=sky -endif - -ifdef UPDATE -CFLAGS += -DUPDATE_TICKS=CLOCK_SECOND*$(UPDATE) -else -CFLAGS += -DUPDATE_TICKS=CLOCK_SECOND -endif - -ifdef CHANNEL -CFLAGS += -DRF_CHANNEL=$(CHANNEL) -else -CFLAGS += -DRF_CHANNEL=20 -endif - - -include $(CONTIKI)/Makefile.include diff --git a/examples/energest-demo/Makefile.contiki-energest-demo b/examples/energest-demo/Makefile.contiki-energest-demo deleted file mode 100644 index d31cf089f..000000000 --- a/examples/energest-demo/Makefile.contiki-energest-demo +++ /dev/null @@ -1,13 +0,0 @@ -CONTIKI=. --include tools/sky/Makefile - -upload-node-%: - $(MAKE) sky-reset burn-nodeid-$*.upload - $(MAKE) sky-reset - sleep 10 - $(MAKE) sky-reset energest-demo.upload - -upload-sink: upload-node-41 - -rundemo: - java -jar energest.jar /dev/com${firstword $(CMOTES)} diff --git a/examples/energest-demo/README b/examples/energest-demo/README deleted file mode 100644 index 9b857714c..000000000 --- a/examples/energest-demo/README +++ /dev/null @@ -1,95 +0,0 @@ -This directory contains the compiled code for the Contiki energy -estimation demonstration for ACM SenSys 2007. More information is -available in the handouts/ directory and at the Contiki website: - - http://www.sics.se/contiki/ - -* INSTALLATION INSTRUCTIONS - -Cygwin and Java (JRE) needs to be installed. The demo has been tested -on Microsoft Windows, but probably works under Linux too. - -You need between two and eight Tmote Sky boards to run the demo: one -sink and between one and seven nodes. The nodes are numbered from 42 -to 48, and 41 is the sink node. - -Step 1: Unpack the zip file - - unzip contiki-energest-demo.zip - -Step 2: Change directory to the demo directory - - cd contiki-energest-demo - -Step 3: Connect the sink node to the PC. Remove all other Tmote Sky - nodes from the PC. - -Step 4: Upload Contiki to the sink: - - make upload-sink - -Step 5: Remove the sink node from the PC. - -Step 6: Connect one of the non-sink nodes to the PC - -Step 7: Upload Contiki to the node: - - make upload-node-42 - - This takes some time. The red LED should be lit when the - uploading is finished. We have found that in some cases brand - new Tmote Sky boards seem to cause a problem with Contiki and - the red LED does not light up. If so, try to wait a few - minutes (~10 minutes) with the Tmote Sky either inserted in - the PC, or powered with batteries. If the red LED goes on - after these minutes, repeat the "make upload-node-XX" to - upload Contiki again. - -Step 8: Remove the Tmote Sky from the PC. - -Step 9: Insert batteries into the Tmote Sky. The red LED should light - up. - -Step 10: Repeat step 6 to step 9 for all non-sink nodes. Replace "make - upload-node-42" with "make upload-node-43", "make - upload-node-44", and so on. - -Step 11: Insert the sink node to the PC again. - -Step 12: Run the Java program: - - make rundemo - - NOTE: this uses the first Tmote Sky it finds as a - sink. Therefore, make sure that only one Tmote Sky (the sink) is - inserted. - -Step 13: Push the "user" button on the Tmote Skys and watch their - power consumption go up and down. - - -* DEMO DESCRIPTION - -Contiki continuously estimates the energy consumption of the -system. In this demonstration, seven Tmote Sky nodes, running Contiki, -estimates their energy consumption and send their power to a sink -node. The sink node is connected to the PC, and reports the nodes' -power to a Java program. The Java program shows the nodes' power -consumption for the last second. - -When pushing the button on the nodes, they cycle through seven states -as below. This is reflected by their power consumption, as shown in -the Java program. The different states are: - -* Red LED: sending one packet per second -* Green LED: radio listen 1% duty cycle -* Green, red LEDs: radio listen 10% duty cycle -* Blue LED: radio listen 100% -* Blue, red LEDs: radio listen 10%, CPU low-power mode disabled -* Blue, green LEDs: sending data 1.2 kilobytes/second -* Blue, green, red LEDs: sending data 12 kilobytes/second - -When sending data, the radio is turned on for a while before the -transmission to check if it is possible to send the packet. This is -the reason why energy is spent on radio listening even when the nodes -are only sending data. diff --git a/examples/energest-demo/build.xml b/examples/energest-demo/build.xml deleted file mode 100644 index 83a38aef0..000000000 --- a/examples/energest-demo/build.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - -Examples: - -> ant run -Dargs="com1" -Starts demo application listening on COM1 and tracking the first node. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/energest-demo/contiki-conf.h b/examples/energest-demo/contiki-conf.h deleted file mode 100644 index 81bb655ea..000000000 --- a/examples/energest-demo/contiki-conf.h +++ /dev/null @@ -1,190 +0,0 @@ -/* -*- C -*- */ -/* @(#)$Id: contiki-conf.h,v 1.6 2009/09/07 11:31:26 nifi Exp $ */ - -#ifndef CONTIKI_CONF_H -#define CONTIKI_CONF_H - -#define SHELL_VARS_CONF_RAM_BEGIN 0x1100 -#define SHELL_VARS_CONF_RAM_END 0x2000 - -#define TIMESYNCH_CONF_ENABLED 1 -#define SIMPLE_CC2420_CONF_TIMESTAMPS 1 - -#define PROFILE_CONF_ON 1 -#define ENERGEST_CONF_ON 1 - -#define HAVE_STDINT_H -#include "msp430def.h" - -#ifndef RF_CHANNEL -#define RF_CHANNEL 26 -#endif /* RF_CHANNEL */ - -#define ELFLOADER_CONF_DATAMEMORY_SIZE 0x1800 -#define ELFLOADER_CONF_TEXTMEMORY_SIZE 0x1000 - -#define IRQ_PORT1 0x01 -#define IRQ_PORT2 0x02 -#define IRQ_ADC 0x03 - -#define CCIF -#define CLIF - -#define CC_CONF_INLINE inline - -#define AODV_COMPLIANCE -#define AODV_NUM_RT_ENTRIES 32 - -#define TMOTE_SKY 1 -#define WITH_ASCII 1 - -/*#define PROCESS_CONF_FASTPOLL 4*/ - -/* CPU target speed in Hz */ -#define F_CPU 2457600uL - -/* Our clock resolution, this is the same as Unix HZ. */ -#define CLOCK_CONF_SECOND 64 - -#define BAUD2UBR(baud) ((F_CPU/baud)) - -#define UIP_CONF_DHCP_LIGHT -#define UIP_CONF_LLH_LEN 0 -#define UIP_CONF_BUFFER_SIZE 116 -#define UIP_CONF_RECEIVE_WINDOW (UIP_CONF_BUFFER_SIZE - 40) -#define UIP_CONF_MAX_CONNECTIONS 4 -#define UIP_CONF_MAX_LISTENPORTS 8 -#define UIP_CONF_UDP_CONNS 12 -#define UIP_CONF_FWCACHE_SIZE 30 -#define UIP_CONF_BROADCAST 1 -#define UIP_ARCH_IPCHKSUM 1 -#define UIP_CONF_UDP_CHECKSUMS 1 -#define UIP_CONF_PINGADDRCONF 0 -#define UIP_CONF_LOGGING 0 - -/* - * Definitions below are dictated by the hardware and not really - * changeable! - */ - -/* LED ports */ -#define LEDS_PxDIR P5DIR -#define LEDS_PxOUT P5OUT -#define LEDS_CONF_RED 0x10 -#define LEDS_CONF_GREEN 0x20 -#define LEDS_CONF_YELLOW 0x40 - -/* Button sensors. */ -#define IRQ_PORT2 0x02 - -typedef unsigned short uip_stats_t; -typedef unsigned short clock_time_t; - -typedef unsigned long off_t; -#define ROM_ERASE_UNIT_SIZE 512 -#define XMEM_ERASE_UNIT_SIZE (64*1024L) - -#define XMAC_CONF_ON_TIME RTIMER_ARCH_SECOND / 100 -#define XMAC_CONF_OFF_TIME RTIMER_ARCH_SECOND / 10 - -/* Use the first 64k of external flash for node configuration */ -#define NODE_ID_XMEM_OFFSET (0 * XMEM_ERASE_UNIT_SIZE) - -/* Use the second 64k of external flash for codeprop. */ -#define EEPROMFS_ADDR_CODEPROP (1 * XMEM_ERASE_UNIT_SIZE) - -#define CFS_XMEM_CONF_OFFSET (2 * XMEM_ERASE_UNIT_SIZE) -#define CFS_XMEM_CONF_SIZE (1 * XMEM_ERASE_UNIT_SIZE) - -#define CFS_RAM_CONF_SIZE 4096 - -/* - * SPI bus configuration for the TMote Sky. - */ - -/* SPI input/output registers. */ -#define SPI_TXBUF U0TXBUF -#define SPI_RXBUF U0RXBUF - - /* USART0 Tx ready? */ -#define SPI_WAITFOREOTx() while ((U0TCTL & TXEPT) == 0) - /* USART0 Rx ready? */ -#define SPI_WAITFOREORx() while ((IFG1 & URXIFG0) == 0) - /* USART0 Tx buffer ready? */ -#define SPI_WAITFORTxREADY() while ((IFG1 & UTXIFG0) == 0) - -#define SCK 1 /* P3.1 - Output: SPI Serial Clock (SCLK) */ -#define MOSI 2 /* P3.2 - Output: SPI Master out - slave in (MOSI) */ -#define MISO 3 /* P3.3 - Input: SPI Master in - slave out (MISO) */ - -/* - * SPI bus - M25P80 external flash configuration. - */ - -#define FLASH_PWR 3 /* P4.3 Output */ -#define FLASH_CS 4 /* P4.4 Output */ -#define FLASH_HOLD 7 /* P4.7 Output */ - -/* Enable/disable flash access to the SPI bus (active low). */ - -#define SPI_FLASH_ENABLE() ( P4OUT &= ~BV(FLASH_CS) ) -#define SPI_FLASH_DISABLE() ( P4OUT |= BV(FLASH_CS) ) - -#define SPI_FLASH_HOLD() ( P4OUT &= ~BV(FLASH_HOLD) ) -#define SPI_FLASH_UNHOLD() ( P4OUT |= BV(FLASH_HOLD) ) - -/* - * SPI bus - CC2420 pin configuration. - */ - -#define FIFO_P 0 /* P1.0 - Input: FIFOP from CC2420 */ -#define FIFO 3 /* P1.3 - Input: FIFO from CC2420 */ -#define CCA 4 /* P1.4 - Input: CCA from CC2420 */ - -#define SFD 1 /* P4.1 - Input: SFD from CC2420 */ -#define CSN 2 /* P4.2 - Output: SPI Chip Select (CS_N) */ -#define VREG_EN 5 /* P4.5 - Output: VREG_EN to CC2420 */ -#define RESET_N 6 /* P4.6 - Output: RESET_N to CC2420 */ - -/* Pin status. */ - -#define FIFO_IS_1 (!!(P1IN & BV(FIFO))) -#define CCA_IS_1 (!!(P1IN & BV(CCA) )) -#define RESET_IS_1 (!!(P4IN & BV(RESET_N))) -#define VREG_IS_1 (!!(P4IN & BV(VREG_EN))) -#define FIFOP_IS_1 (!!(P1IN & BV(FIFO_P))) -#define SFD_IS_1 (!!(P4IN & BV(SFD))) - -/* The CC2420 reset pin. */ -#define SET_RESET_INACTIVE() ( P4OUT |= BV(RESET_N) ) -#define SET_RESET_ACTIVE() ( P4OUT &= ~BV(RESET_N) ) - -/* CC2420 voltage regulator enable pin. */ -#define SET_VREG_ACTIVE() ( P4OUT |= BV(VREG_EN) ) -#define SET_VREG_INACTIVE() ( P4OUT &= ~BV(VREG_EN) ) - -/* CC2420 rising edge trigger for external interrupt 0 (FIFOP). */ -#define FIFOP_INT_INIT() do {\ - P1IES &= ~BV(FIFO_P);\ - CLEAR_FIFOP_INT();\ -} while (0) - -/* FIFOP on external interrupt 0. */ -#define ENABLE_FIFOP_INT() do { P1IE |= BV(FIFO_P); } while (0) -#define DISABLE_FIFOP_INT() do { P1IE &= ~BV(FIFO_P); } while (0) -#define CLEAR_FIFOP_INT() do { P1IFG &= ~BV(FIFO_P); } while (0) - -/* Enables/disables CC2420 access to the SPI bus (not the bus). - * - * These guys should really be renamed but are compatible with the - * original Chipcon naming. - * - * SPI_CC2420_ENABLE/SPI_CC2420_DISABLE??? - * CC2420_ENABLE_SPI/CC2420_DISABLE_SPI??? - */ - -#define SPI_ENABLE() ( P4OUT &= ~BV(CSN) ) /* ENABLE CSn (active low) */ -#define SPI_DISABLE() ( P4OUT |= BV(CSN) ) /* DISABLE CSn (active low) */ - - -#endif /* CONTIKI_CONF_H */ diff --git a/examples/energest-demo/contiki-sky-main.c b/examples/energest-demo/contiki-sky-main.c deleted file mode 100644 index 093a93104..000000000 --- a/examples/energest-demo/contiki-sky-main.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2006, Swedish Institute of Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)$Id: contiki-sky-main.c,v 1.10 2010/01/15 11:02:18 nifi Exp $ - */ - -#include -#include -#include - -#include - -#include "contiki.h" - -#include "dev/battery-sensor.h" -#include "dev/button-sensor.h" -#include "dev/light-sensor.h" -#include "dev/sht11-sensor.h" -#include "dev/ds2411.h" -#include "dev/sht11.h" -#include "dev/leds.h" -#include "dev/light.h" -#include "dev/xmem.h" -#include "dev/cc2420.h" - -#include "dev/slip.h" -#include "dev/uart1.h" - -#include "net/mac/xmac.h" -#include "net/mac/nullmac.h" - -#include "node-id.h" - -#include "net/rime.h" - -#include "sys/autostart.h" - -/*#include "codeprop/codeprop.h"*/ - -SENSORS(&button_sensor, &light_sensor, &battery_sensor, &sht11_sensor); - -extern int lpm_en; - -#define WITH_UIP 0 - -#if WITH_UIP -static struct uip_fw_netif slipif = -{UIP_FW_NETIF(192,168,1,2, 255,255,255,255, slip_send)}; -#endif /* WITH_UIP */ - -/*---------------------------------------------------------------------------*/ -#if 0 -int -force_float_inclusion() -{ - extern int __fixsfsi; - extern int __floatsisf; - extern int __mulsf3; - extern int __subsf3; - - return __fixsfsi + __floatsisf + __mulsf3 + __subsf3; -} -#endif -/*---------------------------------------------------------------------------*/ -void uip_log(char *msg) { puts(msg); } -/*---------------------------------------------------------------------------*/ -/* Radio stuff in network byte order. */ -static u16_t panId = 0x2024; - -#ifndef RF_CHANNEL -#error define RF_CHANNEL! -#endif - -/*---------------------------------------------------------------------------*/ -void -force_inclusion(int d1, int d2) -{ - snprintf(NULL, 0, "%d", d1 % d2); -} -/*---------------------------------------------------------------------------*/ -static void -set_rime_addr(void) -{ - rimeaddr_t addr; - addr.u8[0] = node_id & 0xff; - addr.u8[1] = node_id >> 8; - rimeaddr_set_node_addr(&addr); -} -/*---------------------------------------------------------------------------*/ -static void -print_processes(struct process * const processes[]) -{ - printf("Starting"); - while(*processes != NULL) { - printf(" '%s'", (*processes)->name); - processes++; - } - putchar('\n'); -} -/*---------------------------------------------------------------------------*/ -int -main(int argc, char **argv) -{ - /* - * Initalize hardware. - */ - msp430_cpu_init(); - clock_init(); - leds_init(); - leds_toggle(LEDS_RED | LEDS_GREEN | LEDS_BLUE); - -#if WITH_UIP - slip_arch_init(BAUD2UBR(115200)); /* Must come before first printf */ -#else /* WITH_UIP */ - uart1_init(BAUD2UBR(115200)); /* Must come before first printf */ -#endif /* WITH_UIP */ - - printf("Starting %s " - "($Id: contiki-sky-main.c,v 1.10 2010/01/15 11:02:18 nifi Exp $)\n", __FILE__); - ds2411_init(); - - xmem_init(); - leds_toggle(LEDS_RED | LEDS_GREEN | LEDS_BLUE); - - rtimer_init(); - /* - * Hardware initialization done! - */ - - /* Restore node id if such has been stored in external mem */ -// node_id_burn(3); - node_id_restore(); - printf("node_id : %hu\n", node_id); - - printf("MAC %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", - ds2411_id[0], ds2411_id[1], ds2411_id[2], ds2411_id[3], - ds2411_id[4], ds2411_id[5], ds2411_id[6], ds2411_id[7]); - -#if WITH_UIP - uip_init(); - uip_sethostaddr(&slipif.ipaddr); - uip_setnetmask(&slipif.netmask); - uip_fw_default(&slipif); /* Point2point, no default router. */ -#endif /* WITH_UIP */ - - /* - * Initialize Contiki and our processes. - */ - process_init(); - process_start(&etimer_process, NULL); - process_start(&sensors_process, NULL); - - /* - * Initialize light and humidity/temp sensors. - */ - - SENSORS_ACTIVATE(light_sensor); - SENSORS_ACTIVATE(sht11_sensor); - - ctimer_init(); - - set_rime_addr(); - - cc2420_init(); - cc2420_set_pan_addr(panId, 0 /*XXX*/, ds2411_id); - cc2420_set_channel(RF_CHANNEL); - - cc2420_set_txpower(31); - nullmac_init(&cc2420_driver); - rime_init(&nullmac_driver); -// xmac_init(&cc2420_driver); -// rime_init(&xmac_driver); - - /* rimeaddr_set_node_addr*/ -#if WITH_UIP - process_start(&tcpip_process, NULL); - process_start(&uip_fw_process, NULL); /* Start IP output */ - process_start(&slip_process, NULL); -#endif /* WITH_UIP */ - - SENSORS_ACTIVATE(button_sensor); - - print_processes(autostart_processes); - autostart_start(autostart_processes); - - energest_init(); - - /* - * This is the scheduler loop. - */ - printf("process_run()...\n"); - ENERGEST_ON(ENERGEST_TYPE_CPU); - while (1) { - do { - /* Reset watchdog. */ - } while(process_run() > 0); - - /* - * Idle processing. - */ - if(lpm_en) { - int s = splhigh(); /* Disable interrupts. */ - if(process_nevents() != 0) { - splx(s); /* Re-enable interrupts. */ - } else { - - static unsigned long irq_energest = 0; - /* Re-enable interrupts and go to sleep atomically. */ - ENERGEST_OFF(ENERGEST_TYPE_CPU); - ENERGEST_ON(ENERGEST_TYPE_LPM); - /* We only want to measure the processing done in IRQs when we - are asleep, so we discard the processing time done when we - were awake. */ - energest_type_set(ENERGEST_TYPE_IRQ, irq_energest); - _BIS_SR(GIE | SCG0 | /*SCG1 |*/ CPUOFF); /* LPM3 sleep. */ - /* We get the current processing time for interrupts that was - done during the LPM and store it for next time around. */ - dint(); - irq_energest = energest_type_time(ENERGEST_TYPE_IRQ); - eint(); - ENERGEST_OFF(ENERGEST_TYPE_LPM); - ENERGEST_ON(ENERGEST_TYPE_CPU); - } - } - } - - return 0; -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/energest-demo/energest-demo.c b/examples/energest-demo/energest-demo.c deleted file mode 100644 index 5e3440b26..000000000 --- a/examples/energest-demo/energest-demo.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (c) 2007, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - * $Id: energest-demo.c,v 1.9 2010/01/15 11:02:18 nifi Exp $ - */ - -/** - * \file - * Contiki application sending estimated energy to a sink node - * \author - * Zhitao He - */ - -#include "contiki.h" -#include "net/rime.h" -#include "net/mac/mac.h" -#include "net/mac/nullmac.h" -#include "dev/button-sensor.h" - -#include "dev/cc2420.h" - -#include "dev/leds.h" -#include "node-id.h" -#include - -#define SINK_ID 41 -/*---------------------------------------------------------------------------*/ -PROCESS(output_process, "output energest"); -PROCESS(user_process, "user input"); -AUTOSTART_PROCESSES( - &output_process, - &user_process - ); -/*---------------------------------------------------------------------------*/ -static struct abc_conn abc; -static u16_t read = 0; -static u16_t send = 0; - -int lpm_en; -static int radio_off; -static int computing; -static int sending; - -enum states{ - RADIO_OFF = 1, - RADIO_LOW, - RADIO_MID, - RADIO_FULL, - LPM_OFF, - SENDING1k, - SENDING12k, -}; - -struct energy_time { - unsigned short source; - long cpu; - long lpm; - long transmit; - long listen; -}; - -static struct energy_time last; -static struct energy_time diff; - -// FIXME: workaround to turn on/off radio. Rime should export an MAC on/off interface to avoid forcing the user to do this explicitly -static const struct mac_driver *mac = &nullmac_driver; - -static clock_time_t sleep_cycles; -static const char send_string[] = "I am a sending string."; -static int send_length = 10; -static int send_amount = 10; -/*---------------------------------------------------------------------------*/ -static void -abc_recv(struct abc_conn *c) -{ - struct energy_time *incoming= (struct energy_time *)packetbuf_dataptr(); - read++; - if(node_id == SINK_ID) { - printf("%i SICS %i %u %li %li %li %li\n", node_id, read, - incoming->source, incoming->cpu, incoming->lpm, - incoming->transmit, incoming->listen); - } -} -/*---------------------------------------------------------------------------*/ -const static struct abc_callbacks abc_call = {abc_recv}; -/*---------------------------------------------------------------------------*/ -static void -do_computing(void) -{ - int i; - for(i = 0; i < 100; i++) { - clock_delay(1000); - } -} -/*---------------------------------------------------------------------------*/ -static void -do_sending(void) -{ - int i; - - cc2420_set_channel(11); - cc2420_set_txpower(1); - - for(i = 0;i < send_amount; i++) { - packetbuf_copyfrom(send_string, send_length); - - mac->on(); - abc_send(&abc); - mac->off(0); - } - cc2420_set_txpower(31); - cc2420_set_channel(RF_CHANNEL); -} -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(output_process, ev, data) -{ - static struct etimer et, et2; - - PROCESS_EXITHANDLER(abc_close(&abc);) - - PROCESS_BEGIN(); - - etimer_set(&et, 5*CLOCK_SECOND); - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); - - /* Energy time init */ - last.cpu = energest_type_time(ENERGEST_TYPE_CPU); - last.lpm = energest_type_time(ENERGEST_TYPE_LPM); - last.transmit = energest_type_time(ENERGEST_TYPE_TRANSMIT); - last.listen = energest_type_time(ENERGEST_TYPE_LISTEN); - - abc_open(&abc, 128, &abc_call); - - if (node_id == SINK_ID) { - while(1) { - PROCESS_YIELD(); - printf("I'm a sink. I'm doing nothing..."); - } - } - - etimer_set(&et, UPDATE_TICKS); - - while(1) { - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); - - if(computing) { - do_computing(); - } - - /* stop-start ongoing time measurements to retrieve the diffs - during last interval */ - ENERGEST_OFF(ENERGEST_TYPE_CPU); - ENERGEST_ON(ENERGEST_TYPE_CPU); - mac->on(); - mac->off(0); - - /* Energy time diff */ - diff.source = node_id; - diff.cpu = energest_type_time(ENERGEST_TYPE_CPU) - last.cpu; - diff.lpm = energest_type_time(ENERGEST_TYPE_LPM) - last.lpm; - diff.transmit = energest_type_time(ENERGEST_TYPE_TRANSMIT) - last.transmit; - diff.listen = energest_type_time(ENERGEST_TYPE_LISTEN) - last.listen; - last.cpu = energest_type_time(ENERGEST_TYPE_CPU); - last.lpm = energest_type_time(ENERGEST_TYPE_LPM); - last.transmit = energest_type_time(ENERGEST_TYPE_TRANSMIT); - last.listen = energest_type_time(ENERGEST_TYPE_LISTEN); - - send++; -/* printf("%i SICS %i %i %li %li %li %li\n", node_id, send, */ -/* diff.source, diff.cpu, diff.lpm, diff.transmit, diff.listen); */ - - packetbuf_copyfrom((char*)&diff, sizeof(diff)); - - mac->on(); - abc_send(&abc); - - if(sending) { - mac->off(0); - do_sending(); - } else if(radio_off) { - mac->off(0); - } else { - mac->off(0); - etimer_set(&et2, sleep_cycles); - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et2)); - mac->on(); - } - - etimer_reset(&et); - } - - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ -static enum states -next_state(enum states current_state) -{ - return current_state == 7 ? current_state = 1 : current_state + 1; -} -/*---------------------------------------------------------------------------*/ -static void -show_state(enum states current_state) -{ - printf("state = %d\n", current_state); - switch(current_state) { - case 1: - leds_off(LEDS_BLUE);leds_off(LEDS_GREEN);leds_on(LEDS_RED); - break; - - case 2: - leds_off(LEDS_BLUE);leds_on(LEDS_GREEN);leds_off(LEDS_RED); - break; - - case 3: - leds_off(LEDS_BLUE);leds_on(LEDS_GREEN);leds_on(LEDS_RED); - break; - - case 4: - leds_on(LEDS_BLUE);leds_off(LEDS_GREEN);leds_off(LEDS_RED); - break; - - case 5: - leds_on(LEDS_BLUE);leds_off(LEDS_GREEN);leds_on(LEDS_RED); - break; - - case 6: - leds_on(LEDS_BLUE);leds_on(LEDS_GREEN);leds_off(LEDS_RED); - break; - - case 7: - leds_on(LEDS_BLUE);leds_on(LEDS_GREEN);leds_on(LEDS_RED); - break; - - default: - printf("unknown state\n"); - } -} -/*---------------------------------------------------------------------------*/ -static void -run_state(enum states current_state) -{ - switch(current_state) { - case RADIO_OFF: - lpm_en = 1; - radio_off = 1; - sleep_cycles = 0; - computing = 0; - sending = 0; - break; - - case RADIO_LOW: - lpm_en = 1; - radio_off = 0; - sleep_cycles = UPDATE_TICKS * 99 / 100; - computing = 0; - sending = 0; - break; - - case RADIO_MID: - lpm_en = 1; - radio_off = 0; - sleep_cycles = UPDATE_TICKS * 90 / 100; - computing = 0; - sending = 0; - break; - - case RADIO_FULL: - lpm_en = 1; - radio_off = 0; - sleep_cycles = 0; - computing = 0; - sending = 0; - break; - - case LPM_OFF: - lpm_en = 0; - radio_off = 0; - sleep_cycles = UPDATE_TICKS * 90 / 100; - computing = 0; - sending = 0; - break; - - case SENDING1k: - lpm_en = 1; - radio_off = 0; - sleep_cycles = UPDATE_TICKS * 99 / 100; - computing = 0; - sending = 1; - send_amount = 10; - send_length = 100; - break; - - case SENDING12k: - lpm_en = 1; - radio_off = 0; - sleep_cycles = UPDATE_TICKS * 90 / 100; - computing = 0; - sending = 1; - send_amount = 100; - send_length = 100; - break; - - default: - ; - } -} -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(user_process, ev, data) -{ - static enum states state; - - PROCESS_BEGIN(); - - printf("Node id %d\n", node_id); - - SENSORS_ACTIVATE(button_sensor); - state = RADIO_OFF; - - while(1) { - show_state(state); - run_state(state); - - PROCESS_WAIT_EVENT(); - if(ev == sensors_event && data == &button_sensor) { - state = next_state(state); - } - - } - - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/energest-demo/handouts/demo-handout.ppt b/examples/energest-demo/handouts/demo-handout.ppt deleted file mode 100644 index 13e7d47f1..000000000 Binary files a/examples/energest-demo/handouts/demo-handout.ppt and /dev/null differ diff --git a/examples/energest-demo/handouts/demo-poster.ppt b/examples/energest-demo/handouts/demo-poster.ppt deleted file mode 100644 index 2104ca286..000000000 Binary files a/examples/energest-demo/handouts/demo-poster.ppt and /dev/null differ diff --git a/examples/energest-demo/handouts/dunkels07demo.pdf b/examples/energest-demo/handouts/dunkels07demo.pdf deleted file mode 100644 index 49afd40b6..000000000 Binary files a/examples/energest-demo/handouts/dunkels07demo.pdf and /dev/null differ diff --git a/examples/energest-demo/handouts/dunkels07softwarebased.pdf b/examples/energest-demo/handouts/dunkels07softwarebased.pdf deleted file mode 100644 index 563281001..000000000 Binary files a/examples/energest-demo/handouts/dunkels07softwarebased.pdf and /dev/null differ diff --git a/examples/energest-demo/handouts/itea-handout.doc b/examples/energest-demo/handouts/itea-handout.doc deleted file mode 100644 index 777957db5..000000000 Binary files a/examples/energest-demo/handouts/itea-handout.doc and /dev/null differ diff --git a/examples/energest-demo/lib/jcommon-1.0.10.jar b/examples/energest-demo/lib/jcommon-1.0.10.jar deleted file mode 100644 index bd37fb61e..000000000 Binary files a/examples/energest-demo/lib/jcommon-1.0.10.jar and /dev/null differ diff --git a/examples/energest-demo/lib/jfreechart-1.0.6.jar b/examples/energest-demo/lib/jfreechart-1.0.6.jar deleted file mode 100644 index e8f145f74..000000000 Binary files a/examples/energest-demo/lib/jfreechart-1.0.6.jar and /dev/null differ diff --git a/examples/energest-demo/nodeid/Makefile b/examples/energest-demo/nodeid/Makefile deleted file mode 100644 index c76e12e9e..000000000 --- a/examples/energest-demo/nodeid/Makefile +++ /dev/null @@ -1,15 +0,0 @@ - -burn-nodeid-%.ihex: - $(MAKE) nodeid=$* burn-nodeid.ihex && mv burn-nodeid.ihex $@ - -burn-nodeids: $(foreach NODEID, 41 42 43 44 45 46 47 48, burn-nodeid-$(NODEID).ihex) - -ifndef CONTIKI -CONTIKI = ../../.. -endif - -ifndef TARGET -TARGET=sky -endif - -include $(CONTIKI)/Makefile.include diff --git a/examples/energest-demo/src/Demo.java b/examples/energest-demo/src/Demo.java deleted file mode 100644 index 5fab7d721..000000000 --- a/examples/energest-demo/src/Demo.java +++ /dev/null @@ -1,694 +0,0 @@ -/* - * Copyright (c) 2007, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - * $Id: Demo.java,v 1.4 2008/07/02 14:12:48 adamdunkels Exp $ - */ - -/** - * \file - * Java program showing energy estimates from a Contiki app - * \author - * Fredrik Österlind - */ - -import java.awt.BorderLayout; -import java.awt.Font; -import java.awt.GraphicsEnvironment; -import java.awt.GridLayout; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -import java.awt.image.BufferedImage; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Vector; -import javax.swing.ImageIcon; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.Timer; - -import org.jfree.chart.ChartFactory; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.axis.ValueAxis; -import org.jfree.chart.plot.PlotOrientation; -import org.jfree.data.category.DefaultCategoryDataset; -import org.jfree.data.general.DefaultPieDataset; -import org.jfree.data.time.Second; -import org.jfree.data.time.TimeSeries; -import org.jfree.data.time.TimeSeriesCollection; - -public class Demo extends JPanel { - public static final boolean REPLAY_TEMP_DATA = false; - - public static final int TOTAL_HEIGHT = 300; - public static final int TOTAL_WIDTH = 900; - - public static final String SERIALDUMP_WINDOWS = "./tools/sky/serialdump-windows.exe"; - public static final String SERIALDUMP_LINUX = "./tools/sky/serialdump-linux"; - - public static final int HISTORY_MAX_SECONDS = 120; - - public static final int NODE_HEIGHT = 300; - public static final int NODE_WIDTH = 450; - - public static final int NUMBER_NODES = 7; - public static final int NODE_IDS[] = {42, 43, 44, 45, 46, 47, 48}; - public static final String CATEGORIES[] = {"LPM", "CPU", "Radio listen", "Radio transmit"}; - - public static final int PARSE_NR_COMPONENTS = 8; - public static final int PARSE_POS_SINK_ID = 0; - public static final int PARSE_POS_SICS_ID = 1; - public static final int PARSE_POS_COUNT = 2; - public static final int PARSE_POS_SOURCE_ID = 3; - public static final int PARSE_POS_TIME_CPU = 4; - public static final int PARSE_POS_TIME_LPM = 5; - public static final int PARSE_POS_TIME_TRANSMIT = 6; - public static final int PARSE_POS_TIME_LISTEN = 7; - public static final String PARSE_SICS_ID = "SICS"; - - public static final double TICKS_PER_SECOND = 4096; /* TODO Convert from TimerB ticks to seconds */ - public static final double UPDATE_PERIOD = 1; /* TODO Set update period (1 second?) */ - - /* CC2420 has 8.5 (-25dBm), 9.9 (-15dBm), 11 (-10dBm), 14 (-5dBm) and 17.4 (0dBm) */ - public static final int CHARTS_MAX_MILLIWATTS = 70; - public static final double VOLTAGE = 3; - public static final double POWER_CPU = 1.800 * VOLTAGE; /* mW */ - public static final double POWER_LPM = 0.0545 * VOLTAGE; /* mW */ - public static final double POWER_TRANSMIT = 17.7 * VOLTAGE; /* mW */ - public static final double POWER_LISTEN = 20.0 * VOLTAGE; /* mW */ - - public static final int MA_HISTORY_LENGTH = 40; - - private Process serialDumpProcess; - - private Vector historyLPM = new Vector(); - private Vector historyCPU = new Vector(); - private Vector historyListen = new Vector(); - private Vector historyTransmit = new Vector(); - - private int trackedNodeIndex = 0; /* Currently tracked node index */ - - private String comPort; - private JFrame frame; - - private TimeSeries nodeHistorySerie; - private JFreeChart nodeHistoryChart; - private JLabel nodeHistoryLabel; - - private JFreeChart relativeChart; - private JLabel relativeLabel; - private DefaultPieDataset relativeDataset; - - private JFreeChart totalChart; - private DefaultCategoryDataset totalDataset; - private JLabel totalLabel; - private int categoryOrder = 0; - - public Demo(String comPort) { - this.comPort = comPort; - - System.out.println("Demo application listening on COM port: " + comPort); - - /* Make sure we have nice window decorations */ - JFrame.setDefaultLookAndFeelDecorated(true); - JDialog.setDefaultLookAndFeelDecorated(true); - Rectangle maxSize = GraphicsEnvironment.getLocalGraphicsEnvironment() - .getMaximumWindowBounds(); - - /* Create and set up the window */ - frame = new JFrame("Sensor Node Power Profiling with Contiki (ACM SenSys 2007)"); - if (maxSize != null) { - frame.setMaximizedBounds(maxSize); - } - frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - - frame.addWindowListener(new WindowListener() { - public void windowDeactivated(WindowEvent e) { - } - - public void windowIconified(WindowEvent e) { - } - - public void windowDeiconified(WindowEvent e) { - } - - public void windowOpened(WindowEvent e) { - } - - public void windowClosed(WindowEvent e) { - } - - public void windowActivated(WindowEvent e) { - } - - public void windowClosing(WindowEvent e) { - /* TODO Clean up resources */ - if (serialDumpProcess != null) { - try { - serialDumpProcess.destroy(); - } catch (Exception ex) { - System.err.println("Serialdump process exception: " + ex.getMessage()); - } - } - System.exit(0); - } - }); - - frame.setContentPane(this); - - /* Create charts */ - createAllCharts(); - - /* Add charts */ - this.setLayout(new BorderLayout()); - JPanel contentPanel = new JPanel(new GridLayout(2, 1)); - add(contentPanel); - - JPanel upperPanel = new JPanel(new GridLayout()); - totalLabel.setAlignmentX(JPanel.CENTER_ALIGNMENT); - upperPanel.add(totalLabel); - contentPanel.add(upperPanel); - - JPanel lowerPanel = new JPanel(new GridLayout(1, 2)); - relativeLabel.setAlignmentX(JPanel.CENTER_ALIGNMENT); - lowerPanel.add(relativeLabel); - nodeHistoryLabel.setAlignmentX(JPanel.CENTER_ALIGNMENT); - lowerPanel.add(nodeHistoryLabel); - contentPanel.add(lowerPanel); - - JLabel advertisementLabel = new JLabel("Sensor Node Power Profiling with Contiki", - JLabel.CENTER); - advertisementLabel.setFont(new Font("Sans-serif", Font.BOLD, 40)); - JLabel urlLabel = new JLabel("http://www.sics.se/contiki/", - JLabel.CENTER); - urlLabel.setFont(new Font("Monospace", Font.BOLD, 36)); - - add(advertisementLabel, BorderLayout.NORTH); - add(urlLabel, BorderLayout.SOUTH); - - /* Display the window */ - frame.pack(); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - - if (!REPLAY_TEMP_DATA) { - connectToCOMPort(); - } - Timer updateTimer = new Timer(500, null); - updateTimer.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { -// parseIncomingLine(TEMP_NODE_DATA[TEMP_COUNTER]); -// TEMP_COUNTER = (TEMP_COUNTER + 1) % TEMP_NODE_DATA.length; - try { - updateCharts(); - } catch(Exception eeeee) {} - } - }); - updateTimer.start(); - - if (REPLAY_TEMP_DATA) { - // Timer updateTimer = new Timer(1000, null); - updateTimer.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - parseIncomingLine(TEMP_NODE_DATA[TEMP_COUNTER]); - TEMP_COUNTER = (TEMP_COUNTER + 1) % TEMP_NODE_DATA.length; - updateCharts(); - } - }); - updateTimer.start(); - } - } - - public void connectToCOMPort() { - /* Connect to COM using external serialdump application */ - String osName = System.getProperty("os.name").toLowerCase(); - String fullCommand; - if (osName.startsWith("win")) { - fullCommand = SERIALDUMP_WINDOWS + " " + "-b115200" + " " + comPort; - } else { - fullCommand = SERIALDUMP_LINUX + " " + "-b115200" + " " + comPort; - } - - try { - String[] cmd = fullCommand.split(" "); - - serialDumpProcess = Runtime.getRuntime().exec(cmd); - final BufferedReader input = new BufferedReader(new InputStreamReader(serialDumpProcess.getInputStream())); - final BufferedReader err = new BufferedReader(new InputStreamReader(serialDumpProcess.getErrorStream())); - - /* Start thread listening on stdout */ - Thread readInput = new Thread(new Runnable() { - public void run() { - String line; - try { - while ((line = input.readLine()) != null) { - parseIncomingLine(line); - } - input.close(); - System.out.println("Serialdump process shut down, exiting"); - System.exit(1); - } catch (IOException e) { - System.err.println("Exception when reading from serialdump"); - e.printStackTrace(); - System.exit(1); - } - } - }, "read input stream thread"); - - /* Start thread listening on stderr */ - Thread readError = new Thread(new Runnable() { - public void run() { - String line; - try { - while ((line = err.readLine()) != null) { - System.err.println("Serialdump error stream> " + line); - } - err.close(); - } catch (IOException e) { - System.err.println("Exception when reading from serialdump"); - e.printStackTrace(); - System.exit(1); - } - } - }, "read error stream thread"); - - readInput.start(); - readError.start(); - - } catch (Exception e) { - System.err.println("Exception when executing '" + fullCommand + "'"); - System.err.println("Exiting demo application"); - e.printStackTrace(); - System.exit(1); - } - } - - public void createAllCharts() { - BufferedImage image; - - /* Create total power history chart for tracked node */ - nodeHistoryLabel = new JLabel(); - createHistoryChartForNode(nodeHistoryLabel, trackedNodeIndex); - - /* Create moving average relative power distribution chart */ - relativeDataset = new DefaultPieDataset(); - for (String category: CATEGORIES) { - relativeDataset.setValue(category, 0); - } - relativeChart = ChartFactory.createPieChart("Moving Average: Relative power distribution", relativeDataset, false, false, false); - image = relativeChart.createBufferedImage(NODE_WIDTH,NODE_HEIGHT); - relativeLabel = new JLabel(); - relativeLabel.setIcon(new ImageIcon(image)); - - /* Create chart with power of all nodes */ - totalDataset = new DefaultCategoryDataset(); - for (int i=0; i < NUMBER_NODES; i++) { - for (String category: CATEGORIES) { - totalDataset.addValue(0, category, getNodeNameFromIndex(i)); - } - } - totalChart = ChartFactory.createStackedBarChart(null, null, "Power (mW)", totalDataset, PlotOrientation.VERTICAL, true, true, true); - ValueAxis rangeAxis = totalChart.getCategoryPlot().getRangeAxis(); - // rangeAxis.setRange(0, CHARTS_MAX_MILLIWATTS); - - image = totalChart.createBufferedImage(TOTAL_WIDTH,TOTAL_HEIGHT); - totalLabel = new JLabel(); - totalLabel.setIcon(new ImageIcon(image)); - - MouseListener categoryChangeListener = new MouseListener() { - public void mouseClicked(MouseEvent e) { - System.out.println("Toggling category order"); - - categoryOrder++; - totalDataset.clear(); - for (int i=0; i < NUMBER_NODES; i++) { - for (int j=0; j < CATEGORIES.length; j++) { - totalDataset.addValue(0, CATEGORIES[(j + categoryOrder) % CATEGORIES.length], getNodeNameFromIndex(i)); - } - } - totalChart = ChartFactory.createStackedBarChart(null, null, "Power (mW)", totalDataset, PlotOrientation.VERTICAL, true, true, true); - ValueAxis rangeAxis = totalChart.getCategoryPlot().getRangeAxis(); -// rangeAxis.setRange(0, CHARTS_MAX_MILLIWATTS); - - relativeDataset.clear(); - for (int i=0; i < NUMBER_NODES; i++) { - for (int j=0; j < CATEGORIES.length; j++) { - relativeDataset.setValue(CATEGORIES[(j + categoryOrder) % CATEGORIES.length], 0.00001); - } - } - relativeChart = ChartFactory.createPieChart("Moving Average: Relative power distribution", relativeDataset, false, false, false); - - updateCharts(); - } - public void mousePressed(MouseEvent e) { - } - public void mouseReleased(MouseEvent e) { - } - public void mouseEntered(MouseEvent e) { - } - public void mouseExited(MouseEvent e) { - } - }; - totalLabel.addMouseListener(categoryChangeListener); - relativeLabel.addMouseListener(categoryChangeListener); - - MouseListener toggleTrackedListener = new MouseListener() { - public void mouseClicked(MouseEvent e) { - trackedNodeIndex = (trackedNodeIndex + 1) % NODE_IDS.length; - System.out.println("Tracking " + getNodeNameFromIndex(trackedNodeIndex)); - - createHistoryChartForNode(nodeHistoryLabel, trackedNodeIndex); - - updateCharts(); - } - public void mousePressed(MouseEvent e) { - } - public void mouseReleased(MouseEvent e) { - } - public void mouseEntered(MouseEvent e) { - } - public void mouseExited(MouseEvent e) { - } - }; - nodeHistoryLabel.addMouseListener(toggleTrackedListener); - } - - public void createHistoryChartForNode(JLabel label, int index) { - BufferedImage image; - - /* Create history */ - nodeHistorySerie = new TimeSeries("", Second.class); - nodeHistorySerie.removeAgedItems(true); - nodeHistorySerie.setMaximumItemCount(HISTORY_MAX_SECONDS); - TimeSeriesCollection historyData = new TimeSeriesCollection(nodeHistorySerie); - nodeHistoryChart = ChartFactory.createTimeSeriesChart(getNodeNameFromIndex(index) + ": Total power (mW)", null, null, historyData, false, false, false); - ValueAxis rangeAxis = nodeHistoryChart.getXYPlot().getRangeAxis(); - rangeAxis.setRange(0, CHARTS_MAX_MILLIWATTS); - image = nodeHistoryChart.createBufferedImage(NODE_WIDTH,NODE_HEIGHT); - label.setIcon(new ImageIcon(image)); - } - - public void addHistoryPower(double newPower) { - if (nodeHistorySerie != null) { - nodeHistorySerie.addOrUpdate(new Second(), newPower); - } - } - - public void updateTotalPower(String category, String nodeName, double newValue) { - if (totalDataset != null) { - totalDataset.addValue(newValue, category, nodeName); - } - } - - public void updateTotalPowers(String nodeName, double lpm, double cpu, double listen, double transmit) { - updateTotalPower(CATEGORIES[0], nodeName, lpm); - updateTotalPower(CATEGORIES[1], nodeName, cpu); - updateTotalPower(CATEGORIES[2], nodeName, listen); - updateTotalPower(CATEGORIES[3], nodeName, transmit); - } - - public void setRelativePower(String category, double newVal) { - if (relativeDataset != null) { - relativeDataset.setValue(category, newVal); - } - } - - public void setRelativePowers(double lpm, double cpu, double listen, double transmit) { - setRelativePower(CATEGORIES[0], lpm); - setRelativePower(CATEGORIES[1], cpu); - setRelativePower(CATEGORIES[2], listen); - setRelativePower(CATEGORIES[3], transmit); - } - - public void updateMARelativePowers(double lpm, double cpu, double listen, double transmit) { - /* Add new values */ - historyLPM.add(lpm); - historyCPU.add(cpu); - historyListen.add(listen); - historyTransmit.add(transmit); - - /* Remove old values (if any) */ - if (historyLPM.size() > MA_HISTORY_LENGTH) { - historyLPM.remove(0); - } - if (historyCPU.size() > MA_HISTORY_LENGTH) { - historyCPU.remove(0); - } - if (historyListen.size() > MA_HISTORY_LENGTH) { - historyListen.remove(0); - } - if (historyTransmit.size() > MA_HISTORY_LENGTH) { - historyTransmit.remove(0); - } - - /* Calculate average */ - double lpmMA = 0; - for (double power: historyLPM) { - lpmMA += power; - } - lpmMA /= historyLPM.size(); - - double cpuMA = 0; - for (double power: historyCPU) { - cpuMA += power; - } - cpuMA /= historyCPU.size(); - - double transmitMA = 0; - for (double power: historyTransmit) { - transmitMA += power; - } - transmitMA /= historyTransmit.size(); - - double listenMA = 0; - for (double power: historyListen) { - listenMA += power; - } - listenMA /= historyListen.size(); - - setRelativePowers(lpmMA, cpuMA, listenMA, transmitMA); - } - - - public void parseIncomingLine(String line) { - if (line == null) { - System.err.println("Parsing null line"); - return; - } - - /* Split line into components */ - String[] components = line.split(" "); - if (components.length != PARSE_NR_COMPONENTS) { - System.err.println("Parsing wrong components count (" + components.length + "): '" + line + "'"); - return; - } - - /* Parse source and components times */ - int sinkNodeID=-1, sourceNodeID=-1, timeCPU=-1, timeLPM=-1, timeTransmit=-1, timeListen=-1; - try { - sinkNodeID = Integer.parseInt(components[PARSE_POS_SINK_ID]); - if (!components[PARSE_POS_SICS_ID].equals(PARSE_SICS_ID)) { - throw new Exception("Parsing non-demo data: '" + line + "'"); - } - /*Integer.parseInt(components[PARSE_POS_COUNT]);*/ - sourceNodeID = Integer.parseInt(components[PARSE_POS_SOURCE_ID]); - timeCPU = Integer.parseInt(components[PARSE_POS_TIME_CPU]); - timeLPM = Integer.parseInt(components[PARSE_POS_TIME_LPM]); - timeTransmit = Integer.parseInt(components[PARSE_POS_TIME_TRANSMIT]); - /* TODO Too big transmit time? */ - timeListen = Integer.parseInt(components[PARSE_POS_TIME_LISTEN]); - } catch (Exception e) { - System.err.println(e.getMessage()); - return; - } - - /* Validate parsed values */ - String nodeName = getNodeNameFromId(sourceNodeID); - if (nodeName == null) { - System.err.println("No registered node with ID " + sourceNodeID + ": '" + line + "'"); - return; - } - if (timeCPU < 0) { - System.err.println("Parsed negative CPU time (" + timeCPU + "): '" + line + "'"); - return; - } - if (timeLPM < 0) { - System.err.println("Parsed negative LPM time (" + timeLPM + "): '" + line + "'"); - return; - } - if (timeTransmit < 0) { - System.err.println("Parsed negative transmit time (" + timeTransmit + "): '" + line + "'"); - return; - } - if (timeListen < 0) { - System.err.println("Parsed negative listen time (" + timeListen + "): '" + line + "'"); - return; - } - - /* Calculate component specific powers using parsed times */ - double powerCPU = (timeCPU / TICKS_PER_SECOND) * POWER_CPU / UPDATE_PERIOD; - double powerLPM = (timeLPM / TICKS_PER_SECOND)* POWER_LPM / UPDATE_PERIOD; - double powerTransmit = (timeTransmit / TICKS_PER_SECOND)* POWER_TRANSMIT / UPDATE_PERIOD; - double powerListen = (timeListen / TICKS_PER_SECOND) * POWER_LISTEN / UPDATE_PERIOD; - - /* Update node history */ - if (getNodeNameFromId(sourceNodeID).equals(getNodeNameFromIndex(trackedNodeIndex))) { - System.out.println("Parsed data from tracked " + nodeName); - addHistoryPower(powerCPU + powerLPM + powerTransmit + powerListen); - } else { - System.out.println("Parsed data from " + nodeName); - } - - updateMARelativePowers(powerLPM, powerCPU, powerListen, powerTransmit); - - updateTotalPowers(nodeName, powerLPM, powerCPU, powerListen, powerTransmit); - - // updateCharts(); - } - - - public void updateCharts() { - BufferedImage image; - - /* Recreate all label icons */ - /* TODO Only update changed charts: i */ - if (relativeLabel != null) { - image = relativeChart.createBufferedImage(NODE_WIDTH,NODE_HEIGHT); - relativeLabel.setIcon(new ImageIcon(image)); - } - if (nodeHistoryLabel != null) { - image = nodeHistoryChart.createBufferedImage(NODE_WIDTH,NODE_HEIGHT); - nodeHistoryLabel.setIcon(new ImageIcon(image)); - } - if (totalLabel != null) { - image = totalChart.createBufferedImage(TOTAL_WIDTH,TOTAL_HEIGHT); - totalLabel.setIcon(new ImageIcon(image)); - } - - repaint(); - } - - - public String getNodeNameFromIndex(int index) { - return "Node " + NODE_IDS[index]; - } - - public static String getNodeNameFromId(int id) { - boolean exists = false; - for (int existingID: NODE_IDS) { - if (existingID == id) { - exists = true; - break; - } - } - - if (!exists) { - System.err.println("Node " + id + " is not registered!"); - return null; - } - return "Node " + id; - } - - - public static void main(final String[] args) { - if (args.length != 1) { - System.err.println("Usage: java Demo COMPORT [TRACK_NODE_ID]"); - return; - } - - final String comPort = args[0]; - - javax.swing.SwingUtilities.invokeLater(new Runnable() { - public void run() { - new Demo(comPort); - } - }); - } - - /* TEMPORARY DATA */ - int TEMP_COUNTER = 0; - String[] TEMP_NODE_DATA = { - "33 S 1 33 3 0 4093 0", - "33 R 1 34 44 0 4052 0", - "33 S 2 33 77 0 4019 0", - "33 S 3 33 39 0 4057 0", - "33 R 2 34 39 0 4057 0", - "33 S 4 33 78 0 4018 0", - "33 R 3 34 80 0 4016 0", - "33 S 5 33 83 0 4013 0", - "33 R 4 34 80 0 4015 0", - "33 S 6 33 90 0 4006 0", - "33 S 7 33 40 0 4056 0", - "33 R 5 34 87 0 4009 0", - "33 S 8 33 80 0 4016 0", - "33 R 6 34 130 0 3965 0", - "33 S 9 33 81 0 4015 0", - "33 S 10 33 39 0 4057 0", - "33 R 7 34 87 0 4009 0", - "33 S 11 33 89 0 4007 0", - "33 R 8 34 94 0 4002 0", - "33 S 12 33 89 0 4007 0", - "33 R 9 34 47 0 4049 0", - "33 S 13 33 83 0 4013 0", - "33 R 10 34 82 0 4014 0", - "33 S 14 33 90 0 4006 0", - "33 R 11 34 94 0 3999 0", - "33 S 15 33 92 0 4004 0", - "33 S 16 33 46 0 4050 0", - "33 R 12 34 132 0 3964 0", - "33 R 13 34 46 0 4050 0", - "33 S 17 33 140 0 3956 0", - "33 R 14 34 86 0 4009 0", - "33 S 18 33 85 0 4010 0", - "33 R 15 34 94 0 4002 0", - "33 S 19 33 83 0 4013 0", - "33 S 20 33 41 0 4055 0", - "33 R 16 34 41 0 4055 0", - "33 S 21 33 86 0 4009 0", - "33 R 17 34 86 0 4010 0", - "33 R 18 34 84 0 4012 0", - "33 S 22 33 127 0 3969 0", - "33 R 19 34 84 0 4012 0", - "33 S 23 33 85 0 4011 0", - "33 S 24 33 44 0 4052 0", - "33 R 20 34 41 0 4055 0", - "33 S 25 33 86 0 4010 0", - "33 S 26 33 47 0 4048 0", - "33 R 21 34 94 0 4000 0", - "33 S 27 33 89 0 4004 0" - }; -}