initial upload
This commit is contained in:
parent
19cd33664d
commit
92b835080b
36 changed files with 5922 additions and 0 deletions
13
examples/osd/README
Normal file
13
examples/osd/README
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
OSDOMOTIS
|
||||||
|
|
||||||
|
www.osdomotics.com
|
||||||
|
|
||||||
|
Plattform: osd-er-lp24
|
||||||
|
|
||||||
|
make clean TARGET=osd-er-lp24
|
||||||
|
make TARGET=osd-er-lp24
|
||||||
|
avr-size -C --mcu=MCU=atmega128rfa1 border-router.osd-er-lp24
|
||||||
|
avr-objcopy -j .text -j .data -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.hex
|
||||||
|
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.eep
|
||||||
|
|
||||||
|
sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:border-router.osd-er-lp24.hex:a -U eeprom:w:border-router.osd-er-lp24.eep:a
|
88
examples/osd/er-rest-example-toggleboard-ds1820/Makefile
Normal file
88
examples/osd/er-rest-example-toggleboard-ds1820/Makefile
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
all: er-example-server er-example-client
|
||||||
|
# Use this target explicitly if requried: er-plugtest-server
|
||||||
|
|
||||||
|
CONTIKI=../../..
|
||||||
|
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
|
||||||
|
|
||||||
|
# for static routing, if enabled
|
||||||
|
ifneq ($(TARGET), minimal-net)
|
||||||
|
ifneq ($(TARGET), native)
|
||||||
|
ifneq ($(findstring avr,$(TARGET)), avr)
|
||||||
|
PROJECT_SOURCEFILES += static-routing.c
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# variable for root Makefile.include
|
||||||
|
WITH_UIP6=1
|
||||||
|
# for some platforms
|
||||||
|
UIP_CONF_IPV6=1
|
||||||
|
|
||||||
|
# variable for this Makefile
|
||||||
|
# configure CoAP implementation (3|7) (er-coap-07 also supports CoAP draft 08)
|
||||||
|
WITH_COAP=7
|
||||||
|
|
||||||
|
# new variable since slip-radio
|
||||||
|
ifneq ($(TARGET), minimal-net)
|
||||||
|
UIP_CONF_RPL=1
|
||||||
|
else
|
||||||
|
# minimal-net does not support RPL under Linux and is mostly used to test CoAP only
|
||||||
|
${info INFO: compiling without RPL}
|
||||||
|
UIP_CONF_RPL=0
|
||||||
|
CFLAGS += -DUIP_CONF_ND6_DEF_MAXDADNS=0
|
||||||
|
CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\"
|
||||||
|
CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280
|
||||||
|
endif
|
||||||
|
|
||||||
|
# linker optimizations
|
||||||
|
SMALL=1
|
||||||
|
|
||||||
|
# REST framework, requires WITH_COAP
|
||||||
|
ifeq ($(WITH_COAP), 7)
|
||||||
|
${info INFO: compiling with CoAP-08}
|
||||||
|
CFLAGS += -DWITH_COAP=7
|
||||||
|
CFLAGS += -DREST=coap_rest_implementation
|
||||||
|
CFLAGS += -DUIP_CONF_TCP=0
|
||||||
|
APPS += er-coap-07
|
||||||
|
else ifeq ($(WITH_COAP), 3)
|
||||||
|
${info INFO: compiling with CoAP-03}
|
||||||
|
CFLAGS += -DWITH_COAP=3
|
||||||
|
CFLAGS += -DREST=coap_rest_implementation
|
||||||
|
CFLAGS += -DUIP_CONF_TCP=0
|
||||||
|
APPS += er-coap-03
|
||||||
|
else
|
||||||
|
${info INFO: compiling with HTTP}
|
||||||
|
CFLAGS += -DWITH_HTTP
|
||||||
|
CFLAGS += -DREST=http_rest_implementation
|
||||||
|
CFLAGS += -DUIP_CONF_TCP=1
|
||||||
|
APPS += er-http-engine
|
||||||
|
endif
|
||||||
|
|
||||||
|
APPS += erbium
|
||||||
|
|
||||||
|
# optional rules to get assembly
|
||||||
|
#CUSTOM_RULE_C_TO_OBJECTDIR_O = 1
|
||||||
|
#CUSTOM_RULE_S_TO_OBJECTDIR_O = 1
|
||||||
|
|
||||||
|
include $(CONTIKI)/Makefile.include
|
||||||
|
|
||||||
|
# optional rules to get assembly
|
||||||
|
#$(OBJECTDIR)/%.o: asmdir/%.S
|
||||||
|
# $(CC) $(CFLAGS) -MMD -c $< -o $@
|
||||||
|
# @$(FINALIZE_DEPENDENCY)
|
||||||
|
#
|
||||||
|
#asmdir/%.S: %.c
|
||||||
|
# $(CC) $(CFLAGS) -MMD -S $< -o $@
|
||||||
|
|
||||||
|
# border router rules
|
||||||
|
$(CONTIKI)/tools/tunslip6: $(CONTIKI)/tools/tunslip6.c
|
||||||
|
(cd $(CONTIKI)/tools && $(MAKE) tunslip6)
|
||||||
|
|
||||||
|
connect-router: $(CONTIKI)/tools/tunslip6
|
||||||
|
sudo $(CONTIKI)/tools/tunslip6 aaaa::1/64
|
||||||
|
|
||||||
|
connect-router-cooja: $(CONTIKI)/tools/tunslip6
|
||||||
|
sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64
|
||||||
|
|
||||||
|
tap0up:
|
||||||
|
sudo ip address add fdfd::1/64 dev tap0
|
88
examples/osd/er-rest-example-toggleboard-ds1820/README
Normal file
88
examples/osd/er-rest-example-toggleboard-ds1820/README
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
A Quick Introduction to the Erbium (Er) REST Engine
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-er-lp24.hex:a -U eeprom:w:er-example-server.osd-er-lp24.eep:a
|
||||||
|
|
||||||
|
EXAMPLE FILES
|
||||||
|
-------------
|
||||||
|
er-example-server.c: A RESTful server example showing how to use the REST layer to develop server-side applications (at the moment only CoAP is implemented for the REST Engine).
|
||||||
|
er-example-client.c: A CoAP client that polls the /actuators/toggle resource every 10 seconds and cycles through 4 resources on button press (target address is hard-coded).
|
||||||
|
er-plugtest-server.c: The server used for draft compliance testing at ETSI IoT CoAP Plugtest in Paris, France, March 2012 (configured for minimal-net).
|
||||||
|
|
||||||
|
PRELIMINARIES
|
||||||
|
-------------
|
||||||
|
- Make sure rpl-border-router has the same stack and fits into mote memory:
|
||||||
|
You can disable RDC in border-router project-conf.h (not really required as BR keeps radio turned on).
|
||||||
|
#undef NETSTACK_CONF_RDC
|
||||||
|
#define NETSTACK_CONF_RDC nullrdc_driver
|
||||||
|
- For convenience, define the Cooja addresses in /etc/hosts
|
||||||
|
aaaa::0212:7401:0001:0101 cooja1
|
||||||
|
aaaa::0212:7402:0002:0202 cooja2
|
||||||
|
...
|
||||||
|
- Get the Copper (Cu) CoAP user-agent from https://addons.mozilla.org/en-US/firefox/addon/copper-270430/
|
||||||
|
- Optional: Save your target as default target
|
||||||
|
$ make TARGET=sky savetarget
|
||||||
|
|
||||||
|
COOJA HOWTO
|
||||||
|
-----------
|
||||||
|
Server only:
|
||||||
|
1) $ make TARGET=cooja server-only.csc
|
||||||
|
2) Open new terminal
|
||||||
|
3) $ make connect-router-cooja
|
||||||
|
4) Start Copper and discover resources at coap://cooja2:5683/
|
||||||
|
- Choose "Click button on Sky 2" from the context menu of mote 2 (server) after requesting /test/separate
|
||||||
|
- Do the same when observing /test/event
|
||||||
|
|
||||||
|
With client:
|
||||||
|
1) $ make TARGET=cooja server-client.csc
|
||||||
|
2) Open new terminal
|
||||||
|
3) $ make connect-router-cooja
|
||||||
|
4) Wait until red LED toggles on mote 2 (server)
|
||||||
|
5) Choose "Click button on Sky 3" from the context menu of mote 3 (client) and watch serial output
|
||||||
|
|
||||||
|
TMOTES HOWTO
|
||||||
|
------------
|
||||||
|
Server:
|
||||||
|
1) Connect two Tmote Skys (check with $ make TARGET=sky sky-motelist)
|
||||||
|
2) $ make TARGET=sky er-example-server.upload MOTE=2
|
||||||
|
3) $ make TARGET=sky login MOTE=2
|
||||||
|
4) Press reset button, get address, abort with Ctrl+C:
|
||||||
|
Line: "Tentative link-local IPv6 address fe80:0000:0000:0000:____:____:____:____"
|
||||||
|
5) $ cd ../ipv6/rpl-border-router/
|
||||||
|
6) $ make TARGET=sky border-router.upload MOTE=1
|
||||||
|
7) $ make connect-router
|
||||||
|
For a BR tty other than USB0: $ make connect-router-port PORT=X
|
||||||
|
8) Start Copper and discover resources at coap://[aaaa::____:____:____:____]:5683/
|
||||||
|
|
||||||
|
Add a client:
|
||||||
|
1) Change the hard-coded server address in er-example-client.c to aaaa::____:____:____:____
|
||||||
|
2) Connect a third Tmote Sky
|
||||||
|
3) $ make TARGET=sky er-example-client.upload MOTE=3
|
||||||
|
|
||||||
|
DETAILS
|
||||||
|
-------
|
||||||
|
Erbium currently implements draft 08 (name "er-coap-07" stems from last technical draft changes).
|
||||||
|
Central features are commented in er-example-server.c.
|
||||||
|
In general, apps/er-coap-07 supports:
|
||||||
|
* All draft 08 header options
|
||||||
|
* CON Retransmissions (note COAP_MAX_OPEN_TRANSACTIONS)
|
||||||
|
* Blockwise Transfers (note REST_MAX_CHUNK_SIZE, see er-plugtest-server.c for Block1 uploads)
|
||||||
|
* Separate Responses (no rest_set_pre_handler() required anymore, note coap_separate_accept(), _reject(), and _resume())
|
||||||
|
* Resource Discovery
|
||||||
|
* Observing Resources (see EVENT_ and PRERIODIC_RESOURCE, note COAP_MAX_OBSERVERS)
|
||||||
|
|
||||||
|
REST IMPLEMENTATIONS
|
||||||
|
--------------------
|
||||||
|
The Makefile uses WITH_COAP to configure different implementations for the Erbium (Er) REST Engine.
|
||||||
|
* WITH_COAP=7 uses Erbium CoAP 08 apps/er-coap-07/.
|
||||||
|
The default port for coap-07/-08 is 5683.
|
||||||
|
* WITH_COAP=3 uses Erbium CoAP 03 apps/er-coap-03/.
|
||||||
|
The default port for coap-03 is 61616.
|
||||||
|
er-coap-03 produces some warnings, as it not fully maintained anymore.
|
||||||
|
* WITH_COAP=0 is a stub to link an Erbium HTTP engine that uses the same resource abstraction (REST.x() functions and RESOURCE macros.
|
||||||
|
|
||||||
|
TODOs
|
||||||
|
-----
|
||||||
|
* Observe client
|
||||||
|
* Multiple If-Match ETags
|
||||||
|
* (Message deduplication)
|
|
@ -0,0 +1,173 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2011, Matthias Kovatsch and other contributors.
|
||||||
|
* 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
|
||||||
|
* Erbium (Er) CoAP client example
|
||||||
|
* \author
|
||||||
|
* Matthias Kovatsch <kovatsch@inf.ethz.ch>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
|
||||||
|
#if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET) && !defined (CONTIKI_TARGET_NATIVE)
|
||||||
|
#warning "Compiling with static routing!"
|
||||||
|
#include "static-routing.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "dev/button-sensor.h"
|
||||||
|
|
||||||
|
#if WITH_COAP == 3
|
||||||
|
#include "er-coap-03-engine.h"
|
||||||
|
#elif WITH_COAP == 6
|
||||||
|
#include "er-coap-06-engine.h"
|
||||||
|
#elif WITH_COAP == 7
|
||||||
|
#include "er-coap-07-engine.h"
|
||||||
|
#else
|
||||||
|
#error "CoAP version defined by WITH_COAP not implemented"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define DEBUG 0
|
||||||
|
#if DEBUG
|
||||||
|
#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
|
||||||
|
|
||||||
|
/* TODO: This server address is hard-coded for Cooja. */
|
||||||
|
#define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xaaaa, 0, 0, 0, 0x0212, 0x7402, 0x0002, 0x0202) /* cooja2 */
|
||||||
|
|
||||||
|
#define LOCAL_PORT UIP_HTONS(COAP_DEFAULT_PORT+1)
|
||||||
|
#define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT)
|
||||||
|
|
||||||
|
#define TOGGLE_INTERVAL 10
|
||||||
|
|
||||||
|
PROCESS(coap_client_example, "COAP Client Example");
|
||||||
|
AUTOSTART_PROCESSES(&coap_client_example);
|
||||||
|
|
||||||
|
|
||||||
|
uip_ipaddr_t server_ipaddr;
|
||||||
|
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", "/actuators/toggle", "battery/", "error/in//path"};
|
||||||
|
#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)
|
||||||
|
{
|
||||||
|
uint8_t *chunk;
|
||||||
|
|
||||||
|
int len = coap_get_payload(response, &chunk);
|
||||||
|
printf("|%.*s", len, (char *)chunk);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PROCESS_THREAD(coap_client_example, ev, data)
|
||||||
|
{
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
static coap_packet_t request[1]; /* This way the packet can be treated as pointer as usual. */
|
||||||
|
SERVER_NODE(&server_ipaddr);
|
||||||
|
|
||||||
|
/* receives all CoAP messages */
|
||||||
|
coap_receiver_init();
|
||||||
|
|
||||||
|
etimer_set(&et, TOGGLE_INTERVAL * CLOCK_SECOND);
|
||||||
|
|
||||||
|
#if PLATFORM_HAS_BUTTON
|
||||||
|
SENSORS_ACTIVATE(button_sensor);
|
||||||
|
printf("Press a button to request %s\n", service_urls[uri_switch]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
PROCESS_YIELD();
|
||||||
|
|
||||||
|
if (etimer_expired(&et)) {
|
||||||
|
printf("--Toggle timer--\n");
|
||||||
|
|
||||||
|
/* prepare request, TID is set by COAP_BLOCKING_REQUEST() */
|
||||||
|
coap_init_message(request, COAP_TYPE_CON, COAP_POST, 0 );
|
||||||
|
coap_set_header_uri_path(request, service_urls[1]);
|
||||||
|
|
||||||
|
const char msg[] = "Toggle!";
|
||||||
|
coap_set_payload(request, (uint8_t *)msg, sizeof(msg)-1);
|
||||||
|
|
||||||
|
|
||||||
|
PRINT6ADDR(&server_ipaddr);
|
||||||
|
PRINTF(" : %u\n", UIP_HTONS(REMOTE_PORT));
|
||||||
|
|
||||||
|
COAP_BLOCKING_REQUEST(&server_ipaddr, REMOTE_PORT, request, client_chunk_handler);
|
||||||
|
|
||||||
|
printf("\n--Done--\n");
|
||||||
|
|
||||||
|
etimer_reset(&et);
|
||||||
|
|
||||||
|
#if PLATFORM_HAS_BUTTON
|
||||||
|
} else if (ev == sensors_event && data == &button_sensor) {
|
||||||
|
|
||||||
|
/* send a request to notify the end of the process */
|
||||||
|
|
||||||
|
coap_init_message(request, COAP_TYPE_CON, COAP_GET, 0);
|
||||||
|
coap_set_header_uri_path(request, service_urls[uri_switch]);
|
||||||
|
|
||||||
|
printf("--Requesting %s--\n", service_urls[uri_switch]);
|
||||||
|
|
||||||
|
PRINT6ADDR(&server_ipaddr);
|
||||||
|
PRINTF(" : %u\n", UIP_HTONS(REMOTE_PORT));
|
||||||
|
|
||||||
|
COAP_BLOCKING_REQUEST(&server_ipaddr, REMOTE_PORT, request, client_chunk_handler);
|
||||||
|
|
||||||
|
printf("\n--Done--\n");
|
||||||
|
|
||||||
|
uri_switch = (uri_switch+1) % NUMBER_OF_URLS;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
1129
examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c
Normal file
1129
examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,561 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2011, Matthias Kovatsch and other contributors.
|
||||||
|
* 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
|
||||||
|
* Server for the ETSI IoT CoAP Plugtests, Paris, France, 24 - 25 March 2012
|
||||||
|
* \author
|
||||||
|
* Matthias Kovatsch <kovatsch@inf.ethz.ch>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "contiki-net.h"
|
||||||
|
|
||||||
|
#define MAX_PLUGFEST_PAYLOAD 64+1 /* +1 for the terminating zero, which is not transmitted */
|
||||||
|
|
||||||
|
/* Define which resources to include to meet memory constraints. */
|
||||||
|
#define REST_RES_TEST 1
|
||||||
|
#define REST_RES_LONG 1
|
||||||
|
#define REST_RES_QUERY 1
|
||||||
|
#define REST_RES_SEPARATE 1
|
||||||
|
#define REST_RES_LARGE 1
|
||||||
|
#define REST_RES_LARGE_UPDATE 1
|
||||||
|
#define REST_RES_LARGE_CREATE 1
|
||||||
|
#define REST_RES_OBS 1
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined (CONTIKI_TARGET_MINIMAL_NET)
|
||||||
|
#warning "Should only be compiled for minimal-net!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET) && !defined (CONTIKI_TARGET_NATIVE)
|
||||||
|
#warning "Compiling with static routing!"
|
||||||
|
#include "static-routing.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "erbium.h"
|
||||||
|
|
||||||
|
/* For CoAP-specific example: not required for normal RESTful Web service. */
|
||||||
|
#if WITH_COAP==7
|
||||||
|
#include "er-coap-07.h"
|
||||||
|
#else
|
||||||
|
#error "Plugtests server without CoAP"
|
||||||
|
#endif /* CoAP-specific example */
|
||||||
|
|
||||||
|
#define DEBUG 1
|
||||||
|
#if DEBUG
|
||||||
|
#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
|
||||||
|
|
||||||
|
|
||||||
|
#if REST_RES_TEST
|
||||||
|
/*
|
||||||
|
* Default test resource
|
||||||
|
*/
|
||||||
|
RESOURCE(test, METHOD_GET|METHOD_POST|METHOD_PUT|METHOD_DELETE, "test", "title=\"Default test resource\"");
|
||||||
|
|
||||||
|
void
|
||||||
|
test_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;
|
||||||
|
|
||||||
|
uint8_t method = REST.get_method_type(request);
|
||||||
|
|
||||||
|
PRINTF("/test ");
|
||||||
|
if (method & METHOD_GET)
|
||||||
|
{
|
||||||
|
PRINTF("GET ");
|
||||||
|
/* Code 2.05 CONTENT is default. */
|
||||||
|
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
|
||||||
|
REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "Type: %u\nCode: %u\nMID: %u", coap_req->type, coap_req->code, coap_req->mid));
|
||||||
|
}
|
||||||
|
else if (method & METHOD_POST)
|
||||||
|
{
|
||||||
|
PRINTF("POST ");
|
||||||
|
REST.set_response_status(response, REST.status.CREATED);
|
||||||
|
REST.set_header_location(response, "/nirvana");
|
||||||
|
}
|
||||||
|
else if (method & METHOD_PUT)
|
||||||
|
{
|
||||||
|
PRINTF("PUT ");
|
||||||
|
REST.set_response_status(response, REST.status.CHANGED);
|
||||||
|
}
|
||||||
|
else if (method & METHOD_DELETE)
|
||||||
|
{
|
||||||
|
PRINTF("DELETE ");
|
||||||
|
REST.set_response_status(response, REST.status.DELETED);
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINTF("(%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REST_RES_LONG
|
||||||
|
/*
|
||||||
|
* Long path resource
|
||||||
|
*/
|
||||||
|
RESOURCE(longpath, METHOD_GET, "seg1/seg2/seg3", "title=\"Long path resource\"");
|
||||||
|
|
||||||
|
void
|
||||||
|
longpath_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;
|
||||||
|
|
||||||
|
uint8_t method = REST.get_method_type(request);
|
||||||
|
|
||||||
|
PRINTF("/seg1/seg2/seg3 ");
|
||||||
|
if (method & METHOD_GET)
|
||||||
|
{
|
||||||
|
PRINTF("GET ");
|
||||||
|
/* Code 2.05 CONTENT is default. */
|
||||||
|
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
|
||||||
|
REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "Type: %u\nCode: %u\nMID: %u", coap_req->type, coap_req->code, coap_req->mid));
|
||||||
|
}
|
||||||
|
PRINTF("(%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REST_RES_QUERY
|
||||||
|
/*
|
||||||
|
* Resource accepting query parameters
|
||||||
|
*/
|
||||||
|
RESOURCE(query, METHOD_GET, "query", "title=\"Resource accepting query parameters\"");
|
||||||
|
|
||||||
|
void
|
||||||
|
query_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 len = 0;
|
||||||
|
const char *query = NULL;
|
||||||
|
|
||||||
|
PRINTF("/query GET (%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid);
|
||||||
|
|
||||||
|
if ((len = REST.get_query(request, &query)))
|
||||||
|
{
|
||||||
|
PRINTF("Query: %.*s\n", len, query);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code 2.05 CONTENT is default. */
|
||||||
|
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
|
||||||
|
REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "Type: %u\nCode: %u\nMID: %u\nQuery: %.*s", coap_req->type, coap_req->code, coap_req->mid, len, query));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REST_RES_SEPARATE
|
||||||
|
/* Required to manually (=not by the engine) handle the response transaction. */
|
||||||
|
#include "er-coap-07-separate.h"
|
||||||
|
#include "er-coap-07-transactions.h"
|
||||||
|
/*
|
||||||
|
* Resource which cannot be served immediately and which cannot be acknowledged in a piggy-backed way
|
||||||
|
*/
|
||||||
|
PERIODIC_RESOURCE(separate, METHOD_GET, "separate", "title=\"Resource which cannot be served immediately and which cannot be acknowledged in a piggy-backed way\"", 3*CLOCK_SECOND);
|
||||||
|
|
||||||
|
/* A structure to store the required information */
|
||||||
|
typedef struct application_separate_store {
|
||||||
|
/* Provided by Erbium to store generic request information such as remote address and token. */
|
||||||
|
coap_separate_t request_metadata;
|
||||||
|
/* Add fields for addition information to be stored for finalizing, e.g.: */
|
||||||
|
char buffer[MAX_PLUGFEST_PAYLOAD];
|
||||||
|
} application_separate_store_t;
|
||||||
|
|
||||||
|
static uint8_t separate_active = 0;
|
||||||
|
static application_separate_store_t separate_store[1];
|
||||||
|
|
||||||
|
void
|
||||||
|
separate_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;
|
||||||
|
|
||||||
|
PRINTF("/separate ");
|
||||||
|
if (separate_active)
|
||||||
|
{
|
||||||
|
PRINTF("REJECTED ");
|
||||||
|
coap_separate_reject();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PRINTF("STORED ");
|
||||||
|
separate_active = 1;
|
||||||
|
|
||||||
|
/* Take over and skip response by engine. */
|
||||||
|
coap_separate_accept(request, &separate_store->request_metadata);
|
||||||
|
/* Be aware to respect the Block2 option, which is also stored in the coap_separate_t. */
|
||||||
|
|
||||||
|
snprintf(separate_store->buffer, MAX_PLUGFEST_PAYLOAD, "Type: %u\nCode: %u\nMID: %u", coap_req->type, coap_req->code, coap_req->mid);
|
||||||
|
}
|
||||||
|
|
||||||
|
PRINTF("(%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
separate_periodic_handler(resource_t *resource)
|
||||||
|
{
|
||||||
|
if (separate_active)
|
||||||
|
{
|
||||||
|
PRINTF("/separate ");
|
||||||
|
coap_transaction_t *transaction = NULL;
|
||||||
|
if ( (transaction = coap_new_transaction(separate_store->request_metadata.mid, &separate_store->request_metadata.addr, separate_store->request_metadata.port)) )
|
||||||
|
{
|
||||||
|
PRINTF("RESPONSE (%s %u)\n", separate_store->request_metadata.type==COAP_TYPE_CON?"CON":"NON", separate_store->request_metadata.mid);
|
||||||
|
|
||||||
|
coap_packet_t response[1]; /* This way the packet can be treated as pointer as usual. */
|
||||||
|
|
||||||
|
/* Restore the request information for the response. */
|
||||||
|
coap_separate_resume(response, &separate_store->request_metadata, CONTENT_2_05);
|
||||||
|
|
||||||
|
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
|
||||||
|
coap_set_payload(response, separate_store->buffer, strlen(separate_store->buffer));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Be aware to respect the Block2 option, which is also stored in the coap_separate_t.
|
||||||
|
* As it is a critical option, this example resource pretends to handle it for compliance.
|
||||||
|
*/
|
||||||
|
coap_set_header_block2(response, separate_store->request_metadata.block2_num, 0, separate_store->request_metadata.block2_size);
|
||||||
|
|
||||||
|
/* Warning: No check for serialization error. */
|
||||||
|
transaction->packet_len = coap_serialize_message(response, transaction->packet);
|
||||||
|
coap_send_transaction(transaction);
|
||||||
|
/* The engine will clear the transaction (right after send for NON, after acked for CON). */
|
||||||
|
|
||||||
|
separate_active = 0;
|
||||||
|
} else {
|
||||||
|
PRINTF("ERROR (transaction)\n");
|
||||||
|
}
|
||||||
|
} /* if (separate_active) */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REST_RES_LARGE
|
||||||
|
/*
|
||||||
|
* Large resource
|
||||||
|
*/
|
||||||
|
RESOURCE(large, METHOD_GET, "large", "title=\"Large resource\";rt=\"block\"");
|
||||||
|
|
||||||
|
#define CHUNKS_TOTAL 1280
|
||||||
|
|
||||||
|
void
|
||||||
|
large_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
|
||||||
|
{
|
||||||
|
int32_t strpos = 0;
|
||||||
|
|
||||||
|
/* Check the offset for boundaries of the resource data. */
|
||||||
|
if (*offset>=CHUNKS_TOTAL)
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.BAD_OPTION);
|
||||||
|
/* A block error message should not exceed the minimum block size (16). */
|
||||||
|
|
||||||
|
const char *error_msg = "BlockOutOfScope";
|
||||||
|
REST.set_response_payload(response, error_msg, strlen(error_msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate data until reaching CHUNKS_TOTAL. */
|
||||||
|
while (strpos<preferred_size)
|
||||||
|
{
|
||||||
|
strpos += snprintf((char *)buffer+strpos, preferred_size-strpos+1, "|%ld|", *offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* snprintf() does not adjust return value if truncated by size. */
|
||||||
|
if (strpos > preferred_size)
|
||||||
|
{
|
||||||
|
strpos = preferred_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Truncate if above CHUNKS_TOTAL bytes. */
|
||||||
|
if (*offset+(int32_t)strpos > CHUNKS_TOTAL)
|
||||||
|
{
|
||||||
|
strpos = CHUNKS_TOTAL - *offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
REST.set_response_payload(response, buffer, strpos);
|
||||||
|
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
|
||||||
|
|
||||||
|
/* IMPORTANT for chunk-wise resources: Signal chunk awareness to REST engine. */
|
||||||
|
*offset += strpos;
|
||||||
|
|
||||||
|
/* Signal end of resource representation. */
|
||||||
|
if (*offset>=CHUNKS_TOTAL)
|
||||||
|
{
|
||||||
|
*offset = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REST_RES_LARGE_UPDATE
|
||||||
|
/*
|
||||||
|
* Large resource that can be updated using PUT method
|
||||||
|
*/
|
||||||
|
RESOURCE(large_update, METHOD_GET|METHOD_PUT, "large-update", "title=\"Large resource that can be updated using PUT method\";rt=\"block\"");
|
||||||
|
|
||||||
|
static int32_t large_update_size = 1280;
|
||||||
|
static uint8_t large_update_store[2048] = {0};
|
||||||
|
static unsigned int large_update_ct = -1;
|
||||||
|
|
||||||
|
void
|
||||||
|
large_update_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;
|
||||||
|
uint8_t method = REST.get_method_type(request);
|
||||||
|
|
||||||
|
if (method & METHOD_GET)
|
||||||
|
{
|
||||||
|
/* Check the offset for boundaries of the resource data. */
|
||||||
|
if (*offset>=large_update_size)
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.BAD_OPTION);
|
||||||
|
/* A block error message should not exceed the minimum block size (16). */
|
||||||
|
|
||||||
|
const char *error_msg = "BlockOutOfScope";
|
||||||
|
REST.set_response_payload(response, error_msg, strlen(error_msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
REST.set_response_payload(response, large_update_store+*offset, preferred_size);
|
||||||
|
REST.set_header_content_type(response, large_update_ct);
|
||||||
|
|
||||||
|
/* IMPORTANT for chunk-wise resources: Signal chunk awareness to REST engine. */
|
||||||
|
*offset += preferred_size;
|
||||||
|
|
||||||
|
/* Signal end of resource representation. */
|
||||||
|
if (*offset>=large_update_size)
|
||||||
|
{
|
||||||
|
*offset = -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
uint8_t *incoming = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
unsigned int ct = REST.get_header_content_type(request);
|
||||||
|
if (ct==-1)
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.BAD_REQUEST);
|
||||||
|
const char *error_msg = "NoContentType";
|
||||||
|
REST.set_response_payload(response, error_msg, strlen(error_msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((len = REST.get_request_payload(request, &incoming)))
|
||||||
|
{
|
||||||
|
if (coap_req->block1_num*coap_req->block1_size+len <= sizeof(large_update_store))
|
||||||
|
{
|
||||||
|
memcpy(large_update_store+coap_req->block1_num*coap_req->block1_size, incoming, len);
|
||||||
|
large_update_size = coap_req->block1_num*coap_req->block1_size+len;
|
||||||
|
large_update_ct = REST.get_header_content_type(request);
|
||||||
|
|
||||||
|
REST.set_response_status(response, REST.status.CHANGED);
|
||||||
|
coap_set_header_block1(response, coap_req->block1_num, 0, coap_req->block1_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.REQUEST_ENTITY_TOO_LARGE);
|
||||||
|
REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "%uB max.", sizeof(large_update_store)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.BAD_REQUEST);
|
||||||
|
const char *error_msg = "NoPayload";
|
||||||
|
REST.set_response_payload(response, error_msg, strlen(error_msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REST_RES_LARGE_CREATE
|
||||||
|
/*
|
||||||
|
* Large resource that can be created using POST method
|
||||||
|
*/
|
||||||
|
RESOURCE(large_create, METHOD_POST, "large-create", "title=\"Large resource that can be created using POST method\";rt=\"block\"");
|
||||||
|
|
||||||
|
void
|
||||||
|
large_create_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;
|
||||||
|
|
||||||
|
uint8_t *incoming = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
unsigned int ct = REST.get_header_content_type(request);
|
||||||
|
if (ct==-1)
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.BAD_REQUEST);
|
||||||
|
const char *error_msg = "NoContentType";
|
||||||
|
REST.set_response_payload(response, error_msg, strlen(error_msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((len = REST.get_request_payload(request, &incoming)))
|
||||||
|
{
|
||||||
|
if (coap_req->block1_num*coap_req->block1_size+len <= 2048)
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.CREATED);
|
||||||
|
REST.set_header_location(response, "/nirvana");
|
||||||
|
coap_set_header_block1(response, coap_req->block1_num, 0, coap_req->block1_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.REQUEST_ENTITY_TOO_LARGE);
|
||||||
|
const char *error_msg = "2048B max.";
|
||||||
|
REST.set_response_payload(response, error_msg, strlen(error_msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
REST.set_response_status(response, REST.status.BAD_REQUEST);
|
||||||
|
const char *error_msg = "NoPayload";
|
||||||
|
REST.set_response_payload(response, error_msg, strlen(error_msg));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if REST_RES_OBS
|
||||||
|
/*
|
||||||
|
* Observable resource which changes every 5 seconds
|
||||||
|
*/
|
||||||
|
PERIODIC_RESOURCE(obs, METHOD_GET, "obs", "title=\"Observable resource which changes every 5 seconds\";obs;rt=\"observe\"", 5*CLOCK_SECOND);
|
||||||
|
|
||||||
|
static uint16_t obs_counter = 0;
|
||||||
|
static char obs_content[16];
|
||||||
|
|
||||||
|
void
|
||||||
|
obs_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
|
||||||
|
{
|
||||||
|
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
|
||||||
|
REST.set_header_max_age(response, 5);
|
||||||
|
|
||||||
|
REST.set_response_payload(response, obs_content, snprintf(obs_content, MAX_PLUGFEST_PAYLOAD, "TICK %lu", obs_counter));
|
||||||
|
|
||||||
|
/* A post_handler that handles subscriptions will be called for periodic resources by the REST framework. */
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Additionally, a handler function named [resource name]_handler must be implemented for each PERIODIC_RESOURCE.
|
||||||
|
* It will be called by the REST manager process with the defined period.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
obs_periodic_handler(resource_t *r)
|
||||||
|
{
|
||||||
|
++obs_counter;
|
||||||
|
|
||||||
|
PRINTF("TICK %u for /%s\n", obs_counter, r->url);
|
||||||
|
|
||||||
|
/* Build notification. */
|
||||||
|
/*TODO: REST.new_response() */
|
||||||
|
coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
|
||||||
|
coap_init_message(notification, COAP_TYPE_NON, CONTENT_2_05, 0 );
|
||||||
|
|
||||||
|
/* Better use a generator function for both handlers that only takes *resonse. */
|
||||||
|
obs_handler(NULL, notification, NULL, 0, NULL);
|
||||||
|
|
||||||
|
/* Notify the registered observers with the given message type, observe option, and payload. */
|
||||||
|
REST.notify_subscribers(r, obs_counter, notification);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
PROCESS(plugtest_server, "PlugtestServer");
|
||||||
|
AUTOSTART_PROCESSES(&plugtest_server);
|
||||||
|
|
||||||
|
PROCESS_THREAD(plugtest_server, ev, data)
|
||||||
|
{
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
PRINTF("ETSI IoT CoAP Plugtests Server\n");
|
||||||
|
|
||||||
|
#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);
|
||||||
|
|
||||||
|
/* if static routes are used rather than RPL */
|
||||||
|
#if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET)
|
||||||
|
set_global_address();
|
||||||
|
configure_routing();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Initialize the REST engine. */
|
||||||
|
rest_init_engine();
|
||||||
|
|
||||||
|
/* Activate the application-specific resources. */
|
||||||
|
#if REST_RES_TEST
|
||||||
|
rest_activate_resource(&resource_test);
|
||||||
|
#endif
|
||||||
|
#if REST_RES_LONG
|
||||||
|
rest_activate_resource(&resource_longpath);
|
||||||
|
#endif
|
||||||
|
#if REST_RES_QUERY
|
||||||
|
rest_activate_resource(&resource_query);
|
||||||
|
#endif
|
||||||
|
#if REST_RES_SEPARATE
|
||||||
|
rest_activate_periodic_resource(&periodic_resource_separate);
|
||||||
|
#endif
|
||||||
|
#if REST_RES_LARGE
|
||||||
|
rest_activate_resource(&resource_large);
|
||||||
|
#endif
|
||||||
|
#if REST_RES_LARGE_UPDATE
|
||||||
|
large_update_ct = REST.type.APPLICATION_OCTET_STREAM;
|
||||||
|
rest_activate_resource(&resource_large_update);
|
||||||
|
#endif
|
||||||
|
#if REST_RES_LARGE_CREATE
|
||||||
|
rest_activate_resource(&resource_large_create);
|
||||||
|
#endif
|
||||||
|
#if REST_RES_OBS
|
||||||
|
rest_activate_periodic_resource(&periodic_resource_obs);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define application-specific events here. */
|
||||||
|
while(1) {
|
||||||
|
PROCESS_WAIT_EVENT();
|
||||||
|
|
||||||
|
} /* while (1) */
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* 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_RPL_WEB_CONF_H__
|
||||||
|
#define __PROJECT_RPL_WEB_CONF_H__
|
||||||
|
|
||||||
|
#define SICSLOWPAN_CONF_FRAG 1
|
||||||
|
|
||||||
|
/* Disabling RDC for demo purposes. Core updates often require more memory. */
|
||||||
|
/* For projects, optimize memory and enable RDC again. */
|
||||||
|
//#undef NETSTACK_CONF_RDC
|
||||||
|
//#define NETSTACK_CONF_RDC nullrdc_driver
|
||||||
|
|
||||||
|
/* Save some memory for the sky platform. */
|
||||||
|
#undef UIP_CONF_DS6_NBR_NBU
|
||||||
|
#define UIP_CONF_DS6_NBR_NBU 10
|
||||||
|
#undef UIP_CONF_DS6_ROUTE_NBU
|
||||||
|
#define UIP_CONF_DS6_ROUTE_NBU 10
|
||||||
|
|
||||||
|
/* Increase rpl-border-router IP-buffer when using 128. */
|
||||||
|
#ifndef REST_MAX_CHUNK_SIZE
|
||||||
|
#define REST_MAX_CHUNK_SIZE 64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Multiplies with chunk size, be aware of memory constraints. */
|
||||||
|
#ifndef COAP_MAX_OPEN_TRANSACTIONS
|
||||||
|
#define COAP_MAX_OPEN_TRANSACTIONS 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Must be <= open transaction number. */
|
||||||
|
#ifndef COAP_MAX_OBSERVERS
|
||||||
|
#define COAP_MAX_OBSERVERS COAP_MAX_OPEN_TRANSACTIONS-1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Reduce 802.15.4 frame queue to save RAM. */
|
||||||
|
#undef QUEUEBUF_CONF_NUM
|
||||||
|
#define QUEUEBUF_CONF_NUM 4
|
||||||
|
|
||||||
|
#endif /* __PROJECT_RPL_WEB_CONF_H__ */
|
7
examples/osd/er-rest-example-toggleboard-ds1820/run.sh
Executable file
7
examples/osd/er-rest-example-toggleboard-ds1820/run.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
make clean TARGET=osd-er-lp24
|
||||||
|
make TARGET=osd-er-lp24
|
||||||
|
avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-er-lp24
|
||||||
|
avr-objcopy -j .text -j .data -O ihex er-example-server.osd-er-lp24 er-example-server.osd-er-lp24.hex
|
||||||
|
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-er-lp24 er-example-server.osd-er-lp24.eep
|
||||||
|
|
|
@ -0,0 +1,227 @@
|
||||||
|
<?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/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/collect-view</project>
|
||||||
|
<simulation>
|
||||||
|
<title>REST with RPL router</title>
|
||||||
|
<delaytime>-2147483648</delaytime>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
se.sics.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.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.mspmote.SkyMoteType
|
||||||
|
<identifier>rplroot</identifier>
|
||||||
|
<description>Sky RPL Root</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c</source>
|
||||||
|
<commands EXPORT="discard">make border-router.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky</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.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
se.sics.cooja.mspmote.SkyMoteType
|
||||||
|
<identifier>server</identifier>
|
||||||
|
<description>Erbium Server</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/er-rest-example/er-example-server.c</source>
|
||||||
|
<commands EXPORT="discard">make er-example-server.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky</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.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
se.sics.cooja.mspmote.SkyMoteType
|
||||||
|
<identifier>client</identifier>
|
||||||
|
<description>Erbium Client</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/er-rest-example/er-example-client.c</source>
|
||||||
|
<commands EXPORT="discard">make er-example-client.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky</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.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>33.260163187353555</x>
|
||||||
|
<y>30.643217359962595</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>rplroot</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>46.57186415376375</x>
|
||||||
|
<y>40.35946215910942</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>server</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>18.638049428485125</x>
|
||||||
|
<y>47.55034515769599</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>3</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>client</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.SimControl
|
||||||
|
<width>259</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>179</height>
|
||||||
|
<location_x>0</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.AttributeVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.LEDVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.AddressVisualizerSkin</skin>
|
||||||
|
<viewport>3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>300</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>178</height>
|
||||||
|
<location_x>261</location_x>
|
||||||
|
<location_y>1</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>762</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>491</height>
|
||||||
|
<location_x>2</location_x>
|
||||||
|
<location_y>182</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.RadioLogger
|
||||||
|
<plugin_config>
|
||||||
|
<split>150</split>
|
||||||
|
<analyzers name="6lowpan" />
|
||||||
|
</plugin_config>
|
||||||
|
<width>451</width>
|
||||||
|
<z>-1</z>
|
||||||
|
<height>305</height>
|
||||||
|
<location_x>73</location_x>
|
||||||
|
<location_y>140</location_y>
|
||||||
|
<minimized>true</minimized>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
SerialSocketServer
|
||||||
|
<mote_arg>0</mote_arg>
|
||||||
|
<width>422</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>74</height>
|
||||||
|
<location_x>578</location_x>
|
||||||
|
<location_y>18</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.TimeLine
|
||||||
|
<plugin_config>
|
||||||
|
<mote>0</mote>
|
||||||
|
<mote>1</mote>
|
||||||
|
<mote>2</mote>
|
||||||
|
<showRadioRXTX />
|
||||||
|
<showRadioHW />
|
||||||
|
<showLEDs />
|
||||||
|
<showWatchpoints />
|
||||||
|
<split>125</split>
|
||||||
|
<zoomfactor>25.49079397896416</zoomfactor>
|
||||||
|
</plugin_config>
|
||||||
|
<width>1624</width>
|
||||||
|
<z>5</z>
|
||||||
|
<height>252</height>
|
||||||
|
<location_x>6</location_x>
|
||||||
|
<location_y>712</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.MoteInterfaceViewer
|
||||||
|
<mote_arg>2</mote_arg>
|
||||||
|
<plugin_config>
|
||||||
|
<interface>Serial port</interface>
|
||||||
|
<scrollpos>0,0</scrollpos>
|
||||||
|
</plugin_config>
|
||||||
|
<width>853</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>491</height>
|
||||||
|
<location_x>765</location_x>
|
||||||
|
<location_y>182</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
189
examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc
Normal file
189
examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
<?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/serial_socket</project>
|
||||||
|
<project EXPORT="discard">[CONTIKI_DIR]/tools/cooja/apps/collect-view</project>
|
||||||
|
<simulation>
|
||||||
|
<title>REST with RPL router</title>
|
||||||
|
<delaytime>-2147483648</delaytime>
|
||||||
|
<randomseed>123456</randomseed>
|
||||||
|
<motedelay_us>1000000</motedelay_us>
|
||||||
|
<radiomedium>
|
||||||
|
se.sics.cooja.radiomediums.UDGM
|
||||||
|
<transmitting_range>50.0</transmitting_range>
|
||||||
|
<interference_range>50.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.mspmote.SkyMoteType
|
||||||
|
<identifier>rplroot</identifier>
|
||||||
|
<description>Sky RPL Root</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c</source>
|
||||||
|
<commands EXPORT="discard">make border-router.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky</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.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<motetype>
|
||||||
|
se.sics.cooja.mspmote.SkyMoteType
|
||||||
|
<identifier>server</identifier>
|
||||||
|
<description>Erbium Server</description>
|
||||||
|
<source EXPORT="discard">[CONTIKI_DIR]/examples/er-rest-example/er-example-server.c</source>
|
||||||
|
<commands EXPORT="discard">make er-example-server.sky TARGET=sky</commands>
|
||||||
|
<firmware EXPORT="copy">[CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky</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.mspmote.interfaces.MspClock</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspMoteID</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyButton</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyFlash</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyByteRadio</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspSerial</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyLED</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.MspDebugOutput</moteinterface>
|
||||||
|
<moteinterface>se.sics.cooja.mspmote.interfaces.SkyTemperature</moteinterface>
|
||||||
|
</motetype>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>33.260163187353555</x>
|
||||||
|
<y>30.643217359962595</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>1</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>rplroot</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
<mote>
|
||||||
|
<breakpoints />
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.interfaces.Position
|
||||||
|
<x>35.100895239785295</x>
|
||||||
|
<y>39.70574552287428</y>
|
||||||
|
<z>0.0</z>
|
||||||
|
</interface_config>
|
||||||
|
<interface_config>
|
||||||
|
se.sics.cooja.mspmote.interfaces.MspMoteID
|
||||||
|
<id>2</id>
|
||||||
|
</interface_config>
|
||||||
|
<motetype_identifier>server</motetype_identifier>
|
||||||
|
</mote>
|
||||||
|
</simulation>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.SimControl
|
||||||
|
<width>259</width>
|
||||||
|
<z>5</z>
|
||||||
|
<height>179</height>
|
||||||
|
<location_x>0</location_x>
|
||||||
|
<location_y>0</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.Visualizer
|
||||||
|
<plugin_config>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.IDVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.UDGMVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.AttributeVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.LEDVisualizerSkin</skin>
|
||||||
|
<skin>se.sics.cooja.plugins.skins.AddressVisualizerSkin</skin>
|
||||||
|
<viewport>7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535</viewport>
|
||||||
|
</plugin_config>
|
||||||
|
<width>300</width>
|
||||||
|
<z>4</z>
|
||||||
|
<height>175</height>
|
||||||
|
<location_x>263</location_x>
|
||||||
|
<location_y>3</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.LogListener
|
||||||
|
<plugin_config>
|
||||||
|
<filter />
|
||||||
|
<coloring />
|
||||||
|
</plugin_config>
|
||||||
|
<width>560</width>
|
||||||
|
<z>1</z>
|
||||||
|
<height>326</height>
|
||||||
|
<location_x>1</location_x>
|
||||||
|
<location_y>293</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.RadioLogger
|
||||||
|
<plugin_config>
|
||||||
|
<split>150</split>
|
||||||
|
<analyzers name="6lowpan" />
|
||||||
|
</plugin_config>
|
||||||
|
<width>451</width>
|
||||||
|
<z>-1</z>
|
||||||
|
<height>305</height>
|
||||||
|
<location_x>73</location_x>
|
||||||
|
<location_y>140</location_y>
|
||||||
|
<minimized>true</minimized>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
SerialSocketServer
|
||||||
|
<mote_arg>0</mote_arg>
|
||||||
|
<width>422</width>
|
||||||
|
<z>2</z>
|
||||||
|
<height>74</height>
|
||||||
|
<location_x>39</location_x>
|
||||||
|
<location_y>199</location_y>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
se.sics.cooja.plugins.TimeLine
|
||||||
|
<plugin_config>
|
||||||
|
<mote>0</mote>
|
||||||
|
<mote>1</mote>
|
||||||
|
<showRadioRXTX />
|
||||||
|
<showRadioHW />
|
||||||
|
<showLEDs />
|
||||||
|
<showWatchpoints />
|
||||||
|
<split>125</split>
|
||||||
|
<zoomfactor>25.49079397896416</zoomfactor>
|
||||||
|
</plugin_config>
|
||||||
|
<width>1624</width>
|
||||||
|
<z>3</z>
|
||||||
|
<height>252</height>
|
||||||
|
<location_x>4</location_x>
|
||||||
|
<location_y>622</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>702</width>
|
||||||
|
<z>0</z>
|
||||||
|
<height>646</height>
|
||||||
|
<location_x>564</location_x>
|
||||||
|
<location_y>2</location_y>
|
||||||
|
</plugin>
|
||||||
|
</simconf>
|
||||||
|
|
155
examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c
Normal file
155
examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* static-routing.c
|
||||||
|
*
|
||||||
|
* Created on: Oct 12, 2010
|
||||||
|
* Author: simonduq
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "static-routing.h"
|
||||||
|
|
||||||
|
#define DEBUG 0
|
||||||
|
#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
|
||||||
|
|
||||||
|
#include "contiki-net.h"
|
||||||
|
#include "node-id.h"
|
||||||
|
|
||||||
|
int node_rank;
|
||||||
|
|
||||||
|
struct id_to_addrs {
|
||||||
|
int id;
|
||||||
|
uint32_t addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
const struct id_to_addrs motes_addrs[] = {
|
||||||
|
/*
|
||||||
|
* Static routing requires a map nodeid => address.
|
||||||
|
* The nodeid can be programmed with the sky-shell.
|
||||||
|
* The addresses should also be added to /etc/hosts.
|
||||||
|
*
|
||||||
|
* aaaa::212:7400:1160:f62d sky1
|
||||||
|
* aaaa::212:7400:0da0:d748 sky2
|
||||||
|
* aaaa::212:7400:116e:c325 sky3
|
||||||
|
* aaaa::212:7400:116e:c444 sky4
|
||||||
|
* aaaa::212:7400:115e:b717 sky5
|
||||||
|
*
|
||||||
|
* Add the nodeid and last 4 bytes of the address to the map.
|
||||||
|
*/
|
||||||
|
{1, 0x1160f62d},
|
||||||
|
{2, 0x0da0d748},
|
||||||
|
{3, 0x116ec325},
|
||||||
|
{4, 0x116ec444},
|
||||||
|
{5, 0x115eb717},
|
||||||
|
};
|
||||||
|
/* Define the size of the map. */
|
||||||
|
#define NODES_IN_MAP 5
|
||||||
|
|
||||||
|
uint32_t get_mote_suffix(int rank) {
|
||||||
|
if(--rank >=0 && rank<(sizeof(motes_addrs)/sizeof(struct id_to_addrs))) {
|
||||||
|
return motes_addrs[rank].addr;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_mote_id(uint32_t suffix) {
|
||||||
|
#if IN_COOJA
|
||||||
|
return suffix & 0xff;
|
||||||
|
#else
|
||||||
|
int i;
|
||||||
|
for(i=0; i<(sizeof(motes_addrs)/sizeof(struct id_to_addrs)); i++) {
|
||||||
|
if(suffix == motes_addrs[i].addr) {
|
||||||
|
return motes_addrs[i].id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
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 void add_route_ext(int dest, int next) {
|
||||||
|
PRINTF("add route ext %d %d\n", dest, next);
|
||||||
|
uip_ipaddr_t ipaddr_dest, ipaddr_next;
|
||||||
|
uip_ip6addr(&ipaddr_dest, 0xaaaa, 0, 0, 0, 0, 0, 0, dest);
|
||||||
|
#if IN_COOJA
|
||||||
|
uip_ip6addr(&ipaddr_next, 0xfe80, 0, 0, 0, 0x0212, 0x7400 | next, next, next<<8 | next);
|
||||||
|
#else
|
||||||
|
uint32_t next_suffix = get_mote_suffix(next);
|
||||||
|
uip_ip6addr(&ipaddr_next, 0xfe80, 0, 0, 0, 0x0212, 0x7400, (next_suffix >> 16) & 0xffff, next_suffix & 0xffff);
|
||||||
|
#endif
|
||||||
|
uip_ds6_route_add(&ipaddr_dest, 128, &ipaddr_next, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_route(int dest, int next) {
|
||||||
|
PRINTF("add route %d %d\n", dest, next);
|
||||||
|
uip_ipaddr_t ipaddr_dest, ipaddr_next;
|
||||||
|
#if IN_COOJA
|
||||||
|
uip_ip6addr(&ipaddr_dest, 0xaaaa, 0, 0, 0, 0x0212, 0x7400 | dest, dest, dest<<8 | dest);
|
||||||
|
uip_ip6addr(&ipaddr_next, 0xfe80, 0, 0, 0, 0x0212, 0x7400 | next, next, next<<8 | next);
|
||||||
|
#else
|
||||||
|
uint32_t dest_suffix = get_mote_suffix(dest);
|
||||||
|
uint32_t next_suffix = get_mote_suffix(next);
|
||||||
|
uip_ip6addr(&ipaddr_dest, 0xaaaa, 0, 0, 0, 0x0212, 0x7400, (dest_suffix >> 16) & 0xffff, dest_suffix & 0xffff);
|
||||||
|
uip_ip6addr(&ipaddr_next, 0xfe80, 0, 0, 0, 0x0212, 0x7400, (next_suffix >> 16) & 0xffff, next_suffix & 0xffff);
|
||||||
|
#endif
|
||||||
|
uip_ds6_route_add(&ipaddr_dest, 128, &ipaddr_next, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void configure_routing(void) {
|
||||||
|
int i;
|
||||||
|
#if IN_COOJA
|
||||||
|
node_rank = node_id;
|
||||||
|
#else
|
||||||
|
node_rank = -1;
|
||||||
|
for(i=0; i<(sizeof(motes_addrs)/sizeof(struct id_to_addrs)); ++i) {
|
||||||
|
if(node_id == motes_addrs[i].id) {
|
||||||
|
node_rank = i+1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(node_rank == -1) {
|
||||||
|
printf("unable to configure routing, node_id=%d\n", node_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf("configure_routing, node_id=%d, node_rank %d\n", node_id, node_rank);
|
||||||
|
|
||||||
|
if (node_rank == 1) { /* border router #1 */
|
||||||
|
add_route_ext(2, 2);
|
||||||
|
for(i=2; i<=NODES_IN_MAP; ++i) {
|
||||||
|
add_route(i, 2);
|
||||||
|
}
|
||||||
|
} else if (node_rank < NODES_IN_MAP) { /* other node */
|
||||||
|
add_route_ext(1, node_rank-1);
|
||||||
|
add_route_ext(2, node_rank+1);
|
||||||
|
for(i=1; i<=NODES_IN_MAP; ++i) {
|
||||||
|
if(i<node_rank) {
|
||||||
|
add_route(i, node_rank-1);
|
||||||
|
} else if(i>node_rank) {
|
||||||
|
add_route(i, node_rank+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (node_rank == NODES_IN_MAP) { /* 2nd border router */
|
||||||
|
add_route_ext(1, NODES_IN_MAP-1);
|
||||||
|
for(i=1; i<=NODES_IN_MAP-1; ++i) {
|
||||||
|
add_route(i, NODES_IN_MAP-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* static-routing.h
|
||||||
|
*
|
||||||
|
* Created on: Oct 12, 2010
|
||||||
|
* Author: simonduq
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef STATICROUTING_H_
|
||||||
|
#define STATICROUTING_H_
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
|
||||||
|
extern int node_rank;
|
||||||
|
extern uint32_t get_mote_suffix(int id);
|
||||||
|
extern int get_mote_id(uint32_t suffix);
|
||||||
|
extern void add_route(int dest, int next);
|
||||||
|
extern void set_global_address(void);
|
||||||
|
extern void configure_routing(void);
|
||||||
|
|
||||||
|
#endif /* STATICROUTING_H_ */
|
50
examples/osd/rpl-border-router/Makefile
Normal file
50
examples/osd/rpl-border-router/Makefile
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
CONTIKI_PROJECT=border-router
|
||||||
|
all: $(CONTIKI_PROJECT)
|
||||||
|
|
||||||
|
CONTIKI=../../..
|
||||||
|
|
||||||
|
WITH_UIP6=1
|
||||||
|
UIP_CONF_IPV6=1
|
||||||
|
CFLAGS+= -DUIP_CONF_IPV6_RPL
|
||||||
|
|
||||||
|
#linker optimizations
|
||||||
|
SMALL=1
|
||||||
|
|
||||||
|
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
|
||||||
|
PROJECT_SOURCEFILES += slip-bridge.c
|
||||||
|
|
||||||
|
#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 += -DWEBSERVER=1
|
||||||
|
PROJECT_SOURCEFILES += httpd-simple.c
|
||||||
|
else ifneq ($(WITH_WEBSERVER), 0)
|
||||||
|
APPS += $(WITH_WEBSERVER)
|
||||||
|
CFLAGS += -DWEBSERVER=2
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(PREFIX),)
|
||||||
|
PREFIX = aaaa::1/64
|
||||||
|
endif
|
||||||
|
|
||||||
|
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)
|
13
examples/osd/rpl-border-router/README
Normal file
13
examples/osd/rpl-border-router/README
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
OSDOMOTIS
|
||||||
|
|
||||||
|
www.osdomotics.com
|
||||||
|
|
||||||
|
Plattform: osd-er-lp24
|
||||||
|
|
||||||
|
make clean TARGET=osd-er-lp24
|
||||||
|
make TARGET=osd-er-lp24
|
||||||
|
avr-size -C --mcu=MCU=atmega128rfa1 border-router.osd-er-lp24
|
||||||
|
avr-objcopy -j .text -j .data -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.hex
|
||||||
|
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.eep
|
||||||
|
|
||||||
|
sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:border-router.osd-er-lp24.hex:a -U eeprom:w:border-router.osd-er-lp24.eep:a
|
391
examples/osd/rpl-border-router/border-router.c
Normal file
391
examples/osd/rpl-border-router/border-router.c
Normal file
|
@ -0,0 +1,391 @@
|
||||||
|
/*
|
||||||
|
* 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/uip.h"
|
||||||
|
#include "net/uip-ds6.h"
|
||||||
|
#include "net/rpl/rpl.h"
|
||||||
|
|
||||||
|
#include "net/netstack.h"
|
||||||
|
#include "dev/button-sensor.h"
|
||||||
|
#include "dev/slip.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#define DEBUG DEBUG_NONE
|
||||||
|
#include "net/uip-debug.h"
|
||||||
|
|
||||||
|
uint16_t dag_id[] = {0x1111, 0x1100, 0, 0, 0, 0, 0, 0x0011};
|
||||||
|
|
||||||
|
extern uip_ds6_nbr_t uip_ds6_nbr_cache[];
|
||||||
|
extern uip_ds6_route_t uip_ds6_routing_table[];
|
||||||
|
|
||||||
|
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 0
|
||||||
|
#define WEBSERVER_CONF_FILESTATS 0
|
||||||
|
#define WEBSERVER_CONF_NEIGHBOR_STATUS 0
|
||||||
|
/* 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 0
|
||||||
|
#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 int i;
|
||||||
|
#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(i = 0; i < UIP_DS6_NBR_NB; i++) {
|
||||||
|
if(uip_ds6_nbr_cache[i].isused) {
|
||||||
|
|
||||||
|
#if WEBSERVER_CONF_NEIGHBOR_STATUS
|
||||||
|
#if BUF_USES_STACK
|
||||||
|
{char* j=bufptr+25;
|
||||||
|
ipaddr_add(&uip_ds6_nbr_cache[i].ipaddr);
|
||||||
|
while (bufptr < j) ADD(" ");
|
||||||
|
switch (uip_ds6_nbr_cache[i].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(&uip_ds6_nbr_cache[i].ipaddr);
|
||||||
|
while (blen < j) ADD(" ");
|
||||||
|
switch (uip_ds6_nbr_cache[i].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(&uip_ds6_nbr_cache[i].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(i = 0; i < UIP_DS6_ROUTE_NB; i++) {
|
||||||
|
if(uip_ds6_routing_table[i].isused) {
|
||||||
|
#if BUF_USES_STACK
|
||||||
|
#if WEBSERVER_CONF_ROUTE_LINKS
|
||||||
|
ADD("<a href=http://[");
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
|
||||||
|
ADD("]/status.shtml>");
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
|
||||||
|
ADD("</a>");
|
||||||
|
#else
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#if WEBSERVER_CONF_ROUTE_LINKS
|
||||||
|
ADD("<a href=http://[");
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
|
||||||
|
ADD("]/status.shtml>");
|
||||||
|
SEND_STRING(&s->sout, buf); //TODO: why tunslip6 needs an output here, wpcapslip does not
|
||||||
|
blen = 0;
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
|
||||||
|
ADD("</a>");
|
||||||
|
#else
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
ADD("/%u (via ", uip_ds6_routing_table[i].length);
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].nexthop);
|
||||||
|
if(1 || (uip_ds6_routing_table[i].state.lifetime < 600)) {
|
||||||
|
ADD(") %lus\n", uip_ds6_routing_table[i].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>(%u.%02u 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_len = 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
set_prefix_64(uip_ipaddr_t *prefix_64)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
PROCESS_THREAD(border_router_process, ev, data)
|
||||||
|
{
|
||||||
|
static struct etimer et;
|
||||||
|
rpl_dag_t *dag;
|
||||||
|
|
||||||
|
PROCESS_BEGIN();
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
/* Request prefix until it has been received */
|
||||||
|
while(!prefix_set) {
|
||||||
|
etimer_set(&et, CLOCK_SECOND);
|
||||||
|
request_prefix();
|
||||||
|
PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et));
|
||||||
|
}
|
||||||
|
|
||||||
|
dag = rpl_set_root(RPL_DEFAULT_INSTANCE,(uip_ip6addr_t *)dag_id);
|
||||||
|
if(dag != NULL) {
|
||||||
|
rpl_set_prefix(dag, &prefix, 64);
|
||||||
|
PRINTF("created a new RPL dag\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
#if DEBUG || 1
|
||||||
|
print_local_addresses();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
PROCESS_YIELD();
|
||||||
|
if (ev == sensors_event && data == &button_sensor) {
|
||||||
|
PRINTF("Initiating global repair\n");
|
||||||
|
rpl_repair_root(RPL_DEFAULT_INSTANCE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PROCESS_END();
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
262
examples/osd/rpl-border-router/httpd-simple.c
Normal file
262
examples/osd/rpl-border-router/httpd-simple.c
Normal file
|
@ -0,0 +1,262 @@
|
||||||
|
/*
|
||||||
|
* 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: httpd-simple.c,v 1.5 2010/10/19 18:29:04 adamdunkels Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \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 */
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
74
examples/osd/rpl-border-router/httpd-simple.h
Normal file
74
examples/osd/rpl-border-router/httpd-simple.h
Normal 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__ */
|
55
examples/osd/rpl-border-router/project-conf.h
Normal file
55
examples/osd/rpl-border-router/project-conf.h
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* 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: project-conf.h,v 1.1 2010/10/21 18:23:44 joxe Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __PROJECT_ROUTER_CONF_H__
|
||||||
|
#define __PROJECT_ROUTER_CONF_H__
|
||||||
|
|
||||||
|
#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 140
|
||||||
|
#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__ */
|
7
examples/osd/rpl-border-router/run-test.sh
Executable file
7
examples/osd/rpl-border-router/run-test.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
make clean TARGET=atmega128rfa1
|
||||||
|
make TARGET=atmega128rfa1
|
||||||
|
avr-size -C --mcu=MCU=atmega128rfa1 rest-server-example.osd-er-lp24
|
||||||
|
avr-objcopy -j .text -j .data -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.hex
|
||||||
|
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.eep
|
||||||
|
#sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:border-router.osd-er-lp24.hex:a -U eeprom:w:border-router.osd-er-lp24.eep:a
|
7
examples/osd/rpl-border-router/run.sh
Executable file
7
examples/osd/rpl-border-router/run.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
make clean TARGET=osd-er-lp24
|
||||||
|
make TARGET=osd-er-lp24
|
||||||
|
avr-size -C --mcu=MCU=atmega128rfa1 border-router.osd-er-lp24
|
||||||
|
avr-objcopy -j .text -j .data -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.hex
|
||||||
|
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex border-router.osd-er-lp24 border-router.osd-er-lp24.eep
|
||||||
|
#sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:border-router.osd-er-lp24.hex:a -U eeprom:w:border-router.osd-er-lp24.eep:a
|
153
examples/osd/rpl-border-router/slip-bridge.c
Normal file
153
examples/osd/rpl-border-router/slip-bridge.c
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
/*
|
||||||
|
* 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.6 2011/01/17 20:05:51 joxe 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 "dev/slip.h"
|
||||||
|
#include "dev/uart1.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN])
|
||||||
|
|
||||||
|
#define DEBUG DEBUG_PRINT
|
||||||
|
#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(uip_buf[0] == '!') {
|
||||||
|
PRINTF("Got configuration message of type %c\n", uip_buf[1]);
|
||||||
|
uip_len = 0;
|
||||||
|
if(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);
|
||||||
|
}
|
||||||
|
} else if (uip_buf[0] == '?') {
|
||||||
|
PRINTF("Got request message of type %c\n", uip_buf[1]);
|
||||||
|
if(uip_buf[1] == 'M') {
|
||||||
|
char* hexchar = "0123456789abcdef";
|
||||||
|
int j;
|
||||||
|
/* this is just a test so far... just to see if it works */
|
||||||
|
uip_buf[0] = '!';
|
||||||
|
for(j = 0; j < 8; j++) {
|
||||||
|
uip_buf[2 + j * 2] = hexchar[uip_lladdr.addr[j] >> 4];
|
||||||
|
uip_buf[3 + j * 2] = hexchar[uip_lladdr.addr[j] & 15];
|
||||||
|
}
|
||||||
|
uip_len = 18;
|
||||||
|
slip_send();
|
||||||
|
|
||||||
|
}
|
||||||
|
uip_len = 0;
|
||||||
|
}
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
init(void)
|
||||||
|
{
|
||||||
|
slip_arch_init(BAUD2UBR(115200));
|
||||||
|
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 src=");
|
||||||
|
PRINT6ADDR(&UIP_IP_BUF->srcipaddr);
|
||||||
|
PRINTF(" dst=");
|
||||||
|
PRINT6ADDR(&UIP_IP_BUF->destipaddr);
|
||||||
|
PRINTF("\n");
|
||||||
|
} else {
|
||||||
|
// PRINTF("SUT: %u\n", uip_len);
|
||||||
|
slip_send();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#undef putchar
|
||||||
|
int
|
||||||
|
putchar(int c)
|
||||||
|
{
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Need to also print '\n' because for example COOJA will not show
|
||||||
|
any output before line end */
|
||||||
|
slip_arch_writeb((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;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
const struct uip_fallback_interface rpl_interface = {
|
||||||
|
init, output
|
||||||
|
};
|
||||||
|
/*---------------------------------------------------------------------------*/
|
32
platform/osd-er-lp24/Makefile.osd-er-lp24
Normal file
32
platform/osd-er-lp24/Makefile.osd-er-lp24
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
CONTIKI_TARGET_DIRS = . dev apps net loader
|
||||||
|
|
||||||
|
CONTIKI_CORE=contiki-main
|
||||||
|
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += contiki-main.c params.c node-id.c
|
||||||
|
#Needed for slip
|
||||||
|
CONTIKI_TARGET_SOURCEFILES += button-sensor.c sensors.c slip_uart0.c slip.c
|
||||||
|
|
||||||
|
CONTIKIAVR=$(CONTIKI)/cpu/avr
|
||||||
|
CONTIKIBOARD=.
|
||||||
|
BOOTLOADER_START = 0x1F000
|
||||||
|
CONTIKI_PLAT_DEFS = -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2
|
||||||
|
|
||||||
|
MCU=atmega128rfa1
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
include $(CONTIKIAVR)/Makefile.avr
|
||||||
|
include $(CONTIKIAVR)/radio/Makefile.radio
|
45
platform/osd-er-lp24/button-sensor.c
Normal file
45
platform/osd-er-lp24/button-sensor.c
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/* 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);
|
||||||
|
|
347
platform/osd-er-lp24/contiki-conf.h
Normal file
347
platform/osd-er-lp24/contiki-conf.h
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
/*
|
||||||
|
* 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 Atmel ATmega128rfa1
|
||||||
|
* \author
|
||||||
|
* David Kopf <dak664@embarqmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONTIKI_CONF_H__
|
||||||
|
#define __CONTIKI_CONF_H__
|
||||||
|
|
||||||
|
/* Platform name, type, and MCU clock rate */
|
||||||
|
#define PLATFORM_NAME "RFA1"
|
||||||
|
#define PLATFORM_TYPE ATMEGA128RFA1
|
||||||
|
#ifndef F_CPU
|
||||||
|
#define F_CPU 16000000UL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* 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
|
||||||
|
#if 1
|
||||||
|
/* 16 bit counter overflows every ~10 minutes */
|
||||||
|
typedef unsigned short clock_time_t;
|
||||||
|
#define CLOCK_LT(a,b) ((signed short)((a)-(b)) < 0)
|
||||||
|
#define INFINITE_TIME 0xffff
|
||||||
|
#define RIME_CONF_BROADCAST_ANNOUNCEMENT_MAX_TIME INFINITE_TIME/CLOCK_CONF_SECOND /* Default uses 600 */
|
||||||
|
#define COLLECT_CONF_BROADCAST_ANNOUNCEMENT_MAX_TIME INFINITE_TIME/CLOCK_CONF_SECOND /* Default uses 600 */
|
||||||
|
#else
|
||||||
|
typedef unsigned long clock_time_t;
|
||||||
|
#define CLOCK_LT(a,b) ((signed long)((a)-(b)) < 0)
|
||||||
|
#define INFINITE_TIME 0xffffffff
|
||||||
|
#endif
|
||||||
|
/* 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);
|
||||||
|
|
||||||
|
/* Michael Hartman's atmega128rfa1 board has an external 32768Hz crystal connected to TOSC1 and 2 pins similar to the Raven 1284p */
|
||||||
|
/* and theoretically can use TIMER2 with it to keep time. Else TIMER0 is used. */
|
||||||
|
/* The sleep timer requires the crystal and adds a TIMER2 interrupt routine if not already define by clock.c */
|
||||||
|
#define AVR_CONF_USE32KCRYSTAL 1
|
||||||
|
|
||||||
|
/* Michael Hartman's protobyte board has LED on PORTE1, used for radio on indication */
|
||||||
|
/* However this results in disabling UART0. */
|
||||||
|
#define RF230BB_CONF_LEDONPORTE1 0
|
||||||
|
|
||||||
|
/* COM port to be used for SLIP connection. This is usually UART0, but see above */
|
||||||
|
#if RF230BB_CONF_LEDONPORTE1
|
||||||
|
#define SLIP_PORT RS232_PORT_1
|
||||||
|
#else
|
||||||
|
#define SLIP_PORT RS232_PORT_0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 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 backoff */
|
||||||
|
#define RDC_CONF_HARDWARE_CSMA 1
|
||||||
|
/* Allow MCU sleeping between channel checks */
|
||||||
|
#define RDC_CONF_MCU_SLEEP 1
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6
|
||||||
|
#define RIMEADDR_CONF_SIZE 8
|
||||||
|
#define UIP_CONF_ICMP6 1
|
||||||
|
#define UIP_CONF_UDP 1
|
||||||
|
#define UIP_CONF_TCP 1
|
||||||
|
#define NETSTACK_CONF_NETWORK sicslowpan_driver
|
||||||
|
#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06
|
||||||
|
#else
|
||||||
|
/* ip4 should build but is largely untested */
|
||||||
|
#define RIMEADDR_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 1 /* No radio cycling */
|
||||||
|
#if 0 /* radio cycling */
|
||||||
|
|
||||||
|
#define NETSTACK_CONF_MAC nullmac_driver
|
||||||
|
#define NETSTACK_CONF_RDC sicslowmac_driver
|
||||||
|
#define NETSTACK_CONF_FRAMER framer_802154
|
||||||
|
#define NETSTACK_CONF_RADIO rf230_driver
|
||||||
|
#define CHANNEL_802_15_4 26
|
||||||
|
/* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */
|
||||||
|
#define RF230_CONF_AUTOACK 1
|
||||||
|
/* Request 802.15.4 ACK on all packets sent (else autoretry). This is primarily for testing. */
|
||||||
|
#define SICSLOWPAN_CONF_ACK_ALL 0
|
||||||
|
/* Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode with CCA) */
|
||||||
|
#define RF230_CONF_AUTORETRIES 2
|
||||||
|
/* 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
|
||||||
|
/* 211 bytes per queue buffer */
|
||||||
|
#define QUEUEBUF_CONF_NUM 8
|
||||||
|
/* 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 UIP_CONF_DS6_NBR_NBU 20
|
||||||
|
#define UIP_CONF_DS6_DEFRT_NBU 2
|
||||||
|
#define UIP_CONF_DS6_PREFIX_NBU 3
|
||||||
|
#define UIP_CONF_DS6_ROUTE_NBU 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 */
|
||||||
|
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
|
||||||
|
/* Wireshark won't decode with the header, but padded packets will fail ipv6 checksum */
|
||||||
|
#define CONTIKIMAC_CONF_WITH_CONTIKIMAC_HEADER 0
|
||||||
|
/* So without the header this needed for RPL mesh to form */
|
||||||
|
#define CONTIKIMAC_CONF_SHORTEST_PACKET_SIZE 43-18 //multicast RPL DIS length
|
||||||
|
/* Not tested much yet */
|
||||||
|
#define WITH_PHASE_OPTIMIZATION 0
|
||||||
|
#define CONTIKIMAC_CONF_COMPOWER 1
|
||||||
|
#define RIMESTATS_CONF_ON 1
|
||||||
|
#define NETSTACK_CONF_FRAMER framer_802154
|
||||||
|
#define NETSTACK_CONF_RADIO rf230_driver
|
||||||
|
#define CHANNEL_802_15_4 26
|
||||||
|
/* The radio needs to interrupt during an rtimer interrupt */
|
||||||
|
#define RTIMER_CONF_NESTED_INTERRUPTS 1
|
||||||
|
#define RF230_CONF_AUTOACK 1
|
||||||
|
/* A 0 here means non-extended mode; 1 means extended mode with no retry, >1 for retrys */
|
||||||
|
#define RF230_CONF_AUTORETRIES 1
|
||||||
|
/* A 0 here means no cca; 1 means extended mode with cca but no retry, >1 for backoff retrys */
|
||||||
|
#define RF230_CONF_CSMARETRIES 1
|
||||||
|
#define SICSLOWPAN_CONF_FRAG 1
|
||||||
|
#define SICSLOWPAN_CONF_MAXAGE 3
|
||||||
|
/* 211 bytes per queue buffer. Contikimac burst mode needs 15 for a 1280 byte MTU */
|
||||||
|
#define QUEUEBUF_CONF_NUM 15
|
||||||
|
/* 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 UIP_CONF_DS6_NBR_NBU 4
|
||||||
|
#define UIP_CONF_DS6_DEFRT_NBU 2
|
||||||
|
#define UIP_CONF_DS6_PREFIX_NBU 3
|
||||||
|
#define UIP_CONF_DS6_ROUTE_NBU 4
|
||||||
|
#define UIP_CONF_DS6_ADDR_NBU 3
|
||||||
|
#define UIP_CONF_DS6_MADDR_NBU 0
|
||||||
|
#define UIP_CONF_DS6_AADDR_NBU 0
|
||||||
|
|
||||||
|
|
||||||
|
#elif 1 /* cx-mac radio cycling */
|
||||||
|
/* RF230 does clear-channel assessment in extended mode (autoretries>0) */
|
||||||
|
#define RF230_CONF_AUTORETRIES 1
|
||||||
|
#if RF230_CONF_AUTORETRIES
|
||||||
|
#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 NETSTACK_CONF_RADIO rf230_driver
|
||||||
|
#define CHANNEL_802_15_4 26
|
||||||
|
#define RF230_CONF_AUTOACK 1
|
||||||
|
#define SICSLOWPAN_CONF_FRAG 1
|
||||||
|
#define SICSLOWPAN_CONF_MAXAGE 3
|
||||||
|
#define CXMAC_CONF_ANNOUNCEMENTS 0
|
||||||
|
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
|
||||||
|
/* 211 bytes per queue buffer. Burst mode will need 15 for a 1280 byte MTU */
|
||||||
|
#define QUEUEBUF_CONF_NUM 15
|
||||||
|
/* 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 UIP_CONF_DS6_NBR_NBU 4
|
||||||
|
#define UIP_CONF_DS6_DEFRT_NBU 2
|
||||||
|
#define UIP_CONF_DS6_PREFIX_NBU 3
|
||||||
|
#define UIP_CONF_DS6_ROUTE_NBU 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 */
|
||||||
|
|
||||||
|
/* ************************************************************************** */
|
||||||
|
//#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_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
|
||||||
|
|
||||||
|
/* include the project config */
|
||||||
|
/* PROJECT_CONF_H might be defined in the project Makefile */
|
||||||
|
#ifdef PROJECT_CONF_H
|
||||||
|
#include PROJECT_CONF_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CONTIKI_CONF_H__ */
|
601
platform/osd-er-lp24/contiki-main.c
Normal file
601
platform/osd-er-lp24/contiki-main.c
Normal file
|
@ -0,0 +1,601 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#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 "radio/rf230bb/rf230bb.h"
|
||||||
|
#include "net/mac/frame802154.h"
|
||||||
|
#include "net/mac/framer-802154.h"
|
||||||
|
#include "net/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"
|
||||||
|
|
||||||
|
#ifdef RAVEN_LCD_INTERFACE
|
||||||
|
#include "raven-lcd.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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.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 ledtimer;
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
/*----------------------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, External osc 1kck4ms1 , Boot 4096 words @ $1F000, TXC1K+4,1msec delay, Brownout 1.9 volts */
|
||||||
|
FUSES ={.low = 0xF6, .high = 0x98, .extended = 0xfd,};
|
||||||
|
#define BOOTLOADER_START = 0x1F000
|
||||||
|
#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();
|
||||||
|
|
||||||
|
/* The Raven implements a serial command and data interface via uart0 to a 3290p,
|
||||||
|
* which could be duplicated using another host computer.
|
||||||
|
*/
|
||||||
|
#if !RF230BB_CONF_LEDONPORTE1 //Conflicts with USART0
|
||||||
|
#ifdef RAVEN_LCD_INTERFACE
|
||||||
|
rs232_init(RS232_PORT_0, USART_BAUD_38400,USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
|
rs232_set_input(0,raven_lcd_serial_input);
|
||||||
|
#else
|
||||||
|
/* Generic or slip connection on uart0 */
|
||||||
|
rs232_init(RS232_PORT_0, USART_BAUD_38400,USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Second rs232 port for debugging or slip alternative */
|
||||||
|
rs232_init(RS232_PORT_1, USART_BAUD_57600,USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8);
|
||||||
|
/* Redirect stdout */
|
||||||
|
#if RF230BB_CONF_LEDONPORTE1 || defined(RAVEN_LCD_INTERFACE)
|
||||||
|
rs232_redirect_stdout(RS232_PORT_1);
|
||||||
|
#else
|
||||||
|
rs232_redirect_stdout(RS232_PORT_0);
|
||||||
|
#endif
|
||||||
|
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");
|
||||||
|
|
||||||
|
#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 */
|
||||||
|
|
||||||
|
rimeaddr_t addr;
|
||||||
|
|
||||||
|
if (params_get_eui64(addr.u8)) {
|
||||||
|
PRINTA("Random EUI64 address generated\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if UIP_CONF_IPV6
|
||||||
|
memcpy(&uip_lladdr.addr, &addr.u8, sizeof(rimeaddr_t));
|
||||||
|
#elif WITH_NODE_ID
|
||||||
|
node_id=get_panaddr_from_eeprom();
|
||||||
|
addr.u8[1]=node_id&0xff;
|
||||||
|
addr.u8[0]=(node_id&0xff00)>>8;
|
||||||
|
PRINTA("Node ID from eeprom: %X\n",node_id);
|
||||||
|
#endif
|
||||||
|
rimeaddr_set_node_addr(&addr);
|
||||||
|
|
||||||
|
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 UIP_CONF_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(rimeaddr_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("%s %s, channel %u , check rate %u Hz tx power %u\n",NETSTACK_MAC.name, NETSTACK_RDC.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 */
|
||||||
|
|
||||||
|
process_start(&tcpip_process, NULL);
|
||||||
|
|
||||||
|
#ifdef RAVEN_LCD_INTERFACE
|
||||||
|
process_start(&raven_lcd_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 */
|
||||||
|
|
||||||
|
#if RF230BB_CONF_LEDONPORTE1
|
||||||
|
/* NB: PORTE1 conflicts with UART0 */
|
||||||
|
DDRE|=(1<<DDE1); //set led pin to output (Micheal Hatrtman board)
|
||||||
|
PORTE&=~(1<<PE1); //and low to turn led off
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ROUTES && UIP_CONF_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)
|
||||||
|
{
|
||||||
|
initialize();
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
process_run();
|
||||||
|
watchdog_periodic();
|
||||||
|
|
||||||
|
/* Turn off LED after a while */
|
||||||
|
if (ledtimer) {
|
||||||
|
if (--ledtimer==0) {
|
||||||
|
#if RF230BB_CONF_LEDONPORTE1
|
||||||
|
PORTE&=~(1<<PE1);
|
||||||
|
#endif
|
||||||
|
#if defined(RAVEN_LCD_INTERFACE)&&0
|
||||||
|
/* ledtimer can be set by received ping; ping the other way for testing */
|
||||||
|
extern void raven_ping6(void);
|
||||||
|
raven_ping6();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#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 && UIP_CONF_IPV6
|
||||||
|
extern void raven_ping6(void);
|
||||||
|
if ((clocktime%PINGS)==1) {
|
||||||
|
PRINTF("**Ping\n");
|
||||||
|
raven_ping6();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ROUTES && UIP_CONF_IPV6
|
||||||
|
if ((clocktime%ROUTES)==2) {
|
||||||
|
|
||||||
|
extern uip_ds6_nbr_t uip_ds6_nbr_cache[];
|
||||||
|
extern uip_ds6_route_t uip_ds6_routing_table[];
|
||||||
|
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",UIP_DS6_NBR_NB);
|
||||||
|
for(i = 0,j=1; i < UIP_DS6_NBR_NB; i++) {
|
||||||
|
if(uip_ds6_nbr_cache[i].isused) {
|
||||||
|
ipaddr_add(&uip_ds6_nbr_cache[i].ipaddr);
|
||||||
|
PRINTF("\n");
|
||||||
|
j=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (j) PRINTF(" <none>");
|
||||||
|
PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB);
|
||||||
|
for(i = 0,j=1; i < UIP_DS6_ROUTE_NB; i++) {
|
||||||
|
if(uip_ds6_routing_table[i].isused) {
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
|
||||||
|
PRINTF("/%u (via ", uip_ds6_routing_table[i].length);
|
||||||
|
ipaddr_add(&uip_ds6_routing_table[i].nexthop);
|
||||||
|
// if(uip_ds6_routing_table[i].state.lifetime < 600) {
|
||||||
|
PRINTF(") %lus\n", uip_ds6_routing_table[i].state.lifetime);
|
||||||
|
// } else {
|
||||||
|
// PRINTF(")\n");
|
||||||
|
// }
|
||||||
|
j=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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);
|
||||||
|
}
|
290
platform/osd-er-lp24/dev/ds1820.c
Normal file
290
platform/osd-er-lp24/dev/ds1820.c
Normal file
|
@ -0,0 +1,290 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2005, Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$Id: ds1820.c,v 1.5 2010/08/25 18:35:52 nifi Exp $
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Device driver for the Dallas Semiconductor DS1820 chip. Heavily
|
||||||
|
* based on the application note 126 "1-Wire Communications Through
|
||||||
|
* Software".
|
||||||
|
*
|
||||||
|
* http://www.maxim-ic.com/appnotes.cfm/appnote_number/126
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For now we stuff in Moteiv Corporation's unique OUI.
|
||||||
|
* From http://www.ethereal.com/distribution/manuf.txt:
|
||||||
|
* 00:12:75 Moteiv # Moteiv Corporation
|
||||||
|
*
|
||||||
|
* The EUI-64 is a concatenation of the 24-bit OUI value assigned by
|
||||||
|
* the IEEE Registration Authority and a 40-bit extension identifier
|
||||||
|
* assigned by the organization with that OUI assignment.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "contiki.h"
|
||||||
|
#include "ds1820.h"
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char ds1820_id[8];
|
||||||
|
unsigned char ds1820_ok[8];
|
||||||
|
|
||||||
|
/* 1-wire is at PortE.3 */
|
||||||
|
#define SERIAL_ID_PIN_READ PINE
|
||||||
|
#define SERIAL_ID_PIN_MASK _BV(PE3)
|
||||||
|
#define SERIAL_ID_PxOUT PORTE
|
||||||
|
#define SERIAL_ID_PxDIR DDRE
|
||||||
|
|
||||||
|
#define SET_PIN_INPUT() (SERIAL_ID_PxDIR &= ~SERIAL_ID_PIN_MASK)
|
||||||
|
#define SET_PIN_OUTPUT() (SERIAL_ID_PxDIR |= SERIAL_ID_PIN_MASK)
|
||||||
|
|
||||||
|
#define OUTP_0() (SERIAL_ID_PxOUT &= ~SERIAL_ID_PIN_MASK)
|
||||||
|
#define OUTP_1() (SERIAL_ID_PxOUT |= SERIAL_ID_PIN_MASK)
|
||||||
|
|
||||||
|
#define PIN_INIT() do{ \
|
||||||
|
SET_PIN_INPUT(); \
|
||||||
|
OUTP_0(); \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
|
||||||
|
/* Drive the one wire interface low */
|
||||||
|
#define OW_DRIVE() do { \
|
||||||
|
SET_PIN_OUTPUT(); \
|
||||||
|
OUTP_0(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Release the one wire by turning on the internal pull-up. */
|
||||||
|
#define OW_RELEASE() do { \
|
||||||
|
SET_PIN_INPUT(); \
|
||||||
|
OUTP_1(); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Read one bit. */
|
||||||
|
#define INP() (SERIAL_ID_PIN_READ & SERIAL_ID_PIN_MASK)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Delay times in us.
|
||||||
|
*/
|
||||||
|
#define tA 6 /* min-5, recommended-6, max-15 */
|
||||||
|
#define tB 64 /* min-59, recommended-64, max-N/A */
|
||||||
|
#define tC 60 /* min-60, recommended-60, max-120 */
|
||||||
|
#define tD 10 /* min-5.3, recommended-10, max-N/A */
|
||||||
|
#define tE 9 /* min-0.3, recommended-9, max-9.3 */
|
||||||
|
#define tF 55 /* min-50, recommended-55, max-N/A */
|
||||||
|
#define tG 0 /* min-0, recommended-0, max-0 */
|
||||||
|
#define tH 480 /* min-480, recommended-480, max-640 */
|
||||||
|
#define tI 70 /* min-60.3, recommended-70, max-75.3 */
|
||||||
|
#define tJ 410 /* min-410, recommended-410, max-N/A */
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
#define udelay(u) clock_delay_usec(u)
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
owreset(void)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
OW_DRIVE();
|
||||||
|
udelay(tH); /* 480 < tH < 640 */
|
||||||
|
OW_RELEASE(); /* Releases the bus */
|
||||||
|
udelay(tI);
|
||||||
|
result = INP();
|
||||||
|
udelay(tJ);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
owwriteb(unsigned byte)
|
||||||
|
{
|
||||||
|
int i = 7;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if(byte & 0x01) {
|
||||||
|
OW_DRIVE();
|
||||||
|
udelay(tA);
|
||||||
|
OW_RELEASE(); /* Releases the bus */
|
||||||
|
udelay(tB);
|
||||||
|
} else {
|
||||||
|
OW_DRIVE();
|
||||||
|
udelay(tC);
|
||||||
|
OW_RELEASE(); /* Releases the bus */
|
||||||
|
udelay(tD);
|
||||||
|
}
|
||||||
|
if(i == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
i--;
|
||||||
|
byte >>= 1;
|
||||||
|
} while(1);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
static unsigned
|
||||||
|
owreadb(void)
|
||||||
|
{
|
||||||
|
unsigned result = 0;
|
||||||
|
int i = 7;
|
||||||
|
|
||||||
|
do {
|
||||||
|
OW_DRIVE();
|
||||||
|
udelay(tA);
|
||||||
|
OW_RELEASE(); /* Releases the bus */
|
||||||
|
udelay(tE);
|
||||||
|
if (INP()){
|
||||||
|
result |= 0x80; /* LSbit first */
|
||||||
|
}
|
||||||
|
udelay(tF);
|
||||||
|
if(i == 0) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
i--;
|
||||||
|
result >>= 1;
|
||||||
|
} while(1);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
/* Polynomial ^8 + ^5 + ^4 + 1 */
|
||||||
|
static unsigned
|
||||||
|
crc8_add(unsigned acc, unsigned byte)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
acc ^= byte;
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
if(acc & 1) {
|
||||||
|
acc = (acc >> 1) ^ 0x8c;
|
||||||
|
} else {
|
||||||
|
acc >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
ds1820_init()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned family, crc, acc;
|
||||||
|
|
||||||
|
PIN_INIT();
|
||||||
|
|
||||||
|
if(owreset() == 0) { /* Something pulled down 1-wire. */
|
||||||
|
|
||||||
|
owwriteb(0x33); /* Read ROM command. */
|
||||||
|
family = owreadb();
|
||||||
|
/* We receive 6 bytes in the reverse order, LSbyte first. */
|
||||||
|
for(i = 7; i >= 2; i--) {
|
||||||
|
ds1820_id[i] = owreadb();
|
||||||
|
}
|
||||||
|
crc = owreadb();
|
||||||
|
|
||||||
|
/* Verify family DS1820 and that CRC match. */
|
||||||
|
if(family != 0x10) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
acc = crc8_add(0x0, family);
|
||||||
|
for(i = 7; i >= 2; i--) {
|
||||||
|
acc = crc8_add(acc, ds1820_id[i]);
|
||||||
|
}
|
||||||
|
if(acc == crc) {
|
||||||
|
ds1820_id[0] = 0x00;
|
||||||
|
ds1820_id[1] = 0x00;
|
||||||
|
ds1820_id[2] = 0x00;
|
||||||
|
return 1; /* Success! */
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fail:
|
||||||
|
memset(ds1820_id, 0x0, sizeof(ds1820_id));
|
||||||
|
return 0; /* Fail! */
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
ds1820_temp()
|
||||||
|
{
|
||||||
|
ds1820_convert();
|
||||||
|
// wait max 750ms pin lo
|
||||||
|
clock_wait(CLOCK_SECOND);
|
||||||
|
ds1820_read();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ds1820_convert()
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
PIN_INIT();
|
||||||
|
for(i=0;i<3;i++){
|
||||||
|
if(owreset() == 0) { /* Something pulled down 1-wire. */
|
||||||
|
owwriteb(0xCC); /* Skip ROM command. */
|
||||||
|
owwriteb(0x44); /* Convert T command. */
|
||||||
|
OW_RELEASE(); /* Releases the bus */
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0; /* Fail! */
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
int
|
||||||
|
ds1820_read()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned crc, acc;
|
||||||
|
|
||||||
|
if(owreset() == 0) { /* Something pulled down 1-wire. */
|
||||||
|
owwriteb(0xCC); /* Skip ROM command. */
|
||||||
|
owwriteb(0xBE); /* Read Scratchpad command. */
|
||||||
|
/* We receive 8 bytes in the reverse order, LSbyte first. */
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
ds1820_id[i] = owreadb();
|
||||||
|
}
|
||||||
|
crc = owreadb();
|
||||||
|
|
||||||
|
acc=0;
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
acc = crc8_add(acc, ds1820_id[i]);
|
||||||
|
}
|
||||||
|
if(acc == crc) {
|
||||||
|
// store temp
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
ds1820_ok[i]=ds1820_id[i];
|
||||||
|
}
|
||||||
|
return 1; /* Success! */
|
||||||
|
} else {
|
||||||
|
return 0; /* Fail! */
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return 0; /* Fail! */
|
||||||
|
}
|
||||||
|
return 1; /* Fail! */
|
||||||
|
}
|
45
platform/osd-er-lp24/dev/ds1820.h
Normal file
45
platform/osd-er-lp24/dev/ds1820.h
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2005, Swedish Institute of Computer Science
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* @(#)$Id: ds1820.h,v 1.1 2006/06/17 22:41:16 adamdunkels Exp $
|
||||||
|
*/
|
||||||
|
/* -*- C -*- */
|
||||||
|
/* @(#)$Id: ds1820.h,v 1.1 2006/06/17 22:41:16 adamdunkels Exp $ */
|
||||||
|
|
||||||
|
#ifndef DS1820_H
|
||||||
|
#define DS1820_H
|
||||||
|
|
||||||
|
extern unsigned char ds1820_id[8];
|
||||||
|
extern unsigned char ds1820_ok[8];
|
||||||
|
extern int ds1820_init();
|
||||||
|
extern int ds1820_convert();
|
||||||
|
extern int ds1820_read();
|
||||||
|
extern int ds1820_temp();
|
||||||
|
#endif /* DS1820_H */
|
73
platform/osd-er-lp24/dev/key.c
Normal file
73
platform/osd-er-lp24/dev/key.c
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010 harald pichler
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the copyright holders nor the names of
|
||||||
|
* 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 OWNER 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
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides Raven KEY support.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Harald Pichler harald@the-develop.net
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "key.h"
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will intialize the KEY for button readings.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
key_init(void)
|
||||||
|
{
|
||||||
|
/* Enter is input w/pullup */
|
||||||
|
DDRF &= ~(1<<PINF1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This will poll run key_task() to determine if a button has been pressed.
|
||||||
|
*
|
||||||
|
* \retval True if button is pressed
|
||||||
|
* \retval False if button is not pressed
|
||||||
|
*/
|
||||||
|
uint8_t
|
||||||
|
is_button(void)
|
||||||
|
{
|
||||||
|
/* Return true if button has been pressed. */
|
||||||
|
if ( PINF & (1<<PINF1) ) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
50
platform/osd-er-lp24/dev/key.h
Normal file
50
platform/osd-er-lp24/dev/key.h
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010 Harald Pichler
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the copyright holders nor the names of
|
||||||
|
* 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 OWNER 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
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides Raven Key support.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Harald Pixhlwe harald@the-develop.net
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __KEY_H__
|
||||||
|
#define __KEY_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
void key_init(void);
|
||||||
|
uint8_t is_button(void);
|
||||||
|
|
||||||
|
#endif /* __KEY_H__ */
|
70
platform/osd-er-lp24/dev/led.c
Normal file
70
platform/osd-er-lp24/dev/led.c
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012 harald pichler
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the copyright holders nor the names of
|
||||||
|
* 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 OWNER 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
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides Raven LED support.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Harald Pichler harald@the-develop.net
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "led.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup relay
|
||||||
|
* \{
|
||||||
|
*/
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Turns the Raven LED1 on.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
led1_on(void)
|
||||||
|
{
|
||||||
|
DDRE |= (1<<PINE5);
|
||||||
|
PORTE &= ~(1<<PINE5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Turns the Raven LED1 off.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
led1_off(void)
|
||||||
|
{
|
||||||
|
DDRE |= (1<<PINE5);
|
||||||
|
PORTE |= (1<<PINE5);
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
52
platform/osd-er-lp24/dev/led.h
Normal file
52
platform/osd-er-lp24/dev/led.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2012 Harald Pichler
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * 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.
|
||||||
|
* * Neither the name of the copyright holders nor the names of
|
||||||
|
* 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 OWNER 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
|
||||||
|
*
|
||||||
|
* \brief
|
||||||
|
* This file provides Raven LED support.
|
||||||
|
*
|
||||||
|
* \author
|
||||||
|
* Harald Pichler harald@the-develop.net
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LED_H__
|
||||||
|
#define __LED_H__
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
/** @name LED Functions */
|
||||||
|
/** @{ */
|
||||||
|
void led1_on(void);
|
||||||
|
void led1_off(void);
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
#endif /* __LED_H__ */
|
79
platform/osd-er-lp24/node-id.c
Normal file
79
platform/osd-er-lp24/node-id.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* $Id: node-id.c,v 1.1 2007/03/23 09:59:08 nifi Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Utility to store a node id in the external flash
|
||||||
|
* \author
|
||||||
|
* Adam Dunkels <adam@sics.se>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "node-id.h"
|
||||||
|
#include "contiki-conf.h"
|
||||||
|
#include "dev/xmem.h"
|
||||||
|
|
||||||
|
unsigned short node_id = 0;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
node_id_restore(void)
|
||||||
|
{
|
||||||
|
/* todo */
|
||||||
|
/*
|
||||||
|
unsigned char buf[4];
|
||||||
|
xmem_pread(buf, 4, NODE_ID_XMEM_OFFSET);
|
||||||
|
if(buf[0] == 0xad &&
|
||||||
|
buf[1] == 0xde) {
|
||||||
|
node_id = (buf[2] << 8) | buf[3];
|
||||||
|
} else {
|
||||||
|
node_id = 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
node_id = 0;
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
void
|
||||||
|
node_id_burn(unsigned short id)
|
||||||
|
{
|
||||||
|
/* todo */
|
||||||
|
/*
|
||||||
|
unsigned char buf[4];
|
||||||
|
buf[0] = 0xad;
|
||||||
|
buf[1] = 0xde;
|
||||||
|
buf[2] = id >> 8;
|
||||||
|
buf[3] = id & 0xff;
|
||||||
|
xmem_erase(XMEM_ERASE_UNIT_SIZE, NODE_ID_XMEM_OFFSET);
|
||||||
|
xmem_pwrite(buf, 4, NODE_ID_XMEM_OFFSET);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
/*---------------------------------------------------------------------------*/
|
44
platform/osd-er-lp24/node-id.h
Normal file
44
platform/osd-er-lp24/node-id.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*
|
||||||
|
* Author: Adam Dunkels <adam@sics.se>
|
||||||
|
*
|
||||||
|
* $Id: node-id.h,v 1.1 2007/03/23 09:59:08 nifi Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __NODE_ID_H__
|
||||||
|
#define __NODE_ID_H__
|
||||||
|
|
||||||
|
void node_id_restore(void);
|
||||||
|
void node_id_burn(unsigned short node_id);
|
||||||
|
|
||||||
|
extern unsigned short node_id;
|
||||||
|
|
||||||
|
#endif /* __NODE_ID_H__ */
|
264
platform/osd-er-lp24/params.c
Normal file
264
platform/osd-er-lp24/params.c
Normal file
|
@ -0,0 +1,264 @@
|
||||||
|
/*
|
||||||
|
* 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 WITH_NODE_ID
|
||||||
|
uint16_t node_id;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#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(rimeaddr_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(rimeaddr_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/osd-er-lp24/params.h
Normal file
108
platform/osd-er-lp24/params.h
Normal 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 "ATMEGA128rfa1"
|
||||||
|
#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, 0x0b}
|
||||||
|
#else
|
||||||
|
//#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN}
|
||||||
|
#define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x0b}
|
||||||
|
#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__ */
|
93
platform/osd-er-lp24/slip_uart0.c
Normal file
93
platform/osd-er-lp24/slip_uart0.c
Normal 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);
|
||||||
|
}
|
||||||
|
*/
|
Loading…
Reference in a new issue