Adding the avr-rss2 platform based on AtMega256RFR2

This commit is contained in:
Robert Olsson 2016-02-22 20:46:07 +01:00
parent d3980668ee
commit ce8e87d60e
91 changed files with 9349 additions and 0 deletions

View file

@ -0,0 +1,61 @@
CONTIKI_TARGET_DIRS = . apps net loader dev
CONTIKI_CORE=contiki-main
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o
CONTIKI_TARGET_SOURCEFILES += contiki-main.c params.c battery-sensor.c i2c.c
CONTIKI_TARGET_SOURCEFILES += sensors.c button-sensor.c slip_uart0.c slip.c leds.c temp_mcu-sensor.c light-sensor.c adc.c cfs-eeprom.c eeprom.c pulse-sensor.c
CONTIKI_TARGET_SOURCEFILES += temp-sensor.c
CONTIKI_TARGET_SOURCEFILES += enc28j60_avr.c
CONTIKI_TARGET_SOURCEFILES += co2_sa_kxx-sensor.c
CONTIKIAVR=$(CONTIKI)/cpu/avr
CONTIKIBOARD=.
ifdef $(MCU)
MCU=$(MCU)
else
MCU=atmega256rfr2
endif
ifeq ($(MCU),atmega128rfa1)
CONTIKI_PLAT_DEFS = -DF_CPU=8000000UL -DAUTO_CRC_PADDING=2
BOOTLOADER_START = 0x1E000
endif
ifeq ($(MCU),atmega128rfr2)
CONTIKI_PLAT_DEFS = -DF_CPU=8000000UL -DAUTO_CRC_PADDING=2
BOOTLOADER_START = 0x1E000
endif
ifeq ($(MCU),atmega256rfr2)
CONTIKI_PLAT_DEFS = -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2
BOOTLOADER_START = 0x3E000
endif
AVRDUDE_PROGRAMMER=jtag2
# For usb devices, you may either use PORT=usb, or (e.g. if you have more than one
# programmer connected) you can use the following trick to find out the serial number:
#
# The example is for an JTAGICE mkII used to program an ATmega128:
# avrdude -v -P usb:xxxx -c jtag2 -p atmega128
AVRDUDE_PORT=usb:00B000000D79
# Additional avrdude options
# Verify off
AVRDUDE_OPTIONS=-V
AVRDUDE_MCU=m256rfr2
include $(CONTIKIAVR)/Makefile.avr
include $(CONTIKIAVR)/radio/Makefile.radio
#MODULES += core/net/mac core/net core/net/mac/sicslowmac core/net/mac/contikimac core/net/llsec core/net/rime
MODULES += core/net/mac core/net core/net/mac/sicslowmac core/net/mac/contikimac core/net/llsec

173
platform/avr-rss2/README.md Normal file
View file

