New platform: TI cc2530 Development Kit
This commits adds support for TI's SmartRF05 Eval. Board with cc2530 EMs Some initial support for cc2531 USB dongles
This commit is contained in:
parent
b7674c3636
commit
ad256e5014
68 changed files with 6824 additions and 0 deletions
6
examples/cc2530dk/Makefile
Normal file
6
examples/cc2530dk/Makefile
Normal file
|
@ -0,0 +1,6 @@
|
|||
CONTIKI_PROJECT = hello-world blink-hello timer-test sensors-demo
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
|
||||
CONTIKI = ../..
|
||||
include $(CONTIKI)/Makefile.include
|
1
examples/cc2530dk/Makefile.target
Normal file
1
examples/cc2530dk/Makefile.target
Normal file
|
@ -0,0 +1 @@
|
|||
TARGET = cc2530dk
|
62
examples/cc2530dk/blink-hello.c
Normal file
62
examples/cc2530dk/blink-hello.c
Normal file
|
@ -0,0 +1,62 @@
|
|||
/* This is a very simple hello_world program.
|
||||
* It aims to demonstrate the co-existence of two processes:
|
||||
* One of them prints a hello world message and the other blinks the LEDs
|
||||
*
|
||||
* It is largely based on hello_world in $(CONTIKI)/examples/sensinode
|
||||
*
|
||||
* Author: George Oikonomou - <oikonomou@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
#include "contiki.h"
|
||||
#include "dev/leds.h"
|
||||
|
||||
#include <stdio.h> /* For printf() */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et_hello;
|
||||
static struct etimer et_blink;
|
||||
static uint16_t count;
|
||||
static uint8_t blinks;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(hello_world_process, "Hello world process");
|
||||
PROCESS(blink_process, "LED blink process");
|
||||
AUTOSTART_PROCESSES(&hello_world_process, &blink_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(hello_world_process, ev, data)
|
||||
{
|
||||
PROCESS_BEGIN();
|
||||
|
||||
etimer_set(&et_hello, CLOCK_SECOND * 4);
|
||||
count = 0;
|
||||
|
||||
while(1) {
|
||||
PROCESS_WAIT_EVENT();
|
||||
|
||||
if(ev == PROCESS_EVENT_TIMER) {
|
||||
printf("Sensor says #%u\n", count);
|
||||
count ++;
|
||||
|
||||
etimer_reset(&et_hello);
|
||||
}
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(blink_process, ev, data)
|
||||
{
|
||||
PROCESS_BEGIN();
|
||||
|
||||
while(1) {
|
||||
etimer_set(&et_blink, CLOCK_SECOND);
|
||||
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);
|
||||
|
||||
blinks = leds_get();
|
||||
leds_off(LEDS_ALL);
|
||||
leds_on((blinks + 1) & LEDS_ALL);
|
||||
printf("Blink... (state %0.2X)\n", leds_get());
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
15
examples/cc2530dk/border-router/Makefile
Normal file
15
examples/cc2530dk/border-router/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
|||
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
|
||||
|
||||
# We need uIPv6, therefore we also need banking
|
||||
HAVE_BANKING=1
|
||||
UIP_CONF_IPV6=1
|
||||
|
||||
PROJECT_SOURCEFILES += slip-bridge.c
|
||||
|
||||
CONTIKI_PROJECT = border-router
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
|
||||
CONTIKI = ../../..
|
||||
|
||||
include $(CONTIKI)/Makefile.include
|
1
examples/cc2530dk/border-router/Makefile.target
Normal file
1
examples/cc2530dk/border-router/Makefile.target
Normal file
|
@ -0,0 +1 @@
|
|||
TARGET = cc2530dk
|
16
examples/cc2530dk/border-router/README
Normal file
16
examples/cc2530dk/border-router/README
Normal file
|
@ -0,0 +1,16 @@
|
|||
border-router example for the TI SmartRF05EB with a cc2530EM.
|
||||
|
||||
This example is meant to be used with tunslip6 in tools/
|
||||
|
||||
- Build the code and load it onto your node
|
||||
- Connect your node to your PC
|
||||
- run:
|
||||
sudo ./tunslip6 -s /dev/ttyUSBx <address v6>/<prefix>
|
||||
|
||||
This will setup tun0 on your PC over device /dev/ttyUSBx. The address
|
||||
argument should contain the v6 address that you want to assign to tun0
|
||||
The node will use this address to obtain the network prefix
|
||||
|
||||
for example:
|
||||
sudo ./tunslip6 aaaa::1/64
|
||||
This will use aaaa:: / 64 as the prefix for the 15.4 network.
|
131
examples/cc2530dk/border-router/border-router.c
Normal file
131
examples/cc2530dk/border-router/border-router.c
Normal file
|
@ -0,0 +1,131 @@
|
|||
/*
|
||||
* 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 <string.h>
|
||||
|
||||
#define DEBUG DEBUG_PRINT
|
||||
#include "net/uip-debug.h"
|
||||
#include "net/rpl/rpl.h"
|
||||
#include "dev/watchdog.h"
|
||||
#include "dev/slip.h"
|
||||
#include "dev/leds.h"
|
||||
#include "cc253x.h"
|
||||
|
||||
static uint8_t prefix_set;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(border_router_process, "Border Router process");
|
||||
AUTOSTART_PROCESSES(&border_router_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
print_local_addresses(void)
|
||||
{
|
||||
int i;
|
||||
uint8_t state;
|
||||
|
||||
PRINTF("Router's 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)) {
|
||||
PRINTF(" ");
|
||||
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
|
||||
PRINTF("\n");
|
||||
if (state == ADDR_TENTATIVE) {
|
||||
uip_ds6_if.addr_list[i].state = ADDR_PREFERRED;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
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_len = 0;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Set our prefix when we receive one over SLIP */
|
||||
void
|
||||
set_prefix_64(uip_ipaddr_t *prefix_64) {
|
||||
rpl_dag_t *dag;
|
||||
uip_ipaddr_t ipaddr;
|
||||
memcpy(&ipaddr, prefix_64, 16);
|
||||
prefix_set = 1;
|
||||
uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
|
||||
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);
|
||||
|
||||
/* Become root of a new DODAG with ID our global v6 address */
|
||||
dag = rpl_set_root(RPL_DEFAULT_INSTANCE, &ipaddr);
|
||||
if(dag != NULL) {
|
||||
rpl_set_prefix(dag, &ipaddr, 64);
|
||||
PRINTF("Created a new RPL dag with ID: ");
|
||||
PRINT6ADDR(&dag->dag_id);
|
||||
PRINTF("\n");
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(border_router_process, ev, data)
|
||||
{
|
||||
static struct etimer et;
|
||||
|
||||
PROCESS_BEGIN();
|
||||
PRINTF("Border Router started\n");
|
||||
prefix_set = 0;
|
||||
|
||||
leds_on(LEDS_RED);
|
||||
|
||||
/* Request prefix until it has been received */
|
||||
while(!prefix_set) {
|
||||
leds_on(LEDS_GREEN);
|
||||
PRINTF("Prefix request.\n");
|
||||
etimer_set(&et, CLOCK_SECOND);
|
||||
request_prefix();
|
||||
leds_off(LEDS_GREEN);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
}
|
||||
|
||||
/* We have created a new DODAG when we reach here */
|
||||
PRINTF("On Channel %u\n", (uint8_t)((FREQCTRL + 44) / 5));
|
||||
|
||||
print_local_addresses();
|
||||
|
||||
leds_off(LEDS_RED);
|
||||
|
||||
PROCESS_EXIT();
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
48
examples/cc2530dk/border-router/project-conf.h
Normal file
48
examples/cc2530dk/border-router/project-conf.h
Normal file
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* 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 border router /
|
||||
* slip bridge example for cc253x.
|
||||
*
|
||||
* \author
|
||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
#ifndef PROJECT_CONF_H_
|
||||
#define PROJECT_CONF_H_
|
||||
|
||||
#define VIZTOOL_MAX_PAYLOAD_LEN 120
|
||||
#define SLIP_ARCH_CONF_ENABLE 1
|
||||
#define LPM_CONF_MODE 0
|
||||
|
||||
#endif /* PROJECT_CONF_H_ */
|
105
examples/cc2530dk/border-router/slip-bridge.c
Normal file
105
examples/cc2530dk/border-router/slip-bridge.c
Normal file
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* $Id: slip-bridge.c,v 1.3 2010/06/08 19:53:49 nifi Exp $
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Slip fallback interface
|
||||
* \author
|
||||
* Niclas Finne <nfi@sics.se>
|
||||
* Joakim Eriksson <joakime@sics.se>
|
||||
* Joel Hoglund <joel@sics.se>
|
||||
* Nicolas Tsiftes <nvt@sics.se>
|
||||
*/
|
||||
|
||||
#include "net/uip.h"
|
||||
#include "net/uip-ds6.h"
|
||||
#include "net/rpl/rpl.h"
|
||||
#include "dev/slip.h"
|
||||
#include <string.h>
|
||||
|
||||
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||
|
||||
#define DEBUG DEBUG_NONE
|
||||
#include "net/uip-debug.h"
|
||||
|
||||
void set_prefix_64(uip_ipaddr_t *);
|
||||
|
||||
static uip_ipaddr_t last_sender;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
slip_input_callback(void)
|
||||
{
|
||||
PRINTF("SIN: %u\n", uip_len);
|
||||
if((char) uip_buf[0] == '!') {
|
||||
PRINTF("Got configuration message of type %c\n", uip_buf[1]);
|
||||
uip_len = 0;
|
||||
if((char)uip_buf[1] == 'P') {
|
||||
uip_ipaddr_t prefix;
|
||||
/* Here we set a prefix !!! */
|
||||
memset(&prefix, 0, 16);
|
||||
memcpy(&prefix, &uip_buf[2], 8);
|
||||
PRINTF("Setting prefix ");
|
||||
PRINT6ADDR(&prefix);
|
||||
PRINTF("\n");
|
||||
set_prefix_64(&prefix);
|
||||
}
|
||||
}
|
||||
/* Save the last sender received over SLIP to avoid bouncing the
|
||||
packet back if no route is found */
|
||||
uip_ipaddr_copy(&last_sender, &UIP_IP_BUF->srcipaddr);
|
||||
}
|
||||
#include "debug.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
init(void)
|
||||
{
|
||||
process_start(&slip_process, NULL);
|
||||
slip_set_input_callback(slip_input_callback);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
output(void)
|
||||
{
|
||||
if(uip_ipaddr_cmp(&last_sender, &UIP_IP_BUF->srcipaddr)) {
|
||||
/* Do not bounce packets back over SLIP if the packet was received
|
||||
over SLIP */
|
||||
PRINTF("slip-bridge: Destination off-link but no route\n");
|
||||
} else {
|
||||
PRINTF("SUT: %u\n", uip_len);
|
||||
slip_send();
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
struct uip_fallback_interface slip_interface = {
|
||||
init, output
|
||||
};
|
||||
/*---------------------------------------------------------------------------*/
|
23
examples/cc2530dk/hello-world.c
Normal file
23
examples/cc2530dk/hello-world.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* \file
|
||||
* Basic hello world example
|
||||
* \author
|
||||
* Zach Shelby <zach@sensinode.com>
|
||||
*/
|
||||
|
||||
#include "contiki.h"
|
||||
#include <stdio.h> /* For printf() */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(hello_world_process, "Hello world process");
|
||||
AUTOSTART_PROCESSES(&hello_world_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(hello_world_process, ev, data)
|
||||
{
|
||||
|
||||
PROCESS_BEGIN();
|
||||
|
||||
printf("Hello World!\n");
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
193
examples/cc2530dk/sensors-demo.c
Normal file
193
examples/cc2530dk/sensors-demo.c
Normal file
|
@ -0,0 +1,193 @@
|
|||
/*
|
||||
* 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
|
||||
* Example to demonstrate-test cc2530 sensor functionality
|
||||
*
|
||||
* B1 turns LED_GREEN on and off.
|
||||
*
|
||||
* The node takes readings from the various sensors every x seconds and
|
||||
* prints out the results.
|
||||
*
|
||||
* We use floats here to translate the AD conversion results to
|
||||
* meaningful values. However, our printf does not have %f support so
|
||||
* we use an ugly hack to print out the value by extracting the integral
|
||||
* part and then the fractional part. Don't try this at home.
|
||||
*
|
||||
* Temperature:
|
||||
* Math is correct, the sensor needs calibration per device.
|
||||
* I currently use default values for the math which may result in
|
||||
* very incorrect values in degrees C.
|
||||
* See TI Design Note DN102 about the offset calibration.
|
||||
*
|
||||
* Supply Voltage (VDD):
|
||||
* For VDD, math is correct, conversion is correct.
|
||||
* See DN101 for details.
|
||||
*
|
||||
* Make sure you enable/disable things in contiki-conf.h
|
||||
*
|
||||
* \author
|
||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
#include "contiki.h"
|
||||
#include "contiki-conf.h"
|
||||
#include "dev/leds.h"
|
||||
|
||||
#include "dev/button-sensor.h"
|
||||
#include "dev/adc-sensor.h"
|
||||
|
||||
#define DEBUG 1
|
||||
|
||||
#if DEBUG
|
||||
#include <stdio.h>
|
||||
#define PRINTF(...) printf(__VA_ARGS__)
|
||||
#else /* DEBUG */
|
||||
/* We overwrite (read as annihilate) all output functions here */
|
||||
#define PRINTF(...)
|
||||
#endif /* DEBUG */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(sensors_test_process, "Sensor Test Process");
|
||||
#if BUTTON_SENSOR_ON
|
||||
PROCESS(buttons_test_process, "Button Test Process");
|
||||
AUTOSTART_PROCESSES(&sensors_test_process, &buttons_test_process);
|
||||
#else
|
||||
AUTOSTART_PROCESSES(&sensors_test_process);
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#if BUTTON_SENSOR_ON
|
||||
PROCESS_THREAD(buttons_test_process, ev, data)
|
||||
{
|
||||
struct sensors_sensor *sensor;
|
||||
|
||||
PROCESS_BEGIN();
|
||||
|
||||
while (1) {
|
||||
|
||||
PROCESS_WAIT_EVENT_UNTIL(ev == sensors_event);
|
||||
|
||||
/* If we woke up after a sensor event, inform what happened */
|
||||
sensor = (struct sensors_sensor *)data;
|
||||
if(sensor == &button_sensor) {
|
||||
PRINTF("Button Press\n");
|
||||
leds_toggle(LEDS_GREEN);
|
||||
}
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(sensors_test_process, ev, data)
|
||||
{
|
||||
static struct etimer et;
|
||||
|
||||
/* Sensor Values */
|
||||
static int rv;
|
||||
static struct sensors_sensor * sensor;
|
||||
static float sane = 0;
|
||||
static int dec;
|
||||
static float frac;
|
||||
|
||||
PROCESS_BEGIN();
|
||||
|
||||
PRINTF("========================\n");
|
||||
PRINTF("Starting Sensor Example.\n");
|
||||
PRINTF("========================\n");
|
||||
|
||||
/* Set an etimer. We take sensor readings when it expires and reset it. */
|
||||
etimer_set(&et, CLOCK_SECOND * 2);
|
||||
|
||||
while (1) {
|
||||
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
|
||||
/*
|
||||
* Request some ADC conversions
|
||||
* Return value -1 means sensor not available or turned off in conf
|
||||
*/
|
||||
sensor = sensors_find(ADC_SENSOR);
|
||||
if (sensor) {
|
||||
PRINTF("------------------\n");
|
||||
leds_on(LEDS_RED);
|
||||
/*
|
||||
* Temperature:
|
||||
* Using 1.25V ref. voltage (1250mV).
|
||||
* Typical AD Output at 25°C: 1480
|
||||
* Typical Co-efficient : 4.5 mV/°C
|
||||
*
|
||||
* Thus, at 12bit decimation (and ignoring the VDD co-efficient as well
|
||||
* as offsets due to lack of calibration):
|
||||
*
|
||||
* AD - 1480
|
||||
* T = 25 + ---------
|
||||
* 4.5
|
||||
*/
|
||||
rv = sensor->value(ADC_SENSOR_TYPE_TEMP);
|
||||
if(rv != -1) {
|
||||
sane = 25 + ((rv - 1480) / 4.5);
|
||||
dec = sane;
|
||||
frac = sane - dec;
|
||||
PRINTF(" Temp=%d.%02u C (%d)\n", dec, (unsigned int)(frac*100), rv);
|
||||
}
|
||||
/*
|
||||
* Power Supply Voltage.
|
||||
* Using 1.25V ref. voltage.
|
||||
* AD Conversion on VDD/3
|
||||
*
|
||||
* Thus, at 12bit resolution:
|
||||
*
|
||||
* ADC x 1.25 x 3
|
||||
* Supply = -------------- V
|
||||
* 2047
|
||||
*/
|
||||
rv = sensor->value(ADC_SENSOR_TYPE_VDD);
|
||||
if(rv != -1) {
|
||||
sane = rv * 3.75 / 2047;
|
||||
dec = sane;
|
||||
frac = sane - dec;
|
||||
PRINTF("Supply=%d.%02u V (%d)\n", dec, (unsigned int)(frac*100), rv);
|
||||
/* Store rv temporarily in dec so we can use it for the battery */
|
||||
dec = rv;
|
||||
}
|
||||
/*
|
||||
* Battery Voltage - ToDo
|
||||
* rv = sensor->value(ADC_SENSOR_TYPE_BATTERY);
|
||||
*/
|
||||
|
||||
leds_off(LEDS_RED);
|
||||
}
|
||||
etimer_reset(&et);
|
||||
}
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
10
examples/cc2530dk/sniffer/Makefile
Normal file
10
examples/cc2530dk/sniffer/Makefile
Normal file
|
@ -0,0 +1,10 @@
|
|||
DEFINES+=PROJECT_CONF_H
|
||||
PROJECT_SOURCEFILES += stub-rdc.c
|
||||
|
||||
CONTIKI_PROJECT = sniffer
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
|
||||
CONTIKI = ../../..
|
||||
|
||||
include $(CONTIKI)/Makefile.include
|
1
examples/cc2530dk/sniffer/Makefile.target
Normal file
1
examples/cc2530dk/sniffer/Makefile.target
Normal file
|
@ -0,0 +1 @@
|
|||
TARGET = cc2530dk
|
50
examples/cc2530dk/sniffer/netstack.c
Normal file
50
examples/cc2530dk/sniffer/netstack.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* 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
|
||||
* Stub file overriding core/net/netstack.c. What we want to achieve
|
||||
* here is call netstack_init from main without initialising the RDC,
|
||||
* MAC and Network layers. It will just turn on the radio instead.
|
||||
*
|
||||
* \author
|
||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
#include "netstack.h"
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void
|
||||
netstack_init(void)
|
||||
{
|
||||
NETSTACK_RADIO.init();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
50
examples/cc2530dk/sniffer/project-conf.h
Normal file
50
examples/cc2530dk/sniffer/project-conf.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* 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>
|
||||
*/
|
||||
|
||||
#ifndef PROJECT_CONF_H_
|
||||
#define PROJECT_CONF_H_
|
||||
|
||||
#define CC2530_RF_CONF_HEXDUMP 1
|
||||
#define CC2530_RF_CONF_AUTOACK 0
|
||||
#define NETSTACK_CONF_RDC stub_rdc_driver
|
||||
#define ADC_SENSOR_CONF_ON 0
|
||||
#define LPM_CONF_MODE 0
|
||||
#define UART0_CONF_HIGH_SPEED 1
|
||||
|
||||
#endif /* PROJECT_CONF_H_ */
|
54
examples/cc2530dk/sniffer/sniffer.c
Normal file
54
examples/cc2530dk/sniffer/sniffer.c
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* 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 "cc253x.h"
|
||||
|
||||
#define DEBUG DEBUG_NONE
|
||||
#include "net/uip-debug.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(sniffer_process, "Sniffer process");
|
||||
AUTOSTART_PROCESSES(&sniffer_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(sniffer_process, ev, data)
|
||||
{
|
||||
|
||||
PROCESS_BEGIN();
|
||||
|
||||
PRINTF("Sniffer started\n");
|
||||
|
||||
/* Turn off RF Address Recognition - We need to accept all frames */
|
||||
FRMFILT0 &= ~0x01;
|
||||
|
||||
PROCESS_EXIT();
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
91
examples/cc2530dk/sniffer/stub-rdc.c
Normal file
91
examples/cc2530dk/sniffer/stub-rdc.c
Normal file
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* 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
|
||||
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,
|
||||
input,
|
||||
on,
|
||||
off,
|
||||
cca,
|
||||
};
|
||||
/*---------------------------------------------------------------------------*/
|
139
examples/cc2530dk/timer-test.c
Normal file
139
examples/cc2530dk/timer-test.c
Normal file
|
@ -0,0 +1,139 @@
|
|||
/**
|
||||
* \file
|
||||
* Tests related to clocks and timers
|
||||
*
|
||||
* This is clock_test.c plus a small addition by George Oikonomou
|
||||
* (Loughborough University) in order to test the rtimer
|
||||
*
|
||||
* \author
|
||||
* Zach Shelby <zach@sensinode.com> (Original)
|
||||
* George Oikonomou - <oikonomou@users.sourceforge.net> (rtimer code)
|
||||
*
|
||||
*/
|
||||
|
||||
#include "contiki.h"
|
||||
#include "sys/clock.h"
|
||||
#include "sys/rtimer.h"
|
||||
#include "dev/leds.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define TEST_CLOCK_DELAY 1
|
||||
#define TEST_RTIMER 1
|
||||
#define TEST_ETIMER 1
|
||||
#define TEST_CLOCK_SECONDS 1
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct etimer et;
|
||||
|
||||
#if TEST_CLOCK_DELAY
|
||||
static clock_time_t start_count, end_count, diff;
|
||||
#endif
|
||||
|
||||
#if TEST_CLOCK_SECONDS
|
||||
static unsigned long sec;
|
||||
#endif
|
||||
|
||||
#if TEST_ETIMER
|
||||
static clock_time_t count;
|
||||
#endif
|
||||
|
||||
#if TEST_RTIMER
|
||||
static struct rtimer rt;
|
||||
rtimer_clock_t rt_now, rt_for;
|
||||
static clock_time_t ct;
|
||||
#endif
|
||||
|
||||
static uint8_t i;
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(clock_test_process, "Clock test process");
|
||||
AUTOSTART_PROCESSES(&clock_test_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#if TEST_RTIMER
|
||||
void
|
||||
rt_callback(struct rtimer *t, void *ptr) {
|
||||
rt_now = RTIMER_NOW();
|
||||
ct = clock_time();
|
||||
printf("Task called at %u (clock = %u)\n", rt_now, ct);
|
||||
}
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(clock_test_process, ev, data)
|
||||
{
|
||||
|
||||
PROCESS_BEGIN();
|
||||
|
||||
etimer_set(&et, 2 * CLOCK_SECOND);
|
||||
|
||||
PROCESS_YIELD();
|
||||
|
||||
#if TEST_CLOCK_DELAY
|
||||
printf("Clock delay test, (10,000 x i) cycles:\n");
|
||||
i = 1;
|
||||
while(i < 6) {
|
||||
start_count = clock_time();
|
||||
clock_delay(10000 * i);
|
||||
end_count = clock_time();
|
||||
diff = end_count - start_count;
|
||||
printf("Delayed %u = %u ticks = ~%u ms\n", 10000 * i, diff, diff * 8);
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TEST_RTIMER
|
||||
printf("Rtimer Test, 1 sec (%u rtimer ticks):\n", RTIMER_SECOND);
|
||||
i = 0;
|
||||
while(i < 5) {
|
||||
etimer_set(&et, 2*CLOCK_SECOND);
|
||||
printf("=======================\n");
|
||||
ct = clock_time();
|
||||
rt_now = RTIMER_NOW();
|
||||
rt_for = rt_now + RTIMER_SECOND;
|
||||
printf("Now=%u (clock = %u) - For=%u\n", rt_now, ct, rt_for);
|
||||
if (rtimer_set(&rt, rt_for, 1,
|
||||
(void (*)(struct rtimer *, void *))rt_callback, NULL) != RTIMER_OK) {
|
||||
printf("Error setting\n");
|
||||
}
|
||||
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TEST_ETIMER
|
||||
printf("Clock tick and etimer test, 1 sec (%u clock ticks):\n", CLOCK_SECOND);
|
||||
i = 0;
|
||||
while(i < 10) {
|
||||
etimer_set(&et, CLOCK_SECOND);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
etimer_reset(&et);
|
||||
|
||||
count = clock_time();
|
||||
printf("%u ticks\n", count);
|
||||
|
||||
leds_toggle(LEDS_RED);
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TEST_CLOCK_SECONDS
|
||||
printf("Clock seconds test (5s):\n");
|
||||
i = 0;
|
||||
while(i < 10) {
|
||||
etimer_set(&et, 5 * CLOCK_SECOND);
|
||||
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||
etimer_reset(&et);
|
||||
|
||||
sec = clock_seconds();
|
||||
printf("%lu seconds\n", sec);
|
||||
|
||||
leds_toggle(LEDS_GREEN);
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
|
||||
printf("Done!\n");
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
14
examples/cc2530dk/udp-ipv6/Makefile
Normal file
14
examples/cc2530dk/udp-ipv6/Makefile
Normal file
|
@ -0,0 +1,14 @@
|
|||
DEFINES+=PROJECT_CONF_H=\"project-conf.h\"
|
||||
|
||||
HAVE_BANKING=1
|
||||
UIP_CONF_IPV6=1
|
||||
|
||||
PROJECT_SOURCEFILES += ping6.c
|
||||
|
||||
CONTIKI_PROJECT = client server
|
||||
|
||||
all: $(CONTIKI_PROJECT)
|
||||
|
||||
CONTIKI = ../../..
|
||||
|
||||
include $(CONTIKI)/Makefile.include
|
1
examples/cc2530dk/udp-ipv6/Makefile.target
Normal file
1
examples/cc2530dk/udp-ipv6/Makefile.target
Normal file
|
@ -0,0 +1 @@
|
|||
TARGET = cc2530dk
|
159
examples/cc2530dk/udp-ipv6/client.c
Normal file
159
examples/cc2530dk/udp-ipv6/client.c
Normal file
|
@ -0,0 +1,159 @@
|
|||
/*
|
||||
* 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 <string.h>
|
||||
#include "dev/leds.h"
|
||||
#include "dev/button-sensor.h"
|
||||
#include "debug.h"
|
||||
|
||||
#define DEBUG DEBUG_PRINT
|
||||
#include "net/uip-debug.h"
|
||||
|
||||
#define SEND_INTERVAL 2 * CLOCK_SECOND
|
||||
#define MAX_PAYLOAD_LEN 40
|
||||
|
||||
static char buf[MAX_PAYLOAD_LEN];
|
||||
|
||||
/* Our destinations and udp conns. One link-local and one global */
|
||||
#define LOCAL_CONN_PORT 3001
|
||||
static struct uip_udp_conn *l_conn;
|
||||
#if UIP_CONF_ROUTER
|
||||
#define GLOBAL_CONN_PORT 3002
|
||||
static struct uip_udp_conn *g_conn;
|
||||
#endif
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(udp_client_process, "UDP client process");
|
||||
#if BUTTON_SENSOR_ON
|
||||
PROCESS_NAME(ping6_process);
|
||||
AUTOSTART_PROCESSES(&udp_client_process, &ping6_process);
|
||||
#else
|
||||
AUTOSTART_PROCESSES(&udp_client_process);
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
tcpip_handler(void)
|
||||
{
|
||||
leds_on(LEDS_GREEN);
|
||||
if(uip_newdata()) {
|
||||
putstring("0x");
|
||||
puthex(uip_datalen());
|
||||
putstring(" bytes response=0x");
|
||||
puthex((*(uint16_t *) uip_appdata) >> 8);
|
||||
puthex((*(uint16_t *) uip_appdata) & 0xFF);
|
||||
putchar('\n');
|
||||
}
|
||||
leds_off(LEDS_GREEN);
|
||||
return;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
timeout_handler(void)
|
||||
{
|
||||
static int seq_id;
|
||||
struct uip_udp_conn * this_conn;
|
||||
|
||||
leds_on(LEDS_RED);
|
||||
memset(buf, 0, MAX_PAYLOAD_LEN);
|
||||
seq_id++;
|
||||
|
||||
/* evens / odds */
|
||||
if(seq_id & 0x01) {
|
||||
this_conn = l_conn;
|
||||
} else {
|
||||
this_conn = g_conn;
|
||||
if(uip_ds6_get_global(ADDR_PREFERRED) == NULL) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PRINTF("Client to: ");
|
||||
PRINT6ADDR(&this_conn->ripaddr);
|
||||
|
||||
memcpy(buf, &seq_id, sizeof(seq_id));
|
||||
|
||||
PRINTF(" Remote Port %u,", UIP_HTONS(this_conn->rport));
|
||||
PRINTF(" (msg=0x%04x), %u bytes\n", *(uint16_t *) buf, sizeof(seq_id));
|
||||
|
||||
uip_udp_packet_send(this_conn, buf, sizeof(seq_id));
|
||||
leds_off(LEDS_RED);
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(udp_client_process, ev, data)
|
||||
{
|
||||
static struct etimer et;
|
||||
uip_ipaddr_t ipaddr;
|
||||
|
||||
PROCESS_BEGIN();
|
||||
PRINTF("UDP client process started\n");
|
||||
|
||||
uip_ip6addr(&ipaddr,0xfe80,0,0,0,0x0215,0x2000,0x0002,0x2145);
|
||||
/* new connection with remote host */
|
||||
l_conn = udp_new(&ipaddr, UIP_HTONS(3000), NULL);
|
||||
if(!l_conn) {
|
||||
PRINTF("udp_new l_conn error.\n");
|
||||
}
|
||||
udp_bind(l_conn, UIP_HTONS(LOCAL_CONN_PORT));
|
||||
|
||||
PRINTF("Link-Local connection with ");
|
||||
PRINT6ADDR(&l_conn->ripaddr);
|
||||
PRINTF(" local/remote port %u/%u\n",
|
||||
UIP_HTONS(l_conn->lport), UIP_HTONS(l_conn->rport));
|
||||
|
||||
uip_ip6addr(&ipaddr,0xaaaa,0,0,0,0x0215,0x2000,0x0002,0x2145);
|
||||
g_conn = udp_new(&ipaddr, UIP_HTONS(3000), NULL);
|
||||
if(!g_conn) {
|
||||
PRINTF("udp_new g_conn error.\n");
|
||||
}
|
||||
udp_bind(g_conn, UIP_HTONS(GLOBAL_CONN_PORT));
|
||||
|
||||
PRINTF("Global connection with ");
|
||||
PRINT6ADDR(&g_conn->ripaddr);
|
||||
PRINTF(" local/remote port %u/%u\n",
|
||||
UIP_HTONS(g_conn->lport), UIP_HTONS(g_conn->rport));
|
||||
|
||||
etimer_set(&et, SEND_INTERVAL);
|
||||
|
||||
while(1) {
|
||||
PROCESS_YIELD();
|
||||
if(etimer_expired(&et)) {
|
||||
timeout_handler();
|
||||
etimer_restart(&et);
|
||||
} else if(ev == tcpip_event) {
|
||||
tcpip_handler();
|
||||
}
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
139
examples/cc2530dk/udp-ipv6/ping6.c
Normal file
139
examples/cc2530dk/udp-ipv6/ping6.c
Normal file
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* 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 <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "dev/button-sensor.h"
|
||||
#include "debug.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 ", ((u8_t *)addr)[0], ((u8_t *)addr)[1], ((u8_t *)addr)[2], ((u8_t *)addr)[3], ((u8_t *)addr)[4], ((u8_t *)addr)[5], ((u8_t *)addr)[6], ((u8_t *)addr)[7], ((u8_t *)addr)[8], ((u8_t *)addr)[9], ((u8_t *)addr)[10], ((u8_t *)addr)[11], ((u8_t *)addr)[12], ((u8_t *)addr)[13], ((u8_t *)addr)[14], ((u8_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)
|
||||
#endif
|
||||
|
||||
#define PING6_NB 5
|
||||
#define PING6_DATALEN 16
|
||||
|
||||
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||
#define UIP_ICMP_BUF ((struct uip_icmp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
|
||||
|
||||
static struct etimer ping6_periodic_timer;
|
||||
static u8_t count = 0;
|
||||
static u16_t addr[8];
|
||||
static uip_ipaddr_t dest_addr;
|
||||
|
||||
PROCESS(ping6_process, "PING6 process");
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
ping6handler()
|
||||
{
|
||||
if(count < PING6_NB) {
|
||||
UIP_IP_BUF->vtc = 0x60;
|
||||
UIP_IP_BUF->tcflow = 1;
|
||||
UIP_IP_BUF->flow = 0;
|
||||
UIP_IP_BUF->proto = UIP_PROTO_ICMP6;
|
||||
UIP_IP_BUF->ttl = uip_ds6_if.cur_hop_limit;
|
||||
uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, &dest_addr);
|
||||
uip_ds6_select_src(&UIP_IP_BUF->srcipaddr, &UIP_IP_BUF->destipaddr);
|
||||
|
||||
UIP_ICMP_BUF->type = ICMP6_ECHO_REQUEST;
|
||||
UIP_ICMP_BUF->icode = 0;
|
||||
/* set identifier and sequence number to 0 */
|
||||
memset((uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN, 0, 4);
|
||||
/* put one byte of data */
|
||||
memset((uint8_t *)UIP_ICMP_BUF + UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN,
|
||||
count, PING6_DATALEN);
|
||||
|
||||
|
||||
uip_len = UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN + UIP_IPH_LEN + PING6_DATALEN;
|
||||
UIP_IP_BUF->len[0] = (u8_t)((uip_len - 40) >> 8);
|
||||
UIP_IP_BUF->len[1] = (u8_t)((uip_len - 40) & 0x00FF);
|
||||
|
||||
UIP_ICMP_BUF->icmpchksum = 0;
|
||||
UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum();
|
||||
|
||||
|
||||
PRINTF("Echo Request to");
|
||||
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
|
||||
PRINTF("from");
|
||||
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
|
||||
PRINTF("\n");
|
||||
UIP_STAT(++uip_stat.icmp.sent);
|
||||
|
||||
tcpip_ipv6_output();
|
||||
|
||||
count++;
|
||||
etimer_set(&ping6_periodic_timer, 3 * CLOCK_SECOND);
|
||||
} else {
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(ping6_process, ev, data)
|
||||
{
|
||||
|
||||
PROCESS_BEGIN();
|
||||
PRINTF("ping6 running.\n");
|
||||
PRINTF("Button 1: 5 pings 16 byte payload.\n");
|
||||
|
||||
uip_ip6addr(&dest_addr,0xaaaa,0,0,0,0x0215,0x2000,0x0002,0x2145);
|
||||
count = 0;
|
||||
|
||||
icmp6_new(NULL);
|
||||
|
||||
while(1) {
|
||||
PROCESS_YIELD();
|
||||
|
||||
#if BUTTON_SENSOR_ON
|
||||
if(ev == sensors_event && data == &button_sensor && count == 0) {
|
||||
ping6handler();
|
||||
}
|
||||
#endif
|
||||
if(ev == PROCESS_EVENT_TIMER && etimer_expired(&ping6_periodic_timer)) {
|
||||
ping6handler();
|
||||
}
|
||||
if(ev == tcpip_icmp6_event && *(uint8_t *)data == ICMP6_ECHO_REPLY) {
|
||||
PRINTF("Echo Reply\n");
|
||||
}
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
49
examples/cc2530dk/udp-ipv6/project-conf.h
Normal file
49
examples/cc2530dk/udp-ipv6/project-conf.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* Project specific configuration defines for the UDP client/server
|
||||
* example.
|
||||
*
|
||||
* \author
|
||||
* George Oikonomou - <oikonomou@users.sourceforge.net>
|
||||
*/
|
||||
|
||||
#ifndef PROJECT_CONF_H_
|
||||
#define PROJECT_CONF_H_
|
||||
|
||||
#define BUTTON_SENSOR_CONF_ON 1
|
||||
#define UIP_CONF_ICMP6 1
|
||||
|
||||
#endif /* PROJECT_CONF_H_ */
|
174
examples/cc2530dk/udp-ipv6/server.c
Normal file
174
examples/cc2530dk/udp-ipv6/server.c
Normal file
|
@ -0,0 +1,174 @@
|
|||
/*
|
||||
* 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 <string.h>
|
||||
|
||||
#define DEBUG DEBUG_PRINT
|
||||
#include "net/uip-debug.h"
|
||||
#include "dev/watchdog.h"
|
||||
#include "dev/leds.h"
|
||||
#include "net/rpl/rpl.h"
|
||||
#include "dev/button-sensor.h"
|
||||
#include "debug.h"
|
||||
|
||||
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||
#define UIP_UDP_BUF ((struct uip_udp_hdr *)&uip_buf[uip_l2_l3_hdr_len])
|
||||
|
||||
#define MAX_PAYLOAD_LEN 120
|
||||
|
||||
static struct uip_udp_conn *server_conn;
|
||||
static char buf[MAX_PAYLOAD_LEN];
|
||||
static uint16_t len;
|
||||
|
||||
#if UIP_CONF_ROUTER
|
||||
static uip_ipaddr_t ipaddr;
|
||||
#endif
|
||||
|
||||
#define SERVER_REPLY 1
|
||||
|
||||
/* Should we act as RPL root? */
|
||||
#define SERVER_RPL_ROOT 1
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS(udp_server_process, "UDP server process");
|
||||
AUTOSTART_PROCESSES(&udp_server_process);
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
tcpip_handler(void)
|
||||
{
|
||||
memset(buf, 0, MAX_PAYLOAD_LEN);
|
||||
if(uip_newdata()) {
|
||||
leds_on(LEDS_RED);
|
||||
len = uip_datalen();
|
||||
memcpy(buf, uip_appdata, len);
|
||||
PRINTF("%u bytes from [", len, *(uint16_t *)buf);
|
||||
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
|
||||
PRINTF("]:%u\n", UIP_HTONS(UIP_UDP_BUF->srcport));
|
||||
#if SERVER_REPLY
|
||||
uip_ipaddr_copy(&server_conn->ripaddr, &UIP_IP_BUF->srcipaddr);
|
||||
server_conn->rport = UIP_UDP_BUF->srcport;
|
||||
|
||||
uip_udp_packet_send(server_conn, buf, len);
|
||||
/* Restore server connection to allow data from any node */
|
||||
uip_create_unspecified(&server_conn->ripaddr);
|
||||
server_conn->rport = 0;
|
||||
#endif
|
||||
}
|
||||
leds_off(LEDS_RED);
|
||||
return;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#if (BUTTON_SENSOR_ON && (DEBUG==DEBUG_PRINT))
|
||||
static void
|
||||
print_stats()
|
||||
{
|
||||
PRINTF("tl=%lu, ts=%lu, bs=%lu, bc=%lu\n",
|
||||
rimestats.toolong, rimestats.tooshort, rimestats.badsynch, rimestats.badcrc);
|
||||
PRINTF("llrx=%lu, lltx=%lu, rx=%lu, tx=%lu\n",
|
||||
rimestats.llrx, rimestats.lltx, rimestats.rx, rimestats.tx);
|
||||
}
|
||||
#else
|
||||
#define print_stats()
|
||||
#endif
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void
|
||||
print_local_addresses(void)
|
||||
{
|
||||
int i;
|
||||
uint8_t state;
|
||||
|
||||
PRINTF("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)) {
|
||||
PRINTF(" ");
|
||||
PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr);
|
||||
PRINTF("\n");
|
||||
if (state == ADDR_TENTATIVE) {
|
||||
uip_ds6_if.addr_list[i].state = ADDR_PREFERRED;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
PROCESS_THREAD(udp_server_process, ev, data)
|
||||
{
|
||||
#if BUTTON_SENSOR_ON
|
||||
static struct sensors_sensor *b1;
|
||||
#endif
|
||||
#if SERVER_RPL_ROOT
|
||||
rpl_dag_t *dag;
|
||||
#endif
|
||||
PROCESS_BEGIN();
|
||||
putstring("Starting UDP server\n");
|
||||
|
||||
#if BUTTON_SENSOR_ON
|
||||
putstring("Button 1: Print RIME stats\n");
|
||||
#endif
|
||||
|
||||
#if SERVER_RPL_ROOT
|
||||
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);
|
||||
|
||||
print_local_addresses();
|
||||
|
||||
dag = rpl_set_root(RPL_DEFAULT_INSTANCE, &uip_ds6_get_global(ADDR_PREFERRED)->ipaddr);
|
||||
if(dag != NULL) {
|
||||
uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
|
||||
rpl_set_prefix(dag, &ipaddr, 64);
|
||||
PRINTF("Created a new RPL dag with ID: ");
|
||||
PRINT6ADDR(&dag->dag_id);
|
||||
PRINTF("\n");
|
||||
}
|
||||
#endif /* SERVER_RPL_ROOT */
|
||||
|
||||
server_conn = udp_new(NULL, UIP_HTONS(0), NULL);
|
||||
udp_bind(server_conn, UIP_HTONS(3000));
|
||||
|
||||
PRINTF("Listen port: 3000, TTL=%u\n", server_conn->ttl);
|
||||
|
||||
while(1) {
|
||||
PROCESS_YIELD();
|
||||
if(ev == tcpip_event) {
|
||||
tcpip_handler();
|
||||
#if BUTTON_SENSOR_ON
|
||||
} else if(ev == sensors_event && data == &button_sensor) {
|
||||
print_stats();
|
||||
#endif /* (CONTIKI_TARGET_SENSINODE && BUTTON_SENSOR_ON) */
|
||||
}
|
||||
}
|
||||
|
||||
PROCESS_END();
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
Loading…
Add table
Add a link
Reference in a new issue