diff --git a/examples/sky/Makefile b/examples/sky/Makefile index aba2bb3a1..f66dff5a1 100644 --- a/examples/sky/Makefile +++ b/examples/sky/Makefile @@ -11,4 +11,10 @@ all: blink sky-collect #rt-leds test-button test-cfs tcprudolph0 echo $(basename $<)/$(basename $<).ihex 600 > $(basename $<)/runfile ; \ tar czf $@ $(basename $<) +%.class: %.java + javac $(basename $<).java + +viewrssi: ViewRSSI.class + make login | java ViewRSSI + include $(CONTIKI)/Makefile.include diff --git a/examples/sky/ViewRSSI.java b/examples/sky/ViewRSSI.java new file mode 100644 index 000000000..6451eb560 --- /dev/null +++ b/examples/sky/ViewRSSI.java @@ -0,0 +1,86 @@ +/** + * RSSI Viewer - view RSSI values of 802.15.4 channels + * --------------------------------------------------- + * Note: run the rssi-scanner on a Sky or sentilla node connected to USB + * then start with + * make login | java ViewRSSI + * + * Created: Fri Apr 24 00:40:01 2009, Joakim Eriksson + * + * @author Joakim Eriksson, SICS + * @version 1.0 + */ +import javax.swing.*; +import java.awt.*; +import java.io.*; +public class ViewRSSI extends JPanel { + + private int[] rssi = new int[80]; + private int[] rssiMax = new int[80]; + + /* this is the max value of the RSSI from the cc2420 */ + private static final int RSSI_MAX_VALUE = 200; + + public ViewRSSI() { + } + + public void paint(Graphics g) { + int h = getHeight(); + int w = getWidth(); + g.clearRect(0, 0, 300, h); + double factor = (h - 20.0) / RSSI_MAX_VALUE; + double sSpacing = (w - 15 ) / 80.0; + int sWidth = (int) (sSpacing - 1); + if (sWidth == 0) sWidth = 1; + + g.setColor(Color.gray); + double xpos = 10; + for (int i = 0, n = rssi.length; i < n; i++) { + int rssi = (int) (rssiMax[i] * factor); + g.fillRect((int) xpos, h - 20 - rssi, + sWidth, rssi + 1); + xpos += sSpacing; + } + + g.setColor(Color.black); + xpos = 10; + for (int i = 0, n = rssi.length; i < n; i++) { + int rssiVal = (int) (rssi[i] * factor); + g.fillRect((int) xpos, h - 20 - rssiVal, + sWidth, rssiVal + 1); + xpos += sSpacing; + } + } + + private void handleInput() throws IOException { + BufferedReader reader = + new BufferedReader(new InputStreamReader(System.in)); + while(true) { + String line = reader.readLine(); + if (line.startsWith("RSSI:")) { + try { + String[] parts = line.split(" "); + for (int i = 1, n = parts.length; i < n; i++) { + rssi[i] = 3 * Integer.parseInt(parts[i]); + if (rssi[i] > rssiMax[i]) rssiMax[i] = rssi[i]; + else if (rssiMax[i] > 0) rssiMax[i]--; + } + } catch (Exception e) { + /* report but do not fail... */ + e.printStackTrace(); + } + repaint(); + } + } + } + + public static void main(String[] args) throws IOException { + JFrame win = new JFrame("RSSI Viewer"); + ViewRSSI panel; + win.setBounds(10, 10, 300, 300); + win.getContentPane().add(panel = new ViewRSSI()); + win.setVisible(true); + + panel.handleInput(); + } +} diff --git a/examples/sky/rssi-scanner.c b/examples/sky/rssi-scanner.c new file mode 100644 index 000000000..5a0fffcbb --- /dev/null +++ b/examples/sky/rssi-scanner.c @@ -0,0 +1,93 @@ +/* + * 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: rssi-scanner.c,v 1.1 2009/04/25 09:41:37 joxe Exp $ + */ + +/** + * \file + * Scanning 2.4 GHz radio frequencies using CC2420 and prints + * the values + * \author + * Joakim Eriksson, joakime@sics.se + */ + +#include "contiki.h" +#include "net/rime.h" + +#include "dev/leds.h" +#include "dev/cc2420.h" +#include "dev/cc2420_const.h" +#include "dev/spi.h" +#include + +/*---------------------------------------------------------------------------*/ +/* This assumes that the CC2420 is always on and "stable" */ +static void +set_frq(int c) +{ + int f; + /* fine graied channel - can we even read other channels with CC2420 ? */ + f = c + 302 + 0x4000; + + FASTSPI_SETREG(CC2420_FSCTRL, f); + FASTSPI_STROBE(CC2420_SRXON); +} + +static void +do_rssi(void) +{ + int channel; + printf("RSSI:"); + for(channel = 0; channel <= 79; ++channel) { + set_frq(channel + 55); + printf("%d ", cc2420_rssi() + 53); + } + printf("\n"); +} + +/*---------------------------------------------------------------------------*/ +PROCESS(scanner_process, "RSSI Scanner"); +AUTOSTART_PROCESSES(&scanner_process); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(scanner_process, ev, data) +{ + PROCESS_BEGIN(); + /* switch mac layer off, and turn radio on */ + rime_mac->off(0); + cc2420_on(); + + while(1) { + do_rssi(); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/