@ -0,0 +1,173 @@
Getting Started with Contiki using avr-rss2
===========================================
This guide's aim is to help you start using Contiki for RSS2 boards
The platform supports different AtMega-RF boards:
* Based on MCU AtMega128RFR2
* Based on MCU AtMega256RFR2
* Based on MCU AtMega128RFA1
Boards looks the same. "Made in EU" labeled on the AtMega256RFR2 boards
The platform and CPU code, are common for both boards, can be found under
`$(CONTIKI)/platfrom/avr-rssa. The port was developed and tested with RSS2.
This guide assumes that you have basic understanding of how to use the
command line and perform basic admin tasks on UNIX family OSs. You should'
also have understanding about the Contiki OS design as well have C
programming skills.
Boards Features
----------------
* Chip Antenna. Supercardiod.
* Robust radio performance. Up to 300 meter line-of-sight.
* Unique EUI64 address via chip combined with EEPROM
* Onboard temp sensor DS18B20,
* Light Sensor.
* 32kHz RTC xtal
* Comparator chip and input.
* SW FET, (relay) for power on/off of sensors.
* DC input via LDO up to 25V.
* Standard. 6-pin TTL-USB header for FTDI cable for UART.
* PCB formfactor for cheap project box G.40X IP54
* Power/current:
** RX ~10mA (Full RPC AtMegaXXRFR2).
** Sleep ~45uA @ 16MHz XTAL
** Sleep ~15uA @ 8MHz using internal oscillator
* Preprogammed bootloader.
* CE certified by test institute.
UART
----
The board has one UART via the 6-pin TTL-USB adapter, The recommended
baudrate is 38400 bps. This speed gives the lowest error with respect
of the used clock frequency used internally. A possible hi-speed is
250000 bps wich gives 0% Error with 16MHz clock.
Port Features
--------------
The platform has the following key features:
* Standard, E64 address from built-in chip.
* First hooks for RPC (Reduced Power Consumption) for AtMegaXXXRFR2.
Toolchain needs
---------------
The Atmel toolcahin is available in most operating system.
Note. The native OS packages does not yet support the new
AtMega256RfR2 MCU.
We'll use toolchain from Atmels web-site. You might also consider
Instant Contiki
* For Linux.
See http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx
Download the proper 8-bit platform 32 or 64 bit.
Unpack unpack under /usr/local
Also add to your search PATH. For example .bashrc add:
export PATH=$PATH:/usr/local/avr8-gnu-toolchain-linux_x86/bin
or
export PATH=$PATH:/usr/local/avr8-gnu-toolchain-linux_x86_64/bin
For flash programming you'll need avrdude. For OS using apt-get
apt-get install avrdude
* For Windows.
Goes here
Contiki build TARGET
--------------------
make TARGET=avr-rss2
For AtMega128RFR2 boards:
make TARGET=avr-rss2 MCU=atmega128rfr2
For AtMega128RFA1 boards:
make TARGET=avr-rss2 MCU=atmega128rfa1
Flashing
--------
Programming using avrdude using serial bootloader. (TTL-USB cable)
Press the RESET button. The bootloader with wait for boot commands
for 3 seconds.
Flashing commnad line example 256k MCU:
avrdude -p m256rfr2 -c stk500v2 -P /dev/ttyUSB0 -b 38400 -e -U flash:w:hello-world.avr-rss2
Flashing commnad line example 128k MCU:
avrdude -p m128rfa1 -c avr109 -P /dev/ttyUSB0 -b 38400 -e -U flash:w:hello-world.avr-rss2
Older boards may use the avr109 boot loader. The stk500v2 uses the yellow
lED while the avr109 uses the red LED.
Tested applications and examples
---------------------------------
hello-world
ipv6/rpl-udp
ipv6/simple-udp-rpl
rime
ipv6/multicast
example-shell Needs symbol.c to be added to project also seems like
in core/dev/serial-line.c process_poll must be replaced with
process_post.
/* Wake up consumer process */
- process_poll(&serial_line_process);
+ process_post(&serial_line_process, 0, 0);
examples/powertrace
Platform tutorial applications
.-----------------------------
Example to read out various sensors leds serial numbers etc.
platform/avr-rss2/examples/hello-sensors/
This example shows the sensd data encoding. But UDP using 6lowpan.
platform/avr-rss2/examles/ipv6/rpl-udp-report/
NAT ip64 ethernet GW based on Contiki core/net/ip64 code
platform/avr-rss2/examples/ipv6/rpl-border-router/
Regressions tests
-----------------
Travis compile regression for platform:
regression-tests/23-compile-avr
Port adds newer version of avr-gcc compiler (4.9.2), to support
testing of newwr Atmel MCU as Atmega256RFR2. Work by Atis Elsts
Board approvals
---------------
Summary:
* R&TTE 73/23/EEC, 89/336/EEC and 99/5/EC
* Safety: EN 60950-1:2006 + A12: 2011
* RF: ETSI EN 300 328 V1.7.1 (2006-10)
* EMC: ETSI EN 301 489-1 V1.9.2 (2011-09), ETSI EN 301 489-17 V2.2.1 (2012-09)
* EMF: EN 62479:2010
* Human exposure to electromagnetic fields: EN 62479:2010
Commercial availability
------------------------
Through vendor and though resellers. Note board is will only available
were CE approval is covered. This may be further restricted by WEEE.
Contact vendor. For research legislation is more relaxed in most
countries.
References
----------
AtMega64/128/256/RFR2 chip documentation available via Atmel.
Schematics and boards description. Available via Radio-Senors
Smart Reduced Power Consumption Techniques. AT02594 available via Atmel.
ToDo
-----
API for radio power saving settings introduced Atmels app note AT02594.
Also function for the desensitizing RPC resister.
Vendor info
-----------
http://radio-sensors.com/
Maintainer
----------
Robert Olsson <robert@radio-sensors.com>

View file

@ -0,0 +1,11 @@
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
PROJECT_SOURCEFILES += stub-rdc.c
CONTIKI_PROJECT = sniffer
all: $(CONTIKI_PROJECT)
CONTIKI = ../../../..
CONTIKI_WITH_RIME = 1
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1,25 @@
Sniffer application mote side
=============================
This put the radio in sniff mode and should capure all traffic used
on the set channel.
Default channel
---------------
26
Bulld
-----
make TARGET=avr-rss2
Default serial port speed
-------------------------
38400 bps
More info & uasage
------------------
Look in the host directory
Contiki support
---------------
The code promisc for support is needed. This also adds the sensniff
format. See rf230-promisc.pat for the rf230bb radions.

View file

@ -0,0 +1,17 @@
CC = gcc
CFLAGS = -c
SOURCES = wsbridge.c
OBJECTS = $(SOURCES:.c=.o)
EXE = wsbridge
all: $(SOURCES) $(EXE)
$(EXE): $(OBJECTS)
$(CC) $(OBJECTS) -o $@
%.o:%.c
$(CC) $(CFLAGS) $< -o $@
clean:
rm *.o

View file

@ -0,0 +1,38 @@
Sniffer application host side
=============================
This a Unix application to link between the serial port having the
sensor node connected and Wireshark or tcpdump. Enclosed is a modified
wsbridge (See copyright i file) code to use the format used by sensniff.
You can also use sensniff which is a Python script. Author of senssniff
is George Oikonomou (oikonomou@users.sf.net)
See:
https://github.com/g-oikonomou/sensniff
Function
--------
The mote captures WSN data and formats according sensniff format sends
over the serial line. The data is binary. The wsbridge reads reads serial
line (typically /dev/ttyUSB) on Linux systems decodes the sensnaiff and
create timestamp and adds the the PCAP farming and writes the result to
a FIFO or named pipe. /tmp/wireshark or /tmp/sensniff.
Bulld
-----
Just use the Makefile. Put binary for convince in your path.
Usage
-----
* wsbridge /dev/ttYUSB
* wireshart -k -i /tmp/wireshark
Default serial port speed
-------------------------
38400 bps
References
----------
http://www.freaklabs.org/index.php/wsbridge.html
https://github.com/g-oikonomou/sensniff

View file

@ -0,0 +1,459 @@
/*******************************************************************
Copyright (C) 2009 FreakLabs
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 the copyright holder 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 THE COPYRIGHT HOLDERS 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.
Originally written by Christopher Wang aka Akiba.
Please post support questions to the FreakLabs forum.
*******************************************************************/
/*!
FreakLabs Freakduino/Wireshark Bridge
This program allows data from the Freakduino to be piped into wireshark.
When the sniffer firmware is loaded into the Freakduino, then the Freakduino
will be in promiscuous mode and will just dump any frames it sees. This
program takes the frame dump and sends it into Wireshark for analysis. The
global header is already set up to inform wireshark that the link layer for
all frames will be in IEEE 802.15.4 format. After that, it is up to the user
to choose any higher layer protocols to decode above 802.15.4 via the
wireshark "enable protocols" menu.
*/
/*
Modified for sensniff format. Magic[4] + Vers[1] + CMD[1] + len[1]
Robert Olsson <roolss@kth.se> 2015-11-10
*/
/**************************************************************************/
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <stdint.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#define PORTBUFSIZE 32
#define BUFSIZE 1024
#define PACKET_FCS 2
#define DEBUG 1
#define PIPENAME "/tmp/wireshark"
#define BAUDRATE B38400
enum FSM {
START_CAPTURE,
PACKET_CAPTURE
};
static int FD_pipe = -1;
static int FD_com = -1;
static uint8_t port_buf[PORTBUFSIZE];
static uint8_t circ_buf[BUFSIZE];
static uint16_t rd_idx = 0;
static uint16_t wr_idx = 0;
static uint8_t len;
static uint8_t state = START_CAPTURE;
static uint8_t file_write = 0;
static fd_set fds;
static const uint8_t magic[] = { 0xC1, 0x1F, 0xFE, 0x72 };
/**************************************************************************/
/*!
Open the serial port that we'll be communicating with the Freakduino (sniffer)
through.
*/
/**************************************************************************/
int
serial_open(char *portname)
{
int baud = B38400;
int fd; /* file descriptor for the serial port */
struct termios tc, tp;
fd = open(portname, O_RDONLY | O_NOCTTY | O_NDELAY);
if(fd == -1) { /* if open is unsucessful */
printf("serial_open: Unable to open %s.\n", portname);
exit(-1);
}
fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, O_RDWR);
tp.c_cflag = baud | CS8 | CLOCAL | CREAD;
tp.c_oflag = 0; /* Raw Input */
tp.c_lflag = 0; /* No conoical */
tp.c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | OFDEL | NLDLY | CRDLY);
/* ignore CR, ignore parity */
tp.c_iflag = ~(IGNBRK | PARMRK | INPCK | INLCR | IUCLC | IXOFF) |
BRKINT | IGNPAR | ICRNL | IXON | ISIG | ICANON;
tp.c_lflag &= ~(ECHO | ECHONL);
tp.c_oflag = 0; /* Raw Input */
tp.c_iflag &= ~ISTRIP;
tcflush(fd, TCIFLUSH);
cfsetospeed(&tp, baud);
cfsetispeed(&tp, baud);
if(tcsetattr(fd, TCSANOW, &tp) < 0) {
perror("Couldn't set term attributes");
return -1;
}
return fd;
}
/**************************************************************************/
/*!
Create the named pipe that we will be communicating with wireshark through.
*/
/**************************************************************************/
static void
named_pipe_create(char *name)
{
int rv = 0;
rv = mkfifo(name, 0666);
if((rv == -1) && (errno != EEXIST)) {
perror("Error creating named pipe");
exit(1);
}
FD_pipe = open(name, O_WRONLY);
if(FD_pipe == -1) {
perror("Error connecting to named pipe");
exit(1);
}
}
/**************************************************************************/
/*!
Write data to the pipe
*/
/**************************************************************************/
size_t
data_write(const void *ptr, size_t size)
{
ssize_t bytes = 0;
if(FD_pipe != -1) {
bytes = write(FD_pipe, ptr, size);
}
}
/**************************************************************************/
/*!
Write the global header to wireshark. This is only done once at the
beginning of the capture.
*/
/**************************************************************************/
static void
write_global_hdr()
{
uint32_t magic_number = 0xa1b2c3d4; /* magic number */
uint16_t version_major = 2; /* major version number */
uint16_t version_minor = 4; /* minor version number */
int32_t thiszone = 0; /* GMT to local correction */
uint32_t sigfigs = 0; /* accuracy of timestamps */
uint32_t snaplen = 65535; /* max length of captured packets, in octets */
uint32_t network = 195; /* data link type (DLT) - IEEE 802.15.4 */
data_write(&magic_number, sizeof(magic_number));
data_write(&version_major, sizeof(version_major));
data_write(&version_minor, sizeof(version_minor));
data_write(&thiszone, sizeof(thiszone));
data_write(&sigfigs, sizeof(sigfigs));
data_write(&snaplen, sizeof(snaplen));
data_write(&network, sizeof(network));
}
/**************************************************************************/
/*!
Write the frame header into wireshark. This is required for the libpcap
format and informs wireshark that a new frame is coming.
*/
/**************************************************************************/
static void
write_frame_hdr(uint8_t len)
{
uint32_t ts_sec; /* timestamp seconds */
uint32_t ts_usec; /* timestamp microseconds */
uint32_t incl_len; /* number of octets of packet saved in file */
uint32_t orig_len; /* actual length of packet */
struct timeval tv;
gettimeofday(&tv, NULL);
ts_sec = tv.tv_sec;
ts_usec = tv.tv_usec;
incl_len = len;
orig_len = len + PACKET_FCS;
data_write(&ts_sec, sizeof(ts_sec));
data_write(&ts_usec, sizeof(ts_usec));
data_write(&incl_len, sizeof(incl_len));
data_write(&orig_len, sizeof(orig_len));
}
/**************************************************************************/
/*!
Write one frame into wireshark (via the pipe).
*/
/**************************************************************************/
static void
write_frame(uint8_t frame_len)
{
uint8_t i;
/* actual frame length for wireshark should not include FCS */
frame_len -= PACKET_FCS;
/* write header to inform WS that new frame has arrived */
write_frame_hdr(frame_len);
/* bump rd_idx. we don't want to write the length byte */
rd_idx = (rd_idx + 1) % BUFSIZE;
/* write frame into wireshark */
for(i = 0; i < frame_len; i++) {
data_write(&circ_buf[rd_idx], 1);
rd_idx = (rd_idx + 1) % BUFSIZE;
}
/* bump rd_idx. we're not using the trailing FCS value */
rd_idx = (rd_idx + 1) % BUFSIZE;
}
/**************************************************************************/
/*!
Calculate total number of bytes in buffer.
*/
/**************************************************************************/
static uint16_t
calc_bytes_in_buf()
{
if(rd_idx > wr_idx) {
/* read index is greater than write. we must have wrapped around */
return BUFSIZE - (rd_idx - wr_idx);
} else {
return wr_idx - rd_idx;
}
}
/**************************************************************************/
/*!
Deal with any received signals. This includes ctrl-C to stop the program.
*/
/**************************************************************************/
static void
sig_int(int signo)
{
(void)signo;
if(FD_pipe != -1) {
printf("\nClosing pipe.\n");
close(FD_pipe);
}
if(FD_com != -1) {
printf("\nClosing serial port.\n");
close(FD_com);
}
printf("\nSignal captured and devices shut down.\n");
exit(0);
}
/**************************************************************************/
/*!
Init the signals we'll be checking for.
*/
/**************************************************************************/
static void
signal_init(void)
{
signal(SIGINT, sig_int);
signal(SIGHUP, sig_int);
signal(SIGTERM, sig_int);
}
int got;
int debug;
/**************************************************************************/
/*!
Here's the meat of the code.
*/
/**************************************************************************/
int
main(int argc, char *argv[])
{
int nbytes;
uint8_t i;
got = 0;
/* capture any signals that will terminate program */
signal_init();
/* make sure the COM port is specified */
if(argc == 2) {
/* open the COM port */
if((FD_com = serial_open(argv[1])) == -1) {
printf("Serial port not opened.\n");
return 0;
} else {
/* set up the select statement for the COM port. */
FD_ZERO(&fds);
FD_SET(FD_com, &fds);
printf("Serial port connected. Waiting for wireshark connection.\n");
printf("Open wireshark and connect to local interface: %s\n", PIPENAME);
}
} else {
printf("Usage: wsbridge <portname>.\n");
return 0;
}
/* create and open pipe for wireshark */
named_pipe_create(PIPENAME);
/* wait for wireshark to connect to pipe. Once wireshark */
/* connects, then the global header will be written to it. */
if(FD_pipe != -1) {
write_global_hdr();
printf("Client connected to pipe.\n");
}
for(;;) {
uint16_t bytes_in_buf;
uint8_t frame_len, byte_ctr;
/* block until there is data in the serial port */
select(FD_com + 1, &fds, NULL, NULL, NULL);
if(FD_ISSET(FD_com, &fds)) {
int ii;
/* wait for data to come in on the serial port */
if((nbytes = read(FD_com, port_buf, PORTBUFSIZE)) > 0) {
if(debug) {
uint8_t p;
printf("read nbytes=%d\n", nbytes);
for(i = 0; i < nbytes; i++) {
printf(" %02X", port_buf[i]);
}
printf("\n");
}
/* write data to circular buffer. loop through all received bytes */
for(i = 0; i < nbytes; i++) {
switch(state) {
case START_CAPTURE:
/* new frame starting */
if((got == 0) && (port_buf[i] == magic[0])) {
got = 1;
} else if((got == 1) && (port_buf[i] == magic[1])) {
got = 2;
} else if((got == 2) && (port_buf[i] == magic[2])) {
got = 3;
} else if((got == 3) && (port_buf[i] == magic[3])) {
got = 4;
if(debug) {
printf("GOT MAGIC i=%d\n", i);
}
} else if((got == 4) && (port_buf[i] == 1)) {
got = 5;
if(debug) {
printf("GOT VERSION i=%d\n", port_buf[i]);
}
} else if((got == 5) && (port_buf[i] == 0)) {
got = 6;
if(debug) {
printf("GOT COMMAND i=%d\n", port_buf[i]);
}
} else if(got == 6) {
len = port_buf[i];
byte_ctr = 0;
if(debug) {
printf("Len = %02X.\n", len);
}
circ_buf[wr_idx] = len;
wr_idx = (wr_idx + 1) % BUFSIZE;
state = PACKET_CAPTURE;
} else {
got = 0;
}
break;
case PACKET_CAPTURE:
/* continue capturing bytes until end of frame */
/* write data to circular buffer and increment index */
circ_buf[wr_idx] = port_buf[i];
/* ////printf("%02X ", circ_buf[wr_idx]); */
wr_idx = (wr_idx + 1) % BUFSIZE;
/* track number of received bytes. when received bytes */
/* equals frame length, then restart state machine and */
/* write bytes to wireshark */
byte_ctr++;
if(byte_ctr == (len - 1)) {
state = START_CAPTURE;
file_write = 1;
/* printf("\n"); */
got = 0;
}
break;
}
fflush(stdout);
}
/* at least one frame has been written. loop through circular buffer */
/* and write out all completed frames */
while(file_write) {
/* capture frame length and check buffer to see if one or more frames */
/* are available. */
frame_len = circ_buf[rd_idx];
bytes_in_buf = calc_bytes_in_buf();
if(bytes_in_buf > frame_len) {
/* if more than one frame is available, then write one frame to */
/* wireshark and then see if any more are available. */
write_frame(frame_len);
} else if(bytes_in_buf == frame_len) {
/* only one frame is available. write to wireshark and then quit */
/* the loop */
write_frame(frame_len);
file_write = 0;
} else {
/* less than one frame is available. quit the loop and collect more */
/* bytes. we normally should not get here. */
file_write = 0;
}
}
}
}
}
}

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2010, Loughborough University - 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.
*/
/**
* \file
* Project specific configuration defines for the sniffer example.
*
* \author
* George Oikonomou - <oikonomou@users.sourceforge.net>
* Robert Olsson - <robert@radio.sensors.com>
*/
#ifndef PROJECT_CONF_H_
#define PROJECT_CONF_H_
#define NETSTACK_CONF_MAC nullmac_driver
/* Can see other channels. Interesting. */
/* #define NETSTACK_CONF_MAC csma_driver */
#define NETSTACK_CONF_RDC stub_rdc_driver
#endif /* PROJECT_CONF_H_ */

View file

@ -0,0 +1,39 @@
diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c
index 53959d1..b9f2262 100644
--- a/cpu/avr/radio/rf230bb/rf230bb.c
+++ b/cpu/avr/radio/rf230bb/rf230bb.c
@@ -544,7 +544,7 @@ rf230_set_promiscuous_mode(bool isPromiscuous) {
#if RF230_CONF_AUTOACK
is_promiscuous = isPromiscuous;
/* TODO: Figure out when to pass promisc state to 802.15.4 */
-// radio_set_trx_state(is_promiscuous?RX_ON:RX_AACK_ON);
+ radio_set_trx_state(is_promiscuous?RX_ON:RX_AACK_ON);
#endif
}
@@ -1392,6 +1392,25 @@ PROCESS_THREAD(rf230_process, ev, data)
/* Restore interrupts. */
HAL_LEAVE_CRITICAL_REGION();
PRINTF("rf230_read: %u bytes lqi %u\n",len,rf230_last_correlation);
+
+ if(is_promiscuous) {
+ uint8_t i;
+ unsigned const char * rxdata = packetbuf_dataptr();
+ /* Print magic */
+ putchar(0xC1);
+ putchar(0x1F);
+ putchar(0xFE);
+ putchar(0x72);
+ /* Print version */
+ putchar(0x01);
+ /* Print CMD == frame */
+ putchar(0x00);
+ putchar(len+3);
+
+ for (i=0;i<len;i++) putchar(rxdata[i]);
+ printf("\n");
+ }
+
#if DEBUG>1
{
uint8_t i;

View file

@ -0,0 +1,67 @@
/*
* 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.
*
*/
/*
Author: Robert Olsson <robert@radio-sensors.com>
*/
#include "contiki.h"
#include "net/rime/rime.h"
#include "random.h"
#include "dev/button-sensor.h"
#include "dev/leds.h"
#include <stdio.h>
/*---------------------------------------------------------------------------*/
PROCESS(sniffer_process, "Sniffer process");
AUTOSTART_PROCESSES(&sniffer_process);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(sniffer_process, ev, data)
{
PROCESS_BEGIN();
/*
To get rf230bb radio in sniff mode we need to have radio in RX_ON.
The promisc commands fixes this for us. No need to set PAN and
address or MAC to zero is this case. Se Atmel datasheet. There is
a chance other radios works the same way.
*/
rf230_set_promiscuous_mode(1);
printf("Sniffer started\n");
while(1) {
PROCESS_YIELD();
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,100 @@
/*
* Copyright (c) 2010, Loughborough University - 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.
*/
/**
* \file
* Definition of a fake RDC driver to be used with passive
* examples. The sniffer will never send packets and it will never
* push incoming packets up the stack. We do this by defining this
* driver as our RDC. We then drop everything
*
* \author
* George Oikonomou - <oikonomou@users.sourceforge.net>
*/
#include "net/mac/mac.h"
#include "net/mac/rdc.h"
/*---------------------------------------------------------------------------*/
static void
send(mac_callback_t sent, void *ptr)
{
if(sent) {
sent(ptr, MAC_TX_OK, 1);
}
}
/*---------------------------------------------------------------------------*/
static void
send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list)
{
if(sent) {
sent(ptr, MAC_TX_OK, 1);
}
}
/*---------------------------------------------------------------------------*/
static void
input(void)
{
}
/*---------------------------------------------------------------------------*/
static int
on(void)
{
return 1;
}
/*---------------------------------------------------------------------------*/
static int
off(int keep_radio_on)
{
return keep_radio_on;
}
/*---------------------------------------------------------------------------*/
static unsigned short
cca(void)
{
return 0;
}
/*---------------------------------------------------------------------------*/
static void
init(void)
{
}
/*---------------------------------------------------------------------------*/
const struct rdc_driver stub_rdc_driver = {
"stub-rdc",
init,
send,
send_list,
input,
on,
off,
cca,
};
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,350 @@
/*
* Copyright (c) 2006, Technical University of Munich
* 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.
*
* @(#)$$
*/
/**
* \file
* Configuration for RSS2 (radio-sensors.com) platform
*/
#ifndef CONTIKI_CONF_H_
#define CONTIKI_CONF_H_
/* include the project config */
/* PROJECT_CONF_H might be defined in the project Makefile */
#ifdef PROJECT_CONF_H
#include PROJECT_CONF_H
#endif
/* Platform name, type, and MCU clock rate */
#define PLATFORM_NAME "rss2"
#define PLATFORM_TYPE ATMEGA256RFR2
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#include <stdint.h>
#ifndef NETSTACK_CONF_MAC
#define NETSTACK_CONF_MAC csma_driver
#endif
#ifndef NETSTACK_CONF_RDC
#define NETSTACK_CONF_RDC contikimac_driver
#endif
#ifndef NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
#endif
#ifndef NETSTACK_CONF_FRAMER
#if NETSTACK_CONF_WITH_IPV6
#define NETSTACK_CONF_FRAMER contikimac_framer
#else
#define NETSTACK_CONF_FRAMER framer_802154
#endif
#endif
#ifndef NETSTACK_CONF_RADIO
#define NETSTACK_CONF_RADIO rf230_driver
#endif
#ifndef CHANNEL_802_15_4
#define CHANNEL_802_15_4 26
#endif
/* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */
#ifndef RF230_CONF_AUTOACK
#define RF230_CONF_AUTOACK 1
#endif
#define MCUCSR MCUSR
/* The AVR tick interrupt usually is done with an 8 bit counter around 128 Hz.
* 125 Hz needs slightly more overhead during the interrupt, as does a 32 bit
* clock_time_t.
*/
/* Clock ticks per second */
#define CLOCK_CONF_SECOND 128
typedef unsigned long clock_time_t;
#define CLOCK_LT(a, b) ((signed long)((a) - (b)) < 0)
#define INFINITE_TIME 0xffffffff
/* These routines are not part of the contiki core but can be enabled in cpu/avr/clock.c */
void clock_delay_msec(uint16_t howlong);
void clock_adjust_ticks(clock_time_t howmany);
/* The radio needs to interrupt during an rtimer interrupt */
#define RTIMER_CONF_NESTED_INTERRUPTS 1
/* RSS2 boards has a 32768Hz on TIMER2 */
#define AVR_CONF_USE32KCRYSTAL 1
#define SLIP_PORT RS232_PORT_0
/* Pre-allocated memory for loadable modules heap space (in bytes)*/
/* Default is 4096. Currently used only when elfloader is present. Not tested on Raven */
/* #define MMEM_CONF_SIZE 256 */
/* Starting address for code received via the codeprop facility. Not tested. */
typedef unsigned long off_t;
/* #define EEPROMFS_ADDR_CODEPROP 0x8000 */
/* Logging adds 200 bytes to program size. RS232 output slows down webserver. */
/* #define LOG_CONF_ENABLED 1 */
/* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */
/* It has less overhead than ENERGEST */
#define RADIOSTATS 1
/* More extensive stats, via main loop printfs or webserver status pages */
#define ENERGEST_CONF_ON 1
/* Packet statistics */
typedef unsigned short uip_stats_t;
#define UIP_STATISTICS 0
/* Available watchdog timeouts depend on mcu. Default is WDTO_2S. -1 Disables the watchdog. */
/* AVR Studio simulator tends to reboot due to clocking the WD 8 times too fast */
/* #define WATCHDOG_CONF_TIMEOUT -1 */
/* Debugflow macro, useful for tracing path through mac and radio interrupts */
/* #define DEBUGFLOWSIZE 128 */
/* Define MAX_*X_POWER to reduce tx power and ignore weak rx packets for testing a miniature multihop network.
* Leave undefined for full power and sensitivity.
* tx=0 (3dbm, default) to 15 (-17.2dbm)
* RF230_CONF_AUTOACK sets the extended mode using the energy-detect register with rx=0 (-91dBm) to 84 (-7dBm)
* else the rssi register is used having range 0 (91dBm) to 28 (-10dBm)
* For simplicity RF230_MIN_RX_POWER is based on the energy-detect value and divided by 3 when autoack is not set.
* On the RF230 a reduced rx power threshold will not prevent autoack if enabled and requested.
* These numbers applied to both Raven and Jackdaw give a maximum communication distance of about 15 cm
* and a 10 meter range to a full-sensitivity RF230 sniffer.
*#define RF230_MAX_TX_POWER 15
*#define RF230_MIN_RX_POWER 30
*/
/* The rf231 and atmega128rfa1 can use an rssi threshold for triggering rx_busy that saves 0.5ma in rx mode */
/* 1 - 15 maps into -90 to -48 dBm; the register is written with RF230_MIN_RX_POWER/6 + 1. Undefine for -100dBm sensitivity */
/* #define RF230_MIN_RX_POWER 0 */
/* Network setup */
/* TX routine passes the cca/ack result in the return parameter */
#define RDC_CONF_HARDWARE_ACK 1
/* TX routine does automatic cca and optional backoffs */
#define RDC_CONF_HARDWARE_CSMA 1
/* Allow MCU sleeping between channel checks */
#define RDC_CONF_MCU_SLEEP 1
#if NETSTACK_CONF_WITH_IPV6
#define LINKADDR_CONF_SIZE 8
#define UIP_CONF_ICMP6 1
#define UIP_CONF_UDP 1
#ifndef UIP_CONF_TCP
#define UIP_CONF_TCP 1
#endif
#define NETSTACK_CONF_NETWORK sicslowpan_driver
#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06
#else
/* ip4 should build but is largely untested */
#define LINKADDR_CONF_SIZE 2
#define NETSTACK_CONF_NETWORK rime_driver
#endif
#define UIP_CONF_LL_802154 1
#define UIP_CONF_LLH_LEN 0
/* 10 bytes per stateful address context - see sicslowpan.c */
/* Default is 1 context with prefix aaaa::/64 */
/* These must agree with all the other nodes or there will be a failure to communicate! */
#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 1
#define SICSLOWPAN_CONF_ADDR_CONTEXT_0 { addr_contexts[0].prefix[0] = 0xaa; addr_contexts[0].prefix[1] = 0xaa; }
#define SICSLOWPAN_CONF_ADDR_CONTEXT_1 { addr_contexts[1].prefix[0] = 0xbb; addr_contexts[1].prefix[1] = 0xbb; }
#define SICSLOWPAN_CONF_ADDR_CONTEXT_2 { addr_contexts[2].prefix[0] = 0x20; addr_contexts[2].prefix[1] = 0x01; addr_contexts[2].prefix[2] = 0x49; addr_contexts[2].prefix[3] = 0x78, addr_contexts[2].prefix[4] = 0x1d; addr_contexts[2].prefix[5] = 0xb1; }
/* Take the default TCP maximum segment size for efficiency and simpler wireshark captures */
/* Use this to prevent 6LowPAN fragmentation (whether or not fragmentation is enabled) */
/* #define UIP_CONF_TCP_MSS 48 */
#define UIP_CONF_IP_FORWARD 0
#define UIP_CONF_FWCACHE_SIZE 0
#define UIP_CONF_IPV6_CHECKS 1
#define UIP_CONF_IPV6_QUEUE_PKT 1
#define UIP_CONF_IPV6_REASSEMBLY 0
#define UIP_CONF_UDP_CHECKSUMS 1
#define UIP_CONF_TCP_SPLIT 1
#define UIP_CONF_DHCP_LIGHT 1
#if 0 /* No radio cycling */
#define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_RDC sicslowmac_driver
#define NETSTACK_CONF_FRAMER framer_802154
/* 1 + Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode) */
#define RF230_CONF_FRAME_RETRIES 2
/* Number of csma retry attempts 0-5 in extended tx mode (7 does immediate tx with no csma) */
#define RF230_CONF_CSMA_RETRIES 5
/* Default is one RAM buffer for received packets. More than one may benefit multiple TCP connections or ports */
#define RF230_CONF_RX_BUFFERS 3
#define SICSLOWPAN_CONF_FRAG 1
/* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */
#define SICSLOWPAN_CONF_MAXAGE 3
/* How long to wait before terminating an idle TCP connection. Smaller to allow faster sleep. Default is 120 seconds */
/* If wait is too short the connection can be reset as a result of multiple fragment reassembly timeouts */
#define UIP_CONF_WAIT_TIMEOUT 20
/* 54 bytes per queue ref buffer */
#define QUEUEBUF_CONF_REF_NUM 2
/* Allocate remaining RAM as desired */
/* 30 bytes per TCP connection */
/* 6LoWPAN does not do well with concurrent TCP streams, as new browser GETs collide with packets coming */
/* from previous GETs, causing decreased throughput, retransmissions, and timeouts. Increase to study this. */
/* ACKs to other ports become interleaved with computation-intensive GETs, so ACKs are particularly missed. */
/* Increasing the number of packet receive buffers in RAM helps to keep ACKs from being lost */
#define UIP_CONF_MAX_CONNECTIONS 4
/* 2 bytes per TCP listening port */
#define UIP_CONF_MAX_LISTENPORTS 4
/* 25 bytes per UDP connection */
#define UIP_CONF_UDP_CONNS 10
/* See uip-ds6.h */
#define NBR_TABLE_CONF_MAX_NEIGHBORS 20
#define UIP_CONF_DS6_DEFRT_NBU 2
#define UIP_CONF_DS6_PREFIX_NBU 3
#define UIP_CONF_MAX_ROUTES 20
#define UIP_CONF_DS6_ADDR_NBU 3
#define UIP_CONF_DS6_MADDR_NBU 0
#define UIP_CONF_DS6_AADDR_NBU 0
#elif 1 /* Contiki-mac radio cycling */
/* #define NETSTACK_CONF_MAC nullmac_driver */
/* csma needed for burst mode at present. Webserver won't work without it */
/* #define NETSTACK_CONF_MAC csma_driver */
/* #define NETSTACK_CONF_RDC contikimac_driver */
/* Default is two CCA separated by 500 usec */
/* So without the header this needed for RPL mesh to form */
#define CONTIKIMAC_FRAMER_CONF_SHORTEST_PACKET_SIZE (43 - 18) /* multicast RPL DIS length */
/* Not tested much yet */
#define CONTIKIMAC_CONF_WITH_PHASE_OPTIMIZATION 0
#define CONTIKIMAC_CONF_COMPOWER 1
#define RIMESTATS_CONF_ENABLED 0
/* A 0 here means non-extended mode; 1 means extended mode with no retry, >1 for retrys */
/* Contikimac strobes on its own, but hardware retries are faster */
#define RF230_CONF_FRAME_RETRIES 1
/* Long csma backoffs will compromise radio cycling; set to 0 for 1 csma */
#define RF230_CONF_CSMA_RETRIES 0
#define SICSLOWPAN_CONF_FRAG 1
#define SICSLOWPAN_CONF_MAXAGE 3
/* 54 bytes per queue ref buffer */
#define QUEUEBUF_CONF_REF_NUM 2
/* Allocate remaining RAM. Not much left due to queuebuf increase */
#define UIP_CONF_MAX_CONNECTIONS 2
#define UIP_CONF_MAX_LISTENPORTS 4
#define UIP_CONF_UDP_CONNS 5
#define NBR_TABLE_CONF_MAX_NEIGHBORS 20
#define UIP_CONF_DS6_DEFRT_NBU 2
#define UIP_CONF_DS6_PREFIX_NBU 3
#define UIP_CONF_MAX_ROUTES 4
#define UIP_CONF_DS6_ADDR_NBU 3
#define UIP_CONF_DS6_MADDR_NBU 0
#define UIP_CONF_DS6_AADDR_NBU 0
#elif 0 /* cx-mac radio cycling */
/* RF230 does clear-channel assessment in extended mode (autoretries>0) */
/* These values are guesses */
#define RF230_CONF_FRAME_RETRIES 10
#define RF230_CONF_CSMA_RETRIES 2
#if RF230_CONF_CSMA_RETRIES
#define NETSTACK_CONF_MAC nullmac_driver
#else
#define NETSTACK_CONF_MAC csma_driver
#endif
#define NETSTACK_CONF_RDC cxmac_driver
#define NETSTACK_CONF_FRAMER framer_802154
#define SICSLOWPAN_CONF_FRAG 1
#define SICSLOWPAN_CONF_MAXAGE 3
#define CXMAC_CONF_ANNOUNCEMENTS 0
/* 54 bytes per queue ref buffer */
#define QUEUEBUF_CONF_REF_NUM 2
/* Allocate remaining RAM. Not much left due to queuebuf increase */
#define UIP_CONF_MAX_CONNECTIONS 2
#define UIP_CONF_MAX_LISTENPORTS 4
#define UIP_CONF_UDP_CONNS 5
#define NBR_TABLE_CONF_MAX_NEIGHBORS 4
#define UIP_CONF_DS6_DEFRT_NBU 2
#define UIP_CONF_DS6_PREFIX_NBU 3
#define UIP_CONF_MAX_ROUTES 4
#define UIP_CONF_DS6_ADDR_NBU 3
#define UIP_CONF_DS6_MADDR_NBU 0
#define UIP_CONF_DS6_AADDR_NBU 0
/* Below gives 10% duty cycle, undef for default 5% */
/* #define CXMAC_CONF_ON_TIME (RTIMER_ARCH_SECOND / 80) */
/* Below gives 50% duty cycle */
/* #define CXMAC_CONF_ON_TIME (RTIMER_ARCH_SECOND / 16) */
#else
/* #error Network configuration not specified! */
#endif /* Network setup */
#ifndef QUEUEBUF_CONF_NUM
#define QUEUEBUF_CONF_NUM 15
#endif
/* ************************************************************************** */
/* #pragma mark RPL Settings */
/* ************************************************************************** */
#if UIP_CONF_IPV6_RPL
#define UIP_CONF_ROUTER 1
#define UIP_CONF_ND6_SEND_RA 0
#define UIP_CONF_ND6_REACHABLE_TIME 600000
#define UIP_CONF_ND6_RETRANS_TIMER 10000
/* For slow slip connections, to prevent buffer overruns */
/* #define UIP_CONF_RECEIVE_WINDOW 300 */
#undef UIP_CONF_FWCACHE_SIZE
#define UIP_CONF_BUFFER_SIZE 600 /* DHCPv4 packets by ip64 module */
#define UIP_CONF_FWCACHE_SIZE 30
#define UIP_CONF_BROADCAST 1
#define UIP_ARCH_IPCHKSUM 1
#define UIP_CONF_PINGADDRCONF 0
#define UIP_CONF_LOGGING 0
#endif /* RPL */
#define CCIF
#define CLIF
#ifndef CC_CONF_INLINE
#define CC_CONF_INLINE inline
#endif
#endif /* CONTIKI_CONF_H_ */

View file

@ -0,0 +1,635 @@
/*
* Copyright (c) 2006, Technical University of Munich
* 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.
*
* Reworked for avr-rss2 platform. Robert Olsson <robert@radio-sensors.com>
*/
#define PRINTF(FORMAT, args ...) printf_P(PSTR(FORMAT),##args)
#define ANNOUNCE_BOOT 1 /* adds about 600 bytes to program size */
#if ANNOUNCE_BOOT
#define PRINTA(FORMAT, args ...) printf_P(PSTR(FORMAT),##args)
#else
#define PRINTA(...)
#endif
#define DEBUG 0
#if DEBUG
#define PRINTD(FORMAT, args ...) printf_P(PSTR(FORMAT),##args)
#else
#define PRINTD(...)
#endif
#include <avr/pgmspace.h>
#include <avr/fuse.h>
#include <avr/eeprom.h>
#include <stdio.h>
#include <string.h>
#include <dev/watchdog.h>
#include "loader/symbols-def.h"
#include "loader/symtab.h"
#include "params.h"
#include "rss2.h"
#include "leds.h"
#include "i2c.h"
#include "radio/rf230bb/rf230bb.h"
#include "net/mac/frame802154.h"
#include "net/mac/framer-802154.h"
#include "net/ipv6/sicslowpan.h"
#include "contiki.h"
#include "contiki-net.h"
#include "contiki-lib.h"
#include "dev/rs232.h"
#include "dev/serial-line.h"
#include "dev/slip.h"
#if AVR_WEBSERVER
#include "httpd-fs.h"
#include "httpd-cgi.h"
#endif
#ifdef COFFEE_FILES
#include "cfs/cfs.h"
#include "cfs/cfs-coffee.h"
#endif
#if UIP_CONF_ROUTER && 0
#include "net/routing/rimeroute.h"
#include "net/rime/rime-udp.h"
#endif
#include "net/rime/rime.h"
/* Track interrupt flow through mac, rdc and radio driver */
/* #define DEBUGFLOWSIZE 32 */
#if DEBUGFLOWSIZE
uint8_t debugflowsize, debugflow[DEBUGFLOWSIZE];
#define DEBUGFLOW(c) if(debugflowsize < (DEBUGFLOWSIZE - 1)) debugflow[debugflowsize++] = c
#else
#define DEBUGFLOW(c)
#endif
/* Get periodic prints from idle loop, from clock seconds or rtimer interrupts */
/* Use of rtimer will conflict with other rtimer interrupts such as contikimac radio cycling */
/* STAMPS will print ENERGEST outputs if that is enabled. */
#define PERIODICPRINTS 1
#if PERIODICPRINTS
/* #define PINGS 64 */
#define ROUTES 600
#define STAMPS 60
#define STACKMONITOR 1024
uint32_t clocktime;
#define TESTRTIMER 0
#if TESTRTIMER
uint8_t rtimerflag = 1;
struct rtimer rt;
void
rtimercycle(void)
{
rtimerflag = 1;
}
#endif
#endif
uint16_t node_id; /* Can be set by cooja */
uint16_t ledtimer_red, ledtimer_yellow;
uint16_t i2c_probed; /* i2c devices we have probed */
/*-------------------------------------------------------------------------*/
/*----------------------Configuration of the .elf file---------------------*/
#if 1
/* The proper way to set the signature is */
#include <avr/signature.h>
#else
/* Older avr-gcc's may not define the needed SIGNATURE bytes. Do it manually if you get an error */
typedef struct {const unsigned char B2;
const unsigned char B1;
const unsigned char B0;
} __signature_t;
#define SIGNATURE __signature_t __signature __attribute__((section(".signature")))
SIGNATURE = {
.B2 = 0x01, /* SIGNATURE_2, //ATMEGA128rfa1 */
.B1 = 0xA7, /* SIGNATURE_1, //128KB flash */
.B0 = 0x1E, /* SIGNATURE_0, //Atmel */
};
#endif
#if 1
/* JTAG, SPI enabled, Internal RC osc, Boot flash size 4K, 6CK+65msec delay, brownout disabled */
FUSES = { .low = 0xe2, .high = 0x99, .extended = 0xff, };
#else
/* JTAG+SPI, Boot 4096 words @ $F000, Internal oscillator, startup 6 CK +0 ms, Brownout 1.8 volts */
FUSES = { .low = 0xC2, .high = 0x99, .extended = 0xfe, };
#endif
uint8_t
rng_get_uint8(void)
{
#if 1
/* Upper two RSSI reg bits (RND_VALUE) are random in rf231 */
uint8_t j;
j = (PHY_RSSI & 0xc0) + ((PHY_RSSI >> 2) & 0x30) + ((PHY_RSSI >> 4) & 0x0c) + ((PHY_RSSI >> 6) & 0x03);
#else
/* Get a pseudo random number using the ADC */
uint8_t i, j;
ADCSRA = 1 << ADEN; /* Enable ADC, not free running, interrupt disabled, fastest clock */
for(i = 0; i < 4; i++) {
ADMUX = 0; /* toggle reference to increase noise */
ADMUX = 0x1E; /* Select AREF as reference, measure 1.1 volt bandgap reference. */
ADCSRA |= 1 << ADSC; /* Start conversion */
while(ADCSRA & (1 << ADSC)) ; /* Wait till done */
j = (j << 2) + ADC;
}
ADCSRA = 0; /* Disable ADC */
#endif
PRINTD("rng issues %d\n", j);
return j;
}
/*-------------------------Low level initialization------------------------*/
/*------Done in a subroutine to keep main routine stack usage small--------*/
void
initialize(void)
{
watchdog_init();
watchdog_start();
leds_init();
serial_line_init();
rs232_init(RS232_PORT_0, USART_BAUD_38400, USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
rs232_redirect_stdout(RS232_PORT_0);
#if 0
/* Do it my way... */
UBRR0L = 25;
UBRR0H = 0;
UCSR0A = (1 << U2X0); /*Double */
#endif
rs232_set_input(RS232_PORT_0, serial_line_input_byte);
clock_init();
if(MCUSR & (1 << PORF)) {
PRINTD("Power-on reset.\n");
}
if(MCUSR & (1 << EXTRF)) {
PRINTD("External reset!\n");
}
if(MCUSR & (1 << BORF)) {
PRINTD("Brownout reset!\n");
}
if(MCUSR & (1 << WDRF)) {
PRINTD("Watchdog reset!\n");
}
if(MCUSR & (1 << JTRF)) {
PRINTD("JTAG reset!\n");
}
i2c_init(100000); /* 100 bit/s */
#if STACKMONITOR
/* Simple stack pointer highwater monitor. Checks for magic numbers in the main
* loop. In conjuction with PERIODICPRINTS, never-used stack will be printed
* every STACKMONITOR seconds.
*/
{
extern uint16_t __bss_end;
uint16_t p = (uint16_t)&__bss_end;
do {
*(uint16_t *)p = 0x4242;
p += 10;
} while(p < SP - 10); /* don't overwrite our own stack */
}
#endif
#define CONF_CALIBRATE_OSCCAL 0
#if CONF_CALIBRATE_OSCCAL
void calibrate_rc_osc_32k();
{
extern uint8_t osccal_calibrated;
uint8_t i;
PRINTD("\nBefore calibration OSCCAL=%x\n", OSCCAL);
for(i = 0; i < 10; i++) {
calibrate_rc_osc_32k();
PRINTD("Calibrated=%x\n", osccal_calibrated);
/* #include <util/delay_basic.h> */
/* #define delay_us( us ) ( _delay_loop_2(1+(us*F_CPU)/4000000UL) ) */
/* delay_us(50000); */
}
clock_init();
}
#endif
PRINTA("\n*******Booting %s*******\n", CONTIKI_VERSION_STRING);
/* rtimers needed for radio cycling */
rtimer_init();
/* Initialize process subsystem */
process_init();
/* etimers must be started before ctimer_init */
process_start(&etimer_process, NULL);
ctimer_init();
/* Start radio and radio receive process */
NETSTACK_RADIO.init();
/* Get a random seed for the 802.15.4 packet sequence number.
* Some layers will ignore duplicates found in a history (e.g. Contikimac)
* causing the initial packets to be ignored after a short-cycle restart.
*/
random_init(rng_get_uint8());
/* Set addresses BEFORE starting tcpip process */
linkaddr_t addr;
printf("I2C: ");
i2c_probed = i2c_probe();
printf("\n");
if( i2c_probed & I2C_AT24MAC ) {
i2c_at24mac_read((char *)&addr.u8, 1);
linkaddr_set_node_addr(&addr);
}
else {
char eui64[8];
printf("Random EUI64 address generated\n");
eui64[0] = 0xfc; /* Atmels OUI */
eui64[1] = 0xc2;
eui64[2] = 0x3d;
eui64[3] = 0;
eui64[4] = 0;
eui64[5] = 0;
eui64[6] = node_id >> 8;
eui64[7] = node_id & 0xff;
linkaddr_set_node_addr(&eui64);
}
/* memcpy(&uip_lladdr.addr, &addr.u8, sizeof(linkaddr_t)); */
#if NETSTACK_CONF_WITH_IPV6
memcpy(&uip_lladdr.addr, &addr.u8, sizeof(linkaddr_t));
#endif
rf230_set_pan_addr(params_get_panid(), params_get_panaddr(), (uint8_t *)&addr.u8);
rf230_set_channel(params_get_channel());
rf230_set_txpower(params_get_txpower());
#if NETSTACK_CONF_WITH_IPV6
PRINTA("EUI-64 MAC: %x-%x-%x-%x-%x-%x-%x-%x\n", addr.u8[0], addr.u8[1], addr.u8[2], addr.u8[3], addr.u8[4], addr.u8[5], addr.u8[6], addr.u8[7]);
#else
PRINTA("MAC address ");
uint8_t i;
for(i = sizeof(linkaddr_t); i > 0; i--) {
PRINTA("%x:", addr.u8[i - 1]);
}
PRINTA("\n");
#endif
/* Initialize stack protocols */
queuebuf_init();
NETSTACK_RDC.init();
NETSTACK_MAC.init();
NETSTACK_NETWORK.init();
#if ANNOUNCE_BOOT
PRINTA("MAC=%s, RDC=%s, NETWORK=%s, channel=%-u, check-rate-Hz=%-u, tx-power=%-u\n", NETSTACK_MAC.name,
NETSTACK_RDC.name, NETSTACK_NETWORK.name, rf230_get_channel(),
CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1 : NETSTACK_RDC.channel_check_interval()),
rf230_get_txpower());
#if UIP_CONF_IPV6_RPL
PRINTA("RPL Enabled\n");
#endif
#if UIP_CONF_ROUTER
PRINTA("Routing Enabled\n");
#endif
#endif /* ANNOUNCE_BOOT */
#if NETSTACK_CONF_WITH_IPV6 || NETSTACK_CONF_WITH_IPV4
process_start(&tcpip_process, NULL);
#endif
/* Autostart other processes */
autostart_start(autostart_processes);
/*---If using coffee file system create initial web content if necessary---*/
#if COFFEE_FILES
int fa = cfs_open("/index.html", CFS_READ);
if(fa < 0) { /* Make some default web content */
PRINTA("No index.html file found, creating upload.html!\n");
PRINTA("Formatting FLASH file system for coffee...");
cfs_coffee_format();
PRINTA("Done!\n");
fa = cfs_open("/index.html", CFS_WRITE);
int r = cfs_write(fa, &"It works!", 9);
if(r < 0) {
PRINTA("Can''t create /index.html!\n");
}
cfs_close(fa);
/* fa = cfs_open("upload.html"), CFW_WRITE); */
/* <html><body><form action="upload.html" enctype="multipart/form-data" method="post"><input name="userfile" type="file" size="50" /><input value="Upload" type="submit" /></form></body></html> */
}
#endif /* COFFEE_FILES */
/* Add addresses for testing */
#if 0
{
uip_ip6addr_t ipaddr;
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
/* uip_ds6_prefix_add(&ipaddr,64,0); */
}
#endif
/*--------------------------Announce the configuration---------------------*/
#if ANNOUNCE_BOOT
#if AVR_WEBSERVER
{ uint8_t i;
char buf[80];
unsigned int size;
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
if(uip_ds6_if.addr_list[i].isused) {
httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr, buf);
PRINTA("IPv6 Address: %s\n", buf);
}
}
cli();
eeprom_read_block(buf, eemem_server_name, sizeof(eemem_server_name));
sei();
buf[sizeof(eemem_server_name)] = 0;
PRINTA("%s", buf);
cli();
eeprom_read_block(buf, eemem_domain_name, sizeof(eemem_domain_name));
sei();
buf[sizeof(eemem_domain_name)] = 0;
size = httpd_fs_get_size();
#ifndef COFFEE_FILES
PRINTA(".%s online with fixed %u byte web content\n", buf, size);
#elif COFFEE_FILES == 1
PRINTA(".%s online with static %u byte EEPROM file system\n", buf, size);
#elif COFFEE_FILES == 2
PRINTA(".%s online with dynamic %u KB EEPROM file system\n", buf, size >> 10);
#elif COFFEE_FILES == 3
PRINTA(".%s online with static %u byte program memory file system\n", buf, size);
#elif COFFEE_FILES == 4
PRINTA(".%s online with dynamic %u KB program memory file system\n", buf, size >> 10);
#endif /* COFFEE_FILES */
}
#else
PRINTA("Online\n");
#endif
#endif /* ANNOUNCE_BOOT */
ledtimer_red = 1000;
leds_on(LEDS_RED);
}
#if ROUTES && NETSTACK_CONF_WITH_IPV6
static void
ipaddr_add(const uip_ipaddr_t *addr)
{
uint16_t a;
int8_t i, f;
for(i = 0, f = 0; i < sizeof(uip_ipaddr_t); i += 2) {
a = (addr->u8[i] << 8) + addr->u8[i + 1];
if(a == 0 && f >= 0) {
if(f++ == 0) {
PRINTF("::");
}
} else {
if(f > 0) {
f = -1;
} else if(i > 0) {
PRINTF(":");
}
PRINTF("%x", a);
}
}
}
#endif
/*-------------------------------------------------------------------------*/
/*------------------------- Main Scheduler loop----------------------------*/
/*-------------------------------------------------------------------------*/
int
main(void)
{
#if NETSTACK_CONF_WITH_IPV6
uip_ds6_nbr_t *nbr;
#endif /* NETSTACK_CONF_WITH_IPV6 */
initialize();
while(1) {
process_run();
watchdog_periodic();
/* Turn off LED's */
if(ledtimer_red) {
if(--ledtimer_red == 0) {
leds_off(LEDS_RED);
}
}
if(ledtimer_yellow) {
if(--ledtimer_yellow == 0) {
leds_off(LEDS_YELLOW);
}
}
leds_off(LEDS_RED);
leds_off(LEDS_YELLOW);
#if 0
/* Various entry points for debugging in the AVR Studio simulator.
* Set as next statement and step into the routine.
*/
NETSTACK_RADIO.send(packetbuf_hdrptr(), 42);
process_poll(&rf230_process);
packetbuf_clear();
len = rf230_read(packetbuf_dataptr(), PACKETBUF_SIZE);
packetbuf_set_datalen(42);
NETSTACK_RDC.input();
#endif
#if 0
/* Clock.c can trigger a periodic PLL calibration in the RF230BB driver.
* This can show when that happens.
*/
extern uint8_t rf230_calibrated;
if(rf230_calibrated) {
PRINTD("\nRF230 calibrated!\n");
rf230_calibrated = 0;
}
#endif
/* Set DEBUGFLOWSIZE in contiki-conf.h to track path through MAC, RDC, and RADIO */
#if DEBUGFLOWSIZE
if(debugflowsize) {
debugflow[debugflowsize] = 0;
PRINTF("%s", debugflow);
debugflowsize = 0;
}
#endif
#if PERIODICPRINTS
#if TESTRTIMER
/* Timeout can be increased up to 8 seconds maximum.
* A one second cycle is convenient for triggering the various debug printouts.
* The triggers are staggered to avoid printing everything at once.
*/
if(rtimerflag) {
rtimer_set(&rt, RTIMER_NOW() + RTIMER_ARCH_SECOND * 1UL, 1, (void *)rtimercycle, NULL);
rtimerflag = 0;
#else
if(clocktime != clock_seconds()) {
clocktime = clock_seconds();
#endif
#if STAMPS
if((clocktime % STAMPS) == 0) {
#if ENERGEST_CONF_ON
#include "lib/print-stats.h"
print_stats();
#elif RADIOSTATS
extern volatile unsigned long radioontime;
PRINTF("%u(%u)s\n", clocktime, radioontime);
#else
PRINTF("%us\n", clocktime);
#endif
}
#endif
#if TESTRTIMER
clocktime += 1;
#endif
#if PINGS && NETSTACK_CONF_WITH_IPV6
extern void raven_ping6(void);
if((clocktime % PINGS) == 1) {
PRINTF("**Ping\n");
raven_ping6();
}
#endif
#if ROUTES && NETSTACK_CONF_WITH_IPV6
if((clocktime % ROUTES) == 2) {
extern uip_ds6_netif_t uip_ds6_if;
uint8_t i, j;
PRINTF("\nAddresses [%u max]\n", UIP_DS6_ADDR_NB);
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
if(uip_ds6_if.addr_list[i].isused) {
ipaddr_add(&uip_ds6_if.addr_list[i].ipaddr);
PRINTF("\n");
}
}
PRINTF("\nNeighbors [%u max]\n", NBR_TABLE_MAX_NEIGHBORS);
j = 0;
for(nbr = nbr_table_head(ds6_neighbors);
nbr != NULL;
nbr = nbr_table_next(ds6_neighbors, nbr)) {
ipaddr_add(&nbr->ipaddr);
PRINTF("\n");
j++;
}
if(!j) {
PRINTF(" <none>");
}
PRINTF("\nRoutes [%u max]\n", UIP_DS6_ROUTE_NB);
{
uip_ds6_route_t *r;
j = 0;
for(r = uip_ds6_route_head();
r != NULL;
r = uip_ds6_route_next(r)) {
ipaddr_add(&r->ipaddr);
PRINTF("/%u (via ", r->length);
ipaddr_add(uip_ds6_route_nexthop(r));
PRINTF(") %lus\n", r->state.lifetime);
j++;
}
}
if(!j) {
PRINTF(" <none>");
}
PRINTF("\n---------\n");
}
#endif
#if STACKMONITOR
if((clocktime % STACKMONITOR) == 3) {
extern uint16_t __bss_end;
uint16_t p = (uint16_t)&__bss_end;
do {
if(*(uint16_t *)p != 0x4242) {
PRINTF("Never-used stack > %d bytes\n", p - (uint16_t)&__bss_end);
break;
}
p += 10;
} while(p < RAMEND - 10);
}
#endif
}
#endif /* PERIODICPRINTS */
#if RF230BB && 0
extern uint8_t rf230processflag;
if(rf230processflag) {
PRINTF("rf230p%d", rf230processflag);
rf230processflag = 0;
}
#endif
#if RF230BB && 0
extern uint8_t rf230_interrupt_flag;
if(rf230_interrupt_flag) {
/* if (rf230_interrupt_flag!=11) { */
PRINTF("**RI%u", rf230_interrupt_flag);
/* } */
rf230_interrupt_flag = 0;
}
#endif
}
return 0;
}
/*---------------------------------------------------------------------------*/
void
log_message(char *m1, char *m2)
{
PRINTF("%s%s\n", m1, m2);
}

View file

@ -0,0 +1,76 @@
/* Copyright Robert Olsson */
#include <avr/pgmspace.h>
#include <avr/fuse.h>
#include <avr/eeprom.h>
#include <stdio.h>
#include <string.h>
#include <dev/watchdog.h>
#include "params.h"
#include "rss2.h"
#include "contiki.h"
#include "adc.h"
#include "rss2.h"
uint16_t
adc_read(uint8_t pin)
{
uint16_t volt = 0;
int i;
ADMUX = pin; /* ADC pin PA0-PA7 -> 0-7 */
ADCSRB &= ~(1 << MUX5); /* Needs to write before ADMUX pp 418 */
ADMUX |= (1 << REFS1) | (1 << REFS0); /* 1.6 */
/* Maximal Track and Hold time */
ADCSRA = (1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0); /* Prescaler /32 */
ADCSRA |= (1 << ADEN); /* Enable the ADC */
while(!(ADCSRB & (1 << AVDDOK))) ; /* Wait for AVDD ok */
while(!(ADCSRB & (1 << REFOK))) ; /* Wait for ref ok */
/* Ignore first result */
ADCSRA |= (1 << ADSC);
while(ADCSRA & _BV(ADSC)) {
}
ADCW = 0;
#define RES 4
for(i = 0; i < RES; i++) {
/* Start the conversion */
ADCSRA |= (1 << ADSC);
/* Wait for conversion */
while(ADCSRA & (1 << ADSC)) {
}
volt += ADCW;
}
ADMUX = 0; /* turn off internal vref */
volt = volt / RES;
/* Disable the ADC to save power */
ADCSRA &= ~_BV(ADEN);
return volt;
}
double
adc_read_v_in(void)
{
/* Special treatment for v_in. Schottky voltage drop add */
return ((double)adc_read(AV_IN)) * V_IN_FACTOR_SCHOTTKY + SCHOTTKY_DROP;
}
double
adc_read_a1(void)
{
return ((double)adc_read(A1)) * V_IN_FACTOR;
}
double
adc_read_a2(void)
{
return ((double)adc_read(A2)) * V_IN_FACTOR;
}

View file

@ -0,0 +1,16 @@
/* Copyright Robert Olsson */
#define V_IN_FACTOR 0.006256 /* 6.4/1023 */
#define V_IN_FACTOR_NONE 0.001564 /* 1.6/1023 */
#define SCHOTTKY_DROP 0.29
#define V_IN_FACTOR_SCHOTTKY 0.0292 /* 30.19-SCHOTTKY_DROP/1023 schottky corr */
uint16_t
adc_read(uint8_t pin);
double
adc_read_v_in(void);
double
adc_read_a1(void);
double
adc_read_a2(void);

View file

@ -0,0 +1,87 @@
/*
* 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 ADVISE OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*
* -----------------------------------------------------------------
*
* Author : Dag Björklund, Robert Olsson
* Created : 2005-11-01
* Updated : $Date: 2010/08/25 19:30:52 $
* $Revision: 1.11 $
*/
#include "contiki.h"
#include "dev/battery-sensor.h"
#include <util/delay_basic.h>
#define delay_us(us) (_delay_loop_2(1 + (us * F_CPU) / 4000000UL))
const struct sensors_sensor battery_sensor;
/* Returns the MCU voltage in mV read from the BATMON MCU register
* See AtMega chip docs for BATMON details.
*/
static int
value(int type)
{
uint16_t mv;
int i;
/* Resolution is 75mV if V>=2.55V; and 50mV if V<=2.45V */
mv = 3675;
for(i = 0x1f; 1; i--) {
BATMON = i;
delay_us(100);
if(BATMON & 0x20) {
break;
}
if(i == 0x10) { /* Range hi or lo */
mv = 2500;
}
if(i > 0x10) {
mv -= 75;
} else {
mv -= 50;
}
}
return (int)((float)mv);
}
static int
configure(int type, int c)
{
return 0;
}
static int
status(int type)
{
return 1;
}
SENSORS_SENSOR(battery_sensor, BATTERY_SENSOR, value, configure, status);

View file

@ -0,0 +1,41 @@
/* Dummy sensor routine */
#include "lib/sensors.h"
#include "dev/button-sensor.h"
const struct sensors_sensor button_sensor;
static int status(int type);
struct sensors_sensor *sensors[1];
unsigned char sensors_flags[1];
static int
value(int type)
{
return 0;
}
static int
configure(int type, int c)
{
switch(type) {
case SENSORS_ACTIVE:
if(c) {
if(!status(SENSORS_ACTIVE)) {
}
} else {
}
return 1;
}
return 0;
}
static int
status(int type)
{
switch(type) {
case SENSORS_ACTIVE:
case SENSORS_READY:
return 1;
}
return 0;
}
SENSORS_SENSOR(button_sensor, BUTTON_SENSOR,
value, configure, status);

View file

@ -0,0 +1,131 @@
/*
* Copyright (c) 2015, Copyright Markus Hidell, Robert Olsson
* 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.
*
*
* Authors : Markus Hidell, Robert Olsson {mahidell, roolss} @kth.se
* Created : 2015-10-27
* Updated : $Date: 2010/01/14 20:23:02 $
* $Revision: 1.2 $
*/
#include "contiki.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <i2c.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <avr/boot.h>
#include <avr/eeprom.h>
#include "dev/watchdog.h"
#include "lib/list.h"
#include "lib/memb.h"
#include "co2_sa_kxx-sensor.h"
static int
status(int type)
{
return 0;
}
static int
configure(int type, int c)
{
return 0;
}
static int
value(int var)
{
int val, status;
uint8_t buf[2], csum;
int16_t res;
(void) status;
(void) csum;
res = 0;
i2c_start_wait(I2C_CO2SA_ADDR | I2C_WRITE);
if(res) {
goto err;
}
i2c_write(0x22);
i2c_write(0x00);
if(var == CO2_SA_KXX_CO2) {
i2c_write(0x08);
i2c_write(0x2A);
}
if(var == CO2_SA_KXX_TEMP) {
i2c_write(0x12);
i2c_write(0x34);
}
if(var == CO2_SA_KXX_RH) {
i2c_write(0x14);
i2c_write(0x36);
}
i2c_stop();
if(res) {
goto err;
}
clock_delay_msec(20);
res = 0;
i2c_start(I2C_CO2SA_ADDR | I2C_READ);
if(res) {
goto err;
}
status = i2c_readAck();
if(status & 0x01 == 0)
goto err;
buf[0] = i2c_readAck();
buf[1] = i2c_readAck();
csum = i2c_readNak();
i2c_stop();
val = ((int16_t)(buf[0] << 8)) | buf[1];
return val;
err:
i2c_stop();
return 0;
}
SENSORS_SENSOR(co2_sa_kxx_sensor, "CO2", value, configure, status);

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2015, Copyright Markus Hidell, Robert Olsson
* 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.
*
*
* Authors : Markus Hidell, Robert Olsson {mahidell, roolss} @kth.se
* Created : 2015-10-27
* Updated : $Date: 2010/01/14 20:23:02 $
* $Revision: 1.2 $
*/
#ifndef CO2_SA_KXX_SENSOR_H_
#define CO2_SA_KXX_SENSOR_H_
#define CO2_SA_KXX_CO2 0
#define CO2_SA_KXX_TEMP 1
#define CO2_SA_KXX_RH 3
#include "lib/sensors.h"
extern const struct sensors_sensor co2_sa_kxx_sensor;
#define I2C_CO2SA_ADDR (0x68 << 1)
#endif /* CO2_SA_KXX-SENSOR_H_ */

View file

@ -0,0 +1,247 @@
/*
Contiki library for DS18B20 temperature sensor -
For more details see http://xxx
Author -
Author -
License - GPLv3
*/
#include "ds18b20.h"
/* probe_for_ds18b20 probes for the sensor. Returns 0 on failure, 1 on success */
/* Assumptions: only one sensor on the "1-wire bus", on port WSN_DS18B20_PORT */
/* BUG: THIS CODE DOES NOT WORK AS INTENDED! IT RETURNS "1" EVEN WHEN THERE IS NO */
/* SENSOR CONNECTED. */
uint8_t
ds18b20_probe(void)
{
uint8_t result = 0;
/* Reset 1W-bus */
/* Pull PIN low for 480 microseconds (us) */
/* Start with setting bit DS18B20_1_PIN to 0 */
OW_SET_PIN_LOW();
/* then set direction to OUT by setting DS18B20_1_DDR bit to 1 */
OW_SET_OUTPUT();
/* Delay 480 us */
clock_delay_usec(480);
/* See if sensor responds. First release the bus and switch to INput mode */
/* by setting DS18B20_1_DDR bit to 0 */
OW_SET_INPUT();
/* Activate internal pull-up by setting pin to HIGH (when in INput mode) */
/* OW_SET_PIN_HIGH(); */
/* Wait for the pin to go HIGH for 64 us */
clock_delay_usec(64);
/* Now the sensor, if present, pulls the pin LOW for 60-240 us */
/* Detect 0 on PIND bit DS18B20_1_PIN. Invert the result so a presence (aka a 0) */
/* sets "result" to 1 (for success) */
result = !OW_GET_PIN_STATE();
/* The sensor releases the pin so it goes HIGH after 240 us, add some */
/* for the signal to stabilize, say 300 usecs to be on the safe side? */
if(result) {
clock_delay_usec(300);
/* Now the bus should be HIGH again */
result = OW_GET_PIN_STATE();
}
return result;
}
/* Write 1 or 0 on the bus */
void
write_bit(uint8_t bit)
{
/* Set pin to 0 */
OW_SET_OUTPUT();
OW_SET_PIN_LOW();
/* Pin should be 0 for at least 1 us */
clock_delay_usec(2);
/* If we're writing a 1, let interna pull-up pull the bus high */
/* within 15 us of setting the bus to low */
if(bit) {
/* Internal pull-up is activated by setting direction to IN and the */
/* setting the pin to HIGH */
OW_SET_INPUT();
OW_SET_PIN_HIGH();
}
/* OK, now the bus is either LOW, or pulled HIGH by the internal pull-up */
/* Let this state remain for 60 us, then release the bus */
clock_delay_usec(60);
/* Release the bus */
OW_SET_PIN_HIGH();
OW_SET_INPUT();
/* Allow > 1 us between read/write operations */
clock_delay_usec(2);
}
/* */
/* Read one bit of information from the bus, and return it as 1 or 0 */
/* */
uint8_t
read_bit(void)
{
uint8_t bit = 0;
/* Set pin to 0 */
OW_SET_OUTPUT();
OW_SET_PIN_LOW();
/* Pin should be 0 for at least 1 us */
clock_delay_usec(2);
/* Now read the bus, start by setting in/out direction and activating internal */
/* pull-up resistor */
OW_SET_INPUT();
OW_SET_PIN_HIGH();
/* ds18b20 either keeps the pin down or releases the bus and the */
/* bus then goes high because of the interna pull-up resistor */
/* Check whichever happens before 15 us has passed */
clock_delay_usec(15 - 2 - 1);
bit = OW_GET_PIN_STATE();
/* The complete read cycle must last at least 60 us. We have now spent */
/* about 14-15 us in delays, so add another delay to reach >= 60 us */
clock_delay_usec(50);
/* Release bus */
OW_SET_PIN_HIGH();
OW_SET_INPUT();
/* Allow > 1 us between read/write operations */
clock_delay_usec(2);
return bit ? 1 : 0;
}
/* */
/* Read one byte of information. A byte is read least significant bit first */
/* */
uint8_t
read_byte(void)
{
uint8_t result = 0;
uint8_t bit;
int i;
for(i = 0; i < 8; i++) {
bit = read_bit();
result += (bit << i);
}
return result;
}
/* */
/* Write one byte of information. A byte is written least significant bit first */
/* */
void
write_byte(uint8_t byte)
{
int i;
for(i = 0; i < 8; i++) {
write_bit((byte >> i) & 1);
}
}
/* */
/* ds18b20_get_temp returns the temperature in "temp" (in degrees celsius) */
/* Returns 0 on failure (and then "temp" is left unchanged */
/* Returns 1 on success, and sets temp */
/* */
uint8_t
ds18b20_get_temp(float *temp)
{
uint8_t result = 0;
/* Reset bus by probing. Probe returns 1 on success/presence of sensor */
if(ds18b20_probe()) {
/* write command "skip rom" since we only have one sensor on the wire! */
write_byte(DS18B20_COMMAND_SKIP_ROM);
/* write command to start measurement */
write_byte(DS18B20_COMMAND_START_CONVERSION);
/* Wait for conversion to complete */
/* Conversion is 12-bit by default. */
/* Since we have external power to the sensor (ie not in "parasitic power" mode) */
/* the bus is held LOW by the sensor while the conversion is going on, and then HIGH */
/* when conversion is finished. */
OW_SET_INPUT();
int count = 0;
while(!OW_GET_PIN_STATE()) {
clock_delay_msec(10);
count++;
/* Longest conversion time is 750 ms (12-bit resolution) */
/* So if count > 80 (for a little margin!), we return -274.0 */
/* which indicates failure to read the temperature. */
if(count > 80) {
return 0;
}
}
/* The result is stored in the "scratch pad", a 9 byte memory block. */
/* The first two bytes are the conversion result. Reading the scratch pad */
/* can be terminated by sending a reset signal (but we read all 9 bytes) */
(void)ds18b20_probe();
write_byte(DS18B20_COMMAND_SKIP_ROM);
write_byte(DS18B20_COMMAND_READ_SCRATCH_PAD);
uint8_t i, sp_arr[9];
for(i = 0; i < 9; i++) {
sp_arr[i] = read_byte();
}
/* Check CRC, if mismatch, return 0 (failure to read temperature) */
uint8_t crc_cal = crc8_ds18b20(sp_arr, 8);
if(crc_cal != sp_arr[8]) {
return 0;
}
/* OK, now decode what the temperature reading is. This code assumes 12-bit resolution, */
/* so this must be modified if the code is modified to use any other resolution! */
int16_t temp_res;
uint8_t temp_lsb = sp_arr[0];
uint8_t temp_msb = sp_arr[1];
temp_res = (int16_t)temp_msb << 8 | temp_lsb;
*temp = (float)temp_res * 0.0625;
result = 1;
}
return result;
}
/* */
/* crc8 algorithm for ds18b20 */
/* http://www.miscel.dk/MiscEl/CRCcalculations.html */
/* */
uint8_t
crc8_ds18b20(uint8_t *buf, uint8_t buf_len)
{
uint8_t result = 0;
uint8_t i, b;
for(i = 0; i < buf_len; i++) {
result = result ^ buf[i];
for(b = 1; b < 9; b++) {
if(result & 0x1) {
result = (result >> 1) ^ 0x8C;
} else {
result = result >> 1;
}
}
}
return result;
}

View file

@ -0,0 +1,83 @@
/*
* Copyright (c) 2012-2013, Robert Olsson <robert@radio-sensors.com>
* 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 copyright holder 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 COPYRIGHT HOLDERS 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
* COPYRIGHT HOLDER 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.
*
*/
#include <avr/pgmspace.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include "dev/watchdog.h"
#include "contiki.h"
#include "i2c.h"
#include <compat/twi.h>
#include <stdio.h>
#include <string.h>
#include "enc28j60_avr.h"
#include <util/delay_basic.h>
#define delay_us(us) (_delay_loop_2(1 + (us * F_CPU) / 4000000UL))
void
enc28j60_arch_spi_init(void)
{
CS_SPI_DDR |= (1 << SPI_CS);
CS_SPI_PORT |= (1 << SPI_CS);
SPI_DDR |= (1 << SPI_MOSI) | (1 << SPI_SCK);
SPI_DDR &= ~(1 << SPI_MISO);
SPI_PORT &= ~(1 << SPI_MOSI);
SPI_PORT &= ~(1 << SPI_SCK);
SPCR = (1 << SPE) | (1 << MSTR);
/* SPSR |= (1<<SPI2X); */
}
uint8_t
enc28j60_arch_spi_write(uint8_t data)
{
SPDR = data;
while(!(SPSR & (1 << SPIF))) ;
return SPDR;
}
uint8_t
enc28j60_arch_spi_read(void)
{
SPDR = 0xAA; /* dummy */
while(!(SPSR & (1 << SPIF))) ;
return SPDR;
}
void
enc28j60_arch_spi_select(void)
{
CS_SPI_PORT &= ~(1 << SPI_CS);
delay_us(1000);
}
void
enc28j60_arch_spi_deselect(void)
{
CS_SPI_PORT |= (1 << SPI_CS);
}

View file

@ -0,0 +1,53 @@
/*
* Copyright (c) 2012-2013, Robert Olsson <robert@radio-sensors.com>
* 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 copyright holder 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 COPYRIGHT HOLDERS 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
* COPYRIGHT HOLDER 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.
*
*/
#ifndef ENC28J60_AVR_H
#define ENC28J60_AVR_H
#define SPI_DDR DDRB /* Data Direction Register: Port B */
#define SPI_PORT PORTB /* Serial Peripheral Interface */
#define SPI_MOSI 2 /* PB2: Master Out Slave In */
#define SPI_MISO 3 /* PB3: Master In Slave out */
#define SPI_SCK 1 /* PB1: Serial Clock */
#define CS_SPI_DDR DDRD /* Data Direction Register: Port B */
#define CS_SPI_PORT PORTD /* Serial Peripheral Interface */
#define SPI_CS 6 /* PD6: OW2_PIN, Chip Select */
/* AVR specific's for enc28j60 */
void enc28j60_arch_spi_init(void);
uint8_t enc28j60_arch_spi_write(uint8_t data);
uint8_t enc28j60_arch_spi_read(void);
void enc28j60_arch_spi_select(void);
void enc28j60_arch_spi_deselect(void);
#endif /* ENC28J60_AVR_H */

228
platform/avr-rss2/dev/i2c.c Normal file
View file

@ -0,0 +1,228 @@
/*
* Copyright (c) 2010, 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.
*
*/
/**
* \file
* i2c core functions
* \author
* Robert Olsson <robert@radio-sensors.com>
*/
#include <avr/pgmspace.h>
#include <avr/pgmspace.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include "dev/watchdog.h"
#include "contiki.h"
#include "i2c.h"
#include <compat/twi.h>
#include <stdio.h>
#include <string.h>
#include "dev/co2_sa_kxx-sensor.h"
void
i2c_init(uint32_t speed)
{
/* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
TWSR = 0; /* no prescaler */
TWBR = ((F_CPU / speed) - 16) / 2; /* must be > 10 for stable operation */
}
uint8_t
i2c_start(uint8_t addr)
{
uint8_t twst;
uint32_t n;
/* Send START condition */
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
/* Wait until transmission completed */
for(n = 0; n < 100000 && !(TWCR & (1 << TWINT)); n++) {
}
if(n >= 100000) {
return 1;
}
/* check value of TWI Status Register. Mask prescaler bits. */
twst = TW_STATUS & 0xF8;
if((twst != TW_START) && (twst != TW_REP_START)) {
return 1;
}
/* send device address */
TWDR = addr;
TWCR = (1 << TWINT) | (1 << TWEN);
/* wail until transmission completed and ACK/NACK has been received */
for(n = 0; n < 100000 && !(TWCR & (1 << TWINT)); n++) {
}
if(n >= 100000) {
return 1;
}
/* check value of TWI Status Register. Mask prescaler bits. */
twst = TW_STATUS & 0xF8;
if((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
return 1;
}
return 0;
}
void
i2c_start_wait(uint8_t addr)
{
uint8_t twst;
while ( 1 )
{
// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
// send device address
TWDR = addr;
TWCR = (1<<TWINT) | (1<<TWEN);
// wail until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
{
/* device busy, send stop condition to terminate write operation */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
// wait until stop condition is executed and bus released
while(TWCR & (1<<TWSTO));
continue;
}
//if( twst != TW_MT_SLA_ACK) return 1;
break;
}
}
void
i2c_stop(void)
{
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
/* wait until ready */
while(TWCR & (1<<TWSTO));
}
void
i2c_write(uint8_t u8data)
{
TWDR = u8data;
TWCR = (1 << TWINT) | (1 << TWEN);
while((TWCR & (1 << TWINT)) == 0) ;
}
uint8_t
i2c_readAck(void)
{
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA);
while((TWCR & (1 << TWINT)) == 0) ;
return TWDR;
}
uint8_t
i2c_readNak(void)
{
TWCR = (1 << TWINT) | (1 << TWEN);
while((TWCR & (1 << TWINT)) == 0) ;
return TWDR;
}
static void
print_delim(int p, char *s, const char *d)
{
if(p) {
printf("%s", d);
}
printf("%s", s);
}
void
i2c_write_mem(uint8_t addr, uint8_t reg, uint8_t value)
{
i2c_start(addr | I2C_WRITE);
i2c_write(reg);
i2c_write(value);
i2c_stop();
}
void
i2c_read_mem(uint8_t addr, uint8_t reg, uint8_t buf[], uint8_t bytes)
{
uint8_t i = 0;
i2c_start(addr | I2C_WRITE);
i2c_write(reg);
i2c_start(addr | I2C_READ);
for(i = 0; i < bytes; i++) {
if(i == bytes - 1) {
buf[i] = i2c_readNak();
} else {
buf[i] = i2c_readAck();
}
}
i2c_stop();
}
void
i2c_at24mac_read(char *buf, uint8_t eui64)
{
if(eui64) {
i2c_read_mem(I2C_AT24MAC_ADDR, 0x98, (uint8_t *)buf, 8);
}
/* 128bit unique serial number */
else {
i2c_read_mem(I2C_AT24MAC_ADDR, 0x80, (uint8_t *)buf, 16);
}
}
uint16_t
i2c_probe(void)
{
int p = 0;
const char *del = ",";
uint16_t probed = 0;
watchdog_periodic();
if(!i2c_start(I2C_AT24MAC_ADDR)) {
i2c_stop();
probed |= I2C_AT24MAC;
print_delim(p++, "AT24MAC", del);
}
watchdog_periodic();
if(!i2c_start(I2C_SHT2X_ADDR)) {
i2c_stop();
probed |= I2C_SHT2X;
print_delim(p++, "SHT2X", del);
}
watchdog_periodic();
if(!i2c_start(I2C_CO2SA_ADDR)) {
i2c_stop();
probed |= I2C_CO2SA;
print_delim(p++, "CO2SA", del);
}
return probed;
}

View file

@ -0,0 +1,65 @@
/*
* Copyright (c) 2010, 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.
*
*/
/**
* \file
* includes for i2c core functions
* \author
* Robert Olsson <robert@radio-sensors.com>
*/
#include "contiki.h"
/* Here we define the i2c address for dev we support */
#define I2C_AT24MAC_ADDR 0xB0 /* EUI64 ADDR */
#define I2C_SHT2X_ADDR (0x40 << 1) /* SHT2X ADDR */
/* Here we define a enumration for devices */
#define I2C_AT24MAC (1<<0)
#define I2C_SHT2X (1<<1)
#define I2C_CO2SA (1<<2) /* Sense-Air CO2 */
#define I2C_READ 1
#define I2C_WRITE 0
void i2c_init(uint32_t speed);
uint8_t i2c_start(uint8_t addr);
void i2c_start_wait(uint8_t addr);
void i2c_stop(void);
void i2c_write(uint8_t u8data);
uint8_t i2c_readAck(void);
uint8_t i2c_readNak(void);
uint8_t i2c_getstatus(void);
uint16_t i2c_probe(void);
void i2c_read_mem(uint8_t addr, uint8_t reg, uint8_t buf[], uint8_t bytes);
void i2c_write_mem(uint8_t addr, uint8_t reg, uint8_t value);
void i2c_at24mac_read(char *buf, uint8_t eui64);
extern uint16_t i2c_probed; /* i2c devices we have probed */

View file

@ -0,0 +1,45 @@
#include <avr/pgmspace.h>
#include "rss2.h"
#include "leds.h"
void
leds_init(void)
{
DDRE |= (1 << LED_RED);
DDRE |= (1 << LED_YELLOW);
/* Off */
leds_off(LEDS_ALL);
}
void
leds_on(unsigned char ledv)
{
if(ledv & LEDS_YELLOW) {
PORTE &= ~(1 << LED_YELLOW);
}
if(ledv & LEDS_RED) {
PORTE &= ~(1 << LED_RED);
}
}
void
leds_off(unsigned char ledv)
{
if(ledv & LEDS_YELLOW) {
PORTE |= (1 << LED_YELLOW);
}
if(ledv & LEDS_RED) {
PORTE |= (1 << LED_RED);
}
}
void
leds_toggle(unsigned char ledv)
{
}
void
leds_invert(unsigned char ledv)
{
}
unsigned char
leds_get(void)
{
return 0;
}

View file

@ -0,0 +1,17 @@
#ifndef CONTIKI_LED_H_
#define CONTIKI_LED_H_
#define LEDS_GREEN 1
#define LEDS_YELLOW 2
#define LEDS_RED 4
#define LEDS_ALL 7
void leds_init(void); /* Initialize the LEDs driver. */
unsigned char leds_get(void); /* Get the status of a LED. */
void leds_on(unsigned char ledv); /* Turn on a set of LEDs. */
void leds_off(unsigned char ledv); /* Turn off a set of LEDs. */
void leds_toggle(unsigned char ledv); /* Toggle a set of LEDs. */
void leds_invert(unsigned char ledv); /* Toggle a set of LEDs. */
#endif /* CONTIKI_LED_H_ */

View file

@ -0,0 +1,64 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson
* 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.
*
*/
#include "contiki.h"
#include "lib/sensors.h"
#include "dev/light-sensor.h"
#include "rss2.h"
#include "adc.h"
const struct sensors_sensor light_sensor;
/*---------------------------------------------------------------------------*/
static int
value(int type)
{
return adc_read(A3);
}
/*---------------------------------------------------------------------------*/
static int
status(int type)
{
return 0;
}
/*---------------------------------------------------------------------------*/
static int
configure(int type, int c)
{
DDRF &= ~(1 << A3); /* Light sensor */
DDRF &= ~(1 << A3_PWR);
PORTF |= (1 << A3_PWR); /* Light sensor */
return 0;
}
/*---------------------------------------------------------------------------*/
SENSORS_SENSOR(light_sensor, "Light", value, configure, status);

View file

@ -0,0 +1,45 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson
* 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.
*
*
* Author : Robert Olsson
* Created : 2015-10-27
* Updated : $Date: 2010/01/14 20:23:02 $
* $Revision: 1.2 $
*/
#ifndef LIGHT_SENSOR_H_
#define LIGHT_SENSOR_H_
#include "lib/sensors.h"
extern const struct sensors_sensor light_sensor;
#endif /* LIGHT-SENSOR_H_ */

View file

@ -0,0 +1,120 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-11-22
*/
#include "contiki.h"
#include "lib/sensors.h"
#include "dev/pulse-sensor.h"
#include "rss2.h"
const struct sensors_sensor pulse_sensor;
#define NP 2
uint32_t volatile pc[NP];
/*
* Note interrupt sources can be woken up from sleep mode PWR_SAVE
* Two interrupt ports, #0 green terminal block. #1 pin header via
* a comparator.
*/
static void
port_irq_ctrl(uint8_t on)
{
if(on) {
DDRD &= ~(1 << PD2);
PORTD &= ~(1 << PD2);
EIMSK = 0;
EICRA |= 0x20; /* Falling edge INT2 */
EIMSK |= (1 << PD2); /* Enable interrupt for pin */
/* p1 port */
DDRD &= ~(1 << PD3);
PORTD &= ~(1 << PD3);
EIMSK |= (1 << PD3); /* Enable interrupt for pin */
EICRA |= 0x80; /* Falling edge */
PCICR |= (1 << PCIE0); /* And enable irq PCINT 7:0 */
} else {
EICRA = 0;
PORTD |= (1 << PD2);
EIMSK &= ~(1 << PD2); /* Disable interrupt for pin */
PORTD |= (1 << PD3);
EIMSK &= ~(1 << PD3); /* Disable interrupt for pin */
}
}
ISR(INT2_vect)
{
if(!(PCICR & (1 << PCIE0))) {
return;
}
pc[0]++;
}
ISR(INT3_vect)
{
if(!(PCICR & (1 << PCIE0))) {
return;
}
pc[1]++;
}
/*---------------------------------------------------------------------------*/
static int
value(int type)
{
if(type == 0) {
return (int)pc[0];
}
if(type == 1) {
return (int)pc[1];
}
return -1;
}
/*---------------------------------------------------------------------------*/
static int
status(int type)
{
return 0;
}
/*---------------------------------------------------------------------------*/
static int
configure(int type, int c)
{
port_irq_ctrl(1); /* Enable pulse counts */
return 0;
}
/*---------------------------------------------------------------------------*/
SENSORS_SENSOR(pulse_sensor, "Pulse", value, configure, status);

View file

@ -0,0 +1,43 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-11-22
*/
#ifndef PULSE_SENSOR_H_
#define PULSE_SENSOR_H_
#include "lib/sensors.h"
extern const struct sensors_sensor pulse_sensor;
#endif /* PULSE-SENSOR_H_ */

View file

@ -0,0 +1,292 @@
/*
* Copyright (c) 2015, Copyright Per Lindgren <per.o.lindgren@gmail.com>
* 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.
*
*
* Author : Per Lindgren <per.o.lindgren@gmail.com>
* Hacked by: Robert Olsson robert@radio-sensors.com
* Created : 2015-11-22
*/
#include "contiki.h"
#include "dev/temp-sensor.h"
#include <util/delay_basic.h>
#define delay_us(us) (_delay_loop_2(1 + (us * F_CPU) / 4000000UL))
const struct sensors_sensor temp_mcu_sensor;
/* probe_for_ds18b20 probes for the sensor. Returns 0 on failure, 1 on success
* Assumptions: only one sensor on the "1-wire bus", on port WSN_DS18B20_PORT
* BUG: THIS CODE DOES NOT WORK AS INTENDED! IT RETURNS "1" EVEN WHEN THERE
* IS NO SENSOR CONNECTED.
*/
uint8_t
ds18b20_probe(void)
{
uint8_t result = 0;
/* Reset 1W-bus */
/* Pull PIN low for 480 microseconds (us)
* Start with setting bit DS18B20_1_PIN to 0 */
OW_SET_PIN_LOW();
/* then set direction to OUT by setting DS18B20_1_DDR bit to 1 */
OW_SET_OUTPUT();
/* Delay 480 us */
clock_delay_usec(480);
/* See if sensor responds. First release the bus and switch to INput mode
* by setting DS18B20_1_DDR bit to 0 */
OW_SET_INPUT();
/* Activate internal pull-up by setting pin to HIGH (when in INput mode)
* OW_SET_PIN_HIGH();
* Wait for the pin to go HIGH for 64 us */
clock_delay_usec(64);
/* Now the sensor, if present, pulls the pin LOW for 60-240 us
* Detect 0 on PIND bit DS18B20_1_PIN. Invert the result so a presence
* (aka * a 0) sets "result" to 1 (for success) */
result = !OW_GET_PIN_STATE();
/* The sensor releases the pin so it goes HIGH after 240 us, add some
for the signal to stabilize, say 300 usecs to be on the safe side? */
if(result) {
clock_delay_usec(300);
/* Now the bus should be HIGH again */
result = OW_GET_PIN_STATE();
}
return result;
}
/* Write 1 or 0 on the bus */
void
write_bit(uint8_t bit)
{
/* Set pin to 0 */
OW_SET_OUTPUT();
OW_SET_PIN_LOW();
/* Pin should be 0 for at least 1 us */
clock_delay_usec(2);
/* If we're writing a 1, let interna pull-up pull the bus high
* within 15 us of setting the bus to low */
if(bit) {
/* Internal pull-up is activated by setting direction to IN and the
* setting the pin to HIGH */
OW_SET_INPUT();
OW_SET_PIN_HIGH();
}
/* OK, now the bus is either LOW, or pulled HIGH by the internal pull-up
* Let this state remain for 60 us, then release the bus */
clock_delay_usec(60);
/* Release the bus */
OW_SET_PIN_HIGH();
OW_SET_INPUT();
/* Allow > 1 us between read/write operations */
clock_delay_usec(2);
}
/* Read one bit of information from the bus, and return it as 1 or 0 */
uint8_t
read_bit(void)
{
uint8_t bit = 0;
/* Set pin to 0 */
OW_SET_OUTPUT();
OW_SET_PIN_LOW();
/* Pin should be 0 for at least 1 us */
clock_delay_usec(2);
/* Now read the bus, start by setting in/out direction and activating
* internal pull-up resistor */
OW_SET_INPUT();
OW_SET_PIN_HIGH();
/* ds18b20 either keeps the pin down or releases the bus and the
* bus then goes high because of the interna pull-up resistor
* Check whichever happens before 15 us has passed */
clock_delay_usec(15 - 2 - 1);
bit = OW_GET_PIN_STATE();
/* The complete read cycle must last at least 60 us. We have now spent
* about 14-15 us in delays, so add another delay to reach >= 60 us */
clock_delay_usec(50);
/* Release bus */
OW_SET_PIN_HIGH();
OW_SET_INPUT();
/* Allow > 1 us between read/write operations */
clock_delay_usec(2);
return bit ? 1 : 0;
}
/* Read one byte of information. A byte is read least significant bit first */
uint8_t
read_byte(void)
{
uint8_t result = 0;
uint8_t bit;
int i;
for(i = 0; i < 8; i++) {
bit = read_bit();
result += (bit << i);
}
return result;
}
/* Write one byte of information. A byte is written least significant bit first */
void
write_byte(uint8_t byte)
{
int i;
for(i = 0; i < 8; i++) {
write_bit((byte >> i) & 1);
}
}
/* ds18b20_get_temp returns the temperature in "temp" (in degrees celsius)
* Returns 0 on failure (and then "temp" is left unchanged
* Returns 1 on success, and sets temp */
uint8_t
ds18b20_get_temp(double *temp)
{
uint8_t result = 0;
/* Reset bus by probing. Probe returns 1 on success/presence of sensor */
if(ds18b20_probe()) {
/* write command "skip rom" since we only have one sensor on the wire! */
write_byte(DS18B20_COMMAND_SKIP_ROM);
/* write command to start measurement */
write_byte(DS18B20_COMMAND_START_CONVERSION);
/* Wait for conversion to complete. Conversion is 12-bit by default.
* Since we have external power to the sensor (ie not in "parasitic power"
* mode) the bus is held LOW by the sensor while the conversion is going
* on, and then HIGH when conversion is finished. */
OW_SET_INPUT();
int count = 0;
while(!OW_GET_PIN_STATE()) {
clock_delay_msec(10);
count++;
/* Longest conversion time is 750 ms (12-bit resolution)
* So if count > 80 (for a little margin!), we return -274.0
* which indicates failure to read the temperature. */
if(count > 80) {
return 0;
}
}
/* The result is stored in the "scratch pad", a 9 byte memory block.
* The first two bytes are the conversion result. Reading the scratch pad
* can be terminated by sending a reset signal (but we read all 9 bytes) */
(void)ds18b20_probe();
write_byte(DS18B20_COMMAND_SKIP_ROM);
write_byte(DS18B20_COMMAND_READ_SCRATCH_PAD);
uint8_t i, sp_arr[9];
for(i = 0; i < 9; i++) {
sp_arr[i] = read_byte();
}
/* Check CRC, if mismatch, return 0 (failure to read temperature) */
uint8_t crc_cal = crc8_ds18b20(sp_arr, 8);
if(crc_cal != sp_arr[8]) {
return 0;
}
/* OK, now decode what the temperature reading is. This code assumes
* 12-bit resolution, so this must be modified if the code is modified
* to use any other resolution! */
int16_t temp_res;
uint8_t temp_lsb = sp_arr[0];
uint8_t temp_msb = sp_arr[1];
temp_res = (int16_t)temp_msb << 8 | temp_lsb;
*temp = (double)temp_res * 0.0625;
result = 1;
}
return result;
}
/* crc8 algorithm for ds18b20 */
/* http://www.miscel.dk/MiscEl/CRCcalculations.html */
uint8_t
crc8_ds18b20(uint8_t *buf, uint8_t buf_len)
{
uint8_t result = 0;
uint8_t i, b;
for(i = 0; i < buf_len; i++) {
result = result ^ buf[i];
for(b = 1; b < 9; b++) {
if(result & 0x1) {
result = (result >> 1) ^ 0x8C;
} else {
result = result >> 1;
}
}
}
return result;
}
static int
value(int type)
{
double t;
int ret;
ret = ds18b20_get_temp(&t);
/* Return temp multiplied by 100 for two decimals */
if(ret)
return (int) (t * 100);
/* Error return largest negative value */
return 0x8000;
}
static int
configure(int type, int c)
{
ds18b20_probe();
return 0;
}
static int
status(int type)
{
return 1;
}
SENSORS_SENSOR(temp_sensor, TEMP_SENSOR, value, configure, status);

View file

@ -0,0 +1,71 @@
/*
* Copyright (c) 2015, Copyright Per Lindgren <per.o.lindgren@gmail.com>
* 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.
*
*
* Author : Per Lindgren <per.o.lindgren@gmail.com>
* Hacked by: Robert Olsson robert@radio-sensors.com
* Created : 2015-11-22
*/
#ifndef TEMP_SENSOR_H_
#define TEMP_SENSOR_H_
#include "lib/sensors.h"
#include <sys/clock.h>
#include "contiki.h"
#include "rss2.h"
#define DS18B20_1_PIN OW_BUS_0
#define DS18B20_1_IN PIND
#define DS18B20_1_OUT PORTD
#define DS18B20_1_DDR DDRD
#define OW_SET_PIN_LOW() (DS18B20_1_OUT &= ~(1 << DS18B20_1_PIN))
#define OW_SET_PIN_HIGH() (DS18B20_1_OUT |= (1 << DS18B20_1_PIN))
#define OW_SET_OUTPUT() (DS18B20_1_DDR |= (1 << DS18B20_1_PIN))
#define OW_SET_INPUT() (DS18B20_1_DDR &= ~(1 << DS18B20_1_PIN))
#define OW_GET_PIN_STATE() ((DS18B20_1_IN & (1 << DS18B20_1_PIN)) ? 1 : 0)
#define DS18B20_COMMAND_READ_SCRATCH_PAD 0xBE
#define DS18B20_COMMAND_START_CONVERSION 0x44
#define DS18B20_COMMAND_SKIP_ROM 0xCC
/* probe_for_ds18b20 probes for the sensor. Returns 0 on failure, 1 on success
* Assumption: only one sensor on the "1-wire bus", on port DS18B20_1_PIN */
extern uint8_t ds18b20_probe(void);
extern uint8_t ds18b20_get_temp(double *temp);
extern uint8_t crc8_ds18b20(uint8_t *buf, uint8_t buf_len);
extern const struct sensors_sensor temp_sensor;
#define TEMP_SENSOR "temp"
#endif /* TEMP_SENSOR_H_ */

View file

@ -0,0 +1,90 @@
/*
* 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 ADVISE OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*
* -----------------------------------------------------------------
*
* Author : Robert Olsson
* Created : 2015-10-27
* Updated : $Date: 2010/08/25 19:30:52 $
* $Revision: 1.11 $
*/
#include "contiki.h"
#include "dev/temp_mcu-sensor.h"
#include <util/delay_basic.h>
#define delay_us(us) (_delay_loop_2(1 + (us * F_CPU) / 4000000UL))
const struct sensors_sensor temp_mcu_sensor;
/* Returns the MCU temp in C*10 read from the BATMON MCU register
* See AtMega chip docs for BATMON details.
*/
static int
value(int type)
{
uint16_t v;
ADCSRB |= (1 << MUX5); /* this bit buffered till ADMUX written to! */
ADMUX = 0xc9;
/* ADC on /32 ADC start */
ADCSRA = (1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0);
ADCSRA |= (1 << ADEN); /* Enable the ADC */
while(!(ADCSRB & (1 << AVDDOK))) ; /* Wait for AVDD ok */
while(!(ADCSRB & (1 << REFOK))) ; /* Wait for ref ok */
ADCSRA |= (1 << ADSC); /* Throwaway conversion */
while
(ADCSRA & (1 << ADSC)) ;
ADCSRA |= (1 << ADSC); /* Start conversion */
while
(ADCSRA & (1 << ADSC)) ;
v = ADC;
/* Disable the ADC to save power */
ADCSRA &= ~_BV(ADEN);
/* ADMUX = 0; //turn off internal vref */
return (int)((double)(v * 1.13 - 272.8) * 10);
}
static int
configure(int type, int c)
{
return 0;
}
static int
status(int type)
{
return 1;
}
SENSORS_SENSOR(temp_mcu_sensor, TEMP_MCU_SENSOR, value, configure, status);

View file

@ -0,0 +1,47 @@
/*
* 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.
*
*
* -----------------------------------------------------------------
*
* Author : Robert Olsson
* Created : 2015-10-27
* Updated : $Date: 2007/11/13 20:36:40 $
* $Revision: 1.1 $
*/
#ifndef TEMP_MCU_SENSOR_H_
#define TEMP_MCU_SENSOR_H_
#include "lib/sensors.h"
extern const struct sensors_sensor temp_mcu_sensor;
#define TEMP_MCU_SENSOR "temp_mcu"
#endif /* TEMP_MCU_SENSOR_H_ */

View file

@ -0,0 +1,25 @@
# Atmega256RFR2 @ 20C, UNT-61E, RSS2 Mote 2015-12-30
# TX-PWR RPC=0x0 vs RPC=0xFF. Current mA
#
15 14.6 11.8
14 15.0 12.1
13 15.3 12.5
12 15.6 12.8
11 15.9 13.1
10 16.1 13.4
9 16.3 13.7
8 16.5 13.8
7 16.7 13.9
6 16.9 14.0
5 17.0 14.2
4 17.2 14.3
3 17.2 14.5
2 17.2 14.6
1 17.3 14.6
0 17.4 14.5
RX 13.7 7.3
IDLE 0 0

View file

@ -0,0 +1,9 @@
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
CONTIKI_PROJECT = avr_radio_power
APPS+=powertrace
all: $(CONTIKI_PROJECT)
CONTIKI = ../../../..
CONTIKI_WITH_RIME = 1
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1,79 @@
avr_radio_power
===============
Motivation
-----------
Spins over different radio seting for the Atmel radio. The motivation is to
get understanding and also to get correct data for avrora and Contiki
simulations. Program loops over different TX-power setting and measures
RX consumption also radio off and idle power use in SLEEP_MODE_PWR_SAVE is
measured. Program disables radio duty cycling (RDC) and sets MCU in deep
sleep mode to only get radio consumption.
Usage
-----
The different setting is printed on the terminal. You need a way to measure
the current consumption and relate to the tests.
Example
-------
Program printout with added measurements. The used board was RSS2 mote
with a AtMega256RFR2 CPU. Max is when 0xFF is written to the RPC register.
Run/setup Current use
------------------------------------------------
TX with PWR=0 RPC=0x00 17.80 mA (MAX TX-pwr)
TX with PWR=1 RPC=0x00 17.74
TX with PWR=2 RPC=0x00
TX with PWR=3 RPC=0x00
TX with PWR=4 RPC=0x00
TX with PWR=5 RPC=0x00 17.43
TX with PWR=6 RPC=0x00
TX with PWR=7 RPC=0x00
TX with PWR=8 RPC=0x00
TX with PWR=9 RPC=0x00 17.68
TX with PWR=10 RPC=0x00
TX with PWR=11 RPC=0x00
TX with PWR=12 RPC=0x00
TX with PWR=13 RPC=0x00
TX with PWR=14 RPC=0x00
TX with PWR=15 RPC=0x00
RX with RPC=0x00 -------------------- 13.43 (RX)
-------------------------------------------------
TX with PWR=0 RPC=0xff 14.63 mA (MAX TX-pwr)
TX with PWR=1 RPC=0xff
TX with PWR=2 RPC=0xff
TX with PWR=3 RPC=0xff
TX with PWR=4 RPC=0xff
TX with PWR=5 RPC=0xff
TX with PWR=6 RPC=0xff 14.45
TX with PWR=7 RPC=0xff
TX with PWR=8 RPC=0xff
TX with PWR=9 RPC=0xff
TX with PWR=10 RPC=0xff
TX with PWR=11 RPC=0xff
TX with PWR=12 RPC=0xff
TX with PWR=13 RPC=0xff
TX with PWR=14 RPC=0xff
TX with PWR=15 RPC=0xff
RX with RPC=0xFF -------------------- 7.11 (RX)
RX radio off 0.001 mA
Comments
--------
We see TX consumption decreases from 17.80 to 14.63 mA using Max RPC (0xFF).
NOTE! For RX 13.43 to 7.11 mA. Nice. This actual measurements.
The avr-rss2 port adds support for the AtMegaXXXRFR2 including the new RPC
function.
References
----------
Atmel application note. AT02594: Smart Reduced Power Consumption Techniques
[Here] (http://www.atmel.com/images/atmel-42356-smart-reduced-power-consumption-techniques_applicationnote_at02594.pdf)
Multimeter UNI-T UT61E with USB-logging.

View file

@ -0,0 +1,164 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-12-30
*/
/**
* \file
* An application for monitoring current use on Atmel
* radios also supporting the RPC function on RFR2 chips.
* Current needs to be measured with amp-meter.
*/
#include "contiki.h"
#include "net/rime/rime.h"
#include "powertrace.h"
#include <stdio.h>
#include "dev/leds.h"
#include "rf230bb.h"
#include "net/packetbuf.h"
#include "net/rime/rimestats.h"
#include "net/netstack.h"
#include <avr/sleep.h>
#include <dev/watchdog.h>
#define TEST_PERIOD 6
static int ps = 0; /* Power-save false */
static char buf[110];
static struct etimer et;
PROCESS(power_use_process, "Power use test");
PROCESS(sleep_process, "Sleep process");
AUTOSTART_PROCESSES(&power_use_process, &sleep_process);
static void
broadcast_recv(struct broadcast_conn *c, const linkaddr_t *from)
{
printf("broadcast message received from %d.%d: '%s'\n",
from->u8[0], from->u8[1], (char *)packetbuf_dataptr());
}
static const struct broadcast_callbacks broadcast_call = {broadcast_recv};
static struct broadcast_conn broadcast;
PROCESS_THREAD(power_use_process, ev, data)
{
static int i, j;
PROCESS_EXITHANDLER(broadcast_close(&broadcast);)
PROCESS_BEGIN();
/* powertrace_start(CLOCK_SECOND * 2); */
broadcast_open(&broadcast, 129, &broadcast_call);
leds_init();
rf230_set_channel(25);
for(i=0; i < 2; i++) { /* Loop over min and max rpc settings */
NETSTACK_RADIO.off(); /* Radio off for rpc change */
NETSTACK_RADIO.off();
etimer_set(&et, CLOCK_SECOND * 8);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
if(i == 0)
rf230_set_rpc(0x0); /* Disbable all RPC features */
else
rf230_set_rpc(0xFF); /* Enable all RPC features. Only XRFR2 radios */
NETSTACK_RADIO.on();
/* Loop over the different TX power settings 0-15 */
for(j=15; j >= 0; j--) {
NETSTACK_RADIO.on();
rf230_set_txpower(j);
ps = 0;
printf("TX with PWR=%d RPC=0x%02x\n", rf230_get_txpower(), rf230_get_rpc());
ps = 1;
etimer_set(&et, CLOCK_SECOND * TEST_PERIOD);
while(1) {
if(etimer_expired(&et))
break;
packetbuf_copyfrom(buf, sizeof(buf)); /* Dummy data */
broadcast_send(&broadcast);
PROCESS_PAUSE();
//leds_on(LEDS_RED);
}
/* Barrier so we can see next run */
NETSTACK_RADIO.off();
etimer_set(&et, CLOCK_SECOND * TEST_PERIOD);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
}
/* RX */
NETSTACK_RADIO.on();
ps = 0;
printf("RX radio on RPC=0x%02x\n", rf230_get_rpc());
ps = 1;
etimer_set(&et, CLOCK_SECOND * TEST_PERIOD);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
NETSTACK_RADIO.off();
}
/* Last just RX OFF*/
ps = 0;
printf("RX radio off\n");
ps = 1;
etimer_set(&et, CLOCK_SECOND * TEST_PERIOD);
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
PROCESS_END();
}
/* Sleep process is just put MCU in sleep so we minimiza MCU impact */
PROCESS_THREAD(sleep_process, ev, data)
{
PROCESS_BEGIN();
while(1) {
watchdog_periodic();
if(ps)
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
else
set_sleep_mode(SLEEP_MODE_IDLE);
cli();
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
sei();
PROCESS_PAUSE();
}
PROCESS_END();
}

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-11-22
*/
/**
* \file
* Project specific configuration defines for example
*
*/
#ifndef PROJECT_CONF_H_
#define PROJECT_CONF_H_
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
//#define NETSTACK_CONF_MAC csma_driver
//#define NETSTACK_CONF_RDC contikimac_driver
#endif /* PROJECT_CONF_H_ */

View file

@ -0,0 +1,19 @@
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
CONTIKI_PROJECT = hello-sensors
all: $(CONTIKI_PROJECT)
# We use floating vars. Add library.
PRINTF_LIB_FLT = -Wl,-u,vfprintf -lprintf_flt -lm
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
PRINTF_LIB = $(PRINTF_LIB_FLT)
CLIBS = $(PRINTF_LIB)
CUSTOM_RULE_LINK = 1
%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a
$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@ $(CLIBS)
CONTIKI = ../../../..
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1,11 @@
Hello-sensors
=============
Simple demo to read out sensors from the RSS2 mote.
Demo uses double which has the same size as float on Atmel. We sacrifice
some bytes for this.
Build
-----
make TARGET=avr-rss2

View file

@ -0,0 +1,119 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-11-22
*/
/**
* \file
* A simple application showing sensor reading on RSS2 mote
*/
#include "contiki.h"
#include "sys/etimer.h"
#include <stdio.h>
#include "adc.h"
#include "i2c.h"
#include "dev/leds.h"
#include "dev/battery-sensor.h"
#include "dev/temp-sensor.h"
#include "dev/temp_mcu-sensor.h"
#include "dev/light-sensor.h"
#include "dev/pulse-sensor.h"
#ifdef CO2
#include "dev/co2_sa_kxx-sensor.h"
#endif
/*---------------------------------------------------------------------------*/
PROCESS(hello_sensors_process, "Hello sensor process");
AUTOSTART_PROCESSES(&hello_sensors_process);
static struct etimer et;
static void
read_values(void)
{
char serial[16];
int i;
/* Read out mote unique 128 bit ID */
i2c_at24mac_read((char *) &serial, 0);
printf("128_bit_ID=");
for(i=0; i < 15; i++)
printf("%02x", serial[i]);
printf("%02x\n", serial[15]);
printf("T=%-5.2f", ((double) temp_sensor.value(0)/100.));
printf(" V_MCU=%-3.1f", ((double) battery_sensor.value(0))/1000.);
printf(" V_IN=%-4.2f", adc_read_v_in());
printf(" V_AD1=%-4.2f", adc_read_a1());
printf(" V_AD2=%-4.2f", adc_read_a2());
printf(" T_MCU=%-4.1f", ((double) temp_mcu_sensor.value(0)/10.));
printf(" LIGHT=%-d", light_sensor.value(0));
printf(" PULSE_0=%-d", pulse_sensor.value(0));
printf(" PULSE_1=%-d", pulse_sensor.value(1));
#ifdef CO2
printf(" CO2=%-d", co2_sa_kxx_sensor.value( CO2_SA_KXX_CO2));
#endif
printf("\n");
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_sensors_process, ev, data)
{
PROCESS_BEGIN();
SENSORS_ACTIVATE(temp_sensor);
SENSORS_ACTIVATE(battery_sensor);
SENSORS_ACTIVATE(temp_mcu_sensor);
SENSORS_ACTIVATE(light_sensor);
SENSORS_ACTIVATE(pulse_sensor);
#ifdef CO2
SENSORS_ACTIVATE(co2_sa_kxx_sensor);
#endif
leds_init();
leds_on(LEDS_RED);
leds_on(LEDS_YELLOW);
/*
* Delay 5 sec
* Gives a chance to trigger some pulses
*/
etimer_set(&et, CLOCK_SECOND * 5);
while(1) {
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
read_values();
etimer_reset(&et);
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-11-22
*/
/**
* \file
* Project specific configuration defines for example
*
*/
#ifndef PROJECT_CONF_H_
#define PROJECT_CONF_H_
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
//#define NETSTACK_CONF_MAC csma_driver
//#define NETSTACK_CONF_RDC contikimac_driver
#endif /* PROJECT_CONF_H_ */

View file

@ -0,0 +1,49 @@
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
all: coap-client coap-server
APPS=servreg-hack
CONTIKI=../../../../..
ifdef WITH_COMPOWER
APPS+=powertrace
CFLAGS+= -DCONTIKIMAC_CONF_COMPOWER=1 -DWITH_COMPOWER=1 -DQUEUEBUF_CONF_NUM=4
endif
ifdef SERVER_REPLY
CFLAGS+=-DSERVER_REPLY=$(SERVER_REPLY)
endif
ifdef PERIOD
CFLAGS+=-DPERIOD=$(PERIOD)
endif
### -------------------------------------------------------- ###
#CONTIKI_TARGET_SOURCEFILES += control.c vdc.c
# automatically build RESTful resources
REST_RESOURCES_DIR = ./resources
REST_RESOURCES_FILES = $(notdir $(shell find $(REST_RESOURCES_DIR) -name '*.c'))
DC_SENSOR_DIR = ./dev
DC_SENSOR_FILES = $(notdir $(shell find $(DC_SENSOR_DIR) -name '*.c'))
PROJECTDIRS += $(REST_RESOURCES_DIR) $(DC_SENSOR_DIR)
PROJECT_SOURCEFILES += $(REST_RESOURCES_FILES) $(DC_SENSOR_FILES)
# linker optimizations
SMALL=1
# REST Engine shall use Erbium CoAP implementation
APPS += er-coap
APPS += rest-engine
#CFLAGS += -DUIP_CONF_BUFFER_SIZE=384
CFLAGS += -DREST_MAX_CHUNK_SIZE=128
CFLAGS += -DCOAP_MAX_HEADER_SIZE=64
CFLAGS += -DUIP_CONF_TCP=0
### -------------------------------------------------------- ###
CONTIKI_WITH_IPV6 = 1
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1,67 @@
Example: mockup of DC converter functionality for IoT-grid.
===========================================
This example imitates DC converter functionality for IoT-grid.
We use standard IoT protocol stack with CoAP application-level protocol.
The settings are as follows.
* APPLICATION: CoAP
* TRANSPORT: UDP
* NETWORK: IPv6/RPL
* ADAPTATION: 6LoWPAN
* MAC: nullmac_driver
* RADIO DUTY CYCLE: nullrdc_driver
* PHYSICAL: IEEE 802.15.4
CoAP resources
----------------
We define a CoAP resource for each functionality of DC converter.
Since each functionality may have several parameters, we define each resource
as a vector of parameters as follows.
* /dcdc/status read-only parameters for power monitoring.
It also support periodic monitoring through CoAP observe option.
** 0 VOUT Output voltage
** 1 VIN Input voltage
** 2 IOUT Output current
** 3 IIN Input current
* /dcdc/vdc configurable parameters for voltage droop control function.
** 0 VGRID Desired grid output voltage
** 1 SLOPE Slope of voltage droop control function
** 2 PMAX Maximum output power allowed
* /dcdc/hwcfg configurable parameters for DC converter hardware.
** 0 VMAX Maximum output voltage allowed
** 1 IMAX Maximum output current allowed
Each functionality is implemented as a sensor type device.
They are located in "dev" folder.
* dc-status-sensor for /dcdc/status
* dc-vdc-sensor for /dcdc/vdc
* dc-hw-sensor for /dcdc/hwcfg
The corresponding CoAP handler for each resource is defined in "resources" folder.
* res-dc-status-obs for /dcdc/status
* res-dc-vdc for /dcdc/vdc
* res-dc-hwcfg for /dcdc/hwcfg
coap-server.c
----------------
The server acts as the RPL root node.
It has 3 CoAP resources as described above.
coap-client.c
----------------
The client periodically send a CoAP command (either GET or PUT) to monitor/update
values of parameters of a resource.
project-conf.h
----------------
This file contains definitions needed for this IoT-grid example as follows.
* Enable IPv6 network stack
* Set nullrdc_driver
* Set nullmac_driver
* Activate CoAP observe client library (COAP_OBSERVE_CLIENT = 1)
* Increase the maximum number of observee and maximum number of open transaction to 10
(COAP_MAX_OPEN_TRANSACTIONS and COAP_MAX_OBSERVEES = 10)

View file

@ -0,0 +1,413 @@
/*
* 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.
*
*/
#include "contiki.h"
#include "contiki-net.h"
#include "lib/random.h"
#include "sys/ctimer.h"
#include "net/ip/uip.h"
#include "net/ipv6/uip-ds6.h"
#include "net/ip/uip-udp-packet.h"
#ifdef WITH_COMPOWER
#include "powertrace.h"
#endif
#include <stdio.h>
#include <string.h>
/**************************************************************************/
/* from er-rest-example/er-rexample-client.c */
#include <stdlib.h>
#include "er-coap-engine.h"
#include "er-coap.h"
#include "er-coap-observe-client.h"
/* #include "dev/button-sensor.h" */
#if PLATFORM_HAS_LEDS
#include "dev/leds.h"
#endif
#define DEBUG 1
#if DEBUG
#include <stdio.h>
#define PRINTF(...) printf(__VA_ARGS__)
#define PRINT6ADDR(addr) PRINTF("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15])
#define PRINTLLADDR(lladdr) PRINTF("[%02x:%02x:%02x:%02x:%02x:%02x]", (lladdr)->addr[0], (lladdr)->addr[1], (lladdr)->addr[2], (lladdr)->addr[3], (lladdr)->addr[4], (lladdr)->addr[5])
#else
#define PRINTF(...)
#define PRINT6ADDR(addr)
#define PRINTLLADDR(addr)
#endif
/* FIXME: This server address is hard-coded for Cooja and link-local for unconnected border router. */
/* #define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0212, 0x7402, 0x0002, 0x0202) / * cooja2 * / */
/* #define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xbbbb, 0, 0, 0, 0, 0, 0, 0x1) */
/* #define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0x2000, 0, 0, 0, 0, 0, 0, 0x0001) */
#define LOCAL_PORT UIP_HTONS(COAP_DEFAULT_PORT + 1)
#define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT)
#define GET_INTERVAL 10
/* #define OBSERVE_INTERVAL 10 */
/**************************************************************************/
#define UDP_CLIENT_PORT 8765
#define UDP_SERVER_PORT 5678
#define UDP_EXAMPLE_ID 190
/* #define DEBUG DEBUG_PRINT */
/* #include "net/ip/uip-debug.h" */
#ifndef PERIOD
/* #define PERIOD 60 */
#define PERIOD 10
#endif
#define START_INTERVAL (15 * CLOCK_SECOND)
#define SEND_INTERVAL (PERIOD * CLOCK_SECOND)
#define SEND_TIME (random_rand() % (SEND_INTERVAL))
/* static struct uip_udp_conn *client_conn; */
static uip_ipaddr_t server_ipaddr;
static coap_observee_t *obs;
static int count_notify = 0;
/**************************************************************************/
static struct etimer et;
/* Example URIs that can be queried. */
#define NUMBER_OF_URLS 4
/* leading and ending slashes only for demo purposes, get cropped automatically when setting the Uri-Path */
char *service_urls[NUMBER_OF_URLS] =
{ ".well-known/core", "/dcdc/status", "/dcdc/vdc", "/dcdc/hwcfg" };
/*
#if PLATFORM_HAS_BUTTON
static int uri_switch = 0;
#endif
*/
/* This function is will be passed to COAP_BLOCKING_REQUEST() to handle responses. */
void
client_chunk_handler(void *response)
{
const uint8_t *chunk;
int len = coap_get_payload(response, &chunk);
#if PLATFORM_HAS_LEDS
/* set red led when receiving a packet */
leds_on(LEDS_RED);
#endif
/* printf("|%.*s", len, (char *)chunk); */
printf("RX: %d\n%s\n", len, (char *)chunk);
}
/**************************************************************************/
/*---------------------------------------------------------------------------*/
PROCESS(coap_client_process, "CoAP client process");
AUTOSTART_PROCESSES(&coap_client_process);
/*---------------------------------------------------------------------------*/
static void
tcpip_handler(void)
{
char *str;
if(uip_newdata()) {
str = uip_appdata;
str[uip_datalen()] = '\0';
printf("DATA recv '%s'\n", str);
}
}
/*---------------------------------------------------------------------------*/
static void
print_local_addresses(void)
{
int i;
uint8_t state;
PRINTF("Client IPv6 addresses: ");
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
state = uip_ds6_if.addr_list[i].state;
if(uip_ds6_if.addr_list[i].isused &&
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
PRINTF("\n");
/* hack to make address "final" */
if(state == ADDR_TENTATIVE) {
uip_ds6_if.addr_list[i].state = ADDR_PREFERRED;
}
}
}
}
/*---------------------------------------------------------------------------*/
static void
set_global_address(void)
{
uip_ipaddr_t ipaddr;
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
/* The choice of server address determines its 6LoPAN header compression.
* (Our address will be compressed Mode 3 since it is derived from our link-local address)
* Obviously the choice made here must also be selected in udp-server.c.
*
* For correct Wireshark decoding using a sniffer, add the /64 prefix to the 6LowPAN protocol preferences,
* e.g. set Context 0 to aaaa::. At present Wireshark copies Context/128 and then overwrites it.
* (Setting Context 0 to aaaa::1111:2222:3333:4444 will report a 16 bit compressed address of aaaa::1111:22ff:fe33:xxxx)
*
* Note the IPCMV6 checksum verification depends on the correct uncompressed addresses.
*/
#if 0
/* Mode 1 - 64 bits inline */
uip_ip6addr(&server_ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 1);
#elif 1
/* Mode 2 - 16 bits inline */
uip_ip6addr(&server_ipaddr, 0xaaaa, 0, 0, 0, 0, 0x00ff, 0xfe00, 1);
#else
/* Mode 3 - derived from server link-local (MAC) address */
uip_ip6addr(&server_ipaddr, 0xaaaa, 0, 0, 0, 0x0250, 0xc2ff, 0xfea8, 0xcd1a); /* redbee-econotag */
#endif
/* Voravit Added */
/* PRINTF("VORAVIT CLIENT: SERVER IPv6 addresses: \n"); */
/* PRINT6ADDR(&server_ipaddr); */
}
/*---------------------------------------------------------------------------*/
static void
generate_random_payload(int type, char *msg)
{
if(type == 2) { /* /dcdc/vdc */
snprintf((char *)msg, 64, "&VG=%d&SL=%d&PMX=%d", (random_rand() % 25) + 1, (random_rand() % 10) + 1, (random_rand() % 100) + 1);
} else if(type == 3) { /* /dcdc/hwcfg */
snprintf((char *)msg, 64, "&VMX=%d&IMX=%d", (random_rand() % 25) + 1, (random_rand() % 6) + 1);
}
}
/*----------------------------------------------------------------------------*/
/*
* Handle the response to the observe request and the following notifications
*/
static void
notification_callback(coap_observee_t *obs, void *notification, coap_notification_flag_t flag)
{
int len = 0;
const uint8_t *payload = NULL;
/* printf("Notification handler\n"); */
/* printf("Observee URI: %s\n", obs->url); */
if(notification) {
len = coap_get_payload(notification, &payload);
}
switch(flag) {
case NOTIFICATION_OK:
count_notify++;
printf("NOTIFICATION OK: %d\n%*s\n", count_notify, len, (char *)payload);
break;
case OBSERVE_OK: /* server accepeted observation request */
printf("OBSERVE_OK: \n%*s\n", len, (char *)payload);
break;
case OBSERVE_NOT_SUPPORTED:
printf("OBSERVE_NOT_SUPPORTED: \n%*s\n", len, (char *)payload);
obs = NULL;
break;
case ERROR_RESPONSE_CODE:
printf("ERROR_RESPONSE_CODE: \n%*s\n", len, (char *)payload);
obs = NULL;
break;
case NO_REPLY_FROM_SERVER:
printf("NO_REPLY_FROM_SERVER: "
"removing observe registration with token %x%x\n",
obs->token[0], obs->token[1]);
obs = NULL;
break;
}
}
/*---------------------------------------------------------------------------*/
/*
* Toggle the observation of the remote resource
*/
void
toggle_observation(void)
{
if(obs) {
printf("Stopping observation\n");
coap_obs_remove_observee(obs);
obs = NULL;
} else {
printf("Starting observation\n");
obs = coap_obs_request_registration(&server_ipaddr, REMOTE_PORT, service_urls[1], notification_callback, NULL);
}
}
/*---------------------------------------------------------------------------*/
static int count_get = 0;
static int count_put = 0;
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(coap_client_process, ev, data)
{
/*
#if WITH_COMPOWER
static int print = 0;
#endif
*/
PROCESS_BEGIN();
PROCESS_PAUSE();
set_global_address();
PRINTF("CoAP client process started\n");
print_local_addresses();
/**************************************************************************/
static coap_packet_t request[1]; /* This way the packet can be treated as pointer as usual. */
/* receives all CoAP messages */
coap_init_engine();
etimer_set(&et, GET_INTERVAL * CLOCK_SECOND);
while(1) {
PROCESS_YIELD();
if(ev == tcpip_event) {
printf("TCPIP_HANDLER\n");
tcpip_handler();
}
if(etimer_expired(&et)) {
count_get++;
/*---------------------------------------------------------------------------*/
if(count_get < 10) { /* we do normal GET 3 times for each resource */
/* TEST GET: looping through the 3 resources: status, vdc, hwcfg */
/* Also CoAP GET doesn't need to have a payload */
coap_init_message(request, COAP_TYPE_CON, COAP_GET, 0);
if(count_get % 3 == 1) {
coap_set_header_uri_path(request, service_urls[1]);
PRINTF("GET %d: %s\n", count_get, service_urls[1]);
} else if(count_get % 3 == 2) {
coap_set_header_uri_path(request, service_urls[2]);
PRINTF("GET %d: %s\n", count_get, service_urls[2]);
} else {
coap_set_header_uri_path(request, service_urls[3]);
PRINTF("GET %d: %s\n", count_get, service_urls[3]);
}
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
COAP_BLOCKING_REQUEST(&server_ipaddr, REMOTE_PORT, request,
client_chunk_handler);
} /* if (count_get < 10) */
/*---------------------------------------------------------------------------*/
/* test PUT: vdc and hwcfg on odd and even packet */
/* every 10th timer we PUT a resource: vdc and hwcfg alternately */
if(count_get % 10 == 0) {
/* static char msg[64] = ""; */
char msg[64] = "";
/*---------------------------------------------------------------------------*/
/* We read CO2 sensor if it is enable */
#ifdef CO2
coap_init_message(request, COAP_TYPE_CON, COAP_GET, 0);
coap_set_header_uri_path(request, "/dcdc/co2");
PRINTF("GET %d: %s\n", count_get, "/dcdc/co2");
#if PLATFORM_HAS_LEDS
leds_on(LEDS_YELLOW);
#endif
COAP_BLOCKING_REQUEST(&server_ipaddr, REMOTE_PORT, request,
client_chunk_handler);
#endif
/*---------------------------------------------------------------------------*/
count_put++;
coap_init_message(request, COAP_TYPE_CON, COAP_PUT, 0);
if(count_put % 2 == 0) {
coap_set_header_uri_path(request, service_urls[3]);
generate_random_payload(3, msg);
coap_set_payload(request, (uint8_t *)msg, sizeof(msg) - 1);
PRINTF("PUT %d: %s PAYLOAD: %s\n", count_get, service_urls[3], msg);
} else {
coap_set_header_uri_path(request, service_urls[2]);
generate_random_payload(2, msg);
coap_set_payload(request, (uint8_t *)msg, sizeof(msg) - 1);
PRINTF("PUT %d: %s PAYLOAD: %s\n", count_get, service_urls[2], msg);
}
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
COAP_BLOCKING_REQUEST(&server_ipaddr, REMOTE_PORT, request,
client_chunk_handler);
}
/* after 2 more timeout we do GET to check the resource new value */
if((count_get > 10) && ((count_get - 2) % 10 == 0)) {
coap_init_message(request, COAP_TYPE_CON, COAP_GET, 0);
if(count_put % 2 == 0) {
coap_set_header_uri_path(request, service_urls[3]);
PRINTF("GET %d: %s\n", count_get, service_urls[3]);
} else {
coap_set_header_uri_path(request, service_urls[2]);
PRINTF("GET %d: %s\n", count_get, service_urls[2]);
}
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
COAP_BLOCKING_REQUEST(&server_ipaddr, REMOTE_PORT, request,
client_chunk_handler);
}
/*---------------------------------------------------------------------------*/
/* test GET with observe option when timer expires the 15th time */
if(count_get == 15) {
/* PRINTF("GET %d: OBSERVE: %s\n", count_get, service_urls[2]); */
toggle_observation();
}
etimer_reset(&et);
}
} /* END_WHILE(1) */
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,269 @@
/*
* 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.
*
*/
#include "contiki.h"
#include "contiki-lib.h"
#include "contiki-net.h"
#include "net/ip/uip.h"
#include "net/rpl/rpl.h"
#include "net/netstack.h"
/* #include "dev/leds.h" */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/*
#define DEBUG DEBUG_PRINT
#include "net/ip/uip-debug.h"
*/
/**************************************************************************/
/* add mock-up code for DC-DC converter */
/* #include "control.h" */
/* #include "vdc.h" */
#ifdef CO2
#include "dev/co2_sa_kxx-sensor.h"
#endif
#include "dev/dc-status-sensor.h"
#include "dev/dc-vdc-sensor.h"
#include "dev/dc-hw-sensor.h"
/* from er-rest-example/er-rexample-server.c */
#include "rest-engine.h"
/* #include "er-coap.h" */
#if PLATFORM_HAS_LEDS
#include "dev/leds.h"
#endif
/*
#if PLATFORM_HAS_BUTTON
#include "dev/button-sensor.h"
#endif
*/
#define DEBUG 1
#if DEBUG
/* #include <stdio.h> */
#define PRINTF(...) printf(__VA_ARGS__)
#define PRINT6ADDR(addr) PRINTF("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15])
#define PRINTLLADDR(lladdr) PRINTF("[%02x:%02x:%02x:%02x:%02x:%02x]", (lladdr)->addr[0], (lladdr)->addr[1], (lladdr)->addr[2], (lladdr)->addr[3], (lladdr)->addr[4], (lladdr)->addr[5])
#else
#define PRINTF(...)
#define PRINT6ADDR(addr)
#define PRINTLLADDR(addr)
#endif
/* #define TOGGLE_INTERVAL 10 */
/* #define OBSERVE_INTERVAL 10 */
/*
* Resources to be activated need to be imported through the extern keyword.
* The build system automatically compiles the resources in the corresponding sub-directory.
*/
extern resource_t
/* res_hello, */
/* res_push, */
/* res_event, */
/* res_sub; */
/* res_dc_status_obs; */
/* res_dc_status, */
#ifdef CO2
res_dc_co2,
#endif
res_dc_status_obs,
res_dc_vdc,
res_dc_hwcfg;
/*
#if PLATFORM_HAS_LEDS
extern resource_t
// res_leds,
res_toggle;
#endif
*/
/* #if PLATFORM_HAS_LIGHT */
/* #include "dev/light-sensor.h" */
/* extern resource_t res_light; */
/* #endif */
/**************************************************************************/
PROCESS(coap_server_process, "CoAP server process");
AUTOSTART_PROCESSES(&coap_server_process);
/*---------------------------------------------------------------------------*/
static void
print_local_addresses(void)
{
int i;
uint8_t state;
PRINTF("Server IPv6 addresses: ");
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
state = uip_ds6_if.addr_list[i].state;
if(state == ADDR_TENTATIVE || state == ADDR_PREFERRED) {
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
PRINTF("\n");
/* hack to make address "final" */
if(state == ADDR_TENTATIVE) {
uip_ds6_if.addr_list[i].state = ADDR_PREFERRED;
}
}
}
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(coap_server_process, ev, data)
{
uip_ipaddr_t ipaddr;
struct uip_ds6_addr *root_if;
PROCESS_BEGIN();
PROCESS_PAUSE();
/* SENSORS_ACTIVATE(button_sensor); */
#ifdef CO2
SENSORS_ACTIVATE(co2_sa_kxx_sensor);
#endif
SENSORS_ACTIVATE(dc_status_sensor);
SENSORS_ACTIVATE(dc_vdc_sensor);
SENSORS_ACTIVATE(dc_hw_sensor);
/**************************************************************************/
#if PLATFORM_HAS_LEDS
/* initialize leds */
leds_init();
leds_on(LEDS_RED);
leds_on(LEDS_YELLOW);
#endif
/* Initilize DC-DC converter parameters */
/* ValueInit(); */
/* VDCInit(); */
/*
#ifdef PARAMS_CHANNEL
PRINTF("PARAMs channel: %u\n", PARAMS_CHANNEL);
#endif
*/
#ifdef RF_CHANNEL
PRINTF("RF channel: %u\n", RF_CHANNEL);
#endif
#ifdef IEEE802154_PANID
PRINTF("PAN ID: 0x%04X\n", IEEE802154_PANID);
#endif
PRINTF("uIP buffer: %u\n", UIP_BUFSIZE);
PRINTF("LL header: %u\n", UIP_LLH_LEN);
PRINTF("IP+UDP header: %u\n", UIP_IPUDPH_LEN);
PRINTF("REST max chunk: %u\n", REST_MAX_CHUNK_SIZE);
/* Initialize the REST engine. */
rest_init_engine();
/*
* Bind the resources to their Uri-Path.
* WARNING: Activating twice only means alternate path, not two instances!
* All static variables are the same for each URI path.
*/
/* rest_activate_resource(&res_hello, "test/hello"); */
/* rest_activate_resource(&res_mirror, "debug/mirror"); */
/* rest_activate_resource(&res_chunks, "test/chunks"); */
/* rest_activate_resource(&res_separate, "test/separate"); */
/* rest_activate_resource(&res_push, "test/push"); */
/* rest_activate_resource(&res_event, "sensors/button"); */
/* rest_activate_resource(&res_sub, "test/sub"); */
/* rest_activate_resource(&res_b1_sep_b2, "test/b1sepb2"); */
#ifdef CO2
rest_activate_resource(&res_dc_co2, "dcdc/co2");
#endif
rest_activate_resource(&res_dc_status_obs, "dcdc/status");
/* rest_activate_resource(&res_dc_status, "dcdc/status"); */
rest_activate_resource(&res_dc_vdc, "dcdc/vdc");
rest_activate_resource(&res_dc_hwcfg, "dcdc/hwcfg");
/* #if PLATFORM_HAS_LEDS */
/* / * rest_activate_resource(&res_leds, "actuators/leds"); * / */
/* rest_activate_resource(&res_toggle, "actuators/toggle"); */
/* #endif */
/* #if PLATFORM_HAS_LIGHT */
/* rest_activate_resource(&res_light, "sensors/light"); */
/* SENSORS_ACTIVATE(light_sensor); */
/* #endif */
/**************************************************************************/
PRINTF("CoAP server started\n");
#if UIP_CONF_ROUTER
/* The choice of server address determines its 6LoPAN header compression.
* Obviously the choice made here must also be selected in udp-client.c.
*
* For correct Wireshark decoding using a sniffer, add the /64 prefix to the 6LowPAN protocol preferences,
* e.g. set Context 0 to aaaa::. At present Wireshark copies Context/128 and then overwrites it.
* (Setting Context 0 to aaaa::1111:2222:3333:4444 will report a 16 bit compressed address of aaaa::1111:22ff:fe33:xxxx)
* Note Wireshark's IPCMV6 checksum verification depends on the correct uncompressed addresses.
*/
#if 0
/* Mode 1 - 64 bits inline */
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 1);
#elif 1
/* Mode 2 - 16 bits inline */
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0x00ff, 0xfe00, 1);
#else
/* Mode 3 - derived from link local (MAC) address */
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
#endif
uip_ds6_addr_add(&ipaddr, 0, ADDR_MANUAL);
root_if = uip_ds6_addr_lookup(&ipaddr);
if(root_if != NULL) {
rpl_dag_t *dag;
dag = rpl_set_root(RPL_DEFAULT_INSTANCE, (uip_ip6addr_t *)&ipaddr);
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
rpl_set_prefix(dag, &ipaddr, 64);
PRINTF("created a new RPL dag\n");
} else {
PRINTF("failed to create a new RPL DAG\n");
}
#endif /* UIP_CONF_ROUTER */
print_local_addresses();
/* The data sink runs with a 100% duty cycle in order to ensure high
packet reception rates. */
NETSTACK_MAC.off(1);
while(1) {
PROCESS_WAIT_EVENT();
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,168 @@
<?xml version="1.0" encoding="UTF-8"?>
<simconf>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mrm</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mspsim</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/avrora</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/native_gateway</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/serial_socket</project>
<project EXPORT="discard">/home/user/contikiprojects/sics.se/mobility</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/collect-view</project>
<project EXPORT="discard">/home/user/contikiprojects/sics.se/powertracker</project>
<simulation>
<title>My simulation</title>
<randomseed>123456</randomseed>
<motedelay_us>1000000</motedelay_us>
<radiomedium>
se.sics.cooja.radiomediums.UDGM
<transmitting_range>50.0</transmitting_range>
<interference_range>100.0</interference_range>
<success_ratio_tx>1.0</success_ratio_tx>
<success_ratio_rx>1.0</success_ratio_rx>
</radiomedium>
<events>
<logoutput>40000</logoutput>
</events>
<motetype>
se.sics.cooja.avrmote.RSS2MoteType
<identifier>mote1</identifier>
<description>Mote1</description>
<source EXPORT="discard">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/dc-rpl-coap/coap-server.c</source>
<commands EXPORT="discard">make coap-server.avr-rss2 TARGET=avr-rss2 MCU=atmega128rfr2</commands>
<firmware EXPORT="copy">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/dc-rpl-coap/coap-server.avr-rss2</firmware>
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraClock</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraMoteID</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart0</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart1</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.RFR2Radio</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraADC</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraLED</moteinterface>
</motetype>
<motetype>
se.sics.cooja.avrmote.RSS2MoteType
<identifier>mote2</identifier>
<description>Mote2</description>
<source EXPORT="discard">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/dc-rpl-coap/coap-client.c</source>
<commands EXPORT="discard">make coap-client.avr-rss2 TARGET=avr-rss2 MCU=atmega128rfr2</commands>
<firmware EXPORT="copy">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/dc-rpl-coap/coap-client.avr-rss2</firmware>
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraClock</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraMoteID</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart0</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart1</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.RFR2Radio</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraADC</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraLED</moteinterface>
</motetype>
<mote>
<breakpoints />
<interface_config>
se.sics.cooja.interfaces.Position
<x>100.0</x>
<y>100.0</y>
<z>0.0</z>
</interface_config>
<interface_config>
se.sics.cooja.avrmote.interfaces.AvroraMoteID
<id>1</id>
</interface_config>
<motetype_identifier>mote1</motetype_identifier>
</mote>
<mote>
<breakpoints />
<interface_config>
se.sics.cooja.interfaces.Position
<x>110.0</x>
<y>100.0</y>
<z>0.0</z>
</interface_config>
<interface_config>
se.sics.cooja.avrmote.interfaces.AvroraMoteID
<id>2</id>
</interface_config>
<motetype_identifier>mote2</motetype_identifier>
</mote>
</simulation>
<plugin>
se.sics.cooja.plugins.SimControl
<width>280</width>
<z>9</z>
<height>160</height>
<location_x>400</location_x>
<location_y>0</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.Visualizer
<plugin_config>
<moterelations>true</moterelations>
<skin>se.sics.cooja.plugins.skins.IDVisualizerSkin</skin>
<skin>se.sics.cooja.plugins.skins.GridVisualizerSkin</skin>
<viewport>3.908924509090908 0.0 0.0 3.908924509090908 -216.43707345454544 -217.89245090909074</viewport>
</plugin_config>
<width>400</width>
<z>5</z>
<height>400</height>
<location_x>1</location_x>
<location_y>1</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.LogListener
<plugin_config>
<filter />
<formatted_time />
<coloring />
</plugin_config>
<width>1269</width>
<z>8</z>
<height>240</height>
<location_x>400</location_x>
<location_y>160</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.Notes
<plugin_config>
<notes>Enter notes here</notes>
<decorations>true</decorations>
</plugin_config>
<width>989</width>
<z>6</z>
<height>160</height>
<location_x>680</location_x>
<location_y>0</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.MoteInterfaceViewer
<mote_arg>0</mote_arg>
<plugin_config>
<interface>Serial port</interface>
<scrollpos>0,0</scrollpos>
</plugin_config>
<width>508</width>
<z>4</z>
<height>389</height>
<location_x>13</location_x>
<location_y>413</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.MoteInterfaceViewer
<mote_arg>1</mote_arg>
<plugin_config>
<interface>Serial port</interface>
<scrollpos>0,0</scrollpos>
</plugin_config>
<width>545</width>
<z>3</z>
<height>392</height>
<location_x>531</location_x>
<location_y>413</location_y>
</plugin>
</simconf>

View file

@ -0,0 +1,93 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/hwcfg for DC-DC converter hardware configuration
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#include "contiki.h"
/* #include "lib/sensors.h" */
#include "dev/dc-hw-sensor.h"
const struct sensors_sensor dc_hw_sensor;
/*
* hw contains 2 parameters
* hw[0] VMAX
* hw[1] IMAX
*/
uint32_t volatile hw[2] = { 25, 6 };
static int
value(int type)
{
switch(type) {
case 0:
return hw[0];
case 1:
return hw[1];
}
return -1;
}
static int
configure(int type, int c)
{
switch(type) {
case 0:
if((c >= 0) && (c <= 25)) {
hw[0] = c;
return 0;
} else {
return 1;
}
case 1:
if((c >= 0) && (c <= 6)) {
hw[1] = c;
return 0;
} else {
return 0;
}
}
return 1;
}
static int
status(int type)
{
return 1;
}
SENSORS_SENSOR(dc_hw_sensor, "hw sensors", value, configure, status);

View file

@ -0,0 +1,46 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/hwcfg header file
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#ifndef DC_HW_SENSOR_H
#define DC_HW_SENSOR_H
#include "lib/sensors.h"
extern const struct sensors_sensor dc_hw_sensor;
#endif /* DC_HW_SENSOR_H */

View file

@ -0,0 +1,84 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/status read-only parameters for power monitoring
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#include "contiki.h"
/* #include "lib/sensors.h" */
#include "dev/dc-status-sensor.h"
const struct sensors_sensor dc_status_sensor;
/*
* Status contains 4 parameters
* status[0] VOUT
* status[1] VIN
* status[2] IOUT
* status[3] IIN
*/
uint32_t volatile s[4] = { 18, 20, 1, 2 };
static int
value(int type)
{
switch(type) {
case 0:
return s[0];
case 1:
return s[1];
case 2:
return s[2];
case 3:
return s[3];
}
return -1;
}
static int
configure(int type, int c)
{
return 0;
}
static int
status(int type)
{
return 1;
}
SENSORS_SENSOR(dc_status_sensor, "DC status sensors", value, configure, status);

View file

@ -0,0 +1,46 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/status header file
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#ifndef DC_STATUS_SENSOR_H
#define DC_STATUS_SENSOR_H
#include "lib/sensors.h"
extern const struct sensors_sensor dc_status_sensor;
#endif /* DC_STATUS_SENSOR_H */

View file

@ -0,0 +1,97 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/vdc for voltage droop control function
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#include "contiki.h"
/* #include "lib/sensors.h" */
#include "dev/dc-vdc-sensor.h"
const struct sensors_sensor dc_vdc_sensor;
/*
* vdc contains 3 parameters
* vdc[0] VGRID
* vdc[1] SLOPE
* vdc[2] PMAX
*/
uint32_t volatile vdc[3] = { 18, 1, 100 };
static int
value(int type)
{
switch(type) {
case 0:
return vdc[0];
case 1:
return vdc[1];
case 2:
return vdc[2];
}
return -1;
}
static int
configure(int type, int c)
{
switch(type) {
case 0:
if((c >= 0) && (c <= 25)) {
vdc[0] = c;
return 0;
} else {
return 1;
}
case 1:
vdc[1] = c;
return 0;
case 2:
vdc[2] = c;
return 0;
}
return 1;
}
static int
status(int type)
{
return 1;
}
SENSORS_SENSOR(dc_vdc_sensor, "vdc sensors", value, configure, status);

View file

@ -0,0 +1,46 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/vdc sensor header file
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#ifndef DC_VDC_SENSOR_H
#define DC_VDC_SENSOR_H
#include "lib/sensors.h"
extern const struct sensors_sensor dc_vdc_sensor;
#endif /* DC_VDC_SENSOR_H */

View file

@ -0,0 +1,62 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* header file for resources
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#ifndef __ER_DC_TEST_H__
#define __ER_DC_TEST_H__
#define DEBUG 1
#if DEBUG
#include <stdio.h>
#define PRINTF(...) printf(__VA_ARGS__)
#define PRINT6ADDR(addr) PRINTF("[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15])
#define PRINTLLADDR(lladdr) PRINTF("[%02x:%02x:%02x:%02x:%02x:%02x]", (lladdr)->addr[0], (lladdr)->addr[1], (lladdr)->addr[2], (lladdr)->addr[3], (lladdr)->addr[4], (lladdr)->addr[5])
#else
#define PRINTF(...)
#define PRINT6ADDR(addr)
#define PRINTLLADDR(addr)
#endif
/* double expansion */
#define TO_STRING2(x) # x
#define TO_STRING(x) TO_STRING2(x)
#define MAX_COAP_PAYLOAD 64 + 1 /* +1 for the terminating zero, which is not transmitted */
/* #define MAX_PLUGFEST_BODY 2048 */
/* #define CHUNKS_TOTAL 2012 */
#endif /* __ER_DC_TEST_H__ */

View file

@ -0,0 +1,61 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* test rpl configuration.
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#ifndef PROJECT_CONF_H_
#define PROJECT_CONF_H_
/* enable IPv6 */
/* #ifndef NETSTACK_CONF_WITH_IPV6 */
#define NETSTACK_CONF_WITH_IPV6 1
/* #endif / * NETSTACK_CONF_WITH_IPV6 * / */
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
#define COAP_OBSERVE_CLIENT 1
#define COAP_MAX_OBSERVEES 10
#define COAP_MAX_OPEN_TRANSACTIONS 10
/* enable debug to activate PRINT6ADDR macro */
/* #undef DEBUG_PRINT */
/* #define DEBUG_PRINT 1 */
/* #define PRINTF(...) printf(__VA_ARGS__) */
/* #define PRINT6ADDR(addr) PRINTF(" %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x ", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15]) */
#endif /* PROJECT_CONF_H_ */

View file

@ -0,0 +1,83 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/co2 testing coap with CO2 sensor from SenseAir
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
/* #include <math.h> */
#include <stdio.h>
#include <string.h>
#include "rest-engine.h"
#include "er-coap.h"
#include "er-dc-test.h"
#if PLATFORM_HAS_LEDS
#include "dev/leds.h"
#endif
#include "dev/co2_sa_kxx-sensor.h"
static void res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
RESOURCE(res_dc_co2, "title=\"co2 reading\"", res_get_handler, NULL, NULL, NULL);
/*---------------------------------------------------------------------------*/
static void
res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
coap_packet_t *const coap_req = (coap_packet_t *)request;
int co2 = co2_sa_kxx_sensor.value(CO2_SA_KXX_CO2); // 0 is CO2_SA_KXX_CO2
#if PLATFORM_HAS_LEDS
/* set red led when receiving a packet */
leds_on(LEDS_RED);
#endif
PRINTF("dcdc/co2 GET (%s %u)\n", coap_req->type == COAP_TYPE_CON ? "CON" : "NON", coap_req->mid);
/* Code 2.05 CONTENT is default. */
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
/* REST.set_header_max_age(response, 30); */
REST.set_response_payload(
response,
buffer,
/* snprintf((char *)buffer, MAX_COAP_PAYLOAD, "VMX\t%d.000\nIMX\t%d.000\nINT\t%d\n", v_max, i_max, interval)); */
snprintf((char *)buffer, MAX_COAP_PAYLOAD, "CO2\t%d\n", co2));
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
}

View file

@ -0,0 +1,120 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/vdc configurable parameters for voltage droop control function
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
/* #include <math.h> */
#include <stdio.h>
#include <string.h>
#include "rest-engine.h"
#include "er-coap.h"
#include "er-dc-test.h"
#if PLATFORM_HAS_LEDS
#include "dev/leds.h"
#endif
#include "dev/dc-hw-sensor.h"
static void res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
static void res_post_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
RESOURCE(res_dc_hwcfg, "title=\"hwcfg parameters\"", res_get_handler, res_post_put_handler, res_post_put_handler, NULL);
/*---------------------------------------------------------------------------*/
static void
res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
coap_packet_t *const coap_req = (coap_packet_t *)request;
int v_max = dc_hw_sensor.value(0);
int i_max = dc_hw_sensor.value(1);
#if PLATFORM_HAS_LEDS
/* set red led when receiving a packet */
leds_on(LEDS_RED);
#endif
PRINTF("dcdc/hwcfg GET (%s %u)\n", coap_req->type == COAP_TYPE_CON ? "CON" : "NON", coap_req->mid);
/* Code 2.05 CONTENT is default. */
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
/* REST.set_header_max_age(response, 30); */
REST.set_response_payload(
response,
buffer,
/* snprintf((char *)buffer, MAX_COAP_PAYLOAD, "VMX\t%d.000\nIMX\t%d.000\nINT\t%d\n", v_max, i_max, interval)); */
snprintf((char *)buffer, MAX_COAP_PAYLOAD, "VMX\t%d.000\nIMX\t%d.000\n", v_max, i_max));
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
}
/*---------------------------------------------------------------------------*/
static void
res_post_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
coap_packet_t *const coap_req = (coap_packet_t *)request;
#if PLATFORM_HAS_LEDS
/* set red led when receiving a packet */
leds_on(LEDS_RED);
#endif
PRINTF("dcdc/hwcfg PUT (%s %u)\n", coap_req->type == COAP_TYPE_CON ? "CON" : "NON", coap_req->mid);
const char *variable = NULL;
if(REST.get_post_variable(request, "VMX", &variable) > 0) {
int v_max = atoi(variable);
if(dc_hw_sensor.configure(0, v_max)) {
PRINTF("Value out of range: must be 0 <= VMX <= 30");
}
}
if(REST.get_post_variable(request, "IMX", &variable) > 0) {
int i_max = atoi(variable);
if(dc_hw_sensor.configure(1, i_max)) {
PRINTF("Value out of range: must be 0 <= Imax <= 6");
}
}
REST.set_response_status(response, REST.status.CHANGED);
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
}

View file

@ -0,0 +1,113 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/status read-only parameters for power monitoring
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
#include <stdio.h>
#include <string.h>
#include "rest-engine.h"
#include "er-coap.h"
#include "er-coap-observe.h"
#include "../er-dc-test.h"
#if PLATFORM_HAS_LEDS
#include "dev/leds.h"
#endif
#include "dev/dc-status-sensor.h"
static void res_dc_status_obs_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
static void res_dc_status_obs_periodic_handler(void);
PERIODIC_RESOURCE(res_dc_status_obs, "title=\"status parameters\"", res_dc_status_obs_get_handler, NULL, NULL, NULL, 10 * CLOCK_SECOND, res_dc_status_obs_periodic_handler);
static uint32_t observe = 0;
static count = 0;
/*---------------------------------------------------------------------------*/
static void
res_dc_status_obs_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
int vout_value = dc_status_sensor.value(0);
int vin_value = dc_status_sensor.value(1);
int iout_value = dc_status_sensor.value(2);
int iin_value = dc_status_sensor.value(3);
/* a request comes from a remote host */
if(request != NULL) {
#if PLATFORM_HAS_LEDS
/* set red led when receiving a packet */
leds_on(LEDS_RED);
#endif
coap_packet_t *const coap_req = (coap_packet_t *)request;
PRINTF("dcdc/status GET (%s %u)\n", coap_req->type == COAP_TYPE_CON ? "CON" : "NON", coap_req->mid);
/* if comes with observe then register it */
if(coap_get_header_observe(request, &observe)) {
/* PRINTF("OBSERVE set\n"); */
/* respond with empty ack */
REST.set_header_content_type(response, observe);
REST.set_response_payload(response, 0, 0);
} else { /* if no observe option, then answer to GET request as normal */
/* PRINTF("OBSERVE NOT set\n"); */
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
REST.set_response_payload(
response,
buffer,
snprintf((char *)buffer, MAX_COAP_PAYLOAD, "ST\tON\nVO\t%d.000\nIO\t%d.000\nVI\t%d.000\nII\t%d.000\n", vout_value, iout_value, vin_value, iin_value));
}
} else { /* this is a notification: need to set payload */
/* PRINTF("NULL REQUEST = PERIODIC\n"); */
REST.set_response_payload(
response,
buffer,
snprintf((char *)buffer, MAX_COAP_PAYLOAD, "ST\tON\nVO\t%d.000\nIO\t%d.000\nVI\t%d.000\nII\t%d.000\n", vout_value, iout_value, vin_value, iin_value));
}
count++;
printf("PERIODIC %d: ST:ON VO:%d IO:%d VI:%d II:%d\n", count, vout_value, iout_value, vin_value, iin_value);
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
}
/*---------------------------------------------------------------------------*/
static void
res_dc_status_obs_periodic_handler()
{
/* send periodic notification to the observers */
REST.notify_subscribers(&res_dc_status_obs);
}

View file

@ -0,0 +1,129 @@
/*
* Copyright (c) 2015, ICT/COS/NSLab, KTH Royal Institute of Technology
* 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.
*/
/**
* \file
* dcdc/vdc configurable parameters for voltage droop control function
* \author
* Voravit Tanyingyong <voravit@kth.se>
*/
/* #include <math.h> */
#include <stdio.h>
#include <string.h>
#include "rest-engine.h"
#include "er-coap.h"
#include "er-dc-test.h"
#if PLATFORM_HAS_LEDS
#include "dev/leds.h"
#endif
#include "dev/dc-vdc-sensor.h"
static void res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
static void res_post_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
RESOURCE(res_dc_vdc, "title=\"vdc parameters\"", res_get_handler, res_post_put_handler, res_post_put_handler, NULL);
/*---------------------------------------------------------------------------*/
static void
res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
coap_packet_t *const coap_req = (coap_packet_t *)request;
int vdc_grid = dc_vdc_sensor.value(0);
int vdc_slope = dc_vdc_sensor.value(1);
int vdc_pmax = dc_vdc_sensor.value(2);
#if PLATFORM_HAS_LEDS
/* set red led when receiving a packet */
leds_on(LEDS_RED);
#endif
PRINTF("dcdc/vdc GET (%s %u)\n", coap_req->type == COAP_TYPE_CON ? "CON" : "NON", coap_req->mid);
/* Code 2.05 CONTENT is default. */
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
/* REST.set_header_max_age(response, 30); */
REST.set_response_payload(
response,
buffer,
snprintf((char *)buffer, MAX_COAP_PAYLOAD, "VG\t%d.000\nSL\t%d.000\nPMAX\t%d.000\n", vdc_grid, vdc_slope, vdc_pmax));
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
}
/*---------------------------------------------------------------------------*/
static void
res_post_put_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
{
coap_packet_t *const coap_req = (coap_packet_t *)request;
#if PLATFORM_HAS_LEDS
/* set red led when receiving a packet */
leds_on(LEDS_RED);
#endif
PRINTF("dcdc/vdc PUT (%s %u)\n", coap_req->type == COAP_TYPE_CON ? "CON" : "NON", coap_req->mid);
const char *variable = NULL;
if(REST.get_post_variable(request, "VG", &variable) > 0) {
int vdc_grid = atoi(variable);
/* PRINTF("VG: %d\n",vdc_grid); */
if(dc_vdc_sensor.configure(0, vdc_grid)) {
PRINTF("Value out of range: must be 0 <= Vgrid <= Vmax");
}
}
if(REST.get_post_variable(request, "SL", &variable) > 0) {
int vdc_slope = atoi(variable);
/* PRINTF("SL: %d\n",vdc_slope); */
if(dc_vdc_sensor.configure(1, vdc_slope)) {
PRINTF("Error: SLOPE is not set!");
}
}
if(REST.get_post_variable(request, "PMX", &variable) > 0) {
int vdc_pmax = atoi(variable);
/* PRINTF("PMAX: %d\n",vdc_pmax); */
if(dc_vdc_sensor.configure(2, vdc_pmax)) {
PRINTF("Error: PMAX is not set!");
}
}
REST.set_response_status(response, REST.status.CHANGED);
#if PLATFORM_HAS_LEDS
/* set yellow led when sending packet */
leds_on(LEDS_YELLOW);
#endif
}

View file

@ -0,0 +1,55 @@
CONTIKI_PROJECT=border-router
all: $(CONTIKI_PROJECT)
CONTIKI=../../../../..
#linker optimizations
SMALL=1
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
PROJECT_SOURCEFILES += eth-bridge.c
#PROJECT_SOURCEFILES += enc28j60.c
PROJECT_SOURCEFILES += enc28j60-ip64-driver.c
APPS += ping6
MODULES += dev/enc28j60 core/net/ip64
#Simple built-in webserver is the default.
#Override with make WITH_WEBSERVER=0 for no webserver.
#WITH_WEBSERVER=webserver-name will use /apps/webserver-name if it can be
#found in the /apps, /platform/$(TARGET)/apps/, or current directory (in that order).
# WITH_WEBSERVER=webserver for /apps/webserver
# WITH_WEBSERVER=raven-webserver for /platform/avr-raven/apps/raven-webserver/
#make clean before changing webservers!
#Note /apps/webserver contains a 2500 byte style sheet which is a severe test
#of the slip connection. Large MSS together with low baud rates without flow
#control will overrun the transmit buffer when the style sheet is requested.
WITH_WEBSERVER=1
ifeq ($(WITH_WEBSERVER),1)
CFLAGS += -DUIP_CONF_TCP=1
CFLAGS += -DWEBSERVER=1
PROJECT_SOURCEFILES += httpd-simple.c
else ifneq ($(WITH_WEBSERVER), 0)
APPS += $(WITH_WEBSERVER)
CFLAGS += -DUIP_CONF_TCP=1
CFLAGS += -DWEBSERVER=2
endif
ifeq ($(PREFIX),)
PREFIX = aaaa::1/64
endif
CONTIKI_WITH_IPV6 = 1
include $(CONTIKI)/Makefile.include
$(CONTIKI)/tools/tunslip6: $(CONTIKI)/tools/tunslip6.c
(cd $(CONTIKI)/tools && $(MAKE) tunslip6)
connect-router: $(CONTIKI)/tools/tunslip6
sudo $(CONTIKI)/tools/tunslip6 $(PREFIX)
connect-router-cooja: $(CONTIKI)/tools/tunslip6
sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 $(PREFIX)

View file

@ -0,0 +1,66 @@
Document version: 2015-12-29
HOWTO connect the Microchip enc28j60 module
===========================================
It's possible to to add Ethernet to most microcontrollers having a SPI inter-
face. In the Atmel world the SPI pins are used for the ISP programming. Usually
a 6-pin header. Named MOSI, MISO, SCK, CS (Chup Select), Vcc, GND
One popular Ethernet chip is Microchip ENC28J60. It been used for quite some
time and is easy to program and are also supported by many platforms and
projects. Contiki has files under:
Most focus fon AVR platforms. The SPI is used by Atmel ISP-progammings
interface. In addition to those pins you to selects a pin for chip
select (CS).
dev/enc28j60/
The low-level SPI drives is platform or rather CPU-specific. The avr-rss2
platform adds the low-level drivers for Atmel.
platform/avr-rss2/enc28j60_avr.[ch]
This should be usable on most 8-bit avr platforms.
The power consumption might be a problem. The enc28j60 consumes 160mA at 3.3V
when transmitting. The LDO (voltage reg. LP2950) on the mote can only handle
100mA. So external power is needed. Below is a description of a prototype.
Used components:
----------------
Externel power supply 5V.
Small breadboard
DC-jack
Voltage Reg. LCP1700 3.3V
Capacitor 4.7uF
enc28j60 (From Ebay)
Pin-headers
Cables 2x5 (enc28j60) 2x3 SPI (AtMega node)
Used colors:
Black GND
Red VCC 3.3V
Yellow SCK
Green MISO
White MOSI
Blue CS (Chip select)
SPI (Connector view)
--------------------
GREEN YELLOW NC
RED WHITE BLACK
CS is connected to external temp sensor middle pin. Consequently the
external temp sensor can not be used in this application.
Pictures
--------
![Module] ( http://www.radio-sensors.com/pictures/enc28j60.jpg)
![Connector] (http://www.radio-sensors.com/pictures/enc28c60-cable.jpg)
References
-----------

View file

@ -0,0 +1,17 @@
Document version: 2016-02-22
An ethernet-to-802.15.4 NAT/GW IP64
===================================
This project is heavily based on the rpl-border-router in the example directory
using the IP64 framework. This work is done Contiki/Thingsquare as the driver
for enc28j60.
But rather than using slip as in the original example an ethernet interface
the Microchip enc28j60 is used. The needed SPI-glue for AtMega's is added by
this platform. (avr-rss2)
See the README.ETHERNET.md for ethernet module info.

View file

@ -0,0 +1,388 @@
/*
* 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.
*
*/
/**
* \file
* border-router
* \author
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
* Nicolas Tsiftes <nvt@sics.se>
*/
#include "contiki.h"
#include "contiki-lib.h"
#include "contiki-net.h"
#include "net/ip/uip.h"
#include "net/ipv6/uip-ds6.h"
#include "ip64.h"
#include "net/rpl/rpl.h"
#include "enc28j60.h"
#include "enc28j60-ip64-driver.h"
#include "net/netstack.h"
#include "dev/button-sensor.h"
#include "dev/slip.h"
#include "dev/leds.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define DEBUG DEBUG_PRINT
#include "net/ip/uip-debug.h"
static uip_ipaddr_t prefix;
static uint8_t prefix_set;
PROCESS(border_router_process, "Border router process");
#if WEBSERVER==0
/* No webserver */
AUTOSTART_PROCESSES(&border_router_process);
#elif WEBSERVER>1
/* Use an external webserver application */
#include "webserver-nogui.h"
AUTOSTART_PROCESSES(&border_router_process,&webserver_nogui_process);
#else
/* Use simple webserver with only one page for minimum footprint.
* Multiple connections can result in interleaved tcp segments since
* a single static buffer is used for all segments.
*/
#include "httpd-simple.h"
/* The internal webserver can provide additional information if
* enough program flash is available.
*/
#define WEBSERVER_CONF_LOADTIME 1
#define WEBSERVER_CONF_FILESTATS 1
#define WEBSERVER_CONF_NEIGHBOR_STATUS 1
/* Adding links requires a larger RAM buffer. To avoid static allocation
* the stack can be used for formatting; however tcp retransmissions
* and multiple connections can result in garbled segments.
* TODO:use PSOCk_GENERATOR_SEND and tcp state storage to fix this.
*/
#define WEBSERVER_CONF_ROUTE_LINKS 1
#if WEBSERVER_CONF_ROUTE_LINKS
#define BUF_USES_STACK 1
#endif
PROCESS(webserver_nogui_process, "Web server");
PROCESS_THREAD(webserver_nogui_process, ev, data)
{
PROCESS_BEGIN();
httpd_init();
while(1) {
PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event);
httpd_appcall(data);
}
PROCESS_END();
}
AUTOSTART_PROCESSES(&border_router_process,&webserver_nogui_process);
static const char *TOP = "<html><head><title>ContikiRPL</title></head><body>\n";
static const char *BOTTOM = "</body></html>\n";
#if BUF_USES_STACK
static char *bufptr, *bufend;
#define ADD(...) do { \
bufptr += snprintf(bufptr, bufend - bufptr, __VA_ARGS__); \
} while(0)
#else
static char buf[256];
static int blen;
#define ADD(...) do { \
blen += snprintf(&buf[blen], sizeof(buf) - blen, __VA_ARGS__); \
} while(0)
#endif
/*---------------------------------------------------------------------------*/
static void
ipaddr_add(const uip_ipaddr_t *addr)
{
uint16_t a;
int i, f;
for(i = 0, f = 0; i < sizeof(uip_ipaddr_t); i += 2) {
a = (addr->u8[i] << 8) + addr->u8[i + 1];
if(a == 0 && f >= 0) {
if(f++ == 0) ADD("::");
} else {
if(f > 0) {
f = -1;
} else if(i > 0) {
ADD(":");
}
ADD("%x", a);
}
}
}
/*---------------------------------------------------------------------------*/
static
PT_THREAD(generate_routes(struct httpd_state *s))
{
static uip_ds6_route_t *r;
static uip_ds6_nbr_t *nbr;
#if BUF_USES_STACK
char buf[256];
#endif
#if WEBSERVER_CONF_LOADTIME
static clock_time_t numticks;
numticks = clock_time();
#endif
PSOCK_BEGIN(&s->sout);
SEND_STRING(&s->sout, TOP);
#if BUF_USES_STACK
bufptr = buf;bufend=bufptr+sizeof(buf);
#else
blen = 0;
#endif
ADD("Neighbors<pre>");
for(nbr = nbr_table_head(ds6_neighbors);
nbr != NULL;
nbr = nbr_table_next(ds6_neighbors, nbr)) {
#if WEBSERVER_CONF_NEIGHBOR_STATUS
#if BUF_USES_STACK
{char* j=bufptr+25;
ipaddr_add(&nbr->ipaddr);
while (bufptr < j) ADD(" ");
switch (nbr->state) {
case NBR_INCOMPLETE: ADD(" INCOMPLETE");break;
case NBR_REACHABLE: ADD(" REACHABLE");break;
case NBR_STALE: ADD(" STALE");break;
case NBR_DELAY: ADD(" DELAY");break;
case NBR_PROBE: ADD(" NBR_PROBE");break;
}
}
#else
{uint8_t j=blen+25;
ipaddr_add(&nbr->ipaddr);
while (blen < j) ADD(" ");
switch (nbr->state) {
case NBR_INCOMPLETE: ADD(" INCOMPLETE");break;
case NBR_REACHABLE: ADD(" REACHABLE");break;
case NBR_STALE: ADD(" STALE");break;
case NBR_DELAY: ADD(" DELAY");break;
case NBR_PROBE: ADD(" NBR_PROBE");break;
}
}
#endif
#else
ipaddr_add(&nbr->ipaddr);
#endif
ADD("\n");
#if BUF_USES_STACK
if(bufptr > bufend - 45) {
SEND_STRING(&s->sout, buf);
bufptr = buf; bufend = bufptr + sizeof(buf);
}
#else
if(blen > sizeof(buf) - 45) {
SEND_STRING(&s->sout, buf);
blen = 0;
}
#endif
}
ADD("</pre>Routes<pre>");
SEND_STRING(&s->sout, buf);
#if BUF_USES_STACK
bufptr = buf; bufend = bufptr + sizeof(buf);
#else
blen = 0;
#endif
for(r = uip_ds6_route_head(); r != NULL; r = uip_ds6_route_next(r)) {
#if BUF_USES_STACK
#if WEBSERVER_CONF_ROUTE_LINKS
ADD("<a href=http://[");
ipaddr_add(&r->ipaddr);
ADD("]/status.shtml>");
ipaddr_add(&r->ipaddr);
ADD("</a>");
#else
ipaddr_add(&r->ipaddr);
#endif
#else
#if WEBSERVER_CONF_ROUTE_LINKS
ADD("<a href=http://[");
ipaddr_add(&r->ipaddr);
ADD("]/status.shtml>");
SEND_STRING(&s->sout, buf); //TODO: why tunslip6 needs an output here, wpcapslip does not
blen = 0;
ipaddr_add(&r->ipaddr);
ADD("</a>");
#else
ipaddr_add(&r->ipaddr);
#endif
#endif
ADD("/%u (via ", r->length);
ipaddr_add(uip_ds6_route_nexthop(r));
if(1 || (r->state.lifetime < 600)) {
ADD(") %lus\n", (unsigned long)r->state.lifetime);
} else {
ADD(")\n");
}
SEND_STRING(&s->sout, buf);
#if BUF_USES_STACK
bufptr = buf; bufend = bufptr + sizeof(buf);
#else
blen = 0;
#endif
}
ADD("</pre>");
#if WEBSERVER_CONF_FILESTATS
static uint16_t numtimes;
ADD("<br><i>This page sent %u times</i>",++numtimes);
#endif
#if WEBSERVER_CONF_LOADTIME
numticks = clock_time() - numticks + 1;
ADD(" <i>(%lu.%02lu sec)</i>",numticks/CLOCK_SECOND,((100*(numticks%CLOCK_SECOND))/CLOCK_SECOND));
#endif
SEND_STRING(&s->sout, buf);
SEND_STRING(&s->sout, BOTTOM);
PSOCK_END(&s->sout);
}
/*---------------------------------------------------------------------------*/
httpd_simple_script_t
httpd_simple_get_script(const char *name)
{
return generate_routes;
}
#endif /* WEBSERVER */
/*---------------------------------------------------------------------------*/
static void
print_local_addresses(void)
{
int i;
uint8_t state;
PRINTA("Server IPv6 addresses:\n");
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
state = uip_ds6_if.addr_list[i].state;
if(uip_ds6_if.addr_list[i].isused &&
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
PRINTA(" ");
uip_debug_ipaddr_print(&uip_ds6_if.addr_list[i].ipaddr);
PRINTA("\n");
}
}
}
/*---------------------------------------------------------------------------*/
void
request_prefix(void)
{
/* mess up uip_buf with a dirty request... */
uip_buf[0] = '?';
uip_buf[1] = 'P';
uip_len = 2;
//slip_send();
uip_clear_buf();
}
/*---------------------------------------------------------------------------*/
void
set_prefix_64(uip_ipaddr_t *prefix_64)
{
rpl_dag_t *dag;
uip_ipaddr_t ipaddr;
memcpy(&prefix, prefix_64, 16);
memcpy(&ipaddr, prefix_64, 16);
prefix_set = 1;
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
dag = rpl_set_root(RPL_DEFAULT_INSTANCE, &ipaddr);
if(dag != NULL) {
rpl_set_prefix(dag, &prefix, 64);
PRINTF("created a new RPL dag\n");
}
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(border_router_process, ev, data)
{
PROCESS_BEGIN();
uip_ipaddr_t ipaddr;
/* While waiting for the prefix to be sent through the SLIP connection, the future
* border router can join an existing DAG as a parent or child, or acquire a default
* router that will later take precedence over the SLIP fallback interface.
* Prevent that by turning the radio off until we are initialized as a DAG root.
*/
prefix_set = 0;
NETSTACK_MAC.off(0);
PROCESS_PAUSE();
SENSORS_ACTIVATE(button_sensor);
leds_init();
ip64_init();
PRINTF("RPL-Border router started\n");
#if 0
/* The border router runs with a 100% duty cycle in order to ensure high
packet reception rates.
Note if the MAC RDC is not turned off now, aggressive power management of the
cpu will interfere with establishing the SLIP connection */
NETSTACK_MAC.off(1);
#endif
/* Now turn the radio on, but disable radio duty cycling.
* Since we are the DAG root, reception delays would constrain mesh throughbut.
*/
NETSTACK_MAC.off(1);
/* Derived from link local (MAC) address */
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
set_prefix_64(&ipaddr);
print_local_addresses();
while(1) {
PROCESS_YIELD();
leds_on(LEDS_YELLOW);
if (ev == sensors_event && data == &button_sensor) {
PRINTF("Initiating global repair\n");
rpl_repair_root(RPL_DEFAULT_INSTANCE);
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,104 @@
/*
* Copyright (c) 2012-2013, Thingsquare, http://www.thingsquare.com/.
* 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 copyright holder 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 COPYRIGHT HOLDERS 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
* COPYRIGHT HOLDER 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.
*
*/
#include "contiki.h"
#include "enc28j60.h"
#include "enc28j60-ip64-driver.h"
#include "net/linkaddr.h"
#include "ip64.h"
#include "ip64-eth.h"
#include <string.h>
#include <stdio.h>
PROCESS(enc28j60_ip64_driver_process, "ENC28J60 IP64 driver");
/*---------------------------------------------------------------------------*/
static void
init(void)
{
uint8_t eui64[8];
uint8_t macaddr[6];
/* Assume that linkaddr_node_addr holds the EUI64 of this device. */
memcpy(eui64, &linkaddr_node_addr, sizeof(eui64));
/* Mangle the EUI64 into a 48-bit Ethernet address. */
memcpy(&macaddr[0], &eui64[0], 3);
memcpy(&macaddr[3], &eui64[5], 3);
/* In case the OUI happens to contain a broadcast bit, we mask that
out here. */
macaddr[0] = (macaddr[0] & 0xfe);
/* Set the U/L bit, in order to create a locally administered MAC address */
macaddr[0] = (macaddr[0] | 0x02);
memcpy(ip64_eth_addr.addr, macaddr, sizeof(macaddr));
printf("MAC addr %02x:%02x:%02x:%02x:%02x:%02x\n",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
enc28j60_init(macaddr);
process_start(&enc28j60_ip64_driver_process, NULL);
}
/*---------------------------------------------------------------------------*/
static int
output(uint8_t *packet, uint16_t len)
{
enc28j60_send(packet, len);
return len;
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(enc28j60_ip64_driver_process, ev, data)
{
static int len;
static struct etimer e;
PROCESS_BEGIN();
while(1) {
etimer_set(&e, 1);
PROCESS_WAIT_EVENT();
len = enc28j60_read(ip64_packet_buffer, ip64_packet_buffer_maxlen);
if(len > 0) {
IP64_INPUT(ip64_packet_buffer, len);
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/
const struct ip64_driver enc28j60_ip64_driver = {
init,
output
};
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,38 @@
/*
* Copyright (c) 2012-2013, Thingsquare, http://www.thingsquare.com/.
* 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 copyright holder 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 COPYRIGHT HOLDERS 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
* COPYRIGHT HOLDER 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.
*
*/
#ifndef ENC28J60_IP64_DRIVER_H
#define ENC28J60_IP64_DRIVER_H
#include "ip64-driver.h"
extern const struct ip64_driver enc28j60_ip64_driver;
#endif /* ENC28J60_IP64_DRIVER_H */

View file

@ -0,0 +1,33 @@
#include "net/ip/uip.h"
#include "net/ipv6/uip-ds6.h"
#include <string.h>
#include "ip64-eth-interface.h"
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
#define DEBUG DEBUG_NONE
#include "net/ip/uip-debug.h"
static void
init(void)
{
PRINTF("eth-bridge: init\n");
ip64_eth_interface.init();
}
/*---------------------------------------------------------------------------*/
static int
output()
{
PRINTF("eth-bridge: src=");
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
PRINTF(" dst=");
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
PRINTF("\n");
ip64_eth_interface.output();
return 0;
}
/*---------------------------------------------------------------------------*/
const struct uip_fallback_interface rpl_interface = {
init, output
};
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,261 @@
/*
* Copyright (c) 2010, 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.
*
*/
/**
* \file
* A simple web server forwarding page generation to a protothread
* \author
* Adam Dunkels <adam@sics.se>
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
*/
#include <stdio.h>
#include <string.h>
#include "contiki-net.h"
//#include "urlconv.h"
#include "httpd-simple.h"
#define webserver_log_file(...)
#define webserver_log(...)
#ifndef WEBSERVER_CONF_CFS_CONNS
#define CONNS UIP_CONNS
#else /* WEBSERVER_CONF_CFS_CONNS */
#define CONNS WEBSERVER_CONF_CFS_CONNS
#endif /* WEBSERVER_CONF_CFS_CONNS */
#ifndef WEBSERVER_CONF_CFS_URLCONV
#define URLCONV 0
#else /* WEBSERVER_CONF_CFS_URLCONV */
#define URLCONV WEBSERVER_CONF_CFS_URLCONV
#endif /* WEBSERVER_CONF_CFS_URLCONV */
#define STATE_WAITING 0
#define STATE_OUTPUT 1
MEMB(conns, struct httpd_state, CONNS);
#define ISO_nl 0x0a
#define ISO_space 0x20
#define ISO_period 0x2e
#define ISO_slash 0x2f
/*---------------------------------------------------------------------------*/
static const char *NOT_FOUND = "<html><body bgcolor=\"white\">"
"<center>"
"<h1>404 - file not found</h1>"
"</center>"
"</body>"
"</html>";
/*---------------------------------------------------------------------------*/
static
PT_THREAD(send_string(struct httpd_state *s, const char *str))
{
PSOCK_BEGIN(&s->sout);
SEND_STRING(&s->sout, str);
PSOCK_END(&s->sout);
}
/*---------------------------------------------------------------------------*/
const char http_content_type_html[] = "Content-type: text/html\r\n\r\n";
static
PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr))
{
/* char *ptr; */
PSOCK_BEGIN(&s->sout);
SEND_STRING(&s->sout, statushdr);
/* ptr = strrchr(s->filename, ISO_period); */
/* if(ptr == NULL) { */
/* s->ptr = http_content_type_plain; */
/* } else if(strcmp(http_html, ptr) == 0) { */
/* s->ptr = http_content_type_html; */
/* } else if(strcmp(http_css, ptr) == 0) { */
/* s->ptr = http_content_type_css; */
/* } else if(strcmp(http_png, ptr) == 0) { */
/* s->ptr = http_content_type_png; */
/* } else if(strcmp(http_gif, ptr) == 0) { */
/* s->ptr = http_content_type_gif; */
/* } else if(strcmp(http_jpg, ptr) == 0) { */
/* s->ptr = http_content_type_jpg; */
/* } else { */
/* s->ptr = http_content_type_binary; */
/* } */
/* SEND_STRING(&s->sout, s->ptr); */
SEND_STRING(&s->sout, http_content_type_html);
PSOCK_END(&s->sout);
}
/*---------------------------------------------------------------------------*/
const char http_header_200[] = "HTTP/1.0 200 OK\r\nServer: Contiki/2.4 http://www.sics.se/contiki/\r\nConnection: close\r\n";
const char http_header_404[] = "HTTP/1.0 404 Not found\r\nServer: Contiki/2.4 http://www.sics.se/contiki/\r\nConnection: close\r\n";
static
PT_THREAD(handle_output(struct httpd_state *s))
{
PT_BEGIN(&s->outputpt);
s->script = NULL;
s->script = httpd_simple_get_script(&s->filename[1]);
if(s->script == NULL) {
strncpy(s->filename, "/notfound.html", sizeof(s->filename));
PT_WAIT_THREAD(&s->outputpt,
send_headers(s, http_header_404));
PT_WAIT_THREAD(&s->outputpt,
send_string(s, NOT_FOUND));
uip_close();
webserver_log_file(&uip_conn->ripaddr, "404 - not found");
PT_EXIT(&s->outputpt);
} else {
PT_WAIT_THREAD(&s->outputpt,
send_headers(s, http_header_200));
PT_WAIT_THREAD(&s->outputpt, s->script(s));
}
s->script = NULL;
PSOCK_CLOSE(&s->sout);
PT_END(&s->outputpt);
}
/*---------------------------------------------------------------------------*/
const char http_get[] = "GET ";
const char http_index_html[] = "/index.html";
//const char http_referer[] = "Referer:"
static
PT_THREAD(handle_input(struct httpd_state *s))
{
PSOCK_BEGIN(&s->sin);
PSOCK_READTO(&s->sin, ISO_space);
if(strncmp(s->inputbuf, http_get, 4) != 0) {
PSOCK_CLOSE_EXIT(&s->sin);
}
PSOCK_READTO(&s->sin, ISO_space);
if(s->inputbuf[0] != ISO_slash) {
PSOCK_CLOSE_EXIT(&s->sin);
}
#if URLCONV
s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0;
urlconv_tofilename(s->filename, s->inputbuf, sizeof(s->filename));
#else /* URLCONV */
if(s->inputbuf[1] == ISO_space) {
strncpy(s->filename, http_index_html, sizeof(s->filename));
} else {
s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0;
strncpy(s->filename, s->inputbuf, sizeof(s->filename));
}
#endif /* URLCONV */
webserver_log_file(&uip_conn->ripaddr, s->filename);
s->state = STATE_OUTPUT;
while(1) {
PSOCK_READTO(&s->sin, ISO_nl);
#if 0
if(strncmp(s->inputbuf, http_referer, 8) == 0) {
s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0;
webserver_log(s->inputbuf);
}
#endif
}
PSOCK_END(&s->sin);
}
/*---------------------------------------------------------------------------*/
static void
handle_connection(struct httpd_state *s)
{
handle_input(s);
if(s->state == STATE_OUTPUT) {
handle_output(s);
}
}
/*---------------------------------------------------------------------------*/
void
httpd_appcall(void *state)
{
struct httpd_state *s = (struct httpd_state *)state;
if(uip_closed() || uip_aborted() || uip_timedout()) {
if(s != NULL) {
s->script = NULL;
memb_free(&conns, s);
}
} else if(uip_connected()) {
s = (struct httpd_state *)memb_alloc(&conns);
if(s == NULL) {
uip_abort();
webserver_log_file(&uip_conn->ripaddr, "reset (no memory block)");
return;
}
tcp_markconn(uip_conn, s);
PSOCK_INIT(&s->sin, (uint8_t *)s->inputbuf, sizeof(s->inputbuf) - 1);
PSOCK_INIT(&s->sout, (uint8_t *)s->inputbuf, sizeof(s->inputbuf) - 1);
PT_INIT(&s->outputpt);
s->script = NULL;
s->state = STATE_WAITING;
timer_set(&s->timer, CLOCK_SECOND * 10);
handle_connection(s);
} else if(s != NULL) {
if(uip_poll()) {
if(timer_expired(&s->timer)) {
uip_abort();
s->script = NULL;
memb_free(&conns, s);
webserver_log_file(&uip_conn->ripaddr, "reset (timeout)");
}
} else {
timer_restart(&s->timer);
}
handle_connection(s);
} else {
uip_abort();
}
}
/*---------------------------------------------------------------------------*/
void
httpd_init(void)
{
tcp_listen(UIP_HTONS(80));
memb_init(&conns);
#if URLCONV
urlconv_init();
#endif /* URLCONV */
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,74 @@
/*
* Copyright (c) 2010, 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.
*
*/
/**
* \file
* A simple webserver
* \author
* Adam Dunkels <adam@sics.se>
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
*/
#ifndef HTTPD_SIMPLE_H_
#define HTTPD_SIMPLE_H_
#include "contiki-net.h"
/* The current internal border router webserver ignores the requested file name */
/* and needs no per-connection output buffer, so save some RAM */
#ifndef WEBSERVER_CONF_CFS_PATHLEN
#define HTTPD_PATHLEN 2
#else /* WEBSERVER_CONF_CFS_CONNS */
#define HTTPD_PATHLEN WEBSERVER_CONF_CFS_PATHLEN
#endif /* WEBSERVER_CONF_CFS_CONNS */
struct httpd_state;
typedef char (* httpd_simple_script_t)(struct httpd_state *s);
struct httpd_state {
struct timer timer;
struct psock sin, sout;
struct pt outputpt;
char inputbuf[HTTPD_PATHLEN + 24];
/*char outputbuf[UIP_TCP_MSS]; */
char filename[HTTPD_PATHLEN];
httpd_simple_script_t script;
char state;
};
void httpd_init(void);
void httpd_appcall(void *state);
httpd_simple_script_t httpd_simple_get_script(const char *name);
#define SEND_STRING(s, str) PSOCK_SEND(s, (uint8_t *)str, strlen(str))
#endif /* HTTPD_SIMPLE_H_ */

View file

@ -0,0 +1,57 @@
/*
* Copyright (c) 2010, 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.
*
*/
#ifndef PROJECT_ROUTER_CONF_H_
#define PROJECT_ROUTER_CONF_H_
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
#ifndef UIP_FALLBACK_INTERFACE
#define UIP_FALLBACK_INTERFACE rpl_interface
#endif
#ifndef QUEUEBUF_CONF_NUM
#define QUEUEBUF_CONF_NUM 4
#endif
#ifndef UIP_CONF_BUFFER_SIZE
#define UIP_CONF_BUFFER_SIZE 600
#endif
#ifndef UIP_CONF_RECEIVE_WINDOW
#define UIP_CONF_RECEIVE_WINDOW 60
#endif
#ifndef WEBSERVER_CONF_CFS_CONNS
#define WEBSERVER_CONF_CFS_CONNS 2
#endif
#endif /* PROJECT_ROUTER_CONF_H_ */

View file

@ -0,0 +1,21 @@
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
all: report sink
APPS=servreg-hack
CONTIKI=../../../../..
ifdef WITH_COMPOWER
APPS+=powertrace
CFLAGS+= -DCONTIKIMAC_CONF_COMPOWER=1 -DWITH_COMPOWER=1 -DQUEUEBUF_CONF_NUM=4
endif
ifdef SERVER_REPLY
CFLAGS+=-DSERVER_REPLY=$(SERVER_REPLY)
endif
ifdef PERIOD
CFLAGS+=-DPERIOD=$(PERIOD)
endif
CONTIKI_WITH_IPV6 = 1
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1,17 @@
This application is derived form rpl-udp.
It's modified to show:
* Reading out sensors from the avr-rss2 platform. Which should follow the
Contiki conventions.
* Encode the data according to the sensd TAG format. In effect the sensd
GW and rest of "eco-system" as Mobile apps etc can be used for a simple
and flexible data collection, Sink mote will be connected to sensd GW.
References and code:
https://github.com/herjulf/sensd
https://github.com/herjulf/Read-Sensors (Android app. Also at Google Play)

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2015, RAdio Sensors AB, Uppsala Sweden
* 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.
*/
/**
* \file
* Project specific configuration defines for example
*
* \author
* Robert Olsson <robert@radio-sensors.com>
*/
#ifndef PROJECT_CONF_H_
#define PROJECT_CONF_H_
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
//#define NETSTACK_CONF_MAC csma_driver
//#define NETSTACK_CONF_RDC contikimac_driver
//#define NETSTACK_CONF_FRAMER framer_802154
//#define NETSTACK_CONF_RADIO rf230_driver
#endif /* PROJECT_CONF_H_ */

View file

@ -0,0 +1,240 @@
/*
* 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.
*
*/
#include "contiki.h"
#include "lib/random.h"
#include "sys/ctimer.h"
#include "net/ip/uip.h"
#include "net/ipv6/uip-ds6.h"
#include "net/ip/uip-udp-packet.h"
#include "sys/ctimer.h"
#include "dev/leds.h"
#include "dev/battery-sensor.h"
#include "dev/temp_mcu-sensor.h"
#include "dev/light-sensor.h"
#ifdef CO2
#include "dev/co2_sa_kxx-sensor.h"
#endif
#ifdef WITH_COMPOWER
#include "powertrace.h"
#endif
#include <stdio.h>
#include <string.h>
#define UDP_CLIENT_PORT 8765
#define UDP_SERVER_PORT 5678
#define UDP_EXAMPLE_ID 190
#define DEBUG DEBUG_PRINT
#include "net/ip/uip-debug.h"
#ifndef PERIOD
#define PERIOD 10
#endif
#define START_INTERVAL (15 * CLOCK_SECOND)
#define SEND_INTERVAL (PERIOD * CLOCK_SECOND)
#define SEND_TIME (random_rand() % (SEND_INTERVAL))
#define MAX_PAYLOAD_LEN 50
static struct uip_udp_conn *client_conn;
static uip_ipaddr_t server_ipaddr;
extern uint16_t node_id; /* Can be set by cooja */
/*---------------------------------------------------------------------------*/
PROCESS(udp_client_process, "UDP client process");
AUTOSTART_PROCESSES(&udp_client_process);
/*---------------------------------------------------------------------------*/
static void
tcpip_handler(void)
{
char *str;
if(uip_newdata()) {
str = uip_appdata;
str[uip_datalen()] = '\0';
printf("DATA recv '%s'\n", str);
}
}
/*---------------------------------------------------------------------------*/
static void
send_packet(void *ptr)
{
static int seq_id;
char buf[MAX_PAYLOAD_LEN];
int len = 0;
seq_id++;
len += snprintf((char *) &buf[len], sizeof(buf), "&: ");
len += snprintf((char *) &buf[len], sizeof(buf), "V_MCU=%-d ", battery_sensor.value(0));
/*
* Cooja needs to set a node_id. So we can skip sensor reading in case of simulation.
*/
if(node_id == 0) {
len += snprintf((char *) &buf[len], sizeof(buf), "T_MCU=%-d ", temp_mcu_sensor.value(0));
len += snprintf((char *) &buf[len], sizeof(buf), "LIGHT=%-d ", light_sensor.value(0));
#ifdef CO2
len += snprintf((char *) &buf[len], sizeof(buf), "CO2=%-d ", co2_sa_kxx_sensor.value(value));
#endif
}
PRINTF("TX %d to %d %s\n",
server_ipaddr.u8[sizeof(server_ipaddr.u8) - 1], seq_id, buf);
leds_on(LEDS_YELLOW);
uip_udp_packet_sendto(client_conn, buf, strlen(buf),
&server_ipaddr, UIP_HTONS(UDP_SERVER_PORT));
}
/*---------------------------------------------------------------------------*/
static void
print_local_addresses(void)
{
int i;
uint8_t state;
PRINTF("Client IPv6 addresses: ");
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
state = uip_ds6_if.addr_list[i].state;
if(uip_ds6_if.addr_list[i].isused &&
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
PRINTF("\n");
/* hack to make address "final" */
if (state == ADDR_TENTATIVE) {
uip_ds6_if.addr_list[i].state = ADDR_PREFERRED;
}
}
}
}
/*---------------------------------------------------------------------------*/
static void
set_global_address(void)
{
uip_ipaddr_t ipaddr;
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
/* The choice of server address determines its 6LoPAN header compression.
* (Our address will be compressed Mode 3 since it is derived from our link-local address)
* Obviously the choice made here must also be selected in udp-server.c.
*
* For correct Wireshark decoding using a sniffer, add the /64 prefix to the 6LowPAN protocol preferences,
* e.g. set Context 0 to aaaa::. At present Wireshark copies Context/128 and then overwrites it.
* (Setting Context 0 to aaaa::1111:2222:3333:4444 will report a 16 bit compressed address of aaaa::1111:22ff:fe33:xxxx)
*
* Note the IPCMV6 checksum verification depends on the correct uncompressed addresses.
*/
#if 0
/* Mode 1 - 64 bits inline */
uip_ip6addr(&server_ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 1);
#elif 1
/* Mode 2 - 16 bits inline */
uip_ip6addr(&server_ipaddr, 0xaaaa, 0, 0, 0, 0, 0x00ff, 0xfe00, 1);
#else
/* Mode 3 - derived from server link-local (MAC) address */
uip_ip6addr(&server_ipaddr, 0xaaaa, 0, 0, 0, 0x0250, 0xc2ff, 0xfea8, 0xcd1a); //redbee-econotag
#endif
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(udp_client_process, ev, data)
{
static struct etimer periodic;
static struct ctimer backoff_timer;
#if WITH_COMPOWER
static int print = 0;
#endif
PROCESS_BEGIN();
PROCESS_PAUSE();
SENSORS_ACTIVATE(battery_sensor);
SENSORS_ACTIVATE(temp_mcu_sensor);
SENSORS_ACTIVATE(light_sensor);
#ifdef CO2
SENSORS_ACTIVATE(co2_sa_kxx_sensor);
#endif
set_global_address();
leds_init();
PRINTF("UDP client process started\n");
print_local_addresses();
/* new connection with remote host */
client_conn = udp_new(NULL, UIP_HTONS(UDP_SERVER_PORT), NULL);
if(client_conn == NULL) {
PRINTF("No UDP connection available, exiting the process!\n");
PROCESS_EXIT();
}
udp_bind(client_conn, UIP_HTONS(UDP_CLIENT_PORT));
PRINTF("Created a connection with the server ");
PRINT6ADDR(&client_conn->ripaddr);
PRINTF(" local/remote port %u/%u\n",
UIP_HTONS(client_conn->lport), UIP_HTONS(client_conn->rport));
#if WITH_COMPOWER
powertrace_sniff(POWERTRACE_ON);
#endif
etimer_set(&periodic, SEND_INTERVAL);
while(1) {
PROCESS_YIELD();
if(ev == tcpip_event) {
tcpip_handler();
}
if(etimer_expired(&periodic)) {
etimer_reset(&periodic);
ctimer_set(&backoff_timer, SEND_TIME, send_packet, NULL);
#if WITH_COMPOWER
if (print == 0) {
powertrace_print("#P");
}
if (++print == 3) {
print = 0;
}
#endif
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8"?>
<simconf>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mrm</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/mspsim</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/avrora</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/native_gateway</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/serial_socket</project>
<project EXPORT="discard">/home/user/contikiprojects/sics.se/mobility</project>
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/collect-view</project>
<project EXPORT="discard">/home/user/contikiprojects/sics.se/powertracker</project>
<simulation>
<title>UDP sink/report simulation</title>
<randomseed>123456</randomseed>
<motedelay_us>1000000</motedelay_us>
<radiomedium>
se.sics.cooja.radiomediums.UDGM
<transmitting_range>50.0</transmitting_range>
<interference_range>100.0</interference_range>
<success_ratio_tx>1.0</success_ratio_tx>
<success_ratio_rx>1.0</success_ratio_rx>
</radiomedium>
<events>
<logoutput>40000</logoutput>
</events>
<motetype>
se.sics.cooja.avrmote.RSS2MoteType
<identifier>mote1</identifier>
<description>Mote1</description>
<source EXPORT="discard">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/rpl-udp-report/report.c</source>
<commands EXPORT="discard">make report.avr-rss2 TARGET=avr-rss2 MCU=atmega128rfr2</commands>
<firmware EXPORT="copy">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/rpl-udp-report/report.avr-rss2</firmware>
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraClock</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraMoteID</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart0</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart1</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.RFR2Radio</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraADC</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraLED</moteinterface>
</motetype>
<motetype>
se.sics.cooja.avrmote.RSS2MoteType
<identifier>mote2</identifier>
<description>Mote2</description>
<source EXPORT="discard">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/rpl-udp-report/sink.c</source>
<commands EXPORT="discard">make sink.avr-rss2 TARGET=avr-rss2 MCU=atmega128rfr2</commands>
<firmware EXPORT="copy">[CONTIKI_DIR]/platform/avr-rss2/examples/ipv6/rpl-udp-report/sink.avr-rss2</firmware>
<moteinterface>se.sics.cooja.interfaces.Position</moteinterface>
<moteinterface>se.sics.cooja.interfaces.RimeAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.IPAddress</moteinterface>
<moteinterface>se.sics.cooja.interfaces.Mote2MoteRelations</moteinterface>
<moteinterface>se.sics.cooja.interfaces.MoteAttributes</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraClock</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraMoteID</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart0</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraUsart1</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.RFR2Radio</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraADC</moteinterface>
<moteinterface>se.sics.cooja.avrmote.interfaces.AvroraLED</moteinterface>
</motetype>
<mote>
<breakpoints />
<interface_config>
se.sics.cooja.interfaces.Position
<x>100.0</x>
<y>100.0</y>
<z>0.0</z>
</interface_config>
<interface_config>
se.sics.cooja.avrmote.interfaces.AvroraMoteID
<id>1</id>
</interface_config>
<motetype_identifier>mote1</motetype_identifier>
</mote>
<mote>
<breakpoints />
<interface_config>
se.sics.cooja.interfaces.Position
<x>110.0</x>
<y>100.0</y>
<z>0.0</z>
</interface_config>
<interface_config>
se.sics.cooja.avrmote.interfaces.AvroraMoteID
<id>2</id>
</interface_config>
<motetype_identifier>mote2</motetype_identifier>
</mote>
</simulation>
<plugin>
se.sics.cooja.plugins.SimControl
<width>280</width>
<z>9</z>
<height>160</height>
<location_x>400</location_x>
<location_y>0</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.Visualizer
<plugin_config>
<moterelations>true</moterelations>
<skin>se.sics.cooja.plugins.skins.IDVisualizerSkin</skin>
<skin>se.sics.cooja.plugins.skins.GridVisualizerSkin</skin>
<viewport>3.908924509090908 0.0 0.0 3.908924509090908 -216.43707345454544 -217.89245090909074</viewport>
</plugin_config>
<width>400</width>
<z>5</z>
<height>400</height>
<location_x>1</location_x>
<location_y>1</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.LogListener
<plugin_config>
<filter />
<formatted_time />
<coloring />
</plugin_config>
<width>1269</width>
<z>8</z>
<height>240</height>
<location_x>400</location_x>
<location_y>160</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.Notes
<plugin_config>
<notes>Enter notes here</notes>
<decorations>true</decorations>
</plugin_config>
<width>989</width>
<z>6</z>
<height>160</height>
<location_x>680</location_x>
<location_y>0</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.MoteInterfaceViewer
<mote_arg>0</mote_arg>
<plugin_config>
<interface>Serial port</interface>
<scrollpos>0,0</scrollpos>
</plugin_config>
<width>508</width>
<z>4</z>
<height>389</height>
<location_x>13</location_x>
<location_y>413</location_y>
</plugin>
<plugin>
se.sics.cooja.plugins.MoteInterfaceViewer
<mote_arg>1</mote_arg>
<plugin_config>
<interface>Serial port</interface>
<scrollpos>0,0</scrollpos>
</plugin_config>
<width>545</width>
<z>3</z>
<height>392</height>
<location_x>531</location_x>
<location_y>413</location_y>
</plugin>
</simconf>

View file

@ -0,0 +1,184 @@
/*
* 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.
*
*/
#include "contiki.h"
#include "contiki-lib.h"
#include "contiki-net.h"
#include "net/ip/uip.h"
#include "net/rpl/rpl.h"
#include "net/netstack.h"
#include "dev/button-sensor.h"
#include "dev/leds.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define DEBUG DEBUG_PRINT
#include "net/ip/uip-debug.h"
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
#define UDP_CLIENT_PORT 8765
#define UDP_SERVER_PORT 5678
#define UDP_EXAMPLE_ID 190
static struct uip_udp_conn *server_conn;
PROCESS(udp_server_process, "UDP server process");
AUTOSTART_PROCESSES(&udp_server_process);
/*---------------------------------------------------------------------------*/
static void
tcpip_handler(void)
{
char *appdata;
if(uip_newdata()) {
leds_on(LEDS_RED);
appdata = (char *)uip_appdata;
appdata[uip_datalen()] = 0;
PRINTF("Report RX '%s' from ", appdata);
PRINTF("%d",
UIP_IP_BUF->srcipaddr.u8[sizeof(UIP_IP_BUF->srcipaddr.u8) - 1]);
PRINTF("\n");
#if SERVER_REPLY
PRINTF("DATA sending reply\n");
uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr);
uip_udp_packet_send(server_conn, "Reply", sizeof("Reply"));
uip_create_unspecified(&server_conn->ripaddr);
#endif
}
}
/*---------------------------------------------------------------------------*/
static void
print_local_addresses(void)
{
int i;
uint8_t state;
PRINTF("Server IPv6 addresses: ");
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
state = uip_ds6_if.addr_list[i].state;
if(state == ADDR_TENTATIVE || state == ADDR_PREFERRED) {
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
PRINTF("\n");
/* hack to make address "final" */
if (state == ADDR_TENTATIVE) {
uip_ds6_if.addr_list[i].state = ADDR_PREFERRED;
}
}
}
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(udp_server_process, ev, data)
{
uip_ipaddr_t ipaddr;
struct uip_ds6_addr *root_if;
PROCESS_BEGIN();
PROCESS_PAUSE();
SENSORS_ACTIVATE(button_sensor);
leds_init();
PRINTF("UDP server started\n");
#if UIP_CONF_ROUTER
/* The choice of server address determines its 6LoPAN header compression.
* Obviously the choice made here must also be selected in udp-client.c.
*
* For correct Wireshark decoding using a sniffer, add the /64 prefix to the 6LowPAN protocol preferences,
* e.g. set Context 0 to aaaa::. At present Wireshark copies Context/128 and then overwrites it.
* (Setting Context 0 to aaaa::1111:2222:3333:4444 will report a 16 bit compressed address of aaaa::1111:22ff:fe33:xxxx)
* Note Wireshark's IPCMV6 checksum verification depends on the correct uncompressed addresses.
*/
#if 0
/* Mode 1 - 64 bits inline */
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 1);
#elif 1
/* Mode 2 - 16 bits inline */
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0x00ff, 0xfe00, 1);
#else
/* Mode 3 - derived from link local (MAC) address */
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
#endif
uip_ds6_addr_add(&ipaddr, 0, ADDR_MANUAL);
root_if = uip_ds6_addr_lookup(&ipaddr);
if(root_if != NULL) {
rpl_dag_t *dag;
dag = rpl_set_root(RPL_DEFAULT_INSTANCE,(uip_ip6addr_t *)&ipaddr);
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
rpl_set_prefix(dag, &ipaddr, 64);
PRINTF("created a new RPL dag\n");
} else {
PRINTF("failed to create a new RPL DAG\n");
}
#endif /* UIP_CONF_ROUTER */
print_local_addresses();
/* The data sink runs with a 100% duty cycle in order to ensure high
packet reception rates. */
//NETSTACK_MAC.off(1);
server_conn = udp_new(NULL, UIP_HTONS(UDP_CLIENT_PORT), NULL);
if(server_conn == NULL) {
PRINTF("No UDP connection available, exiting the process!\n");
PROCESS_EXIT();
}
udp_bind(server_conn, UIP_HTONS(UDP_SERVER_PORT));
PRINTF("Created a server connection with remote address ");
PRINT6ADDR(&server_conn->ripaddr);
PRINTF(" local/remote port %u/%u\n", UIP_HTONS(server_conn->lport),
UIP_HTONS(server_conn->rport));
while(1) {
PROCESS_YIELD();
if(ev == tcpip_event) {
tcpip_handler();
} else if (ev == sensors_event && data == &button_sensor) {
PRINTF("Initiaing global repair\n");
rpl_repair_root(RPL_DEFAULT_INSTANCE);
}
}
PROCESS_END();
}
/*---------------------------------------------------------------------------*/

View file

@ -0,0 +1,12 @@
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
all: sensd_client server
CONTIKI=../../../../..
ifdef PERIOD
CFLAGS+=-DPERIOD=$(PERIOD)
endif
CONTIKI_WITH_IPV6 = 1
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1,222 @@
Contiki client for sensd
========================
Sensd README describes the concept. sensd code is on github.
sensd - A WSN Internet GW, hub, agent, proxy & cloud
====================================================
Authors
--------
Robert Olsson <robert@radio-sensors.com>
Jens Laas <jens.laas@uadm.uu.se>
Contributors
------------
Abstract
--------
We've outlined, designed and implemented and very simple concept for WSN
data sharing, including data collection, storage and retrieval using
standard text tools. The concept restricts Internet access to WSN
motes and acts agent not to expose motes directly for robustness and
security reasons. Low level, physical or link WSN protocol can be used.
including 6lowpan, RIME etc and any type of Radio Duty Cycling (RDC).
sensd works on the application layer. A TCP connection initiates an
implicit "subscribe". The M2P model is currently supported.
Key concepts
------------
* Agent. sensd works as an agent and does not allow direct Internet
access to motes. Recall motes are constrained in most aspects and
can not support many connections, has weak security etc.
* Hub. Share the data from the root or sink node over TCP. In effect sensor
data can be sent over Internet to be shared over among TCP active listeners.
The TCP connection initiates an implicit "subscribe".
* Proxy. The support proxy functions over ipv4 and well as ipv6. Sensd can
forward to a proxy on a public IP. The typical case is when GW is behind
a NAT.
* WSN RP "rendez-vous point". A concepts where data from various WSN nets
are merged. This models a "cloud service" functionality for WSN networks.
sensd can be used both to forward data to RP. It can also work as the RP.
RP receiving WSN data and allowing multiple TCP listeners.
* All programs are written C, script in Java and bash. Designed for small
footprint and with minimal dependencies. sensd runs on Raspberry Pi and
Openwrt.
* This work introduces a simple tag format for sensor data. The overall
idea is that data tagging is an "agreement" between producers and consumer.
Tags are simple are description of the data. Example T=25.2. where T=
is the tag 25.2 the value. Most likely this a temperature. But we
can't be sure since we don't know since this is an agreement between
the producer and the consumer. Tags are also used for identification.
Example tags, E64= Where globally unique ID can used. Another more
relaxed example is TXT= a user description. See docs.
* Geotagging and timestamping is supported via tags.
* Ecosystem support. There are telphone apps to for data monitoring and
and plotting. Android app can act as WSN-agent and forward to proxy/RP.
* The concept also includes a mapping to URI (Unified Resource Identifier)
to form a WSN caching server similar to CoAP using http-proxy.
* Copyright. Open-Source via GPL. Projecet used github.com
Introduction
------------
This is collection of software to implement data monitoring and data collection
from WSN Wireless Sensor Networks. The goal is to have a very simple,
straight-forward and robust framework.
The scenario: One or several motes is connected to USB or serial port to gather
received information from connected WSN motes. Data can be visualized in
several ways.
* Sensor data report can be transmitted and propagated throughout the
Internet. sensd acts as server and sends incoming report to active
listeners.
* Data is kept in ASCII with tagging and ID information. Data is conveniently
handled, copied and viewed with standard text utilities of your OS.
* Last mote report is cached into the file system suitable for URI use. The
Format is SID/TAG. Typical tags are EUI64 and unique serial numbers. The
different TAGS are left for mote user to define. Although the TAGS used in
our example setup are included in this draft for example purposes.
Both formats can easily be stored or linked directly in web tree to form a
URI to format WSN logging/datafile or caching service.
A daemon that reads WSN mote reports from USB/serial and stores data in a ASCII
data file. Default is located at _/var/log/sensors.dat_
Addtional components
--------------------
* seltag [More info] (https://github.com/herjulf/sensd/blob/master/seltag/README.md)
* js A set of Java-scripts can plot, print and visualize sensor data from
sensd directly in your web-browser.
* documentation and sample files. [More info] (https://github.com/herjulf/sensd/blob/master/seltag/README.md)
* Read Sensors Android app. [Source Code] (https://github.com/herjulf/Read-Sensors)
Datafile logging
----------------
Below is and example of the anatomy of a sensors.dat file we are currently using in our WSN
data collection networks.
2012-05-22 14:07:46 UT=1337688466 ID=283c0cdd030000d7 PS=0 T=30.56 T_MCU=34.6 V_MCU=3.08 UP=2C15C V_IN=4.66
2012-05-22 14:11:41 UT=1337688701 ID=28a9d5dc030000af PS=0 T=36.00 V_MCU=2.92 UP=12C8A0 RH=42.0 V_IN=4.13 V_A1=3.43 [ADDR=0.175 SEQ=33 RSSI=21 LQI=255 DRP=1.00]
Each line is a mote report. They start with date and time and are followed by a set of
tags. The tags is different for different motes. In other words they can
send different data. Essential is the ID which should be unique for each mote.
The information with brackets is information generated by the receiving mote
and is not a part the motes data. Typically RSSI (Receiver Signal Strength
Indicator) and LQI (Link Quality Indicator)
Internet sensor data
--------------------
Start sensd with the `-report` option. This enables reports to be transmitted
over IP to remote listeners. Default TCP port 1234.
Server side example:
sensd -report -p 1234 -D /dev/ttyUSB0
Client side. Example using netcat:
nc server-ip 1234
URI format
----------
URI (Unified Resource Identifier) displays the node ID and the tags in a file tree.
It is easy to export this into a web tree to form a URI similar to a CoAP gateway.
Example: In our case we have a unique sensor ID followed by the different data
fields represented by "tags".
/tmp/WSN1-GW1/281a98d20200004a:
DRP ID LQI PS RH RSSI SEQ T V_IN V_MCU ADDR
/tmp/WSN1-GW1/28be51ce02000031:
DRP ID LQI PS RH RSSI SEQ T UP V_IN V_MCU ADDR
Read Temp from a sensor:
cat /tmp/WSN1-GW1/281a98d20200004a/T
19.44
And it's very easy to link this tree into a web-server.
GPS support
-----------
Positioning support has been added via GPS device connected to serial
or USB port. Tags added when enabled GWGPS_LON & GWGPS_LAT.
GPS code from. https://github.com/herjulf/gps_simple
Getting the source and building
-------------------------------
Code is stored in github. Typically procedure below is the very straight-
forward unix way:
git clone http://github.com/herjulf/sensd
cd sensd
make
Put your binaries after your preference:
Pre-built binary versions
--------------------------
For x86:
Sensd and friends are available in Bifrost/Linux packages. Those packages are
statically linked and can be used on most x86 Linuxes. 32-bit compiled.
http://ftp.sunet.se/pub/Linux/distributions/bifrost/download/opt/opt-sensd-2.3-1.tar.gz
Use
---
The WSN data logging and caching concept is in actual use with Contiki, RIME
broadcast application.
Tips
----
One can use netcat to listen to reports:
Example:
nc radio-sensors.com 1235
To save in file use nohup:
nohup nc radio-sensors.com 1235 > /var/log/sensors.dat
As sensd used TCP and ASCII encoding. tetlnet and web-browsers can be used
as well.

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2015, RAdio Sensors AB, Uppsala Sweden
* 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.
*/
/**
* \file
* Project specific configuration defines for example
*
* \author
* Robert Olsson <robert@radio-sensors.com>
*/
#ifndef PROJECT_CONF_H_
#define PROJECT_CONF_H_
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_MAC nullmac_driver
//#define NETSTACK_CONF_MAC csma_driver
//#define NETSTACK_CONF_RDC contikimac_driver
//#define NETSTACK_CONF_FRAMER framer_802154
//#define NETSTACK_CONF_RADIO rf230_driver
#endif /* PROJECT_CONF_H_ */

View file

@ -0,0 +1,188 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-12-28
*/
/**
* \file
* A simple application reporting sensor data. Can be sensd
*/
#include <string.h>
#include "contiki-net.h"
#include "leds.h"
#include "dev/leds.h"
#include "dev/battery-sensor.h"
#include "dev/temp_mcu-sensor.h"
#include "dev/light-sensor.h"
#ifdef CO2
#include "dev/co2_sa_kxx-sensor.h"
#endif
#ifndef PERIOD
#define PERIOD 10
#endif
#define REPORT_INTERVAL (PERIOD * CLOCK_SECOND)
#define DEBUG DEBUG_PRINT
#include "uip-debug.h"
#define PORT 1236
#define MAX_PAYLOAD_LEN 80
static struct psock ps;
static uint8_t out_buf[MAX_PAYLOAD_LEN];
static char in_buffer[MAX_PAYLOAD_LEN];
static int i;
static int send_now;
static clock_time_t report_interval = REPORT_INTERVAL;
static uint8_t state;
static uip_ipaddr_t addr;
static struct timer t, t1;
static struct etimer et, et1;
PROCESS(sensd_client_process, "sensd TCP client process");
PROCESS(report_timer_process, "report pacemaker");
AUTOSTART_PROCESSES
(&sensd_client_process,&report_timer_process);
static int
do_report(void)
{
static int seq_id;
int len = 0;
seq_id++;
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "&: ");
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "TXT=6LOWPAN ");
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "TARGET=avr-rss2 ");
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "V_MCU=%-d ", battery_sensor.value(0));
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "T_MCU=%-d ", temp_mcu_sensor.value(0));
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "LIGHT=%-d ", light_sensor.value(0));
#ifdef CO2
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "CO2=%-d ", co2_sa_kxx_sensor.value(value));
#endif
len += snprintf((char *) &out_buf[len], sizeof(out_buf), "\n\r");
return len;
}
static void
print_local_addresses(void)
{
PRINTF("Server IPv6 addresses:\n\r");
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
state = uip_ds6_if.addr_list[i].state;
if(uip_ds6_if.addr_list[i].isused &&
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
PRINTF("\n\r");
}
}
}
static void
set_global_address(void)
{
uip_ipaddr_t ipaddr;
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
}
static int handle_connection(struct psock *p, long ts) {
PSOCK_BEGIN(p);
if(send_now) {
do_report();
leds_on(LEDS_YELLOW);
PSOCK_SEND(p, (const uint8_t *) out_buf, strlen((const char *) out_buf));
send_now = 0;
}
PSOCK_END(p);
}
PROCESS_THREAD(report_timer_process, ev, data) {
PROCESS_BEGIN();
while(1) {
timer_set(&t1, report_interval);
etimer_set(&et1, timer_remaining(&t1));
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et1));
send_now = 1;
leds_on(LEDS_RED);
}
PROCESS_END();
}
PROCESS_THREAD(sensd_client_process, ev, data) {
PROCESS_BEGIN();
set_global_address();
leds_init();
print_local_addresses();
printf("Starting TCP client on port=%d\n", PORT);
/* Set server address. typically sensd */
//uip_ip6addr(&addr, 0xfe80, 0, 0, 0, 0xfec2, 0x3d00, 1, 0x63ae);
uip_ip6addr(&addr, 0x0000, 0, 0, 0, 0, 0xffff, 0xc0a8, 0x0201);
//uip_ip6addr(&addr, 0x0000, 0, 0, 0, 0, 0xffff, 0xc0a8, 0x0255);
random_init(50);
while(1) {
/* Delay connection attempts */
timer_set(&t, 2*CLOCK_SECOND);
etimer_set(&et, timer_remaining(&t));
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
/* Time out teh actual connection attempt */
timer_set(&t, 10*CLOCK_SECOND);
printf("Connecting");
tcp_connect(&addr, UIP_HTONS(PORT), NULL);
PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event);
if(uip_aborted() || uip_timedout() || uip_closed()) {
printf(" Failed\n");
} else if(uip_connected()) {
printf(" Success\n");
PSOCK_INIT(&ps, (uint8_t *)in_buffer, sizeof(in_buffer));
do {
handle_connection(&ps, clock_seconds());
PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event);
} while(!(uip_closed() || uip_aborted() || uip_timedout()));
printf("Disconnected\n");
}
}
PROCESS_END();
}

View file

@ -0,0 +1,128 @@
/*
* Copyright (c) 2015, Copyright Robert Olsson / Radio Sensors AB
* 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.
*
*
* Author : Robert Olsson robert@radio-sensors.com
* Created : 2015-12-28
*/
/**
* \file
* A simple TCP server for client app.
*/
#include <string.h>
#include "contiki-net.h"
#include "leds.h"
#define DEBUG DEBUG_PRINT
#include "uip-debug.h"
#define PORT 1236
static struct psock ps;
static uint8_t buf[120];
static int i;
static uint8_t state;
static void
print_local_addresses(void)
{
PRINTF("Server IPv6 addresses:\n\r");
for(i = 0; i < UIP_DS6_ADDR_NB; i++) {
state = uip_ds6_if.addr_list[i].state;
if(uip_ds6_if.addr_list[i].isused &&
(state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) {
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
PRINTF("\n\r");
}
}
}
static void
set_global_address(void)
{
uip_ipaddr_t ipaddr;
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
}
static
PT_THREAD(handle_connection(struct psock *p))
{
PSOCK_BEGIN(p);
//PSOCK_SEND_STR(p, "Type something!\n");
leds_on(LEDS_RED);
PSOCK_READTO(p, '\n');
printf("RX=%s", buf);
//PSOCK_SEND_STR(p, "Got: ");
//PSOCK_SEND(p, buf, PSOCK_DATALEN(p));
//PSOCK_SEND_STR(p, "EOL\r\n");
//PSOCK_CLOSE(p);
PSOCK_END(p);
}
PROCESS(server_process, "Server");
AUTOSTART_PROCESSES(&server_process);
PROCESS_THREAD(server_process, ev, data)
{
PROCESS_BEGIN();
set_global_address();
leds_init();
print_local_addresses();
printf("Starting TCP server on port=%d\n", PORT);
tcp_listen(UIP_HTONS(PORT));
while(1) {
PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event);
if(uip_aborted() )
printf("TCP aborted\n");
if(uip_timedout() )
printf("TCP timeoutn\n");
if(uip_closed() )
printf("TCP closed\n");
if(uip_connected()) {
printf("TCP Connected\n\r");
PSOCK_INIT(&ps, buf, sizeof(buf));
while(!(uip_aborted() || uip_closed() || uip_timedout())) {
PROCESS_WAIT_EVENT_UNTIL(ev == tcpip_event);
handle_connection(&ps);
}
}
}
PROCESS_END();
}

View file

@ -0,0 +1,42 @@
/*
* Copyright (c) 2012, Thingsquare, http://www.thingsquare.com/.
* 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 copyright holder 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 COPYRIGHT HOLDERS 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
* COPYRIGHT HOLDER 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.
*
*/
#ifndef IP64_CONF_H
#define IP64_CONF_H
#include "net/ip64/ip64-eth-interface.h"
#include "dev/enc28j60/enc28j60-ip64-driver.h"
#define IP64_CONF_UIP_FALLBACK_INTERFACE ip64_eth_interface
#define IP64_CONF_INPUT ip64_eth_interface_input
#define IP64_CONF_DHCP 1
#define IP64_CONF_ETH_DRIVER enc28j60_ip64_driver
#endif /* IP64_CONF_H */

284
platform/avr-rss2/params.c Normal file
View file

@ -0,0 +1,284 @@
/*
* Copyright (c) 2011, 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.
*
*/
#define PRINTF(FORMAT, args ...) printf_P(PSTR(FORMAT),##args)
#define DEBUG 1
#if DEBUG
#define PRINTD(FORMAT, args ...) printf_P(PSTR(FORMAT),##args)
#else
#define PRINTD(...)
#endif
#include "contiki.h"
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <stdio.h>
#include <string.h>
#if AVR_WEBSERVER
/* #include "httpd-fs.h" */
/* #include "httpd-cgi.h" */
#endif
#include "contiki-net.h"
#include "params.h"
#if CONTIKI_CONF_RANDOM_MAC
extern uint8_t rng_get_uint8(void);
static void
generate_new_eui64(uint8_t eui64[8])
{
eui64[0] = 0x02;
eui64[1] = rng_get_uint8();
eui64[2] = rng_get_uint8();
eui64[3] = 0xFF;
eui64[4] = 0xFE;
eui64[5] = rng_get_uint8();
eui64[6] = rng_get_uint8();
eui64[7] = rng_get_uint8();
}
#endif
#if AVR_WEBSERVER
/* Webserver builds can set these in httpd-fsdata.c via makefsdata.h */
extern uint8_t default_mac_address[8];
extern uint8_t default_server_name[16];
extern uint8_t default_domain_name[30];
#else
const uint8_t default_mac_address[8] PROGMEM = PARAMS_EUI64ADDR;
const uint8_t default_server_name[] PROGMEM = PARAMS_SERVERNAME;
const uint8_t default_domain_name[] PROGMEM = PARAMS_DOMAINNAME;
#endif
#if PARAMETER_STORAGE == 0
/* 0 Hard coded, minmal program and eeprom usage. */
uint8_t
params_get_eui64(uint8_t *eui64)
{
#if CONTIKI_CONF_RANDOM_MAC
PRINTD("Generating random EUI64 MAC\n");
generate_new_eui64(eui64);
return 1;
#else
uint8_t i;
for(i = 0; i < sizeof(default_mac_address); i++) {
eui64[i] = pgm_read_byte_near(default_mac_address + i);
}
return 0;
#endif
}
#elif PARAMETER_STORAGE == 1
/* 1 Stored in fixed eeprom locations, rewritten from flash if corrupt.
* They can be manually changed and kept over program reflash.
* The channel and bit complement are used to check EEMEM integrity,
* If corrupt all values will be rewritten with the default flash values.
* To make this work, get the channel before anything else.
*/
#if !AVR_WEBSERVER
uint8_t eemem_mac_address[] EEMEM = PARAMS_EUI64ADDR;
uint8_t eemem_server_name[] EEMEM = PARAMS_SERVERNAME;
uint8_t eemem_domain_name[] EEMEM = PARAMS_DOMAINNAME;
#endif /*AVR_WEBSERVER */
uint16_t eemem_nodeid EEMEM = PARAMS_NODEID;
uint8_t eemem_channel[2] EEMEM = { PARAMS_CHANNEL, ~PARAMS_CHANNEL };
uint16_t eemem_panid EEMEM = PARAMS_PANID;
uint16_t eemem_panaddr EEMEM = PARAMS_PANADDR;
uint8_t eemem_txpower EEMEM = PARAMS_TXPOWER;
#if CONTIKI_CONF_RANDOM_MAC
static uint8_t randomeui64;
#endif
uint8_t
params_get_channel(void)
{
uint8_t x[2];
*(uint16_t *)x = eeprom_read_word((uint16_t *)&eemem_channel);
/* Don't return an invalid channel number */
if((x[0] < 11) || (x[0] > 26)) {
x[1] = x[0];
}
/* Do exclusive or test on the two values read */
if((uint8_t)x[0] != (uint8_t) ~x[1]) { /* ~x[1] can promote comparison to 16 bit */
/* Verification fails, rewrite everything */
uint8_t i, buffer[32];
PRINTD("EEPROM is corrupt, rewriting with defaults.\n");
#if CONTIKI_CONF_RANDOM_MAC
PRINTD("Generating random EUI64 MAC\n");
generate_new_eui64(&buffer);
randomeui64 = 1;
#else
for(i = 0; i < sizeof(default_mac_address); i++) {
buffer[i] = pgm_read_byte_near(default_mac_address + i);
}
#endif
/* eeprom_write_block should not be interrupted */
cli();
eeprom_write_block(&buffer, &eemem_mac_address, sizeof(eemem_mac_address));
for(i = 0; i < sizeof(default_server_name); i++) {
buffer[i] = pgm_read_byte_near(default_server_name + i);
}
eeprom_write_block(&buffer, &eemem_server_name, sizeof(eemem_server_name));
for(i = 0; i < sizeof(default_domain_name); i++) {
buffer[i] = pgm_read_byte_near(default_domain_name + i);
}
eeprom_write_block(&buffer, &eemem_domain_name, sizeof(eemem_domain_name));
eeprom_write_word(&eemem_panid, PARAMS_PANID);
eeprom_write_word(&eemem_panaddr, PARAMS_PANADDR);
eeprom_write_byte(&eemem_txpower, PARAMS_TXPOWER);
eeprom_write_word(&eemem_nodeid, PARAMS_NODEID);
x[0] = PARAMS_CHANNEL;
x[1] = ~x[0];
eeprom_write_word((uint16_t *)&eemem_channel, *(uint16_t *)x);
sei();
}
/* Always returns a valid channel */
return x[0];
}
uint8_t
params_get_eui64(uint8_t *eui64)
{
cli();
eeprom_read_block((void *)eui64, &eemem_mac_address, sizeof(linkaddr_t));
sei();
#if CONTIKI_CONF_RANDOM_MAC
return randomeui64;
#else
return 0;
#endif
}
uint16_t
params_get_panid(void)
{
return eeprom_read_word(&eemem_panid);
}
uint16_t
params_get_panaddr(void)
{
return eeprom_read_word(&eemem_panaddr);
}
uint8_t
params_get_txpower(void)
{
return eeprom_read_byte(&eemem_txpower);
}
#else /* CONTIKI_CONF_SETTINGS_MANAGER */
uint8_t
params_get_channel()
{
uint8_t x;
size_t size = 1;
if(settings_get(SETTINGS_KEY_CHANNEL, 0, (unsigned char *)&x, &size) == SETTINGS_STATUS_OK) {
PRINTD("<-Get RF channel %u\n", x);
} else {
x = PARAMS_CHANNEL;
if(settings_add_uint8(SETTINGS_KEY_CHANNEL, x) == SETTINGS_STATUS_OK) {
PRINTD("->Set EEPROM RF channel to %d\n", x);
}
}
return x;
}
uint8_t
params_get_eui64(uint8_t *eui64)
{
size_t size = sizeof(linkaddr_t);
if(settings_get(SETTINGS_KEY_EUI64, 0, (unsigned char *)eui64, &size) == SETTINGS_STATUS_OK) {
PRINTD("<-Get EUI64 MAC\n");
return 0;
}
#if CONTIKI_CONF_RANDOM_MAC
PRINTD("Generating random EUI64 MAC\n");
generate_new_eui64(eui64);
#else
{ uint8_t i;
for(i = 0; i < 8; i++) {
eui64[i] = pgm_read_byte_near(default_mac_address + i);
}
} /* test this */
#endif
if(settings_add(SETTINGS_KEY_EUI64, (unsigned char *)eui64, 8) == SETTINGS_STATUS_OK) {
PRINTD("->Set EEPROM MAC address\n");
}
#if CONTIKI_CONF_RANDOM_MAC
return 1;
#else
return 0;
#endif
}
uint16_t
params_get_panid(void)
{
uint16_t x;
size_t size = 2;
if(settings_get(SETTINGS_KEY_PAN_ID, 0, (unsigned char *)&x, &size) == SETTINGS_STATUS_OK) {
PRINTD("<-Get PAN ID of %04x\n", x);
} else {
x = PARAMS_PANID;
if(settings_add_uint16(SETTINGS_KEY_PAN_ID, x) == SETTINGS_STATUS_OK) {
PRINTD("->Set EEPROM PAN ID to %04x\n", x);
}
}
return x;
}
uint16_t
params_get_panaddr(void)
{
uint16_t x;
size_t size = 2;
if(settings_get(SETTINGS_KEY_PAN_ADDR, 0, (unsigned char *)&x, &size) == SETTINGS_STATUS_OK) {
PRINTD("<-Get PAN address of %04x\n", x);
} else {
x = PARAMS_PANADDR;
if(settings_add_uint16(SETTINGS_KEY_PAN_ADDR, x) == SETTINGS_STATUS_OK) {
PRINTD("->Set EEPROM PAN address to %04x\n", x);
}
}
return x;
}
uint8_t
params_get_txpower(void)
{
uint8_t x;
size_t size = 1;
if(settings_get(SETTINGS_KEY_TXPOWER, 0, (unsigned char *)&x, &size) == SETTINGS_STATUS_OK) {
PRINTD("<-Get tx power of %d (0=max)\n", x);
} else {
x = PARAMS_TXPOWER;
if(settings_add_uint8(SETTINGS_KEY_TXPOWER, x) == SETTINGS_STATUS_OK) {
PRINTD("->Set EEPROM tx power of %d (0=max)\n", x);
}
}
return x;
}
#endif /* CONTIKI_CONF_SETTINGS_MANAGER */

108
platform/avr-rss2/params.h Normal file
View file

@ -0,0 +1,108 @@
#ifndef __PARAMS_H__
#define __PARAMS_H__
/* PARAMETER_STORAGE =
* 0 Hard coded, minmal program and eeprom usage.
* 1 Stored in fixed eeprom locations, rewritten from flash if corrupt.
* This allows parameter changes using a hardware programmer or custom application code.
* Corruption test is based on channel verify so get the channel before anything else!
* 2 Obtained from eeprom using the general settings manager and read from program flash if not present.
* Useful for for testing builds without wearing out flash memory.
* 3 Obtained from eeprom using the settings manager and rewritten from flash if not present.
* This ensures all parameters are present in upper eeprom flash.
*
* Note the parameters in this file can be changed without forcing a complete rebuild.
*/
#define CONTIKI_CONF_RANDOM_MAC 0 /* adds 78 bytes */
#define CONTIKI_CONF_SETTINGS_MANAGER 0 /* adds 1696 bytes */
#if CONTIKI_CONF_SETTINGS_MANAGER
/* #define PARAMETER_STORAGE 2 */
#define PARAMETER_STORAGE 2
#else
#define PARAMETER_STORAGE 1
#endif
/* Include settings.h, then dummy out the write routines */
#include "settings.h"
#if PARAMETER_STORAGE == 2
#define settings_add(...) 0
#define settings_add_uint8(...) 0
#define settings_add_uint16(...) 0
#endif
#if AVR_WEBSERVER
/* Webserver builds can set some defaults in httpd-fsdata.c via makefsdata.h */
extern uint8_t eemem_mac_address[8];
extern uint8_t eemem_server_name[16];
extern uint8_t eemem_domain_name[30];
#endif
#ifdef SERVER_NAME
#define PARAMS_SERVERNAME SERVER_NAME
#else
#define PARAMS_SERVERNAME "ATMEGA256rfr2"
#endif
#ifdef DOMAIN_NAME
#define PARAMS_DOMAINNAME DOMAIN_NAME
#else
#define PARAMS_DOMAINNAME "localhost"
#endif
#ifdef NODE_ID
#define PARAMS_NODEID NODE_ID
#else
#define PARAMS_NODEID 0
#endif
#ifdef CHANNEL_802_15_4
#define PARAMS_CHANNEL CHANNEL_802_15_4
#else
#define PARAMS_CHANNEL 26
#endif
#ifdef IEEE802154_PANID
#define PARAMS_PANID IEEE802154_PANID
#else
#define PARAMS_PANID 0xABCD
#endif
#ifdef IEEE802154_PANADDR
#define PARAMS_PANADDR IEEE802154_PANADDR
#else
#define PARAMS_PANADDR 0
#endif
#ifdef RF230_MAX_TX_POWER
#define PARAMS_TXPOWER RF230_MAX_TX_POWER
#else
#define PARAMS_TXPOWER 0
#endif
#ifdef EUI64_ADDRESS
#define PARAMS_EUI64ADDR EUI64_ADDRESS
#else
/* This form of of EUI64 mac allows full 6LoWPAN header compression from mac address */
#if UIP_CONF_LL_802154
/* #define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN} */
#define PARAMS_EUI64ADDR { 0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x01 }
#else
/* #define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} */
#define PARAMS_EUI64ADDR { 0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x01 }
#endif
/* This form of of EUI64 mac allows 16 bit 6LoWPAN header compression on multihops */
/* #define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0xNN, 0xNN} */
#endif
uint8_t params_get_eui64(uint8_t *eui64);
#if PARAMETER_STORAGE == 0
/* Hard coded program flash parameters */
#define params_get_servername(...)
#define params_get_nodeid(...) PARAMS_NODEID
#define params_get_channel(...) PARAMS_CHANNEL
#define params_get_panid(...) PARAMS_PANID
#define params_get_panaddr(...) PARAMS_PANADDR
#define params_get_txpower(...) PARAMS_TXPOWER
#else
/* Parameters stored in eeprom */
uint16_t params_get_nodeid(void);
uint8_t params_get_channel(void);
uint16_t params_get_panid(void);
uint16_t params_get_panaddr(void);
uint8_t params_get_txpower(void);
#endif
#endif /* __PARAMS_H__ */

36
platform/avr-rss2/rss2.h Normal file
View file

@ -0,0 +1,36 @@
/*
Pin assigments for Radio Sensors board revision 2.3
using MCU AtMega128rfa1
*/
#define ISP_1 PB1 /* SCK */
#define ISP_2 PB2 /* MOSI */
#define ISP_3 PB3 /* MISO */
#define LED_YELLOW PE3 /* 1k pullup to Vcc */
#define LED_RED PE4 /* 1k pullup to Vcc */
#define USB_PWR PB5 /* High if FTDI TTL-USB cable sources */
#define P0 PD2 /* Pulse count input. Pullup via jumper */
#define P1 PD3 /* Pulse count input via optional Comparator */
#define PWR_1 PE7 /* Programmable power pin Vcc via P-FET */
#define AV_IN PF0 /* V_IN ADC input. 100k/1M volt. divider */
#define A1 PF1 /* A1 ADC input. 100k/300k volt. divider */
#define A2 PF2 /* A2 ADC input 100k/300k volt. divider */
#define A3 PF3 /* Light sensor A3 ADC input 100k/100k volt. divider */
#define A3_PWR PF4 /* Light sensor power A3_PWR */
#define RX0 PE0 /* RX UART0 -- FTDI TTL-USB cable */
#define TX0 PE1 /* TX UART0 -- FTDI TTL-USB cable */
#define OW_BUS_0 PD7 /* One-Wire bus w temp/ID Pulled Up. Separate Vcc */
#define OW_BUS_1 PD6 /* One-Wire bus extra Pulled Up. Separate Vcc */
/* AVR ISP standard connected */
/* 16 MHz xtal */
/* RTC 32.768 Hz xtal */
/*Optional HIH610 connected on SPI */
#define HUM_PWR PE2 /* Power pin for HIH6130 also to ena. HIH 6130 Alarm mode */

View file

@ -0,0 +1,93 @@
/*
* Copyright (c) 2010, University of Colombo School of Computing
* 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.
*
* @(#)$$
*/
/**
* \file
* Machine dependent AVR SLIP routines for UART0.
* \author
* Kasun Hewage <kasun.ch@gmail.com>
*/
#include <stdio.h>
#include "contiki.h"
#include "dev/rs232.h"
#include "slip.h"
/*---------------------------------------------------------------------------*/
static int
slip_putchar(char c, FILE *stream)
{
#define SLIP_END 0300
static char debug_frame = 0;
if(!debug_frame) { /* Start of debug output */
slip_arch_writeb(SLIP_END);
slip_arch_writeb('\r'); /* Type debug line == '\r' */
debug_frame = 1;
}
slip_arch_writeb((unsigned char)c);
/*
* Line buffered output, a newline marks the end of debug output and
* implicitly flushes debug output.
*/
if(c == '\n') {
slip_arch_writeb(SLIP_END);
debug_frame = 0;
}
return c;
}
/*---------------------------------------------------------------------------*/
static FILE slip_stdout = FDEV_SETUP_STREAM(slip_putchar, NULL,
_FDEV_SETUP_WRITE);
/*---------------------------------------------------------------------------*/
void
slip_arch_init(unsigned long ubr)
{
rs232_set_input(SLIP_PORT, slip_input_byte);
stdout = &slip_stdout;
}
/*---------------------------------------------------------------------------*/
/*
XXX:
Currently, the following function is in cpu/avr/dev/rs232.c file. this
should be moved to here from there hence this is a platform specific slip
related function.
void
slip_arch_writeb(unsigned char c)
{
rs232_send(RS232_PORT_0, c);
}
*/