From 92b835080b8bd9c0f88f0d0a788648ef5d4bc9fc Mon Sep 17 00:00:00 2001 From: harald Date: Tue, 30 Oct 2012 14:37:05 +0100 Subject: [PATCH 001/345] initial upload --- examples/osd/README | 13 + .../Makefile | 88 ++ .../er-rest-example-toggleboard-ds1820/README | 88 ++ .../er-example-client.c | 173 +++ .../er-example-server.c | 1129 +++++++++++++++++ .../er-plugtest-server.c | 561 ++++++++ .../project-conf.h | 67 + .../er-rest-example-toggleboard-ds1820/run.sh | 7 + .../server-client.csc | 227 ++++ .../server-only.csc | 189 +++ .../static-routing.c | 155 +++ .../static-routing.h | 20 + examples/osd/rpl-border-router/Makefile | 50 + examples/osd/rpl-border-router/README | 13 + .../osd/rpl-border-router/border-router.c | 391 ++++++ examples/osd/rpl-border-router/httpd-simple.c | 262 ++++ examples/osd/rpl-border-router/httpd-simple.h | 74 ++ examples/osd/rpl-border-router/project-conf.h | 55 + examples/osd/rpl-border-router/run-test.sh | 7 + examples/osd/rpl-border-router/run.sh | 7 + examples/osd/rpl-border-router/slip-bridge.c | 153 +++ platform/osd-er-lp24/Makefile.osd-er-lp24 | 32 + platform/osd-er-lp24/button-sensor.c | 45 + platform/osd-er-lp24/contiki-conf.h | 347 +++++ platform/osd-er-lp24/contiki-main.c | 601 +++++++++ platform/osd-er-lp24/dev/ds1820.c | 290 +++++ platform/osd-er-lp24/dev/ds1820.h | 45 + platform/osd-er-lp24/dev/key.c | 73 ++ platform/osd-er-lp24/dev/key.h | 50 + platform/osd-er-lp24/dev/led.c | 70 + platform/osd-er-lp24/dev/led.h | 52 + platform/osd-er-lp24/node-id.c | 79 ++ platform/osd-er-lp24/node-id.h | 44 + platform/osd-er-lp24/params.c | 264 ++++ platform/osd-er-lp24/params.h | 108 ++ platform/osd-er-lp24/slip_uart0.c | 93 ++ 36 files changed, 5922 insertions(+) create mode 100644 examples/osd/README create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/Makefile create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/README create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h create mode 100755 examples/osd/er-rest-example-toggleboard-ds1820/run.sh create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c create mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h create mode 100644 examples/osd/rpl-border-router/Makefile create mode 100644 examples/osd/rpl-border-router/README create mode 100644 examples/osd/rpl-border-router/border-router.c create mode 100644 examples/osd/rpl-border-router/httpd-simple.c create mode 100644 examples/osd/rpl-border-router/httpd-simple.h create mode 100644 examples/osd/rpl-border-router/project-conf.h create mode 100755 examples/osd/rpl-border-router/run-test.sh create mode 100755 examples/osd/rpl-border-router/run.sh create mode 100644 examples/osd/rpl-border-router/slip-bridge.c create mode 100644 platform/osd-er-lp24/Makefile.osd-er-lp24 create mode 100644 platform/osd-er-lp24/button-sensor.c create mode 100644 platform/osd-er-lp24/contiki-conf.h create mode 100644 platform/osd-er-lp24/contiki-main.c create mode 100644 platform/osd-er-lp24/dev/ds1820.c create mode 100644 platform/osd-er-lp24/dev/ds1820.h create mode 100644 platform/osd-er-lp24/dev/key.c create mode 100644 platform/osd-er-lp24/dev/key.h create mode 100644 platform/osd-er-lp24/dev/led.c create mode 100644 platform/osd-er-lp24/dev/led.h create mode 100644 platform/osd-er-lp24/node-id.c create mode 100644 platform/osd-er-lp24/node-id.h create mode 100644 platform/osd-er-lp24/params.c create mode 100644 platform/osd-er-lp24/params.h create mode 100644 platform/osd-er-lp24/slip_uart0.c diff --git a/examples/osd/README b/examples/osd/README new file mode 100644 index 000000000..7398f72c6 --- /dev/null +++ b/examples/osd/README @@ -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 \ No newline at end of file diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/Makefile b/examples/osd/er-rest-example-toggleboard-ds1820/Makefile new file mode 100644 index 000000000..ea3722d59 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/Makefile @@ -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 diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/README b/examples/osd/er-rest-example-toggleboard-ds1820/README new file mode 100644 index 000000000..06283dc5e --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/README @@ -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) diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c new file mode 100644 index 000000000..d1d543cf0 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c @@ -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 + */ + +#include +#include +#include + +#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(); +} diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c new file mode 100644 index 000000000..ee2aabb4a --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c @@ -0,0 +1,1129 @@ +/* + * 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) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 1 +#define REST_RES_HELLO 0 +#define REST_RES_MIRROR 0 /* causes largest code size */ +#define REST_RES_CHUNKS 0 +#define REST_RES_SEPARATE 0 +#define REST_RES_PUSHING 0 +#define REST_RES_EVENT 0 +#define REST_RES_SUB 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_LIGHT 0 +#define REST_RES_BATTERY 0 +#define REST_RES_RADIO 0 + + + +#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" + +// todo OSD-Testboard move to platform/dev +#include "dev/key.h" +#include "dev/led.h" +#if REST_RES_DS1820 +#include "dev/ds1820.h" +#endif + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_LIGHT) +#include "dev/light-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_SHT11) +#include "dev/sht11-sensor.h" +#endif +#if defined (PLATFORM_HAS_RADIO) +#include "dev/radio-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + + +#include "dev/key.c" // todo: move platform /dev +#include "dev/led.c" +#if REST_RES_DS1820 +#include "dev/ds1820.c" +#endif + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index," \"name\" : \"Button,LED\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +// mybutton +/*A simple actuator example. read the key button status*/ +RESOURCE(button, METHOD_GET | METHOD_PUT , "button", "title=\"Button\";rt=\"Text\""); +void +button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname[17]="button1"; + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); + if(is_button()) + index += sprintf(temp + index," \"state\" : \"on\"\n"); + else + index += sprintf(temp + index," \"state\" : \"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname, name,len); + bname[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "led1", "title=\"Led1\";rt=\"Text\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +#if REST_RES_DS1820 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(ds1820, METHOD_GET, "DS1820", "title=\"Temperatur\";rt=\"Temperatur\""); +void +ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; + int grad=0; + int kgrad=0; +// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ + kgrad=5; + } + grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d °C",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d °C\"}",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DS1820 + +#if REST_RES_HELLO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *len = NULL; + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; + int length = 12; /* |<-------->| */ + + /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ + if (REST.get_query_variable(request, "len", &len)) { + length = atoi(len); + if (length<0) length = 0; + if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; + memcpy(buffer, message, length); + } else { + memcpy(buffer, message, length); + } + + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ + REST.set_header_etag(response, (uint8_t *) &length, 1); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer. */ + strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); + + /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. + * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); + } + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); + } + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); + int index = 0; + for (index = 0; index 03 */ +#endif /* CoAP-specific example */ + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); + } + + if (strpos >= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + coap_set_header_uri_host(response, "tiki"); + coap_set_header_observe(response, 10); +#if WITH_COAP == 3 + coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ +#else + coap_set_header_proxy_uri(response, "ftp://x"); + coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ + coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, TEXT_PLAIN); + coap_set_header_if_none_match(response); +#endif /* CoAP > 03 */ +#endif /* CoAP-specific example */ +} +#endif /* REST_RES_MIRROR */ + +/******************************************************************************/ +#if REST_RES_CHUNKS +/* + * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation + * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, + * the byte offset where to continue is provided to the handler as int32_t pointer. + * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. + * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) + */ +RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); + +#define CHUNKS_TOTAL 2050 + +void +chunks_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 = 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); + + /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 +/* Required to manually (=not by the engine) handle the response transaction. */ +#include "er-coap-07-separate.h" +#include "er-coap-07-transactions.h" +/* + * CoAP-specific example for separate responses. + * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. + * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests. + * The resource handler must store all information that required to finalize the response later. + */ +RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\""); + +/* 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[16]; +} 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) +{ + /* + * Example allows only one open separate response. + * For multiple, the application must manage the list of stores. + */ + if (separate_active) + { + coap_separate_reject(); + } + else + { + 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. */ + + /* + * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2). + * Extend the store, if the application requires additional information from this handler. + * buffer is an example field for custom information. + */ + snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo"); + } +} + +void +separate_finalize_handler() +{ + if (separate_active) + { + 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)) ) + { + 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); + + 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 + { + /* + * Set timer for retry, send error message, ... + * The example simply waits for another button press. + */ + } + } /* if (separate_active) */ +} +#endif + +/******************************************************************************/ +#if REST_RES_PUSHING +/* + * Example for a periodic resource. + * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions by managing a list of subscribers to notify. + */ +PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND); + +void +pushing_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); + + /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */ + const char *msg = "It's periodic!"; + REST.set_response_payload(response, msg, strlen(msg)); + + /* 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 +pushing_periodic_handler(resource_t *r) +{ + static uint16_t obs_counter = 0; + static char content[11]; + + ++obs_counter; + + PRINTF("TICK %u for /%s\n", obs_counter, r->url); + + /* Build notification. */ + 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 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, obs_counter, notification); +} +#endif + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs"); + +void +event_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +event_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_BUTTON */ + +/******************************************************************************/ +#if REST_RES_SUB +/* + * Example for a resource that also handles all its sub-resources. + * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. + */ +RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); + +void +sub_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); + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_sub.url); + + if (len==base_len) + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); + } + else + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); +void +light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); + uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_LIGHT */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + + +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO +/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); + +void +radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *p = NULL; + uint8_t param = 0; + int success = 1; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((len=REST.get_query_variable(request, "p", &p))) { + PRINTF("p %.*s\n", len, p); + if (strncmp(p, "lqi", len)==0) { + param = RADIO_SENSOR_LAST_VALUE; + } else if(strncmp(p,"rssi", len)==0) { + param = RADIO_SENSOR_LAST_PACKET; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success) { + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + + if (param == RADIO_SENSOR_LAST_VALUE) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); + } else if (param == RADIO_SENSOR_LAST_PACKET) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } + } else { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +void +hw_init() +{ + key_init(); + led1_off(); +#if REST_RES_DS1820 + ds1820_temp(); +#endif +} +#define MESURE_INTERVAL (10 * CLOCK_SECOND) +#define READ_TIME ( 2 * CLOCK_SECOND) + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ +#if REST_RES_DS1820 + static struct etimer ds_periodic_timer; + static struct etimer ds_read_timer; +#endif + + PROCESS_BEGIN(); + + + + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_button); + rest_activate_resource(&resource_led1); + /* Activate the application-specific resources. */ +#if REST_RES_DS1820 + rest_activate_resource(&resource_ds1820); +#endif +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if REST_RES_HELLO + rest_activate_resource(&resource_helloworld); +#endif +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif +#if REST_RES_CHUNKS + rest_activate_resource(&resource_chunks); +#endif +#if REST_RES_PUSHING + rest_activate_periodic_resource(&periodic_resource_pushing); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT + rest_activate_event_resource(&resource_event); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3 + /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */ + rest_activate_resource(&resource_separate); +#endif +#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) + SENSORS_ACTIVATE(button_sensor); +#endif +#if REST_RES_SUB + rest_activate_resource(&resource_sub); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT + SENSORS_ACTIVATE(light_sensor); + rest_activate_resource(&resource_light); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO + SENSORS_ACTIVATE(radio_sensor); + rest_activate_resource(&resource_radio); +#endif + + /* Define application-specific events here. */ +#if REST_RES_DS1820 + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); +#endif + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); +#if REST_RES_EVENT + /* Call the event_handler for this application-specific event. */ + event_event_handler(&resource_event); +#endif +#if REST_RES_SEPARATE && WITH_COAP>3 + /* Also call the separate response example handler. */ + separate_finalize_handler(); +#endif + } +#endif /* PLATFORM_HAS_BUTTON */ +#if REST_RES_DS1820 + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("DS1820_Periodic\n"); + etimer_reset(&ds_periodic_timer); + if(ds1820_convert()){ + etimer_set(&ds_read_timer, READ_TIME); + } + } + if(etimer_expired(&ds_read_timer)) { + PRINTF("DS1820_Read\n"); + ds1820_read(); + } +#endif + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c new file mode 100644 index 000000000..051b44be0 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c @@ -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 + */ + +#include +#include +#include +#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 = 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(); +} diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h b/examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h new file mode 100644 index 000000000..1c3dd8933 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h @@ -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__ */ diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/run.sh b/examples/osd/er-rest-example-toggleboard-ds1820/run.sh new file mode 100755 index 000000000..02b03a5bb --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/run.sh @@ -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 + diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc b/examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc b/examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c b/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h b/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h @@ -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_ */ diff --git a/examples/osd/rpl-border-router/Makefile b/examples/osd/rpl-border-router/Makefile new file mode 100644 index 000000000..43230a17f --- /dev/null +++ b/examples/osd/rpl-border-router/Makefile @@ -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) diff --git a/examples/osd/rpl-border-router/README b/examples/osd/rpl-border-router/README new file mode 100644 index 000000000..71d67edac --- /dev/null +++ b/examples/osd/rpl-border-router/README @@ -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 \ No newline at end of file diff --git a/examples/osd/rpl-border-router/border-router.c b/examples/osd/rpl-border-router/border-router.c new file mode 100644 index 000000000..3c3a60de5 --- /dev/null +++ b/examples/osd/rpl-border-router/border-router.c @@ -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 + * Joakim Eriksson + * Nicolas Tsiftes + */ + +#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 +#include +#include +#include + +#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 = "ContikiRPL\n"; +static const char *BOTTOM = "\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
");
+  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("
Routes
");
+  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("");
+      ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
+      ADD("");
+#else
+      ipaddr_add(&uip_ds6_routing_table[i].ipaddr);
+#endif
+#else
+#if WEBSERVER_CONF_ROUTE_LINKS
+      ADD("");
+      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("");
+#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("
"); + +#if WEBSERVER_CONF_FILESTATS + static uint16_t numtimes; + ADD("
This page sent %u times",++numtimes); +#endif + +#if WEBSERVER_CONF_LOADTIME + numticks = clock_time() - numticks + 1; + ADD(" (%u.%02u sec)",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(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/rpl-border-router/httpd-simple.c b/examples/osd/rpl-border-router/httpd-simple.c new file mode 100644 index 000000000..f34d5312a --- /dev/null +++ b/examples/osd/rpl-border-router/httpd-simple.c @@ -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 + * Niclas Finne + * Joakim Eriksson + */ + +#include +#include + +#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 = "" +"
" +"

404 - file not found

" +"
" +"" +""; +/*---------------------------------------------------------------------------*/ +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 */ +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/rpl-border-router/httpd-simple.h b/examples/osd/rpl-border-router/httpd-simple.h new file mode 100644 index 000000000..4a2efa30f --- /dev/null +++ b/examples/osd/rpl-border-router/httpd-simple.h @@ -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 + * Niclas Finne + * Joakim Eriksson + */ + +#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__ */ diff --git a/examples/osd/rpl-border-router/project-conf.h b/examples/osd/rpl-border-router/project-conf.h new file mode 100644 index 000000000..863552544 --- /dev/null +++ b/examples/osd/rpl-border-router/project-conf.h @@ -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__ */ diff --git a/examples/osd/rpl-border-router/run-test.sh b/examples/osd/rpl-border-router/run-test.sh new file mode 100755 index 000000000..310d66c78 --- /dev/null +++ b/examples/osd/rpl-border-router/run-test.sh @@ -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 \ No newline at end of file diff --git a/examples/osd/rpl-border-router/run.sh b/examples/osd/rpl-border-router/run.sh new file mode 100755 index 000000000..62fc0e6f6 --- /dev/null +++ b/examples/osd/rpl-border-router/run.sh @@ -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 \ No newline at end of file diff --git a/examples/osd/rpl-border-router/slip-bridge.c b/examples/osd/rpl-border-router/slip-bridge.c new file mode 100644 index 000000000..3b4d26af7 --- /dev/null +++ b/examples/osd/rpl-border-router/slip-bridge.c @@ -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 + * Joakim Eriksson + * Joel Hoglund + * Nicolas Tsiftes + */ + +#include "net/uip.h" +#include "net/uip-ds6.h" +#include "dev/slip.h" +#include "dev/uart1.h" +#include + +#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 +}; +/*---------------------------------------------------------------------------*/ diff --git a/platform/osd-er-lp24/Makefile.osd-er-lp24 b/platform/osd-er-lp24/Makefile.osd-er-lp24 new file mode 100644 index 000000000..63580683e --- /dev/null +++ b/platform/osd-er-lp24/Makefile.osd-er-lp24 @@ -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 diff --git a/platform/osd-er-lp24/button-sensor.c b/platform/osd-er-lp24/button-sensor.c new file mode 100644 index 000000000..4daf2237e --- /dev/null +++ b/platform/osd-er-lp24/button-sensor.c @@ -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); + diff --git a/platform/osd-er-lp24/contiki-conf.h b/platform/osd-er-lp24/contiki-conf.h new file mode 100644 index 000000000..409f02fcf --- /dev/null +++ b/platform/osd-er-lp24/contiki-conf.h @@ -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 + */ + +#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 + +/* 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__ */ diff --git a/platform/osd-er-lp24/contiki-main.c b/platform/osd-er-lp24/contiki-main.c new file mode 100644 index 000000000..66c7c1db9 --- /dev/null +++ b/platform/osd-er-lp24/contiki-main.c @@ -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 +#include +#include +#include +#include +#include + +#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 +#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< +//#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); +//
+ } +#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>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<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<"); + 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(" "); + 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 +#include +#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! */ +} diff --git a/platform/osd-er-lp24/dev/ds1820.h b/platform/osd-er-lp24/dev/ds1820.h new file mode 100644 index 000000000..e4178d63e --- /dev/null +++ b/platform/osd-er-lp24/dev/ds1820.h @@ -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 */ diff --git a/platform/osd-er-lp24/dev/key.c b/platform/osd-er-lp24/dev/key.c new file mode 100644 index 000000000..20d852c18 --- /dev/null +++ b/platform/osd-er-lp24/dev/key.c @@ -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< +#include + +void key_init(void); +uint8_t is_button(void); + +#endif /* __KEY_H__ */ diff --git a/platform/osd-er-lp24/dev/led.c b/platform/osd-er-lp24/dev/led.c new file mode 100644 index 000000000..1508cf48c --- /dev/null +++ b/platform/osd-er-lp24/dev/led.c @@ -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< + +/** @name LED Functions */ +/** @{ */ +void led1_on(void); +void led1_off(void); +/** @} */ + +#endif /* __LED_H__ */ diff --git a/platform/osd-er-lp24/node-id.c b/platform/osd-er-lp24/node-id.c new file mode 100644 index 000000000..8698b1855 --- /dev/null +++ b/platform/osd-er-lp24/node-id.c @@ -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 + */ + +#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); +*/ +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/osd-er-lp24/node-id.h b/platform/osd-er-lp24/node-id.h new file mode 100644 index 000000000..592379fc9 --- /dev/null +++ b/platform/osd-er-lp24/node-id.h @@ -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 + * + * $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__ */ diff --git a/platform/osd-er-lp24/params.c b/platform/osd-er-lp24/params.c new file mode 100644 index 000000000..aadbb83c4 --- /dev/null +++ b/platform/osd-er-lp24/params.c @@ -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 +#include +#include +#include + +#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 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;iSet 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 */ diff --git a/platform/osd-er-lp24/params.h b/platform/osd-er-lp24/params.h new file mode 100644 index 000000000..0b1e7c940 --- /dev/null +++ b/platform/osd-er-lp24/params.h @@ -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__ */ diff --git a/platform/osd-er-lp24/slip_uart0.c b/platform/osd-er-lp24/slip_uart0.c new file mode 100644 index 000000000..edff55385 --- /dev/null +++ b/platform/osd-er-lp24/slip_uart0.c @@ -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 + */ + +#include +#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); +} +*/ From 2b7e7b8f8c9824bbba27d2e227819ea5c0b0f6f3 Mon Sep 17 00:00:00 2001 From: harald Date: Mon, 17 Dec 2012 14:25:35 +0100 Subject: [PATCH 002/345] bugfix ds1820 --- platform/osd-er-lp24/dev/ds1820.c | 3 ++- platform/osd-er-lp24/dev/led.c | 19 +++++++++++++++++++ platform/osd-er-lp24/dev/led.h | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/platform/osd-er-lp24/dev/ds1820.c b/platform/osd-er-lp24/dev/ds1820.c index 88e395166..9de3fc8a9 100644 --- a/platform/osd-er-lp24/dev/ds1820.c +++ b/platform/osd-er-lp24/dev/ds1820.c @@ -59,7 +59,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_PIN_MASK _BV(PE3) +#define SERIAL_ID_PIN_MASK _BV(PE4) #define SERIAL_ID_PxOUT PORTE #define SERIAL_ID_PxDIR DDRE diff --git a/platform/osd-er-lp24/dev/led.c b/platform/osd-er-lp24/dev/led.c index 1508cf48c..8f330e13a 100644 --- a/platform/osd-er-lp24/dev/led.c +++ b/platform/osd-er-lp24/dev/led.c @@ -68,3 +68,22 @@ led1_off(void) PORTE |= (1< Date: Mon, 17 Dec 2012 14:26:49 +0100 Subject: [PATCH 003/345] initial upload --- examples/osd/wirelessplug/Makefile | 88 + examples/osd/wirelessplug/README | 88 + examples/osd/wirelessplug/er-example-client.c | 173 + .../er-example-client.osd-er-lp24 | Bin 0 -> 420429 bytes examples/osd/wirelessplug/er-example-server.c | 1078 ++++ .../er-example-server.osd-er-lp24 | Bin 0 -> 424344 bytes .../er-example-server.osd-er-lp24.eep | 4 + .../er-example-server.osd-er-lp24.hex | 4668 +++++++++++++++++ .../osd/wirelessplug/er-plugtest-server.c | 561 ++ examples/osd/wirelessplug/project-conf.h | 67 + examples/osd/wirelessplug/run.sh | 7 + examples/osd/wirelessplug/server-client.csc | 227 + examples/osd/wirelessplug/server-only.csc | 189 + examples/osd/wirelessplug/static-routing.c | 155 + examples/osd/wirelessplug/static-routing.h | 20 + 15 files changed, 7325 insertions(+) create mode 100644 examples/osd/wirelessplug/Makefile create mode 100644 examples/osd/wirelessplug/README create mode 100644 examples/osd/wirelessplug/er-example-client.c create mode 100755 examples/osd/wirelessplug/er-example-client.osd-er-lp24 create mode 100644 examples/osd/wirelessplug/er-example-server.c create mode 100755 examples/osd/wirelessplug/er-example-server.osd-er-lp24 create mode 100644 examples/osd/wirelessplug/er-example-server.osd-er-lp24.eep create mode 100644 examples/osd/wirelessplug/er-example-server.osd-er-lp24.hex create mode 100644 examples/osd/wirelessplug/er-plugtest-server.c create mode 100644 examples/osd/wirelessplug/project-conf.h create mode 100755 examples/osd/wirelessplug/run.sh create mode 100644 examples/osd/wirelessplug/server-client.csc create mode 100644 examples/osd/wirelessplug/server-only.csc create mode 100644 examples/osd/wirelessplug/static-routing.c create mode 100644 examples/osd/wirelessplug/static-routing.h diff --git a/examples/osd/wirelessplug/Makefile b/examples/osd/wirelessplug/Makefile new file mode 100644 index 000000000..ea3722d59 --- /dev/null +++ b/examples/osd/wirelessplug/Makefile @@ -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 diff --git a/examples/osd/wirelessplug/README b/examples/osd/wirelessplug/README new file mode 100644 index 000000000..06283dc5e --- /dev/null +++ b/examples/osd/wirelessplug/README @@ -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) diff --git a/examples/osd/wirelessplug/er-example-client.c b/examples/osd/wirelessplug/er-example-client.c new file mode 100644 index 000000000..d1d543cf0 --- /dev/null +++ b/examples/osd/wirelessplug/er-example-client.c @@ -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 + */ + +#include +#include +#include + +#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(); +} diff --git a/examples/osd/wirelessplug/er-example-client.osd-er-lp24 b/examples/osd/wirelessplug/er-example-client.osd-er-lp24 new file mode 100755 index 0000000000000000000000000000000000000000..75f76b867b3088735f5a09ca65e1622030c91127 GIT binary patch literal 420429 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

=Y&5gPDU-qFQtrSFba&7kYEn#pYmsfP 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�Tf;cHxbM^9h;lT$ewQ$UQ~G}m;~y1b+}3%= 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ӎn|7{1nys?`BehXA8CG#AdJti5rj0qMiA2c3W3)zVWr` zr1`Z0Z@;AZm4VPcep_HokUxGnU}-?}0|AQynjZjI5YT+xKcxAZ|GPmr-{D^o(0pIN z9MF9EzS-z}{al-mvi?7^{(>}LGY615A)*U2XZG+!%!F`)U<_`ZN{e1J7U zK=bWwFE8rni`s7o;e2J<%P(*5zJCY)hH&p6Nb{xOH!Xf%{v(7hc$n2MX}(`N-Q-F0 z{nDqZG=HS|Ug#G=IA6xx63~2^^8BwddA|AN<;D1opq~xo`C3zTK=a+DLw}sb=bHw# z7M{0%2oZU6-u;m@Z_2MSdD6TG@BU7jSKWQRk=J(-;k>53%;J;gwQ2yVU(&oTeWog- zd9C=7h3ECn`ZM&OI1HKfgzy@K^D65N3n$HcrMN#P>E-oxAe^`SynaaYmYVj#!rNe}P)WK6 z`irGXp}TLSw7bxU@9hi}%gIQ&ztA^0Tqz6`OUZEmYefjwwYD}lt*vWs+SpQPZff~$ zp>bo|hPw8oyK`Wm3omFFdO9neeyg)k=_})d=mkm8k|>UK?im^=CdKj+Lzid>Zb7fz zSl3!;-Q1oG43>6Q%YP%K;r^YaVoxZz?k<+3T*8cQVzn@%Qa|+#%?<4hEUQZI$Uwo% zEcKe_`UdwDpX=)^cMkMC2mQN>yDP=#28Vl=*ar!pvw9yU^SM|0%f*4>@bJ*U$j+$p zwiY(7Y1&#?)6`Pe_Hq;=_Jnnd?+q0ChnDk}Va`R@Z`#J@q+A4YZ4ha^!D z{k?@fot5rBDQPKG(b2Z49T%31J#fN-0c#8!!4qp*o9mid#A%9U%Z)V9p}}$`+0sx9ZjYDs-!DzT~uT|FC1wO=mDhR;=5qOojcL^Umao(plv!C z?nA=WX_nbeLZ4~a+7!`s?He~p>4icY*S0sb7dExGHPmfzPZo2tGFglI8|X%|8LLIA zv{YFEZfkqt<)((_`a)xK-AigNy-b>#nj7^Fh!LhwpJqoe)LGHGVB`EvEu_R9q{XKt zmkLRBFe;jAVdubLSLZ;1&V^!1c7nBMuu?1xkM#ETk7aa!PtxC0s0@naFf1+g_U{}i z7YpUVkxGAQr#R`r0QJBJ#?YIo0`pt4k{;>hl+Vttzk7+rM&F5;qN`Y-XlbygSU{R| zeZ81lV0S9&O(nG@v~}2QqO4kg0uTilB6iycK@04c^xL3?p<)RiEZeCc{^j+14?q!Q zQpK?$H0_=stkMZrWxMO?@9oX_+Ix%7ckb-$FC~>8>KqxuPy&bJ`!(*>-6Q2P>NfWp z4&GXO&OTe(or>Df<0h8}yIDU*4p#<;9GB7-W3`1yf+pA5vugyVuxz!zNaG_bYMOEK z3UXSdB8EBOux|U%PwBuj?A>yLFXk{9-@CCsh}97Y!%=q*X;;?0XNW2it9)sg5)z0P z@M9mT^m2^ArBc#g>aX;74(vfWP&s*J4uCRb_YdPWOG*?a5awv4PWntiYMGHbhgdD0 zcsmL8f++%6ZU#*v-B%eb4I~57F~#qm@U1RLEQhzG<8D3rxlUP!4%2H3EG$^@aD6MAnJ+aZuRx&!!-z$}sz>6@i zfwTAT0UwhVr0=my#a9HEUyWsMWmbU(ktR3%s#-!u5Wc5#tf#Z5g#47dwS|cu^W4;S z6ajjFP6ISA{k+U?nPn2qpS4VTXr3TUDadeI zAn+QLVd6m|YsRq@4Nb*MgK)WF_}%l%#dtAMB0(e&)=Wu>m@f`X4;YjOYWX*{5>=|p zA`jCi&<8Rq{?Q*S8*ml(BWa)Rv9!%`D||Osw9x6)r78*QK$w_;GV#DiEqzpZg$`}* z$+Dp-VdKPPM5dmRTZ?PJ8#qnv#f)Ka=vB9twWbw6jABl!hU{W@=1lbZL_JqaFEs*A z>vp7>K^0i(nQ4fMVFNR}J%gh%jHHFqIUtkp0zOkGd7)i&B5C8EIaI4pV9A0pg>v_( zR0WJK7suGz=tSaC9DXD^Y?L;ZIk&WN_Buh%q(N7bfqtw{_Ebj1+uSi>m5FNJwY1O< zRsSA(TL19KFa{$UrZvnkEmG#btG}|Ra|pc}`*rj>{ewOIn025IwVzYP-Z_8|J@gpG zWNt4to_P-h`iDlB7cjiDad!6=G5_lwM5gE%=tFdBsB0~;i`g!9g}G+W$|;x4BGWpB zZd1$R>?#j-_H?sJ)4o>BL@}vqYT-Ic&Eq^p<$Fg;-D2m6cQUlb-AJW1m4RYs8OyFh zZ+UQ!sX^Ism4{)ZQY@D+>5*znO&4PmDGFaeV(x?yzkMwhbsL+TO$`TncGO}A-Wo)I zmFmD$U<8S3ev{I$F3YkC3su0{+&qB8i{t_03x+?R4wWjH@k$5IIzf-Lyr30EXV9c1 zU0cEAXAoK{X+O?RP>uHS#J#|rk43b(-m=_3EX9JEbT(dwNm@>6iB*5za{aO+Tb|C^ zhbkEOy^~K1PPC_vD{T`KzQNri@afJ`6sa34qYe5JZ=YO>mlr5}W zBEmL)TUnON@M`nN3CH^-B8W&8OkAw{9>V$%j#UJQ?ays7mEC=V7|C>En2iHLdXjOa z)A6a)gZ9&DgW<%6Km=y=4;O|92l~4)*U=tVNrmdpLd6me6`jovBir*hxpnsd5<=BN)>%E*HM zQpPa$Bf7BwD|aVIr2uLV*Bmad6M-;-xK5$GCm9@&B^nLnio4KjuF=^8cd7Kt#!@&r zq)n#Y1~771@?um!7I0jCa#UB*zwyUa0|2Ml$xYvgT!rf5Nz_h9;r;dZQo zbwnDOX2J_R4Gvo@l1#wNlhv)cq|Y_dSXNdnorxO_tYBktCqtsh2KtF%%wVvmlq#Y% zxsov5fsJYr6O+g+s$^7DdoD;ITe=ot3An$QD-=4p1(@|^6tOjX~ENtMP5Pot3QQB*DM{ z3hF*jvZgo$G)wMVLuI}Z+3x%56q_u71 z)|Z=FUMjR~#3t9~*4B+}?G5$G=9UyMY^bYmsw;5wFWFMp+*DtvE!6xbKLL?VxN@<( z*pFW13DFD73eUfw`(Ltk#WL^#)VJn!3vFYo?A>o%!>lwUZgG3lhK7xpF`_Ojg?{eP zv(wWZ5zg~QhLa5q?dvwy%l^D>k6{Qz4^;N ztI=Y+>V4!?; z0F!PlaIYGS$XMVoyGBBybJ1Jr zCbidroiv12N?q2quY>7oF4BG>%12{E3)*KZouD*`y_Q$8liD@hUGDEHmUVyDQsc>% z+Q#-Re!oWw3cC!wog)KS2L>J*8nLE%ayZGNz2aHNc*A(<(1D#-&ob2Es@2D42qFs0`36q?5}LQ}$_iLC|E zT$<3kY^xI^#dk)5lw@{qOuhK3Cr+g_IL z#?B};w{$X`vt=Dhf_W)BZ7JD&kLgzNT*zBt=nLBW$*7{JP3-AMOeM_7hPtf<9NC7>^9CqGcQ` zz$=s9{sC+qNR}HnZf>d9;@3_QZvLbs*kFE>)dWwZv&tVXNF8KK+3uEklNmRdg~K!k z+F~y{CM=JoGQ*stxo>4}llBN<+G$7EwOf;8<>b0Dj1-tyh?fN&9X1p62--u+*p}z{ zI<{8qU?3mTi4EdcJq#;U9^13w=T&1bCq4Zd7dY4@6E$vt^BASD2MY{Q5Lk|V>;g{v z5^ge1n1UaeWz*9q`yCuk^mAmyVpGl$6Wec)Jd87u$Mnj?v=fJpd(aX0d%iPWwq=D< z7?%MbMGD$)l{)tnC(K7qE?*8}2=~aXlL(4PPRWxV&hEViu$_U;ch8|z*0`+ssV~;C z*kpv)m#t^l$oaYt5@eBUZp6yKlhRCxpM@ohg9zEo>>pP^sU4{@Yk@MY$d?18OM@lk zO%@jtI<(si=hjP_=~SCF0e2+f4-D=s)J{|)dENcEeu2_45AVgatXM!tjjh_$u+dI5 z7f$cW1M;$54VzJD#DFTb!``gjZfe~zv<5VOy zz|7UCnJTHXLTaznJL8#nKhAx|GHFXV=p3w>s`xm;d~3#i4$N^fqbAHq;8l8s#+qYx zWg(Cl-LRTcIzd*HDLcsIgk9~E zn~r5a)f8Tc!s4EuAuITF`n8kCa@e;Rj_ywRNEAdLzquxf=n+6Dr@7-~IN&A$9%|z5 zn(E=+{F7q%$e5lh+s1VPSG`8Cqahlk-3H10ZMyO$f&4J~^^nxfqlm-p#qlyKDD(1u zo9mkwm$Bi=eUX?{9!6Uq$RUfGA?8~)qmxqqv z^n~>>K^(o&Heoc~ZIw(+5K-M<1K7XFV6GW78@z%eW;vM3$UG6kSS8|48#)9z?M;Vz zlw=$g6R$XX8a#nL1yIIWhsN-xHr8P2Q3m|du!OrsJt>*#=Td|JA7Ry^Z41yp8i4SGk+%1hwr8* zni;e`>>*=H08bex_Q+mqQpVn$)E_dl0)o5%iw!v3;-j(YT7GNDYZy4Y zcY8c(dZ7xmDX5^YvaQ0IJVi~dpyLR>)(-c~)W}{ZcD{=^#Vrrl;?g9(`N`ul96F&k za7Ham6&t`|2fqhjc%_Up*RCi6mMIcXRZ^}7sPOB>{X9-6+TYUbk zZB~@OS#Er+@o^cEr+SiFsug?Pa(8M32Pn9gOWX(8LQRf-KGR$KLeks2hY9r$b|tTH zY1D&0OV@NM>3wG=P%d^24u;nkhen?394(_i@<_;uqq?7*QgUZe`xJUZr98&;aEGf^ zZhWlS+*qhMkYqrqLB{R7Dm`t+m?rwtnm?OU<6#_P(tcx?^MO?5oa=);H! zTrTd+E7?%DR<1$^y6fw)Q@^R9rM{sp{p3F` z!d8%qxLY7f^Ve-`-IQ6n@wbT%6M6>(y}b1HxTrqJLoW-ID*!4d13-BM*Po3Z?#H_f zMy>!jw>^tJsw3DdW_$ zJSHxbH- z70fp7g^l-Gt2dUBf=S;0a8z)+wyr?m#pHeX z)#4cZDrYI19X(ar$c85LB{-@vow9Q0?M!R3I6g(radzlo=}i>pcWq64ok+b(GtX<_xFU(m3_!YZ4@X10yE|n{6l>Wer(2$rF=&`T zh~4|k4LpU;o7XHIa)Ft(U#BVP1jt(^Qq`is@s=D24an}}IDbR|n-RQ|h1CKs9S&mB zhKY-M;~F?N4Txrh?kl<4vRcC6Bz8&Ri2s_eRK|P~9Tx`k*@h!pO%auco()4fe;I)d z2^Y(X#iA?)vbOClO-5s>bQ_S^DNNLPq5CMQ4r|yLzr^?QYgg+j^wkTk!&f?Y7o~pO z)wqF&i-Db`k+5dyXE-@+K&RPe&G!{-yy2iN*9$baZm`V$u5BakT8!(uW%`k-Dh*;p zLDlsRj12c-WQj|!sqN3Ts!@s?8tOKoo$?gl62Qa>r-?>1wdjQn9D!{X8B{v5pZ1(q zGFuC4ar3o_jm?~cS)fy(jms!01ob1_X3N`<fX;3g85A(*>r@nRJ|fVb(e z(&uQPJeh;5Jvemc%nyBs_%I4UXAq)7XFXgi_Tj8Bk->W?_Ezc5b?(NakDSw5OGjU5 z#=zd7Oz>h9FHDYcosazmSYbP=vZ0Q?NB4AOjo>mm3AJ5&NLbW#t@Oe_&L-tAaItJ_ zs2Bc;Ok*YMoX_IqI8BaiQ$kg_q$hMJq}-pG0YY&!k28uZR$0-fEc%ZuWQCpO z4Qtrvcz2qD@*l&IErRFe|A}q`r_$1~KwL%_X(Jfq+UuIRWvNcy>2Z%t*Z$$c?V?mQG-9SXQb1 zUfT5yjp&rn()}GvVZSW3Dcw5@yKGmYtTigl=YbN*uR<^aSDhltlTl;*+u_oe+7r6K>xVxC_9OTwcd9Vw$j`yv?+AZ*n2@T_d#!f|a z??JZAB%@)G%S@vbW~gy9USCPwk*l)IC&d^YPs0Kp>SIqPHLhuyL#pAN;Y-nFeH{l> ztzT(KGM>n}4tA%lrh9NVf-knnu%_?F_Q=&*jGP)W*o%uBJNf1><;dk77hLb=Z)hfa zuq!L?88Q%!vWz|a!LD807n5}c8W>-j(f7aPZY^%i0m}X~gD@iK4QLTG4XkMF_o7|G zq3kj_^1>^>a8-FOr-iJRKTxDbdO+NgEI-fdfZbPMq|QF|LmfUDP$wJ znhdrD(}8Sg;5j4-kJpH7`I6uuUld~j>HT18!G@6)FOGZl1<}F?FLGKSHYd9NT3T(u|?0|bkTI=oWO^yD7;`1HcEWNtJMs9Mb-Us=<+ z{i_AkfF^^&1lMc8-6NIBD#y9QC~a)^M-M0S45 zDr1^@Pg_&4iDg=1G+EX~82HVd^mR=1rwqepEnE)1@~XcCp7*q*bLUP>AZd^|oTB1u z$mamZt|7eOyA#tf9@$s0YbYXeS{Y=U*JtSPL!JHQ1jjfiFEcqm)zD^w<1HLQmE@}_ z*a<=UR)eOKHOsjUy|=&AEe%f8X3Y+7%d!Vgn+2N`+o>v}At(~;5tC+NsK2u1;#C9J z%b6VZ)cJCrmjGT6$r3>)6SbsabVO;gX>!yOl%GrjXbO0v{n-8q1m%qwvszEuEaLc4 z2ZpopErBL9KxTvKNS^e{g}j}dc0&yG3846uL=khnGb>f--Q1TAtmSIh9a^IB#I-wS z*_%9Gyo`dAmNZ+E;Zz5w&%7?IxzyTKos16)`uAX7nA(lH(XO_{69se;_9X~&CfQB0 z0#lGq-DC=@CZq06#>>fzA~lNvVdZ%S0;QOQ$S|$zC|HY^oz!i#C7~C>>-soD#B?q! zLSL?%Dt#%E>3IP2NE+Q{5sPM`Z1Y(mW4Cz(ekZe%9=tKf5|+}|Aw*q2$YET@Qht2R zDr!W-dSSt;8d^EE8j&s>mz}vL;hlOMZQ_5tzf1uP`ThbT-r37g_U?T7mN$b^B_udx zm2ry8$mq)`qY3d%e4P?gk;Z*uKwd7xG7>ko^twF@B=|%~GNR|OEGXoF z?c0(E!(PT_DVy2Sw{c!TT5AK#WNLo%=c+5@%bn}30O)2B$5_6kUN%m^;EfD>50f+pd=WSvlX=!WY z=!M=CojGPy)XpmO`Ac}3mK*<<4E8R8-y#oLZx}>PhH5=6Dz)#8*o88@n2PlVUmEJ` z!po?9?UO>-0cRhfLh7iL@mE-T@McST(eTL=6MXrqvP5-Q7ujEeX1_fw`$Jsj4B$OQ zO*b|U{Q=5ex>eW&XR~^c;mvI0Xp6|~hqPgHfbf})H}H}KVKuIwN5NVJTL>9}UW97A zKS+88?agT*D#~}c?L8yT1WXO5#3Q8=Cb=og)*B{(P%MA2ytB`;ctoxS)g+92&XnD3 z{+HU(t2uH3x%{L1#ma_`T+>Vg~Hf0 zpBV!v;3~i#d52O->pdk1lQ(4!VVhPlytQjQ42@_j>>sE>Lv;jET=FDym^7Ge!qjm8 zOwy1u4#6;{*!%hH%k*BhWI?+&4?}yyl-RHLWZv!{xzi}-Kk}}-H@CPPq>{ae^t%8k zZmc*Ar%fTQdngv@UsWX8Ij3Y^8$4PPkubWsYQ+CC(7@`t) zS@@MY!D)1^QkfZ#kBW8FJ{CrK+q046#}|Z#B4*DBHdVMyDnppEJubQnbrjRZe93MV z*7dR>M24Zd8*YS`RvN~ON$i$VhE}(W4|L)JO?c778>I?N=+d&Su>^W594&>C1rKJB z7=tlECqQRCPA}VoiXfiJN-62C40qiy>}VUySnQ0rqmgkY>PWbqn@Z3u*>0su%qfak zd|*MG@wlmsPu64%``$~&iBm*zOZSz9XKH1;CDSCkBjZy<#$uJsM4*l&#y|F2nJ#9X zv!RTmhRf)jF>yYTm%_XepUKHYn1Knj$;E08^_ip?5=K?a@&$%SahjZ``YyNCB+7^b zbf8?ykrUc1y?mabn3MRZx?~O8;3U$1jcVC7v?ii&+$#;)v4fP$k6RySaJE)3b`x=u{TIp)+ z8wIlYr7y5lDwt>U9UFY9v>)Gy!e%{=(y<1YHBY+vkFK`ZtEtE~j(pG1Mqj+qhmyqV zg7(XP1wNIA6gA`MiIL^Po-yR47vFe5M&$qJee$Q#u`-kRG7F>m@)-~wdliOD_<|v3 z=+>fzXD_-)lz5zDBg+brojrB1|%$Cu7ZOEcoUkE*vhdTm&7dp*wh*<Ri|!Ccnz2>K<908DOfs5 z)6~*l8->XMP0X=#wIB^&_Vef!57hhl54+c(b;#Fw#OvfLLP|bC7d#RUxJ1973avuh z*HnkQd6Xcx=+l0MvsaP9DWiTNHH?8NEA{EV5bj*#%`_gk`A!s^r7(nZ8=8(iF?6Wd zXH&8VTk2#8dF=n~tx7({WsnNVX$TDKxvvZY>Icpxw-f&C? z6eol@QcDkDazTE(BVcooVH@z~qwRx(l^GC+e^43y>tmzJR|ZEHe>K8DeXqjboES7WEoTuCGJ7qNW>Ic%_^-J$1F zm%>C3iWWO_OC~u!XY4@&Ly$NAEy6Q3={s80f3%ADYxt)A)MWe7 zs=qu6Ec@ecFH|MH1Vad@!bd6rUKg}C6Vo4snVR$*ttuX^`WOM9;Bk6B#Gl3E^cGX$ zwCkbTBO<4UIiGMI9ygdjAi*Cca2lxm@rPsd#|3(iR_#1mrCP|@j%S8hr(xs_2{)7_ zXYV*!a`umt1w;NA@-7~?<{9K*o#dk9XjNxcoRm8$a+)Gg`MZSwFXNe!bRDhgK3b(^ zcom#lXopbtN!9>l{&x)aJEm% zbCI0KqRpDrr=JF~y?Gh*CdK}tx9gmlh^J!BJV&(I}aQ=)%UY`dE@D~G`IJ4&Q-OeuP zQM=UFsaN$VO+9NQUfklDKaHm?dmm`EPie-}^py7W$ZHdQ>b=BI3a$BYxnA(z6@Kjf zr@%WSe2q_>KT16{iS0WN-e-Xv@h>Kjy9(ZoK#usGKPVS_8SR~k$6GV;`9jBbd++OV z?00n>(efewslRW7#cI{1^|Gga~vY9R1?O(1LVcoM?Ie{JCH z2>8UcX<-Dy7*AYX3N*Zc_%^9R%>wZ*p*5U1-OG!_)5-K`)n$6rHK~U~hc{W`9YV*h zdk*%r3O`GKqV&ic5;-k;;@TAAq9X5uK#sV&Y%G_#uIi&3-3U^=FiG#;=6=a3yIf4rOOj<6k5ZHe;$N; z4hX}J5o+YuwY)}Lj-91WbJV|xb4u>5%;m^iC47}5-Y9h3(UR91$Pupy9eW6QhXOg` zXM|Rd{t!4jv;4q*FqPAEGr8D~yO6st@wMh30_Wnu%Mqmfu@ihz_;LIScyHiART7-S zGbwo!|LY&=_wjgf68})>xIumd9y=tLBd+s|Snd!yiX+llsJX=75?YI!xOPq&PW-fl zYl9-5AD3&Tp=vnsWkRby;wyz#eQenLF=8*C8^G@ft@6Zw5?b{UPl5*S<#HSOD+P8D zpSY9F>^dCiWx9WxbU29gNjhpD(-;eAw}&=971&AqMYQIrNjwXs+;%*edcF>DS<$Ni zHE6)#9s@Y7=*Iw86uk~`U(p8uv!EHW1loJ_E&{qnxuHovs~gS9md-)@w5d^ zMI4P6wpyf)!$dc?O0t?3Z&3Brl*3c}qE@(u-j z;x~j=R}JOP3SaFdeqQLfNq+*~1>vh*#4iaQ=l>>n_X9rhnKELizFENM2ejL9H2kAJ-s) zcLePtcnUob)F2W0n+I~Gu=)rdp>L~7{&IY1FGIhV(Cq||1?|lX#``sl^Bn|dSWl*v zLk^?IvaabnAdm1=C0)~C?pCq9YZn05j^N$^m?;)_%?DVn=wSd3Fc5G}Ga$HMSUVVc zN>LB32lAe<(%drsM|ixJiGMD1T+27X`!3y^Sh@T01BR7e9 z8%2+L4{^?;y;6zq3&O*AvxTp%fp|%1^&;XLPv>LAk4gF(ehT>MfOfspfXu|>yFf=kLJxT0MAFMlMj z;qg2YzbT!$K<*BBY>=++Y2fn%8o}~c4c_vAPyC+HT6e@B2(7+M{JS8W z_)kH2sCP{GT9?Gn2(6PW;%9?!;y(o8#8q$X3+>=@QjJcN^X4BF^;GwQWLF$4w%DQR zEL@$8vA)OSorg!=F$v2+JYHbL-w;|eK3+}@%jDvUV%%eaKH^^s9XFm^;5`cDi0_cj zBzHUl-W1_$eBy0F$Bk?fcr)-+B|8Xa30ffF<^i|_OO;Ddqg;Yj$|cyQT+eg|NbTXY zg%iJkCtrvc!MiGal_NfH%6K`>Z+8e^<=y}u?hSallv|Al6KH}yJid#??Syjy9Y)zD zeC?cxQ+BGIIS@Y(gcCm;gcCmzgcJWL2q&)Ts{SzD?INd(THm^<)c-^HD0{v zWfm9XsY*Il0JJC?YJCh$neersiGL+@Y{hrrB{H#B zIpR}<)(t)4^-kl^j(EG!+B%5qCJW>dPP{7!cYDYy318D8zF+9ro)h4G6vz>uJvGZ8 z@i{`9y_NuZ3j#jzg+gmSi1#`TJBg19t@$ASS`beBKoIWvAn%CqHGSgm2_5I-B6wE= zIpVjUAa@OXI6A@if_8XnKZ0BoOp}SP5PGw04-y}9y8UPs@hd`Wu84mVgcJWR2oKZY z6dhI&JP>qK82X~HdI%m0+7^bc7FHJl)rXrS%)(so;;HE}aGJ+)$+<7wEk~<<2WOH7 z6eh&AP<)7Z5uDrOxE_br{Dj9lcjB`#jqr7V%Pj@3UiezA#9M_{_aT1BX}AyZ4~5o( zCVnRf5B0WzkAfxmR?zKX=z58zT?+9nLgS1S2i(LzavCS6#IFmjsS>~8;W*MI{=jL- zhv{quA9Hqs?*x6>Lmz>h^T$~k5pNb+2N>dqgw|Ave;Yi=m4pbgSEN z7p(8_c%5B98kfZeEz_A0pCf51?eVDUDdERcGV-sBKApNBN%-xL>r+bo-wHvJQ{uoA?o#D#!Vu+#x*Z&3*uw z2@#+J0Nf!5dJy2Wq6n8i#%admJ2J#iLd2(K#2LlIB@+J2;%R$fy!S*d9u+9ZWt-1P z>w#-}TE@iRm3XnAFkY?1(=s{;oSE_o*H6HC9^mvk;2i(d( zT&{4+N}P}r$9RM#hx^Qw_#E&{!?`C*d&!?;#uA?(m8v61g}W>WuOi%n$GwgC5w)O- z@Hn37kUKg_b4B_jo_HIJ9PUcbu-j$Y8V%y1dg{cdBS-E(#CtV| zRfN0ns5PpKw3SBH=fJHrs)Ev}3Q7Ydt$#t8|LQnOW4hY&E5g}$;(U-pt6}l42yc&* zAjjPXUDHk!Vc5%>p;h^10BB(bfAZdb$FRAfG6C;<22(ui^u8l z@wClxQhrO~Db09`C0^Wbu^DjY>2>D%$X_q~c&}hh%8!@koL`<0`MCck|83!`9^&64 zw=8{6i!#SVM!k}_$zal=f0=&uKBo17^y_U$t2Q02BF;FmCx@|jNebF?G3~1XP5hx~ z!%QFZe~z!OW6Gay{efyO1LEL<%g<&txJoGdvf z@%Rjz`1|9e$XSYVi&H0On{c&$w8fD#hQ}=@enq4-ziJIR4}=?9PR@_xWXYM0!ElD% zKu`_j)Cf1!OU`QHhBlG2Bal@~$vJ?>EhWx5XWX{QIU`)HXN^nF7kIqQ5Wgi-p*7^p z9_K;i>=14!OU@7;w}$w>aZ=>yyiwy4r=P|(Lypc8Rf;%gORD z>d{)3#H|gXC)GdlzQyC^@BsK@p*79|c+Lep9=;su+>o^5ITf{`upp=Lh|dyQ{eyQM z76mlW^lt_*-)^E@O+cqYKvcha4{_du@Oiw;k=G@BwS)M1p|vD|%3mg@ZH#gs;qfvg z{;AM$Uzf#GI~eb*$mx8CxW?0Pkn*=3|G$SPzi~v_hr(BTiGPN^W@-}8yC`>GDicjm-9J|(;1oS4f(wG>0U*AtI#^bCcZ5Q z_ju%W2tU@xD-XKK9M8}>vp6|{Jo$P>L~D!q6_L~U#PtL&_Ac_i5V<)0Z^3)`1pfEJ zS3SgM%3M!-InNh)bAvfx$mg9nFDK&MmUb^C{$ddB@#ce9D}1fL<*8g;pNzX*L{up@sp1|i!*X<;JT4*g#;_nCHZYOzXgde9*{>Onl@hd{dmy&c z<5ixxZo{iS;+G^|tdG3Q!jJXc0q@}x_z#4ydWa8U4E6eQe`EYa_}U*%0?rkT&(1=* zyP{7=QR@3Kpo!}p%-HV7;O`K9T3=i-O>|e2ymv%S^LGpQ-GFvGDEBoU><3chj-p}c z7+5~`?**>6o8qzm1o({ZV=>iy6VR@YyvM?iOP&1hg|E3KJ|^oFt;I0@G~sLMP6u8N z=uqxk(WiD&-xQHkn)qI!x0K4ot%Gq-Nqo%*PZGWgXt#rMJcvN)QshfT z!_a+TdFdVm&ihDCyWDB;7~M;kYQ7F=mm}}C@Z-`Y|Do_Tx5TH*3@>i8e#^{4YceG|lUo@jeha%?I%XA{Xxta4pHh zgS?+!2LGDG*L>Xsen)7{Kk;c2Ps54JX@$KO*!pKI*p zSpInV5O2eZ3@ZW5BJ__kOGQT0B5pEieP?eiKQ=&i}koXTmt0BaH3c`uc!WumPqA>NG6FGIF zZ-LJjx!8dzR}ndNq`kn;2Q=epda;8uo^EoeV-Z(7wIVY+HJm!0lJqs4xZ0!PUNP@L z?h+oKoDruDUh%}Ih#qZN#Cgo-;jX6)xjDj*E8=FVPs^8fVSSAFaf3eyzS^OV#B?W0 zhk1Brg81Yw7QU7@@%2LMz|#!8HK5&Y##=6YYuLb73a#Ztd{q!mT=i;rrZ=vyXHz*H zU^BURdPJMHi2k@d$nO%q=7;!eLTi3r2fi<$JwI7IwTJO~MNaJ{-Y2w%6IZ<&p6QMA zvn`cV`!l&XKeTDT=#TSr9K16DpZE=-ZDIiYhk*9{Fy2SP*K#2KozUu!#5G>r&KU1Y zk<)zKOXcExW%@P$)c;uGX-7z0^=o)&*9nB-hSaA3R1ee-KY_X+Bd?s`T$cQExJ>J- zbmGtaDQRs$#J35p86$o=2q%6%2oKY1mGm^D#3_dn@85En^Wfc(w6*ex-xOLqJ>n07 zaN?8xgtlq;bl`I&ZKa7f3a$DM06!Ikd%7#3=Ogf|lFiOq1s1c8+vo)6@k~wh1_kjM ze_w(Y0W4OO;6ps#fe^o-K?Gk(kSZYlP=g3o&&qTYUxNq95)1@E#9!ASf>S{d@%J={ z;BpW|{3{J2NTjsX4C2!Qnm9`kX%j3Df`~V25W)LF5b^UGM6hahmKow(@IWEKaVdFA z+sc_`yG+bgwa;?A!($kNh3&95u~um+N%;m)SW4ZRK%xo`sF~{*HF`nP#`kbvpga>|6jp zt>F2))bKph@pBe*!SbGQWpWI$zZ++Pd-*ntpy}g&Yj0$ zO9)#~v*~c%jQtRg(@!c{wz7M8ya#suz@SvJ>kb|uG!$v!Q&%mJ@A_%7f(eGfd9V8>6DoG7eeclllY^#)T806@V4?T z(WA86(T8#LBp#k75njSmmGl!Zd*LC|eemW(C3%F+cpyrU7p(!W7Y{`V-@pS=g1qRD z;FaZ7YVB+f1HTf`KLWolhR2=pN$_vuVG@Kh@$L?{+W_t;`rbdlsD=mJ`v80)1?U+7 z+5ptc;AzM|#52Qg4rvK7`W*uMd-l*_(EFr#6Xq`e5KM;fyKNy4) ze=`Ut{yv@=c7m=GH*%QM{KAE~c(Tolk)u&Od7IaOw_f;aGx2tz)n?*bgK*;8f^gy; zK{)Z(@x(Th^O;Dghq6xQpnN?KteC3-?Ip^}n(_}Rr`8akC$vtsL%BJ^k6R?;&lSGr zE|gcjTBgKTi=5i$a%;eA7QUuWd~^aibT-M;c-&6n`p#Iqi?aayX979mD}~niCh^rm zYkENCZ#DjJ#^d^l_X(}~iSG)+fyy6w$MASO;tS=ZHMZ*-_}__~=6?ZX7KvP39^XTT z?>c$CJxT6|R8AW%<(5jkxFN3ruU`0?U*dc@(iic>c?Zz#hg$g~?~Q;@{Ibxoy_DN8 zeDw?BJUN$LP<+dS_-UunNfZB6Xsr+8Uj*S{`l`ofjga|VU;jIv#o{w@UcxP{j2TZ#=|ja$1y>Q-_I*j16F)=!@-n z5xjiEI3RLy!#xHbU+(k#5$E*?pF$w}@<+MzBByo}Unp|1-I<))O}Pak7u!vzoh$s< zZe9bqh{x?AK2PLgyBCAkDtvVn;unREU6OMA5}glQ#6J}}u9r+s?WWv$k&E+}$!W(= zxw9e{=Z{xH-WPtHzb)YDCy~@{;%7uI&fjO?-4wpc5r0;W{$qP6$9EJxf5e{=x!9h& z;6Ek&*q+ zQNJR7N#tVtDc3A~tsmlTLZcq>5)Sb%oW@Hgq5f9kYkd*d^zdQ>UW6e2xrBp;>xA)E z317>L`Y#5w%XNWQ626uT@pD3J`4K-KgnK+*{kR+Oi9bDs^{9591O9nH6TcDAp`JUU zN6Rnde=B?~uPnaOF2{7Qir%=sAAtW;5Wfa8`rf71%PG*b(YHaKq#vio<1YAN^@Vuq z7j6fKi2Q)Hd;&T0)(cqkmD?<6^{>{nhX6_nDXN;q6-51Cy+k@-g3!zJk-#QIjyNm{sNf%9mM~i;K6k-J=l28el z{Bg#)8jp9W!o+`VcqlaS-Vk%iY`Gc4PYNA(oQJ`CU-;_eK;`cu{{I4x$G-;rdO!n} zzkB$f4c+C4KP$ARLtH0ps-L*75MnzPK@Vr?ILRfbR}}xt-y8V<7#@TYoKh73%O7v_ zevSvBUjuxjD5tzXDvJN*kK_~>071S^Hdj%$*J?#gPMYsJWf7DF?F>U3!Scz9^M}Bz zh-e?dn4rBL`WncC8cJ|j&`tvTmIT2m<%V(I0LxRN^zneE6TTPF9*?{;c#u(N%>crt zp>{Twoe&xE-#US~0ySyo!W3CJMob%~iPCG)6PkwtK=lqM{J;W1q{$Cm^ z-zO}eg37~#tTqE|Rn!$N2FW|G$P`1{6(!iBs0+>o`IN9acxRTMeF%EKFF}4KtWHkl z_ThdZ(mMcfSW#DV5TX3$2I3x01v@BsLMHk2jQMBU#6Oe$L%IwEi{%?xb#Q7-Dz|~ZvcNB(2H<4r3KH_ z1o8-f3Y}mz9;d@}nng~_A(M-1dKGkU#e>(vnG~=30Cj1gu8@i7WfjdZalIT7&z&f@ z4G(7dyrb~3qM;UsdYA1YPP^P1$h3%@7H1o9y{e*g3H06|{19;J@?PdNa3<|^UN2qA zbrRnW*&aObHUg?5+tq}gHx(BcrsILAYbD8d-~$#fW?aJK_3WZ|!TV+c{!ipVMP43V zeu92x9Dgo&;TY-q$>*jXx)%Z+{8Qydo3v~~i-?*-w+Rj-Cm zqE6AP@rln7TEmI!9;Jp8pC5!no%~(E|GI9~@r8S+nvT*;XMx0v#~4>2<2tCn)p0+(3^T=!5k3F2=D;qL+0?QjkM6f~C3Vw*Z=ocW?kn*#68t;_ zW_$+$`0fqRBLMu20#E`qx`Ti(=739}_IEI`r$uRpr}Hk-;agGev&8QT9dCUIVGpz8tc`YE?h_&Vsk30&V7iU%R;`atAVAMrCnYxxk@ z_l`82Y2A`=rHQMZae0!Lgi9&lPYJE@+|EqS$_FwNz5g@`{Am(j%Y*oIp*3CN`rS7T zCq6$2_w+dFdmWG0Bk}iz)_L?<;M|M!?Iob{_ZI#SyCiaP zIWW!X!AL=z1C9GVg5{5L%Y?7xMf{G?>Tf2dc@Vyq2e-CV9|mEpLWw_+aL~c`SJs2a z(P*mOg(A*fK+hNPn?bmzw;H@#!jC6!oZ!upkxT1|_?tq`t@TNK zc@R$gwIH1M;UL`8A&;ZFmoxEOLdWHq$!Yyl?xx6TIT61tbll&Z0`Du~$9_lI2g29< z5T7L@d|d9dlM^eq&+Xm_cwwrRNgs*m80e&N(f$AT92oF}}1l5A}dmzb` zcsw=db6K%kMEjh@8y}4#sta1;Z9;2CiSG@<4*=&*RsP4D$UA{2*d}n6`znL!e}3ZS zCY%KCJ>hGa6F(!gnn3)UAl&1f2JfEm<2rZ*-cvzctpna3&>o+1^jo)&c#qK9M-cA~ z!aW}4whKQ_mormMC-xn-zcaN=QW?ixk>JQil?^^yo175IpSXm9j9{uymP|W zwtXHr7f<=Vk-pD8cK422;4cQWr%Sn?B))y? zIbDFonD#tg#%Y6;94!% z^C#;oJU*g%EQ;M1zNSX}q0suq2=O_xcF>-b_(Gu(4#Pt|Di@b3*CrhzulkAW*Bi9d zh<_7=yFSKi6Ta#r&I1XbHxn-h;l%F;;lx#MY|nA<^$LgDL;Q@yQ~HZEp3-g)btSR} zGCuG&q2t=8+*09dy7j=@13J|Al<;+=Bfef}t!3gGFCGcW+a+>p2XTIdBEPnwTv_;P z2l2Z?$M#b0r0_Kz;ye#=Zzuj~5KjDd5bpW82cCY1LhT~1Yqz*HQEsuUH`FfTD}>fo zKzvmYPJCSuPJDe3?&*`aU-+6naekpXe}!)pyzhh`&!{N>f$+5#BL1P!>gU8i3c`th z?BSS!5Wg(6wiDuagjRjT^-LvhHwjiOvw{^2ajswUqfI8K$w)`Qn9eAP$1OK8m}@t%Mt-Y2xmbLGZ$cD~=C99`VyM{TsF^WOs2df3;y?tqA1V)5SJqFW3*f7Da`;>9yoj?4Ka=vNJU zdqp={I*%9a`MSJCFHPb_w;T5Ku^ff1O~OU*HC)sK@olnjmyhUY47+?p`-<1&WBv*| zB3XfneszT8UzDr(rWl{67d_9g*W(Q6&m{PM=m!!k`f0-Y1rdMtIaW9 zwCWV=BUyO;Tt1>zc8nMOvbEpiMW^)_eK2__Y`WFo^+fb$!^L)s&wu0FAIL}M*QUvJo3C)&?kz4t`lnZ%18 zZTS{^SHB!S$HF}y(QSrZ`_F`~CHS6EtO0oIXItgdXnd|sqUT1;QeE^8OIMWUsf6EW z;YGR3BYdHy_faicf5$ZX+M?H6I*%8<$*@~#(T^nYqMtPE?Tm6=PChFvUzdyM(+xYH zXvrYTU36~}FZuz?wCo5YJ=Z`k8Sr*am3u=-yC-<6im_2p{l z?FpVwx>KxvMSW6UFY}_s`e+y}vN=jcu`lvQEfy^{vrT*tNc5R}i_|c?FrsfZ>|<2) zeK8)NNwmIS9r1Su*Zv@l*Egkp2W|Do@3a1L-Yc}o}Xy1 zx5taV%i>*YME}*W$BQ0m_4f3!-t!3854YCaz!KpNyhBRmVSEfXsb;o8In7LR6RmFq z*N-LfO)c+s^aUi4DSw`eo>P@cX!9koyNe#4%x=+R^I_!ZD+CRlW@VdodU zDT%)g`V=d-s7DWz@8edE_n+vUhCLtA`V)82GgrAC2^Q`3aDLHilX%hV4ST$3ua}o6 z`qCs`^m41G$BXv<_Vls8Uq+4xOs?J@(G!w-i&h^-c`hWMwEdzFmhVW)cR71`qV=8h zn2%`xUVN}#-~~y%=tYJ-UUb?|f2$wVE}B3&#da!uyoDF_UE#;_a%3n{558nLgZH8> zkbkD}F6E6`i(bjrPn`aM_J~iLwOl9C#pg4e43YL{8XpA2J=iCq_Zu#jrb|hFS*aL) z4dI^NCoQGdseE*jfcB_%TX0OU$?feIeI4)6(&h_>h*18~#}Pf60xVL*&Ac&Er9U4dMW_xj zQuGzPmQsZ7b;d~1l8HseIvR*lQ+sc<>|EQ_CYPdPB|6w2=y{0^wpV!LSRF<_hw?@o z^FNjR&gG3`_;2O+S9qqI>*)7;B+R7=j``gV-(8lU_p<2w47(PJPJ3On@{0A!^DRzm zSCh`Kr@B_@T4)PzoK95lV=W(#&+{p2q5eq0x$q7tE!W2dmW3;T=P#5tX)Tgb&@Fsyb27&2 zHw1lI>|;#yeY{a>Mq8ykemS%x6vwV4wLZaTL2oqdS|r*<;nf$NYL#eJI+iDTk>R3k zz5(f;W>x>hHGE8jg>OjZ&CM>gsJW9Y1NX)vOTDoi1>b1isGhoHJv^y+-cWCd8mh)c z{(5y*Ij2~;&L0JQI%!;Bt}e_<>GkC^r-i@U<@q*&*Yie4CZ-o3YCyQ#5z*ckzNaku zh$LRL=Tki6sS@68eD3J|gx_J|#i?OD zVG}Lf>pL0x&IHGDx(Rdrb2;~Cd_}n*L%8xQ{tX=Ey5x1C%L&o9$BMivMfV4aq1O;1 z85Bcf?am}d>58$cY&V@o&???I97R8CxTqddXIERVhUiO; z&&446D#ISX6MA=o_d@SWFr+=#^RIYuLU;2amc$<&hA<&EDxIvrXp5kuOeFz<42p6DhMi>rocUmAM6r}Df!U2fs#Svt2YqCH*Ff}T$X zH}OVsiTrzFweVv5 z&LwQCg%^j&Wev=%ys4sZ6?-J3=3>TX?g0QiX54$ef^LLTv`4>g3GFMtU7p3T`;Ub^H z`V+p`E`7>)#dgJTjfL?C32!1yI~0*$^p%E->lIn7YZE@v4;wBzu#XV-biyb4d{cp9 zen%2Ehqt)MfjN6dL&aK&UTL`48ycVsE!?MuQ=wNR7}6f4?dOg8iT+!z#P)Dpic(W1!|ioG(PIr4dtG6Z6Fx|L=JD?-ys>?v z<+jypeK%q26F$+K4#IaXVV5O*qOblx@)Zr#q417O(u?-~EVf5sM<#rtk1<^2Q`oeG zPg*-S!I1VyHqPhiMT%d(Dm}&oWw)g zqp&M@W4%QC=ql>BtA@S7 zqE)@fe;4#U35K+1G5>nLUcWqF$Ev&P91Z7P&}sdF_NWby^Tzs$c115L@QZ}Ml<~(U%!6@~tAw6|p$*t|WY`@q0O<8|2c|{pB9e z9JHu8-S~>>r%?MvyfM9K8OM4#EFyIp%yt zx#oN>$DFSy*PPGgnDZ6oD!%!=QLf9OHCaUrnLQ(*V!K2iYq)4g6s9p7`9!-sigH>) zxXZ!y4QS7m{ChobOfULr!^QOb2zxo<6Fn@^51>862^(kOUXEy=IEwj2zL6!DV^QkE z$t!Jr$Xvfk65JQhU2cnOPq8h0U{Y&rh^=g6elQ#pk<2o}cIy2jNp#yM=pxqOUUS7UCx8{Rxgze~B<1 zVb;r4-$cG42^Xy|xeqUKag3j35&d+;h$`l%bT?YK*H^Tsa~DSR?G|5jVe%iT^pPx{ zdyLQ9Bl=;(uHjEY?@n+mU!Mol=~09q#T(lxdWzv<|B3H#Ugm#&IEyz0Xph1c^2V$@ z)Oni#B-O_$#!^grDq*rkF{$YD4HxbB1%zFm@QH3PZ7%X%OZYv;=Tdo9wDA?~z@gG= z3wLRX)_AM8|8f*H$7c0|)(EQ~zRR-kV*9obevR?_=(!Qv9WyUi^!6lP^!yU z;zd85#EX6=i5Knjbg{jg2*1Giyxh&uR~vTuiS~MWyzgh5j z2-hx`hiJ_aQEqv;Y3 zHz)C;w-|N@UG(*aJ-z5#4ST%k2a|Zwk0kMs_NZQ4c;iNa(m7vI4mqE!nivED+=lc^3X^+O{!@Tu7fMW@pz{?D$kIAS`vURRl z?=^3w=qaXM#pQ0!=dBdqcHXEpqMtSF@uFWz;zfJDMJXvvXC_f=Mfe{1xeWq_ymYaFm+E;F}7m&(Gi6LVi z$=-k7JnvLB?{ePQNlN{4f@84@2&?kaQ~Eg9SUd~SD&M{j!`)cX+Y&5V*^)HYEwZYD z`w~{s-sn1&Bix&}N>*?`Z}Pi*lNzEs;i8=hZsd&vX92WM86u8tdYG`C7VZc7dqmr` z==d1urH3k=#r+cFkBUId?B=cBroE-pm$k?Jbn-KiwTb94$ErwvBi+fc!!iertM=*_mGisX%>6h zX^;&Tds>WLK8)({a*Q&ZnpJrr^>Lq(E&6zbH;zHoKm2iNee6%7;3=KR%P))RV<~S; zCHfkV(uaSQ%}taVe2+)zV+U_crN4K)JHetyaRZ71M$m75>8j;K$X;GTujAteCm%y* zk{zM3t)pq@G;3=XbU0AoMMU$~@}b5->cW!exJo(d&!#4-xt>`41`TrB%!h;nnHSxe z7u^|)KAoDc*cBIO4hvEq6^rA`3_X?cDEA4u!tL+YGzwYZe@>R)C zU*Jg&Csn+PMZ_vuB|@rD6$YvDMv_0Iig<(<@-aT1buwlizXgO<($5s`w=~Tcz@*#9 z$%M3onB}~&Rif)JJufFo77u-zVVACGZ>>v3tyNtjf2`2UguQCvMfXVIehE4B4m00G z-g@^_e8VifIH4(jREXE}6-`Hii@hD4_sFLS_J|~%=pzjmoqmN)O!!1EGhCbyR}r@M zAmQr?yWGOPexhG8?AmYudJ+ad8oiCsK4TTNMfu1Tsc+X+gk5Usi*D|ngx|%>R~zo; z<1(95vadEgPS7!y%B7?lOiM7)_Uz?f)i6p;wDT3E^bFxwSP`FuvS&a4id{bkc`Q*^ z@}@rxDIs{)-cVKHU=44CZvk(t0;E05`FA643>U4LvtDt!34fLFA@*a30N?KUs|97Z z-_&&nENG>%@XuMinyrVFvNkCSE0~ojT8b5|wCK@EJY@EyN}2N&l~l}(aPo5{&-q@j z^j@wz5;=v z(Yp;7^?4&Oe`69K^H&`XR_<+tKbY`~o{Ljjudm{J z*!aA?qF*uW^_xZ-|MkgYeU`&2~3>W9QRfM%9 ze4@`bT$G2}H<>r)C))L~cpF1}+j-fk)5jhoKcSD&$cRvVNXfZHt&g1^N__TAhl& z(mlkD<1;=pAx`97%==&rc=bymH}J;in!|D7dE@u&^nJYHa?`^zVk}c1?_6GeXD~iXAvW`> z4Nt~EKL1wuVq~&|_eEZP=|#Vmvzs?Q=MtuG3&d|Cq~SLarjn6RZHi7pZzIt5ayRo0)a~rR|^<3q>j`ryr(X05>_r~?@hh@A? zq#4JjzIic?H$LirxhqW?)x2`lXYyvxw7v~p{mm_**>@Yai&Vkf3vQcXR(hO=QTSxrMZ)X>FC3fz{>aT66d63dtPy4zzSP zcjdUVyS*pIHMg|XDr+OEc6O7er)sZ}CW0jMYENqn4aH#>Fe4=>XNr33sJug9TKPtv*<>JqK_&_Brzv}RfrHK=Uly03IBKe3ZrUcrD+d0Pf z-kdGtYb@|>Dt(0fk|CP$$v!A=ugAHiWq*V3gMp6^dse_V|2VI+0@QSdNa-JW({ir( zA45uqpo8&=?O0Agq!stgmLUZlj&ZGZe4p$bQrb67Dg23ieZWX7<{wx!{?qsKkVt*5 zj_>LZ4lPYttrY%5zAphIt(g0_4lVusDd*9@G4AULt?(=OF6AW?MEMg{;yR$xXx`Q{ z>Hi*9nvyMoJWlaH;Ej2UZ~53mN|)Us%AXjgphzp`84R9Wv-rd~i9YR*Ex$a(P95s` z#GfQDZTrOq(jh98(AKwe}`HtQj9@Qo}s10_z^zTG&^S)TEa*s z&rn;d=K(|Y^AE{0)FhV&3@wc*NMKm$h1d9MdFlNb%L}g^13fRnvJWRESbC%}?#~Oa z&55LazVO;YKJ&hK;kEw(UXK_*Ltq2{^@H~yZ`mAKhINVupBb4s=o3~;xicK|Cqv_rTqgO?hW9mj3_m@3E9Oa+LdiD*qkeZg5AakLK_fllB}BegVvfwf6*wm%ylu;gi7q z7=Tkl`VWIo#JKDZxB~u5lHVHeD@lGm;P?zi``1z4xHshew+Z}OQlBq^4<#NK)Y^9u z_=btTbt`#kO;jR2jt@;G|2s*qEsFh2ybBtcM|_N_^%26E%?<0>j*DCgCP(3 z_3;^u^0YI06!O!Yq4D!Z#H-+-mY?VI&JQb{J2pBQ?Kp4asf6mY0X#dY?^nRbgQqaHslDF;$7e9= z`vb}w7?aEUe}d0R@ZI1~C-?#IXA}HO@P-8M0?`;aN&FJG#MM#%t^vP5esO-*U-39E$^VPs zFC_6_1IK4D+IubKUBAM=`l0&%5WE+>kxB^f1h;)0o6CR{ehFNmy>yf5rv!0%i{JfF zy#6TkfmXjdFRVl5`4!gTA-_f7)+GH$!0{Q3_I6TUXHx!o;MEDf3jE}-e7x$f#H>l; ze+KRXPevXZpHGA1GZ^*%-<0>Ax8(94gPsjNB(Lvy@Yjfs<7+DTyI`to_5Bd|2C&wi zs(%?ApTVeq2jxAQ)cD%lVM=-e+2Ia`*>)uUsm3e#J@)TCL(>`p}~IOr3E}bq#uK?d=mKG0gnS82A&!4 zyTF>0wQ^B?^efDN1Z#aLJRAHJ*!`V`(mb$^Z_lFf{zaAzXguZ zVCbKIE&4}PerhQHmO(E6M}u76y_EOsWIX*0{2MS`z&q6TG7|EBkXYcqw=;{U^Kxycw+V zCHzV7)nM%_2={}>eaY>K@WtT8;381h>{lej|6}kD za4hdWaMLBe$E^5=!PT$$O=V&I8uy4x$s^>q54@Z9odcHs{U^AC_y!EB_!}@(XMUCZ z0{@%9`@o|Zvx?VW2RraJzqKGdTZSz>gP|WM4RU$8J#BPm_~?gY0c z_#yCxhinY<<&e@7;7b$y9C%ZL{{n9Nrhi3Q^*M}*bn^d|*KahqlH~th@M`daQ2u=I zcfoQaH6A_&{yzA~fUDqpllb$%KLw8s@mGQ4GZ^}z{#Z!+CQ+!``(4U^g8Cp{tN-ob z-zIoF_{jwS7F;F$sE}S4NPkCs?2kimT+Sjs_U9<@^6oAemcRsz)vOoFM#(ZSij`|`vhw|z49;YZ_*)> z*C_Tj|3v&~+9&xO0UksBE(v%d_>EwaS-i%}8Q(71-wIRu*~Gs_`Y5jtfxEv`D%}mg z;&qvH`t|wzQU=FoF!ZrPc{9J8kN1s(T>gcWx8r+UferH50-m@P9SZm+@XGJ!`?t4& z?*Z3BynYsN>%aQdImz=k-~-^hLi{t}-zN6vC2;AMe1CZ8$WrNF=)c&%z1AMM~dzwqAxl6=>JcN2dTl@iv^DE|A~ za{c}a_!e-K=N9lK5BWE_#D6RJUgEudLrZsq<1-lY{RQPcPJJ{URi8(}I}`jIco$gb zM2bHEUixsUG(X^>Z=yZm;WR+;Zw6ofOV)fL{ypIM3`TqA403r3DDUB<|MYhVF8>wh zwW0kV2R{qm6L35Dk%Yes{L2InfDb(GXMU3BXTbwU=K8T2{3!fe$WP<(pTQ3$>AwN~ z1z7#5_-})Mp5R-+KTGiK;QN#G_kiOw82zk%W(S)=7P_rf8%)gFnD7!o<2Uv^=ljC^13MRoTU952DyCw z-Ie$ZhJIf{c^}7D-$kL?fBZW5SvtQb;A;lCKHnSU^8StTzL4nmo#4+W{eLg`yaelS z)x3Fl93MkUkAW{p;(rgm5PY-AZ)oYi!0{Q3{?rwkG1Sl36GKXG0KYxKW5DlB@H@bB z-=5p|so?qGxE?tPdPXxa)iJuKVEUC{wfZv?pk18Ji(jne|XM#^bUp&7dr2+6; z;b+-v{rh?F-zDiU0w0pp?<(-c2N)CV1E@X!0$v23M0#PZce}yk1J?f0k;8`A`HSLz z0{@$m{O<$5A!*OA!0{Oj{rV5edskAQ{|3JsjGJ%rc;guEKY*tPd^9*dgHgY~ALR08 z403rVQ{FQihU4;^{(K00*Bgh}nW6MW{z^0QkK<(t@hu6~-)4%>VDv{j<+W0Nw4dGJ zPO#Kg_VH8Tw!?Kw!TaD}N_z4C8~9zMdrv|w`&kb^UFAZ{euMKi}>GyU9L!ZXHC2B8z!yw$BJ!+84JC^cpO2+eS@RkHG z0^gY6kAeHc_#V&rY6Y)ivu-kCIvji!cyX||x^4b>@Ud?iV&BSE{MFziI6amBGX{y? z1Wxn21Kd8{{pT^*_g{i*pJ0DHELr=e^4BB=FN0`F$_prQjRR^ZO{m&ESy}{rd^RRq#CcWBbnmH!wM!80vE| zc+?kUi(Ee60B?QH|4e|=Zv{{LiJun<{}7zYV>|ey_vZ5W75Iz~VB)$bUZgZv17Pw~GIC@Q#}~6AJNF@T$qVJTC%YfWFKN@mGP<{<wn~#rM!B-RJ8EAPwudl&dh#`nljpBKQVxA^&| z+Bckme(MkLF+%*?!Ow4{4FSI!JZfmJ?~UMdPxtd|rT+);Uw?;92>i>z55RvuSmUD$ z+%ycpqxzo%o{#;R30C^AgXf^Xd>Fn4VkGrj67Ubfi%{NLzz>2qKPz76e**kK(m#I$ ze%N}@2`N*#vbVJ;Htgftc(9Hcn9^lBc#6#Jdg3uGRgRVTF3t= z__58ozWoQddK~*X@XLO^0KS{~kS19AL*G%X&sgx@hK(j)>Erk$Ui~{Ay!~zY_&Evu zi$i=pB>saYW$1 z89eQzT%HespFS(M$NvF-?{MGmP<>tm&wMA!z%v^Eseys|{70En8Dq+S9QfqKUcLu> z*F^uNP{q#%Z^2$jA0)qj1n*_OI}@z(Ryj9}j+hfH4yIo4~i7a7hL^hE{`X`9naV69nS3GJB-ZX*AtfER!_?ab}ZQt%DPNAg#DTfq0BU&8|)0JrVU z({BW)= z7kk8k|Er4sdS1V8gIC?=zsaHY+yYMLuY1Ac6a9S{eAIeua>(y_@F`Q#$$*E9=e`*A zIWpkU;8eaxfnRFG#~9-BnN}Bn0{Hx7zF7#KMES6zf5S@4z*nA_`+uv!b2!Z38uHr! zUi+I|-v11KejayFN?zV~!5?CLMt$7|K66iQ-+lsq=8$}RJ^k2od{mEAD_GA<(~qc z!1&NJn(~){)AG*%H~uM~KdRto*XH_jP96W3z`uG+KK{Q7-gRs4KimjD7kM8+d20Vp z>(W08UVcNq9{D}^o-g8q1pYrM9{V5VH*^Ahe^@@A#(<@LL-}_Mqx5L-HuOF6zXv=a z(ZAVBk3EY0w-|ilmASlDfG_w}KEGDMhmxKyH2paneEYP#yA!}6?*%{2_#Y3Je0~o;WnVr%Ujd(<=<^%i#d_x}xjlM2_~tS` zT1Y<`eB%4^@jDm16y=Tip9Y?o$fFIM_J1$ zc=O%Jd#LBX4?Ow{vSE(@489B;=a&ZNmbLg>aejIuco+6-PT+rs;wdcZ=QQx{5&8I- z4^HL37~GraOQkOUQ+4>W;AN9?eYg;OD)O2h%D)192IWV4^j+}N*n?9;{Exx=_vZe} z4scqZ-+-@yxgp5=8SrD%^6~UC_{c*x+I%H{=r9Jtjzx^Yps()${|bJRoBmB#d~+_p zMc}=M3^DzbzI_aQ$$RqtY6nkbd_{ZoS#b6Ayge5x{cVhwP~PR>3-K>53+?;9;-}~P zKR*JW$#^*`#QzMuoB3{dz)yfj{ryJ!PL$?{KY@RpwD&b|Dxbrs>qwL#rauaN75XqP zDNr~;>2Ff1*iF)0-m1OkB@`ji@osl!%FSoE&KEKZ33UaE}ze@2H%N) zfyuD(dOi3^=GXB7{|J0pU+z!-0z4mmoe<)m0AG!KqrM&h@A*P*?+;@jJUJ@Q|Lx#K z_~WuK>c8>e8Ewo`;;Qu)|KI)HOftS&~I9{FtPf6nVEvwjp3#htdEg22^ZlEp;9IfhHxVy=D}(oZIrnF3 z;A0o&?f*RZT>RIY;g`HG1urN6LoNM~(zn1bAC9ni)V>?QFYV0x??>R>AI;^r3w(OA zpYRv(yyx=y^G%aWrMu97sj%wzc5r+&zf1gtQwdZr-mh1EVgbTnk`}6+07JOQg|M$T=r{(tOcJTY&o8#@^g^VXu+VXz_yz&ou z|2z*KIW@OOe+8%YJM{07H-nodSo*QxZDbbfI|Dp%J9~C?fa?E#@XDW{Pocf1f}cJt z*Y`8PwJeJ$et`_H3^2$AP1NA^kcD{5baclu*Bw z;6q41BBWmfPV2X>4u2keIsU-rkpAo7yEu=H_G24($^!pOL6YzP0w0QfkK_4i@K(n6 z0xGQdSHKGrd;13U?IXFpdpmeJ?NR;2KN-C6#N3|E1Giw~V|)G){4o6;?L!MVAJ0Qe z-Qb;%=l%6*a2xrJ5BXmT-uzT9zi)wuV^1(?R{r(i#qY=82>5pJyiN3B@IQVGp8Bqh zX7ALWKL=k;{iD6x1^&&nT;Kly-UTKL>;D(P=c8|t|Igqvj?4LnBgnLW#?;}X!T0@$ z^;oFSRPa6IANA!#@Tz~!$H#}kjXQWldz!(={=mQQCV77fyny*{M2J5h{2(Cq_cy^y zcIWnLEBL;oyluj}7-J#*kHOoU^8J?`;PFr9_G>qI+j)6@FMuDMk53lT4>^whVSKa& zd<6JN=AStMPXS*FKPKJ!>tyi$;ko>lf>Zge1W))t&i^U!q0i>!Zvx+SQLYb{g5xuu z{jqO?H(!z0?|Sfqv>)}h{=5x*IPx0{mOLK>FGk;v40sRt*e7!N>;q4P|ELf@1Vv8k zI}*IAbtNbpwVhdHzSC)Dvz1@AvApFb9Y$DW;!$A1EknwPIX&jgpzw^;wrfXCB$ zd|3XMLfrZL{QTlu;Eo;0FvQ;ue*WZKo;$$X|5z$*4DnBcPin~R%>nTERrz=yI|F(>vSi@h2h(tiOw zV|W}NLrRx|S5+AgZ}9xT3vR@|poUi7E#L+4t9;qpd%@f3zeOSb7vMXQ*W`fz0KVh1 z`TR3{CbCHQ4+p3Hdkpw|_!%Nr-t4;glk4z@!P_Qn4F1H>(kH5^XV3FiTX7L z{;hTKw}BTi-^KRa1Ku3Y=QSVi0MDiIYeV{{z_;TM&JFk#@M|Xncw}!>(27xcdk+KO z(%|wLLw|1IWgb`;4OQ#NAB?-0jK@>3Ghnvdl>Q3?@n+&e-0`2 zg2(qOt*8GgcGoz;nP+zW)i1{ipH&7x4Zm8|^R4Y5cr-PO0?KLpGW{GJhVt zlk)Y5e0|D(OQ2RwaBzQ6VW_`zg;cpRM8Z*Lub9{ef*l+E;VfAAN2?KI>BdQ|BnQ#e%rvqk$3FxhrzdhJ)d8m1b-7-q4vvO zzX(pte-%6deLg1SH;RhSeQ!RV$Ag=i^YzC(@YTce`z9;FOMjd17j}Rb(EdpwzqQ~~ z;g9wGGB_>&8{k*k^7;7|@Pp5iM@WAkxM`bC5WKxlg0FsGzFvO;d_MB=_6;e$3QqGM z0dIp+dKSXBooeRF7`!FMiIsPE{j!7FWUgKv8cr*RWv|;>J z@D13HwE>?CZuw2#AO8%#lk~V;6g#x^E%4qe^ZOGwg1=4Ss-ODnZt&yW$By=(RH;p^ ztZ(k>tyZSCRy!-*{nJ`YVseSf$^_FXu)kdFHsr3ZF zuU@xS`ufWK9kohxTe-ETxwq^YmqR(FN`I+V`P4wAuYX$O90ouDWqujEze3OnGfN^n zTc_4~2Kqa@S5u|twzjfRg(h z)yY$rL#SnK`IH7adz;9#wPQ`+Ko>dmR%+#H^9KG6LDlBI{@$Kif2p<9$&Y-)U$%<1 zt}S<~T2!HoRTcWO5)jplrV^p0{?^{kUW%Y4y#xL21Kngat+8=-Q>jmFuJxBG zv$LnIv$YJX)xK7WL1Jy1F{i#cmSK z>54?TJ+zZpuRBBtVhBi0r%pe9YNdNMKd4SIeU;kU&elq~wPj7ItEX0(HhVftnOdc< z+(N=Ng0o6SmMgVdPfY=h^*v+CU#qlMI@eZeC4SGnuX(i;9L|1ziM_A6ReGX;CS~1= z&RFzpjml6Z>SEc@6+y4c9Skh;v*1pWpf#>><@QQ9b?)uy>+g%HYMss1&a*1z&hE%n zY8|N680h7$&bE54=31?JL&(kJR#WcUW^!q%Ry>4}x4Kg98mRVnM$UmY26<0+cT(@E zNelaEL;}kl&E0KPMpYbvNnBr9quKsRlLRFyFiNdb&G{RVQlDI$Q+ryhYt5)QU8$vo z=3%C`w5nf5v2o6<8Kq)eTK2(Wyx^A3fi9X)_cGk8<)BwyV!ghIsod4vjh5uXi7BHM zsLMhX>|E11wX3Pj$k~nSq!QGMp2W&&iTckId6UHBOij3OxaD zv6nxM&?N=3%Fkv!*xl1sncCS#P^%3^4G>w5KL4nNkG`3+X2R3gFLP6_2{JM;T26X+ zX1eFwos?%t>XpZXvL?9 zU|n-(e*)bAq)D3FIyGHtNZXu8pSO1C4>{B<2E!Y2GRnfl+h1Gn{E@FavPGh`wHeC= z=lb5Bb(jci62q*56f32cf%f(+&_+vFC*n}EQL65?Kx*E8on{(S9IqYCRg+VV$yEkc z!h=*>)Kjf}UCokWH&a{`6Em_J6GX{;T4`M)n}nHduKGx)GJ)HNzYAD3qi?BR%&M>Q zsqUU>GpEm-&7|MCx}&9sSvoTsA(ai@u1bHi{xFBnKpC^ewbv>YCWRU!F7#w)H_|9D zr6c?x5gOo0aVhufg2h{?PRf0d2=RxZjdDn+KF$GU)Dv;Kt~i}UuHg@ll!G3@RKYcA z8Bi-F{&f}p(ntl>)08BQw5Sq)n55g{+XnhKlv_8nqRJjd4ou0?B@e}g>7(!32CAB7 zVlZ-CUqNT`085=~b0}B6NU5d14c)C?jP$wIKW)}*+?ph`x1*VvkkAuKR<5%}VfR%k z-9%zrY^aN5LY=P9S?)!NJfYOrS@rqQT&g|-XH5^zlz|zgzADnP5)|1~YNaa2lS!Df z+fY7q4GR!v%%~}SL4=s;=5@_$Dy2`Ef|?`hWZWD&LY0?EyvHTj(>}G*zh07- zQH?Ef+nR|QqIIAuf7K+}qRCdGGs0UNR}Bov8ZNko71OG0Chf+%pX#m`1qD;6eq&8g zSt}!@k}{vBvR>xQ7el3XXXv(%zEWEcgQr?$z>pxUei%O?wz78GjM>bWvRtC%cDf5G zG^^CBkH%78H;%=O*|U!?H4pUT@o5~%Omx{W3>7oO$Y_~4W7bToDU%3}C#F_GvoJ|r zn((X-lms)XOd<~T&lYnQp0&!^65A^a>h30uL2Ud*BV|{M*;yw$Vw|dfiS4bS6;tEf zp;>;`tmCKKbPqw}aTa^zLivzl5`$)y)yrQ`0x-n&A(S!XR3W&GC%n2FLE8ewGvZ&< z>q>i|_`u;%mXB|gpFMWDQ}LR!Y#D9r0o zR)U}wl{T52&Tb0}>@r1JrK7-^X4*^r{Z$qcRhIp>inPJSkkUd0H-Oc%Rin3gL$!x} z0~OEDB=Xy?a%UVhB@!b*%DEqSU`O7LzdP2N|SlSIjGm zR58}HtYPh)m8$ncxjfL;xwfmPt)sKCTSbg1DON^- z(p?H+OlNLFsZvn~Vg8tf%KD3N)FotW-jCb*vKAXVk?BC$!$sh2^ip9nHGAqhp zNL?&hHceV;#VqG!R=eEa)8AaR(Vxe&aEzAIbTeBz$c66qAch0WwX)n4!q{NYHWp1~ zfm2v`l_lGbX4`iv4|HqdVZ>``M{DGkVr6VI3Dbe8=-trY!-UvFE7z2RUC8P^Lxz)a z*W}iU7G?pyWvE54_iCuJS&P;lwn6X*v|AV#O15{IrMBH8waX?(t42~QTyJcB1?LI> zC)=Y5Lbt6UIjHo#34<9r-$%)tW?B&17dCY88!(C8=#Od^H!FkdYzv*ZOEPOo zt*@^$lb!Yp*s#hP(aB;`u8wNK-y*Ex^YEt%GvVPE$UP0)rJ?qfu3i+0WnLM>$tJIQ zr$%d87zXE&VWlY}S6&&~u#)m6n{q99npusyX;ZtYi~A0&Oysp?x}^$g2FmJqy!Wt8 zJq4wZyPN3jhTaNgGm}`+z0IA}xu>VUr0uDe8q-RvW(k~8`91Q1txEJSLNMWn`o`TH zO*6iCU0SwCtK{H_wKsQG(`n9Dj?sq1+0nM)@;1zBv}(kmz$`$yHC4B4S}&AyH_4{t zRyKG`Wz@B|Po83MuEH?&9gjE&Tx)A_ZK?sJO=)l2>lBqG@@f-U_WK^V;^N@89;27{%B=1;l?c8tg}|G z=*%ryX@LRN>C&c+&4H_{JuPUdgoi_v3{H)!umj<1jaqp|?BlQ>>snG=74!vXwOkv( z;A-y3=Sx{{-Z zLEFQtRBCPIbv^vkHDl(ST6^=1*Vjm+M55}Tv%=n*Hk0DoAuf8XL+PkA1MkwjOx8Nm z;*c~CpRFB6Hk^B!aW~mZuQL`h44JWDpVLjF^;O&mbH5I6v)G>!T+tpjHnHE|k9ta{ z`pC8gZ`9VUwE=cNVyo1eLf_WH9)DMBFH^7&2H9PfWv+MRSB{1y>uD8I?qh#Gb-v2M zo6Kj4SWPuF4s&_>IuFAt)6v=>P@!(?O&>JlWSYf>OSOtFw$mat82zGM>Zf%T7NKjp zd)9R`kl7r{lF$)-&AmECYxZ-iGDXXK&dpEU7r{5=lnq}h8G%Zt`qrx&N>=WmZV9W4 z+7yHotNS~$Msl80#*(Sc?1W&Z-6L|>Li>#6HW$22@8b3xHTKh*T#t>* zM@~=N>n&SLa$WM;clR)1aV%m-2OJk<)pPfv)>Rk+(X`8;dU`t{3T9FcfeH=QOw#CW zPFn24*d6)U)pnefS%fTqIZG1V>qHzXno3y4OKyhEn8kdNZ`NQAIamd(riR@*ViKb! zPfeNihB_-G9QeAb$Nlu|95Z)57!5rGH4cZPjYSMe$;oc6`4ZWZEht~``eg3R+-mEl zUblR=EE}Xc2rFw_5pRiPoxN+DXiC^J&enmJiKcLtNp?b)$Srg5e0hyHI{JIMtL_i7 zH&itdNpsP3H-5EBTPJ>kw)X9yGn=cc?C(_DDt4@Bw2jxeVI%z>;82bIDRaDRF;-qz z>jbOvjJqBdmo&OKi)sk_ppY98PxKDr$n^KD3D(0-f}=TY|P41`XD=o8hh1#&sYA=|V3xAtxpp8< z8zN@mU)KU#444+OdBWDZ9h$oCdSB;ytR4!7+4+{5ve$g!BKI;huH=ekEitX~dkbM* zEzi+9RK`Xw9Es%Ez5Fi|9bOaqHcwKq_BHohsKr4Ivj=>b8>f8M+L!p*>SN; z%t;;8+O|kpIuz{@QzgZ$O~#68qZSlFYs_HOZH{pEU9S(Br<3&n=UExeosTFkitF}0 zc)!7m1O>l&nmvB&)Fj8-HHo$l61ZS8MQu3Wv*Bl4AKqVM6pQ@qm|9;iU?j( z*iFfWqUBv*J|=9n=S@_qdOM{Swc;f+lbX}lzaB$vg2=?x=+m9rADudF60~+`QJ(HR zMpIQ@n#;N|-+}TWXf72;i#m@e{!Ja&V?L~%w_TkG@QUj zv0_Z3=aOl0K2Q@eqG!6yQtoG?#4k^j+t^arQ10rh*u^k)R+v1o$o!w(kHDMJ@=jZ- zwol*J-Kon2rYKtG(Cuq+Fj$Qg?z!YL;+R4TCRN8diZ;E{9|m{}BQcXw*o;!I)=Mkz zuvx(`baQ6wk{F4a>ShS`hvM209xih^*4RaD-N-Gte9&4eIQZ-6N#^jG$J>dkO(Z&# z(Ap%p4(iu9WZXg5povzFLkV4&%5}2Vye^-)q-Hj~DM?iPu<>H8mbJyoP`|QnTJ?2u z>=*oOZ95Kh+h8|?V`D>S`SBWM=GbPgu4QRvHwL8(wamw*d$E?fXOM0*hnYytj)wr& z?zl8OXeIJ~=PsL19X4C%7c|3aRc^Vau*`NQ)1pR!EJM_rQf<9^#pZasiOKyU$yB;- z2kmq}*Gh7GftTP0lT?`wMs+E35UP|~_p|#PhgD{M3d2T~QIGi~r7h_&yJQ{(YRq^r zA5j*BJ~Y*`{dt`}M}J9U#TG<)*QRH&oI;r3r(G!P!@;RsHuJ~$9<4&H6xveMor6ulS`$l~vcrq|I)ufjuMB*Rk&WT#wWTw9aOC}9+zhGqj!+@>xjIR0 zwoz;cU7GRP12tzlTx8AlUB)FFE|N(Er9QXeHV^9RO5HS=_e^7>NhMYp%iz~#GNYO; zN~6s)ep69QMZDOdv65UjA%FAHihGJ-?9^Ka_Z0g%0<*2ySTZ7M@%6BYB`i^WK)S8T z{h?&bCZWvyMkij=axzL@ck69Z|fY&N5I;<#51AEPF@R4u!(J#}*t?cPhjCFfjs$rc<*%c38ga^^LY`_R*+hAFR zPl$%vX8PcyW0^As4vJ*hG~WAqE3I7g2uoxORxPQtu1{ym>Yh|+xSybCW65h6OjP2Y zxG$OQm$X;ym<#=JoyzQ{^>J26+%WU~^2~?mkEc-#D>n~y-$JnAniwy6>%nftL%U#1 zvJ(gHCq-+oQG|1s&t1O9m-%6?ho;bY^Kw8mB+cT~nKr)Xu*Q}*UB0>r^@{hlV~%d2 zWptAJ6=Cz!21H(!M5KA6tdp`i$fnJF0ty-EBk6DU`qklCB9PBlnM&Br-=OeKzMhfd zRJwK1R(mJW$~Pr@T6T<>PdYBRV3uVq*d5Srs|(+3%9%YJe`i)E%XRjgyaa9x*>Qay z!Ue!gm0UL7C#K$h8jKGg!mzM?+`jV_jE(k|d`^iw0M09!$T0hy5+^rR+?)=Cs)NU{ zdXl=^X( zV>7Grob2>Us~K%UWKlC+x6SDY_Y>`FLuTOe`*-o+iY@MPxt+syUx!%j>%D`p1eRv{ zl{we9gDeE)0vBctc9;j)5z1=U$h{4_D5C2}5`~UJZRpCpcw)ybHgdG-@Ee$`%;_k&@D}7_;7%dHLf_;R0Syx)u5;S0IM)@n=GOq zDa{N^g1#F0hvlzkYhMC;h-soXLdlg%Dy-FGx?T;_N-Vajwd?C02JWB+8>np_Joq4B zp8+x%*DL<(PP}aJ1}7nSJi1xa+{Vp5zvdf#ZKom zcQt%vZM~P2Ra}~8?MrX}#LM%(xf`}yYN(jnKftlm@G+~I6$%Q+$dH4og3w)>D)XS>xXz% z(3FZ(t^D4nFIs~wk3zCKCKFM1gCpCtb0t(kQfY0K`QDX{5N#wx%aWd + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 0 +#define REST_RES_HELLO 0 +#define REST_RES_MIRROR 0 /* causes largest code size */ +#define REST_RES_CHUNKS 0 +#define REST_RES_SEPARATE 0 +#define REST_RES_PUSHING 0 +#define REST_RES_EVENT 0 +#define REST_RES_SUB 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_LIGHT 0 +#define REST_RES_BATTERY 0 +#define REST_RES_RADIO 0 + + + +#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" + +// todo OSD-Testboard move to platform/dev +#include "dev/led.h" +#if REST_RES_DS1820 +#include "dev/ds1820.h" +#endif + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_LIGHT) +#include "dev/light-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_SHT11) +#include "dev/sht11-sensor.h" +#endif +#if defined (PLATFORM_HAS_RADIO) +#include "dev/radio-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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: move platform /dev +#include "dev/led.c" +#if REST_RES_DS1820 +#include "dev/ds1820.c" +#endif + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index," \"name\" : \"wireless-plug\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(plug1, METHOD_GET | METHOD_PUT , "plug1", "title=\"plug1\";rt=\"Text\""); +void +plug1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led2 = 0; + static char name[17]="plug1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led2 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led2 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led2_on(); + led2 = 1; + } else if (!strcmp(mode, "off")) { + led2_off(); + led2 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +#if REST_RES_DS1820 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(ds1820, METHOD_GET, "DS1820", "title=\"Temperatur\";rt=\"Temperatur\""); +void +ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; + int grad=0; + int kgrad=0; +// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ + kgrad=5; + } + grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d °C",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d °C\"}",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DS1820 + +#if REST_RES_HELLO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *len = NULL; + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; + int length = 12; /* |<-------->| */ + + /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ + if (REST.get_query_variable(request, "len", &len)) { + length = atoi(len); + if (length<0) length = 0; + if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; + memcpy(buffer, message, length); + } else { + memcpy(buffer, message, length); + } + + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ + REST.set_header_etag(response, (uint8_t *) &length, 1); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer. */ + strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); + + /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. + * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); + } + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); + } + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); + int index = 0; + for (index = 0; index 03 */ +#endif /* CoAP-specific example */ + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); + } + + if (strpos >= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + coap_set_header_uri_host(response, "tiki"); + coap_set_header_observe(response, 10); +#if WITH_COAP == 3 + coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ +#else + coap_set_header_proxy_uri(response, "ftp://x"); + coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ + coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, TEXT_PLAIN); + coap_set_header_if_none_match(response); +#endif /* CoAP > 03 */ +#endif /* CoAP-specific example */ +} +#endif /* REST_RES_MIRROR */ + +/******************************************************************************/ +#if REST_RES_CHUNKS +/* + * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation + * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, + * the byte offset where to continue is provided to the handler as int32_t pointer. + * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. + * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) + */ +RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); + +#define CHUNKS_TOTAL 2050 + +void +chunks_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 = 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); + + /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 +/* Required to manually (=not by the engine) handle the response transaction. */ +#include "er-coap-07-separate.h" +#include "er-coap-07-transactions.h" +/* + * CoAP-specific example for separate responses. + * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. + * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests. + * The resource handler must store all information that required to finalize the response later. + */ +RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\""); + +/* 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[16]; +} 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) +{ + /* + * Example allows only one open separate response. + * For multiple, the application must manage the list of stores. + */ + if (separate_active) + { + coap_separate_reject(); + } + else + { + 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. */ + + /* + * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2). + * Extend the store, if the application requires additional information from this handler. + * buffer is an example field for custom information. + */ + snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo"); + } +} + +void +separate_finalize_handler() +{ + if (separate_active) + { + 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)) ) + { + 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); + + 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 + { + /* + * Set timer for retry, send error message, ... + * The example simply waits for another button press. + */ + } + } /* if (separate_active) */ +} +#endif + +/******************************************************************************/ +#if REST_RES_PUSHING +/* + * Example for a periodic resource. + * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions by managing a list of subscribers to notify. + */ +PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND); + +void +pushing_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); + + /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */ + const char *msg = "It's periodic!"; + REST.set_response_payload(response, msg, strlen(msg)); + + /* 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 +pushing_periodic_handler(resource_t *r) +{ + static uint16_t obs_counter = 0; + static char content[11]; + + ++obs_counter; + + PRINTF("TICK %u for /%s\n", obs_counter, r->url); + + /* Build notification. */ + 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 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, obs_counter, notification); +} +#endif + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs"); + +void +event_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +event_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_BUTTON */ + +/******************************************************************************/ +#if REST_RES_SUB +/* + * Example for a resource that also handles all its sub-resources. + * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. + */ +RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); + +void +sub_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); + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_sub.url); + + if (len==base_len) + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); + } + else + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); +void +light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); + uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_LIGHT */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + + +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO +/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); + +void +radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *p = NULL; + uint8_t param = 0; + int success = 1; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((len=REST.get_query_variable(request, "p", &p))) { + PRINTF("p %.*s\n", len, p); + if (strncmp(p, "lqi", len)==0) { + param = RADIO_SENSOR_LAST_VALUE; + } else if(strncmp(p,"rssi", len)==0) { + param = RADIO_SENSOR_LAST_PACKET; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success) { + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + + if (param == RADIO_SENSOR_LAST_VALUE) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); + } else if (param == RADIO_SENSOR_LAST_PACKET) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } + } else { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +void +hw_init() +{ + led1_off(); + led2_off(); +#if REST_RES_DS1820 + ds1820_temp(); +#endif +} +#define MESURE_INTERVAL (10 * CLOCK_SECOND) +#define READ_TIME ( 2 * CLOCK_SECOND) + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ +#if REST_RES_DS1820 + static struct etimer ds_periodic_timer; + static struct etimer ds_read_timer; +#endif + + PROCESS_BEGIN(); + + + + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_plug1); + /* Activate the application-specific resources. */ +#if REST_RES_DS1820 + rest_activate_resource(&resource_ds1820); +#endif +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if REST_RES_HELLO + rest_activate_resource(&resource_helloworld); +#endif +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif +#if REST_RES_CHUNKS + rest_activate_resource(&resource_chunks); +#endif +#if REST_RES_PUSHING + rest_activate_periodic_resource(&periodic_resource_pushing); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT + rest_activate_event_resource(&resource_event); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3 + /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */ + rest_activate_resource(&resource_separate); +#endif +#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) + SENSORS_ACTIVATE(button_sensor); +#endif +#if REST_RES_SUB + rest_activate_resource(&resource_sub); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT + SENSORS_ACTIVATE(light_sensor); + rest_activate_resource(&resource_light); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO + SENSORS_ACTIVATE(radio_sensor); + rest_activate_resource(&resource_radio); +#endif + + /* Define application-specific events here. */ +#if REST_RES_DS1820 + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); +#endif + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); +#if REST_RES_EVENT + /* Call the event_handler for this application-specific event. */ + event_event_handler(&resource_event); +#endif +#if REST_RES_SEPARATE && WITH_COAP>3 + /* Also call the separate response example handler. */ + separate_finalize_handler(); +#endif + } +#endif /* PLATFORM_HAS_BUTTON */ +#if REST_RES_DS1820 + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("DS1820_Periodic\n"); + etimer_reset(&ds_periodic_timer); + if(ds1820_convert()){ + etimer_set(&ds_read_timer, READ_TIME); + } + } + if(etimer_expired(&ds_read_timer)) { + PRINTF("DS1820_Read\n"); + ds1820_read(); + } +#endif + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/wirelessplug/er-example-server.osd-er-lp24 b/examples/osd/wirelessplug/er-example-server.osd-er-lp24 new file mode 100755 index 0000000000000000000000000000000000000000..506f860461f7f88aa4657bf2f12098609efef4d7 GIT binary patch literal 424344 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%0AqLLc3tk@XdN2+LT_@r^CiN=--2mt#>1ufZZY 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

hsR6gWRI81slc~|eA{V#+vas;H-oayl#Iosp8 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

g|2U$ct&ZoxU+YA!PckFO<1^D17& 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 wnoLgFYarRCp6j9?-LPa(iCQ@Of + */ + +#include +#include +#include +#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 = 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(); +} diff --git a/examples/osd/wirelessplug/project-conf.h b/examples/osd/wirelessplug/project-conf.h new file mode 100644 index 000000000..1c3dd8933 --- /dev/null +++ b/examples/osd/wirelessplug/project-conf.h @@ -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__ */ diff --git a/examples/osd/wirelessplug/run.sh b/examples/osd/wirelessplug/run.sh new file mode 100755 index 000000000..02b03a5bb --- /dev/null +++ b/examples/osd/wirelessplug/run.sh @@ -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 + diff --git a/examples/osd/wirelessplug/server-client.csc b/examples/osd/wirelessplug/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/wirelessplug/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/wirelessplug/server-only.csc b/examples/osd/wirelessplug/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/wirelessplug/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/wirelessplug/static-routing.c b/examples/osd/wirelessplug/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/wirelessplug/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/wirelessplug/static-routing.h b/examples/osd/wirelessplug/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/wirelessplug/static-routing.h @@ -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_ */ From 17c93b259ef9f65fc724b496ea4142c0e93d4573 Mon Sep 17 00:00:00 2001 From: harald Date: Thu, 3 Jan 2013 16:50:25 +0100 Subject: [PATCH 004/345] add DHT11 humidity sensor --- examples/osd/er-rest-example-dht11/Makefile | 88 ++ examples/osd/er-rest-example-dht11/README | 88 ++ .../er-rest-example-dht11/er-example-client.c | 173 +++ .../er-rest-example-dht11/er-example-server.c | 1189 +++++++++++++++++ .../er-plugtest-server.c | 561 ++++++++ .../osd/er-rest-example-dht11/project-conf.h | 67 + examples/osd/er-rest-example-dht11/run.sh | 7 + .../er-rest-example-dht11/server-client.csc | 227 ++++ .../osd/er-rest-example-dht11/server-only.csc | 189 +++ .../er-rest-example-dht11/static-routing.c | 155 +++ .../er-rest-example-dht11/static-routing.h | 20 + .../er-example-server.c | 2 +- platform/osd-er-lp24/Makefile.osd-er-lp24 | 2 + platform/osd-er-lp24/contiki-conf.h | 27 +- platform/osd-er-lp24/contiki-main.c | 25 +- platform/osd-er-lp24/dev/dht11.c | 119 ++ platform/osd-er-lp24/dev/dht11.h | 72 + platform/osd-er-lp24/params.h | 4 +- 18 files changed, 2991 insertions(+), 24 deletions(-) create mode 100644 examples/osd/er-rest-example-dht11/Makefile create mode 100644 examples/osd/er-rest-example-dht11/README create mode 100644 examples/osd/er-rest-example-dht11/er-example-client.c create mode 100644 examples/osd/er-rest-example-dht11/er-example-server.c create mode 100644 examples/osd/er-rest-example-dht11/er-plugtest-server.c create mode 100644 examples/osd/er-rest-example-dht11/project-conf.h create mode 100755 examples/osd/er-rest-example-dht11/run.sh create mode 100644 examples/osd/er-rest-example-dht11/server-client.csc create mode 100644 examples/osd/er-rest-example-dht11/server-only.csc create mode 100644 examples/osd/er-rest-example-dht11/static-routing.c create mode 100644 examples/osd/er-rest-example-dht11/static-routing.h create mode 100644 platform/osd-er-lp24/dev/dht11.c create mode 100644 platform/osd-er-lp24/dev/dht11.h diff --git a/examples/osd/er-rest-example-dht11/Makefile b/examples/osd/er-rest-example-dht11/Makefile new file mode 100644 index 000000000..ea3722d59 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/Makefile @@ -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 diff --git a/examples/osd/er-rest-example-dht11/README b/examples/osd/er-rest-example-dht11/README new file mode 100644 index 000000000..06283dc5e --- /dev/null +++ b/examples/osd/er-rest-example-dht11/README @@ -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) diff --git a/examples/osd/er-rest-example-dht11/er-example-client.c b/examples/osd/er-rest-example-dht11/er-example-client.c new file mode 100644 index 000000000..d1d543cf0 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/er-example-client.c @@ -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 + */ + +#include +#include +#include + +#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(); +} diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c new file mode 100644 index 000000000..b6c1a84de --- /dev/null +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -0,0 +1,1189 @@ +/* + * 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) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 0 +#define REST_RES_DHT11 1 +#define REST_RES_HELLO 0 +#define REST_RES_MIRROR 0 /* causes largest code size */ +#define REST_RES_CHUNKS 0 +#define REST_RES_SEPARATE 0 +#define REST_RES_PUSHING 0 +#define REST_RES_EVENT 0 +#define REST_RES_SUB 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_LIGHT 0 +#define REST_RES_BATTERY 0 +#define REST_RES_RADIO 0 + + + +#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" + +// todo OSD-Testboard move to platform/dev +#include "dev/key.h" +#include "dev/led.h" +#if REST_RES_DS1820 +#include "dev/ds1820.h" +#endif +#if REST_RES_DHT11 +#include "dev/dht11.h" +uint8_t out_temp=0, humidity=0; +#endif + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_LIGHT) +#include "dev/light-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_SHT11) +#include "dev/sht11-sensor.h" +#endif +#if defined (PLATFORM_HAS_RADIO) +#include "dev/radio-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + + +#include "dev/key.c" // todo: move platform /dev +#include "dev/led.c" +#if REST_RES_DS1820 +#include "dev/ds1820.c" +#endif + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index," \"name\" : \"Button,LED\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +// mybutton +/*A simple actuator example. read the key button status*/ +RESOURCE(button, METHOD_GET | METHOD_PUT , "button", "title=\"Button\";rt=\"Text\""); +void +button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname[17]="button1"; + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); + if(is_button()) + index += sprintf(temp + index," \"state\" : \"on\"\n"); + else + index += sprintf(temp + index," \"state\" : \"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname, name,len); + bname[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "led1", "title=\"Led1\";rt=\"Text\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +#if REST_RES_DS1820 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(ds1820, METHOD_GET, "DS1820", "title=\"Temperatur\";rt=\"Temperatur\""); +void +ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; + int grad=0; + int kgrad=0; +// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ + kgrad=5; + } + grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d °C",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d °C\"}",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DS1820 + +#if REST_RES_DHT11 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(dht11, METHOD_GET, "DHT11", "title=\"TempHumidity\";rt=\"Temperatur\""); +void +dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; +// out_temp=DHT_Read_Data(DHT_Temp); +// humidity=DHT_Read_Data(DHT_RH); + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",out_temp,humidity); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",out_temp,humidity); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DHT11 + +#if REST_RES_HELLO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *len = NULL; + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; + int length = 12; /* |<-------->| */ + + /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ + if (REST.get_query_variable(request, "len", &len)) { + length = atoi(len); + if (length<0) length = 0; + if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; + memcpy(buffer, message, length); + } else { + memcpy(buffer, message, length); + } + + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ + REST.set_header_etag(response, (uint8_t *) &length, 1); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer. */ + strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); + + /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. + * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); + } + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); + } + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); + int index = 0; + for (index = 0; index 03 */ +#endif /* CoAP-specific example */ + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); + } + + if (strpos >= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + coap_set_header_uri_host(response, "tiki"); + coap_set_header_observe(response, 10); +#if WITH_COAP == 3 + coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ +#else + coap_set_header_proxy_uri(response, "ftp://x"); + coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ + coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, TEXT_PLAIN); + coap_set_header_if_none_match(response); +#endif /* CoAP > 03 */ +#endif /* CoAP-specific example */ +} +#endif /* REST_RES_MIRROR */ + +/******************************************************************************/ +#if REST_RES_CHUNKS +/* + * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation + * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, + * the byte offset where to continue is provided to the handler as int32_t pointer. + * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. + * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) + */ +RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); + +#define CHUNKS_TOTAL 2050 + +void +chunks_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 = 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); + + /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 +/* Required to manually (=not by the engine) handle the response transaction. */ +#include "er-coap-07-separate.h" +#include "er-coap-07-transactions.h" +/* + * CoAP-specific example for separate responses. + * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. + * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests. + * The resource handler must store all information that required to finalize the response later. + */ +RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\""); + +/* 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[16]; +} 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) +{ + /* + * Example allows only one open separate response. + * For multiple, the application must manage the list of stores. + */ + if (separate_active) + { + coap_separate_reject(); + } + else + { + 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. */ + + /* + * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2). + * Extend the store, if the application requires additional information from this handler. + * buffer is an example field for custom information. + */ + snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo"); + } +} + +void +separate_finalize_handler() +{ + if (separate_active) + { + 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)) ) + { + 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); + + 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 + { + /* + * Set timer for retry, send error message, ... + * The example simply waits for another button press. + */ + } + } /* if (separate_active) */ +} +#endif + +/******************************************************************************/ +#if REST_RES_PUSHING +/* + * Example for a periodic resource. + * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions by managing a list of subscribers to notify. + */ +PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND); + +void +pushing_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); + + /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */ + const char *msg = "It's periodic!"; + REST.set_response_payload(response, msg, strlen(msg)); + + /* 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 +pushing_periodic_handler(resource_t *r) +{ + static uint16_t obs_counter = 0; + static char content[11]; + + ++obs_counter; + + PRINTF("TICK %u for /%s\n", obs_counter, r->url); + + /* Build notification. */ + 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 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, obs_counter, notification); +} +#endif + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs"); + +void +event_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +event_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_BUTTON */ + +/******************************************************************************/ +#if REST_RES_SUB +/* + * Example for a resource that also handles all its sub-resources. + * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. + */ +RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); + +void +sub_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); + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_sub.url); + + if (len==base_len) + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); + } + else + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); +void +light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); + uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_LIGHT */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + + +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO +/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); + +void +radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *p = NULL; + uint8_t param = 0; + int success = 1; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((len=REST.get_query_variable(request, "p", &p))) { + PRINTF("p %.*s\n", len, p); + if (strncmp(p, "lqi", len)==0) { + param = RADIO_SENSOR_LAST_VALUE; + } else if(strncmp(p,"rssi", len)==0) { + param = RADIO_SENSOR_LAST_PACKET; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success) { + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + + if (param == RADIO_SENSOR_LAST_VALUE) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); + } else if (param == RADIO_SENSOR_LAST_PACKET) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } + } else { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +void +hw_init() +{ + key_init(); + led1_off(); +#if REST_RES_DS1820 + ds1820_temp(); +#endif +#if REST_RES_DHT11 + out_temp=DHT_Read_Data(DHT_Temp); + humidity=DHT_Read_Data(DHT_RH); +#endif +} +#define MESURE_INTERVAL (20 * CLOCK_SECOND) +#define READ_TIME ( 2 * CLOCK_SECOND) + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + static struct etimer ds_periodic_timer; +#if REST_RES_DS1820 + static struct etimer ds_read_timer; +#endif + + PROCESS_BEGIN(); + + + + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_button); + rest_activate_resource(&resource_led1); + /* Activate the application-specific resources. */ +#if REST_RES_DS1820 + rest_activate_resource(&resource_ds1820); +#endif +#if REST_RES_DHT11 + rest_activate_resource(&resource_dht11); +#endif +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if REST_RES_HELLO + rest_activate_resource(&resource_helloworld); +#endif +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif +#if REST_RES_CHUNKS + rest_activate_resource(&resource_chunks); +#endif +#if REST_RES_PUSHING + rest_activate_periodic_resource(&periodic_resource_pushing); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT + rest_activate_event_resource(&resource_event); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3 + /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */ + rest_activate_resource(&resource_separate); +#endif +#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) + SENSORS_ACTIVATE(button_sensor); +#endif +#if REST_RES_SUB + rest_activate_resource(&resource_sub); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT + SENSORS_ACTIVATE(light_sensor); + rest_activate_resource(&resource_light); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO + SENSORS_ACTIVATE(radio_sensor); + rest_activate_resource(&resource_radio); +#endif + + /* Define application-specific events here. */ + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); +#if REST_RES_EVENT + /* Call the event_handler for this application-specific event. */ + event_event_handler(&resource_event); +#endif +#if REST_RES_SEPARATE && WITH_COAP>3 + /* Also call the separate response example handler. */ + separate_finalize_handler(); +#endif + } +#endif /* PLATFORM_HAS_BUTTON */ + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("Periodic\n"); + etimer_reset(&ds_periodic_timer); +#if REST_RES_DHT11 + out_temp=DHT_Read_Data(DHT_Temp); + humidity=DHT_Read_Data(DHT_RH); +#endif +#if REST_RES_DS1820 + if(ds1820_convert()){ + etimer_set(&ds_read_timer, READ_TIME); + } +#endif + } +#if REST_RES_DS1820 + if(etimer_expired(&ds_read_timer)) { + PRINTF("DS1820_Read\n"); + ds1820_read(); + } +#endif + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/er-rest-example-dht11/er-plugtest-server.c b/examples/osd/er-rest-example-dht11/er-plugtest-server.c new file mode 100644 index 000000000..051b44be0 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/er-plugtest-server.c @@ -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 + */ + +#include +#include +#include +#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 = 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(); +} diff --git a/examples/osd/er-rest-example-dht11/project-conf.h b/examples/osd/er-rest-example-dht11/project-conf.h new file mode 100644 index 000000000..1c3dd8933 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/project-conf.h @@ -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__ */ diff --git a/examples/osd/er-rest-example-dht11/run.sh b/examples/osd/er-rest-example-dht11/run.sh new file mode 100755 index 000000000..02b03a5bb --- /dev/null +++ b/examples/osd/er-rest-example-dht11/run.sh @@ -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 + diff --git a/examples/osd/er-rest-example-dht11/server-client.csc b/examples/osd/er-rest-example-dht11/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/er-rest-example-dht11/server-only.csc b/examples/osd/er-rest-example-dht11/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/er-rest-example-dht11/static-routing.c b/examples/osd/er-rest-example-dht11/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/er-rest-example-dht11/static-routing.h b/examples/osd/er-rest-example-dht11/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/er-rest-example-dht11/static-routing.h @@ -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_ */ diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c index ee2aabb4a..0b36228ad 100644 --- a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c +++ b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c @@ -45,7 +45,7 @@ /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 -#define REST_RES_DS1820 1 +#define REST_RES_DS1820 0 #define REST_RES_HELLO 0 #define REST_RES_MIRROR 0 /* causes largest code size */ #define REST_RES_CHUNKS 0 diff --git a/platform/osd-er-lp24/Makefile.osd-er-lp24 b/platform/osd-er-lp24/Makefile.osd-er-lp24 index 63580683e..9cb38a782 100644 --- a/platform/osd-er-lp24/Makefile.osd-er-lp24 +++ b/platform/osd-er-lp24/Makefile.osd-er-lp24 @@ -5,6 +5,8 @@ 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 +#Needed for DHT11 humidity sensor +CONTIKI_TARGET_SOURCEFILES += dht11.c CONTIKIAVR=$(CONTIKI)/cpu/avr CONTIKIBOARD=. diff --git a/platform/osd-er-lp24/contiki-conf.h b/platform/osd-er-lp24/contiki-conf.h index 409f02fcf..558e41b24 100644 --- a/platform/osd-er-lp24/contiki-conf.h +++ b/platform/osd-er-lp24/contiki-conf.h @@ -137,7 +137,7 @@ typedef unsigned short uip_stats_t; /* 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 */ +/* TX routine does automatic cca and optional backoffs */ #define RDC_CONF_HARDWARE_CSMA 1 /* Allow MCU sleeping between channel checks */ #define RDC_CONF_MCU_SLEEP 1 @@ -182,8 +182,8 @@ typedef unsigned short uip_stats_t; #define UIP_CONF_DHCP_LIGHT 1 -//#if 1 /* No radio cycling */ -#if 0 /* radio cycling */ +#if 1 /* No radio cycling */ +//#if 0 /* radio cycling */ #define NETSTACK_CONF_MAC nullmac_driver #define NETSTACK_CONF_RDC sicslowmac_driver @@ -194,8 +194,10 @@ typedef unsigned short uip_stats_t; #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 +/* 1 + Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode) */ +#define RF230_CONF_FRAME_RETRIES 2 +/* Number of csma retry attempts 0-5 in extended tx mode (7 does immediate tx with no csma) */ +#define RF230_CONF_CSMA_RETRIES 5 /* Default is one RAM buffer for received packets. More than one may benefit multiple TCP connections or ports */ #define RF230_CONF_RX_BUFFERS 3 #define SICSLOWPAN_CONF_FRAG 1 @@ -251,9 +253,10 @@ typedef unsigned short uip_stats_t; #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 +/* Contikimac strobes on its own, but hardware retries are faster */ +#define RF230_CONF_FRAME_RETRIES 1 +/* Long csma backoffs will compromise radio cycling; set to 0 for 1 csma */ +#define RF230_CONF_CSMA_RETRIES 0 #define SICSLOWPAN_CONF_FRAG 1 #define SICSLOWPAN_CONF_MAXAGE 3 /* 211 bytes per queue buffer. Contikimac burst mode needs 15 for a 1280 byte MTU */ @@ -264,7 +267,7 @@ typedef unsigned short uip_stats_t; #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_NBR_NBU 20 #define UIP_CONF_DS6_DEFRT_NBU 2 #define UIP_CONF_DS6_PREFIX_NBU 3 #define UIP_CONF_DS6_ROUTE_NBU 4 @@ -275,8 +278,10 @@ typedef unsigned short uip_stats_t; #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 +/* These values are guesses */ +#define RF230_CONF_FRAME_RETRIES 10 +#define RF230_CONF_CSMA_RETRIES 2 +#if RF230_CONF_CSMA_RETRIES #define NETSTACK_CONF_MAC nullmac_driver #else #define NETSTACK_CONF_MAC csma_driver diff --git a/platform/osd-er-lp24/contiki-main.c b/platform/osd-er-lp24/contiki-main.c index 66c7c1db9..bdc494b80 100644 --- a/platform/osd-er-lp24/contiki-main.c +++ b/platform/osd-er-lp24/contiki-main.c @@ -537,17 +537,22 @@ extern uip_ds6_netif_t uip_ds6_if; } if (j) PRINTF(" "); 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); + { + uip_ds6_route_t *r; + PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); + j = 1; + for(r = uip_ds6_route_list_head(); + r != NULL; + r = list_item_next(r)) { + ipaddr_add(&r->ipaddr); + PRINTF("/%u (via ", r->length); + ipaddr_add(&r->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; + PRINTF(") %lus\n", r->state.lifetime); + // } else { + // PRINTF(")\n"); + // } + j = 0; } } if (j) PRINTF(" "); diff --git a/platform/osd-er-lp24/dev/dht11.c b/platform/osd-er-lp24/dev/dht11.c new file mode 100644 index 000000000..270bfe6e2 --- /dev/null +++ b/platform/osd-er-lp24/dev/dht11.c @@ -0,0 +1,119 @@ +/* + DHT-11 Library + (c) Created by Charalampos Andrianakis on 18/12/11. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +#include +#include "contiki.h" +#include "dht11.h" +#include "led.h" // debug + +#define udelay(u) clock_delay_usec(u) +#define mdelay(u) clock_delay_msec(u) + +uint8_t DHT_Read_Data(uint8_t select){ + + //data[5] is 8byte table where data come from DHT are stored + //laststate holds laststate value + //counter is used to count microSeconds + uint8_t data[5], laststate = 0, counter = 0, j = 0, i = 0; + + //Clear array + data[0] = data[1] = data[2] = data[3] = data[4] = 0; + + uint8_t volatile sreg; + sreg = SREG; /* Save status register before disabling interrupts. */ + cli(); /* Disable interrupts. */ + + //Prepare the bus + PIN_INIT(); + //Set pin Output + //Pin High + DHT_DRIVE(); + mdelay(250); //Wait for 250mS + + //Send Request Signal + //Pin Low + OUTP_0(); + mdelay(20); //20ms Low + + //Pin High + OUTP_1(); + udelay(40); //40us High + + //Set pin Input to read Bus + //Set pin Input + DHT_RELEASE(); + laststate=DHT_INP(); //Read Pin value + + //Repeat for each Transistions + for (i=0; i254) break; + } + + if (counter>254) break; + + //laststate==_BV(DHT_PIN) checks if laststate was High + //ignore the first 2 transitions which are the DHT Response + //if (laststate==_BV(DHT_PIN) && (i > 2)) { + if ((i&0x01) && (i > 2)) { + //Save bits in segments of bytes + //Shift data[] value 1 position left + //Example. 01010100 if we shift it left one time it will be + //10101000 + led1_on(); + + data[j/8]<<=1; + if (counter >= 15) { //If it was high for more than 40uS + led1_off(); + data[j/8]|=1; //it means it is bit '1' so make a logic + led1_on(); + } //OR with the value (save it) + j++; //making an OR by 1 to this value 10101000 + led1_off(); + + } //we will have the resault 10101001 + //1 in 8-bit binary is 00000001 + //j/8 changes table record every 8 bits which means a byte has been saved + //so change to next record. 0/8=0 1/8=0 ... 7/8=0 8/8=1 ... 15/8=1 16/8=2 + laststate=DHT_INP(); //save current state + counter=0; //reset counter + + } + SREG = sreg; /* Enable interrupts. */ + + //Check if data received are correct by checking the CheckSum + if (data[0] + data[1] + data[2] + data[3] == data[4]) { + if (select==DHT_Temp) { //Return the value has been choosen + return(data[2]); + }else if(select==DHT_RH){ + return(data[0]); + } + }else{ +// uart_puts("\r\nCheck Sum Error"); + } + + return 0xff; // Check Sum Error +} diff --git a/platform/osd-er-lp24/dev/dht11.h b/platform/osd-er-lp24/dev/dht11.h new file mode 100644 index 000000000..7012b75c6 --- /dev/null +++ b/platform/osd-er-lp24/dev/dht11.h @@ -0,0 +1,72 @@ +/* + DHT-11 Library + (c) Created by Charalampos Andrianakis on 18/12/11. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +#include +#include +#include + +/* DHT 1-wire is at PortE.6 */ +#define DHT_PIN_READ PINE +#define DHT_PIN_MASK _BV(PE6) +#define DHT_PxOUT PORTE +#define DHT_PxDIR DDRE + +#define SET_PIN_INPUT() (DHT_PxDIR &= ~DHT_PIN_MASK) +#define SET_PIN_OUTPUT() (DHT_PxDIR |= DHT_PIN_MASK) + +#define OUTP_0() (DHT_PxOUT &= ~DHT_PIN_MASK) +#define OUTP_1() (DHT_PxOUT |= DHT_PIN_MASK) + +#define PIN_INIT() do{ \ + SET_PIN_INPUT(); \ + OUTP_0(); \ + } while(0) + + +/* Drive the one wire interface hight */ +#define DHT_DRIVE() do { \ + SET_PIN_OUTPUT(); \ + OUTP_1(); \ + } while (0) + +/* Release the one wire by turning on the internal pull-up. */ +#define DHT_RELEASE() do { \ + SET_PIN_INPUT(); \ + OUTP_1(); \ + } while (0) + +/* Read one bit. */ +#define DHT_INP() (DHT_PIN_READ & DHT_PIN_MASK) + +//The packet size is 40bit but each bit consists of low and high state +//so 40 x 2 = 80 transitions. Also we have 2 transistions DHT response +//and 2 transitions which indicates End Of Frame. In total 84 +#define MAXTIMINGS 84 + +//Select between Temp and Humidity Read +#define DHT_Temp 0 +#define DHT_RH 1 + +//This is the main function which requests and reads the packet +uint8_t DHT_Read_Data(uint8_t select); + diff --git a/platform/osd-er-lp24/params.h b/platform/osd-er-lp24/params.h index 0b1e7c940..da2f6e3d5 100644 --- a/platform/osd-er-lp24/params.h +++ b/platform/osd-er-lp24/params.h @@ -78,10 +78,10 @@ extern uint8_t eemem_domain_name[30]; /* 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} +#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} #else //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} -#define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x0b} +#define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} #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} From e92678a847756536a560faf3a52f51ec4112e921 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 4 Jan 2013 15:44:48 +0100 Subject: [PATCH 005/345] add sensors, internal temperature, battery --- .../er-rest-example-dht11/er-example-server.c | 47 +++++++++- .../osd/er-rest-example-dht11/project-conf.h | 7 ++ platform/osd-er-lp24/Makefile.osd-er-lp24 | 2 +- platform/osd-er-lp24/dev/adc.c | 90 ++++++++++++++++++ platform/osd-er-lp24/dev/adc.h | 7 ++ platform/osd-er-lp24/dev/battery-sensor.c | 92 +++++++++++++++++++ platform/osd-er-lp24/dev/battery-sensor.h | 48 ++++++++++ platform/osd-er-lp24/dev/temperature-sensor.c | 66 +++++++++++++ platform/osd-er-lp24/dev/temperature-sensor.h | 49 ++++++++++ 9 files changed, 405 insertions(+), 3 deletions(-) create mode 100644 platform/osd-er-lp24/dev/adc.c create mode 100644 platform/osd-er-lp24/dev/adc.h create mode 100644 platform/osd-er-lp24/dev/battery-sensor.c create mode 100644 platform/osd-er-lp24/dev/battery-sensor.h create mode 100644 platform/osd-er-lp24/dev/temperature-sensor.c create mode 100644 platform/osd-er-lp24/dev/temperature-sensor.h diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c index b6c1a84de..eec3452b6 100644 --- a/examples/osd/er-rest-example-dht11/er-example-server.c +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -45,8 +45,9 @@ /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 -#define REST_RES_DS1820 0 +#define REST_RES_DS1820 1 #define REST_RES_DHT11 1 +#define REST_RES_TEMPERATURE 1 #define REST_RES_HELLO 0 #define REST_RES_MIRROR 0 /* causes largest code size */ #define REST_RES_CHUNKS 0 @@ -89,6 +90,9 @@ uint8_t out_temp=0, humidity=0; #if defined (PLATFORM_HAS_LIGHT) #include "dev/light-sensor.h" #endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif #if defined (PLATFORM_HAS_BATTERY) #include "dev/battery-sensor.h" #endif @@ -314,7 +318,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d °C\"}",grad,kgrad); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad); length = strlen(message); memcpy(buffer, message,length ); @@ -936,6 +940,41 @@ light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } #endif /* PLATFORM_HAS_LIGHT */ +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/temperature", "title=\"Temperature status\";rt=\"Temperature\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + /******************************************************************************/ #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) /* A simple getter example. Returns the reading from light sensor with a simple etag */ @@ -1138,6 +1177,10 @@ PROCESS_THREAD(rest_server_example, ev, data) SENSORS_ACTIVATE(light_sensor); rest_activate_resource(&resource_light); #endif +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif #if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY SENSORS_ACTIVATE(battery_sensor); rest_activate_resource(&resource_battery); diff --git a/examples/osd/er-rest-example-dht11/project-conf.h b/examples/osd/er-rest-example-dht11/project-conf.h index 1c3dd8933..76558fdd5 100644 --- a/examples/osd/er-rest-example-dht11/project-conf.h +++ b/examples/osd/er-rest-example-dht11/project-conf.h @@ -32,6 +32,13 @@ #ifndef __PROJECT_RPL_WEB_CONF_H__ #define __PROJECT_RPL_WEB_CONF_H__ +//#define PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +//#define PLATFORM_HAS_LIGHT 1 +#define PLATFORM_HAS_TEMPERATURE 1 +//#define PLATFORM_HAS_BATTERY 1 +//#define PLATFORM_HAS_SHT11 1 + #define SICSLOWPAN_CONF_FRAG 1 /* Disabling RDC for demo purposes. Core updates often require more memory. */ diff --git a/platform/osd-er-lp24/Makefile.osd-er-lp24 b/platform/osd-er-lp24/Makefile.osd-er-lp24 index 9cb38a782..ad6e7200f 100644 --- a/platform/osd-er-lp24/Makefile.osd-er-lp24 +++ b/platform/osd-er-lp24/Makefile.osd-er-lp24 @@ -4,7 +4,7 @@ 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 +CONTIKI_TARGET_SOURCEFILES += temperature-sensor.c adc.c button-sensor.c sensors.c slip_uart0.c slip.c #Needed for DHT11 humidity sensor CONTIKI_TARGET_SOURCEFILES += dht11.c diff --git a/platform/osd-er-lp24/dev/adc.c b/platform/osd-er-lp24/dev/adc.c new file mode 100644 index 000000000..cdb7eb7a0 --- /dev/null +++ b/platform/osd-er-lp24/dev/adc.c @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: adc.c,v 1.1 2010/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* ADC file for Atmega128rfa1. +* \author +* Paulo Louro +*/ + +#include + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +int readADC(uint8_t pin) +{ + int result = 0; + + if ( pin >= 14 ) + pin -= 14; + + ADMUX = _BV(REFS1) | _BV(REFS0) | ( pin & 7 ) ; + ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; + + sbi(ADCSRA,ADSC); + loop_until_bit_is_clear(ADCSRA,ADSC); + + result = ADC; + + ADCSRA=0; //disable ADC + ADMUX=0; //turn off internal vref + + return result; +} + +/** +* \return Internal temperature in 0.01C, e.g. 25C is 2500 +*/ +int readInternalTemp(void) +{ + int reading = 0; + + ADCSRB |= _BV(MUX5); + ADMUX = _BV(REFS1) | _BV(REFS0) | 0b1001 ; + ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; + + sbi(ADCSRA,ADSC); + loop_until_bit_is_clear(ADCSRA,ADSC); + + reading = ADC; + + ADCSRA=0; //disable ADC + ADCSRB=0; //disable ADC + ADMUX=0; //turn off internal vref + + return reading * 113 - 27280; +} \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/adc.h b/platform/osd-er-lp24/dev/adc.h new file mode 100644 index 000000000..3fe894a1b --- /dev/null +++ b/platform/osd-er-lp24/dev/adc.h @@ -0,0 +1,7 @@ +#ifndef __ADC_ARCH_H__ +#define __ADC_ARCH_H__ + +int readADC(uint8_t pin); +int readInternalTemp(void); + +#endif /* __ADC_ARCH_H__ */ \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/battery-sensor.c b/platform/osd-er-lp24/dev/battery-sensor.c new file mode 100644 index 000000000..495d39a1e --- /dev/null +++ b/platform/osd-er-lp24/dev/battery-sensor.c @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: battery-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Battery sensor header file for Atmega128rfa1. +* \author +* Paulo Louro +* Harald Pichler +*/ + +#include "dev/battery-sensor.h" +#include "adc.h" + +/* Connect Battery(+) to pin A1, via a 1000/470 voltage divider. +* This will case a battery voltage of 5.0V to read as the max analog +* voltage of 1.6V. +* +* Connect Battery(+) to pin A1, via a 1000/(470+470) voltage divider. +* This will case a battery voltage of 3.3V to read as the max analog +* voltage of 1.6V. +*/ +#define INPUT_CHANNEL 1 + +const struct sensors_sensor battery_sensor; +/*---------------------------------------------------------------------------*/ + +/** +* \return Voltage on battery measurement pin, 4096 is 5V. +*/ +static int +value(int type) +{ + uint16_t h; + uint8_t p1; + BATMON = 16; //give BATMON time to stabilize at highest range and lowest voltage + +/* Bandgap can't be measured against supply voltage in this chip. */ +/* Use BATMON register instead */ + for ( p1=16; p1<31; p1++) { + BATMON = p1; + // delay_us(100); //delay needed? + if ((BATMON&(1< +*/ + +#ifndef __BATTERY_SENSOR_H__ +#define __BATTERY_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor battery_sensor; + +#define BATTERY_SENSOR "Battery" + +#endif /* __BATTERY_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/temperature-sensor.c b/platform/osd-er-lp24/dev/temperature-sensor.c new file mode 100644 index 000000000..c85896178 --- /dev/null +++ b/platform/osd-er-lp24/dev/temperature-sensor.c @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: temperature-sensor.c,v 1.1 2010/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Temperature sensor header file for Atmega128rfa1. +* \author +* Paulo Louro +*/ + +#include "contiki.h" +#include "dev/temperature-sensor.h" + +#define PRINTF(...) printf(__VA_ARGS__) + + +const struct sensors_sensor temperature_sensor; + +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + return readInternalTemp(); +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int c) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +status(int type) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(temperature_sensor, TEMPERATURE_SENSOR, value, configure, status); \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/temperature-sensor.h b/platform/osd-er-lp24/dev/temperature-sensor.h new file mode 100644 index 000000000..6cf5dbf26 --- /dev/null +++ b/platform/osd-er-lp24/dev/temperature-sensor.h @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: temperature-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Temperature sensor header file for Atmega128rfa1. +* \author +* Paulo Louro +*/ + +#ifndef __TEMPERATURE_SENSOR_H__ +#define __TEMPERATURE_SENSOR_H__ + +#include "lib/sensors.h" +#include "dev/adc.h" + +extern const struct sensors_sensor temperature_sensor; + +#define TEMPERATURE_SENSOR "Temperature" + +#endif /* __TEMPERATURE_SENSOR_H__ */ \ No newline at end of file From 90885f2168f5f5ef26ed4f200b58984c731cfeb9 Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 10 Jan 2013 11:33:32 +0100 Subject: [PATCH 006/345] new dht11 uri schema --- .../er-rest-example-dht11/er-example-server.c | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c index eec3452b6..503e261b6 100644 --- a/examples/osd/er-rest-example-dht11/er-example-server.c +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -78,7 +78,7 @@ #endif #if REST_RES_DHT11 #include "dev/dht11.h" -uint8_t out_temp=0, humidity=0; +uint8_t dht11_temp=0, dht11_hum=0; #endif #if defined (PLATFORM_HAS_BUTTON) @@ -156,7 +156,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); - index += sprintf(message + index," \"name\" : \"Button,LED\"\n"); + index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n"); index += sprintf(message + index,"}\n"); length = strlen(message); @@ -169,7 +169,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ // mybutton /*A simple actuator example. read the key button status*/ -RESOURCE(button, METHOD_GET | METHOD_PUT , "button", "title=\"Button\";rt=\"Text\""); +RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); void button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -218,7 +218,7 @@ button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre } /*A simple actuator example, post variable mode, relay is activated or deactivated*/ -RESOURCE(led1, METHOD_GET | METHOD_PUT , "led1", "title=\"Led1\";rt=\"Text\""); +RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); void led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -286,7 +286,7 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ #if REST_RES_DS1820 /*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(ds1820, METHOD_GET, "DS1820", "title=\"Temperatur\";rt=\"Temperatur\""); +RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); void ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -308,7 +308,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d °C",grad,kgrad); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad); length = strlen(message); memcpy(buffer, message,length ); @@ -335,16 +335,15 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre #if REST_RES_DHT11 /*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(dht11, METHOD_GET, "DHT11", "title=\"TempHumidity\";rt=\"Temperatur\""); +RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\""); void dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { - char message[100]; int length = 0; /* |<-------->| */ int ret=0; -// out_temp=DHT_Read_Data(DHT_Temp); -// humidity=DHT_Read_Data(DHT_RH); +// dht11_temp=DHT_Read_Data(DHT_Temp); +// dht11_hum=DHT_Read_Data(DHT_RH); uint16_t *accept = NULL; int num = REST.get_header_accept(request, &accept); @@ -352,7 +351,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",out_temp,humidity); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",dht11_temp,dht11_hum); length = strlen(message); memcpy(buffer, message,length ); @@ -362,7 +361,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",out_temp,humidity); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",dht11_temp,dht11_hum); length = strlen(message); memcpy(buffer, message,length ); @@ -943,7 +942,7 @@ light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred /******************************************************************************/ #if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(temperature, METHOD_GET, "sensors/temperature", "title=\"Temperature status\";rt=\"Temperature\""); +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); void temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -1080,8 +1079,8 @@ hw_init() ds1820_temp(); #endif #if REST_RES_DHT11 - out_temp=DHT_Read_Data(DHT_Temp); - humidity=DHT_Read_Data(DHT_RH); + dht11_temp=DHT_Read_Data(DHT_Temp); + dht11_hum=DHT_Read_Data(DHT_RH); #endif } #define MESURE_INTERVAL (20 * CLOCK_SECOND) @@ -1211,8 +1210,8 @@ PROCESS_THREAD(rest_server_example, ev, data) PRINTF("Periodic\n"); etimer_reset(&ds_periodic_timer); #if REST_RES_DHT11 - out_temp=DHT_Read_Data(DHT_Temp); - humidity=DHT_Read_Data(DHT_RH); + dht11_temp=DHT_Read_Data(DHT_Temp); + dht11_hum=DHT_Read_Data(DHT_RH); #endif #if REST_RES_DS1820 if(ds1820_convert()){ From 65341d8d3b7c5fa0d1d496efeaaf68dc655c2f1a Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 11 Jan 2013 10:50:53 +0100 Subject: [PATCH 007/345] use ds1820.c from /dev directory --- .../er-rest-example-dht11/er-example-server.c | 24 +++++++++---------- .../er-example-server.c | 3 --- platform/osd-er-lp24/Makefile.osd-er-lp24 | 2 ++ 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c index 503e261b6..44ed40c06 100644 --- a/examples/osd/er-rest-example-dht11/er-example-server.c +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -127,9 +127,6 @@ uint8_t dht11_temp=0, dht11_hum=0; #include "dev/key.c" // todo: move platform /dev #include "dev/led.c" -#if REST_RES_DS1820 -#include "dev/ds1820.c" -#endif /******************************************************************************/ @@ -169,7 +166,8 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ // mybutton /*A simple actuator example. read the key button status*/ -RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); +//RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); +RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\";if=\"sensor\""); void button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -218,7 +216,7 @@ button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre } /*A simple actuator example, post variable mode, relay is activated or deactivated*/ -RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); +RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\";if=\"aktor\""); void led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -286,7 +284,7 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ #if REST_RES_DS1820 /*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); +RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\";if=\"sensor\""); void ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -335,7 +333,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre #if REST_RES_DHT11 /*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\""); +RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\";if=\"sensor\""); void dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -837,7 +835,7 @@ sub_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s /******************************************************************************/ #if REST_RES_LEDS /*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ -RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\";if=\"aktor\""); void leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -887,7 +885,7 @@ leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /******************************************************************************/ #if REST_RES_TOGGLE /* A simple actuator example. Toggles the red led */ -RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\";if=\"aktor\""); void toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -899,7 +897,7 @@ toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre /******************************************************************************/ #if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\";if=\"sensor\""); void light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -942,7 +940,7 @@ light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred /******************************************************************************/ #if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\";if=\"sensor\""); void temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -977,7 +975,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre /******************************************************************************/ #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\";if=\"sensor\""); void battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -1012,7 +1010,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr #if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO /* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ -RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\";if=\"sensor\""); void radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c index 0b36228ad..e505f6165 100644 --- a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c +++ b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c @@ -118,9 +118,6 @@ #include "dev/key.c" // todo: move platform /dev #include "dev/led.c" -#if REST_RES_DS1820 -#include "dev/ds1820.c" -#endif /******************************************************************************/ diff --git a/platform/osd-er-lp24/Makefile.osd-er-lp24 b/platform/osd-er-lp24/Makefile.osd-er-lp24 index ad6e7200f..5f5f5fed6 100644 --- a/platform/osd-er-lp24/Makefile.osd-er-lp24 +++ b/platform/osd-er-lp24/Makefile.osd-er-lp24 @@ -7,6 +7,8 @@ CONTIKI_TARGET_SOURCEFILES += contiki-main.c params.c node-id.c CONTIKI_TARGET_SOURCEFILES += temperature-sensor.c adc.c button-sensor.c sensors.c slip_uart0.c slip.c #Needed for DHT11 humidity sensor CONTIKI_TARGET_SOURCEFILES += dht11.c +#Needed for DS18S20 temperature sensor +CONTIKI_TARGET_SOURCEFILES += ds1820.c CONTIKIAVR=$(CONTIKI)/cpu/avr CONTIKIBOARD=. From 1f12531618021dd02304b81b3f9b70884743879f Mon Sep 17 00:00:00 2001 From: harald42 Date: Mon, 14 Jan 2013 14:28:50 +0100 Subject: [PATCH 008/345] remove if attribute --- .../er-rest-example-dht11/er-example-server.c | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c index 44ed40c06..051bc28ac 100644 --- a/examples/osd/er-rest-example-dht11/er-example-server.c +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -135,7 +135,7 @@ uint8_t dht11_temp=0, dht11_hum=0; * Resources are defined by the RESOURCE macro. * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). */ -RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"Text\""); +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); /* * A handler function named [resource name]_handler must be implemented for each RESOURCE. @@ -167,7 +167,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ // mybutton /*A simple actuator example. read the key button status*/ //RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); -RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\";if=\"sensor\""); +RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); void button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -216,7 +216,7 @@ button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre } /*A simple actuator example, post variable mode, relay is activated or deactivated*/ -RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\";if=\"aktor\""); +RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); void led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -284,7 +284,7 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ #if REST_RES_DS1820 /*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\";if=\"sensor\""); +RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); void ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -333,7 +333,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre #if REST_RES_DHT11 /*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\";if=\"sensor\""); +RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\""); void dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -835,7 +835,7 @@ sub_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s /******************************************************************************/ #if REST_RES_LEDS /*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ -RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\";if=\"aktor\""); +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); void leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -885,7 +885,7 @@ leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /******************************************************************************/ #if REST_RES_TOGGLE /* A simple actuator example. Toggles the red led */ -RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\";if=\"aktor\""); +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); void toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -897,7 +897,7 @@ toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre /******************************************************************************/ #if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\";if=\"sensor\""); +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); void light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -940,7 +940,7 @@ light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred /******************************************************************************/ #if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\";if=\"sensor\""); +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); void temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -975,7 +975,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre /******************************************************************************/ #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\";if=\"sensor\""); +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); void battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -1010,7 +1010,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr #if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO /* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ -RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\";if=\"sensor\""); +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); void radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) From 86c4214014106ebe28d526c2024d3ea95ce5d92c Mon Sep 17 00:00:00 2001 From: harald42 Date: Mon, 14 Jan 2013 14:33:05 +0100 Subject: [PATCH 009/345] update to latest version --- .../osd/rpl-border-router/border-router.c | 60 +++++++++---------- examples/osd/rpl-border-router/httpd-simple.c | 1 - examples/osd/rpl-border-router/project-conf.h | 1 - examples/osd/rpl-border-router/slip-bridge.c | 1 - 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/examples/osd/rpl-border-router/border-router.c b/examples/osd/rpl-border-router/border-router.c index 3c3a60de5..9a40f84a1 100644 --- a/examples/osd/rpl-border-router/border-router.c +++ b/examples/osd/rpl-border-router/border-router.c @@ -57,7 +57,6 @@ 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; @@ -149,6 +148,7 @@ static PT_THREAD(generate_routes(struct httpd_state *s)) { static int i; + static uip_ds6_route_t *r; #if BUF_USES_STACK char buf[256]; #endif @@ -220,45 +220,45 @@ PT_THREAD(generate_routes(struct httpd_state *s)) #else blen = 0; #endif - for(i = 0; i < UIP_DS6_ROUTE_NB; i++) { - if(uip_ds6_routing_table[i].isused) { + + for(r = uip_ds6_route_list_head(); r != NULL; r = list_item_next(r)) { + #if BUF_USES_STACK #if WEBSERVER_CONF_ROUTE_LINKS - ADD(""); - ipaddr_add(&uip_ds6_routing_table[i].ipaddr); - ADD(""); + ADD("ipaddr); + ADD("]/status.shtml>"); + ipaddr_add(&r->ipaddr); + ADD(""); #else - ipaddr_add(&uip_ds6_routing_table[i].ipaddr); + ipaddr_add(&r->ipaddr); #endif #else #if WEBSERVER_CONF_ROUTE_LINKS - ADD(""); - 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(""); + ADD("ipaddr); + ADD("]/status.shtml>"); + SEND_STRING(&s->sout, buf); //TODO: why tunslip6 needs an output here, wpcapslip does not + blen = 0; + ipaddr_add(&r->ipaddr); + ADD(""); #else - ipaddr_add(&uip_ds6_routing_table[i].ipaddr); + ipaddr_add(&r->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("/%u (via ", r->length); + ipaddr_add(&r->nexthop); + if(1 || (r->state.lifetime < 600)) { + ADD(") %lus\n", r->state.lifetime); + } else { + ADD(")\n"); } + SEND_STRING(&s->sout, buf); +#if BUF_USES_STACK + bufptr = buf; bufend = bufptr + sizeof(buf); +#else + blen = 0; +#endif } ADD(""); diff --git a/examples/osd/rpl-border-router/httpd-simple.c b/examples/osd/rpl-border-router/httpd-simple.c index f34d5312a..115e54d45 100644 --- a/examples/osd/rpl-border-router/httpd-simple.c +++ b/examples/osd/rpl-border-router/httpd-simple.c @@ -26,7 +26,6 @@ * 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 $ */ /** diff --git a/examples/osd/rpl-border-router/project-conf.h b/examples/osd/rpl-border-router/project-conf.h index 863552544..e928a759f 100644 --- a/examples/osd/rpl-border-router/project-conf.h +++ b/examples/osd/rpl-border-router/project-conf.h @@ -26,7 +26,6 @@ * 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__ diff --git a/examples/osd/rpl-border-router/slip-bridge.c b/examples/osd/rpl-border-router/slip-bridge.c index 3b4d26af7..c7d718501 100644 --- a/examples/osd/rpl-border-router/slip-bridge.c +++ b/examples/osd/rpl-border-router/slip-bridge.c @@ -26,7 +26,6 @@ * 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 $ */ /** From 538bb6075c58b431d10ea543f3872e9ac6872cb7 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 15 Jan 2013 16:27:07 +0100 Subject: [PATCH 010/345] setup 15 NBR 50 DS6-Route --- examples/osd/rpl-border-router/README | 8 ++------ examples/osd/rpl-border-router/project-conf.h | 6 ++++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/examples/osd/rpl-border-router/README b/examples/osd/rpl-border-router/README index 71d67edac..08207e885 100644 --- a/examples/osd/rpl-border-router/README +++ b/examples/osd/rpl-border-router/README @@ -4,10 +4,6 @@ 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 +./run.sh -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 \ No newline at end of file +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 diff --git a/examples/osd/rpl-border-router/project-conf.h b/examples/osd/rpl-border-router/project-conf.h index e928a759f..d393e34a8 100644 --- a/examples/osd/rpl-border-router/project-conf.h +++ b/examples/osd/rpl-border-router/project-conf.h @@ -35,6 +35,12 @@ #define UIP_FALLBACK_INTERFACE rpl_interface #endif +/* Save some memory for the sky platform. */ +#undef UIP_CONF_DS6_NBR_NBU +#define UIP_CONF_DS6_NBR_NBU 15 +#undef UIP_CONF_DS6_ROUTE_NBU +#define UIP_CONF_DS6_ROUTE_NBU 50 + #ifndef QUEUEBUF_CONF_NUM #define QUEUEBUF_CONF_NUM 4 #endif From ff022fce0561bf4393799e4bb89a7ce4028cc78c Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 23 Jan 2013 09:20:11 +0100 Subject: [PATCH 011/345] add battery sensor --- .../er-rest-example-dht11/er-example-server.c | 2 +- .../osd/er-rest-example-dht11/project-conf.h | 2 +- platform/osd-er-lp24/Makefile.osd-er-lp24 | 3 ++- platform/osd-er-lp24/dev/battery-sensor.c | 22 +++++++------------ 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c index 051bc28ac..3eac87b8a 100644 --- a/examples/osd/er-rest-example-dht11/er-example-server.c +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -58,7 +58,7 @@ #define REST_RES_LEDS 0 #define REST_RES_TOGGLE 0 #define REST_RES_LIGHT 0 -#define REST_RES_BATTERY 0 +#define REST_RES_BATTERY 1 #define REST_RES_RADIO 0 diff --git a/examples/osd/er-rest-example-dht11/project-conf.h b/examples/osd/er-rest-example-dht11/project-conf.h index 76558fdd5..dcbd00805 100644 --- a/examples/osd/er-rest-example-dht11/project-conf.h +++ b/examples/osd/er-rest-example-dht11/project-conf.h @@ -36,7 +36,7 @@ //#define PLATFORM_HAS_BUTTON 1 //#define PLATFORM_HAS_LIGHT 1 #define PLATFORM_HAS_TEMPERATURE 1 -//#define PLATFORM_HAS_BATTERY 1 +#define PLATFORM_HAS_BATTERY 1 //#define PLATFORM_HAS_SHT11 1 #define SICSLOWPAN_CONF_FRAG 1 diff --git a/platform/osd-er-lp24/Makefile.osd-er-lp24 b/platform/osd-er-lp24/Makefile.osd-er-lp24 index 5f5f5fed6..dc7bdce5d 100644 --- a/platform/osd-er-lp24/Makefile.osd-er-lp24 +++ b/platform/osd-er-lp24/Makefile.osd-er-lp24 @@ -9,7 +9,8 @@ CONTIKI_TARGET_SOURCEFILES += temperature-sensor.c adc.c button-sensor.c sensors CONTIKI_TARGET_SOURCEFILES += dht11.c #Needed for DS18S20 temperature sensor CONTIKI_TARGET_SOURCEFILES += ds1820.c - +#Needed for Battery test +CONTIKI_TARGET_SOURCEFILES += battery-sensor.c CONTIKIAVR=$(CONTIKI)/cpu/avr CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 diff --git a/platform/osd-er-lp24/dev/battery-sensor.c b/platform/osd-er-lp24/dev/battery-sensor.c index 495d39a1e..56837baa8 100644 --- a/platform/osd-er-lp24/dev/battery-sensor.c +++ b/platform/osd-er-lp24/dev/battery-sensor.c @@ -31,30 +31,23 @@ /** * \file -* Battery sensor header file for Atmega128rfa1. +* Battery sensor file for Atmega128rfa1. * \author * Paulo Louro * Harald Pichler */ -#include "dev/battery-sensor.h" -#include "adc.h" - -/* Connect Battery(+) to pin A1, via a 1000/470 voltage divider. -* This will case a battery voltage of 5.0V to read as the max analog -* voltage of 1.6V. -* -* Connect Battery(+) to pin A1, via a 1000/(470+470) voltage divider. -* This will case a battery voltage of 3.3V to read as the max analog -* voltage of 1.6V. +/** +*The atmel rf23x radios have a low voltage detector that can be configured in units of 75 millivolts. Here is example *code for the ATmega128rfa1, where the BATMON register is in extended io space [dak664] */ -#define INPUT_CHANNEL 1 + +#include "dev/battery-sensor.h" const struct sensors_sensor battery_sensor; /*---------------------------------------------------------------------------*/ /** -* \return Voltage on battery measurement pin, 4096 is 5V. +* \return Voltage on battery measurement with BATMON register. */ static int value(int type) @@ -67,11 +60,12 @@ value(int type) /* Use BATMON register instead */ for ( p1=16; p1<31; p1++) { BATMON = p1; - // delay_us(100); //delay needed? + clock_delay_usec(100); // delay needed !! if ((BATMON&(1< Date: Wed, 23 Jan 2013 09:21:13 +0100 Subject: [PATCH 012/345] cleanup code --- platform/osd-er-lp24/dev/adc.h | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/osd-er-lp24/dev/adc.h b/platform/osd-er-lp24/dev/adc.h index 3fe894a1b..ea851f237 100644 --- a/platform/osd-er-lp24/dev/adc.h +++ b/platform/osd-er-lp24/dev/adc.h @@ -2,6 +2,7 @@ #define __ADC_ARCH_H__ int readADC(uint8_t pin); +long readVcc(); int readInternalTemp(void); #endif /* __ADC_ARCH_H__ */ \ No newline at end of file From b2040a6cd914bce4a9fa1d2ca499e8efdaa75ef7 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 12 Feb 2013 10:19:10 +0100 Subject: [PATCH 013/345] change rt tag and disable energest and radio stat --- examples/osd/er-rest-example-dht11/er-example-server.c | 2 +- platform/osd-er-lp24/contiki-conf.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c index 3eac87b8a..3b8829913 100644 --- a/examples/osd/er-rest-example-dht11/er-example-server.c +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -975,7 +975,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre /******************************************************************************/ #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); void battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { diff --git a/platform/osd-er-lp24/contiki-conf.h b/platform/osd-er-lp24/contiki-conf.h index 558e41b24..8a4d0efa6 100644 --- a/platform/osd-er-lp24/contiki-conf.h +++ b/platform/osd-er-lp24/contiki-conf.h @@ -101,10 +101,10 @@ typedef unsigned long off_t; /* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */ /* It has less overhead than ENERGEST */ -#define RADIOSTATS 1 +#define RADIOSTATS 0 /* More extensive stats, via main loop printfs or webserver status pages */ -#define ENERGEST_CONF_ON 1 +#define ENERGEST_CONF_ON 0 /* Packet statistics */ typedef unsigned short uip_stats_t; @@ -182,8 +182,8 @@ typedef unsigned short uip_stats_t; #define UIP_CONF_DHCP_LIGHT 1 -#if 1 /* No radio cycling */ -//#if 0 /* radio cycling */ +//#if 1 /* No radio cycling */ +#if 0 /* radio cycling */ #define NETSTACK_CONF_MAC nullmac_driver #define NETSTACK_CONF_RDC sicslowmac_driver From ac235b9c578fd4ba4b41431549095efa1e902859 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 12 Feb 2013 10:40:04 +0100 Subject: [PATCH 014/345] make easyer experiments --- platform/osd-er-lp24/params.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/osd-er-lp24/params.h b/platform/osd-er-lp24/params.h index da2f6e3d5..03c44db27 100644 --- a/platform/osd-er-lp24/params.h +++ b/platform/osd-er-lp24/params.h @@ -78,7 +78,8 @@ extern uint8_t eemem_domain_name[30]; /* 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, 0x03} +//#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x01} +#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} #else //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} #define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} From 104be3acfb03638da4f71b3dd4ee043372ddecde Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 12 Feb 2013 15:00:37 +0100 Subject: [PATCH 015/345] initial upload --- examples/osd/pir-sensor/Makefile | 88 ++ examples/osd/pir-sensor/README | 88 ++ examples/osd/pir-sensor/er-example-client.c | 173 +++ examples/osd/pir-sensor/er-example-server.c | 1229 ++++++++++++++++++ examples/osd/pir-sensor/er-plugtest-server.c | 561 ++++++++ examples/osd/pir-sensor/project-conf.h | 75 ++ examples/osd/pir-sensor/run.sh | 7 + examples/osd/pir-sensor/server-client.csc | 227 ++++ examples/osd/pir-sensor/server-only.csc | 189 +++ examples/osd/pir-sensor/static-routing.c | 155 +++ examples/osd/pir-sensor/static-routing.h | 20 + 11 files changed, 2812 insertions(+) create mode 100644 examples/osd/pir-sensor/Makefile create mode 100644 examples/osd/pir-sensor/README create mode 100644 examples/osd/pir-sensor/er-example-client.c create mode 100644 examples/osd/pir-sensor/er-example-server.c create mode 100644 examples/osd/pir-sensor/er-plugtest-server.c create mode 100644 examples/osd/pir-sensor/project-conf.h create mode 100755 examples/osd/pir-sensor/run.sh create mode 100644 examples/osd/pir-sensor/server-client.csc create mode 100644 examples/osd/pir-sensor/server-only.csc create mode 100644 examples/osd/pir-sensor/static-routing.c create mode 100644 examples/osd/pir-sensor/static-routing.h diff --git a/examples/osd/pir-sensor/Makefile b/examples/osd/pir-sensor/Makefile new file mode 100644 index 000000000..ea3722d59 --- /dev/null +++ b/examples/osd/pir-sensor/Makefile @@ -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 diff --git a/examples/osd/pir-sensor/README b/examples/osd/pir-sensor/README new file mode 100644 index 000000000..06283dc5e --- /dev/null +++ b/examples/osd/pir-sensor/README @@ -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) diff --git a/examples/osd/pir-sensor/er-example-client.c b/examples/osd/pir-sensor/er-example-client.c new file mode 100644 index 000000000..d1d543cf0 --- /dev/null +++ b/examples/osd/pir-sensor/er-example-client.c @@ -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 + */ + +#include +#include +#include + +#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(); +} diff --git a/examples/osd/pir-sensor/er-example-server.c b/examples/osd/pir-sensor/er-example-server.c new file mode 100644 index 000000000..3b8829913 --- /dev/null +++ b/examples/osd/pir-sensor/er-example-server.c @@ -0,0 +1,1229 @@ +/* + * 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) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 1 +#define REST_RES_DHT11 1 +#define REST_RES_TEMPERATURE 1 +#define REST_RES_HELLO 0 +#define REST_RES_MIRROR 0 /* causes largest code size */ +#define REST_RES_CHUNKS 0 +#define REST_RES_SEPARATE 0 +#define REST_RES_PUSHING 0 +#define REST_RES_EVENT 0 +#define REST_RES_SUB 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_LIGHT 0 +#define REST_RES_BATTERY 1 +#define REST_RES_RADIO 0 + + + +#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" + +// todo OSD-Testboard move to platform/dev +#include "dev/key.h" +#include "dev/led.h" +#if REST_RES_DS1820 +#include "dev/ds1820.h" +#endif +#if REST_RES_DHT11 +#include "dev/dht11.h" +uint8_t dht11_temp=0, dht11_hum=0; +#endif + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_LIGHT) +#include "dev/light-sensor.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_SHT11) +#include "dev/sht11-sensor.h" +#endif +#if defined (PLATFORM_HAS_RADIO) +#include "dev/radio-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + + +#include "dev/key.c" // todo: move platform /dev +#include "dev/led.c" + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +// mybutton +/*A simple actuator example. read the key button status*/ +//RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); +RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); +void +button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname[17]="button1"; + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); + if(is_button()) + index += sprintf(temp + index," \"state\" : \"on\"\n"); + else + index += sprintf(temp + index," \"state\" : \"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname, name,len); + bname[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +#if REST_RES_DS1820 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); +void +ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; + int grad=0; + int kgrad=0; +// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ + kgrad=5; + } + grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DS1820 + +#if REST_RES_DHT11 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\""); +void +dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; +// dht11_temp=DHT_Read_Data(DHT_Temp); +// dht11_hum=DHT_Read_Data(DHT_RH); + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",dht11_temp,dht11_hum); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",dht11_temp,dht11_hum); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DHT11 + +#if REST_RES_HELLO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *len = NULL; + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; + int length = 12; /* |<-------->| */ + + /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ + if (REST.get_query_variable(request, "len", &len)) { + length = atoi(len); + if (length<0) length = 0; + if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; + memcpy(buffer, message, length); + } else { + memcpy(buffer, message, length); + } + + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ + REST.set_header_etag(response, (uint8_t *) &length, 1); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer. */ + strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); + + /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. + * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); + } + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); + } + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); + int index = 0; + for (index = 0; index 03 */ +#endif /* CoAP-specific example */ + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); + } + + if (strpos >= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + coap_set_header_uri_host(response, "tiki"); + coap_set_header_observe(response, 10); +#if WITH_COAP == 3 + coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ +#else + coap_set_header_proxy_uri(response, "ftp://x"); + coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ + coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, TEXT_PLAIN); + coap_set_header_if_none_match(response); +#endif /* CoAP > 03 */ +#endif /* CoAP-specific example */ +} +#endif /* REST_RES_MIRROR */ + +/******************************************************************************/ +#if REST_RES_CHUNKS +/* + * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation + * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, + * the byte offset where to continue is provided to the handler as int32_t pointer. + * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. + * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) + */ +RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); + +#define CHUNKS_TOTAL 2050 + +void +chunks_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 = 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); + + /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 +/* Required to manually (=not by the engine) handle the response transaction. */ +#include "er-coap-07-separate.h" +#include "er-coap-07-transactions.h" +/* + * CoAP-specific example for separate responses. + * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. + * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests. + * The resource handler must store all information that required to finalize the response later. + */ +RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\""); + +/* 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[16]; +} 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) +{ + /* + * Example allows only one open separate response. + * For multiple, the application must manage the list of stores. + */ + if (separate_active) + { + coap_separate_reject(); + } + else + { + 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. */ + + /* + * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2). + * Extend the store, if the application requires additional information from this handler. + * buffer is an example field for custom information. + */ + snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo"); + } +} + +void +separate_finalize_handler() +{ + if (separate_active) + { + 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)) ) + { + 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); + + 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 + { + /* + * Set timer for retry, send error message, ... + * The example simply waits for another button press. + */ + } + } /* if (separate_active) */ +} +#endif + +/******************************************************************************/ +#if REST_RES_PUSHING +/* + * Example for a periodic resource. + * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions by managing a list of subscribers to notify. + */ +PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND); + +void +pushing_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); + + /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */ + const char *msg = "It's periodic!"; + REST.set_response_payload(response, msg, strlen(msg)); + + /* 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 +pushing_periodic_handler(resource_t *r) +{ + static uint16_t obs_counter = 0; + static char content[11]; + + ++obs_counter; + + PRINTF("TICK %u for /%s\n", obs_counter, r->url); + + /* Build notification. */ + 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 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, obs_counter, notification); +} +#endif + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs"); + +void +event_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +event_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_BUTTON */ + +/******************************************************************************/ +#if REST_RES_SUB +/* + * Example for a resource that also handles all its sub-resources. + * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. + */ +RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); + +void +sub_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); + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_sub.url); + + if (len==base_len) + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); + } + else + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); +void +light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); + uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_LIGHT */ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + + +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO +/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); + +void +radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *p = NULL; + uint8_t param = 0; + int success = 1; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((len=REST.get_query_variable(request, "p", &p))) { + PRINTF("p %.*s\n", len, p); + if (strncmp(p, "lqi", len)==0) { + param = RADIO_SENSOR_LAST_VALUE; + } else if(strncmp(p,"rssi", len)==0) { + param = RADIO_SENSOR_LAST_PACKET; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success) { + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + + if (param == RADIO_SENSOR_LAST_VALUE) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); + } else if (param == RADIO_SENSOR_LAST_PACKET) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } + } else { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +void +hw_init() +{ + key_init(); + led1_off(); +#if REST_RES_DS1820 + ds1820_temp(); +#endif +#if REST_RES_DHT11 + dht11_temp=DHT_Read_Data(DHT_Temp); + dht11_hum=DHT_Read_Data(DHT_RH); +#endif +} +#define MESURE_INTERVAL (20 * CLOCK_SECOND) +#define READ_TIME ( 2 * CLOCK_SECOND) + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + static struct etimer ds_periodic_timer; +#if REST_RES_DS1820 + static struct etimer ds_read_timer; +#endif + + PROCESS_BEGIN(); + + + + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_button); + rest_activate_resource(&resource_led1); + /* Activate the application-specific resources. */ +#if REST_RES_DS1820 + rest_activate_resource(&resource_ds1820); +#endif +#if REST_RES_DHT11 + rest_activate_resource(&resource_dht11); +#endif +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if REST_RES_HELLO + rest_activate_resource(&resource_helloworld); +#endif +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif +#if REST_RES_CHUNKS + rest_activate_resource(&resource_chunks); +#endif +#if REST_RES_PUSHING + rest_activate_periodic_resource(&periodic_resource_pushing); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT + rest_activate_event_resource(&resource_event); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3 + /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */ + rest_activate_resource(&resource_separate); +#endif +#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) + SENSORS_ACTIVATE(button_sensor); +#endif +#if REST_RES_SUB + rest_activate_resource(&resource_sub); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT + SENSORS_ACTIVATE(light_sensor); + rest_activate_resource(&resource_light); +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO + SENSORS_ACTIVATE(radio_sensor); + rest_activate_resource(&resource_radio); +#endif + + /* Define application-specific events here. */ + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); +#if REST_RES_EVENT + /* Call the event_handler for this application-specific event. */ + event_event_handler(&resource_event); +#endif +#if REST_RES_SEPARATE && WITH_COAP>3 + /* Also call the separate response example handler. */ + separate_finalize_handler(); +#endif + } +#endif /* PLATFORM_HAS_BUTTON */ + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("Periodic\n"); + etimer_reset(&ds_periodic_timer); +#if REST_RES_DHT11 + dht11_temp=DHT_Read_Data(DHT_Temp); + dht11_hum=DHT_Read_Data(DHT_RH); +#endif +#if REST_RES_DS1820 + if(ds1820_convert()){ + etimer_set(&ds_read_timer, READ_TIME); + } +#endif + } +#if REST_RES_DS1820 + if(etimer_expired(&ds_read_timer)) { + PRINTF("DS1820_Read\n"); + ds1820_read(); + } +#endif + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/pir-sensor/er-plugtest-server.c b/examples/osd/pir-sensor/er-plugtest-server.c new file mode 100644 index 000000000..051b44be0 --- /dev/null +++ b/examples/osd/pir-sensor/er-plugtest-server.c @@ -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 + */ + +#include +#include +#include +#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 = 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(); +} diff --git a/examples/osd/pir-sensor/project-conf.h b/examples/osd/pir-sensor/project-conf.h new file mode 100644 index 000000000..530813719 --- /dev/null +++ b/examples/osd/pir-sensor/project-conf.h @@ -0,0 +1,75 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_BUTTON 1 +//#define PLATFORM_HAS_BUTTON 1 +//#define PLATFORM_HAS_LIGHT 1 +//#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 +//#define PLATFORM_HAS_SHT11 1 + +#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__ */ diff --git a/examples/osd/pir-sensor/run.sh b/examples/osd/pir-sensor/run.sh new file mode 100755 index 000000000..02b03a5bb --- /dev/null +++ b/examples/osd/pir-sensor/run.sh @@ -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 + diff --git a/examples/osd/pir-sensor/server-client.csc b/examples/osd/pir-sensor/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/pir-sensor/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/pir-sensor/server-only.csc b/examples/osd/pir-sensor/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/pir-sensor/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/pir-sensor/static-routing.c b/examples/osd/pir-sensor/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/pir-sensor/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/pir-sensor/static-routing.h b/examples/osd/pir-sensor/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/pir-sensor/static-routing.h @@ -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_ */ From 48217bcf80b9fd66d9bd9b3ec80f6c1d913a63b1 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 12 Feb 2013 15:02:16 +0100 Subject: [PATCH 016/345] initial upload --- platform/osd-er-lp24/dev/button-sensor.c | 124 +++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 platform/osd-er-lp24/dev/button-sensor.c diff --git a/platform/osd-er-lp24/dev/button-sensor.c b/platform/osd-er-lp24/dev/button-sensor.c new file mode 100644 index 000000000..d9cab0c1e --- /dev/null +++ b/platform/osd-er-lp24/dev/button-sensor.c @@ -0,0 +1,124 @@ +/* +* 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: button-sensor.c,v 1.4 2010/01/14 20:01:19 nifi Exp $ +*/ +#include "contiki.h" +#include "lib/sensors.h" +#include "dev/button-sensor.h" +//#include "dev/leds.h" + +#include + +//#include "dev/hwconf.h" +//#include "isr_compat.h" + +const struct sensors_sensor button_sensor; + +static struct timer debouncetimer; +static int status(int type); + +static int enabled = 0; + +//HWCONF_PIN(BUTTON, 2, 7); +//HWCONF_IRQ(BUTTON, 2, 7); + +#define BUTTON_BIT INTF5 +#define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 + +#define PRINTF(...) printf(__VA_ARGS__) +/*---------------------------------------------------------------------------*/ +ISR(INT6_vect) +{ + +// leds_toggle(LEDS_YELLOW); + + if(BUTTON_CHECK_IRQ()) { + if(timer_expired(&debouncetimer)) { + timer_set(&debouncetimer, CLOCK_SECOND / 4); + sensors_changed(&button_sensor); + + } + } + +} +/*---------------------------------------------------------------------------*/ +static int value(int type) +{ + return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); +} +/*---------------------------------------------------------------------------*/ +static int configure(int type, int c) +{ + PRINTF("Sensor Button Configure called: %d, %d\n",type,c); + + switch (type) { + case SENSORS_ACTIVE: + if (c) { + if(!status(SENSORS_ACTIVE)) { +timer_set(&debouncetimer, 0); + +PRINTF("Setup sensor started\n"); + +DDRE |= (0< Date: Tue, 12 Feb 2013 16:40:47 +0100 Subject: [PATCH 017/345] add button sensor with debug --- examples/osd/pir-sensor/er-example-server.c | 10 +- platform/osd-er-lp24/button-sensor.c | 45 ------- platform/osd-er-lp24/dev/button-sensor.c | 137 ++++++++------------ 3 files changed, 56 insertions(+), 136 deletions(-) delete mode 100644 platform/osd-er-lp24/button-sensor.c diff --git a/examples/osd/pir-sensor/er-example-server.c b/examples/osd/pir-sensor/er-example-server.c index 3b8829913..55ad98d4a 100644 --- a/examples/osd/pir-sensor/er-example-server.c +++ b/examples/osd/pir-sensor/er-example-server.c @@ -45,15 +45,15 @@ /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 -#define REST_RES_DS1820 1 -#define REST_RES_DHT11 1 -#define REST_RES_TEMPERATURE 1 +#define REST_RES_DS1820 0 +#define REST_RES_DHT11 0 +#define REST_RES_TEMPERATURE 0 #define REST_RES_HELLO 0 #define REST_RES_MIRROR 0 /* causes largest code size */ #define REST_RES_CHUNKS 0 #define REST_RES_SEPARATE 0 #define REST_RES_PUSHING 0 -#define REST_RES_EVENT 0 +#define REST_RES_EVENT 1 #define REST_RES_SUB 0 #define REST_RES_LEDS 0 #define REST_RES_TOGGLE 0 @@ -765,7 +765,7 @@ pushing_periodic_handler(resource_t *r) * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. */ -EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs"); +EVENT_RESOURCE(event, METHOD_GET, "sensors/pir", "title=\"Event demo\";obs"); void event_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) diff --git a/platform/osd-er-lp24/button-sensor.c b/platform/osd-er-lp24/button-sensor.c deleted file mode 100644 index 4daf2237e..000000000 --- a/platform/osd-er-lp24/button-sensor.c +++ /dev/null @@ -1,45 +0,0 @@ -/* 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); - diff --git a/platform/osd-er-lp24/dev/button-sensor.c b/platform/osd-er-lp24/dev/button-sensor.c index d9cab0c1e..98339ab28 100644 --- a/platform/osd-er-lp24/dev/button-sensor.c +++ b/platform/osd-er-lp24/dev/button-sensor.c @@ -1,56 +1,20 @@ -/* -* 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: button-sensor.c,v 1.4 2010/01/14 20:01:19 nifi Exp $ -*/ -#include "contiki.h" +/* Sensor routine */ + #include "lib/sensors.h" #include "dev/button-sensor.h" -//#include "dev/leds.h" #include - -//#include "dev/hwconf.h" -//#include "isr_compat.h" +#include "led.h" // debug const struct sensors_sensor button_sensor; static struct timer debouncetimer; static int status(int type); - static int enabled = 0; +struct sensors_sensor *sensors[1]; +unsigned char sensors_flags[1]; -//HWCONF_PIN(BUTTON, 2, 7); -//HWCONF_IRQ(BUTTON, 2, 7); - -#define BUTTON_BIT INTF5 +#define BUTTON_BIT INTF6 #define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 #define PRINTF(...) printf(__VA_ARGS__) @@ -62,63 +26,64 @@ ISR(INT6_vect) if(BUTTON_CHECK_IRQ()) { if(timer_expired(&debouncetimer)) { + led1_on(); timer_set(&debouncetimer, CLOCK_SECOND / 4); sensors_changed(&button_sensor); - + led1_off(); } } } /*---------------------------------------------------------------------------*/ -static int value(int type) + +static int +value(int type) { - return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); + return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); + //return 0; } -/*---------------------------------------------------------------------------*/ -static int configure(int type, int c) + +static int +configure(int type, int c) { PRINTF("Sensor Button Configure called: %d, %d\n",type,c); - - switch (type) { - case SENSORS_ACTIVE: - if (c) { - if(!status(SENSORS_ACTIVE)) { -timer_set(&debouncetimer, 0); - -PRINTF("Setup sensor started\n"); - -DDRE |= (0< Date: Wed, 13 Feb 2013 15:06:33 +0100 Subject: [PATCH 018/345] cleanup code --- examples/osd/pir-sensor/er-example-server.c | 825 +------------------- examples/osd/pir-sensor/project-conf.h | 4 +- 2 files changed, 33 insertions(+), 796 deletions(-) diff --git a/examples/osd/pir-sensor/er-example-server.c b/examples/osd/pir-sensor/er-example-server.c index 55ad98d4a..eff92b12a 100644 --- a/examples/osd/pir-sensor/er-example-server.c +++ b/examples/osd/pir-sensor/er-example-server.c @@ -31,9 +31,10 @@ /** * \file - * Erbium (Er) REST Engine example (with CoAP-specific code) + * Erbium (Er) PIR REST Engine example (with CoAP-specific code) * \author * Matthias Kovatsch + * Harald Pichler */ #include @@ -45,23 +46,11 @@ /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 -#define REST_RES_DS1820 0 -#define REST_RES_DHT11 0 #define REST_RES_TEMPERATURE 0 -#define REST_RES_HELLO 0 -#define REST_RES_MIRROR 0 /* causes largest code size */ -#define REST_RES_CHUNKS 0 -#define REST_RES_SEPARATE 0 -#define REST_RES_PUSHING 0 #define REST_RES_EVENT 1 -#define REST_RES_SUB 0 #define REST_RES_LEDS 0 #define REST_RES_TOGGLE 0 -#define REST_RES_LIGHT 0 #define REST_RES_BATTERY 1 -#define REST_RES_RADIO 0 - - #if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET) && !defined (CONTIKI_TARGET_NATIVE) #warning "Compiling with static routing!" @@ -70,25 +59,15 @@ #include "erbium.h" -// todo OSD-Testboard move to platform/dev -#include "dev/key.h" #include "dev/led.h" -#if REST_RES_DS1820 -#include "dev/ds1820.h" -#endif -#if REST_RES_DHT11 -#include "dev/dht11.h" -uint8_t dht11_temp=0, dht11_hum=0; -#endif - #if defined (PLATFORM_HAS_BUTTON) #include "dev/button-sensor.h" #endif #if defined (PLATFORM_HAS_LEDS) #include "dev/leds.h" #endif -#if defined (PLATFORM_HAS_LIGHT) -#include "dev/light-sensor.h" +#if defined (PLATFORM_HAS_PIR) +#include "dev/pir-sensor.h" #endif #if defined (PLATFORM_HAS_TEMPERATURE) #include "dev/temperature-sensor.h" @@ -96,12 +75,6 @@ uint8_t dht11_temp=0, dht11_hum=0; #if defined (PLATFORM_HAS_BATTERY) #include "dev/battery-sensor.h" #endif -#if defined (PLATFORM_HAS_SHT11) -#include "dev/sht11-sensor.h" -#endif -#if defined (PLATFORM_HAS_RADIO) -#include "dev/radio-sensor.h" -#endif /* For CoAP-specific example: not required for normal RESTful Web service. */ @@ -124,10 +97,6 @@ uint8_t dht11_temp=0, dht11_hum=0; #define PRINTLLADDR(addr) #endif - -#include "dev/key.c" // todo: move platform /dev -#include "dev/led.c" - /******************************************************************************/ #if REST_RES_INFO @@ -152,8 +121,8 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format - index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); - index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n"); + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); + index += sprintf(message + index," \"name\" : \"6lowpan-PIR\"\n"); index += sprintf(message + index,"}\n"); length = strlen(message); @@ -164,56 +133,6 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } #endif -// mybutton -/*A simple actuator example. read the key button status*/ -//RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); -RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); -void -button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - static char bname[17]="button1"; - int success = 1; - - char temp[100]; - int index = 0; - int length = 0; /* |<-------->| */ - const char *name = NULL; - size_t len = 0; - - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); - if(is_button()) - index += sprintf(temp + index," \"state\" : \"on\"\n"); - else - index += sprintf(temp + index," \"state\" : \"off\"\n"); - index += sprintf(temp + index,"}\n"); - - length = strlen(temp); - memcpy(buffer, temp,length ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, length); - - break; - case METHOD_PUT: - - if (success && (len=REST.get_post_variable(request, "name", &name))) { - PRINTF("name %s\n", name); - memcpy(bname, name,len); - bname[len]=0; - } else { - success = 0; - } - break; - default: - success = 0; - } - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} /*A simple actuator example, post variable mode, relay is activated or deactivated*/ RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); @@ -282,493 +201,17 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } } -#if REST_RES_DS1820 -/*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); -void -ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - - char message[100]; - int length = 0; /* |<-------->| */ - int ret=0; - int grad=0; - int kgrad=0; -// ret=ds1820_temp(); - if(ds1820_ok[0] & 0x01){ - kgrad=5; - } - grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; - - uint16_t *accept = NULL; - int num = REST.get_header_accept(request, &accept); - - if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) - { - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad); - - length = strlen(message); - memcpy(buffer, message,length ); - - REST.set_response_payload(response, buffer, length); - } - else if (num && (accept[0]==REST.type.APPLICATION_JSON)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad); - - length = strlen(message); - memcpy(buffer, message,length ); - - REST.set_response_payload(response, buffer, length); - } - else - { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); - REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); - } -} -#endif //REST_RES_DS1820 - -#if REST_RES_DHT11 -/*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\""); -void -dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - char message[100]; - int length = 0; /* |<-------->| */ - int ret=0; -// dht11_temp=DHT_Read_Data(DHT_Temp); -// dht11_hum=DHT_Read_Data(DHT_RH); - - uint16_t *accept = NULL; - int num = REST.get_header_accept(request, &accept); - - if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) - { - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",dht11_temp,dht11_hum); - - length = strlen(message); - memcpy(buffer, message,length ); - - REST.set_response_payload(response, buffer, length); - } - else if (num && (accept[0]==REST.type.APPLICATION_JSON)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",dht11_temp,dht11_hum); - - length = strlen(message); - memcpy(buffer, message,length ); - - REST.set_response_payload(response, buffer, length); - } - else - { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); - REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); - } -} -#endif //REST_RES_DHT11 - -#if REST_RES_HELLO -/* - * Resources are defined by the RESOURCE macro. - * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). - */ -RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); - -/* - * A handler function named [resource name]_handler must be implemented for each RESOURCE. - * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore - * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. - * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. - */ -void -helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - const char *len = NULL; - /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ - char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; - int length = 12; /* |<-------->| */ - - /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ - if (REST.get_query_variable(request, "len", &len)) { - length = atoi(len); - if (length<0) length = 0; - if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; - memcpy(buffer, message, length); - } else { - memcpy(buffer, message, length); - } - - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ - REST.set_header_etag(response, (uint8_t *) &length, 1); - REST.set_response_payload(response, buffer, length); -} -#endif - /******************************************************************************/ -#if REST_RES_MIRROR -/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ -RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); - -void -mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - /* The ETag and Token is copied to the header. */ - uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; - - /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ - static char location[] = {'/','f','/','a','?','k','&','e', 0}; - - /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ - unsigned int content_type = REST.get_header_content_type(request); - - /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ - uint32_t max_age = 0; - const char *str = NULL; - uint32_t observe = 0; - const uint8_t *bytes = NULL; - uint32_t block_num = 0; - uint8_t block_more = 0; - uint16_t block_size = 0; - const char *query = ""; - int len = 0; - - /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ - - int strpos = 0; - /* snprintf() counts the terminating '\0' to the size parameter. - * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. - * Add +1 to fill the complete buffer. */ - strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); - - /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. - * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ - if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); - } - - if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); - } - -/* CoAP-specific example: actions not required for normal RESTful Web service. */ -#if WITH_COAP > 1 - if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); - } - if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); - int index = 0; - for (index = 0; index 03 */ -#endif /* CoAP-specific example */ - - if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); - } - if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); - } - - if (strpos >= REST_MAX_CHUNK_SIZE) - { - buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ - } - - REST.set_response_payload(response, buffer, strpos); - - PRINTF("/mirror options received: %s\n", buffer); - - /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ - REST.set_header_etag(response, opaque, 2); - REST.set_header_location(response, location); /* Initial slash is omitted by framework */ - -/* CoAP-specific example: actions not required for normal RESTful Web service. */ -#if WITH_COAP > 1 - coap_set_header_uri_host(response, "tiki"); - coap_set_header_observe(response, 10); -#if WITH_COAP == 3 - coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ -#else - coap_set_header_proxy_uri(response, "ftp://x"); - coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ - coap_set_header_block1(response, 23, 0, 16); - coap_set_header_accept(response, TEXT_PLAIN); - coap_set_header_if_none_match(response); -#endif /* CoAP > 03 */ -#endif /* CoAP-specific example */ -} -#endif /* REST_RES_MIRROR */ - -/******************************************************************************/ -#if REST_RES_CHUNKS -/* - * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation - * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, - * the byte offset where to continue is provided to the handler as int32_t pointer. - * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. - * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) - */ -RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); - -#define CHUNKS_TOTAL 2050 - -void -chunks_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 = 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); - - /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 -/* Required to manually (=not by the engine) handle the response transaction. */ -#include "er-coap-07-separate.h" -#include "er-coap-07-transactions.h" -/* - * CoAP-specific example for separate responses. - * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. - * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests. - * The resource handler must store all information that required to finalize the response later. - */ -RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\""); - -/* 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[16]; -} 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) -{ - /* - * Example allows only one open separate response. - * For multiple, the application must manage the list of stores. - */ - if (separate_active) - { - coap_separate_reject(); - } - else - { - 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. */ - - /* - * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2). - * Extend the store, if the application requires additional information from this handler. - * buffer is an example field for custom information. - */ - snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo"); - } -} - -void -separate_finalize_handler() -{ - if (separate_active) - { - 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)) ) - { - 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); - - 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 - { - /* - * Set timer for retry, send error message, ... - * The example simply waits for another button press. - */ - } - } /* if (separate_active) */ -} -#endif - -/******************************************************************************/ -#if REST_RES_PUSHING -/* - * Example for a periodic resource. - * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler(). - * A default post_handler takes care of subscriptions by managing a list of subscribers to notify. - */ -PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND); - -void -pushing_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); - - /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */ - const char *msg = "It's periodic!"; - REST.set_response_payload(response, msg, strlen(msg)); - - /* 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 -pushing_periodic_handler(resource_t *r) -{ - static uint16_t obs_counter = 0; - static char content[11]; - - ++obs_counter; - - PRINTF("TICK %u for /%s\n", obs_counter, r->url); - - /* Build notification. */ - 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 ); - coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); - - /* Notify the registered observers with the given message type, observe option, and payload. */ - REST.notify_subscribers(r, obs_counter, notification); -} -#endif - -/******************************************************************************/ -#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +#if REST_RES_EVENT && defined (PLATFORM_HAS_PIR) /* * Example for an event resource. * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. */ -EVENT_RESOURCE(event, METHOD_GET, "sensors/pir", "title=\"Event demo\";obs"); +EVENT_RESOURCE(pir, METHOD_GET, "sensors/pir", "title=\"Event demo\";obs"); void -event_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +pir_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); /* Usually, a CoAP server would response with the current resource representation. */ @@ -781,14 +224,14 @@ event_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred /* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. * It will be called by the REST manager process with the defined period. */ void -event_event_handler(resource_t *r) +pir_event_handler(resource_t *r) { static uint16_t event_counter = 0; static char content[12]; ++event_counter; - PRINTF("TICK %u for /%s\n", event_counter, r->url); + PRINTF("PIR TICK %u for /%s\n", event_counter, r->url); /* Build notification. */ coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ @@ -798,37 +241,7 @@ event_event_handler(resource_t *r) /* Notify the registered observers with the given message type, observe option, and payload. */ REST.notify_subscribers(r, event_counter, notification); } -#endif /* PLATFORM_HAS_BUTTON */ - -/******************************************************************************/ -#if REST_RES_SUB -/* - * Example for a resource that also handles all its sub-resources. - * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. - */ -RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); - -void -sub_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); - - const char *uri_path = NULL; - int len = REST.get_url(request, &uri_path); - int base_len = strlen(resource_sub.url); - - if (len==base_len) - { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); - } - else - { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); - } - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); -} -#endif +#endif /* PLATFORM_HAS_PIR */ /******************************************************************************/ #if defined (PLATFORM_HAS_LEDS) @@ -895,47 +308,6 @@ toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre #endif /* PLATFORM_HAS_LEDS */ /******************************************************************************/ -#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) -/* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); -void -light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); - uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); - - const uint16_t *accept = NULL; - int num = REST.get_header_accept(request, &accept); - - if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) - { - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); - - REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); - } - else if (num && (accept[0]==REST.type.APPLICATION_XML)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_XML); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); - } - else if (num && (accept[0]==REST.type.APPLICATION_JSON)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); - } - else - { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); - const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; - REST.set_response_payload(response, msg, strlen(msg)); - } -} -#endif /* PLATFORM_HAS_LIGHT */ /******************************************************************************/ #if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) @@ -1006,98 +378,21 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } } #endif /* PLATFORM_HAS_BATTERY */ - - -#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO -/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ -RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); - -void -radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - size_t len = 0; - const char *p = NULL; - uint8_t param = 0; - int success = 1; - - const uint16_t *accept = NULL; - int num = REST.get_header_accept(request, &accept); - - if ((len=REST.get_query_variable(request, "p", &p))) { - PRINTF("p %.*s\n", len, p); - if (strncmp(p, "lqi", len)==0) { - param = RADIO_SENSOR_LAST_VALUE; - } else if(strncmp(p,"rssi", len)==0) { - param = RADIO_SENSOR_LAST_PACKET; - } else { - success = 0; - } - } else { - success = 0; - } - - if (success) { - if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) - { - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); - - REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); - } - else if (num && (accept[0]==REST.type.APPLICATION_JSON)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - - if (param == RADIO_SENSOR_LAST_VALUE) { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); - } else if (param == RADIO_SENSOR_LAST_PACKET) { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); - } - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); - } - else - { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); - const char *msg = "Supporting content-types text/plain and application/json"; - REST.set_response_payload(response, msg, strlen(msg)); - } - } else { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} -#endif +/******************************************************************************/ void hw_init() { - key_init(); led1_off(); -#if REST_RES_DS1820 - ds1820_temp(); -#endif -#if REST_RES_DHT11 - dht11_temp=DHT_Read_Data(DHT_Temp); - dht11_hum=DHT_Read_Data(DHT_RH); -#endif } -#define MESURE_INTERVAL (20 * CLOCK_SECOND) -#define READ_TIME ( 2 * CLOCK_SECOND) PROCESS(rest_server_example, "Erbium Example Server"); -AUTOSTART_PROCESSES(&rest_server_example); + +AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); PROCESS_THREAD(rest_server_example, ev, data) { - static struct etimer ds_periodic_timer; -#if REST_RES_DS1820 - static struct etimer ds_read_timer; -#endif - PROCESS_BEGIN(); - - - PRINTF("Starting Erbium Example Server\n"); #ifdef RF_CHANNEL @@ -1120,47 +415,19 @@ PROCESS_THREAD(rest_server_example, ev, data) /* Initialize the OSD Hardware. */ hw_init(); - /* Initialize the REST engine. */ rest_init_engine(); /* Activate the application-specific resources. */ - rest_activate_resource(&resource_button); rest_activate_resource(&resource_led1); - /* Activate the application-specific resources. */ -#if REST_RES_DS1820 - rest_activate_resource(&resource_ds1820); -#endif -#if REST_RES_DHT11 - rest_activate_resource(&resource_dht11); -#endif #if REST_RES_INFO rest_activate_resource(&resource_info); #endif -#if REST_RES_HELLO - rest_activate_resource(&resource_helloworld); -#endif -#if REST_RES_MIRROR - rest_activate_resource(&resource_mirror); -#endif -#if REST_RES_CHUNKS - rest_activate_resource(&resource_chunks); -#endif -#if REST_RES_PUSHING - rest_activate_periodic_resource(&periodic_resource_pushing); -#endif -#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT - rest_activate_event_resource(&resource_event); -#endif -#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3 - /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */ - rest_activate_resource(&resource_separate); -#endif -#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) - SENSORS_ACTIVATE(button_sensor); -#endif -#if REST_RES_SUB - rest_activate_resource(&resource_sub); + /* Activate the application-specific resources. */ +#if defined (PLATFORM_HAS_PIR) && (REST_RES_EVENT) + SENSORS_ACTIVATE(pir_sensor); + rest_activate_event_resource(&resource_pir); + PRINTF("ACTIVATE PIR\n"); #endif #if defined (PLATFORM_HAS_LEDS) #if REST_RES_LEDS @@ -1170,10 +437,6 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_activate_resource(&resource_toggle); #endif #endif /* PLATFORM_HAS_LEDS */ -#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT - SENSORS_ACTIVATE(light_sensor); - rest_activate_resource(&resource_light); -#endif #if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE SENSORS_ACTIVATE(temperature_sensor); rest_activate_resource(&resource_temperature); @@ -1182,47 +445,23 @@ PROCESS_THREAD(rest_server_example, ev, data) SENSORS_ACTIVATE(battery_sensor); rest_activate_resource(&resource_battery); #endif -#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO - SENSORS_ACTIVATE(radio_sensor); - rest_activate_resource(&resource_radio); -#endif /* Define application-specific events here. */ - etimer_set(&ds_periodic_timer, MESURE_INTERVAL); while(1) { PROCESS_WAIT_EVENT(); -#if defined (PLATFORM_HAS_BUTTON) - if (ev == sensors_event && data == &button_sensor) { - PRINTF("BUTTON\n"); -#if REST_RES_EVENT - /* Call the event_handler for this application-specific event. */ - event_event_handler(&resource_event); -#endif -#if REST_RES_SEPARATE && WITH_COAP>3 - /* Also call the separate response example handler. */ - separate_finalize_handler(); -#endif +#if defined (REST_RES_EVENT) + if (ev == sensors_event ) { + PRINTF("EVENT\n"); +#if (REST_RES_EVENT && defined (PLATFORM_HAS_PIR)) + if (data == &pir_sensor) { + PRINTF("PIR EVENT\n"); + /* Call the event_handler for this application-specific event. */ + pir_event_handler(&resource_pir); + PRINTF("CALL EVENT HANDLER\n"); + } +#endif /* PLATFORM_HAS_PIR */ } -#endif /* PLATFORM_HAS_BUTTON */ - if(etimer_expired(&ds_periodic_timer)) { - PRINTF("Periodic\n"); - etimer_reset(&ds_periodic_timer); -#if REST_RES_DHT11 - dht11_temp=DHT_Read_Data(DHT_Temp); - dht11_hum=DHT_Read_Data(DHT_RH); -#endif -#if REST_RES_DS1820 - if(ds1820_convert()){ - etimer_set(&ds_read_timer, READ_TIME); - } -#endif - } -#if REST_RES_DS1820 - if(etimer_expired(&ds_read_timer)) { - PRINTF("DS1820_Read\n"); - ds1820_read(); - } -#endif +#endif /* REST_RES_EVENT */ } /* while (1) */ PROCESS_END(); diff --git a/examples/osd/pir-sensor/project-conf.h b/examples/osd/pir-sensor/project-conf.h index 530813719..dfb9c756f 100644 --- a/examples/osd/pir-sensor/project-conf.h +++ b/examples/osd/pir-sensor/project-conf.h @@ -33,12 +33,10 @@ #define __PROJECT_RPL_WEB_CONF_H__ //#define PLATFORM_HAS_LEDS 1 -#define PLATFORM_HAS_BUTTON 1 //#define PLATFORM_HAS_BUTTON 1 -//#define PLATFORM_HAS_LIGHT 1 +#define PLATFORM_HAS_PIR 1 //#define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 -//#define PLATFORM_HAS_SHT11 1 #define SICSLOWPAN_CONF_FRAG 1 From 32ab451fff1d8af8d46fed6ce365cbbf6447121a Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 13 Feb 2013 15:07:49 +0100 Subject: [PATCH 019/345] add pir sensor, sensor events --- platform/osd-er-lp24/Makefile.osd-er-lp24 | 6 +++++- platform/osd-er-lp24/contiki-conf.h | 2 +- platform/osd-er-lp24/contiki-main.c | 7 +++++++ platform/osd-er-lp24/dev/button-sensor.c | 18 +++++++++--------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/platform/osd-er-lp24/Makefile.osd-er-lp24 b/platform/osd-er-lp24/Makefile.osd-er-lp24 index dc7bdce5d..ded157f14 100644 --- a/platform/osd-er-lp24/Makefile.osd-er-lp24 +++ b/platform/osd-er-lp24/Makefile.osd-er-lp24 @@ -4,13 +4,17 @@ 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 += temperature-sensor.c adc.c button-sensor.c sensors.c slip_uart0.c slip.c +CONTIKI_TARGET_SOURCEFILES += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c +#Needed for Button +CONTIKI_TARGET_SOURCEFILES += button-sensor.c #Needed for DHT11 humidity sensor CONTIKI_TARGET_SOURCEFILES += dht11.c #Needed for DS18S20 temperature sensor CONTIKI_TARGET_SOURCEFILES += ds1820.c #Needed for Battery test CONTIKI_TARGET_SOURCEFILES += battery-sensor.c +#Needed for PIR +CONTIKI_TARGET_SOURCEFILES += pir-sensor.c CONTIKIAVR=$(CONTIKI)/cpu/avr CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 diff --git a/platform/osd-er-lp24/contiki-conf.h b/platform/osd-er-lp24/contiki-conf.h index 8a4d0efa6..d99a965e2 100644 --- a/platform/osd-er-lp24/contiki-conf.h +++ b/platform/osd-er-lp24/contiki-conf.h @@ -146,7 +146,7 @@ typedef unsigned short uip_stats_t; #define RIMEADDR_CONF_SIZE 8 #define UIP_CONF_ICMP6 1 #define UIP_CONF_UDP 1 -#define UIP_CONF_TCP 1 +#define UIP_CONF_TCP 0 #define NETSTACK_CONF_NETWORK sicslowpan_driver #define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 #else diff --git a/platform/osd-er-lp24/contiki-main.c b/platform/osd-er-lp24/contiki-main.c index bdc494b80..cfc83a0f0 100644 --- a/platform/osd-er-lp24/contiki-main.c +++ b/platform/osd-er-lp24/contiki-main.c @@ -144,6 +144,11 @@ FUSES ={.low = 0xF6, .high = 0x98, .extended = 0xfd,}; FUSES ={.low = 0xC2, .high = 0x99, .extended = 0xfe,}; #endif +#include "lib/sensors.h" +#include "dev/button-sensor.h" +#include "dev/pir-sensor.h" +SENSORS(&button_sensor, &pir_sensor); + uint8_t rng_get_uint8(void) { #if 1 @@ -314,6 +319,8 @@ uint8_t i; #ifdef RAVEN_LCD_INTERFACE process_start(&raven_lcd_process, NULL); #endif + + process_start(&sensors_process, NULL); /* Autostart other processes */ autostart_start(autostart_processes); diff --git a/platform/osd-er-lp24/dev/button-sensor.c b/platform/osd-er-lp24/dev/button-sensor.c index 98339ab28..505eda9c9 100644 --- a/platform/osd-er-lp24/dev/button-sensor.c +++ b/platform/osd-er-lp24/dev/button-sensor.c @@ -14,12 +14,12 @@ static int enabled = 0; struct sensors_sensor *sensors[1]; unsigned char sensors_flags[1]; -#define BUTTON_BIT INTF6 +#define BUTTON_BIT INTF5 #define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 #define PRINTF(...) printf(__VA_ARGS__) /*---------------------------------------------------------------------------*/ -ISR(INT6_vect) +ISR(INT5_vect) { // leds_toggle(LEDS_YELLOW); @@ -39,7 +39,7 @@ ISR(INT6_vect) static int value(int type) { - return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); + return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); //return 0; } @@ -54,10 +54,10 @@ configure(int type, int c) led1_on(); timer_set(&debouncetimer, 0); PRINTF("Setup sensor started\n"); - DDRE |= (0< Date: Wed, 13 Feb 2013 15:08:55 +0100 Subject: [PATCH 020/345] initial upload --- platform/osd-er-lp24/dev/pir-sensor.c | 89 +++++++++++++++++++++++++++ platform/osd-er-lp24/dev/pir-sensor.h | 48 +++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 platform/osd-er-lp24/dev/pir-sensor.c create mode 100644 platform/osd-er-lp24/dev/pir-sensor.h diff --git a/platform/osd-er-lp24/dev/pir-sensor.c b/platform/osd-er-lp24/dev/pir-sensor.c new file mode 100644 index 000000000..78dd14eec --- /dev/null +++ b/platform/osd-er-lp24/dev/pir-sensor.c @@ -0,0 +1,89 @@ +/* Sensor routine */ + +#include "lib/sensors.h" +#include "dev/pir-sensor.h" + +#include +#include "led.h" // debug + +const struct sensors_sensor pir_sensor; + +static struct timer debouncetimer; +static int status(int type); +static int enabled = 0; +struct sensors_sensor *sensors[1]; +unsigned char sensors_flags[1]; + +#define PIR_BIT INTF6 +#define PIR_CHECK_IRQ() (EIFR & PIR_BIT) ? 0 : 1 + +#define PRINTF(...) printf(__VA_ARGS__) +/*---------------------------------------------------------------------------*/ +ISR(INT6_vect) +{ + +// leds_toggle(LEDS_YELLOW); + + if(PIR_CHECK_IRQ()) { + if(timer_expired(&debouncetimer)) { + led1_on(); + timer_set(&debouncetimer, CLOCK_SECOND / 4); + sensors_changed(&pir_sensor); + led1_off(); + } + } + +} +/*---------------------------------------------------------------------------*/ + +static int +value(int type) +{ + return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); + //return 0; +} + +static int +configure(int type, int c) +{ + PRINTF("Sensor PIR Configure called: %d, %d\n",type,c); + switch (type) { + case SENSORS_ACTIVE: + if (c) { + if(!status(SENSORS_ACTIVE)) { + led1_on(); + timer_set(&debouncetimer, 0); + PRINTF("Setup sensor started\n"); + DDRE |= (0< +*/ + +#ifndef __PIR_SENSOR_H__ +#define __PIR_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor pir_sensor; + +#define PIR_SENSOR "PIR" + +#endif /* __PIR_SENSOR_H__ */ \ No newline at end of file From a2387f43af904c91f4cd0bfa43e0997acb95d0a8 Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 14 Feb 2013 10:14:11 +0100 Subject: [PATCH 021/345] cleanup project --- examples/osd/pir-sensor/er-example-client.c | 173 ------ examples/osd/pir-sensor/er-plugtest-server.c | 561 ------------------- 2 files changed, 734 deletions(-) delete mode 100644 examples/osd/pir-sensor/er-example-client.c delete mode 100644 examples/osd/pir-sensor/er-plugtest-server.c diff --git a/examples/osd/pir-sensor/er-example-client.c b/examples/osd/pir-sensor/er-example-client.c deleted file mode 100644 index d1d543cf0..000000000 --- a/examples/osd/pir-sensor/er-example-client.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * 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 - */ - -#include -#include -#include - -#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(); -} diff --git a/examples/osd/pir-sensor/er-plugtest-server.c b/examples/osd/pir-sensor/er-plugtest-server.c deleted file mode 100644 index 051b44be0..000000000 --- a/examples/osd/pir-sensor/er-plugtest-server.c +++ /dev/null @@ -1,561 +0,0 @@ -/* - * 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 - */ - -#include -#include -#include -#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 = 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(); -} From 252454c0166c71f8ffc55c042718dfada7d0d9d2 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 15 Feb 2013 14:16:36 +0100 Subject: [PATCH 022/345] remove debug, minimize code size --- platform/osd-er-lp24/contiki-main.c | 3 ++- platform/osd-er-lp24/dev/adc.c | 5 ++--- platform/osd-er-lp24/dev/button-sensor.c | 4 ---- platform/osd-er-lp24/dev/pir-sensor.c | 6 +----- 4 files changed, 5 insertions(+), 13 deletions(-) diff --git a/platform/osd-er-lp24/contiki-main.c b/platform/osd-er-lp24/contiki-main.c index cfc83a0f0..e267b1060 100644 --- a/platform/osd-er-lp24/contiki-main.c +++ b/platform/osd-er-lp24/contiki-main.c @@ -146,8 +146,9 @@ FUSES ={.low = 0xC2, .high = 0x99, .extended = 0xfe,}; #include "lib/sensors.h" #include "dev/button-sensor.h" +#include "dev/battery-sensor.h" #include "dev/pir-sensor.h" -SENSORS(&button_sensor, &pir_sensor); +SENSORS(&button_sensor, &battery_sensor, &pir_sensor); uint8_t rng_get_uint8(void) { diff --git a/platform/osd-er-lp24/dev/adc.c b/platform/osd-er-lp24/dev/adc.c index cdb7eb7a0..82c66411f 100644 --- a/platform/osd-er-lp24/dev/adc.c +++ b/platform/osd-er-lp24/dev/adc.c @@ -54,10 +54,10 @@ int readADC(uint8_t pin) ADMUX = _BV(REFS1) | _BV(REFS0) | ( pin & 7 ) ; ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - sbi(ADCSRA,ADSC); loop_until_bit_is_clear(ADCSRA,ADSC); + result = ADC; ADCSRA=0; //disable ADC @@ -76,10 +76,9 @@ int readInternalTemp(void) ADCSRB |= _BV(MUX5); ADMUX = _BV(REFS1) | _BV(REFS0) | 0b1001 ; ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - + sbi(ADCSRA,ADSC); loop_until_bit_is_clear(ADCSRA,ADSC); - reading = ADC; ADCSRA=0; //disable ADC diff --git a/platform/osd-er-lp24/dev/button-sensor.c b/platform/osd-er-lp24/dev/button-sensor.c index 505eda9c9..491879f3a 100644 --- a/platform/osd-er-lp24/dev/button-sensor.c +++ b/platform/osd-er-lp24/dev/button-sensor.c @@ -46,14 +46,12 @@ value(int type) static int configure(int type, int c) { - PRINTF("Sensor Button Configure called: %d, %d\n",type,c); switch (type) { case SENSORS_ACTIVE: if (c) { if(!status(SENSORS_ACTIVE)) { led1_on(); timer_set(&debouncetimer, 0); - PRINTF("Setup sensor started\n"); DDRE |= (0< Date: Fri, 15 Feb 2013 14:37:01 +0100 Subject: [PATCH 023/345] remove old files --- examples/osd/pir-sensor/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/osd/pir-sensor/Makefile b/examples/osd/pir-sensor/Makefile index ea3722d59..dbd2c1410 100644 --- a/examples/osd/pir-sensor/Makefile +++ b/examples/osd/pir-sensor/Makefile @@ -1,4 +1,4 @@ -all: er-example-server er-example-client +all: er-example-server # Use this target explicitly if requried: er-plugtest-server CONTIKI=../../.. From b6f96951bef2857bc3651eacbef652b3d2898bad Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 09:48:22 +0100 Subject: [PATCH 024/345] add merkur platform --- platform/merkur/Makefile.merkur | 41 ++ platform/merkur/contiki-conf.h | 352 +++++++++++++ platform/merkur/contiki-main.c | 614 +++++++++++++++++++++++ platform/merkur/dev/adc.c | 89 ++++ platform/merkur/dev/adc.h | 8 + platform/merkur/dev/battery-sensor.c | 86 ++++ platform/merkur/dev/battery-sensor.h | 48 ++ platform/merkur/dev/button-sensor.c | 85 ++++ platform/merkur/dev/dht11.c | 119 +++++ platform/merkur/dev/dht11.h | 72 +++ platform/merkur/dev/ds1820.c | 291 +++++++++++ platform/merkur/dev/ds1820.h | 45 ++ platform/merkur/dev/key.c | 73 +++ platform/merkur/dev/key.h | 50 ++ platform/merkur/dev/led.c | 89 ++++ platform/merkur/dev/led.h | 54 ++ platform/merkur/dev/leds-arch.c | 85 ++++ platform/merkur/dev/leds-arch.h | 31 ++ platform/merkur/dev/pir-sensor.c | 85 ++++ platform/merkur/dev/pir-sensor.h | 48 ++ platform/merkur/dev/temperature-sensor.c | 66 +++ platform/merkur/dev/temperature-sensor.h | 49 ++ platform/merkur/node-id.c | 79 +++ platform/merkur/node-id.h | 44 ++ platform/merkur/params.c | 264 ++++++++++ platform/merkur/params.h | 109 ++++ platform/merkur/slip_uart0.c | 93 ++++ 27 files changed, 3069 insertions(+) create mode 100644 platform/merkur/Makefile.merkur create mode 100644 platform/merkur/contiki-conf.h create mode 100644 platform/merkur/contiki-main.c create mode 100644 platform/merkur/dev/adc.c create mode 100644 platform/merkur/dev/adc.h create mode 100644 platform/merkur/dev/battery-sensor.c create mode 100644 platform/merkur/dev/battery-sensor.h create mode 100644 platform/merkur/dev/button-sensor.c create mode 100644 platform/merkur/dev/dht11.c create mode 100644 platform/merkur/dev/dht11.h create mode 100644 platform/merkur/dev/ds1820.c create mode 100644 platform/merkur/dev/ds1820.h create mode 100644 platform/merkur/dev/key.c create mode 100644 platform/merkur/dev/key.h create mode 100644 platform/merkur/dev/led.c create mode 100644 platform/merkur/dev/led.h create mode 100644 platform/merkur/dev/leds-arch.c create mode 100644 platform/merkur/dev/leds-arch.h create mode 100644 platform/merkur/dev/pir-sensor.c create mode 100644 platform/merkur/dev/pir-sensor.h create mode 100644 platform/merkur/dev/temperature-sensor.c create mode 100644 platform/merkur/dev/temperature-sensor.h create mode 100644 platform/merkur/node-id.c create mode 100644 platform/merkur/node-id.h create mode 100644 platform/merkur/params.c create mode 100644 platform/merkur/params.h create mode 100644 platform/merkur/slip_uart0.c diff --git a/platform/merkur/Makefile.merkur b/platform/merkur/Makefile.merkur new file mode 100644 index 000000000..ded157f14 --- /dev/null +++ b/platform/merkur/Makefile.merkur @@ -0,0 +1,41 @@ +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 += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c +#Needed for Button +CONTIKI_TARGET_SOURCEFILES += button-sensor.c +#Needed for DHT11 humidity sensor +CONTIKI_TARGET_SOURCEFILES += dht11.c +#Needed for DS18S20 temperature sensor +CONTIKI_TARGET_SOURCEFILES += ds1820.c +#Needed for Battery test +CONTIKI_TARGET_SOURCEFILES += battery-sensor.c +#Needed for PIR +CONTIKI_TARGET_SOURCEFILES += pir-sensor.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 diff --git a/platform/merkur/contiki-conf.h b/platform/merkur/contiki-conf.h new file mode 100644 index 000000000..d99a965e2 --- /dev/null +++ b/platform/merkur/contiki-conf.h @@ -0,0 +1,352 @@ +/* + * 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 + */ + +#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 + +/* 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 0 + +/* More extensive stats, via main loop printfs or webserver status pages */ +#define ENERGEST_CONF_ON 0 + +/* Packet statistics */ +typedef unsigned short uip_stats_t; +#define UIP_STATISTICS 0 + +/* Available watchdog timeouts depend on mcu. Default is WDTO_2S. -1 Disables the watchdog. */ +/* AVR Studio simulator tends to reboot due to clocking the WD 8 times too fast */ +//#define WATCHDOG_CONF_TIMEOUT -1 + +/* Debugflow macro, useful for tracing path through mac and radio interrupts */ +//#define DEBUGFLOWSIZE 128 + + +/* Define MAX_*X_POWER to reduce tx power and ignore weak rx packets for testing a miniature multihop network. + * Leave undefined for full power and sensitivity. + * tx=0 (3dbm, default) to 15 (-17.2dbm) + * RF230_CONF_AUTOACK sets the extended mode using the energy-detect register with rx=0 (-91dBm) to 84 (-7dBm) + * else the rssi register is used having range 0 (91dBm) to 28 (-10dBm) + * For simplicity RF230_MIN_RX_POWER is based on the energy-detect value and divided by 3 when autoack is not set. + * On the RF230 a reduced rx power threshold will not prevent autoack if enabled and requested. + * These numbers applied to both Raven and Jackdaw give a maximum communication distance of about 15 cm + * and a 10 meter range to a full-sensitivity RF230 sniffer. +#define RF230_MAX_TX_POWER 15 +#define RF230_MIN_RX_POWER 30 + */ + /* The rf231 and atmega128rfa1 can use an rssi threshold for triggering rx_busy that saves 0.5ma in rx mode */ +/* 1 - 15 maps into -90 to -48 dBm; the register is written with RF230_MIN_RX_POWER/6 + 1. Undefine for -100dBm sensitivity */ +//#define RF230_MIN_RX_POWER 0 + +/* Network setup */ +/* TX routine passes the cca/ack result in the return parameter */ +#define RDC_CONF_HARDWARE_ACK 1 +/* TX routine does automatic cca and optional backoffs */ +#define RDC_CONF_HARDWARE_CSMA 1 +/* Allow MCU sleeping between channel checks */ +#define RDC_CONF_MCU_SLEEP 1 + +#if UIP_CONF_IPV6 +#define RIMEADDR_CONF_SIZE 8 +#define UIP_CONF_ICMP6 1 +#define UIP_CONF_UDP 1 +#define UIP_CONF_TCP 0 +#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 +/* 1 + Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode) */ +#define RF230_CONF_FRAME_RETRIES 2 +/* Number of csma retry attempts 0-5 in extended tx mode (7 does immediate tx with no csma) */ +#define RF230_CONF_CSMA_RETRIES 5 +/* Default is one RAM buffer for received packets. More than one may benefit multiple TCP connections or ports */ +#define RF230_CONF_RX_BUFFERS 3 +#define SICSLOWPAN_CONF_FRAG 1 +/* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */ +#define SICSLOWPAN_CONF_MAXAGE 3 +/* How long to wait before terminating an idle TCP connection. Smaller to allow faster sleep. Default is 120 seconds */ +/* If wait is too short the connection can be reset as a result of multiple fragment reassembly timeouts */ +#define UIP_CONF_WAIT_TIMEOUT 20 +/* 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 */ +/* Contikimac strobes on its own, but hardware retries are faster */ +#define RF230_CONF_FRAME_RETRIES 1 +/* Long csma backoffs will compromise radio cycling; set to 0 for 1 csma */ +#define RF230_CONF_CSMA_RETRIES 0 +#define SICSLOWPAN_CONF_FRAG 1 +#define SICSLOWPAN_CONF_MAXAGE 3 +/* 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 20 +#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) */ +/* These values are guesses */ +#define RF230_CONF_FRAME_RETRIES 10 +#define RF230_CONF_CSMA_RETRIES 2 +#if RF230_CONF_CSMA_RETRIES +#define NETSTACK_CONF_MAC nullmac_driver +#else +#define NETSTACK_CONF_MAC csma_driver +#endif +#define NETSTACK_CONF_RDC cxmac_driver +#define NETSTACK_CONF_FRAMER framer_802154 +#define 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__ */ diff --git a/platform/merkur/contiki-main.c b/platform/merkur/contiki-main.c new file mode 100644 index 000000000..e267b1060 --- /dev/null +++ b/platform/merkur/contiki-main.c @@ -0,0 +1,614 @@ +/* + * 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 +#include +#include +#include +#include +#include + +#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 +#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 + +#include "lib/sensors.h" +#include "dev/button-sensor.h" +#include "dev/battery-sensor.h" +#include "dev/pir-sensor.h" +SENSORS(&button_sensor, &battery_sensor, &pir_sensor); + +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< +//#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 + + process_start(&sensors_process, NULL); + + /* 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); +//

+ } +#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>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<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<"); + PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); + { + uip_ds6_route_t *r; + PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); + j = 1; + for(r = uip_ds6_route_list_head(); + r != NULL; + r = list_item_next(r)) { + ipaddr_add(&r->ipaddr); + PRINTF("/%u (via ", r->length); + ipaddr_add(&r->nexthop); + // if(uip_ds6_routing_table[i].state.lifetime < 600) { + PRINTF(") %lus\n", r->state.lifetime); + // } else { + // PRINTF(")\n"); + // } + j = 0; + } + } + if (j) PRINTF(" "); + 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 +*/ + +#include + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +int readADC(uint8_t pin) +{ + int result = 0; + + if ( pin >= 14 ) + pin -= 14; + + ADMUX = _BV(REFS1) | _BV(REFS0) | ( pin & 7 ) ; + ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; + sbi(ADCSRA,ADSC); + loop_until_bit_is_clear(ADCSRA,ADSC); + + + result = ADC; + + ADCSRA=0; //disable ADC + ADMUX=0; //turn off internal vref + + return result; +} + +/** +* \return Internal temperature in 0.01C, e.g. 25C is 2500 +*/ +int readInternalTemp(void) +{ + int reading = 0; + + ADCSRB |= _BV(MUX5); + ADMUX = _BV(REFS1) | _BV(REFS0) | 0b1001 ; + ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; + + sbi(ADCSRA,ADSC); + loop_until_bit_is_clear(ADCSRA,ADSC); + reading = ADC; + + ADCSRA=0; //disable ADC + ADCSRB=0; //disable ADC + ADMUX=0; //turn off internal vref + + return reading * 113 - 27280; +} \ No newline at end of file diff --git a/platform/merkur/dev/adc.h b/platform/merkur/dev/adc.h new file mode 100644 index 000000000..ea851f237 --- /dev/null +++ b/platform/merkur/dev/adc.h @@ -0,0 +1,8 @@ +#ifndef __ADC_ARCH_H__ +#define __ADC_ARCH_H__ + +int readADC(uint8_t pin); +long readVcc(); +int readInternalTemp(void); + +#endif /* __ADC_ARCH_H__ */ \ No newline at end of file diff --git a/platform/merkur/dev/battery-sensor.c b/platform/merkur/dev/battery-sensor.c new file mode 100644 index 000000000..56837baa8 --- /dev/null +++ b/platform/merkur/dev/battery-sensor.c @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: battery-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Battery sensor file for Atmega128rfa1. +* \author +* Paulo Louro +* Harald Pichler +*/ + +/** +*The atmel rf23x radios have a low voltage detector that can be configured in units of 75 millivolts. Here is example *code for the ATmega128rfa1, where the BATMON register is in extended io space [dak664] +*/ + +#include "dev/battery-sensor.h" + +const struct sensors_sensor battery_sensor; +/*---------------------------------------------------------------------------*/ + +/** +* \return Voltage on battery measurement with BATMON register. +*/ +static int +value(int type) +{ + uint16_t h; + uint8_t p1; + BATMON = 16; //give BATMON time to stabilize at highest range and lowest voltage + +/* Bandgap can't be measured against supply voltage in this chip. */ +/* Use BATMON register instead */ + for ( p1=16; p1<31; p1++) { + BATMON = p1; + clock_delay_usec(100); // delay needed !! + if ((BATMON&(1< +*/ + +#ifndef __BATTERY_SENSOR_H__ +#define __BATTERY_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor battery_sensor; + +#define BATTERY_SENSOR "Battery" + +#endif /* __BATTERY_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/merkur/dev/button-sensor.c b/platform/merkur/dev/button-sensor.c new file mode 100644 index 000000000..491879f3a --- /dev/null +++ b/platform/merkur/dev/button-sensor.c @@ -0,0 +1,85 @@ +/* Sensor routine */ + +#include "lib/sensors.h" +#include "dev/button-sensor.h" + +#include +#include "led.h" // debug + +const struct sensors_sensor button_sensor; + +static struct timer debouncetimer; +static int status(int type); +static int enabled = 0; +struct sensors_sensor *sensors[1]; +unsigned char sensors_flags[1]; + +#define BUTTON_BIT INTF5 +#define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 + +#define PRINTF(...) printf(__VA_ARGS__) +/*---------------------------------------------------------------------------*/ +ISR(INT5_vect) +{ + +// leds_toggle(LEDS_YELLOW); + + if(BUTTON_CHECK_IRQ()) { + if(timer_expired(&debouncetimer)) { + led1_on(); + timer_set(&debouncetimer, CLOCK_SECOND / 4); + sensors_changed(&button_sensor); + led1_off(); + } + } + +} +/*---------------------------------------------------------------------------*/ + +static int +value(int type) +{ + return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); + //return 0; +} + +static int +configure(int type, int c) +{ + switch (type) { + case SENSORS_ACTIVE: + if (c) { + if(!status(SENSORS_ACTIVE)) { + led1_on(); + timer_set(&debouncetimer, 0); + DDRE |= (0< +#include "contiki.h" +#include "dht11.h" +#include "led.h" // debug + +#define udelay(u) clock_delay_usec(u) +#define mdelay(u) clock_delay_msec(u) + +uint8_t DHT_Read_Data(uint8_t select){ + + //data[5] is 8byte table where data come from DHT are stored + //laststate holds laststate value + //counter is used to count microSeconds + uint8_t data[5], laststate = 0, counter = 0, j = 0, i = 0; + + //Clear array + data[0] = data[1] = data[2] = data[3] = data[4] = 0; + + uint8_t volatile sreg; + sreg = SREG; /* Save status register before disabling interrupts. */ + cli(); /* Disable interrupts. */ + + //Prepare the bus + PIN_INIT(); + //Set pin Output + //Pin High + DHT_DRIVE(); + mdelay(250); //Wait for 250mS + + //Send Request Signal + //Pin Low + OUTP_0(); + mdelay(20); //20ms Low + + //Pin High + OUTP_1(); + udelay(40); //40us High + + //Set pin Input to read Bus + //Set pin Input + DHT_RELEASE(); + laststate=DHT_INP(); //Read Pin value + + //Repeat for each Transistions + for (i=0; i254) break; + } + + if (counter>254) break; + + //laststate==_BV(DHT_PIN) checks if laststate was High + //ignore the first 2 transitions which are the DHT Response + //if (laststate==_BV(DHT_PIN) && (i > 2)) { + if ((i&0x01) && (i > 2)) { + //Save bits in segments of bytes + //Shift data[] value 1 position left + //Example. 01010100 if we shift it left one time it will be + //10101000 + led1_on(); + + data[j/8]<<=1; + if (counter >= 15) { //If it was high for more than 40uS + led1_off(); + data[j/8]|=1; //it means it is bit '1' so make a logic + led1_on(); + } //OR with the value (save it) + j++; //making an OR by 1 to this value 10101000 + led1_off(); + + } //we will have the resault 10101001 + //1 in 8-bit binary is 00000001 + //j/8 changes table record every 8 bits which means a byte has been saved + //so change to next record. 0/8=0 1/8=0 ... 7/8=0 8/8=1 ... 15/8=1 16/8=2 + laststate=DHT_INP(); //save current state + counter=0; //reset counter + + } + SREG = sreg; /* Enable interrupts. */ + + //Check if data received are correct by checking the CheckSum + if (data[0] + data[1] + data[2] + data[3] == data[4]) { + if (select==DHT_Temp) { //Return the value has been choosen + return(data[2]); + }else if(select==DHT_RH){ + return(data[0]); + } + }else{ +// uart_puts("\r\nCheck Sum Error"); + } + + return 0xff; // Check Sum Error +} diff --git a/platform/merkur/dev/dht11.h b/platform/merkur/dev/dht11.h new file mode 100644 index 000000000..7012b75c6 --- /dev/null +++ b/platform/merkur/dev/dht11.h @@ -0,0 +1,72 @@ +/* + DHT-11 Library + (c) Created by Charalampos Andrianakis on 18/12/11. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +#include +#include +#include + +/* DHT 1-wire is at PortE.6 */ +#define DHT_PIN_READ PINE +#define DHT_PIN_MASK _BV(PE6) +#define DHT_PxOUT PORTE +#define DHT_PxDIR DDRE + +#define SET_PIN_INPUT() (DHT_PxDIR &= ~DHT_PIN_MASK) +#define SET_PIN_OUTPUT() (DHT_PxDIR |= DHT_PIN_MASK) + +#define OUTP_0() (DHT_PxOUT &= ~DHT_PIN_MASK) +#define OUTP_1() (DHT_PxOUT |= DHT_PIN_MASK) + +#define PIN_INIT() do{ \ + SET_PIN_INPUT(); \ + OUTP_0(); \ + } while(0) + + +/* Drive the one wire interface hight */ +#define DHT_DRIVE() do { \ + SET_PIN_OUTPUT(); \ + OUTP_1(); \ + } while (0) + +/* Release the one wire by turning on the internal pull-up. */ +#define DHT_RELEASE() do { \ + SET_PIN_INPUT(); \ + OUTP_1(); \ + } while (0) + +/* Read one bit. */ +#define DHT_INP() (DHT_PIN_READ & DHT_PIN_MASK) + +//The packet size is 40bit but each bit consists of low and high state +//so 40 x 2 = 80 transitions. Also we have 2 transistions DHT response +//and 2 transitions which indicates End Of Frame. In total 84 +#define MAXTIMINGS 84 + +//Select between Temp and Humidity Read +#define DHT_Temp 0 +#define DHT_RH 1 + +//This is the main function which requests and reads the packet +uint8_t DHT_Read_Data(uint8_t select); + diff --git a/platform/merkur/dev/ds1820.c b/platform/merkur/dev/ds1820.c new file mode 100644 index 000000000..9de3fc8a9 --- /dev/null +++ b/platform/merkur/dev/ds1820.c @@ -0,0 +1,291 @@ +/* + * 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 +#include +#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_PIN_MASK _BV(PE4) +#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! */ +} diff --git a/platform/merkur/dev/ds1820.h b/platform/merkur/dev/ds1820.h new file mode 100644 index 000000000..e4178d63e --- /dev/null +++ b/platform/merkur/dev/ds1820.h @@ -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 */ diff --git a/platform/merkur/dev/key.c b/platform/merkur/dev/key.c new file mode 100644 index 000000000..20d852c18 --- /dev/null +++ b/platform/merkur/dev/key.c @@ -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< +#include + +void key_init(void); +uint8_t is_button(void); + +#endif /* __KEY_H__ */ diff --git a/platform/merkur/dev/led.c b/platform/merkur/dev/led.c new file mode 100644 index 000000000..8f330e13a --- /dev/null +++ b/platform/merkur/dev/led.c @@ -0,0 +1,89 @@ +/* + * 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< + +/** @name LED Functions */ +/** @{ */ +void led1_on(void); +void led1_off(void); +void led2_on(void); +void led2_off(void); +/** @} */ + +#endif /* __LED_H__ */ diff --git a/platform/merkur/dev/leds-arch.c b/platform/merkur/dev/leds-arch.c new file mode 100644 index 000000000..8994bb5a1 --- /dev/null +++ b/platform/merkur/dev/leds-arch.c @@ -0,0 +1,85 @@ +/* +* 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: leds-arch.c,v 1.1 2006/06/17 22:41:31 adamdunkels Exp $ +*/ + +/** +* \file +* Leds arch. for STK600-Atmega128rfa1. +* \author +* Paulo Louro +*/ + + + // WARNING : Blink function is disabled on the core leds.c file + +#include "contiki.h" +#include "dev/leds.h" +#include "leds-arch.h" + + +/*---------------------------------------------------------------------------*/ +void +leds_arch_init(void) +{ +DDRE|=(1< +#include "led.h" // debug + +const struct sensors_sensor pir_sensor; + +static struct timer debouncetimer; +static int status(int type); +static int enabled = 0; +struct sensors_sensor *sensors[1]; +unsigned char sensors_flags[1]; + +#define PIR_BIT INTF6 +#define PIR_CHECK_IRQ() (EIFR & PIR_BIT) ? 0 : 1 + +#define PRINTF(...) printf(__VA_ARGS__) +/*---------------------------------------------------------------------------*/ +ISR(INT6_vect) +{ + +// leds_toggle(LEDS_YELLOW); + + if(PIR_CHECK_IRQ()) { + if(timer_expired(&debouncetimer)) { + led1_on(); + timer_set(&debouncetimer, CLOCK_SECOND / 4); + sensors_changed(&pir_sensor); + led1_off(); + } + } + +} +/*---------------------------------------------------------------------------*/ + +static int +value(int type) +{ + return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); + //return 0; +} + +static int +configure(int type, int c) +{ + switch (type) { + case SENSORS_ACTIVE: + if (c) { + if(!status(SENSORS_ACTIVE)) { + led1_on(); + timer_set(&debouncetimer, 0); + DDRE |= (0< +*/ + +#ifndef __PIR_SENSOR_H__ +#define __PIR_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor pir_sensor; + +#define PIR_SENSOR "PIR" + +#endif /* __PIR_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/merkur/dev/temperature-sensor.c b/platform/merkur/dev/temperature-sensor.c new file mode 100644 index 000000000..c85896178 --- /dev/null +++ b/platform/merkur/dev/temperature-sensor.c @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: temperature-sensor.c,v 1.1 2010/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Temperature sensor header file for Atmega128rfa1. +* \author +* Paulo Louro +*/ + +#include "contiki.h" +#include "dev/temperature-sensor.h" + +#define PRINTF(...) printf(__VA_ARGS__) + + +const struct sensors_sensor temperature_sensor; + +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + return readInternalTemp(); +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int c) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +status(int type) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(temperature_sensor, TEMPERATURE_SENSOR, value, configure, status); \ No newline at end of file diff --git a/platform/merkur/dev/temperature-sensor.h b/platform/merkur/dev/temperature-sensor.h new file mode 100644 index 000000000..6cf5dbf26 --- /dev/null +++ b/platform/merkur/dev/temperature-sensor.h @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: temperature-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Temperature sensor header file for Atmega128rfa1. +* \author +* Paulo Louro +*/ + +#ifndef __TEMPERATURE_SENSOR_H__ +#define __TEMPERATURE_SENSOR_H__ + +#include "lib/sensors.h" +#include "dev/adc.h" + +extern const struct sensors_sensor temperature_sensor; + +#define TEMPERATURE_SENSOR "Temperature" + +#endif /* __TEMPERATURE_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/merkur/node-id.c b/platform/merkur/node-id.c new file mode 100644 index 000000000..8698b1855 --- /dev/null +++ b/platform/merkur/node-id.c @@ -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 + */ + +#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); +*/ +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/merkur/node-id.h b/platform/merkur/node-id.h new file mode 100644 index 000000000..592379fc9 --- /dev/null +++ b/platform/merkur/node-id.h @@ -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 + * + * $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__ */ diff --git a/platform/merkur/params.c b/platform/merkur/params.c new file mode 100644 index 000000000..aadbb83c4 --- /dev/null +++ b/platform/merkur/params.c @@ -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 +#include +#include +#include + +#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 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;iSet 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 */ diff --git a/platform/merkur/params.h b/platform/merkur/params.h new file mode 100644 index 000000000..03c44db27 --- /dev/null +++ b/platform/merkur/params.h @@ -0,0 +1,109 @@ +#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, 0x01} +#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} +#else +//#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} +#define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} +#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__ */ diff --git a/platform/merkur/slip_uart0.c b/platform/merkur/slip_uart0.c new file mode 100644 index 000000000..edff55385 --- /dev/null +++ b/platform/merkur/slip_uart0.c @@ -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 + */ + +#include +#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); +} +*/ From b31a3397e0022f517b1228020b4f10afbe487dcd Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 10:22:13 +0100 Subject: [PATCH 025/345] remove merkur --- platform/merkur/Makefile.merkur | 41 -- platform/merkur/contiki-conf.h | 352 ------------- platform/merkur/contiki-main.c | 614 ----------------------- platform/merkur/dev/adc.c | 89 ---- platform/merkur/dev/adc.h | 8 - platform/merkur/dev/battery-sensor.c | 86 ---- platform/merkur/dev/battery-sensor.h | 48 -- platform/merkur/dev/button-sensor.c | 85 ---- platform/merkur/dev/dht11.c | 119 ----- platform/merkur/dev/dht11.h | 72 --- platform/merkur/dev/ds1820.c | 291 ----------- platform/merkur/dev/ds1820.h | 45 -- platform/merkur/dev/key.c | 73 --- platform/merkur/dev/key.h | 50 -- platform/merkur/dev/led.c | 89 ---- platform/merkur/dev/led.h | 54 -- platform/merkur/dev/leds-arch.c | 85 ---- platform/merkur/dev/leds-arch.h | 31 -- platform/merkur/dev/pir-sensor.c | 85 ---- platform/merkur/dev/pir-sensor.h | 48 -- platform/merkur/dev/temperature-sensor.c | 66 --- platform/merkur/dev/temperature-sensor.h | 49 -- platform/merkur/node-id.c | 79 --- platform/merkur/node-id.h | 44 -- platform/merkur/params.c | 264 ---------- platform/merkur/params.h | 109 ---- platform/merkur/slip_uart0.c | 93 ---- 27 files changed, 3069 deletions(-) delete mode 100644 platform/merkur/Makefile.merkur delete mode 100644 platform/merkur/contiki-conf.h delete mode 100644 platform/merkur/contiki-main.c delete mode 100644 platform/merkur/dev/adc.c delete mode 100644 platform/merkur/dev/adc.h delete mode 100644 platform/merkur/dev/battery-sensor.c delete mode 100644 platform/merkur/dev/battery-sensor.h delete mode 100644 platform/merkur/dev/button-sensor.c delete mode 100644 platform/merkur/dev/dht11.c delete mode 100644 platform/merkur/dev/dht11.h delete mode 100644 platform/merkur/dev/ds1820.c delete mode 100644 platform/merkur/dev/ds1820.h delete mode 100644 platform/merkur/dev/key.c delete mode 100644 platform/merkur/dev/key.h delete mode 100644 platform/merkur/dev/led.c delete mode 100644 platform/merkur/dev/led.h delete mode 100644 platform/merkur/dev/leds-arch.c delete mode 100644 platform/merkur/dev/leds-arch.h delete mode 100644 platform/merkur/dev/pir-sensor.c delete mode 100644 platform/merkur/dev/pir-sensor.h delete mode 100644 platform/merkur/dev/temperature-sensor.c delete mode 100644 platform/merkur/dev/temperature-sensor.h delete mode 100644 platform/merkur/node-id.c delete mode 100644 platform/merkur/node-id.h delete mode 100644 platform/merkur/params.c delete mode 100644 platform/merkur/params.h delete mode 100644 platform/merkur/slip_uart0.c diff --git a/platform/merkur/Makefile.merkur b/platform/merkur/Makefile.merkur deleted file mode 100644 index ded157f14..000000000 --- a/platform/merkur/Makefile.merkur +++ /dev/null @@ -1,41 +0,0 @@ -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 += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c -#Needed for Button -CONTIKI_TARGET_SOURCEFILES += button-sensor.c -#Needed for DHT11 humidity sensor -CONTIKI_TARGET_SOURCEFILES += dht11.c -#Needed for DS18S20 temperature sensor -CONTIKI_TARGET_SOURCEFILES += ds1820.c -#Needed for Battery test -CONTIKI_TARGET_SOURCEFILES += battery-sensor.c -#Needed for PIR -CONTIKI_TARGET_SOURCEFILES += pir-sensor.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 diff --git a/platform/merkur/contiki-conf.h b/platform/merkur/contiki-conf.h deleted file mode 100644 index d99a965e2..000000000 --- a/platform/merkur/contiki-conf.h +++ /dev/null @@ -1,352 +0,0 @@ -/* - * 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 - */ - -#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 - -/* 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 0 - -/* More extensive stats, via main loop printfs or webserver status pages */ -#define ENERGEST_CONF_ON 0 - -/* Packet statistics */ -typedef unsigned short uip_stats_t; -#define UIP_STATISTICS 0 - -/* Available watchdog timeouts depend on mcu. Default is WDTO_2S. -1 Disables the watchdog. */ -/* AVR Studio simulator tends to reboot due to clocking the WD 8 times too fast */ -//#define WATCHDOG_CONF_TIMEOUT -1 - -/* Debugflow macro, useful for tracing path through mac and radio interrupts */ -//#define DEBUGFLOWSIZE 128 - - -/* Define MAX_*X_POWER to reduce tx power and ignore weak rx packets for testing a miniature multihop network. - * Leave undefined for full power and sensitivity. - * tx=0 (3dbm, default) to 15 (-17.2dbm) - * RF230_CONF_AUTOACK sets the extended mode using the energy-detect register with rx=0 (-91dBm) to 84 (-7dBm) - * else the rssi register is used having range 0 (91dBm) to 28 (-10dBm) - * For simplicity RF230_MIN_RX_POWER is based on the energy-detect value and divided by 3 when autoack is not set. - * On the RF230 a reduced rx power threshold will not prevent autoack if enabled and requested. - * These numbers applied to both Raven and Jackdaw give a maximum communication distance of about 15 cm - * and a 10 meter range to a full-sensitivity RF230 sniffer. -#define RF230_MAX_TX_POWER 15 -#define RF230_MIN_RX_POWER 30 - */ - /* The rf231 and atmega128rfa1 can use an rssi threshold for triggering rx_busy that saves 0.5ma in rx mode */ -/* 1 - 15 maps into -90 to -48 dBm; the register is written with RF230_MIN_RX_POWER/6 + 1. Undefine for -100dBm sensitivity */ -//#define RF230_MIN_RX_POWER 0 - -/* Network setup */ -/* TX routine passes the cca/ack result in the return parameter */ -#define RDC_CONF_HARDWARE_ACK 1 -/* TX routine does automatic cca and optional backoffs */ -#define RDC_CONF_HARDWARE_CSMA 1 -/* Allow MCU sleeping between channel checks */ -#define RDC_CONF_MCU_SLEEP 1 - -#if UIP_CONF_IPV6 -#define RIMEADDR_CONF_SIZE 8 -#define UIP_CONF_ICMP6 1 -#define UIP_CONF_UDP 1 -#define UIP_CONF_TCP 0 -#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 -/* 1 + Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode) */ -#define RF230_CONF_FRAME_RETRIES 2 -/* Number of csma retry attempts 0-5 in extended tx mode (7 does immediate tx with no csma) */ -#define RF230_CONF_CSMA_RETRIES 5 -/* Default is one RAM buffer for received packets. More than one may benefit multiple TCP connections or ports */ -#define RF230_CONF_RX_BUFFERS 3 -#define SICSLOWPAN_CONF_FRAG 1 -/* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */ -#define SICSLOWPAN_CONF_MAXAGE 3 -/* How long to wait before terminating an idle TCP connection. Smaller to allow faster sleep. Default is 120 seconds */ -/* If wait is too short the connection can be reset as a result of multiple fragment reassembly timeouts */ -#define UIP_CONF_WAIT_TIMEOUT 20 -/* 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 */ -/* Contikimac strobes on its own, but hardware retries are faster */ -#define RF230_CONF_FRAME_RETRIES 1 -/* Long csma backoffs will compromise radio cycling; set to 0 for 1 csma */ -#define RF230_CONF_CSMA_RETRIES 0 -#define SICSLOWPAN_CONF_FRAG 1 -#define SICSLOWPAN_CONF_MAXAGE 3 -/* 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 20 -#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) */ -/* These values are guesses */ -#define RF230_CONF_FRAME_RETRIES 10 -#define RF230_CONF_CSMA_RETRIES 2 -#if RF230_CONF_CSMA_RETRIES -#define NETSTACK_CONF_MAC nullmac_driver -#else -#define NETSTACK_CONF_MAC csma_driver -#endif -#define NETSTACK_CONF_RDC cxmac_driver -#define NETSTACK_CONF_FRAMER framer_802154 -#define 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__ */ diff --git a/platform/merkur/contiki-main.c b/platform/merkur/contiki-main.c deleted file mode 100644 index e267b1060..000000000 --- a/platform/merkur/contiki-main.c +++ /dev/null @@ -1,614 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include - -#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 -#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 - -#include "lib/sensors.h" -#include "dev/button-sensor.h" -#include "dev/battery-sensor.h" -#include "dev/pir-sensor.h" -SENSORS(&button_sensor, &battery_sensor, &pir_sensor); - -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< -//#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 - - process_start(&sensors_process, NULL); - - /* 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); -//
- } -#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>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<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<"); - PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); - { - uip_ds6_route_t *r; - PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); - j = 1; - for(r = uip_ds6_route_list_head(); - r != NULL; - r = list_item_next(r)) { - ipaddr_add(&r->ipaddr); - PRINTF("/%u (via ", r->length); - ipaddr_add(&r->nexthop); - // if(uip_ds6_routing_table[i].state.lifetime < 600) { - PRINTF(") %lus\n", r->state.lifetime); - // } else { - // PRINTF(")\n"); - // } - j = 0; - } - } - if (j) PRINTF(" "); - 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 -*/ - -#include - -#ifndef cbi -#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) -#endif -#ifndef sbi -#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) -#endif - -int readADC(uint8_t pin) -{ - int result = 0; - - if ( pin >= 14 ) - pin -= 14; - - ADMUX = _BV(REFS1) | _BV(REFS0) | ( pin & 7 ) ; - ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - sbi(ADCSRA,ADSC); - loop_until_bit_is_clear(ADCSRA,ADSC); - - - result = ADC; - - ADCSRA=0; //disable ADC - ADMUX=0; //turn off internal vref - - return result; -} - -/** -* \return Internal temperature in 0.01C, e.g. 25C is 2500 -*/ -int readInternalTemp(void) -{ - int reading = 0; - - ADCSRB |= _BV(MUX5); - ADMUX = _BV(REFS1) | _BV(REFS0) | 0b1001 ; - ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - - sbi(ADCSRA,ADSC); - loop_until_bit_is_clear(ADCSRA,ADSC); - reading = ADC; - - ADCSRA=0; //disable ADC - ADCSRB=0; //disable ADC - ADMUX=0; //turn off internal vref - - return reading * 113 - 27280; -} \ No newline at end of file diff --git a/platform/merkur/dev/adc.h b/platform/merkur/dev/adc.h deleted file mode 100644 index ea851f237..000000000 --- a/platform/merkur/dev/adc.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __ADC_ARCH_H__ -#define __ADC_ARCH_H__ - -int readADC(uint8_t pin); -long readVcc(); -int readInternalTemp(void); - -#endif /* __ADC_ARCH_H__ */ \ No newline at end of file diff --git a/platform/merkur/dev/battery-sensor.c b/platform/merkur/dev/battery-sensor.c deleted file mode 100644 index 56837baa8..000000000 --- a/platform/merkur/dev/battery-sensor.c +++ /dev/null @@ -1,86 +0,0 @@ -/* -* Copyright (c) 2012, BinaryLabs. -* 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: battery-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ -*/ - -/** -* \file -* Battery sensor file for Atmega128rfa1. -* \author -* Paulo Louro -* Harald Pichler -*/ - -/** -*The atmel rf23x radios have a low voltage detector that can be configured in units of 75 millivolts. Here is example *code for the ATmega128rfa1, where the BATMON register is in extended io space [dak664] -*/ - -#include "dev/battery-sensor.h" - -const struct sensors_sensor battery_sensor; -/*---------------------------------------------------------------------------*/ - -/** -* \return Voltage on battery measurement with BATMON register. -*/ -static int -value(int type) -{ - uint16_t h; - uint8_t p1; - BATMON = 16; //give BATMON time to stabilize at highest range and lowest voltage - -/* Bandgap can't be measured against supply voltage in this chip. */ -/* Use BATMON register instead */ - for ( p1=16; p1<31; p1++) { - BATMON = p1; - clock_delay_usec(100); // delay needed !! - if ((BATMON&(1< -*/ - -#ifndef __BATTERY_SENSOR_H__ -#define __BATTERY_SENSOR_H__ - -#include "lib/sensors.h" - -extern const struct sensors_sensor battery_sensor; - -#define BATTERY_SENSOR "Battery" - -#endif /* __BATTERY_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/merkur/dev/button-sensor.c b/platform/merkur/dev/button-sensor.c deleted file mode 100644 index 491879f3a..000000000 --- a/platform/merkur/dev/button-sensor.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Sensor routine */ - -#include "lib/sensors.h" -#include "dev/button-sensor.h" - -#include -#include "led.h" // debug - -const struct sensors_sensor button_sensor; - -static struct timer debouncetimer; -static int status(int type); -static int enabled = 0; -struct sensors_sensor *sensors[1]; -unsigned char sensors_flags[1]; - -#define BUTTON_BIT INTF5 -#define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 - -#define PRINTF(...) printf(__VA_ARGS__) -/*---------------------------------------------------------------------------*/ -ISR(INT5_vect) -{ - -// leds_toggle(LEDS_YELLOW); - - if(BUTTON_CHECK_IRQ()) { - if(timer_expired(&debouncetimer)) { - led1_on(); - timer_set(&debouncetimer, CLOCK_SECOND / 4); - sensors_changed(&button_sensor); - led1_off(); - } - } - -} -/*---------------------------------------------------------------------------*/ - -static int -value(int type) -{ - return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); - //return 0; -} - -static int -configure(int type, int c) -{ - switch (type) { - case SENSORS_ACTIVE: - if (c) { - if(!status(SENSORS_ACTIVE)) { - led1_on(); - timer_set(&debouncetimer, 0); - DDRE |= (0< -#include "contiki.h" -#include "dht11.h" -#include "led.h" // debug - -#define udelay(u) clock_delay_usec(u) -#define mdelay(u) clock_delay_msec(u) - -uint8_t DHT_Read_Data(uint8_t select){ - - //data[5] is 8byte table where data come from DHT are stored - //laststate holds laststate value - //counter is used to count microSeconds - uint8_t data[5], laststate = 0, counter = 0, j = 0, i = 0; - - //Clear array - data[0] = data[1] = data[2] = data[3] = data[4] = 0; - - uint8_t volatile sreg; - sreg = SREG; /* Save status register before disabling interrupts. */ - cli(); /* Disable interrupts. */ - - //Prepare the bus - PIN_INIT(); - //Set pin Output - //Pin High - DHT_DRIVE(); - mdelay(250); //Wait for 250mS - - //Send Request Signal - //Pin Low - OUTP_0(); - mdelay(20); //20ms Low - - //Pin High - OUTP_1(); - udelay(40); //40us High - - //Set pin Input to read Bus - //Set pin Input - DHT_RELEASE(); - laststate=DHT_INP(); //Read Pin value - - //Repeat for each Transistions - for (i=0; i254) break; - } - - if (counter>254) break; - - //laststate==_BV(DHT_PIN) checks if laststate was High - //ignore the first 2 transitions which are the DHT Response - //if (laststate==_BV(DHT_PIN) && (i > 2)) { - if ((i&0x01) && (i > 2)) { - //Save bits in segments of bytes - //Shift data[] value 1 position left - //Example. 01010100 if we shift it left one time it will be - //10101000 - led1_on(); - - data[j/8]<<=1; - if (counter >= 15) { //If it was high for more than 40uS - led1_off(); - data[j/8]|=1; //it means it is bit '1' so make a logic - led1_on(); - } //OR with the value (save it) - j++; //making an OR by 1 to this value 10101000 - led1_off(); - - } //we will have the resault 10101001 - //1 in 8-bit binary is 00000001 - //j/8 changes table record every 8 bits which means a byte has been saved - //so change to next record. 0/8=0 1/8=0 ... 7/8=0 8/8=1 ... 15/8=1 16/8=2 - laststate=DHT_INP(); //save current state - counter=0; //reset counter - - } - SREG = sreg; /* Enable interrupts. */ - - //Check if data received are correct by checking the CheckSum - if (data[0] + data[1] + data[2] + data[3] == data[4]) { - if (select==DHT_Temp) { //Return the value has been choosen - return(data[2]); - }else if(select==DHT_RH){ - return(data[0]); - } - }else{ -// uart_puts("\r\nCheck Sum Error"); - } - - return 0xff; // Check Sum Error -} diff --git a/platform/merkur/dev/dht11.h b/platform/merkur/dev/dht11.h deleted file mode 100644 index 7012b75c6..000000000 --- a/platform/merkur/dev/dht11.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - DHT-11 Library - (c) Created by Charalampos Andrianakis on 18/12/11. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ - -#include -#include -#include - -/* DHT 1-wire is at PortE.6 */ -#define DHT_PIN_READ PINE -#define DHT_PIN_MASK _BV(PE6) -#define DHT_PxOUT PORTE -#define DHT_PxDIR DDRE - -#define SET_PIN_INPUT() (DHT_PxDIR &= ~DHT_PIN_MASK) -#define SET_PIN_OUTPUT() (DHT_PxDIR |= DHT_PIN_MASK) - -#define OUTP_0() (DHT_PxOUT &= ~DHT_PIN_MASK) -#define OUTP_1() (DHT_PxOUT |= DHT_PIN_MASK) - -#define PIN_INIT() do{ \ - SET_PIN_INPUT(); \ - OUTP_0(); \ - } while(0) - - -/* Drive the one wire interface hight */ -#define DHT_DRIVE() do { \ - SET_PIN_OUTPUT(); \ - OUTP_1(); \ - } while (0) - -/* Release the one wire by turning on the internal pull-up. */ -#define DHT_RELEASE() do { \ - SET_PIN_INPUT(); \ - OUTP_1(); \ - } while (0) - -/* Read one bit. */ -#define DHT_INP() (DHT_PIN_READ & DHT_PIN_MASK) - -//The packet size is 40bit but each bit consists of low and high state -//so 40 x 2 = 80 transitions. Also we have 2 transistions DHT response -//and 2 transitions which indicates End Of Frame. In total 84 -#define MAXTIMINGS 84 - -//Select between Temp and Humidity Read -#define DHT_Temp 0 -#define DHT_RH 1 - -//This is the main function which requests and reads the packet -uint8_t DHT_Read_Data(uint8_t select); - diff --git a/platform/merkur/dev/ds1820.c b/platform/merkur/dev/ds1820.c deleted file mode 100644 index 9de3fc8a9..000000000 --- a/platform/merkur/dev/ds1820.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * 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 -#include -#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_PIN_MASK _BV(PE4) -#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! */ -} diff --git a/platform/merkur/dev/ds1820.h b/platform/merkur/dev/ds1820.h deleted file mode 100644 index e4178d63e..000000000 --- a/platform/merkur/dev/ds1820.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 */ diff --git a/platform/merkur/dev/key.c b/platform/merkur/dev/key.c deleted file mode 100644 index 20d852c18..000000000 --- a/platform/merkur/dev/key.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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< -#include - -void key_init(void); -uint8_t is_button(void); - -#endif /* __KEY_H__ */ diff --git a/platform/merkur/dev/led.c b/platform/merkur/dev/led.c deleted file mode 100644 index 8f330e13a..000000000 --- a/platform/merkur/dev/led.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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< - -/** @name LED Functions */ -/** @{ */ -void led1_on(void); -void led1_off(void); -void led2_on(void); -void led2_off(void); -/** @} */ - -#endif /* __LED_H__ */ diff --git a/platform/merkur/dev/leds-arch.c b/platform/merkur/dev/leds-arch.c deleted file mode 100644 index 8994bb5a1..000000000 --- a/platform/merkur/dev/leds-arch.c +++ /dev/null @@ -1,85 +0,0 @@ -/* -* 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: leds-arch.c,v 1.1 2006/06/17 22:41:31 adamdunkels Exp $ -*/ - -/** -* \file -* Leds arch. for STK600-Atmega128rfa1. -* \author -* Paulo Louro -*/ - - - // WARNING : Blink function is disabled on the core leds.c file - -#include "contiki.h" -#include "dev/leds.h" -#include "leds-arch.h" - - -/*---------------------------------------------------------------------------*/ -void -leds_arch_init(void) -{ -DDRE|=(1< -#include "led.h" // debug - -const struct sensors_sensor pir_sensor; - -static struct timer debouncetimer; -static int status(int type); -static int enabled = 0; -struct sensors_sensor *sensors[1]; -unsigned char sensors_flags[1]; - -#define PIR_BIT INTF6 -#define PIR_CHECK_IRQ() (EIFR & PIR_BIT) ? 0 : 1 - -#define PRINTF(...) printf(__VA_ARGS__) -/*---------------------------------------------------------------------------*/ -ISR(INT6_vect) -{ - -// leds_toggle(LEDS_YELLOW); - - if(PIR_CHECK_IRQ()) { - if(timer_expired(&debouncetimer)) { - led1_on(); - timer_set(&debouncetimer, CLOCK_SECOND / 4); - sensors_changed(&pir_sensor); - led1_off(); - } - } - -} -/*---------------------------------------------------------------------------*/ - -static int -value(int type) -{ - return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); - //return 0; -} - -static int -configure(int type, int c) -{ - switch (type) { - case SENSORS_ACTIVE: - if (c) { - if(!status(SENSORS_ACTIVE)) { - led1_on(); - timer_set(&debouncetimer, 0); - DDRE |= (0< -*/ - -#ifndef __PIR_SENSOR_H__ -#define __PIR_SENSOR_H__ - -#include "lib/sensors.h" - -extern const struct sensors_sensor pir_sensor; - -#define PIR_SENSOR "PIR" - -#endif /* __PIR_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/merkur/dev/temperature-sensor.c b/platform/merkur/dev/temperature-sensor.c deleted file mode 100644 index c85896178..000000000 --- a/platform/merkur/dev/temperature-sensor.c +++ /dev/null @@ -1,66 +0,0 @@ -/* -* Copyright (c) 2012, BinaryLabs. -* 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: temperature-sensor.c,v 1.1 2010/08/25 19:34:06 nifi Exp $ -*/ - -/** -* \file -* Temperature sensor header file for Atmega128rfa1. -* \author -* Paulo Louro -*/ - -#include "contiki.h" -#include "dev/temperature-sensor.h" - -#define PRINTF(...) printf(__VA_ARGS__) - - -const struct sensors_sensor temperature_sensor; - -/*---------------------------------------------------------------------------*/ -static int -value(int type) -{ - return readInternalTemp(); -} -/*---------------------------------------------------------------------------*/ -static int -configure(int type, int c) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -static int -status(int type) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -SENSORS_SENSOR(temperature_sensor, TEMPERATURE_SENSOR, value, configure, status); \ No newline at end of file diff --git a/platform/merkur/dev/temperature-sensor.h b/platform/merkur/dev/temperature-sensor.h deleted file mode 100644 index 6cf5dbf26..000000000 --- a/platform/merkur/dev/temperature-sensor.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -* Copyright (c) 2012, BinaryLabs. -* 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: temperature-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ -*/ - -/** -* \file -* Temperature sensor header file for Atmega128rfa1. -* \author -* Paulo Louro -*/ - -#ifndef __TEMPERATURE_SENSOR_H__ -#define __TEMPERATURE_SENSOR_H__ - -#include "lib/sensors.h" -#include "dev/adc.h" - -extern const struct sensors_sensor temperature_sensor; - -#define TEMPERATURE_SENSOR "Temperature" - -#endif /* __TEMPERATURE_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/merkur/node-id.c b/platform/merkur/node-id.c deleted file mode 100644 index 8698b1855..000000000 --- a/platform/merkur/node-id.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2006, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * 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 - */ - -#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); -*/ -} -/*---------------------------------------------------------------------------*/ diff --git a/platform/merkur/node-id.h b/platform/merkur/node-id.h deleted file mode 100644 index 592379fc9..000000000 --- a/platform/merkur/node-id.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2006, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - * Author: Adam Dunkels - * - * $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__ */ diff --git a/platform/merkur/params.c b/platform/merkur/params.c deleted file mode 100644 index aadbb83c4..000000000 --- a/platform/merkur/params.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * 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 -#include -#include -#include - -#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 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;iSet 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 */ diff --git a/platform/merkur/params.h b/platform/merkur/params.h deleted file mode 100644 index 03c44db27..000000000 --- a/platform/merkur/params.h +++ /dev/null @@ -1,109 +0,0 @@ -#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, 0x01} -#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} -#else -//#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} -#define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} -#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__ */ diff --git a/platform/merkur/slip_uart0.c b/platform/merkur/slip_uart0.c deleted file mode 100644 index edff55385..000000000 --- a/platform/merkur/slip_uart0.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 - */ - -#include -#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); -} -*/ From a6634acc500be5d1f3d6c0fd600a0d3de3ab86a8 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 10:22:48 +0100 Subject: [PATCH 026/345] add platform osd-merkur --- platform/osd-merkur/Makefile.merkur | 41 ++ platform/osd-merkur/contiki-conf.h | 352 +++++++++++ platform/osd-merkur/contiki-main.c | 614 +++++++++++++++++++ platform/osd-merkur/dev/adc.c | 89 +++ platform/osd-merkur/dev/adc.h | 8 + platform/osd-merkur/dev/battery-sensor.c | 86 +++ platform/osd-merkur/dev/battery-sensor.h | 48 ++ platform/osd-merkur/dev/button-sensor.c | 85 +++ platform/osd-merkur/dev/dht11.c | 119 ++++ platform/osd-merkur/dev/dht11.h | 72 +++ platform/osd-merkur/dev/ds1820.c | 291 +++++++++ platform/osd-merkur/dev/ds1820.h | 45 ++ platform/osd-merkur/dev/key.c | 73 +++ platform/osd-merkur/dev/key.h | 50 ++ platform/osd-merkur/dev/led.c | 89 +++ platform/osd-merkur/dev/led.h | 54 ++ platform/osd-merkur/dev/leds-arch.c | 85 +++ platform/osd-merkur/dev/leds-arch.h | 31 + platform/osd-merkur/dev/pir-sensor.c | 85 +++ platform/osd-merkur/dev/pir-sensor.h | 48 ++ platform/osd-merkur/dev/temperature-sensor.c | 66 ++ platform/osd-merkur/dev/temperature-sensor.h | 49 ++ platform/osd-merkur/node-id.c | 79 +++ platform/osd-merkur/node-id.h | 44 ++ platform/osd-merkur/params.c | 264 ++++++++ platform/osd-merkur/params.h | 109 ++++ platform/osd-merkur/slip_uart0.c | 93 +++ 27 files changed, 3069 insertions(+) create mode 100644 platform/osd-merkur/Makefile.merkur create mode 100644 platform/osd-merkur/contiki-conf.h create mode 100644 platform/osd-merkur/contiki-main.c create mode 100644 platform/osd-merkur/dev/adc.c create mode 100644 platform/osd-merkur/dev/adc.h create mode 100644 platform/osd-merkur/dev/battery-sensor.c create mode 100644 platform/osd-merkur/dev/battery-sensor.h create mode 100644 platform/osd-merkur/dev/button-sensor.c create mode 100644 platform/osd-merkur/dev/dht11.c create mode 100644 platform/osd-merkur/dev/dht11.h create mode 100644 platform/osd-merkur/dev/ds1820.c create mode 100644 platform/osd-merkur/dev/ds1820.h create mode 100644 platform/osd-merkur/dev/key.c create mode 100644 platform/osd-merkur/dev/key.h create mode 100644 platform/osd-merkur/dev/led.c create mode 100644 platform/osd-merkur/dev/led.h create mode 100644 platform/osd-merkur/dev/leds-arch.c create mode 100644 platform/osd-merkur/dev/leds-arch.h create mode 100644 platform/osd-merkur/dev/pir-sensor.c create mode 100644 platform/osd-merkur/dev/pir-sensor.h create mode 100644 platform/osd-merkur/dev/temperature-sensor.c create mode 100644 platform/osd-merkur/dev/temperature-sensor.h create mode 100644 platform/osd-merkur/node-id.c create mode 100644 platform/osd-merkur/node-id.h create mode 100644 platform/osd-merkur/params.c create mode 100644 platform/osd-merkur/params.h create mode 100644 platform/osd-merkur/slip_uart0.c diff --git a/platform/osd-merkur/Makefile.merkur b/platform/osd-merkur/Makefile.merkur new file mode 100644 index 000000000..ded157f14 --- /dev/null +++ b/platform/osd-merkur/Makefile.merkur @@ -0,0 +1,41 @@ +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 += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c +#Needed for Button +CONTIKI_TARGET_SOURCEFILES += button-sensor.c +#Needed for DHT11 humidity sensor +CONTIKI_TARGET_SOURCEFILES += dht11.c +#Needed for DS18S20 temperature sensor +CONTIKI_TARGET_SOURCEFILES += ds1820.c +#Needed for Battery test +CONTIKI_TARGET_SOURCEFILES += battery-sensor.c +#Needed for PIR +CONTIKI_TARGET_SOURCEFILES += pir-sensor.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 diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h new file mode 100644 index 000000000..d99a965e2 --- /dev/null +++ b/platform/osd-merkur/contiki-conf.h @@ -0,0 +1,352 @@ +/* + * 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 + */ + +#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 + +/* 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 0 + +/* More extensive stats, via main loop printfs or webserver status pages */ +#define ENERGEST_CONF_ON 0 + +/* Packet statistics */ +typedef unsigned short uip_stats_t; +#define UIP_STATISTICS 0 + +/* Available watchdog timeouts depend on mcu. Default is WDTO_2S. -1 Disables the watchdog. */ +/* AVR Studio simulator tends to reboot due to clocking the WD 8 times too fast */ +//#define WATCHDOG_CONF_TIMEOUT -1 + +/* Debugflow macro, useful for tracing path through mac and radio interrupts */ +//#define DEBUGFLOWSIZE 128 + + +/* Define MAX_*X_POWER to reduce tx power and ignore weak rx packets for testing a miniature multihop network. + * Leave undefined for full power and sensitivity. + * tx=0 (3dbm, default) to 15 (-17.2dbm) + * RF230_CONF_AUTOACK sets the extended mode using the energy-detect register with rx=0 (-91dBm) to 84 (-7dBm) + * else the rssi register is used having range 0 (91dBm) to 28 (-10dBm) + * For simplicity RF230_MIN_RX_POWER is based on the energy-detect value and divided by 3 when autoack is not set. + * On the RF230 a reduced rx power threshold will not prevent autoack if enabled and requested. + * These numbers applied to both Raven and Jackdaw give a maximum communication distance of about 15 cm + * and a 10 meter range to a full-sensitivity RF230 sniffer. +#define RF230_MAX_TX_POWER 15 +#define RF230_MIN_RX_POWER 30 + */ + /* The rf231 and atmega128rfa1 can use an rssi threshold for triggering rx_busy that saves 0.5ma in rx mode */ +/* 1 - 15 maps into -90 to -48 dBm; the register is written with RF230_MIN_RX_POWER/6 + 1. Undefine for -100dBm sensitivity */ +//#define RF230_MIN_RX_POWER 0 + +/* Network setup */ +/* TX routine passes the cca/ack result in the return parameter */ +#define RDC_CONF_HARDWARE_ACK 1 +/* TX routine does automatic cca and optional backoffs */ +#define RDC_CONF_HARDWARE_CSMA 1 +/* Allow MCU sleeping between channel checks */ +#define RDC_CONF_MCU_SLEEP 1 + +#if UIP_CONF_IPV6 +#define RIMEADDR_CONF_SIZE 8 +#define UIP_CONF_ICMP6 1 +#define UIP_CONF_UDP 1 +#define UIP_CONF_TCP 0 +#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 +/* 1 + Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode) */ +#define RF230_CONF_FRAME_RETRIES 2 +/* Number of csma retry attempts 0-5 in extended tx mode (7 does immediate tx with no csma) */ +#define RF230_CONF_CSMA_RETRIES 5 +/* Default is one RAM buffer for received packets. More than one may benefit multiple TCP connections or ports */ +#define RF230_CONF_RX_BUFFERS 3 +#define SICSLOWPAN_CONF_FRAG 1 +/* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */ +#define SICSLOWPAN_CONF_MAXAGE 3 +/* How long to wait before terminating an idle TCP connection. Smaller to allow faster sleep. Default is 120 seconds */ +/* If wait is too short the connection can be reset as a result of multiple fragment reassembly timeouts */ +#define UIP_CONF_WAIT_TIMEOUT 20 +/* 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 */ +/* Contikimac strobes on its own, but hardware retries are faster */ +#define RF230_CONF_FRAME_RETRIES 1 +/* Long csma backoffs will compromise radio cycling; set to 0 for 1 csma */ +#define RF230_CONF_CSMA_RETRIES 0 +#define SICSLOWPAN_CONF_FRAG 1 +#define SICSLOWPAN_CONF_MAXAGE 3 +/* 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 20 +#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) */ +/* These values are guesses */ +#define RF230_CONF_FRAME_RETRIES 10 +#define RF230_CONF_CSMA_RETRIES 2 +#if RF230_CONF_CSMA_RETRIES +#define NETSTACK_CONF_MAC nullmac_driver +#else +#define NETSTACK_CONF_MAC csma_driver +#endif +#define NETSTACK_CONF_RDC cxmac_driver +#define NETSTACK_CONF_FRAMER framer_802154 +#define 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__ */ diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c new file mode 100644 index 000000000..e267b1060 --- /dev/null +++ b/platform/osd-merkur/contiki-main.c @@ -0,0 +1,614 @@ +/* + * 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 +#include +#include +#include +#include +#include + +#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 +#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 + +#include "lib/sensors.h" +#include "dev/button-sensor.h" +#include "dev/battery-sensor.h" +#include "dev/pir-sensor.h" +SENSORS(&button_sensor, &battery_sensor, &pir_sensor); + +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< +//#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 + + process_start(&sensors_process, NULL); + + /* 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); +//
+ } +#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>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<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<"); + PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); + { + uip_ds6_route_t *r; + PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); + j = 1; + for(r = uip_ds6_route_list_head(); + r != NULL; + r = list_item_next(r)) { + ipaddr_add(&r->ipaddr); + PRINTF("/%u (via ", r->length); + ipaddr_add(&r->nexthop); + // if(uip_ds6_routing_table[i].state.lifetime < 600) { + PRINTF(") %lus\n", r->state.lifetime); + // } else { + // PRINTF(")\n"); + // } + j = 0; + } + } + if (j) PRINTF(" "); + 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 +*/ + +#include + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +int readADC(uint8_t pin) +{ + int result = 0; + + if ( pin >= 14 ) + pin -= 14; + + ADMUX = _BV(REFS1) | _BV(REFS0) | ( pin & 7 ) ; + ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; + sbi(ADCSRA,ADSC); + loop_until_bit_is_clear(ADCSRA,ADSC); + + + result = ADC; + + ADCSRA=0; //disable ADC + ADMUX=0; //turn off internal vref + + return result; +} + +/** +* \return Internal temperature in 0.01C, e.g. 25C is 2500 +*/ +int readInternalTemp(void) +{ + int reading = 0; + + ADCSRB |= _BV(MUX5); + ADMUX = _BV(REFS1) | _BV(REFS0) | 0b1001 ; + ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; + + sbi(ADCSRA,ADSC); + loop_until_bit_is_clear(ADCSRA,ADSC); + reading = ADC; + + ADCSRA=0; //disable ADC + ADCSRB=0; //disable ADC + ADMUX=0; //turn off internal vref + + return reading * 113 - 27280; +} \ No newline at end of file diff --git a/platform/osd-merkur/dev/adc.h b/platform/osd-merkur/dev/adc.h new file mode 100644 index 000000000..ea851f237 --- /dev/null +++ b/platform/osd-merkur/dev/adc.h @@ -0,0 +1,8 @@ +#ifndef __ADC_ARCH_H__ +#define __ADC_ARCH_H__ + +int readADC(uint8_t pin); +long readVcc(); +int readInternalTemp(void); + +#endif /* __ADC_ARCH_H__ */ \ No newline at end of file diff --git a/platform/osd-merkur/dev/battery-sensor.c b/platform/osd-merkur/dev/battery-sensor.c new file mode 100644 index 000000000..56837baa8 --- /dev/null +++ b/platform/osd-merkur/dev/battery-sensor.c @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: battery-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Battery sensor file for Atmega128rfa1. +* \author +* Paulo Louro +* Harald Pichler +*/ + +/** +*The atmel rf23x radios have a low voltage detector that can be configured in units of 75 millivolts. Here is example *code for the ATmega128rfa1, where the BATMON register is in extended io space [dak664] +*/ + +#include "dev/battery-sensor.h" + +const struct sensors_sensor battery_sensor; +/*---------------------------------------------------------------------------*/ + +/** +* \return Voltage on battery measurement with BATMON register. +*/ +static int +value(int type) +{ + uint16_t h; + uint8_t p1; + BATMON = 16; //give BATMON time to stabilize at highest range and lowest voltage + +/* Bandgap can't be measured against supply voltage in this chip. */ +/* Use BATMON register instead */ + for ( p1=16; p1<31; p1++) { + BATMON = p1; + clock_delay_usec(100); // delay needed !! + if ((BATMON&(1< +*/ + +#ifndef __BATTERY_SENSOR_H__ +#define __BATTERY_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor battery_sensor; + +#define BATTERY_SENSOR "Battery" + +#endif /* __BATTERY_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/osd-merkur/dev/button-sensor.c b/platform/osd-merkur/dev/button-sensor.c new file mode 100644 index 000000000..491879f3a --- /dev/null +++ b/platform/osd-merkur/dev/button-sensor.c @@ -0,0 +1,85 @@ +/* Sensor routine */ + +#include "lib/sensors.h" +#include "dev/button-sensor.h" + +#include +#include "led.h" // debug + +const struct sensors_sensor button_sensor; + +static struct timer debouncetimer; +static int status(int type); +static int enabled = 0; +struct sensors_sensor *sensors[1]; +unsigned char sensors_flags[1]; + +#define BUTTON_BIT INTF5 +#define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 + +#define PRINTF(...) printf(__VA_ARGS__) +/*---------------------------------------------------------------------------*/ +ISR(INT5_vect) +{ + +// leds_toggle(LEDS_YELLOW); + + if(BUTTON_CHECK_IRQ()) { + if(timer_expired(&debouncetimer)) { + led1_on(); + timer_set(&debouncetimer, CLOCK_SECOND / 4); + sensors_changed(&button_sensor); + led1_off(); + } + } + +} +/*---------------------------------------------------------------------------*/ + +static int +value(int type) +{ + return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); + //return 0; +} + +static int +configure(int type, int c) +{ + switch (type) { + case SENSORS_ACTIVE: + if (c) { + if(!status(SENSORS_ACTIVE)) { + led1_on(); + timer_set(&debouncetimer, 0); + DDRE |= (0< +#include "contiki.h" +#include "dht11.h" +#include "led.h" // debug + +#define udelay(u) clock_delay_usec(u) +#define mdelay(u) clock_delay_msec(u) + +uint8_t DHT_Read_Data(uint8_t select){ + + //data[5] is 8byte table where data come from DHT are stored + //laststate holds laststate value + //counter is used to count microSeconds + uint8_t data[5], laststate = 0, counter = 0, j = 0, i = 0; + + //Clear array + data[0] = data[1] = data[2] = data[3] = data[4] = 0; + + uint8_t volatile sreg; + sreg = SREG; /* Save status register before disabling interrupts. */ + cli(); /* Disable interrupts. */ + + //Prepare the bus + PIN_INIT(); + //Set pin Output + //Pin High + DHT_DRIVE(); + mdelay(250); //Wait for 250mS + + //Send Request Signal + //Pin Low + OUTP_0(); + mdelay(20); //20ms Low + + //Pin High + OUTP_1(); + udelay(40); //40us High + + //Set pin Input to read Bus + //Set pin Input + DHT_RELEASE(); + laststate=DHT_INP(); //Read Pin value + + //Repeat for each Transistions + for (i=0; i254) break; + } + + if (counter>254) break; + + //laststate==_BV(DHT_PIN) checks if laststate was High + //ignore the first 2 transitions which are the DHT Response + //if (laststate==_BV(DHT_PIN) && (i > 2)) { + if ((i&0x01) && (i > 2)) { + //Save bits in segments of bytes + //Shift data[] value 1 position left + //Example. 01010100 if we shift it left one time it will be + //10101000 + led1_on(); + + data[j/8]<<=1; + if (counter >= 15) { //If it was high for more than 40uS + led1_off(); + data[j/8]|=1; //it means it is bit '1' so make a logic + led1_on(); + } //OR with the value (save it) + j++; //making an OR by 1 to this value 10101000 + led1_off(); + + } //we will have the resault 10101001 + //1 in 8-bit binary is 00000001 + //j/8 changes table record every 8 bits which means a byte has been saved + //so change to next record. 0/8=0 1/8=0 ... 7/8=0 8/8=1 ... 15/8=1 16/8=2 + laststate=DHT_INP(); //save current state + counter=0; //reset counter + + } + SREG = sreg; /* Enable interrupts. */ + + //Check if data received are correct by checking the CheckSum + if (data[0] + data[1] + data[2] + data[3] == data[4]) { + if (select==DHT_Temp) { //Return the value has been choosen + return(data[2]); + }else if(select==DHT_RH){ + return(data[0]); + } + }else{ +// uart_puts("\r\nCheck Sum Error"); + } + + return 0xff; // Check Sum Error +} diff --git a/platform/osd-merkur/dev/dht11.h b/platform/osd-merkur/dev/dht11.h new file mode 100644 index 000000000..7012b75c6 --- /dev/null +++ b/platform/osd-merkur/dev/dht11.h @@ -0,0 +1,72 @@ +/* + DHT-11 Library + (c) Created by Charalampos Andrianakis on 18/12/11. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +#include +#include +#include + +/* DHT 1-wire is at PortE.6 */ +#define DHT_PIN_READ PINE +#define DHT_PIN_MASK _BV(PE6) +#define DHT_PxOUT PORTE +#define DHT_PxDIR DDRE + +#define SET_PIN_INPUT() (DHT_PxDIR &= ~DHT_PIN_MASK) +#define SET_PIN_OUTPUT() (DHT_PxDIR |= DHT_PIN_MASK) + +#define OUTP_0() (DHT_PxOUT &= ~DHT_PIN_MASK) +#define OUTP_1() (DHT_PxOUT |= DHT_PIN_MASK) + +#define PIN_INIT() do{ \ + SET_PIN_INPUT(); \ + OUTP_0(); \ + } while(0) + + +/* Drive the one wire interface hight */ +#define DHT_DRIVE() do { \ + SET_PIN_OUTPUT(); \ + OUTP_1(); \ + } while (0) + +/* Release the one wire by turning on the internal pull-up. */ +#define DHT_RELEASE() do { \ + SET_PIN_INPUT(); \ + OUTP_1(); \ + } while (0) + +/* Read one bit. */ +#define DHT_INP() (DHT_PIN_READ & DHT_PIN_MASK) + +//The packet size is 40bit but each bit consists of low and high state +//so 40 x 2 = 80 transitions. Also we have 2 transistions DHT response +//and 2 transitions which indicates End Of Frame. In total 84 +#define MAXTIMINGS 84 + +//Select between Temp and Humidity Read +#define DHT_Temp 0 +#define DHT_RH 1 + +//This is the main function which requests and reads the packet +uint8_t DHT_Read_Data(uint8_t select); + diff --git a/platform/osd-merkur/dev/ds1820.c b/platform/osd-merkur/dev/ds1820.c new file mode 100644 index 000000000..9de3fc8a9 --- /dev/null +++ b/platform/osd-merkur/dev/ds1820.c @@ -0,0 +1,291 @@ +/* + * 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 +#include +#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_PIN_MASK _BV(PE4) +#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! */ +} diff --git a/platform/osd-merkur/dev/ds1820.h b/platform/osd-merkur/dev/ds1820.h new file mode 100644 index 000000000..e4178d63e --- /dev/null +++ b/platform/osd-merkur/dev/ds1820.h @@ -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 */ diff --git a/platform/osd-merkur/dev/key.c b/platform/osd-merkur/dev/key.c new file mode 100644 index 000000000..20d852c18 --- /dev/null +++ b/platform/osd-merkur/dev/key.c @@ -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< +#include + +void key_init(void); +uint8_t is_button(void); + +#endif /* __KEY_H__ */ diff --git a/platform/osd-merkur/dev/led.c b/platform/osd-merkur/dev/led.c new file mode 100644 index 000000000..8f330e13a --- /dev/null +++ b/platform/osd-merkur/dev/led.c @@ -0,0 +1,89 @@ +/* + * 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< + +/** @name LED Functions */ +/** @{ */ +void led1_on(void); +void led1_off(void); +void led2_on(void); +void led2_off(void); +/** @} */ + +#endif /* __LED_H__ */ diff --git a/platform/osd-merkur/dev/leds-arch.c b/platform/osd-merkur/dev/leds-arch.c new file mode 100644 index 000000000..8994bb5a1 --- /dev/null +++ b/platform/osd-merkur/dev/leds-arch.c @@ -0,0 +1,85 @@ +/* +* 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: leds-arch.c,v 1.1 2006/06/17 22:41:31 adamdunkels Exp $ +*/ + +/** +* \file +* Leds arch. for STK600-Atmega128rfa1. +* \author +* Paulo Louro +*/ + + + // WARNING : Blink function is disabled on the core leds.c file + +#include "contiki.h" +#include "dev/leds.h" +#include "leds-arch.h" + + +/*---------------------------------------------------------------------------*/ +void +leds_arch_init(void) +{ +DDRE|=(1< +#include "led.h" // debug + +const struct sensors_sensor pir_sensor; + +static struct timer debouncetimer; +static int status(int type); +static int enabled = 0; +struct sensors_sensor *sensors[1]; +unsigned char sensors_flags[1]; + +#define PIR_BIT INTF6 +#define PIR_CHECK_IRQ() (EIFR & PIR_BIT) ? 0 : 1 + +#define PRINTF(...) printf(__VA_ARGS__) +/*---------------------------------------------------------------------------*/ +ISR(INT6_vect) +{ + +// leds_toggle(LEDS_YELLOW); + + if(PIR_CHECK_IRQ()) { + if(timer_expired(&debouncetimer)) { + led1_on(); + timer_set(&debouncetimer, CLOCK_SECOND / 4); + sensors_changed(&pir_sensor); + led1_off(); + } + } + +} +/*---------------------------------------------------------------------------*/ + +static int +value(int type) +{ + return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); + //return 0; +} + +static int +configure(int type, int c) +{ + switch (type) { + case SENSORS_ACTIVE: + if (c) { + if(!status(SENSORS_ACTIVE)) { + led1_on(); + timer_set(&debouncetimer, 0); + DDRE |= (0< +*/ + +#ifndef __PIR_SENSOR_H__ +#define __PIR_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor pir_sensor; + +#define PIR_SENSOR "PIR" + +#endif /* __PIR_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/osd-merkur/dev/temperature-sensor.c b/platform/osd-merkur/dev/temperature-sensor.c new file mode 100644 index 000000000..c85896178 --- /dev/null +++ b/platform/osd-merkur/dev/temperature-sensor.c @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: temperature-sensor.c,v 1.1 2010/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Temperature sensor header file for Atmega128rfa1. +* \author +* Paulo Louro +*/ + +#include "contiki.h" +#include "dev/temperature-sensor.h" + +#define PRINTF(...) printf(__VA_ARGS__) + + +const struct sensors_sensor temperature_sensor; + +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + return readInternalTemp(); +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int c) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +status(int type) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(temperature_sensor, TEMPERATURE_SENSOR, value, configure, status); \ No newline at end of file diff --git a/platform/osd-merkur/dev/temperature-sensor.h b/platform/osd-merkur/dev/temperature-sensor.h new file mode 100644 index 000000000..6cf5dbf26 --- /dev/null +++ b/platform/osd-merkur/dev/temperature-sensor.h @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2012, BinaryLabs. +* 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: temperature-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Temperature sensor header file for Atmega128rfa1. +* \author +* Paulo Louro +*/ + +#ifndef __TEMPERATURE_SENSOR_H__ +#define __TEMPERATURE_SENSOR_H__ + +#include "lib/sensors.h" +#include "dev/adc.h" + +extern const struct sensors_sensor temperature_sensor; + +#define TEMPERATURE_SENSOR "Temperature" + +#endif /* __TEMPERATURE_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/osd-merkur/node-id.c b/platform/osd-merkur/node-id.c new file mode 100644 index 000000000..8698b1855 --- /dev/null +++ b/platform/osd-merkur/node-id.c @@ -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 + */ + +#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); +*/ +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/osd-merkur/node-id.h b/platform/osd-merkur/node-id.h new file mode 100644 index 000000000..592379fc9 --- /dev/null +++ b/platform/osd-merkur/node-id.h @@ -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 + * + * $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__ */ diff --git a/platform/osd-merkur/params.c b/platform/osd-merkur/params.c new file mode 100644 index 000000000..aadbb83c4 --- /dev/null +++ b/platform/osd-merkur/params.c @@ -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 +#include +#include +#include + +#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 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;iSet 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 */ diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h new file mode 100644 index 000000000..03c44db27 --- /dev/null +++ b/platform/osd-merkur/params.h @@ -0,0 +1,109 @@ +#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, 0x01} +#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} +#else +//#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} +#define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} +#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__ */ diff --git a/platform/osd-merkur/slip_uart0.c b/platform/osd-merkur/slip_uart0.c new file mode 100644 index 000000000..edff55385 --- /dev/null +++ b/platform/osd-merkur/slip_uart0.c @@ -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 + */ + +#include +#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); +} +*/ From 7f776ee918594adb1acfbe0e255d9ac3d8584233 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 10:39:56 +0100 Subject: [PATCH 027/345] add climate example --- examples/osd/climate/Makefile | 88 ++ examples/osd/climate/README | 76 + examples/osd/climate/er-example-server.c | 1229 +++++++++++++++++ examples/osd/climate/flash.sh | 2 + examples/osd/climate/lall.txt | 132 ++ examples/osd/climate/project-conf.h | 74 + examples/osd/climate/run.sh | 6 + examples/osd/climate/server-client.csc | 227 +++ examples/osd/climate/server-only.csc | 189 +++ examples/osd/climate/static-routing.c | 155 +++ examples/osd/climate/static-routing.h | 20 + .../{Makefile.merkur => Makefile.osd-merkur} | 0 platform/osd-merkur/params.h | 3 +- 13 files changed, 2200 insertions(+), 1 deletion(-) create mode 100644 examples/osd/climate/Makefile create mode 100644 examples/osd/climate/README create mode 100644 examples/osd/climate/er-example-server.c create mode 100755 examples/osd/climate/flash.sh create mode 100644 examples/osd/climate/lall.txt create mode 100644 examples/osd/climate/project-conf.h create mode 100755 examples/osd/climate/run.sh create mode 100644 examples/osd/climate/server-client.csc create mode 100644 examples/osd/climate/server-only.csc create mode 100644 examples/osd/climate/static-routing.c create mode 100644 examples/osd/climate/static-routing.h rename platform/osd-merkur/{Makefile.merkur => Makefile.osd-merkur} (100%) diff --git a/examples/osd/climate/Makefile b/examples/osd/climate/Makefile new file mode 100644 index 000000000..ea3722d59 --- /dev/null +++ b/examples/osd/climate/Makefile @@ -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 diff --git a/examples/osd/climate/README b/examples/osd/climate/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/climate/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c new file mode 100644 index 000000000..3b8829913 --- /dev/null +++ b/examples/osd/climate/er-example-server.c @@ -0,0 +1,1229 @@ +/* + * 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) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 1 +#define REST_RES_DHT11 1 +#define REST_RES_TEMPERATURE 1 +#define REST_RES_HELLO 0 +#define REST_RES_MIRROR 0 /* causes largest code size */ +#define REST_RES_CHUNKS 0 +#define REST_RES_SEPARATE 0 +#define REST_RES_PUSHING 0 +#define REST_RES_EVENT 0 +#define REST_RES_SUB 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_LIGHT 0 +#define REST_RES_BATTERY 1 +#define REST_RES_RADIO 0 + + + +#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" + +// todo OSD-Testboard move to platform/dev +#include "dev/key.h" +#include "dev/led.h" +#if REST_RES_DS1820 +#include "dev/ds1820.h" +#endif +#if REST_RES_DHT11 +#include "dev/dht11.h" +uint8_t dht11_temp=0, dht11_hum=0; +#endif + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_LIGHT) +#include "dev/light-sensor.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_SHT11) +#include "dev/sht11-sensor.h" +#endif +#if defined (PLATFORM_HAS_RADIO) +#include "dev/radio-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + + +#include "dev/key.c" // todo: move platform /dev +#include "dev/led.c" + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +// mybutton +/*A simple actuator example. read the key button status*/ +//RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); +RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); +void +button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname[17]="button1"; + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); + if(is_button()) + index += sprintf(temp + index," \"state\" : \"on\"\n"); + else + index += sprintf(temp + index," \"state\" : \"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname, name,len); + bname[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +#if REST_RES_DS1820 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); +void +ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; + int grad=0; + int kgrad=0; +// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ + kgrad=5; + } + grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DS1820 + +#if REST_RES_DHT11 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\""); +void +dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; +// dht11_temp=DHT_Read_Data(DHT_Temp); +// dht11_hum=DHT_Read_Data(DHT_RH); + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",dht11_temp,dht11_hum); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",dht11_temp,dht11_hum); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DHT11 + +#if REST_RES_HELLO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *len = NULL; + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; + int length = 12; /* |<-------->| */ + + /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ + if (REST.get_query_variable(request, "len", &len)) { + length = atoi(len); + if (length<0) length = 0; + if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; + memcpy(buffer, message, length); + } else { + memcpy(buffer, message, length); + } + + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ + REST.set_header_etag(response, (uint8_t *) &length, 1); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer. */ + strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); + + /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. + * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); + } + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); + } + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); + int index = 0; + for (index = 0; index 03 */ +#endif /* CoAP-specific example */ + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); + } + + if (strpos >= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + coap_set_header_uri_host(response, "tiki"); + coap_set_header_observe(response, 10); +#if WITH_COAP == 3 + coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ +#else + coap_set_header_proxy_uri(response, "ftp://x"); + coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ + coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, TEXT_PLAIN); + coap_set_header_if_none_match(response); +#endif /* CoAP > 03 */ +#endif /* CoAP-specific example */ +} +#endif /* REST_RES_MIRROR */ + +/******************************************************************************/ +#if REST_RES_CHUNKS +/* + * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation + * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, + * the byte offset where to continue is provided to the handler as int32_t pointer. + * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. + * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) + */ +RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); + +#define CHUNKS_TOTAL 2050 + +void +chunks_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 = 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); + + /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 +/* Required to manually (=not by the engine) handle the response transaction. */ +#include "er-coap-07-separate.h" +#include "er-coap-07-transactions.h" +/* + * CoAP-specific example for separate responses. + * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. + * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests. + * The resource handler must store all information that required to finalize the response later. + */ +RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\""); + +/* 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[16]; +} 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) +{ + /* + * Example allows only one open separate response. + * For multiple, the application must manage the list of stores. + */ + if (separate_active) + { + coap_separate_reject(); + } + else + { + 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. */ + + /* + * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2). + * Extend the store, if the application requires additional information from this handler. + * buffer is an example field for custom information. + */ + snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo"); + } +} + +void +separate_finalize_handler() +{ + if (separate_active) + { + 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)) ) + { + 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); + + 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 + { + /* + * Set timer for retry, send error message, ... + * The example simply waits for another button press. + */ + } + } /* if (separate_active) */ +} +#endif + +/******************************************************************************/ +#if REST_RES_PUSHING +/* + * Example for a periodic resource. + * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions by managing a list of subscribers to notify. + */ +PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND); + +void +pushing_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); + + /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */ + const char *msg = "It's periodic!"; + REST.set_response_payload(response, msg, strlen(msg)); + + /* 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 +pushing_periodic_handler(resource_t *r) +{ + static uint16_t obs_counter = 0; + static char content[11]; + + ++obs_counter; + + PRINTF("TICK %u for /%s\n", obs_counter, r->url); + + /* Build notification. */ + 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 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, obs_counter, notification); +} +#endif + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs"); + +void +event_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +event_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_BUTTON */ + +/******************************************************************************/ +#if REST_RES_SUB +/* + * Example for a resource that also handles all its sub-resources. + * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. + */ +RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); + +void +sub_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); + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_sub.url); + + if (len==base_len) + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); + } + else + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); +void +light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); + uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_LIGHT */ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + + +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO +/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); + +void +radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *p = NULL; + uint8_t param = 0; + int success = 1; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((len=REST.get_query_variable(request, "p", &p))) { + PRINTF("p %.*s\n", len, p); + if (strncmp(p, "lqi", len)==0) { + param = RADIO_SENSOR_LAST_VALUE; + } else if(strncmp(p,"rssi", len)==0) { + param = RADIO_SENSOR_LAST_PACKET; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success) { + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + + if (param == RADIO_SENSOR_LAST_VALUE) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); + } else if (param == RADIO_SENSOR_LAST_PACKET) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } + } else { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +void +hw_init() +{ + key_init(); + led1_off(); +#if REST_RES_DS1820 + ds1820_temp(); +#endif +#if REST_RES_DHT11 + dht11_temp=DHT_Read_Data(DHT_Temp); + dht11_hum=DHT_Read_Data(DHT_RH); +#endif +} +#define MESURE_INTERVAL (20 * CLOCK_SECOND) +#define READ_TIME ( 2 * CLOCK_SECOND) + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + static struct etimer ds_periodic_timer; +#if REST_RES_DS1820 + static struct etimer ds_read_timer; +#endif + + PROCESS_BEGIN(); + + + + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_button); + rest_activate_resource(&resource_led1); + /* Activate the application-specific resources. */ +#if REST_RES_DS1820 + rest_activate_resource(&resource_ds1820); +#endif +#if REST_RES_DHT11 + rest_activate_resource(&resource_dht11); +#endif +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if REST_RES_HELLO + rest_activate_resource(&resource_helloworld); +#endif +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif +#if REST_RES_CHUNKS + rest_activate_resource(&resource_chunks); +#endif +#if REST_RES_PUSHING + rest_activate_periodic_resource(&periodic_resource_pushing); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT + rest_activate_event_resource(&resource_event); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3 + /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */ + rest_activate_resource(&resource_separate); +#endif +#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) + SENSORS_ACTIVATE(button_sensor); +#endif +#if REST_RES_SUB + rest_activate_resource(&resource_sub); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT + SENSORS_ACTIVATE(light_sensor); + rest_activate_resource(&resource_light); +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO + SENSORS_ACTIVATE(radio_sensor); + rest_activate_resource(&resource_radio); +#endif + + /* Define application-specific events here. */ + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); +#if REST_RES_EVENT + /* Call the event_handler for this application-specific event. */ + event_event_handler(&resource_event); +#endif +#if REST_RES_SEPARATE && WITH_COAP>3 + /* Also call the separate response example handler. */ + separate_finalize_handler(); +#endif + } +#endif /* PLATFORM_HAS_BUTTON */ + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("Periodic\n"); + etimer_reset(&ds_periodic_timer); +#if REST_RES_DHT11 + dht11_temp=DHT_Read_Data(DHT_Temp); + dht11_hum=DHT_Read_Data(DHT_RH); +#endif +#if REST_RES_DS1820 + if(ds1820_convert()){ + etimer_set(&ds_read_timer, READ_TIME); + } +#endif + } +#if REST_RES_DS1820 + if(etimer_expired(&ds_read_timer)) { + PRINTF("DS1820_Read\n"); + ds1820_read(); + } +#endif + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/climate/flash.sh b/examples/osd/climate/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/climate/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/climate/lall.txt b/examples/osd/climate/lall.txt new file mode 100644 index 000000000..af5ccaf63 --- /dev/null +++ b/examples/osd/climate/lall.txt @@ -0,0 +1,132 @@ +INFO: compiling with CoAP-08 +rm -f *~ *core core *.srec \ + *.lst *.map \ + *.cprg *.bin *.data contiki*.a *.firmware core-labels.S *.ihex *.ini \ + *.ce *.co +rm -rf obj_osd-merkur +INFO: compiling with CoAP-08 +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rime/rimeaddr.c -o obj_osd-merkur/rimeaddr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rime/timesynch.c -o obj_osd-merkur/timesynch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rime/rimestats.c -o obj_osd-merkur/rimestats.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/cxmac.c -o obj_osd-merkur/cxmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/xmac.c -o obj_osd-merkur/xmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/nullmac.c -o obj_osd-merkur/nullmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/lpp.c -o obj_osd-merkur/lpp.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/frame802154.c -o obj_osd-merkur/frame802154.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/sicslowmac.c -o obj_osd-merkur/sicslowmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/nullrdc.c -o obj_osd-merkur/nullrdc.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/nullrdc-noframer.c -o obj_osd-merkur/nullrdc-noframer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/mac.c -o obj_osd-merkur/mac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/framer-nullmac.c -o obj_osd-merkur/framer-nullmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/framer-802154.c -o obj_osd-merkur/framer-802154.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/csma.c -o obj_osd-merkur/csma.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/contikimac.c -o obj_osd-merkur/contikimac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/phase.c -o obj_osd-merkur/phase.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl.c -o obj_osd-merkur/rpl.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-dag.c -o obj_osd-merkur/rpl-dag.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-icmp6.c -o obj_osd-merkur/rpl-icmp6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-timers.c -o obj_osd-merkur/rpl-timers.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-of-etx.c -o obj_osd-merkur/rpl-of-etx.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-ext-header.c -o obj_osd-merkur/rpl-ext-header.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/process.c -o obj_osd-merkur/process.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/procinit.c -o obj_osd-merkur/procinit.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/autostart.c -o obj_osd-merkur/autostart.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/loader/elfloader.c -o obj_osd-merkur/elfloader.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/profile.c -o obj_osd-merkur/profile.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/timetable.c -o obj_osd-merkur/timetable.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/timetable-aggregate.c -o obj_osd-merkur/timetable-aggregate.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/compower.c -o obj_osd-merkur/compower.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/serial-line.c -o obj_osd-merkur/serial-line.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/memb.c -o obj_osd-merkur/memb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/mmem.c -o obj_osd-merkur/mmem.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/timer.c -o obj_osd-merkur/timer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/list.c -o obj_osd-merkur/list.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/etimer.c -o obj_osd-merkur/etimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/ctimer.c -o obj_osd-merkur/ctimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/energest.c -o obj_osd-merkur/energest.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/rtimer.c -o obj_osd-merkur/rtimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/stimer.c -o obj_osd-merkur/stimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/print-stats.c -o obj_osd-merkur/print-stats.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/ifft.c -o obj_osd-merkur/ifft.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/crc16.c -o obj_osd-merkur/crc16.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/random.c -o obj_osd-merkur/random.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/checkpoint.c -o obj_osd-merkur/checkpoint.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/ringbuf.c -o obj_osd-merkur/ringbuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/netstack.c -o obj_osd-merkur/netstack.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-debug.c -o obj_osd-merkur/uip-debug.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/packetbuf.c -o obj_osd-merkur/packetbuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/queuebuf.c -o obj_osd-merkur/queuebuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/packetqueue.c -o obj_osd-merkur/packetqueue.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip6.c -o obj_osd-merkur/uip6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/tcpip.c -o obj_osd-merkur/tcpip.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/psock.c -o obj_osd-merkur/psock.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-udp-packet.c -o obj_osd-merkur/uip-udp-packet.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-split.c -o obj_osd-merkur/uip-split.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/resolv.c -o obj_osd-merkur/resolv.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/tcpdump.c -o obj_osd-merkur/tcpdump.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uiplib.c -o obj_osd-merkur/uiplib.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/simple-udp.c -o obj_osd-merkur/simple-udp.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-icmp6.c -o obj_osd-merkur/uip-icmp6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-nd6.c -o obj_osd-merkur/uip-nd6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-packetqueue.c -o obj_osd-merkur/uip-packetqueue.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/sicslowpan.c -o obj_osd-merkur/sicslowpan.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/neighbor-attr.c -o obj_osd-merkur/neighbor-attr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/neighbor-info.c -o obj_osd-merkur/neighbor-info.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-ds6.c -o obj_osd-merkur/uip-ds6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-ds6-route.c -o obj_osd-merkur/uip-ds6-route.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/mt.c -o obj_osd-merkur/mt.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/nullradio.c -o obj_osd-merkur/nullradio.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-engine.c -o obj_osd-merkur/er-coap-07-engine.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07.c -o obj_osd-merkur/er-coap-07.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-transactions.c -o obj_osd-merkur/er-coap-07-transactions.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-observing.c -o obj_osd-merkur/er-coap-07-observing.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-separate.c -o obj_osd-merkur/er-coap-07-separate.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/erbium/erbium.c -o obj_osd-merkur/erbium.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./contiki-main.c -o obj_osd-merkur/contiki-main.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./params.c -o obj_osd-merkur/params.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./node-id.c -o obj_osd-merkur/node-id.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/temperature-sensor.c -o obj_osd-merkur/temperature-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/adc.c -o obj_osd-merkur/adc.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/led.c -o obj_osd-merkur/led.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/sensors.c -o obj_osd-merkur/sensors.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./slip_uart0.c -o obj_osd-merkur/slip_uart0.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/slip.c -o obj_osd-merkur/slip.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/button-sensor.c -o obj_osd-merkur/button-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/dht11.c -o obj_osd-merkur/dht11.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/ds1820.c -o obj_osd-merkur/ds1820.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/battery-sensor.c -o obj_osd-merkur/battery-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/pir-sensor.c -o obj_osd-merkur/pir-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/clock.c -o obj_osd-merkur/clock.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./mtarch.c -o obj_osd-merkur/mtarch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/eeprom.c -o obj_osd-merkur/eeprom.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/flash.c -o obj_osd-merkur/flash.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/rs232.c -o obj_osd-merkur/rs232.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/leds-arch.c -o obj_osd-merkur/leds-arch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./watchdog.c -o obj_osd-merkur/watchdog.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./rtimer-arch.c -o obj_osd-merkur/rtimer-arch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./bootloader.c -o obj_osd-merkur/bootloader.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./settings.c -o obj_osd-merkur/settings.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/loader/elfloader-avr.c -o obj_osd-merkur/elfloader-avr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/loader/symtab-avr.c -o obj_osd-merkur/symtab-avr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/leds.c -o obj_osd-merkur/leds.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/radio/rf230bb/rf230bb.c -o obj_osd-merkur/rf230bb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/radio/rf230bb/halbb.c -o obj_osd-merkur/halbb.o +avr-ar rcf contiki-osd-merkur.a obj_osd-merkur/rimeaddr.o obj_osd-merkur/timesynch.o obj_osd-merkur/rimestats.o obj_osd-merkur/cxmac.o obj_osd-merkur/xmac.o obj_osd-merkur/nullmac.o obj_osd-merkur/lpp.o obj_osd-merkur/frame802154.o obj_osd-merkur/sicslowmac.o obj_osd-merkur/nullrdc.o obj_osd-merkur/nullrdc-noframer.o obj_osd-merkur/mac.o obj_osd-merkur/framer-nullmac.o obj_osd-merkur/framer-802154.o obj_osd-merkur/csma.o obj_osd-merkur/contikimac.o obj_osd-merkur/phase.o obj_osd-merkur/rpl.o obj_osd-merkur/rpl-dag.o obj_osd-merkur/rpl-icmp6.o obj_osd-merkur/rpl-timers.o obj_osd-merkur/rpl-of-etx.o obj_osd-merkur/rpl-ext-header.o obj_osd-merkur/process.o obj_osd-merkur/procinit.o obj_osd-merkur/autostart.o obj_osd-merkur/elfloader.o obj_osd-merkur/profile.o obj_osd-merkur/timetable.o obj_osd-merkur/timetable-aggregate.o obj_osd-merkur/compower.o obj_osd-merkur/serial-line.o obj_osd-merkur/memb.o obj_osd-merkur/mmem.o obj_osd-merkur/timer.o obj_osd-merkur/list.o obj_osd-merkur/etimer.o obj_osd-merkur/ctimer.o obj_osd-merkur/energest.o obj_osd-merkur/rtimer.o obj_osd-merkur/stimer.o obj_osd-merkur/print-stats.o obj_osd-merkur/ifft.o obj_osd-merkur/crc16.o obj_osd-merkur/random.o obj_osd-merkur/checkpoint.o obj_osd-merkur/ringbuf.o obj_osd-merkur/netstack.o obj_osd-merkur/uip-debug.o obj_osd-merkur/packetbuf.o obj_osd-merkur/queuebuf.o obj_osd-merkur/packetqueue.o obj_osd-merkur/uip6.o obj_osd-merkur/tcpip.o obj_osd-merkur/psock.o obj_osd-merkur/uip-udp-packet.o obj_osd-merkur/uip-split.o obj_osd-merkur/resolv.o obj_osd-merkur/tcpdump.o obj_osd-merkur/uiplib.o obj_osd-merkur/simple-udp.o obj_osd-merkur/uip-icmp6.o obj_osd-merkur/uip-nd6.o obj_osd-merkur/uip-packetqueue.o obj_osd-merkur/sicslowpan.o obj_osd-merkur/neighbor-attr.o obj_osd-merkur/neighbor-info.o obj_osd-merkur/uip-ds6.o obj_osd-merkur/uip-ds6-route.o obj_osd-merkur/mt.o obj_osd-merkur/nullradio.o obj_osd-merkur/er-coap-07-engine.o obj_osd-merkur/er-coap-07.o obj_osd-merkur/er-coap-07-transactions.o obj_osd-merkur/er-coap-07-observing.o obj_osd-merkur/er-coap-07-separate.o obj_osd-merkur/erbium.o obj_osd-merkur/contiki-main.o obj_osd-merkur/params.o obj_osd-merkur/node-id.o obj_osd-merkur/temperature-sensor.o obj_osd-merkur/adc.o obj_osd-merkur/led.o obj_osd-merkur/sensors.o obj_osd-merkur/slip_uart0.o obj_osd-merkur/slip.o obj_osd-merkur/button-sensor.o obj_osd-merkur/dht11.o obj_osd-merkur/ds1820.o obj_osd-merkur/battery-sensor.o obj_osd-merkur/pir-sensor.o obj_osd-merkur/clock.o obj_osd-merkur/mtarch.o obj_osd-merkur/eeprom.o obj_osd-merkur/flash.o obj_osd-merkur/rs232.o obj_osd-merkur/leds-arch.o obj_osd-merkur/watchdog.o obj_osd-merkur/rtimer-arch.o obj_osd-merkur/bootloader.o obj_osd-merkur/settings.o obj_osd-merkur/elfloader-avr.o obj_osd-merkur/symtab-avr.o obj_osd-merkur/leds.o obj_osd-merkur/rf230bb.o obj_osd-merkur/halbb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -DAUTOSTART_ENABLE -c er-example-server.c -o er-example-server.co +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c static-routing.c -o obj_osd-merkur/static-routing.o +avr-gcc -mmcu=atmega128rfa1 -Wl,-Map=contiki-osd-merkur.map -Wl,--section-start=.bootloader=0x1F000 er-example-server.co obj_osd-merkur/static-routing.o contiki-osd-merkur.a -o er-example-server.osd-merkur +rm obj_osd-merkur/static-routing.o er-example-server.co +AVR Memory Usage +---------------- +Device: Unknown + +Program: 73000 bytes +(.text + .data + .bootloader) + +Data: 12592 bytes +(.data + .bss + .noinit) + +EEPROM: 41 bytes +(.eeprom) + + diff --git a/examples/osd/climate/project-conf.h b/examples/osd/climate/project-conf.h new file mode 100644 index 000000000..dcbd00805 --- /dev/null +++ b/examples/osd/climate/project-conf.h @@ -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. + * + * + */ + +#ifndef __PROJECT_RPL_WEB_CONF_H__ +#define __PROJECT_RPL_WEB_CONF_H__ + +//#define PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +//#define PLATFORM_HAS_LIGHT 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 +//#define PLATFORM_HAS_SHT11 1 + +#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__ */ diff --git a/examples/osd/climate/run.sh b/examples/osd/climate/run.sh new file mode 100755 index 000000000..4f21e9b63 --- /dev/null +++ b/examples/osd/climate/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/climate/server-client.csc b/examples/osd/climate/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/climate/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/climate/server-only.csc b/examples/osd/climate/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/climate/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/climate/static-routing.c b/examples/osd/climate/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/climate/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/climate/static-routing.h b/examples/osd/climate/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/climate/static-routing.h @@ -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_ */ diff --git a/platform/osd-merkur/Makefile.merkur b/platform/osd-merkur/Makefile.osd-merkur similarity index 100% rename from platform/osd-merkur/Makefile.merkur rename to platform/osd-merkur/Makefile.osd-merkur diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h index 03c44db27..16826f4aa 100644 --- a/platform/osd-merkur/params.h +++ b/platform/osd-merkur/params.h @@ -79,7 +79,8 @@ extern uint8_t eemem_domain_name[30]; #if UIP_CONF_LL_802154 //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN} //#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x01} -#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} +#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} +//#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} #else //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} #define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} From 6d0bdab9f04f9b0120523251f6fb3da2a8aa4d74 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 10:47:45 +0100 Subject: [PATCH 028/345] change plattform to osd-merkur --- examples/osd/er-rest-example-dht11/README | 28 +- .../er-rest-example-dht11/er-example-client.c | 173 ------ .../er-plugtest-server.c | 561 ------------------ examples/osd/er-rest-example-dht11/run.sh | 11 +- 4 files changed, 13 insertions(+), 760 deletions(-) delete mode 100644 examples/osd/er-rest-example-dht11/er-example-client.c delete mode 100644 examples/osd/er-rest-example-dht11/er-plugtest-server.c diff --git a/examples/osd/er-rest-example-dht11/README b/examples/osd/er-rest-example-dht11/README index 06283dc5e..84d7dd2f4 100644 --- a/examples/osd/er-rest-example-dht11/README +++ b/examples/osd/er-rest-example-dht11/README @@ -1,7 +1,14 @@ A Quick Introduction to the Erbium (Er) REST Engine =================================================== +Compile the Example +------------------- +./run.sh -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 +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh EXAMPLE FILES ------------- @@ -40,25 +47,6 @@ With client: 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). diff --git a/examples/osd/er-rest-example-dht11/er-example-client.c b/examples/osd/er-rest-example-dht11/er-example-client.c deleted file mode 100644 index d1d543cf0..000000000 --- a/examples/osd/er-rest-example-dht11/er-example-client.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * 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 - */ - -#include -#include -#include - -#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(); -} diff --git a/examples/osd/er-rest-example-dht11/er-plugtest-server.c b/examples/osd/er-rest-example-dht11/er-plugtest-server.c deleted file mode 100644 index 051b44be0..000000000 --- a/examples/osd/er-rest-example-dht11/er-plugtest-server.c +++ /dev/null @@ -1,561 +0,0 @@ -/* - * 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 - */ - -#include -#include -#include -#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 = 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(); -} diff --git a/examples/osd/er-rest-example-dht11/run.sh b/examples/osd/er-rest-example-dht11/run.sh index 02b03a5bb..4f21e9b63 100755 --- a/examples/osd/er-rest-example-dht11/run.sh +++ b/examples/osd/er-rest-example-dht11/run.sh @@ -1,7 +1,6 @@ #!/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 - +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep From 4d93071bf9be898c9673490238478147948b424e Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 10:51:54 +0100 Subject: [PATCH 029/345] change plattform to osd-merkur --- .../er-rest-example-toggleboard-ds1820/README | 28 ++++++------------- .../flash.sh | 2 ++ .../er-rest-example-toggleboard-ds1820/run.sh | 11 ++++---- 3 files changed, 15 insertions(+), 26 deletions(-) create mode 100755 examples/osd/er-rest-example-toggleboard-ds1820/flash.sh diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/README b/examples/osd/er-rest-example-toggleboard-ds1820/README index 06283dc5e..84d7dd2f4 100644 --- a/examples/osd/er-rest-example-toggleboard-ds1820/README +++ b/examples/osd/er-rest-example-toggleboard-ds1820/README @@ -1,7 +1,14 @@ A Quick Introduction to the Erbium (Er) REST Engine =================================================== +Compile the Example +------------------- +./run.sh -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 +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh EXAMPLE FILES ------------- @@ -40,25 +47,6 @@ With client: 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). diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/flash.sh b/examples/osd/er-rest-example-toggleboard-ds1820/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/er-rest-example-toggleboard-ds1820/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/run.sh b/examples/osd/er-rest-example-toggleboard-ds1820/run.sh index 02b03a5bb..4f21e9b63 100755 --- a/examples/osd/er-rest-example-toggleboard-ds1820/run.sh +++ b/examples/osd/er-rest-example-toggleboard-ds1820/run.sh @@ -1,7 +1,6 @@ #!/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 - +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep From b6c7cc8672a129b03d8958705087ec4d8a1548cc Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 10:52:37 +0100 Subject: [PATCH 030/345] change plattform to osd-merkur --- examples/osd/er-rest-example-dht11/flash.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 examples/osd/er-rest-example-dht11/flash.sh diff --git a/examples/osd/er-rest-example-dht11/flash.sh b/examples/osd/er-rest-example-dht11/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/er-rest-example-dht11/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a From 618a5161828a4ea1c11f7c01c67331963c495196 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 10:58:41 +0100 Subject: [PATCH 031/345] change plattform to osd-merkur --- examples/osd/pir-sensor/README | 28 ++++++++-------------------- examples/osd/pir-sensor/flash.sh | 2 ++ examples/osd/pir-sensor/run.sh | 11 +++++------ 3 files changed, 15 insertions(+), 26 deletions(-) create mode 100755 examples/osd/pir-sensor/flash.sh diff --git a/examples/osd/pir-sensor/README b/examples/osd/pir-sensor/README index 06283dc5e..84d7dd2f4 100644 --- a/examples/osd/pir-sensor/README +++ b/examples/osd/pir-sensor/README @@ -1,7 +1,14 @@ A Quick Introduction to the Erbium (Er) REST Engine =================================================== +Compile the Example +------------------- +./run.sh -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 +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh EXAMPLE FILES ------------- @@ -40,25 +47,6 @@ With client: 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). diff --git a/examples/osd/pir-sensor/flash.sh b/examples/osd/pir-sensor/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/pir-sensor/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/pir-sensor/run.sh b/examples/osd/pir-sensor/run.sh index 02b03a5bb..4f21e9b63 100755 --- a/examples/osd/pir-sensor/run.sh +++ b/examples/osd/pir-sensor/run.sh @@ -1,7 +1,6 @@ #!/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 - +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep From 33639c15e1d2d6c83373867975c5f976628be1ec Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 11:03:59 +0100 Subject: [PATCH 032/345] change plattform to osd-merkur --- examples/osd/rpl-border-router/README | 5 ++++- examples/osd/rpl-border-router/flash.sh | 2 ++ examples/osd/rpl-border-router/run-test.sh | 7 ------- examples/osd/rpl-border-router/run.sh | 11 +++++------ 4 files changed, 11 insertions(+), 14 deletions(-) create mode 100755 examples/osd/rpl-border-router/flash.sh delete mode 100755 examples/osd/rpl-border-router/run-test.sh diff --git a/examples/osd/rpl-border-router/README b/examples/osd/rpl-border-router/README index 08207e885..866c2e4af 100644 --- a/examples/osd/rpl-border-router/README +++ b/examples/osd/rpl-border-router/README @@ -2,8 +2,11 @@ OSDOMOTIS www.osdomotics.com -Plattform: osd-er-lp24 +Plattform: osd-merkur ./run.sh +sudo ./flash.sh + +or: 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 diff --git a/examples/osd/rpl-border-router/flash.sh b/examples/osd/rpl-border-router/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/rpl-border-router/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/rpl-border-router/run-test.sh b/examples/osd/rpl-border-router/run-test.sh deleted file mode 100755 index 310d66c78..000000000 --- a/examples/osd/rpl-border-router/run-test.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/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 \ No newline at end of file diff --git a/examples/osd/rpl-border-router/run.sh b/examples/osd/rpl-border-router/run.sh index 62fc0e6f6..4f21e9b63 100755 --- a/examples/osd/rpl-border-router/run.sh +++ b/examples/osd/rpl-border-router/run.sh @@ -1,7 +1,6 @@ #!/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 \ No newline at end of file +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep From 5ee13bf52875e5d04634e4c96ef8490c2921dc96 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 11:07:08 +0100 Subject: [PATCH 033/345] change plattform to osd-merkur --- examples/osd/wirelessplug/README | 28 +- examples/osd/wirelessplug/er-example-client.c | 173 - .../er-example-client.osd-er-lp24 | Bin 420429 -> 0 bytes .../er-example-server.osd-er-lp24 | Bin 424344 -> 0 bytes .../er-example-server.osd-er-lp24.eep | 4 - .../er-example-server.osd-er-lp24.hex | 4668 ----------------- examples/osd/wirelessplug/flash.sh | 2 + examples/osd/wirelessplug/run.sh | 11 +- 8 files changed, 15 insertions(+), 4871 deletions(-) delete mode 100644 examples/osd/wirelessplug/er-example-client.c delete mode 100755 examples/osd/wirelessplug/er-example-client.osd-er-lp24 delete mode 100755 examples/osd/wirelessplug/er-example-server.osd-er-lp24 delete mode 100644 examples/osd/wirelessplug/er-example-server.osd-er-lp24.eep delete mode 100644 examples/osd/wirelessplug/er-example-server.osd-er-lp24.hex create mode 100755 examples/osd/wirelessplug/flash.sh diff --git a/examples/osd/wirelessplug/README b/examples/osd/wirelessplug/README index 06283dc5e..84d7dd2f4 100644 --- a/examples/osd/wirelessplug/README +++ b/examples/osd/wirelessplug/README @@ -1,7 +1,14 @@ A Quick Introduction to the Erbium (Er) REST Engine =================================================== +Compile the Example +------------------- +./run.sh -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 +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh EXAMPLE FILES ------------- @@ -40,25 +47,6 @@ With client: 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). diff --git a/examples/osd/wirelessplug/er-example-client.c b/examples/osd/wirelessplug/er-example-client.c deleted file mode 100644 index d1d543cf0..000000000 --- a/examples/osd/wirelessplug/er-example-client.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * 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 - */ - -#include -#include -#include - -#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(); -} diff --git a/examples/osd/wirelessplug/er-example-client.osd-er-lp24 b/examples/osd/wirelessplug/er-example-client.osd-er-lp24 deleted file mode 100755 index 75f76b867b3088735f5a09ca65e1622030c91127..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420429 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

=Y&5gPDU-qFQtrSFba&7kYEn#pYmsfP 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�Tf;cHxbM^9h;lT$ewQ$UQ~G}m;~y1b+}3%= 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ӎ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%0AqLLc3tk@XdN2+LT_@r^CiN=--2mt#>1ufZZY zhH{k0zYwk4;C~nMBOBqI)JeA*mejS+lSUubTUz3I&Qs-i(X)gl$&dDadPv!jbwfsh zi&hFv9V05U;9gzSO!COWQL9Fkk9uL$rXxG$PmN!LDoIx`pPbY}{r1XF`5yDFhxAL5 z5rsd6N90fJb*7&EZG)ZyzdGE7j~R$5j4d={{fS74OG!>iPvM)cVamI6;TfudL|{MjFx&jPz`ITq|}&AC!_iaf|i=j~&%4d3q#`uqK<(9zN4IW63fx?7Kb#ab2FO~e-ErUwEEMn9=)(akk(w%M0Ztanvtf% zYIl5v+G|3!*sc=?P!Cm0u$#%k+`fu1uWt)h#;&h-&{sVg*}JNC9llb}!!_ypsUAc3 z*69`^&6Zoqbl+3zk#@5VJP_d{HMcL_u0!Y9JlL7xurs4sar9erJYoT27xvXHOeIHa zn`p=XB8!s9yMXRvNKshFInP}kUl`GIljVzUXK*Z|avxx}yi3at`(z3oSfbf{F1M+j zVmHfwfi6V+V@cKXRj;!=+8Ev1MIPo!Mc2S8dJk?|cuVz_+=sZu*Z-*cO47`9 zK`>g`*?9Rpbf+yH|ErGrWU{9nSVAMDkawwu>2z}MavXdJ=Q*BXU9cctHdvj{KZTsK zTotTzzv!+U@FIMRYO2=Ok?(v8zP)Gk?wUY$FMXcl+pawENWHw$$C>8hYHcT9(RNd3 z+wTPFrZj510Ot_2Z~2)5uMB>t*KT;FX(#Cwf2~))W*wXX>);~Ty1K)~qW0~N zA#iy|?OXYP7s7>LHEg?T-vF1};n_phFS_OZYCZbuS9+xFB40j7i?NU2y(a_Jp1c*( zlN_}tzcw$EuQD%J-?gWC(QN&{xB9GqusW?|;cTBkSfx{FW-C$XH?03v=<`zfsqzoX zUt%ebkR5zc>Z;T`Qy;`mz`%+@n-i)J;55OELtUpnXjH@@uSUr_cIy^MZN=CC8)P+o zbx0|co?-uBw0f0ZS|nwF?v5!=2_M*Q=gM0cVN2 z11^+urQ~_jn@|)@oJDhP**YGNM`U#5rX80wx zl9wZSooaX7EjXsFns+R&g5Tp%X~Fo`pabn{e9|P1;cw>e;&XZ0d7T`d15d;QEXq$e zRTdZOJfNV>ecB`I_aKgu7LI?Xt*efq68V6?!SCTUFAYJdW>MfE#0_cv$We~DFSv1! zfdu)AQluhjn z$B8>Zc3V8M{?)mEFW2P>t5NfF-D-yIUH+yKE2c}tS1{5 zL|j3bue7+7W`u4-Xk4nVXyh}GTT75*LD+dld9?M6q{vD}xJ9d6B=h`I z_KETHA#_S_T`&$`NM*K|ToXJLVr|Lz@+I}E*1bv7uZMScNR$@;3`|10jgdbI%-vz~ulq-zhZI4$T#f`4&I`G_Lqxa9t zW#P}^its^rG;Xwh_!bY^4}VfSLpX3snPnCrMz>O`aCP$Pyb@&ScCKG=!$#McCEX%G zvfaKJMz3iK_Bp-1r@YTTQDp?%RHN5C#pn&2ZuCatmrW<{%HcV7^{dgEccq3?RfoEd z$jv)&Q&%}(>>S{z;7gowj!K>@HI-EHj?#W5)qHX3fRY-%q%^Li%*9ohaJzR^1=X}7 zWK}YH&p#~-H$^DI#0a7Q8Dnn3m}TK3#C?o7$@6XaLC<&LvL`)4@l3!y(PO5*ZG}%a zz6&@#g7_o(B^i#z!Y_&5-e=q~g4Xo%3XF5>R2t0~_+oVVifW@7EsyO+A%Asz=s4#% z?05^ej+sgg;12yt^d3(L>2Y<7AlG(4yb9-tLVbqydDZSPr8WJz#ctfiigTZf4F_Gw zeffMPt2KWMAJ)(I(3ds4^SFP%u8_QhJAo(t(rm*%-HBs&S)1fXtSgQ^W?e2nZC!G- z#F{Vrt+T%0V$G5NWSw^6BkN?`!-W&7j{_5?a>912M|i_Z=e8KWYxIVd6SrGs&kn2N z*$Ei$vc?L3K<*<`jt*>#h>DDlG@YflJaLD$P~3^!yR07Z57se#WHl>`=N>~F?%&}9g9nd7d3{!w?v!N8z^Kg7K zd6N>J)4z#LbT`+R@B=Bc>{1TkM&QO5J$=5#LpKBaXBxfLw-^ro?o^rz^|8*xPAWGT9?TTW0d$W{GP=)sO2`TGp`Wo7w}o7gWb0>RHn9uHI9xXy=&H8_s-#9+B-* zhX&nGgIkED<_#P>v>~?74|q&TpRnp2v7?~08e&WHvwOE0$)UU=k6@LM)l8)R_YHB&m}vMqf^% za$0ZgukOxt=d-Q@6Z~n1k4!ondH#nr2g;g>M=Yww7i`tg3WSO~L+909T+0`q( zbjv=i_WG)^Ib_vvbd+*C*E`qRDzdq>C}q8~oacON!PYO?cv0*l1S`>4z}Y;(+; zC_}yvR_uGPYg>rCcd3>qE$;z#4Q}K;eedPDN2$3VZ7P)S=*Uf@Uvlc%6YzwoCYWez zk*Asu5~>d1)Zq-sI)Vs9LD0o zSTVj)w4W7Q zOX1%#Ufk?xE3>p>%wMZ@e2sEn_tWa2@Na>H(R)2KJ-TJ}kIUMH7GaODL)a+P2y298 zLavY{OcHEDjHlNJpiw*to|;4 z`mrHT{K!ytoD&-i8RCbaz7MUjwGE&J+`oYI&yfD#YWjYpe~NSo>3fil`$eELNd{N@ z#l}2wuYpRC7WGL-%mKvEH!Tar53PBkR%0UGB)n01&2BQtc9Qjx%JFqG-nInXWW#L> z`6al`ipM$34YwuwY4ze&D=mE)c_F@UMDbL5kgZ&8@0)&FxgJs#zIe+C-}K8@%Mv%G zGMxBLzp~@BBhWXE6HRI0=etYS6z?f(qO}QUlrg3}L(B(|spK;3j8N<=C`EB*{EhOx z0`7EW?(^Q{tLATSAm1!6LL{6Ak|SXfE^)y>i*`iCn}D# zj_=uYj)cBTn$D`$aAG=hV_t}-Iy&mGpw3V3q&;?x)8aN;oS?<{FV$cS4#=+*b|buB z4LfjtJDqXDT06ce(#i>5gGcZg%)&OiU3k?_r+_yBbDy+(gs1GAgs1I0g_ZWw+}asC zvi4-*+emhgh#>?oIka@i=?dH(9Ma6^QXrqf^I*#GYZ(npRUC%6Z-sy zw#3I}Dg!BpeX?3_N{~k@X7s9uWWitUmLwXbHpkFi?9g58iLzN-Z#Rn_c!J&dt{kr- z$2O#`#gk*(xEpdE#z2pTeI#3PLJpvorjSHc+H6i6AGxb-<4K2|6)q9_l{O$S2xfA2uVTpn-5|4$4-Trj==cfJ} zTnEzX5F_cydV}*pjQc=ZMN(6TU8sAXN55(<21sK#$sn`Q!izNWc)H>74q)KUPCQ-# zJYESrUIjc}9e~G3cOl({bl2*e;PDF7vJ!Z_3V6Ia0FS$tGdMjK4K72V-B~8z2~MOE zx9wzA6(rGokwu(#ZVqdJFL@P0ddUPX+${Sk6Yvdklph~tI||LD!S!vw3g1jHjHF$J ze3|8Btv09$OYIz!~<(Yuhf^-+sT}XF5bCcDw7PUNu)$%k}%QFG1rE58Zvk_%! zrYNRPSE@*(-(Vq%MNx^G$3j$wGcyTjExdqs`71;QPPHaS~3#l%oy8d9U_CcFY z8c!qtGsyoe@;}#^AE_>+x{&I6&TNp=rGAK73+jQ~>yf(=xi@s?Myd;`E~L6PnET2D zrT%Je8*-N*cPVn0b>>E@3#l%oy2{M`KwpjEYocV*!`9aR4QK{1t$^>aCNjrw#4UNc zdOuvGK2Jc;yRRh8X3+K>-7LPmj9|1sjTb*lbBLeg4CQcrp2oXAL&`SvYdiY&BKq}G zXTOl@LaGa?u9s9za@K=c=3Qo!crcBkr(ESOHC#9UFtnrL40L1~Rjb#gscrCxbAQs1 zwg(YC^w)BcC$T!T?LgZi+IDufjZ_y>T}X8~%_NulSh~*=)Be9|t3qwnsI3OI)ppi~ zR2NcRNOjekzd7`g`LLYmS!R3|)`$PA#&XnHfg0_ov9hy9q`HvmLaM9My!#N^I#hBI==*a@|X~dy|(v5 zK{$8rPlIP8@a!L@;SLh}VU)7OXz=E`K20l8W$}&0x#EXuHs3QZ&c}EcV7v=4-bJ0` zMXC#_E~L5^nVD9IUt+}QF?mlX$(0VC;wq;$WUOsRjER;8Xu6PYu;z&>1?%&4F{4xP z#8RBA>f4NbXd_2dsqcV(Arrk6oi4jr7Be9s9}5Zj@k6}$ahgN?M8(=q(s0 zzs9{Wo}AUdi;rSQdkp=F9Z&1Xe}BPvBgV_nEio^Y;U+IgA`6&@;86@-k2|@WoHu8K zD#PcDP-f;E>`9ttI^~;}R0f?g8oL(1ktE*8D?ZKH&9>~CyDab(FVBJntkYnPmRh++ z*Os$;WieZ|2buZ1tQyho`h)Sc&|@8x3);;ttaR1>hb$CxT|C!xwoRU&T_hLGd=9w< z*J)!1a{J{QQ6yu1ud5{B|2z%RIq1IYXXOpfFVb$7ezP=#^T18={x7);csv!azf4O! zYlVzDDp{B+LKb`yv;HNd`n@0eKa)>DS_V$*zp9`5f2$HloMmmqA*ZNPL{*;FEr&y> z7S|h@x9U(y%e$h3**|L~u5jlbQ6~NCrgh5VC&2Gdf!|>bvUne!@Ao~A!}9~a=LhjT zK7`^PP#=RNJ^WZ`*14q3wN@d0A-ZAzBi=FczBG2!b$;74abRs6q66>eCb>zgYjACRZAAUp0;+}GEtjZ_ogMSB)c9$@-f0 z57t^W$7OD4jb$rESw8@K!if5}3wlcI=}^ICuDr&vmBvBZhZGTgKiA7mtNg*%xhK~n z_uLhCs(qmm9$ZenWEzKB$sY@#Q{mOdQD0E~gQguungaJj_DmQNQU6&HHA9^vaS$r*3k~OWIv@swKKWG*;^|&A#3{MvZO>O|~^!k17h53C{`) zemCp!1L*NyD3<(&9(Y+!fGkJ3%F((-K#~-1>gd%6$Y?Opwj0$G`ieGQ) zdlhWJHC$bWact*b=Q&FhG-ZPDJK0N~w=$K!61@#kdf<1SH%zLmsmrOX3ze$yx2moO zB9TM;v96uVSgRVcZ$h>FwKx4bG-$gHw*CTZiM(kkLiMYask2@Gi>xCGs9r z^L8&w`tfK<{Z079+S~=17bJ_Q@jubI;HrxtPb!@LBs|PEG-U#NQ_hV!Nji(THCaj0 z0RQQo>Nhw;`x~4g{r`7KYQtZ4BX(69@fD1eaq>K(VpFt24@7eUP{trymUx zdOQ-p#y3HSV2+N|VbRtW#6W!0U7o(x() zqmKLx+C39(g{RLq!LOZ1D|+wFfWDnZ-%g>&C-Kt~Js)3M)N(Dr+5>3wGqp|V(;x>g zo{TQDIMCac=qgJEb~S&F$zECf9QnUc^OL8&XS1e&w))fb%0sA~#+lhRUYISIFjp4f z^=Dj&o1~o{*niPIVpu1pQCzGAamC>aB8w9a{wl@^-;*EPP|RIOe?fi{?Pyp>80J5j z+U7bkOya3%i+DPkwOJ0RP@c9fqq)1wXnw6coot`Y((ukCZs~6kxAqricrw)bZ@hPq z7n@axHUkIw^tS*#>RTiJQoC#McMI@*Ykv(Mb<@{pQQ3(4r)--K8l26*!7crZkb@`y zo8t=Tbd(>`*16w%tAG9Yv5aJf-#(1HcI?XVdWt#u7W>@^a5A22ZuH)!ri*xDIjVi! z#Nt!yni>Bv*~|Eg0G`9UR0$yu-$;~-8HhPj!(=MU+p6rC^38|uqLG!I{+}k_J zbR+mq@@w^)v?JDAj$Ujpu9C^CEb)7?cpUTfAI#S>&U5W;wbl!qJzWg`3ubnDG3iy= zil4#nn&M&5&n4dy0>)p47`JvT;m(xJ-K&8ehCg;T2c9n)mUS#FhV;01;$8FG*( z)|)AFQU>lq7{$

fvE)xZ}|MI9nTJPW5lhS`p@YSS#1wIb@J^=-ams|Kbc|$ELCA zPz&*ey`dYJ>5WQC_mZc%VCfe8*5tk#4g~TOkic~F8}kh83;wI##p%5hFiMT$=PRVA z3|Y|{(qpAPRO3VMgjC=LdT~Aayo!&+t&=V=nE za#~$q4xjC1d>iow4%ZE=(Cg7>xvxMmSR36(;inrENsaAt-%b9bT6;RQo!{!LTPw*< z(&V2aFbcTAxzlWL?ts*?XmRQHu2T{9b=LnK6?{XJ78M+`l+Zm6xF5QV+on@}MH1J( z4jRi%gW3iiIDew~i{#JhkB|6h)`_eb;ftAvGomb$A%~;WfjHwT@tw*)YCo(s)=AS( zWbrKr?)WBjye~SIHjlq%K|?Zw?jzlZ8D5Y!J&k<5|60uRn977QSi-0pHKZ}#W3c`F z*|fUm%V|YvThl6%E9=*fs6NAVN{@2yI!>Ow(fUKgjlpg5`vaodKjjvuJ_RYSID^h2 zM_~Vv<9^qf<9XD*%z2bEs+ztro*@3B8ij9&@&@-n>hx571L?!Ydf|P%)>g}Z$7*jp zb#8#80ouIC4Mwa671 zzct!TKC(29Yw5OUw$*HVVO#u5-L0RfmwwF`I@3IZUXi96i-ECLjh^;qfYnI4x9Y`> zFY-na++&RORX2;5Ho>O{z{c-i5!Gs4T8UUyzB@KvE7jOp%3p%oh87ic?MT0XPIa0G z0V}Om_FlM?5?_q5Z@i zMO1atMxX4dj@*Pec$8XTTo-CkIOJOoDTziw2+P769Ilz=8tN%*sb=lTpmJ-yR(oBJwdxwz0+}82_w*%3Fk>-| z*xyzl)Skxo?b8Xz+mve6mwLrkvgD=c-5E{USOH`WCBoi={B0e0(_z&bSZu zKM`!YNIX{eb#$nUM1v>|LB|2TP_h;z{27Gv{zjbiH)m~ChV)N|uI&r3g8ZfvPeOU6 zR8H;5w}TpyEQh3Gnte=E2bG9LZ!C2~tNd8tr|#OxZz-&?$tV5YXGqVM#yJog)}d!6>5bEV_mOICi5>d6@RZ*_AvorLjYF?Q#&-hA%-4a6GR zKI?r*cvW8hyH+k%jYxe8804_^b@p|hn+b1$@Rt}S$N!`gI2C~UC94}pEXaafzSi_xyycP2>` z2bfsY@NEgS-)servwiN3fE#J4rI{p2;Yl2BjM+?Fn4R6w$Pj ztFy1KNdqiqhqifRY7;8S6Y_>SdtGAEIfXpgoWZPWw$NJ@cBgX)_5Wj#_BG0Cu!bVu z`!MA*;3r8X|1yo_Yt)N+NH#B8o2?zHw2({>=o68k7pYg4_FOvV0yeRqc`X@##R=rkqsC-wOqWaF> zD02rk9`5rEexj0xyD4%dSvnD|*a*vUgTM&~RZRioEa*^}uW+>bw{|e^#pNxGBXPPhp>ik$idwWE^ah4y3^#%5mZlCS1#=ZFS)6Pb7tI0U8f?`qc zY&G>YWH)L8cR(5q+h@^gBCBhQ&u-ga7psFHFDip8>9qKtX|=n`AQL0YPQq)#u!Dd! zJ-s_CUbW7@`6+Q3`cF{;1L^CJ1!34#NvB|xL}MZ8^Hq-IrL)_J;#Z|^0M~RZz*7KO zjeNsRQ7QCPPko)OZZMRaFrHwLba3X0tR+7FEyYd#@ihMJ6^<-_ zU;#2D&qF@(OfpF$Aj6YWhH9R4ncR@L%zuuFZ4J?a8?mqgzi z+kcV~jdTQgKRkDae7}$ndfF)yVIxTU&k-fGLaCv6*Si$LAKD28#RU2M8SK2>>!$Mu z)qbW$k%^-xuZQ3K$Vq276K)7Zzu z731hx!#F{%t@7s|P&v?j+;z|u>+$y_sN^Dcut5j%zvSwNTXMx=03jKx9H%{i2t^ZNgW&EuEi zao9Z0QKK}>^=Q41RrX>2`h%C%pjvKs)Pxyh;nRXnwM0qCj{|$6HpyNYQkU8G;lsRS zyEb9g&wJ99y3qNPPM#I&$rC!s*eP|7C1kydsGn^kE<{`#%;2?E(J16qU`siowxugZ z*oM=JeEE@JN!wTa+)Hc+omUl{S5Jf%{TN6eyY}FMk7Ifpv0@p=r1x=5v1&xW=2;p) zwB@2krDo1P$ni5bXOYwmPczsPFYbV*!A>(_>}aBh&kQo;g>D>DFT2yt!@PTKG(pr#GGa5o8Bu)SGf;s{!w!f_k0oc zgVkP6@P2|-N^wW8&zg%|dEP>azJ4)--i85s%>V1bncDdRyP#dPcRyuNBn3*-E5DaM z04}T-4uUcg)qpjQk|})#x=7UUlUau|_^skr%DcCHzb|z^QpsOBrOs~Ori(y1xWqZ@ggUW`uVRpX`H>Dzz&&4CT_6T)d(LK9%Lc}xroA@C zd^+tYunr_Oaj|||&0lIXs!2AlL%ajwNp7$+)b-fsIsdUzkjtw2Rnpv8;lrI~$9l>wuP?8&5moz!OG~9F)`26Yd8m->u4?2@ za+fs0Q@p1V&$qaF*@N^(mq|{S$*b$Fp1RfwTZ)@7nD#b;{AF%r-Hccn_OE?n~6`QfR>#2~U$=BT^9vi`pq%rO^ zA?@GXEN}w^1>zy}-orj9yye4mS`WLFZ#c#?T*Ay~*sY!231>1@sUqPFTmOHOIGkXK zmPbxAWR%?qmEPhO&0VKPy(Ioekby_ok7l6l8J?1=Y4|(MW2>5pzcW47Dh=K=2h))@ z-NWYLzh&pjG*}FCJJdZ<^bmZV>a$Db7if)K=bFHOKZ3H4czD|!cy*fNQCA1%2fm#m zX@=(F>s*w66n`H@3n}i$)LL@XT4-jD-UPdk0=qAF!EV@>*M6#Ew|`#zxK8^Q?VU%t zM^xMD*`CSj-)xUYLFt~Z>pZg6FmpDIze1%Cq!C7Q{Q9C_UKzhM*W|0^-|$#SaJ0fN zh`3MV28k=td+qxe^<$KInD--f{onTJv-|$3Vh2%!^V11Gv~RD@Dcsl29j!PHzVZu4 z4esNYr4m1z3@$+Log)#y)xnX}q$|f2>;0<~pXI((=(!B&@@;)-#ld#V(lVbHT%ERWOqm%9s zZ$>Atmmdk)SB-Hj?;OVj<*16ExOG-{#upHG5?-^Bt=x&^XNfyQS z(iw{>=TWR3@=@^!yttEWPvbrX?>{@aayAbiV<-L&k}@VudJjt7>eU0pMw7s+c`Xwf>(BKJ;!SspfV# zTG&`acV=PUR*tA*zrw3H(`0s-JQEc9wtv8}5EFPCg3$I^erQvVGTWC+0sU(u9`+^V zJ2*4W2dCqZ_K;j?u7}!~?Sl9p0DARrk$f$5#^mXakQ(_>_FoM zri-eauZ{RJ>e)GOSB{bBR3Pt0d1iYraf@pHsnRcpdgdY=P4~8ApZS`540zWIQ1@dL z<1Ce%YVolBhed8{M%2jT+>5F-hqpyp$HGSWb8hLmBKbbZFOnevi>RM8fSrqcQ?Tz85sp&?I56ASL|w!w@ZUEZyTEJ@+Y_udmo3^l z6<V%GSv-W1%rJ{WNR^PjrLVo%JdE0cvf%4@Cj`CV_Y;b{aU&lbq8 zG+Wo?I?b;kzmEAav=6rqFR6nU9m@poxH{&=kUT$?)p_drNJRA`_JPMl-RLj;K9$v} zexd42n2ioqZ?XhBrw4G;)4`Fq-!$1|)1D1h?TJ%in<|=YEQUpg>g_vKtl>_{lpB5Z-{rT5P`ink?H6+E^MyBwv=n_QIf z&d?Xl^=6xyhZl!S+>l)(cip#Z+ODoO5Z~;tp|tAp&KeeVtAXV+)JD~kmf!PS@?&GL zlaMX_C2p@fL*=Y9vzt1ua7FH|(R+KojYw=xH8SlWYaHU##v?v$f^{Hb)DA*?7UmtG#p#0QzuFb9atgMi)tC56wTQ#0eVjtjbm3V4VpLkis^Y@S3$P%HAPJH!s zu2p-(jgA91I!HlY`d-(1ooiOh5vL7q(3eg$^!&+-&Hk0CNur_qkZ2z+`m{$#0+pf4 zptmPdES?GO@u#M!a%tpSMKp)v43CeSI3e)P(2> z)sQ`avcqRTMuTtZ@XZsA)e-Hnn)xTMbKj}?$sVB^5gA6Q5gAB_{W7%ZI(H6F zCL68f>)dHI^;_-;R_^Ek+PtKxNInTK?;qieN72B(z`P7;vB)DL?@hRM?wG6(kWMF( zgGhe~w1M!_Av7k%dg=BpSQ3OV*vUlXBxLR69*CToKqt`Iw(&ONuBpzQ!rKDXx!w4B zXm9Vu4_vT$St8Y2OkO8ucg?;~JR`1$v>tCo`{MS6Kp(WX_rwQBxtAi}OknV!^XX_C zolhARYmB_cB@0$_MMA~UiUj*`IU-RY)vF9;6V!Y3wMhq;E)$(qhwbg~}0ZzTG){sW?d13dJFrISC`1M1tS z$Q8X$ulBm+0|uYJ^Dnzky!x`oCcNUV+x?1%{9dvz3!rnIB=}+~piQ#Jearmv(8i$^ zL$xRf)E7!W&IP7geW`ziRnB^|Kld*8h~4+@et37z?p>bmQx*9xw@q$`l@3`K9^yjX zbXM%G-1Whpvw!O!<{kAxW(y+y;L2m-qd8g6a};}$qSAbZ+t%G!;RC8(l_-jrUK#A0 z0fvbqFpd!(w$G*FITilaX@5w=bDHPz&hb&-v-$gzONKQJoA2JdyLR_{59!>o(bLx= zeo=DSFwd}s>eq$czB>4dI zB;82r^G81Xv_h6aGer^)n?UEe3L8l~mUQ;y|Lz>LcFsX7`Z?N7YliTi)(rL8Peo{T zED_cU+Ug)_IIRx4&+hHbK1ezgkkHOu2PvBAvAO&7=M$QH`Z$%|;5f*~0b;Nx)r}dV zYT(aU91MP+#Ui)n>ZT`T?P<~95eI*HzuVVx=v!`bH!4OHX@A;(R4$18c<*tHOnPge z_xtxFz9xw(q;BkdpRlj_ER!)GZj1KMc4>)+-mJo=paMdh+lQqmuKQRX^qtn+D$@ zT~gyL5tSL@oveB(9|k(JGwq#Z(w?H2k`3^<;I_1R2T4=;e{gbByz_j+xsF?)q22Xf zvp49{OI$|ex+MWQRnm67e9F=5nj!fEzRR1oo**6Dr40Kx3eA|t2m?4W&$Auc{OskGYnR}@0kj6Iz z>V`3{fzDWTM@q4y{{L_{bkZO=5Ki5Uw+Xzvf<`3P7M=Q13h6g_*jxeWTTt=4+=?R7 znqd;}%(F93Gb;j3{_@MWqZ7F#%ne0(Alo>aD=(+xdrG8@T9MGG#_vfzGe(UAk%G9* zY|aWRXTziJ#%+Cdk&E!MrbyZg%eb^WLHZ`SXqr(V(i@hD~mH&hx_{Skt*eXlbd*c=IMIW zK6iyC!w;0evS?c*L%a$d6WWoFb6aM;54m!+Xg6ki>1=PXo`U`l&Q>;(Dtx2Ltil@T zF4y7u5I(m*Fj~L!G!b;}muH>U^n0161ZnesWF$>@0kik*AZYMI1Bz}PD8GLmq9l@! zGF(nqu5(NujP9@fcN8>NU29$2S?dsm>?S@k(#BS1{6zt0vo(yQ( zerSZR93$abME%o?2(l6Nt`+3TitGnpQ6*!f!7;lnS1!gF9|gDhD9)3b_fIBOqZ1j) zr&2cWfy|)@G6%AzDN*AG5YM4{i}Au~9enN2^?b&u_8!n0i}4Z;_K-Gkw?^KTK$>D# zA#HTo>1;jKLl$<8@Br0Ms<$&KFQpKk^pZ$Es8L6fB8Ms0Acg9BU&U^7(No;!_JilD z%(hsy2LnCSA3G#|n)HMEPZB4RwavwO93I#JT^`b=(i+BhjgrZ#mm+BW29_9qRjPHFZ?9-Cp20>F3&ROp^e&3buhb(Gjkb z^owq$iPs?5QQSDUO#d8CBn4-1n%_CL$1%1I9N9sW zM%&1ia@=WHW#Hf+!L%`bRkd);N!&@8dDD2b1U|m@SS<8lRn=;SiT5O^BPU&vuPU z%5aTLs>n_;4~whFF}WU0vVwNN6GswkJ6sPWjh~X8QF+?cJnsx?WhGRR-;Z~>uF%vg zbD$Bv6mZom*?1zz>XpfODoS#QE0Q2>hoy{+n^*-mvGC~S&5%ycqIG-$nq<)aY2!+M z#0@@SPGcL<;xA?#CwM6uMiBknX?z>EPHfLTi9MG;Yqf0w?DxpqXTLj1tDVUazeBw^ zIlx0KtC{8z(kA$fjrP#|b%h&QY56f^-pN(X3`^Po2R14JV_~>K^QiYe-KGC}?Zf2u0qx%3~Y=)%(*&g zGnew{7}(-q26q^ojzh_^h_4V|_?|y0=s=>}^$Qwrj z_M?)*K$S-U2k7m=q$}`+gZXbR`IgBV35~5V#ZnFG>a1FXsA#Qy` zRF7@k=iXE)K z(5QwMX?tu1~-rd~EC^5!F@oUDR}v>h!?vqy=`# zhn;|d^HU=m7t_Kf9wn?H7k=7{5aWZ!9@bC^?>9%VJAQ?qzvJf<{GjhBZ9r)a#s=r= z7zzD2j4?&Y5t1F_%v55^W6KV5^L+l^Lzim0oqiv1ytq1sq{pyGUTPBmZcGGqo{qWx z%1FK)DB>dhkTmtel*8Uq3hIiia`Y(4{io6}%JN;2Q)` z{H!yNeR$iYP$_RTc}U~Si4ue^r8=qKumb`wLOb`*Q;x$A<=>5_kxXlApgKBhWZeqh zb>QZsv`w*P+WunO2J3qo1@U%NGiiY6FgFHuZbFx8u~wKK7vUnsPR+%5GcevVNK#3^ zPQ%6X#-BppR&jBeD+eO&&D}t=_{;=d}t6%r| zz8aj5S`5y|@RNg|T>Q+&&m;JmgP*w;;)tTH{jCGwx7lEgvi3!6ldfx#tf^(bjSmv~ z3FT;EyUOQlJ}+^P;M4d&$+z<%f>EfrNuCm0gY6~To3=onox#1DV|89uqg@f#L+_2n ztd`5%0-;!-RC;eL_RUCumC`a`%e^Zpid#gzyy6lp?b3y@!c-Uxt&LF}PsQlOr(+D_ zGcjqgWAqu}lf#J*9G@^dfh6~1ZBuQzuC*~muBT#n*V8fZ!V^RBB<_4hPK zUPNqX=!6sQtMMhHJb&bp;cwy=_(Q&3^@%({<=TuM;&qreh-Bj(p~{aM{vJn63gYXG z*b|t~d^&Z-OSc;D3T^aiEuD;PM@upA8jn35QeDc~-@{VF8b}ThrM8fjlauwZF(*`a zv96V{;}vd^uts>mI1}77wP=*Kz|V;&BnqR1t6VdB+JavGsP>d*igJc2TcHuTbLefj z@zYiqc^9CWp(qLrSJSI5b5sk}wu>9T*}+ZNZ0R!#KT*kLf=A88?EcuiU*+h;&HSO@ zu3F{gsoz9>=}pr-ONWjp^AvNH`|ly9p{|{@NcN@qyNH!esJGsv<3L)Vn>mAo+bl@K zqdb3tg~xGKBNJYphi~opuiEw|pWO$YT?l@-`GP+hYK>$WbUt9Kk#wX;Q}~E-g`-n( zv_!I%JTK)mKof{0z3{||GEC2!^@C~cPWG+bR-a7^(-f{R=urF0{M|s~z^3b5O@T6l z0p?IMX=uaul$p4O!A{z@=#~H!MTN?-4jO-qO^+VzwQW&(WevUzf;7v)>g}rr(F3aI z;D4*J=7xCxiZ%B({0jWn2Ookz#lNLFAU!8451t$=k>;M>u5vV=(h?^PSTMF#Kt#NmS)2a&d?&6r`2kB4K-9omDkI8UReQa*E`Y47- zrk6Mgc%8(me>NssA`T#3Aq*$pU|&b56mK15O~9QOqt%p~xGLzR7XEmMjhOrr5CkbL ztbyVfkUy=iCrvH(3u#~3?;xM=%cXEwT0V!7J{tqS1Gp!pIs|#4w0QJ{_6?n*h9p$A zW5JGnk>-HToqI3J=&gcYM@j=!37}Ecf{4NyHw2W4)>MBF^^+o}7(DqM2M^5~op(tB zBo70UWaD$2s#zOUW*^SA)e4)1CF;)h&@!wQFO8Q*N*dKeaK@#YdP*9U2qHArZw_f= zt>q~9M(!Lminm@`e+bx(b?&zYzoA+=Fz9!dL7VpB`8XM{*$t71C)}lIqutj5k5u45 z_8Td>8t=m%^7nEWI0h<+W*P=cwiYx*)ogRYS2UK%I~XV*6|8zj9%K2#3EvrS;+on27m=3Ta!%9Gk`1|j+m`Fphll%*(E zL2lCgJ?5nviIc7`(72b%(&tMZzQ}PGO0Sh-r7N|in@jZ#8c%chkj5(>yY$(wLYfzC z;2_CrmiifAxRHa0Ti+P2A{LU$gR5&Xv{UDIR|i|)ft(4ehxC-G9&2GwiSQ$~ET+ug zfB!tNS!QKKMH^S?SvRC}T0}gm#~%^TUyJs1sDSG8&!Sc*!-wa~E6X1(pIAPoJguCy z)A%dxlypYk3zD9-ErVAt4d&X@FSSO{`?V3Q?W|d=slGsa3ar!Mw8c<5c{Cz8XnY={ zN3G|SmVKuWw`@DNrzOf6<&5?Hi+A!ZXMTGbKHq(F5x_GscwFVapK)U%@g5V}bg)P_ z!1nz;j^x1fQ#gCwM93|1MrcxViNbo0Eb{Z!$ie@{%>vUy=;xv6q$dZr5B}2mALsYZ zt2m9)-o(mM`PSJtCgvi37g>yJ^K!#y8-p_uxK@%568+asB~&8AHrY1MwhH??twZW@ zk8=ifq%>ltv2sAkMZd|X4AFJmE24kI`OuE{vha?e`53OSHQHXby<=Np%e9eZSF(Gg zdrwQ`-EpDEE@?dqYuF-|#Ox7EV+@{siouD$&XSmDRS&;^Ctvj?H2!4dQ;<*F`4I=f z*GsH=d~@I%#TM&t>#4S=xJqMWSBbiFk#+Io&=1f&-M|x_%DGVgNn1+eIklc^ytT$F zQ}mGM5%ZO4>rn|B^F!ft!pT=Z!}#uYCs(;G{9gV8{ww~Zk3*+gG+F%VfgQcV!ebGG zZ@*ezo0<2!SR)g4JT;a$sc)cnq|Lq2^S$GmgJQMKi(3_565bGA5W7y#hl}Cl@vAOt z^MeL&6UrRwtT}KT;P?R_(slB$RN@iuw@tS#vaP{>cxvp;@)*RKW}P?-T+XSn6h9+z z`p=`&3_CTdOH_-#(17cSI6G7?UoK+Z=fFN77oG^=F&2Jgt>v!r?d7i{y{m`9vT{%P zma4sw*epi=CCHzT{EwThRj#V-Rj(s`DbklAeL2z#%w<)csx5VU>mWBmdJ)oBAbq9T zTIZ_UUiUiES0Q~h(uo(W6?b}{QdRLF3W!pU4 zw(QuugBRB!KaczZ@O! zvi+6Uk>1s(W!Wp9SGMflySuyROzUpf?(Mr@-%asGZn$~Th1%-TN&{MPL#s%%{lWH{ zjlPoBNO#Yrf!|3xgcqMj`Hd*Q3FTktQvQ_seKWpq!FO=6@T(eFo^)lp`xMo_Qydlz zI|wt<9tn)BLij?lTmG&_A9)WkgZ}hB^*G&q+Ycjg-@qb${Tx&B;CFT&{LapY-`NEg zKc*~1`XZz+M*0$qA5-#?{y5T?B7K>~k15NMUV!vMq!(HIn9|h?v>#Kt`dRm5N>@L) zeoT25_4~b|`!U6i^h&f_g?6hgeoU!BdM(oHknXT(m_jgAVK+Arc5H>hCZ>|O>Nfo5 zTXNfm`FPh`7jA<2uvlaPkyc~(92DX z9F_18ZnB1DTPCUFk*BIR9b^w|&vr~A&pxb%Gv6!fPA{~av0M&4(oz1MqlI}i+BC5) z;JN%lKzhJ4d3Lj7cdNipIeyAw*j)Od0DrcCWfeH&kBj~1kZM>Xk#|)CzUuH*L1`JK z2{&lh2y58!{hk)=fh}6J-yPrWX@T~Bv-VD>X6n5^$G^EV-{CzVhql|(O>1S$cr(oo zgSq4`iE9WaTw+$#BPCsnLB7nLjB5|qW;HqT4tUtow2G*Pu(&9F@5p$>rC~FxVF%%a zhH?8jN$Psc#ub&z5iAa`$%Gj!OPF0WIK9F7T`fc=kL; zEi@Z1hE7nlK4|{P{rF3ssI;#ckLKY1@UWY-(@ZTCQ{pF8FSf?#Nt8~mf4Qj5tAEZe zr=3e<5`ojjWWRg>7Ip+dgF+GCG`ucMeJ*t;=5|1p0jo%dRpjRdh%aMO0EVqsxgy!7 z`mUmT*8*sk(K+9LyUOww$%S*)Wf31qntQCIc77Jlxm7QhSC_*!QK8#u($(rM*#pvJ zy~Gy=No4u@xoYF<=L0Wrfi;Lqm=G&4=^^it7K9&9aA>*0@+n%8IUN}!D_Jhmmi@r-s zIIH`{q{R@ws!BOOSNm5mjc$XIp775WwE%0UV)CF#CAEmX`RK8&m}Eu~_0JWPmr@q7 z+xkTHE6;I>617Zut5sX;BMR#g#p7nuB9h6FRdyeV;B)&ERMSDV4+p26$f6Tu(i2@R zsS$ZZ9aTaBt2?29^@qGk{-jEQjwue;11Y>~TuO#(cS^QvPYT@?Zs1DgOv|j$Xn1S6 z1Kw2L_h~+rpnpGwVJ;BIYEO#6xjO~e5O5;7nV!uvs;zx&8)?OYs&v}xb#Nb4d{uE2 z68ONhepNwLWak?E~#) zAvtr(_MtJ*(T{=FKz@5Ho?<-$JbvEYJ`m3XJytyH+vD&Y2MtWJZybc@K_2o7y2~4n z=Xg&kp4WN@<9V>B49^q133yKMl;b%Ter6r=cqvAezQjW2I2kopqh?s*qTXuMTQ`Pl zAB3ktp4u_TP-ivjgkK)7EG8!^;w_1T)v^g5k_5rKOris6LAVLLC6RX}CsM>ux~pO7 zByG6{twD-($!zPjFLZavO3;22B#~aiK=_hoE1~PWu{Dv;MVtFJBoy^DM;0YOuh!5M ziQl@WD0q*6zeCV)qAfD)AV7oUPdVDl`E)UOfmd!)(|*~1HdCH zH2n1cP7H2RUQT`|d3rLf_mn$)v}bkO3kekBN7c_WFpZd6H-keUL>ckA`^4`Y@OFq^xgGC)k*8l`Eqqw$l@T9S zG?9PAcX2BuwrF0ThkW=kyzuh4P2c0)1GsDfToh-&MA_Llkzkg4b_F1ROIg>lntiEZw}#hw}N#fW91Dq-`a3%gVkIIHDulu z5pP=MY#8nJ#Gj_`4#93NL!@GU)#f7ma2{U-!3imI6tKh) zKgx~$Y&h4hwFKYr$g9;YAYufIY-~l$go;T18CHYA83kN2#A|&*+$gmz;1|-_x07;h znmD2)u_1BnweZeS3L@`{?kx9TuBAvRA}ROTsaK%O!Mpm$cg@?sGcT>+PdFZy0;^R^ zfv3PRq?nV6LT=nCgZJ@8httQvo8z3 zdqU2H6d`!634Qv6E5Yo3cs&uY)hmmox>h^1i7IVYGu_T+chXovth8w`qF5Ic)uI(qvQL#?~&d@tTwt;2+YN7P55j_rV~+Fqfk#Z?$aDHr8rQJutSRn zuGJLnHmWsIJ}WRDd8cpAQ1jZf(nu|$RI0PDdkd;&#SvgaJ)T^C?ioVivQOablO(z02J3xA)4omqf=|Y_z0=u`^~L8Bij-Z`@v|O47Q}>+^`-7Di zdjO(6Tfj1GJB|m7DC$;A&uR$gX$2c$lerY(%i(`}M^j;+1 zm$ZQ^QE`$^jODPEsw=V%Ut(U=u&6=Xqm~RGs%i?*>IJueQQV*85XV7>@PId~D7$DJ zyx5eR`E^m=urpITS8}fH=Pm2b+$XUT9HQ^=>&|sj?%ZeA6)hf~Ym7eL9X5#RUM?4L3UUonk6b_1x_P;W(68SEN_n6$6Y)F=&*^x67|&UF=J1@2=gD|J z0;o>G^He-<#q%^gPsj5LJkP-MOgv}ec@~~$;~8_i;4w*?>*JgQyDpDim;AR9Uf^ut z)^LXO$cO@48~AnLUJ!GpL?-*7hgzlrYt}w#ST+P$@=#Lk7@FJPC-I|?;qP3u^e9@| zh3CicoP+1Jc+SOh9-b$7yVepjd_X6zksq{S-+)%;pcSo6ST&!1t=R_u zXq;2XCW_BiVo!H^N{! z?BIncoOKB^c=_>DtD0ZsNY99HBRV$`Z9D?p;4pTKZgdmItwC-to;A1$c-CfVvbTFZ zKf{hLebq+c$Bv3-w%^mKk7CbQaGs;n+yRbX$Io$O>DzI$lf>in$KDTgQW9IMe+C@* z?wEsnpd>4Be|;p*-adE*xo6>w=&PX!Tus)#&KiV(8c184G_#2g$(^)md6LZ*Cz*=0 z6jQb(>wwqVrQFh_z!J+)%km@_Zq&3M^aQ`ecPYVI+Jau~L0-Y;gf8S?I`ap2t{kmZ zO_%%T5(Skr@o`OExp*Dw?3xl~+k&z2IEU?w+v4MDXn&BQv8+I2nWVU+Emn3K90Z~U zXxn~mj2xi=q3FZ7e z4@DKDC_>B@PLdvjU+=Ah_6{PikPXkOIwWi8x3Gp6dx3iij~6W9slBgACFMI?qxfdv_||_U9(IPsf6V=L#IdxQk~a2FxqfP_ zkAc{OOKcfFtAGuve1(mHxH6Ns#9SN8W9(F$3FD_zGx3la;O#m%(oXktkH0ql45`~FRsdJS%PH<(vH~Q|kIAFI<32~t5%up|H6GFe9V@0q#C%wV$4jnW z@g)5s9-a3kTgF7512jj(CfmuT#7hs;7BP3t$@{;e>QsswTLlY&} zt%=>WWY~%I0_TrR!TfV)l(Tlb@{78|y2C6g-ZR|SY3#&T9Z*)UES2c&n5lpR9?;fP zugsU;mw!s@DP0>u7?@E`{UWZ9#!;ABByU$G`Y!`FAS+f5^Zzm3?ajAMmQR6y&S?Ed zni1=dSt$Jmc}T8LT5GqR`uhtG#6=_7$%50wmyWN@x6uifT8Su!d<5PgPmO)t_B8aa zpnIjZs!{$r6)JBb0>H!SPEc3gniA`^3pM@opw)FNBrHP{NzO1q*w0bKfNc1wA}*f& zJ0zY^HGCK^AJ(w>&CB&oXB23r^3U?Nir4DqRlH+xI&@9v6q%wLIuXCT0YCN76)DZ- zZJXbR*9eqxxEghc=c;2RSPfQuH{*MEO$s*4TO5DZ?Q!hUNshg`!;aT^HgFR7jJhCD~^AWAPMLnq04;e}C3d z4JFsE9s=#vp(m~)9qLBS6mQwpEkf#Mi$&bh86manO|?HVH_~0W!FJ&W+qJ-=MV%lj zOS-8hF%PxOvt;0gJDYB}F`L^HUQgg%UCSAqE|h&uN50Kjk185$Z`Q7}z0ZDY^^(7I zhYLD6F2EZ4IS%OOI9yv0M|QJC05n{d%k_JlfS(iabH1kAf-ye{7zU3kmw)JeV~{Q( zDxngvAXZzJmOx{p?bcIT+senMLBjC4l65$XJ2QT??3Y)5~#sr_lds8;BJ zHLewEKUS>d#fENh-UbM5?}T&L8-72Wk?z9HzY912u4OlYb3ST$9B^I=I72g_6V6@B z0Z%PA#8&ZrakscxtP|IXg<_7FC5{ozVx%J+kr1_Lh(v>iC`7+@K`)8jkZI>hS=Dl2 zeojbAKpH&Li*wD|>T542d%gRmie04FMfaSLyW{5RSX-Kq2*t(&6N=4l9GIWZn~hGr?P<}hsK7lZQfxEA zv;~k+2Nmm}cF zp%UF%zRP{WWns6y!@mEfFub99qSkb*N$;7kkGMMj?W5nygY>2;@=jP>YJFp8*p zvfqp)tqF>1lr9hz;oMXs@ec-AE|R32>5KUDvwO(E)T`Vo==V`ef!}c6!4A3@(iUw; zW$)1R^_o0(rTR2U`&Y^tr)QicNh^!IWJ0tZ`a(Wn54#p8O0GqTY~QR~v!Uy+HYxwk`hyyTLxVobJ@m!4gQ*sl9S3 zu!kPZ)Z7(;^vZvWUCmJ~vKT6{tn^OZY`2pnkty;K!;kX<6yBsy@4aG<%_U?vS-w!W!Q1 z;N5_aG7mIb@=9PSYQ4x_3obTr2DAy42p^gyO;7Zt`FwtcfzQo zt!!d+OAj9-{+c?tzGYEmqf196?Q5%n#&jNH z5>YQqzCP4f*{aAJRj>pf!KKbpdLIc-PoHw*y7i_MHcvcyQ>Nx0h`#KDXYvltA(M9} zqo=fLb54{e-M!x8?}xvR4lcT~UnTte$5y4<?{$`0;b~h1P=@U*j(>uF{; zZSay@F##Gp&^rVc^l%SXXJUl79 zn5ROAEC2>4er{#ugoJAOJAg>Kdz?3`VfB4M!Tf4}iQ4e98b1s1(>QeH<~@Cy;;$sk_x=4Fyl_M% zhc&z$_fFj8rcjAIX1rv46P_wwihDDh&Q*^z?CK!@ALNN9tikh>J}vatUWeCQ>v{Op ziIBrO(?D-gLtewWtgwbl9gYT}VKbh#HV;gr8n5BDm}>kX;YI>QJwF-R9%@ql5cgX6 z$?*2@MG4GD&cOQoj@*W#25N=0@u^S0bXwfWzs-Nf|C^_qwtYR1^vv{@H1ABafB#lm z)v5hyoD3&mv z05zf;Jtc~+&1X2qFR`tKme}*Q=eaR!{2Gim0wR)-9VbA(0V93caabfm*SIm*Cu9O;1_=Xy#tBIn>^hj=O1{*H>c#&Gr} z2sS}|oRssn4m4h1=qgrVz_Y^)YPf1`c13BrvbYW#>kkm9itrqcA%_o4Yl z@pGe;L#-!TvB!yZ9Bv{y0`pYLU2_F;jMS30tEUB=68qQ(+bNoc=SC1@XO6R+=LK7h zZ6NGK%ivYz1@4x|#=zec=gzNrs)np`r&Ui99usC>>m`|m(WPUJQ{hW)0~Zw8FX1x$ zHl^M4B=>7=Q!CUOd}5xVmS5n8`dXxT9IQoZ>DOB@JI6SGEmpWT^5Fp^zlR&nJp#)U zBdp*7b$E}X)95GrHpuq0!8m~p8I%r>S4qN;T++2tG3kaNngMaW_s{!EN8auArm&M0XE(}t zIvb%h-?%M8dI9ZTy1H~<#!2sOq0+`XW4+mD+iwe!*55h7OMPxYpGEY!5uRG!I%GGO zPP18J6n=`$GTKWqJ~*dkwk=X}-I=bq?pmw3?$9eUBolmP!ymnkJR?({JdOj$ z+!v`5e}unumBA@U%7+9|%R?vCEw$BL&YAYa=>M6s0XeC!7q5rHLXwC61cToB`r1@z z%VYoEc`*WeT*uW?vE#ZR7IIpSCd2u9F593+?OEG#UaG${N@=_^zrEvn7+R&1scLJE zb=*rGg$Vo7`-k3jEu&$YnY3qiLQiA!=_`pdZ|Ef`mNi%!hBS=H%F4>glFwehjcDvv z$m-~Xd9?PMw7NDX%l^CqMwJV&YVQbKC%y3KdyDUQ2L-t~aiAEijiao63-`n&YX zOHxmXBqhBhLtgZ?=v-41*(*n18-S;gvhfD>P_u|5_|rS-NJGN_J<}k$6_8|Y*PXeX z)|PnbdbsphYkT6c=+Ry;;PvCxV5#nh%ZWi!d@3i!rh2dUA&*|zOCbXt1sn4pt|W#@ z2{}Ikb9zX1sbx>|te;3JLAPtc8ciNiXnIOBj%l8RHRCYQPFNm1cIJ*t|4Ak7_DYdYr> zb$6ECP=731y7;g9HeX-0I{#zZ)e+c-^YuTN_I2EM@S^H};B!P_`6X#Sakqh*99fPr zs!zY;knLaPt~6dh6e9ijx2C^c-jMFr{e|sHZ(+BfFV4RSNQeI9>tPK$oA#*C?_EE) zmdf^!QsJG_R!cj|VdTHnOeGTjN@Yxcqu%^?!<7w@?{RM0O|7*<&ApNPDi`daeV8+R zqw*oOk((1}KU32jT~qy3|2wV<^gd3q-smIIiH|IziL+kdC65K1i@fB9NM}p0l=5bx z{^?$_y5`(u-5ey5B*-6MgDmr39-3mA+-6D_+RoM&x(e2jECCjIS-Z3L%D+4O7x|vU zizA;*uqSLt*cwk>8!8jT_^t7e~81Zp5s<4L3^*0VZ-OH5t#KM)U@(T+RO}{ZE&akA7N*vKkXG$!{TfR_D zT9dzW;j)FRR;3m#D_)$~OZRLq9hK_*e#Du3UX@;!l2#@N2)Ofmy+Qb8hn4mvv=c!BP`t=5(o- za-)KDp=);9$mle)mnm)C-sHkw|YMuI)RlGWD(bV~cMGJKg7t+x3=P$f3Z`rbWsN&(m z2UadzIBjL#*y2TtFl3Y=xaw|MrMs^%Gut#};rxa93>M$_$h(!=N?WsV*|OB71%+!0 z%<~IZF4WCmeedlSeBgA!JqPr>eHdk;|EPjg%U!y(p7!Cjx0Ix=F}rSgZba1x_lOrq z93Rm>BHv<6HK(plJ!-z5*5CYm>RaiX({KMx{5@25oGw#$zizDVJ{_+UbXJ{BSE4J` z)#&PUTXb7>f6#5yZP&ese4H*w*F)D|H$Z39#pq&n19d67VY=IN!*wHcsk$_sS!dCu z>qhEEvElfT*R;HN)oRncg{E}fv?ckgO!z;KCUMp3m3jFE3m2GHsR&?7xv#Kbb^g-) zVY=xBs~AY}asJBu)%o-DmYE8RR%0dT0Mh)tW%*Cx(~^aG3l^?4EqrqR!i5V~neNNV z%+8sVIV)%UxXk;9+=eY&)eJF})uy*Op`H5&1h6cvOVrbuDIKhdv9_t7}HF%kX3BiYN*)8G|?P74mg3( z5;~znXd#3c0t5)~5(0!4FoYIb2oM4U$hq&`=8^4i&h=g2`ElOs9eYOiDtqmDIV%3kCheSNlr;M+*c3mnnSyhA1aN9r&v`v3z}clem-l=Y^gTU) z)w6KufD$?VLOo5@jg`}^HDD2Jyk9fv{z)5%S1_7Nx4jd zhvro-laYxIPZ8Y@fGn4(XbFx#P5O8|T}nKj0YA*ETxM!tNR`Vhv>V5tjke?P9Pb@l z*9TS?2K~S?Td&Ind)JvfAUNa)igr7IXxobB;y+3xY7 zvcu!Ubz+39hO zJnV6;Jm&E_dD7$c*jO^Ja;cN&Jl-HLdc09y^|)SkdE6jxdE6-PdE6u)dfY6Zczm>c z?s1EJ>2a%k<8hm5IH1d=U7~D+8gG(>$D1Y3<1Lc*_!#Nx@mA^K@v+j!pkJ~M>R3gNRu_?!?vH-yg%VQjnj z^!_k}v6bWb7liPR5dKjJ|2Tv%4B?AH_$MKJaR^@$!k32dWg&cd2>&#Me-^@5gz%Li zd{qcv9m3ay@U#j~9l<{Y6NR zd6moJ&{(-7G(IlV;~?wSY|JZ=ME%-n|MJf+yxkZ#D1=u4KMUXXL)bwWuZfS;cJ}vk z8~RT^UmVlji(|Tbm7^9Rn10cI++x~)5n=1J{UbD{h&IXRtK82#h>z4f!(Zd)W3=hg zMVoITY`eBurSU1ivt?~3pQ&T)RO!D4SBG$opUcs{D+}8H5@FAS%^`A#ych4#VHlEa zpJ3r@1;BmP`J)SRdj~7V7>MHmrGaApD!7Y7fKJ07fCOV7fThVD`9e6O}twv$8+$UHcW_q1zlEu?yw&%}~xgO7ya*t=p0*`0QB9G_D z5|8J~GLPrU3XjWWrN;|omB$O^K#v#8!5(97@9|PO%;V*9gva~I8sGy%X{@$sT

hsR6gWRI81slc~|eA{V#+vas;H-oayl#Iosp8 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

g|2U$ct&ZoxU+YA!PckFO<1^D17& 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 wnoLgFYarRCp6j9?-LPa(iCQ@Of Date: Tue, 19 Feb 2013 11:08:05 +0100 Subject: [PATCH 034/345] change plattform to osd-merkur --- examples/osd/README | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/examples/osd/README b/examples/osd/README index 7398f72c6..09dd0bf15 100644 --- a/examples/osd/README +++ b/examples/osd/README @@ -2,12 +2,4 @@ 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 \ No newline at end of file +Plattform: osd-merkur From 43b9f7a23d7a2b68c11c88cf8ad40b777ce2c0c8 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 12:40:25 +0100 Subject: [PATCH 035/345] remove platform/osd-er-lp24 --- platform/osd-er-lp24/Makefile.osd-er-lp24 | 41 -- platform/osd-er-lp24/contiki-conf.h | 352 ---------- platform/osd-er-lp24/contiki-main.c | 614 ------------------ platform/osd-er-lp24/dev/adc.c | 89 --- platform/osd-er-lp24/dev/adc.h | 8 - platform/osd-er-lp24/dev/battery-sensor.c | 86 --- platform/osd-er-lp24/dev/battery-sensor.h | 48 -- platform/osd-er-lp24/dev/button-sensor.c | 85 --- platform/osd-er-lp24/dev/dht11.c | 119 ---- platform/osd-er-lp24/dev/dht11.h | 72 -- platform/osd-er-lp24/dev/ds1820.c | 291 --------- platform/osd-er-lp24/dev/ds1820.h | 45 -- platform/osd-er-lp24/dev/key.c | 73 --- platform/osd-er-lp24/dev/key.h | 50 -- platform/osd-er-lp24/dev/led.c | 89 --- platform/osd-er-lp24/dev/led.h | 54 -- platform/osd-er-lp24/dev/pir-sensor.c | 85 --- platform/osd-er-lp24/dev/pir-sensor.h | 48 -- platform/osd-er-lp24/dev/temperature-sensor.c | 66 -- platform/osd-er-lp24/dev/temperature-sensor.h | 49 -- platform/osd-er-lp24/node-id.c | 79 --- platform/osd-er-lp24/node-id.h | 44 -- platform/osd-er-lp24/params.c | 264 -------- platform/osd-er-lp24/params.h | 109 ---- platform/osd-er-lp24/slip_uart0.c | 93 --- 25 files changed, 2953 deletions(-) delete mode 100644 platform/osd-er-lp24/Makefile.osd-er-lp24 delete mode 100644 platform/osd-er-lp24/contiki-conf.h delete mode 100644 platform/osd-er-lp24/contiki-main.c delete mode 100644 platform/osd-er-lp24/dev/adc.c delete mode 100644 platform/osd-er-lp24/dev/adc.h delete mode 100644 platform/osd-er-lp24/dev/battery-sensor.c delete mode 100644 platform/osd-er-lp24/dev/battery-sensor.h delete mode 100644 platform/osd-er-lp24/dev/button-sensor.c delete mode 100644 platform/osd-er-lp24/dev/dht11.c delete mode 100644 platform/osd-er-lp24/dev/dht11.h delete mode 100644 platform/osd-er-lp24/dev/ds1820.c delete mode 100644 platform/osd-er-lp24/dev/ds1820.h delete mode 100644 platform/osd-er-lp24/dev/key.c delete mode 100644 platform/osd-er-lp24/dev/key.h delete mode 100644 platform/osd-er-lp24/dev/led.c delete mode 100644 platform/osd-er-lp24/dev/led.h delete mode 100644 platform/osd-er-lp24/dev/pir-sensor.c delete mode 100644 platform/osd-er-lp24/dev/pir-sensor.h delete mode 100644 platform/osd-er-lp24/dev/temperature-sensor.c delete mode 100644 platform/osd-er-lp24/dev/temperature-sensor.h delete mode 100644 platform/osd-er-lp24/node-id.c delete mode 100644 platform/osd-er-lp24/node-id.h delete mode 100644 platform/osd-er-lp24/params.c delete mode 100644 platform/osd-er-lp24/params.h delete mode 100644 platform/osd-er-lp24/slip_uart0.c diff --git a/platform/osd-er-lp24/Makefile.osd-er-lp24 b/platform/osd-er-lp24/Makefile.osd-er-lp24 deleted file mode 100644 index ded157f14..000000000 --- a/platform/osd-er-lp24/Makefile.osd-er-lp24 +++ /dev/null @@ -1,41 +0,0 @@ -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 += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c -#Needed for Button -CONTIKI_TARGET_SOURCEFILES += button-sensor.c -#Needed for DHT11 humidity sensor -CONTIKI_TARGET_SOURCEFILES += dht11.c -#Needed for DS18S20 temperature sensor -CONTIKI_TARGET_SOURCEFILES += ds1820.c -#Needed for Battery test -CONTIKI_TARGET_SOURCEFILES += battery-sensor.c -#Needed for PIR -CONTIKI_TARGET_SOURCEFILES += pir-sensor.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 diff --git a/platform/osd-er-lp24/contiki-conf.h b/platform/osd-er-lp24/contiki-conf.h deleted file mode 100644 index d99a965e2..000000000 --- a/platform/osd-er-lp24/contiki-conf.h +++ /dev/null @@ -1,352 +0,0 @@ -/* - * 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 - */ - -#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 - -/* 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 0 - -/* More extensive stats, via main loop printfs or webserver status pages */ -#define ENERGEST_CONF_ON 0 - -/* Packet statistics */ -typedef unsigned short uip_stats_t; -#define UIP_STATISTICS 0 - -/* Available watchdog timeouts depend on mcu. Default is WDTO_2S. -1 Disables the watchdog. */ -/* AVR Studio simulator tends to reboot due to clocking the WD 8 times too fast */ -//#define WATCHDOG_CONF_TIMEOUT -1 - -/* Debugflow macro, useful for tracing path through mac and radio interrupts */ -//#define DEBUGFLOWSIZE 128 - - -/* Define MAX_*X_POWER to reduce tx power and ignore weak rx packets for testing a miniature multihop network. - * Leave undefined for full power and sensitivity. - * tx=0 (3dbm, default) to 15 (-17.2dbm) - * RF230_CONF_AUTOACK sets the extended mode using the energy-detect register with rx=0 (-91dBm) to 84 (-7dBm) - * else the rssi register is used having range 0 (91dBm) to 28 (-10dBm) - * For simplicity RF230_MIN_RX_POWER is based on the energy-detect value and divided by 3 when autoack is not set. - * On the RF230 a reduced rx power threshold will not prevent autoack if enabled and requested. - * These numbers applied to both Raven and Jackdaw give a maximum communication distance of about 15 cm - * and a 10 meter range to a full-sensitivity RF230 sniffer. -#define RF230_MAX_TX_POWER 15 -#define RF230_MIN_RX_POWER 30 - */ - /* The rf231 and atmega128rfa1 can use an rssi threshold for triggering rx_busy that saves 0.5ma in rx mode */ -/* 1 - 15 maps into -90 to -48 dBm; the register is written with RF230_MIN_RX_POWER/6 + 1. Undefine for -100dBm sensitivity */ -//#define RF230_MIN_RX_POWER 0 - -/* Network setup */ -/* TX routine passes the cca/ack result in the return parameter */ -#define RDC_CONF_HARDWARE_ACK 1 -/* TX routine does automatic cca and optional backoffs */ -#define RDC_CONF_HARDWARE_CSMA 1 -/* Allow MCU sleeping between channel checks */ -#define RDC_CONF_MCU_SLEEP 1 - -#if UIP_CONF_IPV6 -#define RIMEADDR_CONF_SIZE 8 -#define UIP_CONF_ICMP6 1 -#define UIP_CONF_UDP 1 -#define UIP_CONF_TCP 0 -#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 -/* 1 + Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode) */ -#define RF230_CONF_FRAME_RETRIES 2 -/* Number of csma retry attempts 0-5 in extended tx mode (7 does immediate tx with no csma) */ -#define RF230_CONF_CSMA_RETRIES 5 -/* Default is one RAM buffer for received packets. More than one may benefit multiple TCP connections or ports */ -#define RF230_CONF_RX_BUFFERS 3 -#define SICSLOWPAN_CONF_FRAG 1 -/* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */ -#define SICSLOWPAN_CONF_MAXAGE 3 -/* How long to wait before terminating an idle TCP connection. Smaller to allow faster sleep. Default is 120 seconds */ -/* If wait is too short the connection can be reset as a result of multiple fragment reassembly timeouts */ -#define UIP_CONF_WAIT_TIMEOUT 20 -/* 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 */ -/* Contikimac strobes on its own, but hardware retries are faster */ -#define RF230_CONF_FRAME_RETRIES 1 -/* Long csma backoffs will compromise radio cycling; set to 0 for 1 csma */ -#define RF230_CONF_CSMA_RETRIES 0 -#define SICSLOWPAN_CONF_FRAG 1 -#define SICSLOWPAN_CONF_MAXAGE 3 -/* 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 20 -#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) */ -/* These values are guesses */ -#define RF230_CONF_FRAME_RETRIES 10 -#define RF230_CONF_CSMA_RETRIES 2 -#if RF230_CONF_CSMA_RETRIES -#define NETSTACK_CONF_MAC nullmac_driver -#else -#define NETSTACK_CONF_MAC csma_driver -#endif -#define NETSTACK_CONF_RDC cxmac_driver -#define NETSTACK_CONF_FRAMER framer_802154 -#define 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__ */ diff --git a/platform/osd-er-lp24/contiki-main.c b/platform/osd-er-lp24/contiki-main.c deleted file mode 100644 index e267b1060..000000000 --- a/platform/osd-er-lp24/contiki-main.c +++ /dev/null @@ -1,614 +0,0 @@ -/* - * 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 -#include -#include -#include -#include -#include - -#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 -#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 - -#include "lib/sensors.h" -#include "dev/button-sensor.h" -#include "dev/battery-sensor.h" -#include "dev/pir-sensor.h" -SENSORS(&button_sensor, &battery_sensor, &pir_sensor); - -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< -//#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 - - process_start(&sensors_process, NULL); - - /* 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); -//

- } -#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>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<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<"); - PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); - { - uip_ds6_route_t *r; - PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); - j = 1; - for(r = uip_ds6_route_list_head(); - r != NULL; - r = list_item_next(r)) { - ipaddr_add(&r->ipaddr); - PRINTF("/%u (via ", r->length); - ipaddr_add(&r->nexthop); - // if(uip_ds6_routing_table[i].state.lifetime < 600) { - PRINTF(") %lus\n", r->state.lifetime); - // } else { - // PRINTF(")\n"); - // } - j = 0; - } - } - if (j) PRINTF(" "); - 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 -*/ - -#include - -#ifndef cbi -#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) -#endif -#ifndef sbi -#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) -#endif - -int readADC(uint8_t pin) -{ - int result = 0; - - if ( pin >= 14 ) - pin -= 14; - - ADMUX = _BV(REFS1) | _BV(REFS0) | ( pin & 7 ) ; - ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - sbi(ADCSRA,ADSC); - loop_until_bit_is_clear(ADCSRA,ADSC); - - - result = ADC; - - ADCSRA=0; //disable ADC - ADMUX=0; //turn off internal vref - - return result; -} - -/** -* \return Internal temperature in 0.01C, e.g. 25C is 2500 -*/ -int readInternalTemp(void) -{ - int reading = 0; - - ADCSRB |= _BV(MUX5); - ADMUX = _BV(REFS1) | _BV(REFS0) | 0b1001 ; - ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - - sbi(ADCSRA,ADSC); - loop_until_bit_is_clear(ADCSRA,ADSC); - reading = ADC; - - ADCSRA=0; //disable ADC - ADCSRB=0; //disable ADC - ADMUX=0; //turn off internal vref - - return reading * 113 - 27280; -} \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/adc.h b/platform/osd-er-lp24/dev/adc.h deleted file mode 100644 index ea851f237..000000000 --- a/platform/osd-er-lp24/dev/adc.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __ADC_ARCH_H__ -#define __ADC_ARCH_H__ - -int readADC(uint8_t pin); -long readVcc(); -int readInternalTemp(void); - -#endif /* __ADC_ARCH_H__ */ \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/battery-sensor.c b/platform/osd-er-lp24/dev/battery-sensor.c deleted file mode 100644 index 56837baa8..000000000 --- a/platform/osd-er-lp24/dev/battery-sensor.c +++ /dev/null @@ -1,86 +0,0 @@ -/* -* Copyright (c) 2012, BinaryLabs. -* 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: battery-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ -*/ - -/** -* \file -* Battery sensor file for Atmega128rfa1. -* \author -* Paulo Louro -* Harald Pichler -*/ - -/** -*The atmel rf23x radios have a low voltage detector that can be configured in units of 75 millivolts. Here is example *code for the ATmega128rfa1, where the BATMON register is in extended io space [dak664] -*/ - -#include "dev/battery-sensor.h" - -const struct sensors_sensor battery_sensor; -/*---------------------------------------------------------------------------*/ - -/** -* \return Voltage on battery measurement with BATMON register. -*/ -static int -value(int type) -{ - uint16_t h; - uint8_t p1; - BATMON = 16; //give BATMON time to stabilize at highest range and lowest voltage - -/* Bandgap can't be measured against supply voltage in this chip. */ -/* Use BATMON register instead */ - for ( p1=16; p1<31; p1++) { - BATMON = p1; - clock_delay_usec(100); // delay needed !! - if ((BATMON&(1< -*/ - -#ifndef __BATTERY_SENSOR_H__ -#define __BATTERY_SENSOR_H__ - -#include "lib/sensors.h" - -extern const struct sensors_sensor battery_sensor; - -#define BATTERY_SENSOR "Battery" - -#endif /* __BATTERY_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/button-sensor.c b/platform/osd-er-lp24/dev/button-sensor.c deleted file mode 100644 index 491879f3a..000000000 --- a/platform/osd-er-lp24/dev/button-sensor.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Sensor routine */ - -#include "lib/sensors.h" -#include "dev/button-sensor.h" - -#include -#include "led.h" // debug - -const struct sensors_sensor button_sensor; - -static struct timer debouncetimer; -static int status(int type); -static int enabled = 0; -struct sensors_sensor *sensors[1]; -unsigned char sensors_flags[1]; - -#define BUTTON_BIT INTF5 -#define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 - -#define PRINTF(...) printf(__VA_ARGS__) -/*---------------------------------------------------------------------------*/ -ISR(INT5_vect) -{ - -// leds_toggle(LEDS_YELLOW); - - if(BUTTON_CHECK_IRQ()) { - if(timer_expired(&debouncetimer)) { - led1_on(); - timer_set(&debouncetimer, CLOCK_SECOND / 4); - sensors_changed(&button_sensor); - led1_off(); - } - } - -} -/*---------------------------------------------------------------------------*/ - -static int -value(int type) -{ - return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); - //return 0; -} - -static int -configure(int type, int c) -{ - switch (type) { - case SENSORS_ACTIVE: - if (c) { - if(!status(SENSORS_ACTIVE)) { - led1_on(); - timer_set(&debouncetimer, 0); - DDRE |= (0< -#include "contiki.h" -#include "dht11.h" -#include "led.h" // debug - -#define udelay(u) clock_delay_usec(u) -#define mdelay(u) clock_delay_msec(u) - -uint8_t DHT_Read_Data(uint8_t select){ - - //data[5] is 8byte table where data come from DHT are stored - //laststate holds laststate value - //counter is used to count microSeconds - uint8_t data[5], laststate = 0, counter = 0, j = 0, i = 0; - - //Clear array - data[0] = data[1] = data[2] = data[3] = data[4] = 0; - - uint8_t volatile sreg; - sreg = SREG; /* Save status register before disabling interrupts. */ - cli(); /* Disable interrupts. */ - - //Prepare the bus - PIN_INIT(); - //Set pin Output - //Pin High - DHT_DRIVE(); - mdelay(250); //Wait for 250mS - - //Send Request Signal - //Pin Low - OUTP_0(); - mdelay(20); //20ms Low - - //Pin High - OUTP_1(); - udelay(40); //40us High - - //Set pin Input to read Bus - //Set pin Input - DHT_RELEASE(); - laststate=DHT_INP(); //Read Pin value - - //Repeat for each Transistions - for (i=0; i254) break; - } - - if (counter>254) break; - - //laststate==_BV(DHT_PIN) checks if laststate was High - //ignore the first 2 transitions which are the DHT Response - //if (laststate==_BV(DHT_PIN) && (i > 2)) { - if ((i&0x01) && (i > 2)) { - //Save bits in segments of bytes - //Shift data[] value 1 position left - //Example. 01010100 if we shift it left one time it will be - //10101000 - led1_on(); - - data[j/8]<<=1; - if (counter >= 15) { //If it was high for more than 40uS - led1_off(); - data[j/8]|=1; //it means it is bit '1' so make a logic - led1_on(); - } //OR with the value (save it) - j++; //making an OR by 1 to this value 10101000 - led1_off(); - - } //we will have the resault 10101001 - //1 in 8-bit binary is 00000001 - //j/8 changes table record every 8 bits which means a byte has been saved - //so change to next record. 0/8=0 1/8=0 ... 7/8=0 8/8=1 ... 15/8=1 16/8=2 - laststate=DHT_INP(); //save current state - counter=0; //reset counter - - } - SREG = sreg; /* Enable interrupts. */ - - //Check if data received are correct by checking the CheckSum - if (data[0] + data[1] + data[2] + data[3] == data[4]) { - if (select==DHT_Temp) { //Return the value has been choosen - return(data[2]); - }else if(select==DHT_RH){ - return(data[0]); - } - }else{ -// uart_puts("\r\nCheck Sum Error"); - } - - return 0xff; // Check Sum Error -} diff --git a/platform/osd-er-lp24/dev/dht11.h b/platform/osd-er-lp24/dev/dht11.h deleted file mode 100644 index 7012b75c6..000000000 --- a/platform/osd-er-lp24/dev/dht11.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - DHT-11 Library - (c) Created by Charalampos Andrianakis on 18/12/11. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ - -#include -#include -#include - -/* DHT 1-wire is at PortE.6 */ -#define DHT_PIN_READ PINE -#define DHT_PIN_MASK _BV(PE6) -#define DHT_PxOUT PORTE -#define DHT_PxDIR DDRE - -#define SET_PIN_INPUT() (DHT_PxDIR &= ~DHT_PIN_MASK) -#define SET_PIN_OUTPUT() (DHT_PxDIR |= DHT_PIN_MASK) - -#define OUTP_0() (DHT_PxOUT &= ~DHT_PIN_MASK) -#define OUTP_1() (DHT_PxOUT |= DHT_PIN_MASK) - -#define PIN_INIT() do{ \ - SET_PIN_INPUT(); \ - OUTP_0(); \ - } while(0) - - -/* Drive the one wire interface hight */ -#define DHT_DRIVE() do { \ - SET_PIN_OUTPUT(); \ - OUTP_1(); \ - } while (0) - -/* Release the one wire by turning on the internal pull-up. */ -#define DHT_RELEASE() do { \ - SET_PIN_INPUT(); \ - OUTP_1(); \ - } while (0) - -/* Read one bit. */ -#define DHT_INP() (DHT_PIN_READ & DHT_PIN_MASK) - -//The packet size is 40bit but each bit consists of low and high state -//so 40 x 2 = 80 transitions. Also we have 2 transistions DHT response -//and 2 transitions which indicates End Of Frame. In total 84 -#define MAXTIMINGS 84 - -//Select between Temp and Humidity Read -#define DHT_Temp 0 -#define DHT_RH 1 - -//This is the main function which requests and reads the packet -uint8_t DHT_Read_Data(uint8_t select); - diff --git a/platform/osd-er-lp24/dev/ds1820.c b/platform/osd-er-lp24/dev/ds1820.c deleted file mode 100644 index 9de3fc8a9..000000000 --- a/platform/osd-er-lp24/dev/ds1820.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * 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 -#include -#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_PIN_MASK _BV(PE4) -#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! */ -} diff --git a/platform/osd-er-lp24/dev/ds1820.h b/platform/osd-er-lp24/dev/ds1820.h deleted file mode 100644 index e4178d63e..000000000 --- a/platform/osd-er-lp24/dev/ds1820.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 */ diff --git a/platform/osd-er-lp24/dev/key.c b/platform/osd-er-lp24/dev/key.c deleted file mode 100644 index 20d852c18..000000000 --- a/platform/osd-er-lp24/dev/key.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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< -#include - -void key_init(void); -uint8_t is_button(void); - -#endif /* __KEY_H__ */ diff --git a/platform/osd-er-lp24/dev/led.c b/platform/osd-er-lp24/dev/led.c deleted file mode 100644 index 8f330e13a..000000000 --- a/platform/osd-er-lp24/dev/led.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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< - -/** @name LED Functions */ -/** @{ */ -void led1_on(void); -void led1_off(void); -void led2_on(void); -void led2_off(void); -/** @} */ - -#endif /* __LED_H__ */ diff --git a/platform/osd-er-lp24/dev/pir-sensor.c b/platform/osd-er-lp24/dev/pir-sensor.c deleted file mode 100644 index cff260816..000000000 --- a/platform/osd-er-lp24/dev/pir-sensor.c +++ /dev/null @@ -1,85 +0,0 @@ -/* Sensor routine */ -#include "contiki.h" -#include "lib/sensors.h" -#include "dev/pir-sensor.h" - -#include -#include "led.h" // debug - -const struct sensors_sensor pir_sensor; - -static struct timer debouncetimer; -static int status(int type); -static int enabled = 0; -struct sensors_sensor *sensors[1]; -unsigned char sensors_flags[1]; - -#define PIR_BIT INTF6 -#define PIR_CHECK_IRQ() (EIFR & PIR_BIT) ? 0 : 1 - -#define PRINTF(...) printf(__VA_ARGS__) -/*---------------------------------------------------------------------------*/ -ISR(INT6_vect) -{ - -// leds_toggle(LEDS_YELLOW); - - if(PIR_CHECK_IRQ()) { - if(timer_expired(&debouncetimer)) { - led1_on(); - timer_set(&debouncetimer, CLOCK_SECOND / 4); - sensors_changed(&pir_sensor); - led1_off(); - } - } - -} -/*---------------------------------------------------------------------------*/ - -static int -value(int type) -{ - return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); - //return 0; -} - -static int -configure(int type, int c) -{ - switch (type) { - case SENSORS_ACTIVE: - if (c) { - if(!status(SENSORS_ACTIVE)) { - led1_on(); - timer_set(&debouncetimer, 0); - DDRE |= (0< -*/ - -#ifndef __PIR_SENSOR_H__ -#define __PIR_SENSOR_H__ - -#include "lib/sensors.h" - -extern const struct sensors_sensor pir_sensor; - -#define PIR_SENSOR "PIR" - -#endif /* __PIR_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/temperature-sensor.c b/platform/osd-er-lp24/dev/temperature-sensor.c deleted file mode 100644 index c85896178..000000000 --- a/platform/osd-er-lp24/dev/temperature-sensor.c +++ /dev/null @@ -1,66 +0,0 @@ -/* -* Copyright (c) 2012, BinaryLabs. -* 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: temperature-sensor.c,v 1.1 2010/08/25 19:34:06 nifi Exp $ -*/ - -/** -* \file -* Temperature sensor header file for Atmega128rfa1. -* \author -* Paulo Louro -*/ - -#include "contiki.h" -#include "dev/temperature-sensor.h" - -#define PRINTF(...) printf(__VA_ARGS__) - - -const struct sensors_sensor temperature_sensor; - -/*---------------------------------------------------------------------------*/ -static int -value(int type) -{ - return readInternalTemp(); -} -/*---------------------------------------------------------------------------*/ -static int -configure(int type, int c) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -static int -status(int type) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -SENSORS_SENSOR(temperature_sensor, TEMPERATURE_SENSOR, value, configure, status); \ No newline at end of file diff --git a/platform/osd-er-lp24/dev/temperature-sensor.h b/platform/osd-er-lp24/dev/temperature-sensor.h deleted file mode 100644 index 6cf5dbf26..000000000 --- a/platform/osd-er-lp24/dev/temperature-sensor.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -* Copyright (c) 2012, BinaryLabs. -* 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: temperature-sensor.h,v 1.1 2012/08/25 19:34:06 nifi Exp $ -*/ - -/** -* \file -* Temperature sensor header file for Atmega128rfa1. -* \author -* Paulo Louro -*/ - -#ifndef __TEMPERATURE_SENSOR_H__ -#define __TEMPERATURE_SENSOR_H__ - -#include "lib/sensors.h" -#include "dev/adc.h" - -extern const struct sensors_sensor temperature_sensor; - -#define TEMPERATURE_SENSOR "Temperature" - -#endif /* __TEMPERATURE_SENSOR_H__ */ \ No newline at end of file diff --git a/platform/osd-er-lp24/node-id.c b/platform/osd-er-lp24/node-id.c deleted file mode 100644 index 8698b1855..000000000 --- a/platform/osd-er-lp24/node-id.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2006, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * 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 - */ - -#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); -*/ -} -/*---------------------------------------------------------------------------*/ diff --git a/platform/osd-er-lp24/node-id.h b/platform/osd-er-lp24/node-id.h deleted file mode 100644 index 592379fc9..000000000 --- a/platform/osd-er-lp24/node-id.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2006, Swedish Institute of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - * Author: Adam Dunkels - * - * $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__ */ diff --git a/platform/osd-er-lp24/params.c b/platform/osd-er-lp24/params.c deleted file mode 100644 index aadbb83c4..000000000 --- a/platform/osd-er-lp24/params.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * 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 -#include -#include -#include - -#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 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;iSet 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 */ diff --git a/platform/osd-er-lp24/params.h b/platform/osd-er-lp24/params.h deleted file mode 100644 index 03c44db27..000000000 --- a/platform/osd-er-lp24/params.h +++ /dev/null @@ -1,109 +0,0 @@ -#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, 0x01} -#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} -#else -//#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} -#define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} -#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__ */ diff --git a/platform/osd-er-lp24/slip_uart0.c b/platform/osd-er-lp24/slip_uart0.c deleted file mode 100644 index edff55385..000000000 --- a/platform/osd-er-lp24/slip_uart0.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * 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 - */ - -#include -#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); -} -*/ From c8604b5a709d2d2acb8aa568dc789c56f5ac4892 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Feb 2013 16:18:04 +0100 Subject: [PATCH 036/345] add merkur board example --- .../osd/er-rest-example-merkurboard/Makefile | 88 ++ .../osd/er-rest-example-merkurboard/README | 76 ++ .../er-example-client.c | 173 +++ .../er-example-server.c | 1126 +++++++++++++++++ .../er-plugtest-server.c | 561 ++++++++ .../osd/er-rest-example-merkurboard/flash.sh | 2 + .../project-conf.h | 67 + .../osd/er-rest-example-merkurboard/run.sh | 6 + .../server-client.csc | 227 ++++ .../server-only.csc | 189 +++ .../static-routing.c | 155 +++ .../static-routing.h | 20 + 12 files changed, 2690 insertions(+) create mode 100644 examples/osd/er-rest-example-merkurboard/Makefile create mode 100644 examples/osd/er-rest-example-merkurboard/README create mode 100644 examples/osd/er-rest-example-merkurboard/er-example-client.c create mode 100644 examples/osd/er-rest-example-merkurboard/er-example-server.c create mode 100644 examples/osd/er-rest-example-merkurboard/er-plugtest-server.c create mode 100755 examples/osd/er-rest-example-merkurboard/flash.sh create mode 100644 examples/osd/er-rest-example-merkurboard/project-conf.h create mode 100755 examples/osd/er-rest-example-merkurboard/run.sh create mode 100644 examples/osd/er-rest-example-merkurboard/server-client.csc create mode 100644 examples/osd/er-rest-example-merkurboard/server-only.csc create mode 100644 examples/osd/er-rest-example-merkurboard/static-routing.c create mode 100644 examples/osd/er-rest-example-merkurboard/static-routing.h diff --git a/examples/osd/er-rest-example-merkurboard/Makefile b/examples/osd/er-rest-example-merkurboard/Makefile new file mode 100644 index 000000000..ea3722d59 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/Makefile @@ -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 diff --git a/examples/osd/er-rest-example-merkurboard/README b/examples/osd/er-rest-example-merkurboard/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.c b/examples/osd/er-rest-example-merkurboard/er-example-client.c new file mode 100644 index 000000000..d1d543cf0 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/er-example-client.c @@ -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 + */ + +#include +#include +#include + +#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(); +} diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c new file mode 100644 index 000000000..e505f6165 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c @@ -0,0 +1,1126 @@ +/* + * 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) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 0 +#define REST_RES_HELLO 0 +#define REST_RES_MIRROR 0 /* causes largest code size */ +#define REST_RES_CHUNKS 0 +#define REST_RES_SEPARATE 0 +#define REST_RES_PUSHING 0 +#define REST_RES_EVENT 0 +#define REST_RES_SUB 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_LIGHT 0 +#define REST_RES_BATTERY 0 +#define REST_RES_RADIO 0 + + + +#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" + +// todo OSD-Testboard move to platform/dev +#include "dev/key.h" +#include "dev/led.h" +#if REST_RES_DS1820 +#include "dev/ds1820.h" +#endif + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_LIGHT) +#include "dev/light-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_SHT11) +#include "dev/sht11-sensor.h" +#endif +#if defined (PLATFORM_HAS_RADIO) +#include "dev/radio-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + + +#include "dev/key.c" // todo: move platform /dev +#include "dev/led.c" + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index," \"name\" : \"Button,LED\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +// mybutton +/*A simple actuator example. read the key button status*/ +RESOURCE(button, METHOD_GET | METHOD_PUT , "button", "title=\"Button\";rt=\"Text\""); +void +button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname[17]="button1"; + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); + if(is_button()) + index += sprintf(temp + index," \"state\" : \"on\"\n"); + else + index += sprintf(temp + index," \"state\" : \"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname, name,len); + bname[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "led1", "title=\"Led1\";rt=\"Text\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +#if REST_RES_DS1820 +/*A simple getter example. Returns the reading from ds1820 sensor*/ +RESOURCE(ds1820, METHOD_GET, "DS1820", "title=\"Temperatur\";rt=\"Temperatur\""); +void +ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + int ret=0; + int grad=0; + int kgrad=0; +// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ + kgrad=5; + } + grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; + + uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d °C",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d °C\"}",grad,kgrad); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DS1820 + +#if REST_RES_HELLO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *len = NULL; + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; + int length = 12; /* |<-------->| */ + + /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ + if (REST.get_query_variable(request, "len", &len)) { + length = atoi(len); + if (length<0) length = 0; + if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; + memcpy(buffer, message, length); + } else { + memcpy(buffer, message, length); + } + + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ + REST.set_header_etag(response, (uint8_t *) &length, 1); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer. */ + strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); + + /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. + * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); + } + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); + } + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); + int index = 0; + for (index = 0; index 03 */ +#endif /* CoAP-specific example */ + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); + } + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); + } + + if (strpos >= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ +#if WITH_COAP > 1 + coap_set_header_uri_host(response, "tiki"); + coap_set_header_observe(response, 10); +#if WITH_COAP == 3 + coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ +#else + coap_set_header_proxy_uri(response, "ftp://x"); + coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ + coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, TEXT_PLAIN); + coap_set_header_if_none_match(response); +#endif /* CoAP > 03 */ +#endif /* CoAP-specific example */ +} +#endif /* REST_RES_MIRROR */ + +/******************************************************************************/ +#if REST_RES_CHUNKS +/* + * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation + * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, + * the byte offset where to continue is provided to the handler as int32_t pointer. + * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. + * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) + */ +RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); + +#define CHUNKS_TOTAL 2050 + +void +chunks_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 = 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); + + /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 +/* Required to manually (=not by the engine) handle the response transaction. */ +#include "er-coap-07-separate.h" +#include "er-coap-07-transactions.h" +/* + * CoAP-specific example for separate responses. + * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. + * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests. + * The resource handler must store all information that required to finalize the response later. + */ +RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\""); + +/* 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[16]; +} 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) +{ + /* + * Example allows only one open separate response. + * For multiple, the application must manage the list of stores. + */ + if (separate_active) + { + coap_separate_reject(); + } + else + { + 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. */ + + /* + * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2). + * Extend the store, if the application requires additional information from this handler. + * buffer is an example field for custom information. + */ + snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo"); + } +} + +void +separate_finalize_handler() +{ + if (separate_active) + { + 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)) ) + { + 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); + + 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 + { + /* + * Set timer for retry, send error message, ... + * The example simply waits for another button press. + */ + } + } /* if (separate_active) */ +} +#endif + +/******************************************************************************/ +#if REST_RES_PUSHING +/* + * Example for a periodic resource. + * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions by managing a list of subscribers to notify. + */ +PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND); + +void +pushing_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); + + /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */ + const char *msg = "It's periodic!"; + REST.set_response_payload(response, msg, strlen(msg)); + + /* 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 +pushing_periodic_handler(resource_t *r) +{ + static uint16_t obs_counter = 0; + static char content[11]; + + ++obs_counter; + + PRINTF("TICK %u for /%s\n", obs_counter, r->url); + + /* Build notification. */ + 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 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, obs_counter, notification); +} +#endif + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs"); + +void +event_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +event_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_BUTTON */ + +/******************************************************************************/ +#if REST_RES_SUB +/* + * Example for a resource that also handles all its sub-resources. + * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. + */ +RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); + +void +sub_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); + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_sub.url); + + if (len==base_len) + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); + } + else + { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); +void +light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); + uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_LIGHT */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + + +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO +/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ +RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); + +void +radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *p = NULL; + uint8_t param = 0; + int success = 1; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((len=REST.get_query_variable(request, "p", &p))) { + PRINTF("p %.*s\n", len, p); + if (strncmp(p, "lqi", len)==0) { + param = RADIO_SENSOR_LAST_VALUE; + } else if(strncmp(p,"rssi", len)==0) { + param = RADIO_SENSOR_LAST_PACKET; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success) { + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + + if (param == RADIO_SENSOR_LAST_VALUE) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); + } else if (param == RADIO_SENSOR_LAST_PACKET) { + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } + } else { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +void +hw_init() +{ + key_init(); + led1_off(); +#if REST_RES_DS1820 + ds1820_temp(); +#endif +} +#define MESURE_INTERVAL (10 * CLOCK_SECOND) +#define READ_TIME ( 2 * CLOCK_SECOND) + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ +#if REST_RES_DS1820 + static struct etimer ds_periodic_timer; + static struct etimer ds_read_timer; +#endif + + PROCESS_BEGIN(); + + + + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_button); + rest_activate_resource(&resource_led1); + /* Activate the application-specific resources. */ +#if REST_RES_DS1820 + rest_activate_resource(&resource_ds1820); +#endif +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if REST_RES_HELLO + rest_activate_resource(&resource_helloworld); +#endif +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif +#if REST_RES_CHUNKS + rest_activate_resource(&resource_chunks); +#endif +#if REST_RES_PUSHING + rest_activate_periodic_resource(&periodic_resource_pushing); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT + rest_activate_event_resource(&resource_event); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3 + /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */ + rest_activate_resource(&resource_separate); +#endif +#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) + SENSORS_ACTIVATE(button_sensor); +#endif +#if REST_RES_SUB + rest_activate_resource(&resource_sub); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT + SENSORS_ACTIVATE(light_sensor); + rest_activate_resource(&resource_light); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO + SENSORS_ACTIVATE(radio_sensor); + rest_activate_resource(&resource_radio); +#endif + + /* Define application-specific events here. */ +#if REST_RES_DS1820 + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); +#endif + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); +#if REST_RES_EVENT + /* Call the event_handler for this application-specific event. */ + event_event_handler(&resource_event); +#endif +#if REST_RES_SEPARATE && WITH_COAP>3 + /* Also call the separate response example handler. */ + separate_finalize_handler(); +#endif + } +#endif /* PLATFORM_HAS_BUTTON */ +#if REST_RES_DS1820 + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("DS1820_Periodic\n"); + etimer_reset(&ds_periodic_timer); + if(ds1820_convert()){ + etimer_set(&ds_read_timer, READ_TIME); + } + } + if(etimer_expired(&ds_read_timer)) { + PRINTF("DS1820_Read\n"); + ds1820_read(); + } +#endif + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/er-rest-example-merkurboard/er-plugtest-server.c b/examples/osd/er-rest-example-merkurboard/er-plugtest-server.c new file mode 100644 index 000000000..051b44be0 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/er-plugtest-server.c @@ -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 + */ + +#include +#include +#include +#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 = 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(); +} diff --git a/examples/osd/er-rest-example-merkurboard/flash.sh b/examples/osd/er-rest-example-merkurboard/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/er-rest-example-merkurboard/project-conf.h b/examples/osd/er-rest-example-merkurboard/project-conf.h new file mode 100644 index 000000000..1c3dd8933 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/project-conf.h @@ -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__ */ diff --git a/examples/osd/er-rest-example-merkurboard/run.sh b/examples/osd/er-rest-example-merkurboard/run.sh new file mode 100755 index 000000000..4f21e9b63 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/er-rest-example-merkurboard/server-client.csc b/examples/osd/er-rest-example-merkurboard/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/er-rest-example-merkurboard/server-only.csc b/examples/osd/er-rest-example-merkurboard/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/er-rest-example-merkurboard/static-routing.c b/examples/osd/er-rest-example-merkurboard/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/er-rest-example-merkurboard/static-routing.h b/examples/osd/er-rest-example-merkurboard/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/static-routing.h @@ -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_ */ From 36e0dcf22f0c45a8b74055b8982325a028694c59 Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 21 Feb 2013 16:00:48 +0100 Subject: [PATCH 037/345] bugfix compile and flash --- examples/osd/rpl-border-router/flash.sh | 2 +- examples/osd/rpl-border-router/project-conf.h | 3 +++ examples/osd/rpl-border-router/run.sh | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/osd/rpl-border-router/flash.sh b/examples/osd/rpl-border-router/flash.sh index e92d472f6..07cfc9a65 100755 --- a/examples/osd/rpl-border-router/flash.sh +++ b/examples/osd/rpl-border-router/flash.sh @@ -1,2 +1,2 @@ #!/bin/bash -sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:border-router.osd-merkur.hex:a -U eeprom:w:border-router.osd-merkur.eep:a diff --git a/examples/osd/rpl-border-router/project-conf.h b/examples/osd/rpl-border-router/project-conf.h index d393e34a8..3cc05fe90 100644 --- a/examples/osd/rpl-border-router/project-conf.h +++ b/examples/osd/rpl-border-router/project-conf.h @@ -41,6 +41,9 @@ #undef UIP_CONF_DS6_ROUTE_NBU #define UIP_CONF_DS6_ROUTE_NBU 50 +#undef UIP_CONF_TCP +#define UIP_CONF_TCP 1 + #ifndef QUEUEBUF_CONF_NUM #define QUEUEBUF_CONF_NUM 4 #endif diff --git a/examples/osd/rpl-border-router/run.sh b/examples/osd/rpl-border-router/run.sh index 4f21e9b63..098192f57 100755 --- a/examples/osd/rpl-border-router/run.sh +++ b/examples/osd/rpl-border-router/run.sh @@ -1,6 +1,6 @@ #!/bin/bash make clean TARGET=osd-merkur make TARGET=osd-merkur -avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur -avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex -avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep +avr-size -C --mcu=MCU=atmega128rfa1 border-router.osd-merkur +avr-objcopy -j .text -j .data -O ihex border-router.osd-merkur border-router.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex border-router.osd-merkur border-router.osd-merkur.eep From bba7b84a1570f49b90685a1f3f2b623d2fc99e94 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 22 Feb 2013 17:04:19 +0100 Subject: [PATCH 038/345] add servo example --- examples/osd/servo-sensor/Makefile | 88 ++++ examples/osd/servo-sensor/README | 76 +++ examples/osd/servo-sensor/er-example-server.c | 465 ++++++++++++++++++ examples/osd/servo-sensor/flash.sh | 2 + examples/osd/servo-sensor/project-conf.h | 73 +++ examples/osd/servo-sensor/run.sh | 6 + examples/osd/servo-sensor/server-client.csc | 227 +++++++++ examples/osd/servo-sensor/server-only.csc | 189 +++++++ examples/osd/servo-sensor/static-routing.c | 155 ++++++ examples/osd/servo-sensor/static-routing.h | 20 + platform/osd-merkur/Makefile.osd-merkur | 3 + platform/osd-merkur/dev/servo-sensor.c | 100 ++++ platform/osd-merkur/dev/servo-sensor.h | 50 ++ platform/osd-merkur/dev/servo.c | 147 ++++++ platform/osd-merkur/dev/servo.h | 40 ++ 15 files changed, 1641 insertions(+) create mode 100644 examples/osd/servo-sensor/Makefile create mode 100644 examples/osd/servo-sensor/README create mode 100644 examples/osd/servo-sensor/er-example-server.c create mode 100755 examples/osd/servo-sensor/flash.sh create mode 100644 examples/osd/servo-sensor/project-conf.h create mode 100755 examples/osd/servo-sensor/run.sh create mode 100644 examples/osd/servo-sensor/server-client.csc create mode 100644 examples/osd/servo-sensor/server-only.csc create mode 100644 examples/osd/servo-sensor/static-routing.c create mode 100644 examples/osd/servo-sensor/static-routing.h create mode 100644 platform/osd-merkur/dev/servo-sensor.c create mode 100644 platform/osd-merkur/dev/servo-sensor.h create mode 100644 platform/osd-merkur/dev/servo.c create mode 100644 platform/osd-merkur/dev/servo.h diff --git a/examples/osd/servo-sensor/Makefile b/examples/osd/servo-sensor/Makefile new file mode 100644 index 000000000..dbd2c1410 --- /dev/null +++ b/examples/osd/servo-sensor/Makefile @@ -0,0 +1,88 @@ +all: er-example-server +# 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 diff --git a/examples/osd/servo-sensor/README b/examples/osd/servo-sensor/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/servo-sensor/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/servo-sensor/er-example-server.c b/examples/osd/servo-sensor/er-example-server.c new file mode 100644 index 000000000..86d1293e4 --- /dev/null +++ b/examples/osd/servo-sensor/er-example-server.c @@ -0,0 +1,465 @@ +/* + * 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) SERVO REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + * Harald Pichler + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_SERVO 1 +#define REST_RES_TEMPERATURE 0 +#define REST_RES_EVENT 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_BATTERY 1 + +#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" + +#include "dev/led.h" +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_SERVO) +#include "dev/servo-sensor.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); + index += sprintf(message + index," \"name\" : \"6lowpan-SERVO\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/*A simple actuator example. read the servo status*/ +RESOURCE(servo, METHOD_GET | METHOD_PUT , "actuators/servo", "title=\"Servo\";rt=\"servo\""); +void +servo_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *value = NULL; + size_t len = 0; + + int servo1 = servo_sensor.value(0); + int servo2 = servo_sensor.value(1); + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"servo1\" : \"%d\",\n",servo1); + index += sprintf(temp + index,"\n \"servo2\" : \"%d\"\n",servo2); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "servo1", &value))) { + PRINTF("servo1 %s\n", value); + servo_sensor.configure(0,atoi(value)); + } else { + success = 0; + } + if (success && (len=REST.get_post_variable(request, "servo2", &value))) { + PRINTF("servo2 %s\n", value); + servo_sensor.configure(1,atoi(value)); + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ +/******************************************************************************/ + +void +hw_init() +{ + led1_off(); +} + +PROCESS(rest_server_example, "Erbium Example Server"); + +AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_led1); +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_SERVO) && REST_RES_SERVO + SENSORS_ACTIVATE(servo_sensor); + rest_activate_resource(&resource_servo); +#endif + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/servo-sensor/flash.sh b/examples/osd/servo-sensor/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/servo-sensor/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/servo-sensor/project-conf.h b/examples/osd/servo-sensor/project-conf.h new file mode 100644 index 000000000..5c75a104c --- /dev/null +++ b/examples/osd/servo-sensor/project-conf.h @@ -0,0 +1,73 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_SERVO 1 +//#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 + +#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__ */ diff --git a/examples/osd/servo-sensor/run.sh b/examples/osd/servo-sensor/run.sh new file mode 100755 index 000000000..4f21e9b63 --- /dev/null +++ b/examples/osd/servo-sensor/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/servo-sensor/server-client.csc b/examples/osd/servo-sensor/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/servo-sensor/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/servo-sensor/server-only.csc b/examples/osd/servo-sensor/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/servo-sensor/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/servo-sensor/static-routing.c b/examples/osd/servo-sensor/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/servo-sensor/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/servo-sensor/static-routing.h b/examples/osd/servo-sensor/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/servo-sensor/static-routing.h @@ -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_ */ diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index ded157f14..1a95ecf09 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -16,6 +16,9 @@ CONTIKI_TARGET_SOURCEFILES += battery-sensor.c #Needed for PIR CONTIKI_TARGET_SOURCEFILES += pir-sensor.c CONTIKIAVR=$(CONTIKI)/cpu/avr +#Needed for PIR +CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c + CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 CONTIKI_PLAT_DEFS = -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 diff --git a/platform/osd-merkur/dev/servo-sensor.c b/platform/osd-merkur/dev/servo-sensor.c new file mode 100644 index 000000000..9da3caf80 --- /dev/null +++ b/platform/osd-merkur/dev/servo-sensor.c @@ -0,0 +1,100 @@ +/* +* Copyright (c) , 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: +* 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: servo-sensor.c,v 1.0 2013/02/20 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Servo sensor header file for Atmega128rfa1. +* \author +* Harald Pichler +*/ + +#include "contiki.h" +#include "dev/servo.h" +#include "dev/servo-sensor.h" + +#define PRINTF(...) printf(__VA_ARGS__) + +const struct sensors_sensor servo_sensor; +static int status(int type); +static int enabled = 0; + +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + switch(type) { + case SERVO_SENSOR_A: + return servo_get(0);; + + /* Total Solar Radiation. */ + case SERVO_SENSOR_B: + return servo_get(1); + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int c) +{ + switch(type) { + case SENSORS_ACTIVE: + if(c) { + if(!status(SENSORS_ACTIVE)) { + servo_init(); + enabled = 1; + } + } else { + servo_off(); + enabled = 1; + } + break; + case SERVO_SENSOR_A: + servo_set(0,c); + break; + case SERVO_SENSOR_B: + servo_set(1,c); + break; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static int +status(int type) +{ + switch(type) { + case SENSORS_ACTIVE: + case SENSORS_READY: + return enabled; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(servo_sensor, SERVO_SENSOR, value, configure, status); diff --git a/platform/osd-merkur/dev/servo-sensor.h b/platform/osd-merkur/dev/servo-sensor.h new file mode 100644 index 000000000..44e50c0f8 --- /dev/null +++ b/platform/osd-merkur/dev/servo-sensor.h @@ -0,0 +1,50 @@ +/* +* Copyright (c), 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: +* 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: servo-sensor.h,v 1.0 2013/02/20 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Servo sensor header file for Atmega128rfa1. +* \author +* Harald Pichler +*/ + +#ifndef __SERVO_SENSOR_H__ +#define __SERVO_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor servo_sensor; + +#define SERVO_SENSOR "Servo" +#define SERVO_SENSOR_A 0 +#define SERVO_SENSOR_B 1 + +#endif /* __SERVO_SENSOR_H__ */ diff --git a/platform/osd-merkur/dev/servo.c b/platform/osd-merkur/dev/servo.c new file mode 100644 index 000000000..1e4169b89 --- /dev/null +++ b/platform/osd-merkur/dev/servo.c @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2007, Swedish Institute of Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* + * Device driver for the Sensirion SHT1x/SHT7x family of humidity and + * temperature sensors. + */ + +#include "contiki.h" +#include +#include + +#define DEBUG 0 + +#if DEBUG +#include +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +/*---------------------------------------------------------------------------*/ +/*---------------------------------------------------------------------------*/ +/* + * servo device + */ + +#define SERVO_OFFSET 1000 +#define SERVO_MAX 1000 +#define SERVO_INIT 500 + +unsigned int servoa=SERVO_INIT; +unsigned int servob=SERVO_INIT; + +void +servo_init(void) +{ +// Port B initialization +// Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In +// State7=0 State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T +PORTB=0x00; +DDRB=0xE0; +// Timer/Counter 1 initialization +// Clock source: System Clock +// Clock value: 2000.000 kHz +// Mode: Ph. & fr. cor. PWM top=ICR1 +// OC1A output: Connected +// OC1B output: Connected +// OC1C output: Connected +// Noise Canceler: Off +// Input Capture on Falling Edge +// Timer1 Overflow Interrupt: Off +// Input Capture Interrupt: Off +// Compare A Match Interrupt: Off +// Compare B Match Interrupt: Off +// Compare C Match Interrupt: Off +TCCR1A=0xA8; +TCCR1B=0x12; +TCNT1H=0x00; +TCNT1L=0x00; +// ICR1 has a computed value of 20,000 - see the ESawdust.com/blog article for how this +// value was derived. +// 20000 == 0x4e20 so that's what goes into the high and low byte of the ICR1 register +// alternatively, Codevision would let you just do ICR1 = 20000; +ICR1H=0x4E; +ICR1L=0x20; + +/* OCR1AH=0x00; +OCR1AL=0x00; +*/ +// OCR1A will govern the steering servo, OCR1B will govern throttle +OCR1A = 1500; // set it to an initial position somewhere in the middle of the 1 to 2ms range + +// OCR1A will govern the steering servo, OCR1B will govern throttle +OCR1B = 1500; // set it to an initial position somewhere in the middle of the 1 to 2ms range +// start with motor off - no duty cycle at all +OCR1CH=0x00; +OCR1CL=0x00; +} +/*---------------------------------------------------------------------------*/ +/* + * Power of device. + */ +void +servo_off(void) +{ + +} +/*---------------------------------------------------------------------------*/ +/* + * get servo position + */ +unsigned int +servo_get(unsigned int i) +{ + if(i==0) + return servoa; + if(i==1) + return servob; + return 0; +} +/*---------------------------------------------------------------------------*/ +/* + * Set servo position + */ +unsigned int +servo_set(unsigned i,unsigned int j) +{ + if(j > SERVO_MAX) + j=SERVO_MAX; + + if(i==0) + servoa=j; + OCR1A = SERVO_OFFSET + servoa; + return 1; + if(i==1) + servob=j; + OCR1A = SERVO_OFFSET + servob; + return 1; +} diff --git a/platform/osd-merkur/dev/servo.h b/platform/osd-merkur/dev/servo.h new file mode 100644 index 000000000..c10f8657c --- /dev/null +++ b/platform/osd-merkur/dev/servo.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2007, Swedish Institute of Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#ifndef SERVO_H +#define SERVO_H + +void servo_init(void); +void servo_off(void); + +unsigned int servo_get(unsigned int i); +unsigned int servo_set(unsigned i,unsigned int j); + +#endif /* SHT11_H */ From 057a3c3345cff63b59e0784741e01338b46f3347 Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 13 Mar 2013 16:02:30 +0100 Subject: [PATCH 039/345] add light-actor --- examples/osd/light-actor/Makefile | 88 ++++ examples/osd/light-actor/README | 76 +++ examples/osd/light-actor/er-example-server.c | 525 +++++++++++++++++++ examples/osd/light-actor/flash.sh | 2 + examples/osd/light-actor/lall | 136 +++++ examples/osd/light-actor/project-conf.h | 73 +++ examples/osd/light-actor/run.sh | 6 + examples/osd/light-actor/server-client.csc | 227 ++++++++ examples/osd/light-actor/server-only.csc | 189 +++++++ examples/osd/light-actor/static-routing.c | 155 ++++++ examples/osd/light-actor/static-routing.h | 20 + platform/osd-merkur/Makefile.osd-merkur | 4 +- platform/osd-merkur/dev/optriac-sensor.c | 112 ++++ platform/osd-merkur/dev/optriac-sensor.h | 50 ++ platform/osd-merkur/dev/optriac.c | 93 ++++ platform/osd-merkur/dev/optriac.h | 54 ++ 16 files changed, 1809 insertions(+), 1 deletion(-) create mode 100644 examples/osd/light-actor/Makefile create mode 100644 examples/osd/light-actor/README create mode 100644 examples/osd/light-actor/er-example-server.c create mode 100755 examples/osd/light-actor/flash.sh create mode 100644 examples/osd/light-actor/lall create mode 100644 examples/osd/light-actor/project-conf.h create mode 100755 examples/osd/light-actor/run.sh create mode 100644 examples/osd/light-actor/server-client.csc create mode 100644 examples/osd/light-actor/server-only.csc create mode 100644 examples/osd/light-actor/static-routing.c create mode 100644 examples/osd/light-actor/static-routing.h create mode 100644 platform/osd-merkur/dev/optriac-sensor.c create mode 100644 platform/osd-merkur/dev/optriac-sensor.h create mode 100644 platform/osd-merkur/dev/optriac.c create mode 100644 platform/osd-merkur/dev/optriac.h diff --git a/examples/osd/light-actor/Makefile b/examples/osd/light-actor/Makefile new file mode 100644 index 000000000..dbd2c1410 --- /dev/null +++ b/examples/osd/light-actor/Makefile @@ -0,0 +1,88 @@ +all: er-example-server +# 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 diff --git a/examples/osd/light-actor/README b/examples/osd/light-actor/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/light-actor/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c new file mode 100644 index 000000000..9724b91ae --- /dev/null +++ b/examples/osd/light-actor/er-example-server.c @@ -0,0 +1,525 @@ +/* + * 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) PIR REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + * Harald Pichler + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_OPTRIAC 1 +#define REST_RES_TEMPERATURE 0 +#define REST_RES_EVENT 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_BATTERY 1 + +#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" + +#include "dev/led.h" +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_OPTRIAC) +#include "dev/optriac-sensor.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); + index += sprintf(message + index," \"name\" : \"light-actor\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + + +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "actuators/led1", "title=\"Led1\";rt=\"led\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_PIR) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(pir, METHOD_GET, "sensors/pir", "title=\"Event demo\";obs"); + +void +pir_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +pir_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("PIR TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_PIR */ + +/******************************************************************************/ +#if defined (PLATFORM_HAS_OPTRIAC) +/******************************************************************************/ +#if REST_RES_OPTRIAC +/*A simple actuator example*/ +RESOURCE(optriac, METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *type = NULL; + const char *mode = NULL; + uint8_t triac = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "type", &type))) { + PRINTF("type %.*s\n", len, type); + + if (strncmp(type, "a", len)==0) { + triac = OPTRIAC_SENSOR_A; + } else if(strncmp(type,"b", len)==0) { + triac = OPTRIAC_SENSOR_A; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + optriac_sensor.configure(triac,1); + } else if (strncmp(mode, "off", len)==0) { + optriac_sensor.configure(triac,1); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif +/******************************************************************************/ +#endif /* PLATFORM_HAS_OPTRIAC */ + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ +/******************************************************************************/ + +void +hw_init() +{ + led1_off(); +} + +PROCESS(rest_server_example, "Erbium Example Server"); + +AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_led1); +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif + /* Activate the application-specific resources. */ +#if REST_RES_OPTRIAC + SENSORS_ACTIVATE(optriac_sensor); + rest_activate_resource(&resource_optriac); +#endif +#if defined (PLATFORM_HAS_PIR) && (REST_RES_EVENT) + SENSORS_ACTIVATE(pir_sensor); + rest_activate_event_resource(&resource_pir); + PRINTF("ACTIVATE PIR\n"); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (REST_RES_EVENT) + if (ev == sensors_event ) { + PRINTF("EVENT\n"); +#if (REST_RES_EVENT && defined (PLATFORM_HAS_PIR)) + if (data == &pir_sensor) { + PRINTF("PIR EVENT\n"); + /* Call the event_handler for this application-specific event. */ + pir_event_handler(&resource_pir); + PRINTF("CALL EVENT HANDLER\n"); + } +#endif /* PLATFORM_HAS_PIR */ + } +#endif /* REST_RES_EVENT */ + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/light-actor/flash.sh b/examples/osd/light-actor/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/light-actor/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/light-actor/lall b/examples/osd/light-actor/lall new file mode 100644 index 000000000..8e7db9ece --- /dev/null +++ b/examples/osd/light-actor/lall @@ -0,0 +1,136 @@ +INFO: compiling with CoAP-08 +rm -f *~ *core core *.srec \ + *.lst *.map \ + *.cprg *.bin *.data contiki*.a *.firmware core-labels.S *.ihex *.ini \ + *.ce *.co +rm -rf obj_osd-merkur +INFO: compiling with CoAP-08 +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rime/rimeaddr.c -o obj_osd-merkur/rimeaddr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rime/timesynch.c -o obj_osd-merkur/timesynch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rime/rimestats.c -o obj_osd-merkur/rimestats.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/cxmac.c -o obj_osd-merkur/cxmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/xmac.c -o obj_osd-merkur/xmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/nullmac.c -o obj_osd-merkur/nullmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/lpp.c -o obj_osd-merkur/lpp.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/frame802154.c -o obj_osd-merkur/frame802154.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/sicslowmac.c -o obj_osd-merkur/sicslowmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/nullrdc.c -o obj_osd-merkur/nullrdc.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/nullrdc-noframer.c -o obj_osd-merkur/nullrdc-noframer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/mac.c -o obj_osd-merkur/mac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/framer-nullmac.c -o obj_osd-merkur/framer-nullmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/framer-802154.c -o obj_osd-merkur/framer-802154.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/csma.c -o obj_osd-merkur/csma.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/contikimac.c -o obj_osd-merkur/contikimac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/phase.c -o obj_osd-merkur/phase.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl.c -o obj_osd-merkur/rpl.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-dag.c -o obj_osd-merkur/rpl-dag.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-icmp6.c -o obj_osd-merkur/rpl-icmp6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-timers.c -o obj_osd-merkur/rpl-timers.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-of-etx.c -o obj_osd-merkur/rpl-of-etx.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-ext-header.c -o obj_osd-merkur/rpl-ext-header.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/process.c -o obj_osd-merkur/process.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/procinit.c -o obj_osd-merkur/procinit.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/autostart.c -o obj_osd-merkur/autostart.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/loader/elfloader.c -o obj_osd-merkur/elfloader.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/profile.c -o obj_osd-merkur/profile.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/timetable.c -o obj_osd-merkur/timetable.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/timetable-aggregate.c -o obj_osd-merkur/timetable-aggregate.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/compower.c -o obj_osd-merkur/compower.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/serial-line.c -o obj_osd-merkur/serial-line.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/memb.c -o obj_osd-merkur/memb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/mmem.c -o obj_osd-merkur/mmem.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/timer.c -o obj_osd-merkur/timer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/list.c -o obj_osd-merkur/list.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/etimer.c -o obj_osd-merkur/etimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/ctimer.c -o obj_osd-merkur/ctimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/energest.c -o obj_osd-merkur/energest.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/rtimer.c -o obj_osd-merkur/rtimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/stimer.c -o obj_osd-merkur/stimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/print-stats.c -o obj_osd-merkur/print-stats.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/ifft.c -o obj_osd-merkur/ifft.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/crc16.c -o obj_osd-merkur/crc16.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/random.c -o obj_osd-merkur/random.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/checkpoint.c -o obj_osd-merkur/checkpoint.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/ringbuf.c -o obj_osd-merkur/ringbuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/netstack.c -o obj_osd-merkur/netstack.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-debug.c -o obj_osd-merkur/uip-debug.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/packetbuf.c -o obj_osd-merkur/packetbuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/queuebuf.c -o obj_osd-merkur/queuebuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/packetqueue.c -o obj_osd-merkur/packetqueue.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip6.c -o obj_osd-merkur/uip6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/tcpip.c -o obj_osd-merkur/tcpip.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/psock.c -o obj_osd-merkur/psock.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-udp-packet.c -o obj_osd-merkur/uip-udp-packet.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-split.c -o obj_osd-merkur/uip-split.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/resolv.c -o obj_osd-merkur/resolv.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/tcpdump.c -o obj_osd-merkur/tcpdump.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uiplib.c -o obj_osd-merkur/uiplib.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/simple-udp.c -o obj_osd-merkur/simple-udp.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-icmp6.c -o obj_osd-merkur/uip-icmp6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-nd6.c -o obj_osd-merkur/uip-nd6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-packetqueue.c -o obj_osd-merkur/uip-packetqueue.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/sicslowpan.c -o obj_osd-merkur/sicslowpan.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/neighbor-attr.c -o obj_osd-merkur/neighbor-attr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/neighbor-info.c -o obj_osd-merkur/neighbor-info.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-ds6.c -o obj_osd-merkur/uip-ds6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-ds6-route.c -o obj_osd-merkur/uip-ds6-route.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/mt.c -o obj_osd-merkur/mt.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/nullradio.c -o obj_osd-merkur/nullradio.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-engine.c -o obj_osd-merkur/er-coap-07-engine.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07.c -o obj_osd-merkur/er-coap-07.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-transactions.c -o obj_osd-merkur/er-coap-07-transactions.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-observing.c -o obj_osd-merkur/er-coap-07-observing.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-separate.c -o obj_osd-merkur/er-coap-07-separate.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/erbium/erbium.c -o obj_osd-merkur/erbium.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./contiki-main.c -o obj_osd-merkur/contiki-main.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./params.c -o obj_osd-merkur/params.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./node-id.c -o obj_osd-merkur/node-id.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/temperature-sensor.c -o obj_osd-merkur/temperature-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/adc.c -o obj_osd-merkur/adc.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/led.c -o obj_osd-merkur/led.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/sensors.c -o obj_osd-merkur/sensors.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./slip_uart0.c -o obj_osd-merkur/slip_uart0.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/slip.c -o obj_osd-merkur/slip.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/button-sensor.c -o obj_osd-merkur/button-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/dht11.c -o obj_osd-merkur/dht11.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/ds1820.c -o obj_osd-merkur/ds1820.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/battery-sensor.c -o obj_osd-merkur/battery-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/pir-sensor.c -o obj_osd-merkur/pir-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/optriac.c -o obj_osd-merkur/optriac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/optriac-sensor.c -o obj_osd-merkur/optriac-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/servo.c -o obj_osd-merkur/servo.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/servo-sensor.c -o obj_osd-merkur/servo-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/clock.c -o obj_osd-merkur/clock.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./mtarch.c -o obj_osd-merkur/mtarch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/eeprom.c -o obj_osd-merkur/eeprom.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/flash.c -o obj_osd-merkur/flash.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/rs232.c -o obj_osd-merkur/rs232.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/leds-arch.c -o obj_osd-merkur/leds-arch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./watchdog.c -o obj_osd-merkur/watchdog.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./rtimer-arch.c -o obj_osd-merkur/rtimer-arch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./bootloader.c -o obj_osd-merkur/bootloader.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./settings.c -o obj_osd-merkur/settings.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/loader/elfloader-avr.c -o obj_osd-merkur/elfloader-avr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/loader/symtab-avr.c -o obj_osd-merkur/symtab-avr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/leds.c -o obj_osd-merkur/leds.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/radio/rf230bb/rf230bb.c -o obj_osd-merkur/rf230bb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/radio/rf230bb/halbb.c -o obj_osd-merkur/halbb.o +avr-ar rcf contiki-osd-merkur.a obj_osd-merkur/rimeaddr.o obj_osd-merkur/timesynch.o obj_osd-merkur/rimestats.o obj_osd-merkur/cxmac.o obj_osd-merkur/xmac.o obj_osd-merkur/nullmac.o obj_osd-merkur/lpp.o obj_osd-merkur/frame802154.o obj_osd-merkur/sicslowmac.o obj_osd-merkur/nullrdc.o obj_osd-merkur/nullrdc-noframer.o obj_osd-merkur/mac.o obj_osd-merkur/framer-nullmac.o obj_osd-merkur/framer-802154.o obj_osd-merkur/csma.o obj_osd-merkur/contikimac.o obj_osd-merkur/phase.o obj_osd-merkur/rpl.o obj_osd-merkur/rpl-dag.o obj_osd-merkur/rpl-icmp6.o obj_osd-merkur/rpl-timers.o obj_osd-merkur/rpl-of-etx.o obj_osd-merkur/rpl-ext-header.o obj_osd-merkur/process.o obj_osd-merkur/procinit.o obj_osd-merkur/autostart.o obj_osd-merkur/elfloader.o obj_osd-merkur/profile.o obj_osd-merkur/timetable.o obj_osd-merkur/timetable-aggregate.o obj_osd-merkur/compower.o obj_osd-merkur/serial-line.o obj_osd-merkur/memb.o obj_osd-merkur/mmem.o obj_osd-merkur/timer.o obj_osd-merkur/list.o obj_osd-merkur/etimer.o obj_osd-merkur/ctimer.o obj_osd-merkur/energest.o obj_osd-merkur/rtimer.o obj_osd-merkur/stimer.o obj_osd-merkur/print-stats.o obj_osd-merkur/ifft.o obj_osd-merkur/crc16.o obj_osd-merkur/random.o obj_osd-merkur/checkpoint.o obj_osd-merkur/ringbuf.o obj_osd-merkur/netstack.o obj_osd-merkur/uip-debug.o obj_osd-merkur/packetbuf.o obj_osd-merkur/queuebuf.o obj_osd-merkur/packetqueue.o obj_osd-merkur/uip6.o obj_osd-merkur/tcpip.o obj_osd-merkur/psock.o obj_osd-merkur/uip-udp-packet.o obj_osd-merkur/uip-split.o obj_osd-merkur/resolv.o obj_osd-merkur/tcpdump.o obj_osd-merkur/uiplib.o obj_osd-merkur/simple-udp.o obj_osd-merkur/uip-icmp6.o obj_osd-merkur/uip-nd6.o obj_osd-merkur/uip-packetqueue.o obj_osd-merkur/sicslowpan.o obj_osd-merkur/neighbor-attr.o obj_osd-merkur/neighbor-info.o obj_osd-merkur/uip-ds6.o obj_osd-merkur/uip-ds6-route.o obj_osd-merkur/mt.o obj_osd-merkur/nullradio.o obj_osd-merkur/er-coap-07-engine.o obj_osd-merkur/er-coap-07.o obj_osd-merkur/er-coap-07-transactions.o obj_osd-merkur/er-coap-07-observing.o obj_osd-merkur/er-coap-07-separate.o obj_osd-merkur/erbium.o obj_osd-merkur/contiki-main.o obj_osd-merkur/params.o obj_osd-merkur/node-id.o obj_osd-merkur/temperature-sensor.o obj_osd-merkur/adc.o obj_osd-merkur/led.o obj_osd-merkur/sensors.o obj_osd-merkur/slip_uart0.o obj_osd-merkur/slip.o obj_osd-merkur/button-sensor.o obj_osd-merkur/dht11.o obj_osd-merkur/ds1820.o obj_osd-merkur/battery-sensor.o obj_osd-merkur/pir-sensor.o obj_osd-merkur/optriac.o obj_osd-merkur/optriac-sensor.o obj_osd-merkur/servo.o obj_osd-merkur/servo-sensor.o obj_osd-merkur/clock.o obj_osd-merkur/mtarch.o obj_osd-merkur/eeprom.o obj_osd-merkur/flash.o obj_osd-merkur/rs232.o obj_osd-merkur/leds-arch.o obj_osd-merkur/watchdog.o obj_osd-merkur/rtimer-arch.o obj_osd-merkur/bootloader.o obj_osd-merkur/settings.o obj_osd-merkur/elfloader-avr.o obj_osd-merkur/symtab-avr.o obj_osd-merkur/leds.o obj_osd-merkur/rf230bb.o obj_osd-merkur/halbb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -DAUTOSTART_ENABLE -c er-example-server.c -o er-example-server.co +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c static-routing.c -o obj_osd-merkur/static-routing.o +avr-gcc -mmcu=atmega128rfa1 -Wl,-Map=contiki-osd-merkur.map -Wl,--section-start=.bootloader=0x1F000 er-example-server.co obj_osd-merkur/static-routing.o contiki-osd-merkur.a -o er-example-server.osd-merkur +rm obj_osd-merkur/static-routing.o er-example-server.co +AVR Memory Usage +---------------- +Device: Unknown + +Program: 70146 bytes +(.text + .data + .bootloader) + +Data: 12254 bytes +(.data + .bss + .noinit) + +EEPROM: 41 bytes +(.eeprom) + + diff --git a/examples/osd/light-actor/project-conf.h b/examples/osd/light-actor/project-conf.h new file mode 100644 index 000000000..d69ee0868 --- /dev/null +++ b/examples/osd/light-actor/project-conf.h @@ -0,0 +1,73 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_OPTRIAC 1 +//#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 + +#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__ */ diff --git a/examples/osd/light-actor/run.sh b/examples/osd/light-actor/run.sh new file mode 100755 index 000000000..4f21e9b63 --- /dev/null +++ b/examples/osd/light-actor/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/light-actor/server-client.csc b/examples/osd/light-actor/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/light-actor/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/light-actor/server-only.csc b/examples/osd/light-actor/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/light-actor/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/light-actor/static-routing.c b/examples/osd/light-actor/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/light-actor/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/light-actor/static-routing.h b/examples/osd/light-actor/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/light-actor/static-routing.h @@ -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_ */ diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 1a95ecf09..1f4c52dc7 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -15,8 +15,10 @@ CONTIKI_TARGET_SOURCEFILES += ds1820.c CONTIKI_TARGET_SOURCEFILES += battery-sensor.c #Needed for PIR CONTIKI_TARGET_SOURCEFILES += pir-sensor.c +#Needed for OPTRIAC +CONTIKI_TARGET_SOURCEFILES += optriac.c optriac-sensor.c CONTIKIAVR=$(CONTIKI)/cpu/avr -#Needed for PIR +#Needed for SERVO CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c CONTIKIBOARD=. diff --git a/platform/osd-merkur/dev/optriac-sensor.c b/platform/osd-merkur/dev/optriac-sensor.c new file mode 100644 index 000000000..5045c8944 --- /dev/null +++ b/platform/osd-merkur/dev/optriac-sensor.c @@ -0,0 +1,112 @@ +/* +* Copyright (c) , 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: +* 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: servo-sensor.c,v 1.0 2013/02/20 19:34:06 nifi Exp $ +*/ + +/** +* \file +* optriac sensor header file for Atmega128rfa1. +* \author +* Harald Pichler +*/ + +#include "contiki.h" +#include "dev/optriac.h" +#include "dev/optriac-sensor.h" + +#define PRINTF(...) printf(__VA_ARGS__) + +const struct sensors_sensor optriac_sensor; +static int status(int type); +static int enabled = 0; +static int optriac1=0; +static int optriac2=0; + +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + switch(type) { + case OPTRIAC_SENSOR_A: + return optriac1; + + /* Total Solar Radiation. */ + case OPTRIAC_SENSOR_B: + return optriac2; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int c) +{ + switch(type) { + case SENSORS_ACTIVE: + if(c) { + if(!status(SENSORS_ACTIVE)) { + enabled = 1; + } + } else { + enabled = 1; + } + break; + case OPTRIAC_SENSOR_A: + if(c==0){ + optriac1_off(); + optriac1=0; + }else{ + optriac1_on(); + optriac1=1; + }; + break; + case OPTRIAC_SENSOR_B: + if(c==0){ + optriac2_off(); + optriac2=0; + }else{ + optriac2_on(); + optriac2=1; + }; + break; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static int +status(int type) +{ + switch(type) { + case SENSORS_ACTIVE: + case SENSORS_READY: + return enabled; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(optriac_sensor, OPTRIAC_SENSOR, value, configure, status); diff --git a/platform/osd-merkur/dev/optriac-sensor.h b/platform/osd-merkur/dev/optriac-sensor.h new file mode 100644 index 000000000..3c411253c --- /dev/null +++ b/platform/osd-merkur/dev/optriac-sensor.h @@ -0,0 +1,50 @@ +/* +* Copyright (c), 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: +* 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: servo-sensor.h,v 1.0 2013/02/20 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Servo sensor header file for Atmega128rfa1. +* \author +* Harald Pichler +*/ + +#ifndef __OPTRIAC_SENSOR_H__ +#define __OPTRIAC_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor optriac_sensor; + +#define OPTRIAC_SENSOR "TRIAC" +#define OPTRIAC_SENSOR_A 0 +#define OPTRIAC_SENSOR_B 1 + +#endif /* __OPTRIAC_SENSOR_H__ */ diff --git a/platform/osd-merkur/dev/optriac.c b/platform/osd-merkur/dev/optriac.c new file mode 100644 index 000000000..a477287b5 --- /dev/null +++ b/platform/osd-merkur/dev/optriac.c @@ -0,0 +1,93 @@ +/* + * 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 "optriac.h" + +/** + * \addtogroup relay + * \{ +*/ +/*---------------------------------------------------------------------------*/ + +/** + * \brief Turns the TRIAC 1 on. +*/ +void +optriac1_on(void) +{ + DDRE |= (1< + +/** @name LED Functions */ +/** @{ */ +void optriac1_on(void); +void optriac1_off(void); +void optriac2_on(void); +void optriac2_off(void); +/** @} */ + +#endif /* __LED_H__ */ From 033adfa67827c0f91fa566910cbcce23aee8dfa8 Mon Sep 17 00:00:00 2001 From: AndreasReder Date: Wed, 20 Mar 2013 07:00:46 +0100 Subject: [PATCH 040/345] changed mac framer to be able to change panid during runtime example: #include "net/mac/framer-802154.h" uint16_t panid = 1234; framer_802154_set_panid(panid); attention: this only changes the framer panid, you need to change the radio panid too, e.g. with rf230_set_pan_addr on avr atmega128rfa1 --- core/net/mac/framer-802154.c | 15 ++++++++++++--- core/net/mac/framer-802154.h | 6 +++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/net/mac/framer-802154.c b/core/net/mac/framer-802154.c index 47e53ec61..ecffdd23d 100644 --- a/core/net/mac/framer-802154.c +++ b/core/net/mac/framer-802154.c @@ -65,13 +65,23 @@ static uint8_t initialized = 0; * sending to. If this value is 0xffff, the device is not * associated. */ -static const uint16_t mac_dst_pan_id = IEEE802154_PANID; +static uint16_t mac_dst_pan_id = IEEE802154_PANID; /** \brief The 16-bit identifier of the PAN on which the device is * operating. If this value is 0xffff, the device is not * associated. */ -static const uint16_t mac_src_pan_id = IEEE802154_PANID; +static uint16_t mac_src_pan_id = IEEE802154_PANID; + +/*---------------------------------------------------------------------------*/ +void framer_802154_set_panid(uint16_t panid){ + mac_dst_pan_id = panid; + mac_src_pan_id = panid; +} +/*---------------------------------------------------------------------------*/ +uint16_t framer_802154_get_panid(){ + return mac_dst_pan_id; +} /*---------------------------------------------------------------------------*/ static int @@ -175,7 +185,6 @@ create(void) PRINTF("15.4-OUT: %2X", params.fcf.frame_type); PRINTADDR(params.dest_addr); PRINTF("%d %u (%u)\n", len, packetbuf_datalen(), packetbuf_totlen()); - return len; } else { PRINTF("15.4-OUT: too large header: %u\n", len); diff --git a/core/net/mac/framer-802154.h b/core/net/mac/framer-802154.h index fe4fced80..3cbb52446 100644 --- a/core/net/mac/framer-802154.h +++ b/core/net/mac/framer-802154.h @@ -39,8 +39,12 @@ #ifndef FRAMER_802154_H_ #define FRAMER_802154_H_ +#include #include "net/mac/framer.h" extern const struct framer framer_802154; -#endif /* FRAMER_802154_H_ */ +void framer_802154_set_panid(uint16_t panid); +uint16_t framer_802154_get_panid(); + +#endif /* __FRAMER_802154_H__ */ From 20e8eba08b589b78ff668261f68d2c40bc98be04 Mon Sep 17 00:00:00 2001 From: AndreasReder Date: Wed, 20 Mar 2013 07:05:02 +0100 Subject: [PATCH 041/345] changed slip-radio to be able to change panid over slip command --- examples/osd/slip-radio/Makefile | 20 ++ examples/osd/slip-radio/no-framer.c | 114 ++++++++ examples/osd/slip-radio/project-conf.h | 76 ++++++ examples/osd/slip-radio/slip-net.c | 103 ++++++++ examples/osd/slip-radio/slip-radio-cc2420.c | 60 +++++ .../osd/slip-radio/slip-radio-sky-sensors.c | 90 +++++++ examples/osd/slip-radio/slip-radio.c | 248 ++++++++++++++++++ examples/osd/slip-radio/slip-radio.h | 41 +++ 8 files changed, 752 insertions(+) create mode 100644 examples/osd/slip-radio/Makefile create mode 100644 examples/osd/slip-radio/no-framer.c create mode 100644 examples/osd/slip-radio/project-conf.h create mode 100644 examples/osd/slip-radio/slip-net.c create mode 100644 examples/osd/slip-radio/slip-radio-cc2420.c create mode 100644 examples/osd/slip-radio/slip-radio-sky-sensors.c create mode 100644 examples/osd/slip-radio/slip-radio.c create mode 100644 examples/osd/slip-radio/slip-radio.h diff --git a/examples/osd/slip-radio/Makefile b/examples/osd/slip-radio/Makefile new file mode 100644 index 000000000..f7a755961 --- /dev/null +++ b/examples/osd/slip-radio/Makefile @@ -0,0 +1,20 @@ +CONTIKI_PROJECT=slip-radio +all: $(CONTIKI_PROJECT) +APPS = slip-cmd + +CONTIKI=../../.. + +WITH_UIP6=1 +UIP_CONF_IPV6=1 +UIP_CONF_RPL=0 + +#linker optimizations +SMALL=1 + +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" +PROJECT_SOURCEFILES += slip-net.c no-framer.c +ifeq ($(TARGET),sky) + PROJECT_SOURCEFILES += slip-radio-cc2420.c slip-radio-sky-sensors.c +endif + +include $(CONTIKI)/Makefile.include diff --git a/examples/osd/slip-radio/no-framer.c b/examples/osd/slip-radio/no-framer.c new file mode 100644 index 000000000..d0935db1f --- /dev/null +++ b/examples/osd/slip-radio/no-framer.c @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2009, 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 + * MAC framer that does nothing... + * \author + * Niclas Finne + * Joakim Eriksson + */ +#include "net/mac/framer.h" +#include "net/mac/frame802154.h" +#include "net/packetbuf.h" +#include + +#define DEBUG 2 + +#if DEBUG +#include +#define PRINTF(...) printf(__VA_ARGS__) +#define PRINTADDR(addr) PRINTF(" %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]) +#else +#define PRINTF(...) +#define PRINTADDR(addr) +#endif + +/** \brief The 16-bit identifier of the PAN on which the device is + * sending to. If this value is 0xffff, the device is not + * associated. + */ +static const uint16_t mac_dst_pan_id = IEEE802154_PANID; + +/** \brief The 16-bit identifier of the PAN on which the device is + * operating. If this value is 0xffff, the device is not + * associated. + */ +static const uint16_t mac_src_pan_id = IEEE802154_PANID; +/*---------------------------------------------------------------------------*/ +static int +is_broadcast_addr(uint8_t mode, uint8_t *addr) +{ + int i = mode == FRAME802154_SHORTADDRMODE ? 2 : 8; + while(i-- > 0) { + if(addr[i] != 0xff) { + return 0; + } + } + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +create(void) +{ + /* nothing extra... */ + return 0; +} +/*---------------------------------------------------------------------------*/ +static int +parse(void) +{ + frame802154_t frame; + int len; + len = packetbuf_datalen(); + if(frame802154_parse(packetbuf_dataptr(), len, &frame)) { + if(frame.fcf.dest_addr_mode) { + if(!is_broadcast_addr(frame.fcf.dest_addr_mode, frame.dest_addr)) { + packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, (rimeaddr_t *)&frame.dest_addr); + } + } + packetbuf_set_addr(PACKETBUF_ADDR_SENDER, (rimeaddr_t *)&frame.src_addr); + packetbuf_set_attr(PACKETBUF_ATTR_PENDING, frame.fcf.frame_pending); + /* packetbuf_set_attr(PACKETBUF_ATTR_RELIABLE, frame.fcf.ack_required);*/ + packetbuf_set_attr(PACKETBUF_ATTR_PACKET_ID, frame.seq); + + PRINTF("15.4-IN: %2X", frame.fcf.frame_type); + PRINTADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER)); + PRINTADDR(packetbuf_addr(PACKETBUF_ADDR_RECEIVER)); + PRINTF("%u (%u)\n", packetbuf_datalen(), len); + + return 0; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +const struct framer no_framer = { + create, parse +}; diff --git a/examples/osd/slip-radio/project-conf.h b/examples/osd/slip-radio/project-conf.h new file mode 100644 index 000000000..3555f527b --- /dev/null +++ b/examples/osd/slip-radio/project-conf.h @@ -0,0 +1,76 @@ +/* + * 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_CONF_H__ +#define __PROJECT_CONF_H__ + +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 140 + +#undef UIP_CONF_ROUTER +#define UIP_CONF_ROUTER 0 + +#undef UIP_CONF_IPV6_RPL +#define UIP_CONF_IPV6_RPL 0 + +#define CMD_CONF_OUTPUT slip_radio_cmd_output + +/* add the cmd_handler_cc2420 + some sensors if TARGET_SKY */ +#ifdef CONTIKI_TARGET_SKY +#define CMD_CONF_HANDLERS slip_radio_cmd_handler,cmd_handler_cc2420 +#define SLIP_RADIO_CONF_SENSORS slip_radio_sky_sensors +#else +#define CMD_CONF_HANDLERS slip_radio_cmd_handler +#endif + + +/* configuration for the slipradio/network driver */ +#undef NETSTACK_CONF_MAC +#define NETSTACK_CONF_MAC csma_driver + +#undef NETSTACK_CONF_RDC +/* #define NETSTACK_CONF_RDC nullrdc_noframer_driver */ +#define NETSTACK_CONF_RDC contikimac_driver + +#undef NETSTACK_CONF_NETWORK +#define NETSTACK_CONF_NETWORK slipnet_driver + +#undef NETSTACK_CONF_FRAMER +#define NETSTACK_CONF_FRAMER no_framer + +#undef CC2420_CONF_AUTOACK +#define CC2420_CONF_AUTOACK 1 + +#undef UART1_CONF_RX_WITH_DMA +#define UART1_CONF_RX_WITH_DMA 1 + +#endif /* __PROJECT_CONF_H__ */ diff --git a/examples/osd/slip-radio/slip-net.c b/examples/osd/slip-radio/slip-net.c new file mode 100644 index 000000000..68b2aebc0 --- /dev/null +++ b/examples/osd/slip-radio/slip-net.c @@ -0,0 +1,103 @@ +/* + * 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. + */ + +#include "contiki.h" +#include "net/netstack.h" +#include "net/uip.h" +#include "net/packetbuf.h" +#include "dev/slip.h" +#include + +#define SLIP_END 0300 +#define SLIP_ESC 0333 +#define SLIP_ESC_END 0334 +#define SLIP_ESC_ESC 0335 + +#define DEBUG 0 + +/*---------------------------------------------------------------------------*/ +void +slipnet_init(void) +{ +} +/*---------------------------------------------------------------------------*/ +void +slip_send_packet(const uint8_t *ptr, int len) +{ + uint16_t i; + uint8_t c; + + slip_arch_writeb(SLIP_END); + for(i = 0; i < len; ++i) { + c = *ptr++; + if(c == SLIP_END) { + slip_arch_writeb(SLIP_ESC); + c = SLIP_ESC_END; + } else if(c == SLIP_ESC) { + slip_arch_writeb(SLIP_ESC); + c = SLIP_ESC_ESC; + } + slip_arch_writeb(c); + } + slip_arch_writeb(SLIP_END); +} +/*---------------------------------------------------------------------------*/ +void +slipnet_input(void) +{ + int i; + /* radio should be configured for filtering so this should be simple */ + /* this should be sent over SLIP! */ + /* so just copy into uip-but and send!!! */ + /* Format: !R ? */ + uip_len = packetbuf_datalen(); + i = packetbuf_copyto(uip_buf); + + if(DEBUG) { + printf("Slipnet got input of len: %d, copied: %d\n", + packetbuf_datalen(), i); + + for(i = 0; i < uip_len; i++) { + printf("%02x", (unsigned char) uip_buf[i]); + if((i & 15) == 15) printf("\n"); + else if((i & 7) == 7) printf(" "); + } + printf("\n"); + } + + /* printf("SUT: %u\n", uip_len); */ + slip_send_packet(uip_buf, uip_len); +} +/*---------------------------------------------------------------------------*/ +const struct network_driver slipnet_driver = { + "slipnet", + slipnet_init, + slipnet_input +}; +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/slip-radio/slip-radio-cc2420.c b/examples/osd/slip-radio/slip-radio-cc2420.c new file mode 100644 index 000000000..7d7676e1f --- /dev/null +++ b/examples/osd/slip-radio/slip-radio-cc2420.c @@ -0,0 +1,60 @@ +/* + * 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. + * + * Sets up some commands for the CC2420 radio chip. + */ + +#include "contiki.h" +#include "dev/cc2420.h" +#include "cmd.h" +#include + +int +cmd_handler_cc2420(const uint8_t *data, int len) +{ + if(data[0] == '!') { + if(data[1] == 'C') { + printf("cc2420_cmd: setting channel: %d\n", data[2]); + cc2420_set_channel(data[2]); + return 1; + } + } else if(data[0] == '?') { + if(data[1] == 'C') { + uint8_t buf[4]; + printf("cc2420_cmd: getting channel: %d\n", data[2]); + buf[0] = '!'; + buf[1] = 'C'; + buf[2] = cc2420_get_channel(); + cmd_send(buf, 3); + return 1; + } + } + return 0; +} diff --git a/examples/osd/slip-radio/slip-radio-sky-sensors.c b/examples/osd/slip-radio/slip-radio-sky-sensors.c new file mode 100644 index 000000000..a88d7b9d3 --- /dev/null +++ b/examples/osd/slip-radio/slip-radio-sky-sensors.c @@ -0,0 +1,90 @@ +/* + * 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. + */ + +#include "contiki.h" +#include "lib/sensors.h" +#include "dev/sht11-sensor.h" +#include "slip-radio.h" +#include "cmd.h" +#include + +/*---------------------------------------------------------------------------*/ +static void +init(void) +{ +} +/*---------------------------------------------------------------------------*/ +static int +write_percent_float(char *data, int maxlen, int temp) +{ + int t; + t = temp % 100; + if(t < 0) { + t = -t; + } + return snprintf(data, maxlen, "%d.%02d", temp / 100, t); +} +/*---------------------------------------------------------------------------*/ +static void +send(void) +{ +#define MAX_SIZE 40 + char data[MAX_SIZE]; + int temperature; + int ms; + long hum; + int pos = 0; + + /* SENSORS_ACTIVATE(light_sensor); */ + SENSORS_ACTIVATE(sht11_sensor); + + pos += snprintf(data, MAX_SIZE, "!D"); + /* int light1 = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); */ + /* int light2 = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); */ + temperature = -3970 + sht11_sensor.value(SHT11_SENSOR_TEMP); + ms = sht11_sensor.value(SHT11_SENSOR_HUMIDITY); + /* this is in * 10000 */ + /* -2.0468 + 0.0367 * ms + -1.5955e-6 * ms * ms ...too small value... */ + hum = (-20468L + 367L * ms) / 100L; + + /* SENSORS_DEACTIVATE(light_sensor); */ + SENSORS_DEACTIVATE(sht11_sensor); + + pos += snprintf(&data[pos], MAX_SIZE - pos, "temp="); + pos += write_percent_float(&data[pos], MAX_SIZE - pos, temperature); + pos += snprintf(&data[pos], MAX_SIZE - pos, ";hum="); + pos += write_percent_float(&data[pos], MAX_SIZE - pos, hum); + + cmd_send((uint8_t *)data, pos); +} +/* ---------------------------------------------------------------------- */ +const struct slip_radio_sensors slip_radio_sky_sensors = { + init, send +}; +/* ---------------------------------------------------------------------- */ diff --git a/examples/osd/slip-radio/slip-radio.c b/examples/osd/slip-radio/slip-radio.c new file mode 100644 index 000000000..d55ab2831 --- /dev/null +++ b/examples/osd/slip-radio/slip-radio.c @@ -0,0 +1,248 @@ +/* + * 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. + */ + +/** + * \file + * Slip-radio driver + * \author + * Niclas Finne + * Joakim Eriksson + * Andreas Reder + */ +#include "contiki.h" +#include "net/uip.h" +#include "net/uip-ds6.h" +#include "dev/slip.h" +#include +#include "net/netstack.h" +#include "net/packetbuf.h" + +#define DEBUG DEBUG_FULL +#include "net/uip-debug.h" +#include "cmd.h" +#include "slip-radio.h" +#include "packetutils.h" + +#include +#include "watchdog.h" +#include "params.h" + +extern uint16_t eemem_panid EEMEM; +extern uint8_t eemem_channel[] EEMEM; + +#ifdef SLIP_RADIO_CONF_SENSORS +extern const struct slip_radio_sensors SLIP_RADIO_CONF_SENSORS; +#endif + +void slip_send_packet(const uint8_t *ptr, int len); + + /* max 16 packets at the same time??? */ +uint8_t packet_ids[16]; +int packet_pos; + +static int slip_radio_cmd_handler(const uint8_t *data, int len); +int cmd_handler_cc2420(const uint8_t *data, int len); +/*---------------------------------------------------------------------------*/ +#ifdef CMD_CONF_HANDLERS +CMD_HANDLERS(CMD_CONF_HANDLERS); +#else +CMD_HANDLERS(slip_radio_cmd_handler); +#endif +/*---------------------------------------------------------------------------*/ +static void +packet_sent(void *ptr, int status, int transmissions) +{ + uint8_t buf[20]; + uint8_t sid; + int pos; + sid = *((uint8_t *)ptr); + PRINTF("Slip-radio: packet sent! sid: %d, status: %d, tx: %d\n", + sid, status, transmissions); + /* packet callback from lower layers */ + /* neighbor_info_packet_sent(status, transmissions); */ + pos = 0; + buf[pos++] = '!'; + buf[pos++] = 'R'; + buf[pos++] = sid; + buf[pos++] = status; /* one byte ? */ + buf[pos++] = transmissions; + cmd_send(buf, pos); +} +/*---------------------------------------------------------------------------*/ +static int +slip_radio_cmd_handler(const uint8_t *data, int len) +{ + int i; + uint16_t panid; + + if(data[0] == '!') { + /* should send out stuff to the radio - ignore it as IP */ + /* --- s e n d --- */ + if(data[1] == 'S') { + int pos; + packet_ids[packet_pos] = data[2]; + + packetbuf_clear(); + pos = packetutils_deserialize_atts(&data[3], len - 3); + if(pos < 0) { + PRINTF("slip-radio: illegal packet attributes\n"); + return 1; + } + pos += 3; + len -= pos; + if(len > PACKETBUF_SIZE) { + len = PACKETBUF_SIZE; + } + memcpy(packetbuf_dataptr(), &data[pos], len); + packetbuf_set_datalen(len); + + PRINTF("slip-radio: sending %u (%d bytes)\n", + data[2], packetbuf_datalen()); + + /* parse frame before sending to get addresses, etc. */ + no_framer.parse(); + NETSTACK_MAC.send(packet_sent, &packet_ids[packet_pos]); + + packet_pos++; + if(packet_pos >= sizeof(packet_ids)) { + packet_pos = 0; + } + + return 1; + } + } else if(uip_buf[0] == '?') { + PRINTF("Got request message of type %c\n", uip_buf[1]); + if(data[1] == 'M') { + /* this is just a test so far... just to see if it works */ + uip_buf[0] = '!'; + uip_buf[1] = 'M'; + for(i = 0; i < 8; i++) { + uip_buf[2 + i] = uip_lladdr.addr[i]; + } + uip_len = 10; + cmd_send(uip_buf, uip_len); + return 1; + } else if( data[1] == 'P'){ + panid = (data[2] << 8) + data[3]; + PRINTF("slip-radio: received change panid command, new panid %u\n", len); + cli(); + eeprom_write_word(&eemem_panid, panid); + sei(); + watchdog_reboot(); + } + } + return 0; +} +/*---------------------------------------------------------------------------*/ +void +slip_radio_cmd_output(const uint8_t *data, int data_len) +{ + slip_send_packet(data, data_len); +} +/*---------------------------------------------------------------------------*/ +static void +slip_input_callback(void) +{ + PRINTF("SR-SIN: %u '%c%c'\n", uip_len, uip_buf[0], uip_buf[1]); + cmd_input(uip_buf, uip_len); + uip_len = 0; +} +/*---------------------------------------------------------------------------*/ +static void +init(void) +{ +#ifndef BAUD2UBR +#define BAUD2UBR(baud) baud +#endif + slip_arch_init(BAUD2UBR(115200)); + process_start(&slip_process, NULL); + slip_set_input_callback(slip_input_callback); + packet_pos = 0; +} +/*---------------------------------------------------------------------------*/ +#if !SLIP_RADIO_CONF_NO_PUTCHAR +#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; +} +#endif +/*---------------------------------------------------------------------------*/ +PROCESS(slip_radio_process, "Slip radio process"); +AUTOSTART_PROCESSES(&slip_radio_process); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(slip_radio_process, ev, data) +{ + static struct etimer et; + PROCESS_BEGIN(); + + init(); + NETSTACK_RDC.off(1); +#ifdef SLIP_RADIO_CONF_SENSORS + SLIP_RADIO_CONF_SENSORS.init(); +#endif + printf("Slip Radio started...\n"); + + etimer_set(&et, CLOCK_SECOND * 3); + + while(1) { + PROCESS_YIELD(); + + if(etimer_expired(&et)) { + etimer_reset(&et); +#ifdef SLIP_RADIO_CONF_SENSORS + SLIP_RADIO_CONF_SENSORS.send(); +#endif + } + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/slip-radio/slip-radio.h b/examples/osd/slip-radio/slip-radio.h new file mode 100644 index 000000000..8aad5da20 --- /dev/null +++ b/examples/osd/slip-radio/slip-radio.h @@ -0,0 +1,41 @@ +/* + * 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. + * + */ + +#ifndef __SLIP_RADIO_H__ +#define __SLIP_RADIO_H__ + +struct slip_radio_sensors { + /** Initialize the driver */ + void (* init)(void); + /** Send the sensor data packet via the command send */ + void (* send)(void); +}; + +#endif /* __SLIP_RADIO_H__ */ From 46010cbbd68c400d7768a255b2adede20b937f39 Mon Sep 17 00:00:00 2001 From: "andreas@reder.eu" Date: Wed, 20 Mar 2013 07:18:23 +0100 Subject: [PATCH 042/345] bugfix: panid is now correctly loaded from eeprom and set in mac framer and radio on startup --- platform/osd-merkur/contiki-main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index e267b1060..65d3ad07a 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -59,7 +59,6 @@ #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" @@ -281,6 +280,8 @@ uint8_t i; #endif rimeaddr_set_node_addr(&addr); + PRINTA("Panid:%u\n", params_get_panid()); + framer_802154_set_panid(params_get_panid()); 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()); From 86a6d887991e5b01bbc4e9b612e6f3ac1146bde7 Mon Sep 17 00:00:00 2001 From: "andreas@reder.eu" Date: Wed, 20 Mar 2013 07:23:03 +0100 Subject: [PATCH 043/345] PARAMS_PANID is now defined in contiki-conf and no longer in params.h to be able to change framer panid --- platform/osd-merkur/contiki-conf.h | 4 ++++ platform/osd-merkur/params.h | 8 +------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index d99a965e2..6a112d39f 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -99,6 +99,10 @@ typedef unsigned long off_t; /* Logging adds 200 bytes to program size. RS232 output slows down webserver. */ //#define LOG_CONF_ENABLED 1 +/* Network Panid */ +#define IEEE802154_CONF_PANID 0xABCD +#define PARAMS_PANID IEEE802154_CONF_PANID + /* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */ /* It has less overhead than ENERGEST */ #define RADIOSTATS 0 diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h index 16826f4aa..6ee669635 100644 --- a/platform/osd-merkur/params.h +++ b/platform/osd-merkur/params.h @@ -36,7 +36,6 @@ 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 @@ -57,11 +56,6 @@ extern uint8_t eemem_domain_name[30]; #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 @@ -79,7 +73,7 @@ extern uint8_t eemem_domain_name[30]; #if UIP_CONF_LL_802154 //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN} //#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x01} -#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03} +#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x26, 0x6c} //#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB} #else //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN} From 3783d5f0596292fb177535c6f44bd358be376192 Mon Sep 17 00:00:00 2001 From: Andreas Reder Date: Wed, 20 Mar 2013 07:32:44 +0100 Subject: [PATCH 044/345] created osd native border router with coap server to get rpl table and change panid --- examples/osd/native-border-router/Makefile | 41 ++ .../native-border-router/border-router-cmds.c | 147 +++++ .../native-border-router/border-router-cmds.h | 48 ++ .../native-border-router/border-router-rdc.c | 195 +++++++ .../osd/native-border-router/border-router.c | 483 ++++++++++++++++ .../osd/native-border-router/border-router.h | 59 ++ .../osd/native-border-router/project-conf.h | 60 ++ .../osd/native-border-router/slip-config.c | 198 +++++++ examples/osd/native-border-router/slip-dev.c | 546 ++++++++++++++++++ .../osd/native-border-router/tun-bridge.c | 311 ++++++++++ 10 files changed, 2088 insertions(+) create mode 100644 examples/osd/native-border-router/Makefile create mode 100644 examples/osd/native-border-router/border-router-cmds.c create mode 100644 examples/osd/native-border-router/border-router-cmds.h create mode 100644 examples/osd/native-border-router/border-router-rdc.c create mode 100644 examples/osd/native-border-router/border-router.c create mode 100644 examples/osd/native-border-router/border-router.h create mode 100644 examples/osd/native-border-router/project-conf.h create mode 100644 examples/osd/native-border-router/slip-config.c create mode 100644 examples/osd/native-border-router/slip-dev.c create mode 100644 examples/osd/native-border-router/tun-bridge.c diff --git a/examples/osd/native-border-router/Makefile b/examples/osd/native-border-router/Makefile new file mode 100644 index 000000000..69412170d --- /dev/null +++ b/examples/osd/native-border-router/Makefile @@ -0,0 +1,41 @@ +CONTIKI_PROJECT=border-router +all: $(CONTIKI_PROJECT) +APPS = slip-cmd + +CONTIKI=../../.. + +WITH_UIP6=1 +UIP_CONF_IPV6=1 +CFLAGS+= -DUIP_CONF_IPV6_RPL + +WITH_COAP=7 + +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 +APPS+=erbium +endif + +#linker optimizations +SMALL=1 + +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" +PROJECT_SOURCEFILES += border-router-cmds.c tun-bridge.c border-router-rdc.c \ +slip-config.c slip-dev.c + +WITH_WEBSERVER=0 +ifeq ($(WITH_WEBSERVER),1) +CFLAGS += -DWEBSERVER=1 +PROJECT_SOURCEFILES += httpd-simple.c +else ifneq ($(WITH_WEBSERVER), 0) +APPS += $(WITH_WEBSERVER) +CFLAGS += -DWEBSERVER=2 +endif + +include $(CONTIKI)/Makefile.include + +connect-router: border-router.native + sudo ./border-router.native aaaa::1/64 diff --git a/examples/osd/native-border-router/border-router-cmds.c b/examples/osd/native-border-router/border-router-cmds.c new file mode 100644 index 000000000..eec4646ab --- /dev/null +++ b/examples/osd/native-border-router/border-router-cmds.c @@ -0,0 +1,147 @@ +/* + * 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. + */ + +/** + * \file + * Sets up some commands for the border router + * \author + * Niclas Finne + * Joakim Eriksson + */ + +#include "contiki.h" +#include "cmd.h" +#include "border-router.h" +#include "border-router-cmds.h" +#include "dev/serial-line.h" +#include "net/rpl/rpl.h" +#include "net/uiplib.h" +#include + +#define DEBUG DEBUG_NONE +#include "net/uip-debug.h" + + +uint8_t command_context; + +void packet_sent(uint8_t sessionid, uint8_t status, uint8_t tx); +void nbr_print_stat(void); + +/*---------------------------------------------------------------------------*/ +PROCESS(border_router_cmd_process, "Border router cmd process"); +/*---------------------------------------------------------------------------*/ +/* TODO: the below code needs some way of identifying from where the command */ +/* comes. In this case it can be from stdin or from SLIP. */ +/*---------------------------------------------------------------------------*/ +int +border_router_cmd_handler(const uint8_t *data, int len) +{ + /* handle global repair, etc here */ + if(data[0] == '!') { + PRINTF("Got configuration message of type %c\n", data[1]); + if(data[1] == 'G' && command_context == CMD_CONTEXT_STDIO) { + /* This is supposed to be from stdin */ + printf("Performing Global Repair...\n"); + rpl_repair_root(RPL_DEFAULT_INSTANCE); + return 1; + } else if(data[1] == 'M' && command_context == CMD_CONTEXT_RADIO) { + /* We need to know that this is from the slip-radio here. */ + PRINTF("Setting MAC address\n"); + border_router_set_mac(&data[2]); + return 1; + } else if(data[1] == 'C' && command_context == CMD_CONTEXT_RADIO) { + /* We need to know that this is from the slip-radio here. */ + printf("Channel is:%d\n", data[2]); + return 1; + } else if(data[1] == 'R' && command_context == CMD_CONTEXT_RADIO) { + /* We need to know that this is from the slip-radio here. */ + PRINTF("Packet data report for sid:%d st:%d tx:%d\n", + data[2], data[3], data[4]); + packet_sent(data[2], data[3], data[4]); + return 1; + } else if(data[1] == 'D' && command_context == CMD_CONTEXT_RADIO) { + /* We need to know that this is from the slip-radio here... */ + PRINTF("Sensor data received\n"); + border_router_set_sensors((const char *)&data[2], len - 2); + return 1; + } + } else if(data[0] == '?') { + PRINTF("Got request message of type %c\n", data[1]); + if(data[1] == 'M' && command_context == CMD_CONTEXT_STDIO) { + uint8_t buf[20]; + char* hexchar = "0123456789abcdef"; + int j; + /* this is just a test so far... just to see if it works */ + buf[0] = '!'; + buf[1] = 'M'; + for(j = 0; j < 8; j++) { + buf[2 + j * 2] = hexchar[uip_lladdr.addr[j] >> 4]; + buf[3 + j * 2] = hexchar[uip_lladdr.addr[j] & 15]; + } + cmd_send(buf, 18); + return 1; + } else if(data[1] == 'C' && command_context == CMD_CONTEXT_STDIO) { + /* send on! */ + write_to_slip(data, len); + return 1; + } else if(data[1] == 'S') { + border_router_print_stat(); + return 1; + } + } + return 0; +} +/*---------------------------------------------------------------------------*/ +void +border_router_cmd_output(const uint8_t *data, int data_len) +{ + int i; + printf("CMD output: "); + for(i = 0; i < data_len; i++) { + printf("%c", data[i]); + } + printf("\n"); +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(border_router_cmd_process, ev, data) +{ + PROCESS_BEGIN(); + PRINTF("Started br-cmd process\n"); + while(1) { + PROCESS_YIELD(); + if(ev == serial_line_event_message && data != NULL) { + PRINTF("Got serial data!!! %s of len: %d\n", + (char *)data, strlen((char *)data)); + command_context = CMD_CONTEXT_STDIO; + cmd_input(data, strlen((char *)data)); + } + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/native-border-router/border-router-cmds.h b/examples/osd/native-border-router/border-router-cmds.h new file mode 100644 index 000000000..38fc92111 --- /dev/null +++ b/examples/osd/native-border-router/border-router-cmds.h @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/** + * \file + * Sets up some commands for the border router + * \author + * Niclas Finne + * Joakim Eriksson + */ + +#ifndef __BORDER_ROUTER_CMDS_H__ +#define __BORDER_ROUTER_CMDS_H__ + +#define CMD_CONTEXT_RADIO 0 +#define CMD_CONTEXT_STDIO 1 + +extern uint8_t command_context; + +PROCESS_NAME(border_router_cmd_process); + +#endif /* __BORDER_ROUTER_CMDS_H__ */ diff --git a/examples/osd/native-border-router/border-router-rdc.c b/examples/osd/native-border-router/border-router-rdc.c new file mode 100644 index 000000000..78699122f --- /dev/null +++ b/examples/osd/native-border-router/border-router-rdc.c @@ -0,0 +1,195 @@ +/* + * 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. + */ + +/** + * \file + * A null RDC implementation that uses framer for headers and sends + * the packets over slip instead of radio. + * \author + * Adam Dunkels + * Joakim Eriksson + * Niclas Finne + */ + +#include "net/packetbuf.h" +#include "net/queuebuf.h" +#include "net/netstack.h" +#include "packetutils.h" +#include "border-router.h" +#include + +#define DEBUG 0 +#if DEBUG +#include +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +#define MAX_CALLBACKS 16 +static int callback_pos; + +/* a structure for calling back when packet data is coming back + from radio... */ +struct tx_callback { + mac_callback_t cback; + void *ptr; + struct packetbuf_attr attrs[PACKETBUF_NUM_ATTRS]; + struct packetbuf_addr addrs[PACKETBUF_NUM_ADDRS]; +}; + +static struct tx_callback callbacks[MAX_CALLBACKS]; +/*---------------------------------------------------------------------------*/ +void packet_sent(uint8_t sessionid, uint8_t status, uint8_t tx) +{ + if(sessionid < MAX_CALLBACKS) { + struct tx_callback *callback; + callback = &callbacks[sessionid]; + packetbuf_clear(); + packetbuf_attr_copyfrom(callback->attrs, callback->addrs); + mac_call_sent_callback(callback->cback, callback->ptr, status, tx); + } else { + PRINTF("*** ERROR: too high session id %d\n", sessionid); + } +} +/*---------------------------------------------------------------------------*/ +static int +setup_callback(mac_callback_t sent, void *ptr) +{ + struct tx_callback *callback; + int tmp = callback_pos; + callback = &callbacks[callback_pos]; + callback->cback = sent; + callback->ptr = ptr; + packetbuf_attr_copyto(callback->attrs, callback->addrs); + + callback_pos++; + if(callback_pos >= MAX_CALLBACKS) { + callback_pos = 0; + } + + return tmp; +} +/*---------------------------------------------------------------------------*/ +static void +send_packet(mac_callback_t sent, void *ptr) +{ + int size; + /* 3 bytes per packet attribute is required for serialization */ + uint8_t buf[PACKETBUF_NUM_ATTRS * 3 + PACKETBUF_SIZE + 3]; + uint8_t sid; + + packetbuf_set_addr(PACKETBUF_ADDR_SENDER, &rimeaddr_node_addr); + + /* ack or not ? */ + packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1); + + if(NETSTACK_FRAMER.create() < 0) { + /* Failed to allocate space for headers */ + PRINTF("br-rdc: send failed, too large header\n"); + mac_call_sent_callback(sent, ptr, MAC_TX_ERR_FATAL, 1); + + } else { + /* here we send the data over SLIP to the radio-chip */ + size = 0; +#if SERIALIZE_ATTRIBUTES + size = packetutils_serialize_atts(&buf[3], sizeof(buf) - 3); +#endif + if(size < 0 || size + packetbuf_totlen() + 3 > sizeof(buf)) { + PRINTF("br-rdc: send failed, too large header\n"); + mac_call_sent_callback(sent, ptr, MAC_TX_ERR_FATAL, 1); + } else { + sid = setup_callback(sent, ptr); + + buf[0] = '!'; + buf[1] = 'S'; + buf[2] = sid; /* sequence or session number for this packet */ + + /* Copy packet data */ + memcpy(&buf[3 + size], packetbuf_hdrptr(), packetbuf_totlen()); + + write_to_slip(buf, packetbuf_totlen() + size + 3); + } + } +} +/*---------------------------------------------------------------------------*/ +static void +send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) +{ + if(buf_list != NULL) { + queuebuf_to_packetbuf(buf_list->buf); + send_packet(sent, ptr); + } +} +/*---------------------------------------------------------------------------*/ +static void +packet_input(void) +{ + if(NETSTACK_FRAMER.parse() < 0) { + PRINTF("br-rdc: failed to parse %u\n", packetbuf_datalen()); + } else { + NETSTACK_MAC.input(); + } +} +/*---------------------------------------------------------------------------*/ +static int +on(void) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +off(int keep_radio_on) +{ + return 1; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +channel_check_interval(void) +{ + return 0; +} +/*---------------------------------------------------------------------------*/ +static void +init(void) +{ + callback_pos = 0; +} +/*---------------------------------------------------------------------------*/ +const struct rdc_driver border_router_rdc_driver = { + "br-rdc", + init, + send_packet, + send_list, + packet_input, + on, + off, + channel_check_interval, +}; +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/native-border-router/border-router.c b/examples/osd/native-border-router/border-router.c new file mode 100644 index 000000000..281b2e27d --- /dev/null +++ b/examples/osd/native-border-router/border-router.c @@ -0,0 +1,483 @@ +/* + * 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. + * + */ +/** + * \file + * border-router + * \author + * Niclas Finne + * Joakim Eriksson + * Nicolas Tsiftes + * Andreas Reder + */ + +#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/mac/framer-802154.h" + +#include "net/netstack.h" +#include "dev/slip.h" +#include "cmd.h" +#include "border-router.h" +#include "border-router-cmds.h" + +#include +#include +#include +#include + +#define DEBUG DEBUG_FULL +#include "net/uip-debug.h" + +#include "erbium.h" +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + + + +#define MAX_SENSORS 4 + +#define IPV6_ADDR_LEN 40 +#define RPL_TABLE_SIZE 25000 +char rpl_table[RPL_TABLE_SIZE]; +int rpl_table_len; + + + +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[]; + +extern long slip_sent; +extern long slip_received; + +static uip_ipaddr_t prefix; +static uint8_t prefix_set; +static uint8_t mac_set; + +static uint8_t sensor_count = 0; + +/* allocate MAX_SENSORS char[32]'s */ +static char sensors[MAX_SENSORS][32]; + +extern int contiki_argc; +extern char **contiki_argv; +extern const char *slip_config_ipaddr; + +CMD_HANDLERS(border_router_cmd_handler); + +PROCESS(border_router_process, "Border router process"); +PROCESS(rest_server, "Erbium Coap Server"); + +AUTOSTART_PROCESSES(&border_router_process,&border_router_cmd_process, &rest_server); + + +static int create_ipv6_addr_str(const uip_ipaddr_t *addr, char *ptr){ + int len = 0; + int i, f; + uint16_t a; + + uip_debug_ipaddr_print(addr); + 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){ + ptr[len++] = ':'; + ptr[len++] = ':'; + } + } else { + if(f > 0) { + f = -1; + } else if(i > 0) { + ptr[len++] = ':'; + } + len += snprintf(&ptr[len], IPV6_ADDR_LEN - len, "%x", a); + } + } + return len; +} + +/*---------------------------------------------------------------------------*/ +//create JSON RPL Table +static void +generate_rpl_table(){ + char a[IPV6_ADDR_LEN]; + int addresses; + static uip_ds6_route_t *r; + int i; + + rpl_table_len = 0; + // Start JSON + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "{\n"); + + // add title + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "\"title\": \"RPL Table\",\n"); + + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "\"Neighbors\": [ "); + + addresses = 0; + for(i = 0; i < UIP_DS6_NBR_NB; i++) { + if(uip_ds6_nbr_cache[i].isused) { + addresses += 1; + create_ipv6_addr_str(&uip_ds6_nbr_cache[i].ipaddr, a); + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "\"%s\", ", a); + } + } + if(addresses > 0){ + //delete last coma + rpl_table_len -= 2; + } + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "],\n"); + + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "\"Routes\": [ "); + + addresses = 0; + for(r = uip_ds6_route_list_head(); r != NULL; r = list_item_next(r)) { + addresses += 1; + create_ipv6_addr_str(&r->ipaddr, a); + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "\"%s via ", a); + create_ipv6_addr_str(&r->nexthop, a); + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "%s\", ", a); + } + if(addresses > 0){ + //delete last coma + rpl_table_len -= 2; + } + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "]\n"); + + // End JSON + rpl_table_len += snprintf(&rpl_table[rpl_table_len], RPL_TABLE_SIZE - rpl_table_len, "}\n"); +} + +/*---------------------------------------------------------------------------*/ +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(" %p: =>", &uip_ds6_if.addr_list[i]); + uip_debug_ipaddr_print(&(uip_ds6_if.addr_list[i]).ipaddr); + PRINTA("\n"); + } + } +} +/*---------------------------------------------------------------------------*/ +static void +request_mac(void) +{ + write_to_slip((uint8_t *)"?M", 2); +} +/*---------------------------------------------------------------------------*/ +void +border_router_set_mac(const uint8_t *data) +{ + memcpy(uip_lladdr.addr, data, sizeof(uip_lladdr.addr)); + rimeaddr_set_node_addr((rimeaddr_t *)uip_lladdr.addr); + + /* is this ok - should instead remove all addresses and + add them back again - a bit messy... ?*/ + uip_ds6_init(); + rpl_init(); + + mac_set = 1; +} +/*---------------------------------------------------------------------------*/ +void +border_router_print_stat() +{ + printf("bytes received over SLIP: %ld\n", slip_received); + printf("bytes sent over SLIP: %ld\n", slip_sent); +} + +/*---------------------------------------------------------------------------*/ +/* Format: ;;...;*/ +/* this function just cut at ; and store in the sensor array */ +void +border_router_set_sensors(const char *data, int len) +{ + int i; + int last_pos = 0; + int sc = 0; + for(i = 0;i < len; i++) { + if(data[i] == ';') { + sensors[sc][i - last_pos] = 0; + memcpy(sensors[sc++], &data[last_pos], i - last_pos); + last_pos = i + 1; /* skip the ';' */ + } + if(sc == MAX_SENSORS) { + sensor_count = sc; + return; + } + } + sensors[sc][len - last_pos] = 0; + memcpy(sensors[sc++], &data[last_pos], len - last_pos); + sensor_count = sc; +} +/*---------------------------------------------------------------------------*/ +static void +set_prefix_64(const 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(); + prefix_set = 0; + + PROCESS_PAUSE(); + + PRINTF("RPL-Border router started\n"); + + slip_config_handle_arguments(contiki_argc, contiki_argv); + + /* tun init is also responsible for setting up the SLIP connection */ + tun_init(); + + while(!mac_set) { + etimer_set(&et, CLOCK_SECOND); + request_mac(); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + } + + if(slip_config_ipaddr != NULL) { + uip_ipaddr_t prefix; + + if(uiplib_ipaddrconv((const char *)slip_config_ipaddr, &prefix)) { + PRINTF("Setting prefix "); + PRINT6ADDR(&prefix); + PRINTF("\n"); + set_prefix_64(&prefix); + } else { + PRINTF("Parse error: %s\n", slip_config_ipaddr); + exit(0); + } + } + + 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"); + } + +#if DEBUG + print_local_addresses(); +#endif + + /* The border router runs with a 100% duty cycle in order to ensure high + packet reception rates. */ + NETSTACK_MAC.off(1); + + while(1) { + // etimer_set(&et, CLOCK_SECOND * 2); + // PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + PROCESS_YIELD(); + /* do anything here??? */ + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ + +/* +* Resources are defined by the RESOURCE macro. +* Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). +*/ +RESOURCE(rpl, METHOD_GET, "rpl", "title=\"rpl routing\";rt=\"Text\""); + +/* +* A handler function named [resource name]_handler must be implemented for each RESOURCE. +* A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore +* preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. +* If a smaller block size is requested for CoAP, the REST framework automatically splits the data. +*/ + +void +rpl_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int32_t strpos = 0; + int i; + + if(*offset == 0){ + generate_rpl_table(); + } + + /* Check the offset for boundaries of the resource data. */ + if (*offset>=rpl_table_len) + { + 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 = preferred_size; + } + + /* Truncate if above CHUNKS_TOTAL bytes. */ + if (*offset+(int32_t)strpos > rpl_table_len) + { + strpos = rpl_table_len - *offset; + } + + REST.set_response_payload(response, buffer, strpos); + + /* IMPORTANT for chunk-wise resources: Signal chunk awareness to REST engine. */ + *offset += strpos; + + /* Signal end of resource representation. */ + if (*offset>=rpl_table_len) + { + *offset = -1; + } +} + +RESOURCE(osd_net_conf, METHOD_GET | METHOD_POST, "osd-net-conf", "title=\"osd configs\""); +void +osd_net_conf_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + uint8_t buf[10]; + int index = 0; + int length = 0; /* |<-------->| */ + const char* strg; + uint16_t panid; + + if((length = REST.get_post_variable(request, "panid", &strg))){ + // parse panid + panid = (uint16_t)atoi(strg); + // set framer panid + framer_802154_set_panid(panid); + //set radio panid + buf[0] = '?'; + buf[1] = 'P'; + buf[2] = panid >> 8; + buf[3] = panid; + write_to_slip(buf, 4); + + }else if((length = REST.get_post_variable(request, "channel", &strg))){ + REST.set_response_status(response, REST.status.BAD_REQUEST); + return; + } + + index += sprintf(message + index, "{\n"); + index += sprintf(message + index, "\"panid\": \"%u\",\n", framer_802154_get_panid()); + //index += sprintf(message + index, "\"channel\": \"%u\",\n", //params_get_channel()); + index += sprintf(message + index, "}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} + + +/*---------------------------------------------------------------------------*/ + +PROCESS_THREAD(rest_server, ev, data) +{ + + PROCESS_BEGIN(); + + + + PRINTF("Starting Erbium Coap 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); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_rpl); + rest_activate_resource(&resource_osd_net_conf); + + while(1) { + PROCESS_YIELD(); + } + + + PROCESS_END(); +} + + + diff --git a/examples/osd/native-border-router/border-router.h b/examples/osd/native-border-router/border-router.h new file mode 100644 index 000000000..b6a2f2ab2 --- /dev/null +++ b/examples/osd/native-border-router/border-router.h @@ -0,0 +1,59 @@ +/* + * 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. + */ + +/** + * \file + * Border router header file + * \author + * Joakim Eriksson + */ + +#ifndef __BORDER_ROUTER_H__ +#define __BORDER_ROUTER_H__ + +#include "contiki.h" +#include "net/uip.h" +#include + +int border_router_cmd_handler(const uint8_t *data, int len); +int slip_config_handle_arguments(int argc, char **argv); +void write_to_slip(const uint8_t *buf, int len); + +void border_router_set_prefix_64(const uip_ipaddr_t *prefix_64); +void border_router_set_mac(const uint8_t *data); +void border_router_set_sensors(const char *data, int len); +void border_router_print_stat(void); + +void tun_init(void); + +int slip_init(void); +int slip_set_fd(int maxfd, fd_set *rset, fd_set *wset); +void slip_handle_fd(fd_set *rset, fd_set *wset); + +#endif /* __BORDER_ROUTER_H__ */ diff --git a/examples/osd/native-border-router/project-conf.h b/examples/osd/native-border-router/project-conf.h new file mode 100644 index 000000000..494264b58 --- /dev/null +++ b/examples/osd/native-border-router/project-conf.h @@ -0,0 +1,60 @@ +/* + * 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. + */ + +#ifndef __PROJECT_ROUTER_CONF_H__ +#define __PROJECT_ROUTER_CONF_H__ + +#undef UIP_FALLBACK_INTERFACE +#define UIP_FALLBACK_INTERFACE rpl_interface + +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 1280 + +#undef UIP_CONF_RECEIVE_WINDOW +#define UIP_CONF_RECEIVE_WINDOW 60 + +#define SLIP_DEV_CONF_SEND_DELAY (CLOCK_SECOND / 32) + +#undef WEBSERVER_CONF_CFS_CONNS +#define WEBSERVER_CONF_CFS_CONNS 2 + +#define SERIALIZE_ATTRIBUTES 1 + +#define CMD_CONF_OUTPUT border_router_cmd_output + +#undef NETSTACK_CONF_RDC +#define NETSTACK_CONF_RDC border_router_rdc_driver + +/* used by wpcap (see /cpu/native/net/wpcap-drv.c) */ +#define SELECT_CALLBACK 1 + +#endif /* __PROJECT_ROUTER_CONF_H__ */ diff --git a/examples/osd/native-border-router/slip-config.c b/examples/osd/native-border-router/slip-config.c new file mode 100644 index 000000000..84d256127 --- /dev/null +++ b/examples/osd/native-border-router/slip-config.c @@ -0,0 +1,198 @@ +/* + * 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. + */ + +/** + * \file + * Slip configuration + * \author + * Niclas Finne + * Joakim Eriksson + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "contiki.h" + +int slip_config_verbose = 0; +const char *slip_config_ipaddr; +int slip_config_flowcontrol = 0; +int slip_config_timestamp = 0; +const char *slip_config_siodev = NULL; +const char *slip_config_host = NULL; +const char *slip_config_port = NULL; +char slip_config_tundev[32] = { "" }; +uint16_t slip_config_basedelay = 0; + +#ifndef BAUDRATE +#define BAUDRATE B115200 +#endif +speed_t slip_config_b_rate = BAUDRATE; + +/*---------------------------------------------------------------------------*/ +int +slip_config_handle_arguments(int argc, char **argv) +{ + const char *prog; + char c; + int baudrate = 115200; + + slip_config_verbose = 0; + + prog = argv[0]; + while((c = getopt(argc, argv, "B:H:D:Lhs:t:v::d::a:p:T")) != -1) { + switch(c) { + case 'B': + baudrate = atoi(optarg); + break; + + case 'H': + slip_config_flowcontrol = 1; + break; + + case 'L': + slip_config_timestamp = 1; + break; + + case 's': + if(strncmp("/dev/", optarg, 5) == 0) { + slip_config_siodev = optarg + 5; + } else { + slip_config_siodev = optarg; + } + break; + + case 't': + if(strncmp("/dev/", optarg, 5) == 0) { + strncpy(slip_config_tundev, optarg + 5, sizeof(slip_config_tundev)); + } else { + strncpy(slip_config_tundev, optarg, sizeof(slip_config_tundev)); + } + break; + + case 'a': + slip_config_host = optarg; + break; + + case 'p': + slip_config_port = optarg; + break; + + case 'd': + slip_config_basedelay = 10; + if(optarg) slip_config_basedelay = atoi(optarg); + break; + + case 'v': + slip_config_verbose = 2; + if(optarg) slip_config_verbose = atoi(optarg); + break; + + case '?': + case 'h': + default: +fprintf(stderr,"usage: %s [options] ipaddress\n", prog); +fprintf(stderr,"example: border-router.native -L -v2 -s ttyUSB1 aaaa::1/64\n"); +fprintf(stderr,"Options are:\n"); +#ifdef linux +fprintf(stderr," -B baudrate 9600,19200,38400,57600,115200,921600 (default 115200)\n"); +#else +fprintf(stderr," -B baudrate 9600,19200,38400,57600,115200 (default 115200)\n"); +#endif +fprintf(stderr," -H Hardware CTS/RTS flow control (default disabled)\n"); +fprintf(stderr," -L Log output format (adds time stamps)\n"); +fprintf(stderr," -s siodev Serial device (default /dev/ttyUSB0)\n"); +fprintf(stderr," -a host Connect via TCP to server at \n"); +fprintf(stderr," -p port Connect via TCP to server at :\n"); +fprintf(stderr," -t tundev Name of interface (default tun0)\n"); +fprintf(stderr," -v[level] Verbosity level\n"); +fprintf(stderr," -v0 No messages\n"); +fprintf(stderr," -v1 Encapsulated SLIP debug messages (default)\n"); +fprintf(stderr," -v2 Printable strings after they are received\n"); +fprintf(stderr," -v3 Printable strings and SLIP packet notifications\n"); +fprintf(stderr," -v4 All printable characters as they are received\n"); +fprintf(stderr," -v5 All SLIP packets in hex\n"); +fprintf(stderr," -v Equivalent to -v3\n"); +fprintf(stderr," -d[basedelay] Minimum delay between outgoing SLIP packets.\n"); +fprintf(stderr," Actual delay is basedelay*(#6LowPAN fragments) milliseconds.\n"); +fprintf(stderr," -d is equivalent to -d10.\n"); +exit(1); + break; + } + } + argc -= optind - 1; + argv += optind - 1; + + if(argc != 2 && argc != 3) { + err(1, "usage: %s [-B baudrate] [-H] [-L] [-s siodev] [-t tundev] [-T] [-v verbosity] [-d delay] [-a serveraddress] [-p serverport] ipaddress", prog); + } + slip_config_ipaddr = argv[1]; + + switch(baudrate) { + case -2: + break; /* Use default. */ + case 9600: + slip_config_b_rate = B9600; + break; + case 19200: + slip_config_b_rate = B19200; + break; + case 38400: + slip_config_b_rate = B38400; + break; + case 57600: + slip_config_b_rate = B57600; + break; + case 115200: + slip_config_b_rate = B115200; + break; +#ifdef linux + case 921600: + slip_config_b_rate = B921600; + break; +#endif + default: + err(1, "unknown baudrate %d", baudrate); + break; + } + + if(*slip_config_tundev == '\0') { + /* Use default. */ + strcpy(slip_config_tundev, "tun0"); + } + return 1; +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/native-border-router/slip-dev.c b/examples/osd/native-border-router/slip-dev.c new file mode 100644 index 000000000..a38c6a0c3 --- /dev/null +++ b/examples/osd/native-border-router/slip-dev.c @@ -0,0 +1,546 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * Copyright (c) 2009, 2010 Joakim Eriksson, Niclas Finne, Dogan Yazar. + * 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. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + * + */ + + /* Below define allows importing saved output into Wireshark as "Raw IP" packet type */ +#define WIRESHARK_IMPORT_FORMAT 1 +#include "contiki.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "net/netstack.h" +#include "net/packetbuf.h" +#include "cmd.h" +#include "border-router-cmds.h" + +extern int slip_config_verbose; +extern int slip_config_flowcontrol; +extern const char *slip_config_siodev; +extern const char *slip_config_host; +extern const char *slip_config_port; +extern uint16_t slip_config_basedelay; +extern speed_t slip_config_b_rate; + +#ifdef SLIP_DEV_CONF_SEND_DELAY +#define SEND_DELAY SLIP_DEV_CONF_SEND_DELAY +#else +#define SEND_DELAY 0 +#endif + +int devopen(const char *dev, int flags); + +static FILE *inslip; + +/* for statistics */ +long slip_sent = 0; +long slip_received = 0; + +int slipfd = 0; + +//#define PROGRESS(s) fprintf(stderr, s) +#define PROGRESS(s) do { } while(0) + +#define SLIP_END 0300 +#define SLIP_ESC 0333 +#define SLIP_ESC_END 0334 +#define SLIP_ESC_ESC 0335 + +/*---------------------------------------------------------------------------*/ +static void * +get_in_addr(struct sockaddr *sa) +{ + if(sa->sa_family == AF_INET) { + return &(((struct sockaddr_in*)sa)->sin_addr); + } + return &(((struct sockaddr_in6*)sa)->sin6_addr); +} +/*---------------------------------------------------------------------------*/ +static int +connect_to_server(const char *host, const char *port) +{ + /* Setup TCP connection */ + struct addrinfo hints, *servinfo, *p; + char s[INET6_ADDRSTRLEN]; + int rv, fd; + + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + if((rv = getaddrinfo(host, port, &hints, &servinfo)) != 0) { + err(1, "getaddrinfo: %s", gai_strerror(rv)); + return -1; + } + + /* loop through all the results and connect to the first we can */ + for(p = servinfo; p != NULL; p = p->ai_next) { + if((fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { + perror("client: socket"); + continue; + } + + if(connect(fd, p->ai_addr, p->ai_addrlen) == -1) { + close(fd); + perror("client: connect"); + continue; + } + break; + } + + if(p == NULL) { + err(1, "can't connect to ``%s:%s''", host, port); + return -1; + } + + fcntl(fd, F_SETFL, O_NONBLOCK); + + inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr), + s, sizeof(s)); + + /* all done with this structure */ + freeaddrinfo(servinfo); + return fd; +} +/*---------------------------------------------------------------------------*/ +int +is_sensible_string(const unsigned char *s, int len) +{ + int i; + for(i = 1; i < len; i++) { + if(s[i] == 0 || s[i] == '\r' || s[i] == '\n' || s[i] == '\t') { + continue; + } else if(s[i] < ' ' || '~' < s[i]) { + return 0; + } + } + return 1; +} +/*---------------------------------------------------------------------------*/ +void +slip_packet_input(unsigned char *data, int len) +{ + packetbuf_copyfrom(data, len); + if(slip_config_verbose > 0) { + printf("Packet input over SLIP: %d\n", len); + } + NETSTACK_RDC.input(); +} +/*---------------------------------------------------------------------------*/ +/* + * Read from serial, when we have a packet call slip_packet_input. No output + * buffering, input buffered by stdio. + */ +void +serial_input(FILE *inslip) +{ + unsigned char inbuf[2048]; + static int inbufptr = 0; + int ret,i; + unsigned char c; + +#ifdef linux + ret = fread(&c, 1, 1, inslip); + if(ret == -1 || ret == 0) err(1, "serial_input: read"); + goto after_fread; +#endif + + read_more: + if(inbufptr >= sizeof(inbuf)) { + fprintf(stderr, "*** dropping large %d byte packet\n", inbufptr); + inbufptr = 0; + } + ret = fread(&c, 1, 1, inslip); +#ifdef linux + after_fread: +#endif + if(ret == -1) { + err(1, "serial_input: read"); + } + if(ret == 0) { + clearerr(inslip); + return; + } + slip_received++; + switch(c) { + case SLIP_END: + if(inbufptr > 0) { + if(inbuf[0] == '!') { + command_context = CMD_CONTEXT_RADIO; + cmd_input(inbuf, inbufptr); + } else if(inbuf[0] == '?') { +#define DEBUG_LINE_MARKER '\r' + } else if(inbuf[0] == DEBUG_LINE_MARKER) { + fwrite(inbuf + 1, inbufptr - 1, 1, stdout); + } else if(is_sensible_string(inbuf, inbufptr)) { + if(slip_config_verbose == 1) { /* strings already echoed below for verbose>1 */ + fwrite(inbuf, inbufptr, 1, stdout); + } + } else { + if(slip_config_verbose > 2) { + printf("Packet from SLIP of length %d - write TUN\n", inbufptr); + if(slip_config_verbose > 4) { +#if WIRESHARK_IMPORT_FORMAT + printf("0000"); + for(i = 0; i < inbufptr; i++) printf(" %02x", inbuf[i]); +#else + printf(" "); + for(i = 0; i < inbufptr; i++) { + printf("%02x", inbuf[i]); + if((i & 3) == 3) printf(" "); + if((i & 15) == 15) printf("\n "); + } +#endif + printf("\n"); + } + } + slip_packet_input(inbuf, inbufptr); + } + inbufptr = 0; + } + break; + + case SLIP_ESC: + if(fread(&c, 1, 1, inslip) != 1) { + clearerr(inslip); + /* Put ESC back and give up! */ + ungetc(SLIP_ESC, inslip); + return; + } + + switch(c) { + case SLIP_ESC_END: + c = SLIP_END; + break; + case SLIP_ESC_ESC: + c = SLIP_ESC; + break; + } + /* FALLTHROUGH */ + default: + inbuf[inbufptr++] = c; + + /* Echo lines as they are received for verbose=2,3,5+ */ + /* Echo all printable characters for verbose==4 */ + if(slip_config_verbose == 4) { + if(c == 0 || c == '\r' || c == '\n' || c == '\t' || (c >= ' ' && c <= '~')) { + fwrite(&c, 1, 1, stdout); + } + } else if(slip_config_verbose >= 2) { + if(c == '\n' && is_sensible_string(inbuf, inbufptr)) { + fwrite(inbuf, inbufptr, 1, stdout); + inbufptr = 0; + } + } + break; + } + + goto read_more; +} + +unsigned char slip_buf[2048]; +int slip_end, slip_begin, slip_packet_end, slip_packet_count; +static struct timer send_delay_timer; +/* delay between slip packets */ +static clock_time_t send_delay = SEND_DELAY; +/*---------------------------------------------------------------------------*/ +static void +slip_send(int fd, unsigned char c) +{ + if(slip_end >= sizeof(slip_buf)) { + err(1, "slip_send overflow"); + } + slip_buf[slip_end] = c; + slip_end++; + slip_sent++; + if(c == SLIP_END) { + /* Full packet received. */ + slip_packet_count++; + if(slip_packet_end == 0) { + slip_packet_end = slip_end; + } + } +} +/*---------------------------------------------------------------------------*/ +int +slip_empty() +{ + return slip_packet_end == 0; +} +/*---------------------------------------------------------------------------*/ +void +slip_flushbuf(int fd) +{ + int n; + + if(slip_empty()) { + return; + } + + n = write(fd, slip_buf + slip_begin, slip_packet_end - slip_begin); + + if(n == -1 && errno != EAGAIN) { + err(1, "slip_flushbuf write failed"); + } else if(n == -1) { + PROGRESS("Q"); /* Outqueue is full! */ + } else { + slip_begin += n; + if(slip_begin == slip_packet_end) { + slip_packet_count--; + if(slip_end > slip_packet_end) { + memcpy(slip_buf, slip_buf + slip_packet_end, + slip_end - slip_packet_end); + } + slip_end -= slip_packet_end; + slip_begin = slip_packet_end = 0; + if(slip_end > 0) { + /* Find end of next slip packet */ + for(n = 1; n < slip_end; n++) { + if(slip_buf[n] == SLIP_END) { + slip_packet_end = n + 1; + break; + } + } + /* a delay between slip packets to avoid losing data */ + if(send_delay > 0) { + timer_set(&send_delay_timer, send_delay); + } + } + } + } +} +/*---------------------------------------------------------------------------*/ +static void +write_to_serial(int outfd, const uint8_t *inbuf, int len) +{ + const uint8_t *p = inbuf; + int i; + + if(slip_config_verbose > 2) { +#ifdef __CYGWIN__ + printf("Packet from WPCAP of length %d - write SLIP\n", len); +#else + printf("Packet from TUN of length %d - write SLIP\n", len); +#endif + if(slip_config_verbose > 4) { +#if WIRESHARK_IMPORT_FORMAT + printf("0000"); + for(i = 0; i < len; i++) printf(" %02x", p[i]); +#else + printf(" "); + for(i = 0; i < len; i++) { + printf("%02x", p[i]); + if((i & 3) == 3) printf(" "); + if((i & 15) == 15) printf("\n "); + } +#endif + printf("\n"); + } + } + + /* It would be ``nice'' to send a SLIP_END here but it's not + * really necessary. + */ + /* slip_send(outfd, SLIP_END); */ + + for(i = 0; i < len; i++) { + switch(p[i]) { + case SLIP_END: + slip_send(outfd, SLIP_ESC); + slip_send(outfd, SLIP_ESC_END); + break; + case SLIP_ESC: + slip_send(outfd, SLIP_ESC); + slip_send(outfd, SLIP_ESC_ESC); + break; + default: + slip_send(outfd, p[i]); + break; + } + } + slip_send(outfd, SLIP_END); + PROGRESS("t"); +} +/*---------------------------------------------------------------------------*/ +/* writes an 802.15.4 packet to slip-radio */ +void +write_to_slip(const uint8_t *buf, int len) +{ + if(slipfd > 0) { + write_to_serial(slipfd, buf, len); + } +} +/*---------------------------------------------------------------------------*/ +static void +stty_telos(int fd) +{ + struct termios tty; + speed_t speed = slip_config_b_rate; + int i; + + if(tcflush(fd, TCIOFLUSH) == -1) err(1, "tcflush"); + + if(tcgetattr(fd, &tty) == -1) err(1, "tcgetattr"); + + cfmakeraw(&tty); + + /* Nonblocking read. */ + tty.c_cc[VTIME] = 0; + tty.c_cc[VMIN] = 0; + if(slip_config_flowcontrol) { + tty.c_cflag |= CRTSCTS; + } else { + tty.c_cflag &= ~CRTSCTS; + } + tty.c_cflag &= ~HUPCL; + tty.c_cflag &= ~CLOCAL; + + cfsetispeed(&tty, speed); + cfsetospeed(&tty, speed); + + if(tcsetattr(fd, TCSAFLUSH, &tty) == -1) err(1, "tcsetattr"); + +#if 1 + /* Nonblocking read and write. */ + /* if(fcntl(fd, F_SETFL, O_NONBLOCK) == -1) err(1, "fcntl"); */ + + tty.c_cflag |= CLOCAL; + if(tcsetattr(fd, TCSAFLUSH, &tty) == -1) err(1, "tcsetattr"); + + i = TIOCM_DTR; + if(ioctl(fd, TIOCMBIS, &i) == -1) err(1, "ioctl"); +#endif + + usleep(10*1000); /* Wait for hardware 10ms. */ + + /* Flush input and output buffers. */ + if(tcflush(fd, TCIOFLUSH) == -1) err(1, "tcflush"); +} +/*---------------------------------------------------------------------------*/ +static int +set_fd(fd_set *rset, fd_set *wset) +{ + /* Anything to flush? */ + if(!slip_empty() && (send_delay == 0 || timer_expired(&send_delay_timer))) { + FD_SET(slipfd, wset); + } + + FD_SET(slipfd, rset); /* Read from slip ASAP! */ + return 1; +} +/*---------------------------------------------------------------------------*/ +static void +handle_fd(fd_set *rset, fd_set *wset) +{ + if(FD_ISSET(slipfd, rset)) { + serial_input(inslip); + } + + if(FD_ISSET(slipfd, wset)) { + slip_flushbuf(slipfd); + } +} +/*---------------------------------------------------------------------------*/ +static const struct select_callback slip_callback = { set_fd, handle_fd }; +/*---------------------------------------------------------------------------*/ +void +slip_init(void) +{ + setvbuf(stdout, NULL, _IOLBF, 0); /* Line buffered output. */ + + if(slip_config_host != NULL) { + if(slip_config_port == NULL) { + slip_config_port = "60001"; + } + slipfd = connect_to_server(slip_config_host, slip_config_port); + if(slipfd == -1) { + err(1, "can't connect to ``%s:%s''", slip_config_host, slip_config_port); + } + + } else if(slip_config_siodev != NULL) { + if(strcmp(slip_config_siodev, "null") == 0) { + /* Disable slip */ + return; + } + slipfd = devopen(slip_config_siodev, O_RDWR | O_NONBLOCK); + if(slipfd == -1) { + err(1, "can't open siodev ``/dev/%s''", slip_config_siodev); + } + + } else { + static const char *siodevs[] = { + "ttyUSB0", "cuaU0", "ucom0" /* linux, fbsd6, fbsd5 */ + }; + int i; + for(i = 0; i < 3; i++) { + slip_config_siodev = siodevs[i]; + slipfd = devopen(slip_config_siodev, O_RDWR | O_NONBLOCK); + if(slipfd != -1) { + break; + } + } + if(slipfd == -1) { + err(1, "can't open siodev"); + } + } + + select_set_callback(slipfd, &slip_callback); + + if(slip_config_host != NULL) { + fprintf(stderr, "********SLIP opened to ``%s:%s''\n", slip_config_host, + slip_config_port); + } else { + fprintf(stderr, "********SLIP started on ``/dev/%s''\n", slip_config_siodev); + stty_telos(slipfd); + } + + timer_set(&send_delay_timer, 0); + slip_send(slipfd, SLIP_END); + inslip = fdopen(slipfd, "r"); + if(inslip == NULL) { + err(1, "main: fdopen"); + } +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/osd/native-border-router/tun-bridge.c b/examples/osd/native-border-router/tun-bridge.c new file mode 100644 index 000000000..970b4cc79 --- /dev/null +++ b/examples/osd/native-border-router/tun-bridge.c @@ -0,0 +1,311 @@ +/* + * 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. + */ + +/** + * \author + * Niclas Finne + * Joakim Eriksson + */ + +#include "net/uip.h" +#include "net/uip-ds6.h" +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +#define DEBUG DEBUG_NONE +#include "net/uip-debug.h" + +#ifdef linux +#include +#include +#endif + +#include +#include "net/netstack.h" +#include "net/packetbuf.h" +#include "cmd.h" +#include "border-router.h" + +extern const char *slip_config_ipaddr; +extern char slip_config_tundev[32]; +extern uint16_t slip_config_basedelay; + +#ifndef __CYGWIN__ +static int tunfd; + +static int set_fd(fd_set *rset, fd_set *wset); +static void handle_fd(fd_set *rset, fd_set *wset); +static const struct select_callback tun_select_callback = { + set_fd, + handle_fd +}; +#endif /* __CYGWIN__ */ + +int ssystem(const char *fmt, ...) + __attribute__((__format__ (__printf__, 1, 2))); +int +ssystem(const char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2))); + +int +ssystem(const char *fmt, ...) +{ + char cmd[128]; + va_list ap; + va_start(ap, fmt); + vsnprintf(cmd, sizeof(cmd), fmt, ap); + va_end(ap); + printf("%s\n", cmd); + fflush(stdout); + return system(cmd); +} + +/*---------------------------------------------------------------------------*/ +void +cleanup(void) +{ + ssystem("ifconfig %s down", slip_config_tundev); +#ifndef linux + ssystem("sysctl -w net.ipv6.conf.all.forwarding=1"); +#endif + ssystem("netstat -nr" + " | awk '{ if ($2 == \"%s\") print \"route delete -net \"$1; }'" + " | sh", + slip_config_tundev); +} + +/*---------------------------------------------------------------------------*/ +void +sigcleanup(int signo) +{ + fprintf(stderr, "signal %d\n", signo); + exit(0); /* exit(0) will call cleanup() */ +} + +/*---------------------------------------------------------------------------*/ +void +ifconf(const char *tundev, const char *ipaddr) +{ +#ifdef linux + ssystem("ifconfig %s inet `hostname` up", tundev); + ssystem("ifconfig %s add %s", tundev, ipaddr); +#elif defined(__APPLE__) + ssystem("ifconfig %s inet6 %s up", tundev, ipaddr); + ssystem("sysctl -w net.inet.ip.forwarding=1"); +#else + ssystem("ifconfig %s inet `hostname` %s up", tundev, ipaddr); + ssystem("sysctl -w net.inet.ip.forwarding=1"); +#endif /* !linux */ + + /* Print the configuration to the console. */ + ssystem("ifconfig %s\n", tundev); +} +/*---------------------------------------------------------------------------*/ +int +devopen(const char *dev, int flags) +{ + char t[32]; + strcpy(t, "/dev/"); + strncat(t, dev, sizeof(t) - 5); + return open(t, flags); +} +/*---------------------------------------------------------------------------*/ +#ifdef linux +int +tun_alloc(char *dev) +{ + struct ifreq ifr; + int fd, err; + + if( (fd = open("/dev/net/tun", O_RDWR)) < 0 ) { + return -1; + } + + memset(&ifr, 0, sizeof(ifr)); + + /* Flags: IFF_TUN - TUN device (no Ethernet headers) + * IFF_NO_PI - Do not provide packet information + */ + ifr.ifr_flags = IFF_TUN | IFF_NO_PI; + if(*dev != 0) + strncpy(ifr.ifr_name, dev, IFNAMSIZ); + + if((err = ioctl(fd, TUNSETIFF, (void *) &ifr)) < 0 ) { + close(fd); + return err; + } + strcpy(dev, ifr.ifr_name); + return fd; +} +#else +int +tun_alloc(char *dev) +{ + return devopen(dev, O_RDWR); +} +#endif + +#ifdef __CYGWIN__ +/*wpcap process is used to connect to host interface */ +void +tun_init() +{ + setvbuf(stdout, NULL, _IOLBF, 0); /* Line buffered output. */ + + slip_init(); +} + +#else + +static uint16_t delaymsec=0; +static uint32_t delaystartsec,delaystartmsec; + +/*---------------------------------------------------------------------------*/ +void +tun_init() +{ + setvbuf(stdout, NULL, _IOLBF, 0); /* Line buffered output. */ + + slip_init(); + + tunfd = tun_alloc(slip_config_tundev); + if(tunfd == -1) err(1, "main: open"); + + select_set_callback(tunfd, &tun_select_callback); + + fprintf(stderr, "opened %s device ``/dev/%s''\n", + "tun", slip_config_tundev); + + atexit(cleanup); + signal(SIGHUP, sigcleanup); + signal(SIGTERM, sigcleanup); + signal(SIGINT, sigcleanup); + ifconf(slip_config_tundev, slip_config_ipaddr); +} + +/*---------------------------------------------------------------------------*/ +void +tun_output(uint8_t *data, int len) +{ + /* fprintf(stderr, "*** Writing to tun...%d\n", len); */ + if(write(tunfd, data, len) != len) { + err(1, "serial_to_tun: write"); + } +} +/*---------------------------------------------------------------------------*/ +int +tun_input(unsigned char *data, int maxlen) +{ + int size; + if((size = read(tunfd, data, maxlen)) == -1) + err(1, "tun_input: read"); + return size; +} + +/*---------------------------------------------------------------------------*/ +static void +init(void) +{ +} +/*---------------------------------------------------------------------------*/ +static void +output(void) +{ + PRINTF("SUT: %u\n", uip_len); + if(uip_len > 0) { + tun_output(&uip_buf[UIP_LLH_LEN], uip_len); + } +} + + +const struct uip_fallback_interface rpl_interface = { + init, output +}; + +/*---------------------------------------------------------------------------*/ +/* tun and slip select callback */ +/*---------------------------------------------------------------------------*/ +static int +set_fd(fd_set *rset, fd_set *wset) +{ + FD_SET(tunfd, rset); + return 1; +} + +/*---------------------------------------------------------------------------*/ + +static void +handle_fd(fd_set *rset, fd_set *wset) +{ + /* Optional delay between outgoing packets */ + /* Base delay times number of 6lowpan fragments to be sent */ + /* delaymsec = 10; */ + if(delaymsec) { + struct timeval tv; + int dmsec; + gettimeofday(&tv, NULL); + dmsec=(tv.tv_sec-delaystartsec)*1000+tv.tv_usec/1000-delaystartmsec; + if(dmsec<0) delaymsec=0; + if(dmsec>delaymsec) delaymsec=0; + } + + if(delaymsec==0) { + int size; + + if(FD_ISSET(tunfd, rset)) { + size = tun_input(&uip_buf[UIP_LLH_LEN], sizeof(uip_buf)); + /* printf("TUN data incoming read:%d\n", size); */ + uip_len = size; + tcpip_input(); + + if(slip_config_basedelay) { + struct timeval tv; + gettimeofday(&tv, NULL) ; + delaymsec=slip_config_basedelay; + delaystartsec =tv.tv_sec; + delaystartmsec=tv.tv_usec/1000; + } + } + } +} +#endif /* __CYGWIN_ */ + +/*---------------------------------------------------------------------------*/ From 85fb0b1e4821e04d28a7c83b66cdbf95e1a149ca Mon Sep 17 00:00:00 2001 From: Andreas Reder Date: Wed, 20 Mar 2013 07:46:23 +0100 Subject: [PATCH 045/345] added info resource --- .../osd/native-border-router/border-router.c | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/examples/osd/native-border-router/border-router.c b/examples/osd/native-border-router/border-router.c index 281b2e27d..0284573b5 100644 --- a/examples/osd/native-border-router/border-router.c +++ b/examples/osd/native-border-router/border-router.c @@ -400,6 +400,36 @@ rpl_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s } } + +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* +* A handler function named [resource name]_handler must be implemented for each RESOURCE. +* A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore +* preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. +* If a smaller block size is requested for CoAP, the REST framework automatically splits the data. +*/ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.1\",\n"); + index += sprintf(message + index," \"name\" : \"native coap router\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} + + RESOURCE(osd_net_conf, METHOD_GET | METHOD_POST, "osd-net-conf", "title=\"osd configs\""); void osd_net_conf_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -470,6 +500,7 @@ PROCESS_THREAD(rest_server, ev, data) /* Activate the application-specific resources. */ rest_activate_resource(&resource_rpl); rest_activate_resource(&resource_osd_net_conf); + rest_activate_resource(&resource_info); while(1) { PROCESS_YIELD(); From 8d5f623b6afda712f41a8a69e6d074ed43c768ea Mon Sep 17 00:00:00 2001 From: Andreas Reder Date: Wed, 20 Mar 2013 07:56:40 +0100 Subject: [PATCH 046/345] turned off debugging --- examples/osd/slip-radio/slip-radio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/osd/slip-radio/slip-radio.c b/examples/osd/slip-radio/slip-radio.c index d55ab2831..529f19cfd 100644 --- a/examples/osd/slip-radio/slip-radio.c +++ b/examples/osd/slip-radio/slip-radio.c @@ -43,7 +43,7 @@ #include "net/netstack.h" #include "net/packetbuf.h" -#define DEBUG DEBUG_FULL +#define DEBUG DEBUG_NONE #include "net/uip-debug.h" #include "cmd.h" #include "slip-radio.h" @@ -150,7 +150,7 @@ slip_radio_cmd_handler(const uint8_t *data, int len) return 1; } else if( data[1] == 'P'){ panid = (data[2] << 8) + data[3]; - PRINTF("slip-radio: received change panid command, new panid %u\n", len); + PRINTF("slip-radio: received change panid command, new panid %u\n", panid); cli(); eeprom_write_word(&eemem_panid, panid); sei(); From 8cdf981c8faf3e6e8c0f94783aeeee4619780023 Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 27 Mar 2013 10:41:19 +0100 Subject: [PATCH 047/345] add debug led code --- examples/osd/light-actor/er-example-server.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c index 9724b91ae..f3aca511f 100644 --- a/examples/osd/light-actor/er-example-server.c +++ b/examples/osd/light-actor/er-example-server.c @@ -179,9 +179,12 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ if (!strcmp(mode, "on")) { led1_on(); led1 = 1; + optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + } else if (!strcmp(mode, "off")) { led1_off(); led1 = 0; + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); } else { success = 0; } @@ -266,9 +269,9 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if (strncmp(type, "a", len)==0) { triac = OPTRIAC_SENSOR_A; } else if(strncmp(type,"b", len)==0) { - triac = OPTRIAC_SENSOR_A; + triac = OPTRIAC_SENSOR_B; } else { - success = 0; + triac = OPTRIAC_SENSOR_A; } } else { success = 0; @@ -279,8 +282,12 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if (strncmp(mode, "on", len)==0) { optriac_sensor.configure(triac,1); + led1_on(); + led1 = 1; } else if (strncmp(mode, "off", len)==0) { optriac_sensor.configure(triac,1); + led1_off(); + led1 = 0; } else { success = 0; } From 6d30a5b66ed3a3d30e54ef2f6beb2ad8949a73b2 Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 27 Mar 2013 13:00:47 +0100 Subject: [PATCH 048/345] add relay --- examples/osd/wirelessplug/Makefile | 3 +- examples/osd/wirelessplug/er-example-server.c | 15 ++-- examples/osd/wirelessplug/relay.c | 70 +++++++++++++++++++ examples/osd/wirelessplug/relay.h | 52 ++++++++++++++ 4 files changed, 132 insertions(+), 8 deletions(-) create mode 100644 examples/osd/wirelessplug/relay.c create mode 100644 examples/osd/wirelessplug/relay.h diff --git a/examples/osd/wirelessplug/Makefile b/examples/osd/wirelessplug/Makefile index ea3722d59..c05b6890b 100644 --- a/examples/osd/wirelessplug/Makefile +++ b/examples/osd/wirelessplug/Makefile @@ -1,4 +1,4 @@ -all: er-example-server er-example-client +all: er-example-server # Use this target explicitly if requried: er-plugtest-server CONTIKI=../../.. @@ -13,6 +13,7 @@ endif endif endif +PROJECT_SOURCEFILES += relay.c # variable for root Makefile.include WITH_UIP6=1 # for some platforms diff --git a/examples/osd/wirelessplug/er-example-server.c b/examples/osd/wirelessplug/er-example-server.c index f72739fe0..23751d68c 100644 --- a/examples/osd/wirelessplug/er-example-server.c +++ b/examples/osd/wirelessplug/er-example-server.c @@ -93,6 +93,7 @@ #include "dev/radio-sensor.h" #endif +#include "relay.h" /* For CoAP-specific example: not required for normal RESTful Web service. */ #if WITH_COAP == 3 @@ -164,7 +165,7 @@ void plug1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { char mode[10]; - static uint8_t led2 = 0; + static uint8_t relay1 = 0; static char name[17]="plug1"; int success = 1; @@ -179,9 +180,9 @@ plug1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred case METHOD_GET: // jSON Format index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); - if(led2 == 0) + if(relay1 == 0) index += sprintf(temp + index," \"mode\" : \"off\"\n"); - if(led2 == 1) + if(relay1 == 1) index += sprintf(temp + index," \"mode\" : \"on\"\n"); index += sprintf(temp + index,"}\n"); @@ -200,11 +201,11 @@ plug1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred memcpy(mode, pmode,len); mode[len]=0; if (!strcmp(mode, "on")) { - led2_on(); - led2 = 1; + relay1_on(); + relay1 = 1; } else if (!strcmp(mode, "off")) { - led2_off(); - led2 = 0; + relay1_off(); + relay1 = 0; } else { success = 0; } diff --git a/examples/osd/wirelessplug/relay.c b/examples/osd/wirelessplug/relay.c new file mode 100644 index 000000000..c432eae38 --- /dev/null +++ b/examples/osd/wirelessplug/relay.c @@ -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 "relay.h" + +/** + * \addtogroup relay + * \{ +*/ +/*---------------------------------------------------------------------------*/ + +/** + * \brief Turns the relay1 off. +*/ +void +relay1_off(void) +{ + DDRG |= (1< + +/** @name Relay Functions */ +/** @{ */ +void relay1_on(void); +void relay1_off(void); +/** @} */ + +#endif /* __RELAY_H__ */ From 0deca185bb402de25cdf2980dbfb73a25f6f1928 Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 28 Mar 2013 11:05:26 +0100 Subject: [PATCH 049/345] many bugfixes, add cputemp --- examples/osd/light-actor/er-example-server.c | 50 +++++-- examples/osd/light-actor/lall | 136 ------------------- examples/osd/light-actor/project-conf.h | 2 +- platform/osd-merkur/dev/optriac.c | 18 +-- platform/osd-merkur/dev/optriac.h | 8 +- 5 files changed, 54 insertions(+), 160 deletions(-) delete mode 100644 examples/osd/light-actor/lall diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c index f3aca511f..60b723ae5 100644 --- a/examples/osd/light-actor/er-example-server.c +++ b/examples/osd/light-actor/er-example-server.c @@ -47,7 +47,7 @@ /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 #define REST_RES_OPTRIAC 1 -#define REST_RES_TEMPERATURE 0 +#define REST_RES_TEMPERATURE 1 #define REST_RES_EVENT 0 #define REST_RES_LEDS 0 #define REST_RES_TOGGLE 0 @@ -77,6 +77,7 @@ #include "dev/battery-sensor.h" #endif +#include "dev/optriac.h" /* For CoAP-specific example: not required for normal RESTful Web service. */ #if WITH_COAP == 3 @@ -179,12 +180,9 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ if (!strcmp(mode, "on")) { led1_on(); led1 = 1; - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); - } else if (!strcmp(mode, "off")) { led1_off(); led1 = 0; - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); } else { success = 0; } @@ -252,17 +250,48 @@ pir_event_handler(resource_t *r) /******************************************************************************/ #if REST_RES_OPTRIAC /*A simple actuator example*/ -RESOURCE(optriac, METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\""); +RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\""); void optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { - size_t len = 0; const char *type = NULL; const char *mode = NULL; + static char namea[17]="Triac-a"; + static char nameb[17]="Triac-b"; + + char temp[100]; + int index = 0; + size_t len = 0; + uint8_t triac = 0; int success = 1; + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"%s\" : ",namea); + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0) + index += sprintf(temp + index,"\"off\",\n"); + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1) + index += sprintf(temp + index,"\"on\",\n"); + index += sprintf(temp + index," \"%s\" : ",nameb); + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0) + index += sprintf(temp + index,"\"off\"\n"); + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1) + index += sprintf(temp + index,"\"on\"\n"); + index += sprintf(temp + index,"}\n"); + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: if ((len=REST.get_query_variable(request, "type", &type))) { PRINTF("type %.*s\n", len, type); @@ -283,18 +312,19 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if (strncmp(mode, "on", len)==0) { optriac_sensor.configure(triac,1); led1_on(); - led1 = 1; } else if (strncmp(mode, "off", len)==0) { - optriac_sensor.configure(triac,1); + optriac_sensor.configure(triac,0); led1_off(); - led1 = 0; } else { success = 0; } } else { success = 0; } - + break; + default: + success = 0; + } if (!success) { REST.set_response_status(response, REST.status.BAD_REQUEST); } diff --git a/examples/osd/light-actor/lall b/examples/osd/light-actor/lall deleted file mode 100644 index 8e7db9ece..000000000 --- a/examples/osd/light-actor/lall +++ /dev/null @@ -1,136 +0,0 @@ -INFO: compiling with CoAP-08 -rm -f *~ *core core *.srec \ - *.lst *.map \ - *.cprg *.bin *.data contiki*.a *.firmware core-labels.S *.ihex *.ini \ - *.ce *.co -rm -rf obj_osd-merkur -INFO: compiling with CoAP-08 -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rime/rimeaddr.c -o obj_osd-merkur/rimeaddr.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rime/timesynch.c -o obj_osd-merkur/timesynch.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rime/rimestats.c -o obj_osd-merkur/rimestats.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/cxmac.c -o obj_osd-merkur/cxmac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/xmac.c -o obj_osd-merkur/xmac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/nullmac.c -o obj_osd-merkur/nullmac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/lpp.c -o obj_osd-merkur/lpp.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/frame802154.c -o obj_osd-merkur/frame802154.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/sicslowmac.c -o obj_osd-merkur/sicslowmac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/nullrdc.c -o obj_osd-merkur/nullrdc.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/nullrdc-noframer.c -o obj_osd-merkur/nullrdc-noframer.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/mac.c -o obj_osd-merkur/mac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/framer-nullmac.c -o obj_osd-merkur/framer-nullmac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/framer-802154.c -o obj_osd-merkur/framer-802154.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/csma.c -o obj_osd-merkur/csma.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/contikimac.c -o obj_osd-merkur/contikimac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/mac/phase.c -o obj_osd-merkur/phase.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl.c -o obj_osd-merkur/rpl.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-dag.c -o obj_osd-merkur/rpl-dag.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-icmp6.c -o obj_osd-merkur/rpl-icmp6.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-timers.c -o obj_osd-merkur/rpl-timers.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-of-etx.c -o obj_osd-merkur/rpl-of-etx.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/rpl/rpl-ext-header.c -o obj_osd-merkur/rpl-ext-header.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/process.c -o obj_osd-merkur/process.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/procinit.c -o obj_osd-merkur/procinit.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/autostart.c -o obj_osd-merkur/autostart.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/loader/elfloader.c -o obj_osd-merkur/elfloader.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/profile.c -o obj_osd-merkur/profile.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/timetable.c -o obj_osd-merkur/timetable.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/timetable-aggregate.c -o obj_osd-merkur/timetable-aggregate.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/compower.c -o obj_osd-merkur/compower.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/serial-line.c -o obj_osd-merkur/serial-line.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/memb.c -o obj_osd-merkur/memb.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/mmem.c -o obj_osd-merkur/mmem.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/timer.c -o obj_osd-merkur/timer.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/list.c -o obj_osd-merkur/list.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/etimer.c -o obj_osd-merkur/etimer.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/ctimer.c -o obj_osd-merkur/ctimer.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/energest.c -o obj_osd-merkur/energest.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/rtimer.c -o obj_osd-merkur/rtimer.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/stimer.c -o obj_osd-merkur/stimer.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/print-stats.c -o obj_osd-merkur/print-stats.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/ifft.c -o obj_osd-merkur/ifft.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/crc16.c -o obj_osd-merkur/crc16.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/random.c -o obj_osd-merkur/random.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/checkpoint.c -o obj_osd-merkur/checkpoint.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/ringbuf.c -o obj_osd-merkur/ringbuf.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/netstack.c -o obj_osd-merkur/netstack.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-debug.c -o obj_osd-merkur/uip-debug.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/packetbuf.c -o obj_osd-merkur/packetbuf.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/queuebuf.c -o obj_osd-merkur/queuebuf.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/packetqueue.c -o obj_osd-merkur/packetqueue.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip6.c -o obj_osd-merkur/uip6.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/tcpip.c -o obj_osd-merkur/tcpip.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/psock.c -o obj_osd-merkur/psock.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-udp-packet.c -o obj_osd-merkur/uip-udp-packet.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-split.c -o obj_osd-merkur/uip-split.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/resolv.c -o obj_osd-merkur/resolv.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/tcpdump.c -o obj_osd-merkur/tcpdump.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uiplib.c -o obj_osd-merkur/uiplib.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/simple-udp.c -o obj_osd-merkur/simple-udp.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-icmp6.c -o obj_osd-merkur/uip-icmp6.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-nd6.c -o obj_osd-merkur/uip-nd6.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-packetqueue.c -o obj_osd-merkur/uip-packetqueue.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/sicslowpan.c -o obj_osd-merkur/sicslowpan.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/neighbor-attr.c -o obj_osd-merkur/neighbor-attr.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/neighbor-info.c -o obj_osd-merkur/neighbor-info.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-ds6.c -o obj_osd-merkur/uip-ds6.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/net/uip-ds6-route.c -o obj_osd-merkur/uip-ds6-route.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/sys/mt.c -o obj_osd-merkur/mt.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/nullradio.c -o obj_osd-merkur/nullradio.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-engine.c -o obj_osd-merkur/er-coap-07-engine.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07.c -o obj_osd-merkur/er-coap-07.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-transactions.c -o obj_osd-merkur/er-coap-07-transactions.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-observing.c -o obj_osd-merkur/er-coap-07-observing.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/er-coap-07/er-coap-07-separate.c -o obj_osd-merkur/er-coap-07-separate.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../apps/erbium/erbium.c -o obj_osd-merkur/erbium.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./contiki-main.c -o obj_osd-merkur/contiki-main.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./params.c -o obj_osd-merkur/params.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./node-id.c -o obj_osd-merkur/node-id.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/temperature-sensor.c -o obj_osd-merkur/temperature-sensor.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/adc.c -o obj_osd-merkur/adc.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/led.c -o obj_osd-merkur/led.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/lib/sensors.c -o obj_osd-merkur/sensors.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/./slip_uart0.c -o obj_osd-merkur/slip_uart0.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/slip.c -o obj_osd-merkur/slip.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/button-sensor.c -o obj_osd-merkur/button-sensor.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/dht11.c -o obj_osd-merkur/dht11.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/ds1820.c -o obj_osd-merkur/ds1820.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/battery-sensor.c -o obj_osd-merkur/battery-sensor.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/pir-sensor.c -o obj_osd-merkur/pir-sensor.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/optriac.c -o obj_osd-merkur/optriac.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/optriac-sensor.c -o obj_osd-merkur/optriac-sensor.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/servo.c -o obj_osd-merkur/servo.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/servo-sensor.c -o obj_osd-merkur/servo-sensor.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/clock.c -o obj_osd-merkur/clock.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./mtarch.c -o obj_osd-merkur/mtarch.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/eeprom.c -o obj_osd-merkur/eeprom.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/flash.c -o obj_osd-merkur/flash.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/dev/rs232.c -o obj_osd-merkur/rs232.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../platform/osd-merkur/dev/leds-arch.c -o obj_osd-merkur/leds-arch.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./watchdog.c -o obj_osd-merkur/watchdog.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./rtimer-arch.c -o obj_osd-merkur/rtimer-arch.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./bootloader.c -o obj_osd-merkur/bootloader.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/./settings.c -o obj_osd-merkur/settings.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/loader/elfloader-avr.c -o obj_osd-merkur/elfloader-avr.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/loader/symtab-avr.c -o obj_osd-merkur/symtab-avr.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../core/dev/leds.c -o obj_osd-merkur/leds.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/radio/rf230bb/rf230bb.c -o obj_osd-merkur/rf230bb.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c ../../../cpu/avr/radio/rf230bb/halbb.c -o obj_osd-merkur/halbb.o -avr-ar rcf contiki-osd-merkur.a obj_osd-merkur/rimeaddr.o obj_osd-merkur/timesynch.o obj_osd-merkur/rimestats.o obj_osd-merkur/cxmac.o obj_osd-merkur/xmac.o obj_osd-merkur/nullmac.o obj_osd-merkur/lpp.o obj_osd-merkur/frame802154.o obj_osd-merkur/sicslowmac.o obj_osd-merkur/nullrdc.o obj_osd-merkur/nullrdc-noframer.o obj_osd-merkur/mac.o obj_osd-merkur/framer-nullmac.o obj_osd-merkur/framer-802154.o obj_osd-merkur/csma.o obj_osd-merkur/contikimac.o obj_osd-merkur/phase.o obj_osd-merkur/rpl.o obj_osd-merkur/rpl-dag.o obj_osd-merkur/rpl-icmp6.o obj_osd-merkur/rpl-timers.o obj_osd-merkur/rpl-of-etx.o obj_osd-merkur/rpl-ext-header.o obj_osd-merkur/process.o obj_osd-merkur/procinit.o obj_osd-merkur/autostart.o obj_osd-merkur/elfloader.o obj_osd-merkur/profile.o obj_osd-merkur/timetable.o obj_osd-merkur/timetable-aggregate.o obj_osd-merkur/compower.o obj_osd-merkur/serial-line.o obj_osd-merkur/memb.o obj_osd-merkur/mmem.o obj_osd-merkur/timer.o obj_osd-merkur/list.o obj_osd-merkur/etimer.o obj_osd-merkur/ctimer.o obj_osd-merkur/energest.o obj_osd-merkur/rtimer.o obj_osd-merkur/stimer.o obj_osd-merkur/print-stats.o obj_osd-merkur/ifft.o obj_osd-merkur/crc16.o obj_osd-merkur/random.o obj_osd-merkur/checkpoint.o obj_osd-merkur/ringbuf.o obj_osd-merkur/netstack.o obj_osd-merkur/uip-debug.o obj_osd-merkur/packetbuf.o obj_osd-merkur/queuebuf.o obj_osd-merkur/packetqueue.o obj_osd-merkur/uip6.o obj_osd-merkur/tcpip.o obj_osd-merkur/psock.o obj_osd-merkur/uip-udp-packet.o obj_osd-merkur/uip-split.o obj_osd-merkur/resolv.o obj_osd-merkur/tcpdump.o obj_osd-merkur/uiplib.o obj_osd-merkur/simple-udp.o obj_osd-merkur/uip-icmp6.o obj_osd-merkur/uip-nd6.o obj_osd-merkur/uip-packetqueue.o obj_osd-merkur/sicslowpan.o obj_osd-merkur/neighbor-attr.o obj_osd-merkur/neighbor-info.o obj_osd-merkur/uip-ds6.o obj_osd-merkur/uip-ds6-route.o obj_osd-merkur/mt.o obj_osd-merkur/nullradio.o obj_osd-merkur/er-coap-07-engine.o obj_osd-merkur/er-coap-07.o obj_osd-merkur/er-coap-07-transactions.o obj_osd-merkur/er-coap-07-observing.o obj_osd-merkur/er-coap-07-separate.o obj_osd-merkur/erbium.o obj_osd-merkur/contiki-main.o obj_osd-merkur/params.o obj_osd-merkur/node-id.o obj_osd-merkur/temperature-sensor.o obj_osd-merkur/adc.o obj_osd-merkur/led.o obj_osd-merkur/sensors.o obj_osd-merkur/slip_uart0.o obj_osd-merkur/slip.o obj_osd-merkur/button-sensor.o obj_osd-merkur/dht11.o obj_osd-merkur/ds1820.o obj_osd-merkur/battery-sensor.o obj_osd-merkur/pir-sensor.o obj_osd-merkur/optriac.o obj_osd-merkur/optriac-sensor.o obj_osd-merkur/servo.o obj_osd-merkur/servo-sensor.o obj_osd-merkur/clock.o obj_osd-merkur/mtarch.o obj_osd-merkur/eeprom.o obj_osd-merkur/flash.o obj_osd-merkur/rs232.o obj_osd-merkur/leds-arch.o obj_osd-merkur/watchdog.o obj_osd-merkur/rtimer-arch.o obj_osd-merkur/bootloader.o obj_osd-merkur/settings.o obj_osd-merkur/elfloader-avr.o obj_osd-merkur/symtab-avr.o obj_osd-merkur/leds.o obj_osd-merkur/rf230bb.o obj_osd-merkur/halbb.o -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -DAUTOSTART_ENABLE -c er-example-server.c -o er-example-server.co -avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-v1.0.0-3-g0cd7d34\" -MMD -c static-routing.c -o obj_osd-merkur/static-routing.o -avr-gcc -mmcu=atmega128rfa1 -Wl,-Map=contiki-osd-merkur.map -Wl,--section-start=.bootloader=0x1F000 er-example-server.co obj_osd-merkur/static-routing.o contiki-osd-merkur.a -o er-example-server.osd-merkur -rm obj_osd-merkur/static-routing.o er-example-server.co -AVR Memory Usage ----------------- -Device: Unknown - -Program: 70146 bytes -(.text + .data + .bootloader) - -Data: 12254 bytes -(.data + .bss + .noinit) - -EEPROM: 41 bytes -(.eeprom) - - diff --git a/examples/osd/light-actor/project-conf.h b/examples/osd/light-actor/project-conf.h index d69ee0868..8fa6196a2 100644 --- a/examples/osd/light-actor/project-conf.h +++ b/examples/osd/light-actor/project-conf.h @@ -35,7 +35,7 @@ //#define PLATFORM_HAS_LEDS 1 //#define PLATFORM_HAS_BUTTON 1 #define PLATFORM_HAS_OPTRIAC 1 -//#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 #define SICSLOWPAN_CONF_FRAG 1 diff --git a/platform/osd-merkur/dev/optriac.c b/platform/osd-merkur/dev/optriac.c index a477287b5..e26c5da5a 100644 --- a/platform/osd-merkur/dev/optriac.c +++ b/platform/osd-merkur/dev/optriac.c @@ -47,22 +47,22 @@ /*---------------------------------------------------------------------------*/ /** - * \brief Turns the TRIAC 1 on. + * \brief Turns the TRIAC 1 off. */ void -optriac1_on(void) +optriac1_off(void) { - DDRE |= (1< -/** @name LED Functions */ +/** @name TRIAC Functions */ /** @{ */ void optriac1_on(void); void optriac1_off(void); @@ -51,4 +51,4 @@ void optriac2_on(void); void optriac2_off(void); /** @} */ -#endif /* __LED_H__ */ +#endif /* __TRIAC_H__ */ From 3d10f4d0d18615c82844e0ccd8d92bcbd36f7d6e Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 4 Apr 2013 13:03:18 +0200 Subject: [PATCH 050/345] timer4 servo pwm from Priesch Markus --- examples/osd/servo-sensor/er-example-server.c | 92 ++++++++++++++++++- examples/osd/servo-sensor/flash.sh | 2 +- examples/osd/servo-sensor/project-conf.h | 9 +- platform/osd-merkur/Makefile.osd-merkur | 2 + 4 files changed, 100 insertions(+), 5 deletions(-) diff --git a/examples/osd/servo-sensor/er-example-server.c b/examples/osd/servo-sensor/er-example-server.c index 86d1293e4..d8e2b436f 100644 --- a/examples/osd/servo-sensor/er-example-server.c +++ b/examples/osd/servo-sensor/er-example-server.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Matthias Kovatsch and other contributors. + * Copyright (C) 2011-2013, Matthias Kovatsch and other contributors. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,7 +46,8 @@ /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 -#define REST_RES_SERVO 1 +#define REST_RES_SERVO 0 +#define REST_RES_T4_SERVO 1 #define REST_RES_TEMPERATURE 0 #define REST_RES_EVENT 0 #define REST_RES_LEDS 0 @@ -70,6 +71,9 @@ #if defined (PLATFORM_HAS_SERVO) #include "dev/servo-sensor.h" #endif +#if defined (PLATFORM_HAS_T4_SERVO) +#include "dev/t4-servo-sensor.h" +#endif #if defined (PLATFORM_HAS_TEMPERATURE) #include "dev/temperature-sensor.h" #endif @@ -134,6 +138,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } #endif +#if defined (PLATFORM_HAS_SERVO) /*A simple actuator example. read the servo status*/ RESOURCE(servo, METHOD_GET | METHOD_PUT , "actuators/servo", "title=\"Servo\";rt=\"servo\""); void @@ -186,7 +191,86 @@ servo_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred REST.set_response_status(response, REST.status.BAD_REQUEST); } } +#endif +#if defined (PLATFORM_HAS_T4_SERVO) +RESOURCE(t4_servo, METHOD_GET | METHOD_PUT , "actuators/t4_servo", "title=\"Timer4Servo\";rt=\"t4_servo\""); +void +t4_servo_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *value = NULL; + size_t len = 0; + + int red = t4_servo_sensor.value(0); + int green = t4_servo_sensor.value(1); + int blue = t4_servo_sensor.value(2); + int white = t4_servo_sensor.value(3); + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"red\" : \"%d\",", red); + index += sprintf(temp + index, "\n \"green\" : \"%d\",", green); + index += sprintf(temp + index, "\n \"blue\" : \"%d\",", blue); + index += sprintf(temp + index, "\n \"white\" : \"%d\"", white); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp, length); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + + case METHOD_POST: + success = 0; + break; + + case METHOD_PUT: + // Note that we have to set all at once: + // red=255&green=255&blue=255&white=255 + // otherwise we get "bad request" + if (success && (len=REST.get_post_variable(request, "red", &value))) + { + t4_servo_sensor.configure(0,atoi(value)); + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "green", &value))) { + t4_servo_sensor.configure(1,atoi(value)); + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "blue", &value))) { + t4_servo_sensor.configure(2,atoi(value)); + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "white", &value))) { + t4_servo_sensor.configure(3,atoi(value)); + } else { + success = 0; + } + break; + + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif /*A simple actuator example, post variable mode, relay is activated or deactivated*/ RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); @@ -455,6 +539,10 @@ PROCESS_THREAD(rest_server_example, ev, data) SENSORS_ACTIVATE(servo_sensor); rest_activate_resource(&resource_servo); #endif +#if defined (PLATFORM_HAS_T4_SERVO) && REST_RES_T4_SERVO + SENSORS_ACTIVATE(t4_servo_sensor); + rest_activate_resource(&resource_t4_servo); +#endif /* Define application-specific events here. */ while(1) { diff --git a/examples/osd/servo-sensor/flash.sh b/examples/osd/servo-sensor/flash.sh index e92d472f6..b91668634 100755 --- a/examples/osd/servo-sensor/flash.sh +++ b/examples/osd/servo-sensor/flash.sh @@ -1,2 +1,2 @@ #!/bin/bash -sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a +avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/servo-sensor/project-conf.h b/examples/osd/servo-sensor/project-conf.h index 5c75a104c..c8f2cd92b 100644 --- a/examples/osd/servo-sensor/project-conf.h +++ b/examples/osd/servo-sensor/project-conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Swedish Institute of Computer Science. + * Copyright (C) 2010-2013, Swedish Institute of Computer Science. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,12 +34,17 @@ //#define PLATFORM_HAS_LEDS 1 //#define PLATFORM_HAS_BUTTON 1 -#define PLATFORM_HAS_SERVO 1 +//#define PLATFORM_HAS_SERVO 1 +#define PLATFORM_HAS_T4_SERVO 1 //#define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 #define SICSLOWPAN_CONF_FRAG 1 +/* Dont allow MCU sleeping between channel checks */ +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 + /* Disabling RDC for demo purposes. Core updates often require more memory. */ /* For projects, optimize memory and enable RDC again. */ //#undef NETSTACK_CONF_RDC diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 1f4c52dc7..84712b357 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -20,6 +20,8 @@ CONTIKI_TARGET_SOURCEFILES += optriac.c optriac-sensor.c CONTIKIAVR=$(CONTIKI)/cpu/avr #Needed for SERVO CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c +#Needed for Timer4 Servo +CONTIKI_TARGET_SOURCEFILES += t4-servo.c t4-servo-sensor.c CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 From 7383f6708b59c3ff425acbe0b2b0be39e1ea0fd2 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 9 Apr 2013 13:56:04 +0200 Subject: [PATCH 051/345] timer4 servo pwm from Priesch Markus --- examples/osd/servo-sensor/er-example-server.c | 2 +- platform/osd-merkur/dev/t4-servo-sensor.c | 113 +++++++++++++ platform/osd-merkur/dev/t4-servo-sensor.h | 71 +++++++++ platform/osd-merkur/dev/t4-servo.c | 150 ++++++++++++++++++ platform/osd-merkur/dev/t4-servo.h | 96 +++++++++++ 5 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 platform/osd-merkur/dev/t4-servo-sensor.c create mode 100644 platform/osd-merkur/dev/t4-servo-sensor.h create mode 100644 platform/osd-merkur/dev/t4-servo.c create mode 100644 platform/osd-merkur/dev/t4-servo.h diff --git a/examples/osd/servo-sensor/er-example-server.c b/examples/osd/servo-sensor/er-example-server.c index d8e2b436f..be0a01ef0 100644 --- a/examples/osd/servo-sensor/er-example-server.c +++ b/examples/osd/servo-sensor/er-example-server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2013, Matthias Kovatsch and other contributors. + * Copyright (C) 2011, Matthias Kovatsch and other contributors. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/platform/osd-merkur/dev/t4-servo-sensor.c b/platform/osd-merkur/dev/t4-servo-sensor.c new file mode 100644 index 000000000..cbf82306c --- /dev/null +++ b/platform/osd-merkur/dev/t4-servo-sensor.c @@ -0,0 +1,113 @@ +/* +** Copyright (C) 2013 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** 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. +** +**++ +** Name +** t4-servo-sensor +** +** Purpose +** Implements a sensor around t4servo.c +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** ««revision-date»»··· +**-- +*/ + +#include "contiki.h" +#include "dev/t4-servo.h" +#include "dev/t4-servo-sensor.h" + +const struct sensors_sensor t4_servo_sensor; +static int status(int type); +static int enabled = 0; + +static int value (int channel) + { + if (channel >= SERVO_COUNT) + return -1; + else if (channel < 0) + return -2; + else + return t4_servo_get (channel); + } + +static int configure (int type, int c) // type, c: SENSORS_ACTIVE, 1 -> act. + // type, c: SENSORS_ACTIVE, 0 -> deact. + { + switch (type) + { + case SENSORS_ACTIVE : + if (c == 0) + { + t4_servo_off (); + } + else if (c == 1) + { + t4_servo_init (); + t4_servo_set_io (0, T4_SENSOR_1_PORT, T4_SENSOR_1_DDR, T4_SENSOR_1_PIN); + t4_servo_set_io (1, T4_SENSOR_2_PORT, T4_SENSOR_2_DDR, T4_SENSOR_2_PIN); + t4_servo_set_io (2, T4_SENSOR_3_PORT, T4_SENSOR_3_DDR, T4_SENSOR_3_PIN); + t4_servo_set_io (3, T4_SENSOR_4_PORT, T4_SENSOR_4_DDR, T4_SENSOR_4_PIN); + } + break; + + case 0 : + t4_servo_set (0, c); + break; + + case 1 : + t4_servo_set (1, c); + break; + + case 2 : + t4_servo_set (2, c); + break; + + case 3 : + t4_servo_set (3, c); + + default: + break; + } + return 0; + } + +static int status(int type) + { + switch (type) + { + case SENSORS_ACTIVE: + case SENSORS_READY: + return enabled; + } + return 0; + } + +SENSORS_SENSOR(t4_servo_sensor, T4_SENSOR_NAME, value, configure, status); diff --git a/platform/osd-merkur/dev/t4-servo-sensor.h b/platform/osd-merkur/dev/t4-servo-sensor.h new file mode 100644 index 000000000..bbbf22adf --- /dev/null +++ b/platform/osd-merkur/dev/t4-servo-sensor.h @@ -0,0 +1,71 @@ +/* +** Copyright (C) 2013 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** 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. +** +**++ +** Name +** t4-servo-sensor +** +** Purpose +** Implements a sensor around t4servo.c +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** ««revision-date»»··· +**-- +*/ + +#ifndef __T4_SERVO_SENSOR_H__ +#define __T4_SERVO_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor t4_servo_sensor; + +#define T4_SENSOR_NAME "T4-Sensor" + +#define T4_SENSOR_1_PORT 0x0E +#define T4_SENSOR_1_DDR 0x0D +#define T4_SENSOR_1_PIN PINE4 + +#define T4_SENSOR_2_PORT 0x0E +#define T4_SENSOR_2_DDR 0x0D +#define T4_SENSOR_2_PIN PINE3 + +#define T4_SENSOR_3_PORT 0x0E +#define T4_SENSOR_3_DDR 0x0D +#define T4_SENSOR_3_PIN PINE5 + +#define T4_SENSOR_4_PORT 0x0E +#define T4_SENSOR_4_DDR 0x0D +#define T4_SENSOR_4_PIN PINE6 + +#endif /* __T4_SERVO_SENSOR_H__ */ + + + diff --git a/platform/osd-merkur/dev/t4-servo.c b/platform/osd-merkur/dev/t4-servo.c new file mode 100644 index 000000000..60a6b7027 --- /dev/null +++ b/platform/osd-merkur/dev/t4-servo.c @@ -0,0 +1,150 @@ +/* +** Copyright (C) 2013 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** 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. +** +**++ +** Name +** t4-servo +** +** Purpose +** Implements software pwm on any portpins via timer 4 +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** ��revision-date����� +**-- +*/ + +#include "t4-servo.h" +#include +#include +#include "led.h" + +static servo_channel_type servo_channels [SERVO_COUNT]; + +// timer 4: CTC OCR4A +#define WGM4 0x4 + +void t4_servo_init (void) +{ + unsigned char channel; + + for (channel = 0; channel < SERVO_COUNT; channel ++) + { + servo_channels [channel].duty = SERVO_MAX/2; + t4_servo_set_io (channel, DEFAULT_PORT, DEFAULT_DDR, DEFAULT_PIN); + } + + cli (); + TCCR4A = 0x00; + TCCR4A_struct.wgm4 = WGM4 & 0x3; + TCCR4B_struct.wgm4 = (WGM4 & 0xc) >> 2; + TCCR4B_struct.cs4 = 0x1; // No prescaler + TCCR4C = 0x00; + OCR4A = T4_VALUE; + TIMSK4_struct.ocie4a = 1; + sei(); +} + +void t4_servo_off (void) + { + TIMSK4_struct.ocie4a = 0; + } + +int t4_servo_set_io + ( unsigned char channel + , unsigned char port + , unsigned char ddr + , unsigned char pin + ) + { + if (channel >= SERVO_COUNT) + return -1; + + servo_channels [channel].port = port; + servo_channels [channel].ddr = ddr; + servo_channels [channel].pin = 1 << pin; + + _SFR_IO8 (ddr) |= pin; + + return 0; + } + +int t4_servo_get (unsigned int channel) + { + if (channel >= SERVO_COUNT) + return -1; + + return servo_channels [channel].duty; + } + +int t4_servo_set (unsigned int channel, unsigned int duty) + { + if (channel >= SERVO_COUNT) + return -1; + + if (duty > SERVO_MAX) + return -2; + + if (duty < SERVO_MIN) + return -3; + + servo_channels [channel].duty = duty; + return 0; + } + +ISR (TIMER4_COMPA_vect, ISR_NOBLOCK) + { + unsigned char channel; + static unsigned int tick_count = 0; + + cli (); + for (channel = 0; channel < SERVO_COUNT; channel ++) + { + if (tick_count < servo_channels [channel].duty) + { + // turn on + _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin; + _SFR_IO8 (servo_channels [channel].port) |= servo_channels [channel].pin; + } + else + { + // turn off + _SFR_IO8 (servo_channels [channel].port) &= ~(servo_channels [channel].pin); + _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin; + } + } + + tick_count ++; + + if (tick_count >= (SERVO_MAX + SERVO_OFFSET)) + { + tick_count = 0; + } + sei(); + } diff --git a/platform/osd-merkur/dev/t4-servo.h b/platform/osd-merkur/dev/t4-servo.h new file mode 100644 index 000000000..72334a088 --- /dev/null +++ b/platform/osd-merkur/dev/t4-servo.h @@ -0,0 +1,96 @@ +/* +** Copyright (C) 2013 Marcus Priesch, All rights reserved +** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at +** +** 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. +** +**++ +** Name +** t4-servo +** +** Purpose +** Implements software pwm on any portpins via timer 4 +** +** +** Revision Dates +** 31-Mar-2013 (MPR) Creation +** ��revision-date����� +**-- +*/ + +#ifndef __T4_SERVO_H__ +#define __T4_SERVO_H__ + +// timing: (X:pwm, _:zero) +// +// X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX +// +// |<------------->|<--------->|<------------->|<--------->| ... +// SERVO_OFFSET SERVO_MAX SERVO_OFFSET SERVO_MAX +// +// within SERVO_MAX you get the PWM set with servo_set (id, pwm) +// if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle +// +// the period of the smallest tick is derived from the timer4 prescaler +// plus the ISR overhead. however, the latter one should be constant +// regardless of the pwm signal generated + + +#define SERVO_OFFSET 256 +#define SERVO_MIN 16 +#define SERVO_MAX 32 + +// Counter value for timer 4 without any prescaler for a single tick +#define PWMFREQ 500 +#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ + +#define SERVO_COUNT 4 + +#define DEFAULT_PORT 0x0E +#define DEFAULT_PIN 1 +#define DEFAULT_DDR 0x0D + +typedef struct struct_servo_channel +{ + unsigned char port; + unsigned char pin; + unsigned char ddr; + unsigned char duty; +} servo_channel_type; + +void t4_servo_init(void); +void t4_servo_off(void); + +int t4_servo_get(unsigned int channel); +int t4_servo_set(unsigned int channel, unsigned int duty); + +int t4_servo_set_io + ( unsigned char channel + , unsigned char port + , unsigned char ddr + , unsigned char pin + ); + +#endif /* __T4_SERVO_H__ */ From d8d15504000b13aff669d70ed8b9db413504c1ae Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 9 Apr 2013 15:28:36 +0200 Subject: [PATCH 052/345] cleanup er-rest-example-merkurboard --- .../osd/er-rest-example-merkurboard/Makefile | 2 +- .../er-example-client.c | 173 ------------------ .../er-example-server.c | 4 +- .../project-conf.h | 5 + 4 files changed, 8 insertions(+), 176 deletions(-) delete mode 100644 examples/osd/er-rest-example-merkurboard/er-example-client.c diff --git a/examples/osd/er-rest-example-merkurboard/Makefile b/examples/osd/er-rest-example-merkurboard/Makefile index ea3722d59..dbd2c1410 100644 --- a/examples/osd/er-rest-example-merkurboard/Makefile +++ b/examples/osd/er-rest-example-merkurboard/Makefile @@ -1,4 +1,4 @@ -all: er-example-server er-example-client +all: er-example-server # Use this target explicitly if requried: er-plugtest-server CONTIKI=../../.. diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.c b/examples/osd/er-rest-example-merkurboard/er-example-client.c deleted file mode 100644 index d1d543cf0..000000000 --- a/examples/osd/er-rest-example-merkurboard/er-example-client.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * 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 - */ - -#include -#include -#include - -#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(); -} diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c index e505f6165..6867d13d1 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-server.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c @@ -51,12 +51,12 @@ #define REST_RES_CHUNKS 0 #define REST_RES_SEPARATE 0 #define REST_RES_PUSHING 0 -#define REST_RES_EVENT 0 +#define REST_RES_EVENT 1 #define REST_RES_SUB 0 #define REST_RES_LEDS 0 #define REST_RES_TOGGLE 0 #define REST_RES_LIGHT 0 -#define REST_RES_BATTERY 0 +#define REST_RES_BATTERY 1 #define REST_RES_RADIO 0 diff --git a/examples/osd/er-rest-example-merkurboard/project-conf.h b/examples/osd/er-rest-example-merkurboard/project-conf.h index 1c3dd8933..3f7981505 100644 --- a/examples/osd/er-rest-example-merkurboard/project-conf.h +++ b/examples/osd/er-rest-example-merkurboard/project-conf.h @@ -32,6 +32,11 @@ #ifndef __PROJECT_RPL_WEB_CONF_H__ #define __PROJECT_RPL_WEB_CONF_H__ +//#define PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 + #define SICSLOWPAN_CONF_FRAG 1 /* Disabling RDC for demo purposes. Core updates often require more memory. */ From 6184e5715b3699b338acc946c0176c6f4af29b0b Mon Sep 17 00:00:00 2001 From: Andreas Reder Date: Wed, 10 Apr 2013 07:32:45 +0200 Subject: [PATCH 053/345] corrected border-router resources, added run.sh and flash.sh --- examples/osd/native-border-router/border-router.c | 15 +++++++-------- examples/osd/native-border-router/run.sh | 5 +++++ examples/osd/slip-radio/flash.sh | 2 ++ examples/osd/slip-radio/run.sh | 6 ++++++ 4 files changed, 20 insertions(+), 8 deletions(-) create mode 100755 examples/osd/native-border-router/run.sh create mode 100755 examples/osd/slip-radio/flash.sh create mode 100755 examples/osd/slip-radio/run.sh diff --git a/examples/osd/native-border-router/border-router.c b/examples/osd/native-border-router/border-router.c index 0284573b5..83fbe9ac7 100644 --- a/examples/osd/native-border-router/border-router.c +++ b/examples/osd/native-border-router/border-router.c @@ -337,7 +337,7 @@ PROCESS_THREAD(border_router_process, ev, data) * Resources are defined by the RESOURCE macro. * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). */ -RESOURCE(rpl, METHOD_GET, "rpl", "title=\"rpl routing\";rt=\"Text\""); +RESOURCE(rpl, METHOD_GET, "rpl", "title=\"rpl routing table\";rt=\"application/json\""); /* * A handler function named [resource name]_handler must be implemented for each RESOURCE. @@ -401,7 +401,7 @@ rpl_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s } -RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"application/json\""); /* * A handler function named [resource name]_handler must be implemented for each RESOURCE. @@ -417,9 +417,8 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ int length = 0; /* |<-------->| */ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ - // jSON Format - index += sprintf(message + index,"{\n \"version\" : \"V0.1\",\n"); - index += sprintf(message + index," \"name\" : \"native coap router\"\n"); + index += sprintf(message + index,"{\n \"version\" : \"V0.2\",\n"); + index += sprintf(message + index," \"name\" : \"native coap border router\"\n"); index += sprintf(message + index,"}\n"); length = strlen(message); @@ -430,9 +429,9 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } -RESOURCE(osd_net_conf, METHOD_GET | METHOD_POST, "osd-net-conf", "title=\"osd configs\""); +RESOURCE(network, METHOD_GET | METHOD_PUT, "network", "title=\"osd configs\"; rt=\"application/json\""); void -osd_net_conf_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +network_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { char message[100]; uint8_t buf[10]; @@ -499,7 +498,7 @@ PROCESS_THREAD(rest_server, ev, data) /* Activate the application-specific resources. */ rest_activate_resource(&resource_rpl); - rest_activate_resource(&resource_osd_net_conf); + rest_activate_resource(&resource_network); rest_activate_resource(&resource_info); while(1) { diff --git a/examples/osd/native-border-router/run.sh b/examples/osd/native-border-router/run.sh new file mode 100755 index 000000000..768ad2e82 --- /dev/null +++ b/examples/osd/native-border-router/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +make clean TARGET=native +make TARGET=native +mv border-router.native border-router + diff --git a/examples/osd/slip-radio/flash.sh b/examples/osd/slip-radio/flash.sh new file mode 100755 index 000000000..633f3f434 --- /dev/null +++ b/examples/osd/slip-radio/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:slip-radio.osd-merkur.hex:a -U eeprom:w:slip-radio.osd-merkur.eep:a diff --git a/examples/osd/slip-radio/run.sh b/examples/osd/slip-radio/run.sh new file mode 100755 index 000000000..056794e5d --- /dev/null +++ b/examples/osd/slip-radio/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size slip-radio.osd-merkur +avr-objcopy -j .text -j .data -O ihex slip-radio.osd-merkur slip-radio.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex slip-radio.osd-merkur slip-radio.osd-merkur.eep From ae3d5e4966773f2f9452217a9ad9d82bf139c102 Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 10 Apr 2013 16:05:31 +0200 Subject: [PATCH 054/345] add pcint buttons --- examples/osd/light-actor/Makefile | 2 + examples/osd/light-actor/er-example-server.c | 56 +++++++++++++ examples/osd/light-actor/pcintkey.c | 88 ++++++++++++++++++++ examples/osd/light-actor/pcintkey.h | 51 ++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 examples/osd/light-actor/pcintkey.c create mode 100644 examples/osd/light-actor/pcintkey.h diff --git a/examples/osd/light-actor/Makefile b/examples/osd/light-actor/Makefile index dbd2c1410..9f5e50f5a 100644 --- a/examples/osd/light-actor/Makefile +++ b/examples/osd/light-actor/Makefile @@ -12,6 +12,8 @@ PROJECT_SOURCEFILES += static-routing.c endif endif endif +# pcintkey +PROJECT_SOURCEFILES += pcintkey.c # variable for root Makefile.include WITH_UIP6=1 diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c index 60b723ae5..689d34a20 100644 --- a/examples/osd/light-actor/er-example-server.c +++ b/examples/osd/light-actor/er-example-server.c @@ -59,6 +59,7 @@ #endif #include "erbium.h" +#include "pcintkey.h" #include "dev/led.h" #if defined (PLATFORM_HAS_BUTTON) @@ -135,7 +136,61 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } #endif +// pcintkey_ext +/*A simple actuator example. read the key button status*/ +RESOURCE(extbutton, METHOD_GET | METHOD_PUT , "sensors/extbutton", "title=\"ext.Button\";rt=\"Text\""); +void +extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname1[17]="button1"; + static char bname2[17]="button2"; + int success = 1; + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"%s\" : ",bname1); + if(is_button_ext1()) + index += sprintf(temp + index,"\"on\",\n"); + else + index += sprintf(temp + index,"\"off\",\n"); + index += sprintf(temp + index," \"%s\" : ",bname2); + if(is_button_ext2()) + index += sprintf(temp + index,"\"on\"\n"); + else + index += sprintf(temp + index,"\"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname1, name,len); + bname1[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} /*A simple actuator example, post variable mode, relay is activated or deactivated*/ RESOURCE(led1, METHOD_GET | METHOD_PUT , "actuators/led1", "title=\"Led1\";rt=\"led\""); void @@ -510,6 +565,7 @@ PROCESS_THREAD(rest_server_example, ev, data) /* Activate the application-specific resources. */ rest_activate_resource(&resource_led1); + rest_activate_resource(&resource_extbutton); #if REST_RES_INFO rest_activate_resource(&resource_info); #endif diff --git a/examples/osd/light-actor/pcintkey.c b/examples/osd/light-actor/pcintkey.c new file mode 100644 index 000000000..4f147ab8f --- /dev/null +++ b/examples/osd/light-actor/pcintkey.c @@ -0,0 +1,88 @@ +/* + * 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) +{ + // ext1 + DDRB |= (0< +#include + +void key_init(void); +uint8_t is_button_ext1(void); +uint8_t is_button_ext2(void); + +#endif /* __KEY_H__ */ From 25fb513164d475e22e95f1a4aad19d931059cc5b Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 12 Apr 2013 14:40:13 +0200 Subject: [PATCH 055/345] etimer read buttons --- examples/osd/light-actor/er-example-server.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c index 689d34a20..8de83cddf 100644 --- a/examples/osd/light-actor/er-example-server.c +++ b/examples/osd/light-actor/er-example-server.c @@ -531,12 +531,21 @@ hw_init() led1_off(); } +#define MESURE_INTERVAL (CLOCK_SECOND) + PROCESS(rest_server_example, "Erbium Example Server"); AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); PROCESS_THREAD(rest_server_example, ev, data) { + static struct etimer ds_periodic_timer; + static int ext1; + static int ext2; + ext1 = is_button_ext1(); + ext2 = is_button_ext2(); + + PROCESS_BEGIN(); PRINTF("Starting Erbium Example Server\n"); @@ -596,6 +605,7 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_activate_resource(&resource_battery); #endif + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); /* Define application-specific events here. */ while(1) { PROCESS_WAIT_EVENT(); @@ -612,6 +622,10 @@ PROCESS_THREAD(rest_server_example, ev, data) #endif /* PLATFORM_HAS_PIR */ } #endif /* REST_RES_EVENT */ + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("Periodic\n"); + etimer_reset(&ds_periodic_timer); + } } /* while (1) */ PROCESS_END(); From 797c3da2398b29c05e404cf05bf2ab12b1b8545f Mon Sep 17 00:00:00 2001 From: harald42 Date: Mon, 15 Apr 2013 10:28:03 +0200 Subject: [PATCH 056/345] add isr --- examples/osd/light-actor/er-example-server.c | 22 ++++++++---- examples/osd/light-actor/pcintkey.c | 36 ++++++++++++++++++-- examples/osd/light-actor/pcintkey.h | 5 +-- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c index 8de83cddf..d861e025c 100644 --- a/examples/osd/light-actor/er-example-server.c +++ b/examples/osd/light-actor/er-example-server.c @@ -144,6 +144,7 @@ extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe { static char bname1[17]="button1"; static char bname2[17]="button2"; + static char bname3[17]="button3"; int success = 1; char temp[100]; @@ -156,12 +157,17 @@ extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe case METHOD_GET: // jSON Format index += sprintf(temp + index,"{\n \"%s\" : ",bname1); - if(is_button_ext1()) + if(is_button_ext4()) index += sprintf(temp + index,"\"on\",\n"); else index += sprintf(temp + index,"\"off\",\n"); - index += sprintf(temp + index," \"%s\" : ",bname2); - if(is_button_ext2()) + index += sprintf(temp + index,"{\n \"%s\" : ",bname2); + if(is_button_ext5()) + index += sprintf(temp + index,"\"on\",\n"); + else + index += sprintf(temp + index,"\"off\",\n"); + index += sprintf(temp + index," \"%s\" : ",bname3); + if(is_button_ext6()) index += sprintf(temp + index,"\"on\"\n"); else index += sprintf(temp + index,"\"off\"\n"); @@ -540,10 +546,12 @@ AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); PROCESS_THREAD(rest_server_example, ev, data) { static struct etimer ds_periodic_timer; - static int ext1; - static int ext2; - ext1 = is_button_ext1(); - ext2 = is_button_ext2(); + static int ext4; + static int ext5; + static int ext6; + ext4 = is_button_ext4(); + ext5 = is_button_ext5(); + ext6 = is_button_ext6(); PROCESS_BEGIN(); diff --git a/examples/osd/light-actor/pcintkey.c b/examples/osd/light-actor/pcintkey.c index 4f147ab8f..b152da6da 100644 --- a/examples/osd/light-actor/pcintkey.c +++ b/examples/osd/light-actor/pcintkey.c @@ -38,22 +38,41 @@ * */ -#include "key.h" +#include +#include "dev/led.h" +#include "pcintkey.h" /*---------------------------------------------------------------------------*/ +ISR(PCINT0_vect) +{ +// if(BUTTON_CHECK_IRQ()) { +// if(timer_expired(&debouncetimer)) { + led1_on(); +// timer_set(&debouncetimer, CLOCK_SECOND / 4); +// sensors_changed(&button_sensor); + led1_off(); +// } +// } +} /** * \brief This will intialize the KEY for button readings. */ void key_init(void) { + // Pairing Button + DDRB |= (0< void key_init(void); -uint8_t is_button_ext1(void); -uint8_t is_button_ext2(void); +uint8_t is_button_ext4(void); +uint8_t is_button_ext5(void); +uint8_t is_button_ext6(void); #endif /* __KEY_H__ */ From cdf4da8461a1f90cc23e898082c161ab95d31201 Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 17 Apr 2013 13:40:46 +0200 Subject: [PATCH 057/345] add merkurboard coap client demo --- .../osd/er-rest-example-merkurboard/Makefile | 2 +- .../er-example-client.c | 151 ++++++++++++++++++ .../er-example-server.c | 74 +-------- .../flashclient.sh | 2 + .../project-conf.h | 2 +- .../er-rest-example-merkurboard/runclient.sh | 6 + platform/osd-merkur/Makefile.osd-merkur | 2 +- platform/osd-merkur/contiki-main.c | 6 + 8 files changed, 174 insertions(+), 71 deletions(-) create mode 100644 examples/osd/er-rest-example-merkurboard/er-example-client.c create mode 100755 examples/osd/er-rest-example-merkurboard/flashclient.sh create mode 100755 examples/osd/er-rest-example-merkurboard/runclient.sh diff --git a/examples/osd/er-rest-example-merkurboard/Makefile b/examples/osd/er-rest-example-merkurboard/Makefile index dbd2c1410..5cca933d2 100644 --- a/examples/osd/er-rest-example-merkurboard/Makefile +++ b/examples/osd/er-rest-example-merkurboard/Makefile @@ -1,4 +1,4 @@ -all: er-example-server +all: er-example-server er-example-client # Use this target explicitly if requried: er-plugtest-server CONTIKI=../../.. diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.c b/examples/osd/er-rest-example-merkurboard/er-example-client.c new file mode 100644 index 000000000..450fb355d --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/er-example-client.c @@ -0,0 +1,151 @@ +/* + * 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 + */ + +#include +#include +#include + +#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" +#include "dev/leds.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, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x1efb) /* cooja2 */ + +#define LOCAL_PORT UIP_HTONS(COAP_DEFAULT_PORT+1) +#define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT) + +PROCESS(coap_client_example, "COAP Client Example"); +AUTOSTART_PROCESSES(&coap_client_example); + + +uip_ipaddr_t server_ipaddr; + +/* 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"}; + +/* 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(); + + leds_off(LEDS_RED); + + 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(); + +#if PLATFORM_HAS_BUTTON + SENSORS_ACTIVATE(button_sensor); + printf("Press a button to request %s\n", service_urls[1]); +#endif + + while(1) { + PROCESS_YIELD(); + +#if PLATFORM_HAS_BUTTON + if (ev == sensors_event && data == &button_sensor) { + + /* send a request to notify the end of the process */ + + printf("--Toggle --\n"); + leds_toggle(LEDS_RED); + /* 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"); + } +#endif + } + + PROCESS_END(); +} diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c index 6867d13d1..abe9c2795 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-server.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c @@ -53,14 +53,13 @@ #define REST_RES_PUSHING 0 #define REST_RES_EVENT 1 #define REST_RES_SUB 0 -#define REST_RES_LEDS 0 -#define REST_RES_TOGGLE 0 +#define REST_RES_LEDS 1 +#define REST_RES_TOGGLE 1 #define REST_RES_LIGHT 0 #define REST_RES_BATTERY 1 #define REST_RES_RADIO 0 - #if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET) && !defined (CONTIKI_TARGET_NATIVE) #warning "Compiling with static routing!" #include "static-routing.h" @@ -68,9 +67,7 @@ #include "erbium.h" -// todo OSD-Testboard move to platform/dev -#include "dev/key.h" -#include "dev/led.h" + #if REST_RES_DS1820 #include "dev/ds1820.h" #endif @@ -115,10 +112,6 @@ #define PRINTLLADDR(addr) #endif - -#include "dev/key.c" // todo: move platform /dev -#include "dev/led.c" - /******************************************************************************/ #if REST_RES_INFO @@ -143,7 +136,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format - index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index,"{\n \"version\" : \"V0.4\",\n"); index += sprintf(message + index," \"name\" : \"Button,LED\"\n"); index += sprintf(message + index,"}\n"); @@ -155,57 +148,8 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } #endif -// mybutton -/*A simple actuator example. read the key button status*/ -RESOURCE(button, METHOD_GET | METHOD_PUT , "button", "title=\"Button\";rt=\"Text\""); -void -button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - static char bname[17]="button1"; - int success = 1; - - char temp[100]; - int index = 0; - int length = 0; /* |<-------->| */ - const char *name = NULL; - size_t len = 0; - - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); - if(is_button()) - index += sprintf(temp + index," \"state\" : \"on\"\n"); - else - index += sprintf(temp + index," \"state\" : \"off\"\n"); - index += sprintf(temp + index,"}\n"); - - length = strlen(temp); - memcpy(buffer, temp,length ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, length); - - break; - case METHOD_PUT: - - if (success && (len=REST.get_post_variable(request, "name", &name))) { - PRINTF("name %s\n", name); - memcpy(bname, name,len); - bname[len]=0; - } else { - success = 0; - } - break; - default: - success = 0; - } - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} - /*A simple actuator example, post variable mode, relay is activated or deactivated*/ +/* RESOURCE(led1, METHOD_GET | METHOD_PUT , "led1", "title=\"Led1\";rt=\"Text\""); void led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -271,6 +215,7 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ REST.set_response_status(response, REST.status.BAD_REQUEST); } } +*/ #if REST_RES_DS1820 /*A simple getter example. Returns the reading from ds1820 sensor*/ @@ -983,8 +928,6 @@ radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred void hw_init() { - key_init(); - led1_off(); #if REST_RES_DS1820 ds1820_temp(); #endif @@ -1004,8 +947,6 @@ PROCESS_THREAD(rest_server_example, ev, data) PROCESS_BEGIN(); - - PRINTF("Starting Erbium Example Server\n"); #ifdef RF_CHANNEL @@ -1033,9 +974,6 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_init_engine(); /* Activate the application-specific resources. */ - rest_activate_resource(&resource_button); - rest_activate_resource(&resource_led1); - /* Activate the application-specific resources. */ #if REST_RES_DS1820 rest_activate_resource(&resource_ds1820); #endif diff --git a/examples/osd/er-rest-example-merkurboard/flashclient.sh b/examples/osd/er-rest-example-merkurboard/flashclient.sh new file mode 100755 index 000000000..30979eed4 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/flashclient.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-client.osd-merkur.hex:a -U eeprom:w:er-example-client.osd-merkur.eep:a diff --git a/examples/osd/er-rest-example-merkurboard/project-conf.h b/examples/osd/er-rest-example-merkurboard/project-conf.h index 3f7981505..a29fcf429 100644 --- a/examples/osd/er-rest-example-merkurboard/project-conf.h +++ b/examples/osd/er-rest-example-merkurboard/project-conf.h @@ -32,7 +32,7 @@ #ifndef __PROJECT_RPL_WEB_CONF_H__ #define __PROJECT_RPL_WEB_CONF_H__ -//#define PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_LEDS 1 #define PLATFORM_HAS_BUTTON 1 #define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 diff --git a/examples/osd/er-rest-example-merkurboard/runclient.sh b/examples/osd/er-rest-example-merkurboard/runclient.sh new file mode 100755 index 000000000..3503afa2b --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/runclient.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-client.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.eep diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 84712b357..3c97ed6cb 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -4,7 +4,7 @@ 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 += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c +CONTIKI_TARGET_SOURCEFILES += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c leds-arch.c #Needed for Button CONTIKI_TARGET_SOURCEFILES += button-sensor.c #Needed for DHT11 humidity sensor diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index 65d3ad07a..b71067919 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -172,6 +172,12 @@ rng_get_uint8(void) { return j; } +void +clock_delay(unsigned int howlong) +{ + if(howlong<2) return; + clock_delay_usec((45*howlong)>>4); +} /*-------------------------Low level initialization------------------------*/ /*------Done in a subroutine to keep main routine stack usage small--------*/ void initialize(void) From 32d077790fbb14fc249dcc459653a398b47b0ec2 Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 17 Apr 2013 13:44:17 +0200 Subject: [PATCH 058/345] remove debug code --- platform/osd-merkur/dev/button-sensor.c | 26 ++++++++++++------------- platform/osd-merkur/dev/dht11.c | 8 ++++---- platform/osd-merkur/dev/leds-arch.c | 2 +- platform/osd-merkur/dev/leds-arch.h | 2 +- platform/osd-merkur/dev/pir-sensor.c | 8 ++++---- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/platform/osd-merkur/dev/button-sensor.c b/platform/osd-merkur/dev/button-sensor.c index 491879f3a..825467781 100644 --- a/platform/osd-merkur/dev/button-sensor.c +++ b/platform/osd-merkur/dev/button-sensor.c @@ -14,22 +14,22 @@ static int enabled = 0; struct sensors_sensor *sensors[1]; unsigned char sensors_flags[1]; -#define BUTTON_BIT INTF5 +#define BUTTON_BIT INTF4 #define BUTTON_CHECK_IRQ() (EIFR & BUTTON_BIT) ? 0 : 1 #define PRINTF(...) printf(__VA_ARGS__) /*---------------------------------------------------------------------------*/ -ISR(INT5_vect) +ISR(INT4_vect) { -// leds_toggle(LEDS_YELLOW); +// leds_toggle(LEDS_RED); if(BUTTON_CHECK_IRQ()) { if(timer_expired(&debouncetimer)) { - led1_on(); + // led1_on(); timer_set(&debouncetimer, CLOCK_SECOND / 4); sensors_changed(&button_sensor); - led1_off(); + // led1_off(); } } @@ -39,7 +39,7 @@ ISR(INT5_vect) static int value(int type) { - return (PORTE & _BV(PE5) ? 0 : 1) || !timer_expired(&debouncetimer); + return (PORTE & _BV(PE4) ? 0 : 1) || !timer_expired(&debouncetimer); //return 0; } @@ -50,19 +50,19 @@ configure(int type, int c) case SENSORS_ACTIVE: if (c) { if(!status(SENSORS_ACTIVE)) { - led1_on(); + // led1_on(); timer_set(&debouncetimer, 0); - DDRE |= (0<= 15) { //If it was high for more than 40uS - led1_off(); + // led1_off(); data[j/8]|=1; //it means it is bit '1' so make a logic - led1_on(); + // led1_on(); } //OR with the value (save it) j++; //making an OR by 1 to this value 10101000 - led1_off(); + // led1_off(); } //we will have the resault 10101001 //1 in 8-bit binary is 00000001 diff --git a/platform/osd-merkur/dev/leds-arch.c b/platform/osd-merkur/dev/leds-arch.c index 8994bb5a1..3db79ec17 100644 --- a/platform/osd-merkur/dev/leds-arch.c +++ b/platform/osd-merkur/dev/leds-arch.c @@ -50,7 +50,7 @@ void leds_arch_init(void) { -DDRE|=(1< Date: Wed, 17 Apr 2013 15:43:11 +0200 Subject: [PATCH 059/345] bugfix ->startup led red off --- examples/osd/er-rest-example-merkurboard/er-example-server.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c index abe9c2795..508dcc0c1 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-server.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c @@ -928,6 +928,9 @@ radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred void hw_init() { +#if defined (PLATFORM_HAS_LEDS) + leds_off(LEDS_RED); +#endif #if REST_RES_DS1820 ds1820_temp(); #endif From 19ec02773f67c0b00301760ef28433fd1ab29836 Mon Sep 17 00:00:00 2001 From: Andreas Reder Date: Tue, 23 Apr 2013 10:14:58 +0200 Subject: [PATCH 060/345] corrected bug when changing panid --- examples/osd/slip-radio/slip-radio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/osd/slip-radio/slip-radio.c b/examples/osd/slip-radio/slip-radio.c index 529f19cfd..f8baec682 100644 --- a/examples/osd/slip-radio/slip-radio.c +++ b/examples/osd/slip-radio/slip-radio.c @@ -150,11 +150,11 @@ slip_radio_cmd_handler(const uint8_t *data, int len) return 1; } else if( data[1] == 'P'){ panid = (data[2] << 8) + data[3]; - PRINTF("slip-radio: received change panid command, new panid %u\n", panid); + printf("slip-radio: received change panid command, new panid %u\n", panid); cli(); eeprom_write_word(&eemem_panid, panid); sei(); - watchdog_reboot(); + //watchdog_reboot(); } } return 0; From 8628af93e186fa6712ce94f304f524d47f0fea1f Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 30 Apr 2013 15:28:09 +0200 Subject: [PATCH 061/345] cleanup debug prints --- .../er-rest-example-merkurboard/er-example-client.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.c b/examples/osd/er-rest-example-merkurboard/er-example-client.c index 450fb355d..20cc507b8 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-client.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-client.c @@ -74,7 +74,7 @@ #endif /* TODO: This server address is hard-coded for Cooja. */ -#define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x1efb) /* cooja2 */ +#define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x26D0) /* cooja2 */ #define LOCAL_PORT UIP_HTONS(COAP_DEFAULT_PORT+1) #define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT) @@ -115,7 +115,7 @@ PROCESS_THREAD(coap_client_example, ev, data) #if PLATFORM_HAS_BUTTON SENSORS_ACTIVATE(button_sensor); - printf("Press a button to request %s\n", service_urls[1]); + PRINTF("Press a button to request %s\n", service_urls[1]); #endif while(1) { @@ -126,8 +126,8 @@ PROCESS_THREAD(coap_client_example, ev, data) /* send a request to notify the end of the process */ - printf("--Toggle --\n"); - leds_toggle(LEDS_RED); + PRINTF("--Toggle --\n"); + //leds_toggle(LEDS_RED); /* prepare request, TID is set by COAP_BLOCKING_REQUEST() */ coap_init_message(request, COAP_TYPE_CON, COAP_POST, 0 ); @@ -142,7 +142,7 @@ PROCESS_THREAD(coap_client_example, ev, data) COAP_BLOCKING_REQUEST(&server_ipaddr, REMOTE_PORT, request, client_chunk_handler); - printf("\n--Done--\n"); + PRINTF("\n--Done--\n"); } #endif } From c265e72b242cb142f937fdf1741913be0f6a8441 Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 16 May 2013 16:10:09 +0200 Subject: [PATCH 062/345] add button logic --- examples/osd/light-actor/er-example-server.c | 93 ++++++++------------ examples/osd/light-actor/pcintkey.c | 18 ++-- examples/osd/light-actor/project-conf.h | 4 + 3 files changed, 52 insertions(+), 63 deletions(-) diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c index d861e025c..4eb98ee20 100644 --- a/examples/osd/light-actor/er-example-server.c +++ b/examples/osd/light-actor/er-example-server.c @@ -89,7 +89,7 @@ #warning "Erbium example without CoAP-specifc functionality" #endif /* CoAP-specific example */ -#define DEBUG 0 +#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]) @@ -264,48 +264,6 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } } -/******************************************************************************/ -#if REST_RES_EVENT && defined (PLATFORM_HAS_PIR) -/* - * Example for an event resource. - * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). - * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. - */ -EVENT_RESOURCE(pir, METHOD_GET, "sensors/pir", "title=\"Event demo\";obs"); - -void -pir_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); - /* Usually, a CoAP server would response with the current resource representation. */ - const char *msg = "It's eventful!"; - REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); - - /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ -} - -/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. - * It will be called by the REST manager process with the defined period. */ -void -pir_event_handler(resource_t *r) -{ - static uint16_t event_counter = 0; - static char content[12]; - - ++event_counter; - - PRINTF("PIR TICK %u for /%s\n", event_counter, r->url); - - /* Build notification. */ - coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ - coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); - coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); - - /* Notify the registered observers with the given message type, observe option, and payload. */ - REST.notify_subscribers(r, event_counter, notification); -} -#endif /* PLATFORM_HAS_PIR */ - /******************************************************************************/ #if defined (PLATFORM_HAS_OPTRIAC) /******************************************************************************/ @@ -371,11 +329,11 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr PRINTF("mode %s\n", mode); if (strncmp(mode, "on", len)==0) { + led1_on(); // Debug optriac_sensor.configure(triac,1); - led1_on(); } else if (strncmp(mode, "off", len)==0) { optriac_sensor.configure(triac,0); - led1_off(); + led1_off(); // Debug } else { success = 0; } @@ -531,13 +489,15 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr #endif /* PLATFORM_HAS_BATTERY */ /******************************************************************************/ + + void hw_init() { led1_off(); } -#define MESURE_INTERVAL (CLOCK_SECOND) +#define MESURE_INTERVAL (CLOCK_SECOND/2) PROCESS(rest_server_example, "Erbium Example Server"); @@ -546,12 +506,12 @@ AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); PROCESS_THREAD(rest_server_example, ev, data) { static struct etimer ds_periodic_timer; - static int ext4; - static int ext5; - static int ext6; - ext4 = is_button_ext4(); - ext5 = is_button_ext5(); - ext6 = is_button_ext6(); + static int ext4=0; + static int ext5=0; + static int ext6=0; +// ext4 = is_button_ext4(); +// ext5 = is_button_ext5(); +// ext6 = is_button_ext6(); PROCESS_BEGIN(); @@ -630,9 +590,34 @@ PROCESS_THREAD(rest_server_example, ev, data) #endif /* PLATFORM_HAS_PIR */ } #endif /* REST_RES_EVENT */ + /* Button Tric Logic */ if(etimer_expired(&ds_periodic_timer)) { - PRINTF("Periodic\n"); - etimer_reset(&ds_periodic_timer); + PRINTF("Periodic %d %d\n",ext5,ext6); + if(ext5 != is_button_ext5()) { + ext5 = is_button_ext5(); + PRINTF("Toggle Triac A\n"); + // Toggle Triac A + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0){ + optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + led1_on(); + }else{ + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + led1_off(); + } + } + if(ext6 != is_button_ext6()) { + ext6 = is_button_ext6(); + PRINTF("Toggle Triac B\n"); + // Toggle Triac B + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0){ + optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + led2_on(); + }else{ + optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + led2_off(); + } + } + etimer_reset(&ds_periodic_timer); } } /* while (1) */ diff --git a/examples/osd/light-actor/pcintkey.c b/examples/osd/light-actor/pcintkey.c index b152da6da..3da35669d 100644 --- a/examples/osd/light-actor/pcintkey.c +++ b/examples/osd/light-actor/pcintkey.c @@ -48,10 +48,10 @@ ISR(PCINT0_vect) { // if(BUTTON_CHECK_IRQ()) { // if(timer_expired(&debouncetimer)) { - led1_on(); +// led1_on(); // timer_set(&debouncetimer, CLOCK_SECOND / 4); // sensors_changed(&button_sensor); - led1_off(); +// led1_off(); // } // } } @@ -62,17 +62,17 @@ void key_init(void) { // Pairing Button - DDRB |= (0< Date: Fri, 17 May 2013 13:41:32 +0200 Subject: [PATCH 063/345] bugfix pullup key_init --- examples/osd/light-actor/er-example-server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c index 4eb98ee20..b586d7b8f 100644 --- a/examples/osd/light-actor/er-example-server.c +++ b/examples/osd/light-actor/er-example-server.c @@ -495,6 +495,7 @@ void hw_init() { led1_off(); + key_init(); } #define MESURE_INTERVAL (CLOCK_SECOND/2) From ef5b9474fd0383fa50c7cd7afd4cb61120006adb Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Mon, 20 May 2013 21:59:46 +0200 Subject: [PATCH 064/345] bugfix accept type const --- examples/osd/er-rest-example-dht11/er-example-server.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c index 3b8829913..b6fb39451 100644 --- a/examples/osd/er-rest-example-dht11/er-example-server.c +++ b/examples/osd/er-rest-example-dht11/er-example-server.c @@ -291,16 +291,15 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre char message[100]; int length = 0; /* |<-------->| */ - int ret=0; int grad=0; int kgrad=0; -// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ kgrad=5; } grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; - uint16_t *accept = NULL; + const uint16_t *accept = NULL; int num = REST.get_header_accept(request, &accept); if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) @@ -339,11 +338,8 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred { char message[100]; int length = 0; /* |<-------->| */ - int ret=0; -// dht11_temp=DHT_Read_Data(DHT_Temp); -// dht11_hum=DHT_Read_Data(DHT_RH); - uint16_t *accept = NULL; + const uint16_t *accept = NULL; int num = REST.get_header_accept(request, &accept); if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) From 080eadc79bb28dc2bd60b80f19d9e750b306ad43 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Mon, 27 May 2013 21:29:10 +0200 Subject: [PATCH 065/345] remove unused code, bugfix const --- examples/osd/climate/Makefile | 2 +- examples/osd/climate/er-example-server.c | 418 +---------------------- examples/osd/climate/project-conf.h | 6 +- 3 files changed, 7 insertions(+), 419 deletions(-) diff --git a/examples/osd/climate/Makefile b/examples/osd/climate/Makefile index ea3722d59..dbd2c1410 100644 --- a/examples/osd/climate/Makefile +++ b/examples/osd/climate/Makefile @@ -1,4 +1,4 @@ -all: er-example-server er-example-client +all: er-example-server # Use this target explicitly if requried: er-plugtest-server CONTIKI=../../.. diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c index 3b8829913..bd11fa10e 100644 --- a/examples/osd/climate/er-example-server.c +++ b/examples/osd/climate/er-example-server.c @@ -48,19 +48,13 @@ #define REST_RES_DS1820 1 #define REST_RES_DHT11 1 #define REST_RES_TEMPERATURE 1 -#define REST_RES_HELLO 0 -#define REST_RES_MIRROR 0 /* causes largest code size */ #define REST_RES_CHUNKS 0 #define REST_RES_SEPARATE 0 #define REST_RES_PUSHING 0 #define REST_RES_EVENT 0 -#define REST_RES_SUB 0 #define REST_RES_LEDS 0 #define REST_RES_TOGGLE 0 -#define REST_RES_LIGHT 0 #define REST_RES_BATTERY 1 -#define REST_RES_RADIO 0 - #if !UIP_CONF_IPV6_RPL && !defined (CONTIKI_TARGET_MINIMAL_NET) && !defined (CONTIKI_TARGET_NATIVE) @@ -87,9 +81,6 @@ uint8_t dht11_temp=0, dht11_hum=0; #if defined (PLATFORM_HAS_LEDS) #include "dev/leds.h" #endif -#if defined (PLATFORM_HAS_LIGHT) -#include "dev/light-sensor.h" -#endif #if defined (PLATFORM_HAS_TEMPERATURE) #include "dev/temperature-sensor.h" #endif @@ -99,9 +90,6 @@ uint8_t dht11_temp=0, dht11_hum=0; #if defined (PLATFORM_HAS_SHT11) #include "dev/sht11-sensor.h" #endif -#if defined (PLATFORM_HAS_RADIO) -#include "dev/radio-sensor.h" -#endif /* For CoAP-specific example: not required for normal RESTful Web service. */ @@ -125,9 +113,6 @@ uint8_t dht11_temp=0, dht11_hum=0; #endif -#include "dev/key.c" // todo: move platform /dev -#include "dev/led.c" - /******************************************************************************/ #if REST_RES_INFO @@ -164,59 +149,9 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } #endif -// mybutton -/*A simple actuator example. read the key button status*/ -//RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); -RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button", "title=\"Button\";rt=\"button\""); -void -button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - static char bname[17]="button1"; - int success = 1; - - char temp[100]; - int index = 0; - int length = 0; /* |<-------->| */ - const char *name = NULL; - size_t len = 0; - - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname); - if(is_button()) - index += sprintf(temp + index," \"state\" : \"on\"\n"); - else - index += sprintf(temp + index," \"state\" : \"off\"\n"); - index += sprintf(temp + index,"}\n"); - - length = strlen(temp); - memcpy(buffer, temp,length ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, length); - - break; - case METHOD_PUT: - - if (success && (len=REST.get_post_variable(request, "name", &name))) { - PRINTF("name %s\n", name); - memcpy(bname, name,len); - bname[len]=0; - } else { - success = 0; - } - break; - default: - success = 0; - } - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} /*A simple actuator example, post variable mode, relay is activated or deactivated*/ -RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1", "title=\"Led1\";rt=\"led\""); +RESOURCE(led1, METHOD_GET | METHOD_PUT , "actors/led1", "title=\"Led1\";rt=\"led\""); void led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -291,16 +226,15 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre char message[100]; int length = 0; /* |<-------->| */ - int ret=0; int grad=0; int kgrad=0; -// ret=ds1820_temp(); + if(ds1820_ok[0] & 0x01){ kgrad=5; } grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; - uint16_t *accept = NULL; + const uint16_t *accept = NULL; int num = REST.get_header_accept(request, &accept); if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) @@ -339,11 +273,8 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred { char message[100]; int length = 0; /* |<-------->| */ - int ret=0; -// dht11_temp=DHT_Read_Data(DHT_Temp); -// dht11_hum=DHT_Read_Data(DHT_RH); - uint16_t *accept = NULL; + const uint16_t *accept = NULL; int num = REST.get_header_accept(request, &accept); if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) @@ -374,194 +305,6 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } #endif //REST_RES_DHT11 -#if REST_RES_HELLO -/* - * Resources are defined by the RESOURCE macro. - * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). - */ -RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\""); - -/* - * A handler function named [resource name]_handler must be implemented for each RESOURCE. - * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore - * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. - * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. - */ -void -helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - const char *len = NULL; - /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ - char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy"; - int length = 12; /* |<-------->| */ - - /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */ - if (REST.get_query_variable(request, "len", &len)) { - length = atoi(len); - if (length<0) length = 0; - if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE; - memcpy(buffer, message, length); - } else { - memcpy(buffer, message, length); - } - - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */ - REST.set_header_etag(response, (uint8_t *) &length, 1); - REST.set_response_payload(response, buffer, length); -} -#endif - -/******************************************************************************/ -#if REST_RES_MIRROR -/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ -RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); - -void -mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - /* The ETag and Token is copied to the header. */ - uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; - - /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ - static char location[] = {'/','f','/','a','?','k','&','e', 0}; - - /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ - unsigned int content_type = REST.get_header_content_type(request); - - /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ - uint32_t max_age = 0; - const char *str = NULL; - uint32_t observe = 0; - const uint8_t *bytes = NULL; - uint32_t block_num = 0; - uint8_t block_more = 0; - uint16_t block_size = 0; - const char *query = ""; - int len = 0; - - /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ - - int strpos = 0; - /* snprintf() counts the terminating '\0' to the size parameter. - * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. - * Add +1 to fill the complete buffer. */ - strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); - - /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. - * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ - if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); - } - - if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str); - } - -/* CoAP-specific example: actions not required for normal RESTful Web service. */ -#if WITH_COAP > 1 - if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe)) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe); - } - if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x"); - int index = 0; - for (index = 0; index 03 */ -#endif /* CoAP-specific example */ - - if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query); - } - if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes))) - { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes); - } - - if (strpos >= REST_MAX_CHUNK_SIZE) - { - buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ - } - - REST.set_response_payload(response, buffer, strpos); - - PRINTF("/mirror options received: %s\n", buffer); - - /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ - REST.set_header_etag(response, opaque, 2); - REST.set_header_location(response, location); /* Initial slash is omitted by framework */ - -/* CoAP-specific example: actions not required for normal RESTful Web service. */ -#if WITH_COAP > 1 - coap_set_header_uri_host(response, "tiki"); - coap_set_header_observe(response, 10); -#if WITH_COAP == 3 - coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ -#else - coap_set_header_proxy_uri(response, "ftp://x"); - coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */ - coap_set_header_block1(response, 23, 0, 16); - coap_set_header_accept(response, TEXT_PLAIN); - coap_set_header_if_none_match(response); -#endif /* CoAP > 03 */ -#endif /* CoAP-specific example */ -} -#endif /* REST_RES_MIRROR */ - /******************************************************************************/ #if REST_RES_CHUNKS /* @@ -800,35 +543,6 @@ event_event_handler(resource_t *r) } #endif /* PLATFORM_HAS_BUTTON */ -/******************************************************************************/ -#if REST_RES_SUB -/* - * Example for a resource that also handles all its sub-resources. - * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path. - */ -RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\""); - -void -sub_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); - - const char *uri_path = NULL; - int len = REST.get_url(request, &uri_path); - int base_len = strlen(resource_sub.url); - - if (len==base_len) - { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url); - } - else - { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); - } - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); -} -#endif /******************************************************************************/ #if defined (PLATFORM_HAS_LEDS) @@ -894,48 +608,6 @@ toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre #endif #endif /* PLATFORM_HAS_LEDS */ -/******************************************************************************/ -#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT) -/* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\""); -void -light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC); - uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR); - - const uint16_t *accept = NULL; - int num = REST.get_header_accept(request, &accept); - - if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) - { - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar); - - REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); - } - else if (num && (accept[0]==REST.type.APPLICATION_XML)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_XML); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar); - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); - } - else if (num && (accept[0]==REST.type.APPLICATION_JSON)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar); - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); - } - else - { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); - const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; - REST.set_response_payload(response, msg, strlen(msg)); - } -} -#endif /* PLATFORM_HAS_LIGHT */ /******************************************************************************/ #if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) @@ -1007,71 +679,9 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } #endif /* PLATFORM_HAS_BATTERY */ - -#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO -/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */ -RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\""); - -void -radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - size_t len = 0; - const char *p = NULL; - uint8_t param = 0; - int success = 1; - - const uint16_t *accept = NULL; - int num = REST.get_header_accept(request, &accept); - - if ((len=REST.get_query_variable(request, "p", &p))) { - PRINTF("p %.*s\n", len, p); - if (strncmp(p, "lqi", len)==0) { - param = RADIO_SENSOR_LAST_VALUE; - } else if(strncmp(p,"rssi", len)==0) { - param = RADIO_SENSOR_LAST_PACKET; - } else { - success = 0; - } - } else { - success = 0; - } - - if (success) { - if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) - { - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param)); - - REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); - } - else if (num && (accept[0]==REST.type.APPLICATION_JSON)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - - if (param == RADIO_SENSOR_LAST_VALUE) { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param)); - } else if (param == RADIO_SENSOR_LAST_PACKET) { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param)); - } - - REST.set_response_payload(response, buffer, strlen((char *)buffer)); - } - else - { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); - const char *msg = "Supporting content-types text/plain and application/json"; - REST.set_response_payload(response, msg, strlen(msg)); - } - } else { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} -#endif - void hw_init() { - key_init(); led1_off(); #if REST_RES_DS1820 ds1820_temp(); @@ -1096,8 +706,6 @@ PROCESS_THREAD(rest_server_example, ev, data) PROCESS_BEGIN(); - - PRINTF("Starting Erbium Example Server\n"); #ifdef RF_CHANNEL @@ -1125,7 +733,6 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_init_engine(); /* Activate the application-specific resources. */ - rest_activate_resource(&resource_button); rest_activate_resource(&resource_led1); /* Activate the application-specific resources. */ #if REST_RES_DS1820 @@ -1137,12 +744,6 @@ PROCESS_THREAD(rest_server_example, ev, data) #if REST_RES_INFO rest_activate_resource(&resource_info); #endif -#if REST_RES_HELLO - rest_activate_resource(&resource_helloworld); -#endif -#if REST_RES_MIRROR - rest_activate_resource(&resource_mirror); -#endif #if REST_RES_CHUNKS rest_activate_resource(&resource_chunks); #endif @@ -1159,9 +760,6 @@ PROCESS_THREAD(rest_server_example, ev, data) #if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3)) SENSORS_ACTIVATE(button_sensor); #endif -#if REST_RES_SUB - rest_activate_resource(&resource_sub); -#endif #if defined (PLATFORM_HAS_LEDS) #if REST_RES_LEDS rest_activate_resource(&resource_leds); @@ -1170,10 +768,6 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_activate_resource(&resource_toggle); #endif #endif /* PLATFORM_HAS_LEDS */ -#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT - SENSORS_ACTIVATE(light_sensor); - rest_activate_resource(&resource_light); -#endif #if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE SENSORS_ACTIVATE(temperature_sensor); rest_activate_resource(&resource_temperature); @@ -1182,10 +776,6 @@ PROCESS_THREAD(rest_server_example, ev, data) SENSORS_ACTIVATE(battery_sensor); rest_activate_resource(&resource_battery); #endif -#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO - SENSORS_ACTIVATE(radio_sensor); - rest_activate_resource(&resource_radio); -#endif /* Define application-specific events here. */ etimer_set(&ds_periodic_timer, MESURE_INTERVAL); diff --git a/examples/osd/climate/project-conf.h b/examples/osd/climate/project-conf.h index dcbd00805..0d77f7f2e 100644 --- a/examples/osd/climate/project-conf.h +++ b/examples/osd/climate/project-conf.h @@ -34,12 +34,10 @@ //#define PLATFORM_HAS_LEDS 1 //#define PLATFORM_HAS_BUTTON 1 -//#define PLATFORM_HAS_LIGHT 1 #define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 -//#define PLATFORM_HAS_SHT11 1 - -#define SICSLOWPAN_CONF_FRAG 1 +#define PLATFORM_HAS_SHT11 1 +//#define SICSLOWPAN_CONF_FRAG 1 /* Disabling RDC for demo purposes. Core updates often require more memory. */ /* For projects, optimize memory and enable RDC again. */ From ec5210b5622978ea9d4b46c38fa75fce58e17989 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 28 May 2013 09:57:23 +0200 Subject: [PATCH 066/345] periodic prints configurable --- platform/osd-merkur/contiki-main.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index b71067919..d3767f341 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -101,7 +101,7 @@ uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; /* 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 +#define PERIODICPRINTS 0 #if PERIODICPRINTS //#define PINGS 64 #define ROUTES 600 @@ -116,7 +116,7 @@ void rtimercycle(void) {rtimerflag=1;} #endif #endif -uint16_t ledtimer; +//uint16_t ledtimer; /*-------------------------------------------------------------------------*/ /*----------------------Configuration of the .elf file---------------------*/ @@ -147,7 +147,7 @@ FUSES ={.low = 0xC2, .high = 0x99, .extended = 0xfe,}; #include "dev/button-sensor.h" #include "dev/battery-sensor.h" #include "dev/pir-sensor.h" -SENSORS(&button_sensor, &battery_sensor, &pir_sensor); +SENSORS(&button_sensor, &pir_sensor); uint8_t rng_get_uint8(void) { @@ -199,7 +199,7 @@ void initialize(void) #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); +// 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); @@ -441,6 +441,7 @@ main(void) process_run(); watchdog_periodic(); +#if 0 /* Turn off LED after a while */ if (ledtimer) { if (--ledtimer==0) { @@ -448,12 +449,13 @@ main(void) PORTE&=~(1< Date: Tue, 28 May 2013 10:55:14 +0200 Subject: [PATCH 067/345] initial upload --- examples/osd/pingtheplug/Makefile | 90 +++ examples/osd/pingtheplug/README | 76 +++ examples/osd/pingtheplug/er-example-server.c | 611 +++++++++++++++++++ examples/osd/pingtheplug/flash.sh | 2 + examples/osd/pingtheplug/pcintkey.c | 118 ++++ examples/osd/pingtheplug/pcintkey.h | 52 ++ examples/osd/pingtheplug/project-conf.h | 77 +++ examples/osd/pingtheplug/run.sh | 6 + examples/osd/pingtheplug/server-client.csc | 227 +++++++ examples/osd/pingtheplug/server-only.csc | 189 ++++++ examples/osd/pingtheplug/static-routing.c | 155 +++++ examples/osd/pingtheplug/static-routing.h | 20 + examples/osd/pingtheplug/todo | 9 + 13 files changed, 1632 insertions(+) create mode 100644 examples/osd/pingtheplug/Makefile create mode 100644 examples/osd/pingtheplug/README create mode 100644 examples/osd/pingtheplug/er-example-server.c create mode 100755 examples/osd/pingtheplug/flash.sh create mode 100644 examples/osd/pingtheplug/pcintkey.c create mode 100644 examples/osd/pingtheplug/pcintkey.h create mode 100644 examples/osd/pingtheplug/project-conf.h create mode 100755 examples/osd/pingtheplug/run.sh create mode 100644 examples/osd/pingtheplug/server-client.csc create mode 100644 examples/osd/pingtheplug/server-only.csc create mode 100644 examples/osd/pingtheplug/static-routing.c create mode 100644 examples/osd/pingtheplug/static-routing.h create mode 100644 examples/osd/pingtheplug/todo diff --git a/examples/osd/pingtheplug/Makefile b/examples/osd/pingtheplug/Makefile new file mode 100644 index 000000000..9f5e50f5a --- /dev/null +++ b/examples/osd/pingtheplug/Makefile @@ -0,0 +1,90 @@ +all: er-example-server +# 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 +# pcintkey +PROJECT_SOURCEFILES += pcintkey.c + +# 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 diff --git a/examples/osd/pingtheplug/README b/examples/osd/pingtheplug/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/pingtheplug/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/pingtheplug/er-example-server.c b/examples/osd/pingtheplug/er-example-server.c new file mode 100644 index 000000000..f69e7f8c1 --- /dev/null +++ b/examples/osd/pingtheplug/er-example-server.c @@ -0,0 +1,611 @@ +/* + * 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) PIR REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + * Harald Pichler + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_OPTRIAC 1 +#define REST_RES_TEMPERATURE 1 +#define REST_RES_EVENT 0 +#define REST_RES_LEDS 0 +#define REST_RES_TOGGLE 0 +#define REST_RES_BATTERY 1 + +#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" +#include "pcintkey.h" + +#include "dev/led.h" +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_OPTRIAC) +#include "dev/optriac-sensor.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif + +#include "dev/optriac.h" + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#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_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); + index += sprintf(message + index," \"name\" : \"light-actor\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +// pcintkey_ext +/*A simple actuator example. read the key button status*/ +RESOURCE(extbutton, METHOD_GET | METHOD_PUT , "sensors/extbutton", "title=\"ext.Button\";rt=\"Text\""); +void +extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname1[17]="button1"; + static char bname2[17]="button2"; + static char bname3[17]="button3"; + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"%s\" : ",bname1); + if(is_button_ext4()) + index += sprintf(temp + index,"\"on\",\n"); + else + index += sprintf(temp + index,"\"off\",\n"); + index += sprintf(temp + index,"{\n \"%s\" : ",bname2); + if(is_button_ext5()) + index += sprintf(temp + index,"\"on\",\n"); + else + index += sprintf(temp + index,"\"off\",\n"); + index += sprintf(temp + index," \"%s\" : ",bname3); + if(is_button_ext6()) + index += sprintf(temp + index,"\"on\"\n"); + else + index += sprintf(temp + index,"\"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname1, name,len); + bname1[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +/*A simple actuator example, post variable mode, relay is activated or deactivated*/ +RESOURCE(led1, METHOD_GET | METHOD_PUT , "actuators/led1", "title=\"Led1\";rt=\"led\""); +void +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char mode[10]; + static uint8_t led1 = 0; + static char name[17]="led1"; + int success = 1; + + char temp[100]; + int index = 0; + size_t len = 0; + + const char *pmode = NULL; + const char *pname = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); + if(led1 == 0) + index += sprintf(temp + index," \"mode\" : \"off\"\n"); + if(led1 == 1) + index += sprintf(temp + index," \"mode\" : \"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { + PRINTF("name %s\n", mode); + memcpy(mode, pmode,len); + mode[len]=0; + if (!strcmp(mode, "on")) { + led1_on(); + led1 = 1; + } else if (!strcmp(mode, "off")) { + led1_off(); + led1 = 0; + } else { + success = 0; + } + } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { + PRINTF("name %s\n", name); + memcpy(name, pname,len); + name[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/******************************************************************************/ +#if defined (PLATFORM_HAS_OPTRIAC) +/******************************************************************************/ +#if REST_RES_OPTRIAC +/*A simple actuator example*/ +RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC, POST/PUT mode=on|off\";rt=\"Control\""); + +void +optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *mode = NULL; + static char namea[17]="Triac-a"; + static char nameb[17]="Triac-b"; + + char temp[100]; + int index = 0; + size_t len = 0; + int success = 1; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"%s\" : ",namea); + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0) + index += sprintf(temp + index,"\"off\",\n"); + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1) + index += sprintf(temp + index,"\"on\",\n"); + index += sprintf(temp + index," \"%s\" : ",nameb); + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0) + index += sprintf(temp + index,"\"off\"\n"); + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1) + index += sprintf(temp + index,"\"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + if (strncmp(mode, "on", len)==0) { + led1_on(); // Debug + optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + } else if (strncmp(mode, "off", len)==0) { + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + led1_off(); // Debug + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif +/******************************************************************************/ +#endif /* PLATFORM_HAS_OPTRIAC */ + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ +/******************************************************************************/ + + + +void +hw_init() +{ + led1_off(); + key_init(); +} + +#define MESURE_INTERVAL (CLOCK_SECOND/2) + +PROCESS(rest_server_example, "Erbium Example Server"); + +AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + static struct etimer ds_periodic_timer; + static int ext4=0; + static int ext5=0; + static int ext6=0; +// ext4 = is_button_ext4(); +// ext5 = is_button_ext5(); +// ext6 = is_button_ext6(); + + + PROCESS_BEGIN(); + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_led1); + rest_activate_resource(&resource_extbutton); +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif + /* Activate the application-specific resources. */ +#if REST_RES_OPTRIAC + SENSORS_ACTIVATE(optriac_sensor); + rest_activate_resource(&resource_optriac); +#endif +#if defined (PLATFORM_HAS_PIR) && (REST_RES_EVENT) + SENSORS_ACTIVATE(pir_sensor); + rest_activate_event_resource(&resource_pir); + PRINTF("ACTIVATE PIR\n"); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif + + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (REST_RES_EVENT) + if (ev == sensors_event ) { + PRINTF("EVENT\n"); +#if (REST_RES_EVENT && defined (PLATFORM_HAS_PIR)) + if (data == &pir_sensor) { + PRINTF("PIR EVENT\n"); + /* Call the event_handler for this application-specific event. */ + pir_event_handler(&resource_pir); + PRINTF("CALL EVENT HANDLER\n"); + } +#endif /* PLATFORM_HAS_PIR */ + } +#endif /* REST_RES_EVENT */ + /* Button Tric Logic */ + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("Periodic %d %d\n",ext5,ext6); + if(ext5 != is_button_ext5()) { + ext5 = is_button_ext5(); + PRINTF("Toggle Triac A\n"); + // Toggle Triac A + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0){ + optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + led1_on(); + }else{ + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + led1_off(); + } + } + if(ext6 != is_button_ext6()) { + ext6 = is_button_ext6(); + PRINTF("Toggle Triac B\n"); + // Toggle Triac B + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0){ + optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + led2_on(); + }else{ + optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + led2_off(); + } + } + etimer_reset(&ds_periodic_timer); + } + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/pingtheplug/flash.sh b/examples/osd/pingtheplug/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/pingtheplug/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/pingtheplug/pcintkey.c b/examples/osd/pingtheplug/pcintkey.c new file mode 100644 index 000000000..3da35669d --- /dev/null +++ b/examples/osd/pingtheplug/pcintkey.c @@ -0,0 +1,118 @@ +/* + * 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 +#include "dev/led.h" +#include "pcintkey.h" + +/*---------------------------------------------------------------------------*/ + +ISR(PCINT0_vect) +{ +// if(BUTTON_CHECK_IRQ()) { +// if(timer_expired(&debouncetimer)) { +// led1_on(); +// timer_set(&debouncetimer, CLOCK_SECOND / 4); +// sensors_changed(&button_sensor); +// led1_off(); +// } +// } +} +/** + * \brief This will intialize the KEY for button readings. +*/ +void +key_init(void) +{ + // Pairing Button + PORTB |= (1< +#include + +void key_init(void); +uint8_t is_button_ext4(void); +uint8_t is_button_ext5(void); +uint8_t is_button_ext6(void); + +#endif /* __KEY_H__ */ diff --git a/examples/osd/pingtheplug/project-conf.h b/examples/osd/pingtheplug/project-conf.h new file mode 100644 index 000000000..54f947d7e --- /dev/null +++ b/examples/osd/pingtheplug/project-conf.h @@ -0,0 +1,77 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_OPTRIAC 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 + +#define SICSLOWPAN_CONF_FRAG 1 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +//#undef RDC_CONF_MCU_SLEEP +//#define RDC_CONF_MCU_SLEEP 0 + +/* 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__ */ diff --git a/examples/osd/pingtheplug/run.sh b/examples/osd/pingtheplug/run.sh new file mode 100755 index 000000000..4f21e9b63 --- /dev/null +++ b/examples/osd/pingtheplug/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/pingtheplug/server-client.csc b/examples/osd/pingtheplug/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/pingtheplug/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/pingtheplug/server-only.csc b/examples/osd/pingtheplug/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/pingtheplug/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/pingtheplug/static-routing.c b/examples/osd/pingtheplug/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/pingtheplug/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/pingtheplug/static-routing.h b/examples/osd/pingtheplug/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/pingtheplug/static-routing.h @@ -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_ */ diff --git a/examples/osd/pingtheplug/todo b/examples/osd/pingtheplug/todo new file mode 100644 index 000000000..c72368662 --- /dev/null +++ b/examples/osd/pingtheplug/todo @@ -0,0 +1,9 @@ +*) pcintkey-sensor +Die PinChange Interrupts der Pins laufen alle über PCINT0_vect. + +Somit sollte der folgende Code für die Aktivierung reichen: +PCICR |= BV(PCIE0); +PCMSK0 |= BV(PCINT4) | BV(PCINT5) | BV(PCINT6); + +*) led-sensor +*) EmbedVM integration From 611e358ad94d5e05a2f20a78690671423439fac3 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 4 Jun 2013 11:28:42 +0200 Subject: [PATCH 068/345] add BOOTLOADER_GET_MAC --- platform/osd-merkur/Makefile.osd-merkur | 6 ++++++ platform/osd-merkur/params.c | 9 +++++++++ platform/osd-merkur/params.h | 6 ++++-- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 3c97ed6cb..fd3a75b36 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -43,6 +43,12 @@ AVRDUDE_PORT=usb:00B000000D79 # Verify off AVRDUDE_OPTIONS=-V +#debug +# CFLAGS += -save-temps +# Bootloader bonsai +# LDFLAGS += -save-temps +LDFLAGS += -Wl,--defsym,bootloader_get_mac=0x0001f3a0 + include $(CONTIKIAVR)/Makefile.avr include $(CONTIKIAVR)/radio/Makefile.radio diff --git a/platform/osd-merkur/params.c b/platform/osd-merkur/params.c index aadbb83c4..a5a83932a 100644 --- a/platform/osd-merkur/params.c +++ b/platform/osd-merkur/params.c @@ -84,6 +84,9 @@ const uint8_t default_domain_name[] PROGMEM = PARAMS_DOMAINNAME; #if PARAMETER_STORAGE==0 /* 0 Hard coded, minmal program and eeprom usage. */ + +extern uint8_t bootloader_get_mac(uint8_t); + uint8_t params_get_eui64(uint8_t *eui64) { #if CONTIKI_CONF_RANDOM_MAC @@ -92,7 +95,13 @@ params_get_eui64(uint8_t *eui64) { return 1; #else uint8_t i; +#if BOOTLOADER_GET_MAC + for (i=0;i Date: Tue, 11 Jun 2013 16:07:54 +0200 Subject: [PATCH 069/345] initial upload --- examples/osd/6lowpan-tk/Makefile | 90 ++++ examples/osd/6lowpan-tk/README | 76 ++++ examples/osd/6lowpan-tk/er-example-server.c | 459 ++++++++++++++++++++ examples/osd/6lowpan-tk/flash.sh | 2 + examples/osd/6lowpan-tk/intkey.c | 107 +++++ examples/osd/6lowpan-tk/intkey.h | 52 +++ examples/osd/6lowpan-tk/project-conf.h | 72 +++ examples/osd/6lowpan-tk/run.sh | 6 + examples/osd/6lowpan-tk/server-client.csc | 227 ++++++++++ examples/osd/6lowpan-tk/server-only.csc | 189 ++++++++ examples/osd/6lowpan-tk/static-routing.c | 155 +++++++ examples/osd/6lowpan-tk/static-routing.h | 20 + 12 files changed, 1455 insertions(+) create mode 100644 examples/osd/6lowpan-tk/Makefile create mode 100644 examples/osd/6lowpan-tk/README create mode 100644 examples/osd/6lowpan-tk/er-example-server.c create mode 100755 examples/osd/6lowpan-tk/flash.sh create mode 100644 examples/osd/6lowpan-tk/intkey.c create mode 100644 examples/osd/6lowpan-tk/intkey.h create mode 100644 examples/osd/6lowpan-tk/project-conf.h create mode 100755 examples/osd/6lowpan-tk/run.sh create mode 100644 examples/osd/6lowpan-tk/server-client.csc create mode 100644 examples/osd/6lowpan-tk/server-only.csc create mode 100644 examples/osd/6lowpan-tk/static-routing.c create mode 100644 examples/osd/6lowpan-tk/static-routing.h diff --git a/examples/osd/6lowpan-tk/Makefile b/examples/osd/6lowpan-tk/Makefile new file mode 100644 index 000000000..391be1dc9 --- /dev/null +++ b/examples/osd/6lowpan-tk/Makefile @@ -0,0 +1,90 @@ +all: er-example-server +# 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 +# intkey +PROJECT_SOURCEFILES += intkey.c + +# 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 diff --git a/examples/osd/6lowpan-tk/README b/examples/osd/6lowpan-tk/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/6lowpan-tk/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/6lowpan-tk/er-example-server.c b/examples/osd/6lowpan-tk/er-example-server.c new file mode 100644 index 000000000..26dd0e096 --- /dev/null +++ b/examples/osd/6lowpan-tk/er-example-server.c @@ -0,0 +1,459 @@ +/* + * 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) PIR REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + * Harald Pichler + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_TEMPERATURE 0 +//#define REST_RES_EVENT 1 +#define REST_RES_LEDS 1 +#define REST_RES_TOGGLE 1 +#define REST_RES_BATTERY 1 + +#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" +#include "intkey.h" + +#include "dev/led.h" +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); + index += sprintf(message + index," \"name\" : \"6lowpan-tk\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +// pcintkey_ext +/*A simple actuator example. read the key button status*/ +RESOURCE(extbutton, METHOD_GET | METHOD_PUT , "sensors/extbutton", "title=\"ext.Button\";rt=\"Text\""); +void +extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + static char bname1[17]="reed1"; + static char bname2[17]="reed2"; + static char bname3[17]="sabotage"; + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + size_t len = 0; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"%s\" : ",bname1); + if(is_reed1()) + index += sprintf(temp + index,"\"on\",\n"); + else + index += sprintf(temp + index,"\"off\",\n"); + index += sprintf(temp + index,"\n \"%s\" : ",bname2); + if(is_reed2()) + index += sprintf(temp + index,"\"on\",\n"); + else + index += sprintf(temp + index,"\"off\",\n"); + index += sprintf(temp + index," \"%s\" : ",bname3); + if(is_sabotage()) + index += sprintf(temp + index,"\"on\"\n"); + else + index += sprintf(temp + index,"\"off\"\n"); + index += sprintf(temp + index,"}\n"); + + length = strlen(temp); + memcpy(buffer, temp,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + + break; + case METHOD_PUT: + + if (success && (len=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + memcpy(bname1, name,len); + bname1[len]=0; + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/******************************************************************************/ +#if REST_RES_EVENT +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(reed1, METHOD_GET, "sensors/reed1", "title=\"Event demo\";obs"); + +void +reed1_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); + /* Usually, a CoAP server would response with the current resource representation. */ + const char *msg = "It's eventful!"; + REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +reed1_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("REED1 TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_EVENT */ + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ +/******************************************************************************/ + +void +hw_init() +{ + leds_off(LEDS_RED); + intkey_init(); +} + +PROCESS(rest_server_example, "Erbium Example Server"); + +AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_extbutton); +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif + /* Activate the application-specific resources. */ +#if defined (REST_RES_EVENT) +// SENSORS_ACTIVATE(reed1_sensor); + rest_activate_event_resource(&resource_reed1); + PRINTF("ACTIVATE REED1\n"); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (REST_RES_EVENT) + if (ev == sensors_event ) { + PRINTF("EVENT\n"); + if (data == &reed1_sensor) { + PRINTF("REED1 EVENT\n"); + /* Call the event_handler for this application-specific event. */ + reed1_event_handler(&resource_reed1); + PRINTF("CALL EVENT HANDLER\n"); + } + } +#endif /* REST_RES_EVENT */ + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/6lowpan-tk/flash.sh b/examples/osd/6lowpan-tk/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/6lowpan-tk/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/6lowpan-tk/intkey.c b/examples/osd/6lowpan-tk/intkey.c new file mode 100644 index 000000000..2233ea1d3 --- /dev/null +++ b/examples/osd/6lowpan-tk/intkey.c @@ -0,0 +1,107 @@ +/* + * 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 +#include "dev/led.h" +#include "intkey.h" + +/*---------------------------------------------------------------------------*/ + +/** + * \brief This will intialize the KEY for button readings. +*/ +void +intkey_init(void) +{ + // Reed1 + PORTB |= (1< +#include + +void intkey_init(void); +uint8_t is_reed1(void); +uint8_t is_reed2(void); +uint8_t is_sabotage(void); + +#endif /* __KEY_H__ */ diff --git a/examples/osd/6lowpan-tk/project-conf.h b/examples/osd/6lowpan-tk/project-conf.h new file mode 100644 index 000000000..106789103 --- /dev/null +++ b/examples/osd/6lowpan-tk/project-conf.h @@ -0,0 +1,72 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +//#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 + +#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__ */ diff --git a/examples/osd/6lowpan-tk/run.sh b/examples/osd/6lowpan-tk/run.sh new file mode 100755 index 000000000..4f21e9b63 --- /dev/null +++ b/examples/osd/6lowpan-tk/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/6lowpan-tk/server-client.csc b/examples/osd/6lowpan-tk/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/6lowpan-tk/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/6lowpan-tk/server-only.csc b/examples/osd/6lowpan-tk/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/6lowpan-tk/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/6lowpan-tk/static-routing.c b/examples/osd/6lowpan-tk/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/6lowpan-tk/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/6lowpan-tk/static-routing.h b/examples/osd/6lowpan-tk/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/6lowpan-tk/static-routing.h @@ -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_ */ From ae7b37d1c36ac05e055d8c47ceec6b7ac75836a5 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 5 Jul 2013 13:15:48 +0200 Subject: [PATCH 070/345] add binarys --- .../er-example-client.osd-merkur | Bin 0 -> 410797 bytes .../er-example-client.osd-merkur.eep | 4 ++++ .../er-example-server.osd-merkur | Bin 0 -> 418175 bytes .../er-example-server.osd-merkur.eep | 1 + 4 files changed, 5 insertions(+) create mode 100755 examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur create mode 100644 examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur.eep create mode 100755 examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur create mode 100644 examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur new file mode 100755 index 0000000000000000000000000000000000000000..69fceea9d87e77b77480e2859c86a95e44608ec6 GIT binary patch literal 410797 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�q^v|Ke4~D zA>s(}CFPx7%Jivg=tR;FQPtm)7wdzb9l!3-Jzc7gL$w)54_FHxO8k#}M_++2l9bc* z0gbnk_vPWS>tPRTHE2~u>J9^?4#1cvEER}XMV7z7YQEC;oS(2Qu-#&_IL0E%wnK@4 zqq+V$JIPjr_8C44ko}wBr~AEhHj06z5ua?!v61aZw$Yo)e$U-2DL$8Md(tqXq}k#F zB9)?55Fd(@yPCB?t6+PC$L45Z-GUU^5;xveBO{>5$+ZdBqO zXH?v1s}peN%raL+mhAO9ym`1A#$&VD9uP_^?y{-(##Gsc`qm3W{hXZW8z)#~YrdFI z`ykUTvjY4PIti}&Z;kC1`Sd%~N&?PwBvvI={lF&r?t%y4)pyKIleW_8pIVz=+t{>v zYn6}g4kO$=zBg)jIp{q_#^2y5aM1f2-+D)_gWiAad(*K)c|RKOCppYEdjBUM`I>A; zb4-Qfs8n9u^`l;%d$9Oz+fEz7B1uGR@2)I^Oyz6mZY*Bi*jRg0)(j7of93vz#cww5 zXdHC3%(QeI)tDc*Y*Z#V9Nor6HMsjX7H?>*Z&XU(cd+=4ExQ_DKUQlJl+xBXanv>U zp^YuMTd1`CzKzA}x72Q-(pymaz?PS{Sl)5*PP5h9Sdkh}r?bq^w#~R}t1z&FEeY9i zgC(ACH+5&3p(nP*of)-R{=oFfIP!AMGn36gx+F72Npv#r#f-Ny273O|MHJTb`JDX8 z`M=1&KR?qk-Z8^*rvtloh(#{+A1myPjt$7o@;%+fWYI*sf`VM2_mD+Rngp#Xt~v5o zUaw!TN|En=-|JUluU`qc&u4~tym|E4@05Fxh?5f58fGN#9v`+Uy6g<$eXS$gv8nlL zYY;Uvd>Rx_sSo`B2K?*!4Y0gb`Q1;UK=jM~u#0u! z|2PgZPV}gDF3nuxQKU6e|Gt2(_=Uf*6o17JrEP4#e6oj{$LqhZFS0eWH(SVqyO@85 z=dZele`VSjCi-)*3W_R9Di+9^CHe>~(UbKT>WvC_bin6fY>nLCeYyTXeStVtJOjz1 z+CJ;qSU}-ch1W%%7we+_T$5(WoMFGZ>XH3hAK2M?u&V)f$D6)yx)OFfo8E3B>`3ze z6n3YZe(b?6TsBI6-Mh`}2j?A#b~NncrCrW9>Th!olFGXEQsYRO{O{HZi%~RR2uq9{vg_8NCg$5?a6k+j5sCntId$`BSz1Rn>*_7jOa29 za~XfdLV1g6&$#d46S8(EOEGqXGt)WVNl^-W*_G;ymN$p$*t#u}t=d!lP}b8~Inv)@ zHxvj{g}eRN47qM(B|9kBChw8g4M+;a$q6#Wln_kX0YPNNHH6D|%nqHPr&2)~ECqFs_m z9B}VWyxo>8H$}j4bPtnOD|OfSX=EIs`r5c?wAd%_L@gQ-)$io$9w}9!{j9A&+uCny z;@0Xbw5yFPwM`?tU4F3_9072sAI2SpI|gh`+3LJXIOpYEz2LYpPx|dh+(CV)xug#o z4(i-GA-~eArigLyDK=Nsj@nSo-s9K1{Je*3 zD43h_5hI7$JWK z)=KLxJSJPvr)!Q~-lwFVJ`Gp;^wkMZvEotf5~icxSV1W;dqY0WS_of4Y@q5F`Xy&9&`esjb?u z>OE1B{+dWDHhc;K=Am+Pl#|IqV^TnHC3S?(H|do-RF>7w$DK28D%SPj-)LpHR?R-u zauREX)@U9g)t8IYZ&(c^DG4L>78}HmBSxw*iEgr?^LZ}p%y8J5QN1|YT{ackZZOAo6_C?Gj%vq z`to_oj^(Onxsr{=QA*St*-doMnGO+t2HY!#6V-?y@+G-Mq{UdoRT5r*U1Y#-9e$@u z@%5=q$2WbyiQ1%={#Zz{wrXt2EX0-&^(eMPjYeH-)+pQ^@=T}{(&%%F#Umb;+Mt_~ z3Ilca#?m_6B1BOqde^7CRABV4P~uH5_bS%0znk7ej44q{i_+W?NVg5Nji~yZjqD?) z^v8zN4H|_fF6=92wDgK6ifE*!BA)db?6ls2h2m|c@jZnzMWk)bmh$-P`7^AN_bSm8 z`oMIFBHIqIM`7RH=KQsj;^rQOk8?-o1x7Ps^_Ip)`rD<%Ouh%78AVMRvktJu46WDS?ky8tz&e)V{)L2C0P@(>mKJh@o;~5Meo2(5w9z;lJ6mJZT@#ktR#(0 zn1cGi?v_i(q4(O-=D+nDk4*lwBlD?;lsdmao#}m@V0%D~%kH5C@v?MfJoiRKF0TmI zIiGXZ4SNo;MUC~Vo9Hx5t`f0+*g}3UZJg8khzlnyFF*T0W6@XJIhVEF+SB&_Al-mS zZ7;^jA}#W0d;0!C`w*3;M$zLd@$}jpR&F?7x_{?@hJB3dt;KUVDfqdCUX=_ zt~4&w`xuwLckO9hRA2w|Ca>vLlg&gP&VoXkRoV)j)k!P#bC%S{`n*_ks^&n=2A2CE z`N1D4SW)oHf_t$OFneX{=8T4qaMI|uBP9xdrdV+56>-SERP1!9wRwH9FJD6O67YNQVh+MUJ*+DPYr8TqmxF6akzKP*lLj{*hbs3Pfb)Jll-YL?EcN8IB`Y0;!k#K35LGC>;0|D697U&_-6Y3h(!E|#ro*( z!{duI9%El!We;q9*C#FNdGOwG+E*9#r$(cwp8s5yszmw`RY?l0WQYark66(Dzk(ge zj}S&YE4|BJ!|8v$w~IZ`@8vJ{>|W7MU_;8rnEi-&zjBH8l=CsMfxD!C;A{luXm<%X zJ;{~}mqbmHpNY5^?ILvIwA$YO0pa!j@1k9*Nwx+&N@FIE8IzyZIb4Z4OZQuF67D@l zJ2DinJh$^7ELC}v=6@GbXbW>QUa3Dq$sLLEhkD8koRSOucHz%F20^K9;7E?R|qllobVY+{ImZ#MrBlaroN@QMN)3! z!cXZG3Uq7wdPBiP`bD~MB5nv*>xOHpqrPncBEvy}-Tmv2iAVIfx%FlIdZoYK>*(-= zcmhRceRZ@`Hu5gs!sDhfZx#NtRTx)V<9%Kq^lNAQc<Xt} zi7vD?cG;j|!AFWoj?=?~41t?hf;e#A`~;S+w^cO4LwTSR!(pX!ZQ z{i$^)`ofFy<2)Z1(O=@r#0%vqHLcKLr&6Cko=R>1wikDM`4zS1$Qs*$g9q*PVgx!QypqKg7Gf?vmZx*w5+??HDhKGjlIywXk6jz0W!Jgrfa`p8oac)vZrD}DdPXtt)q(mpm;4gT+9-YI63rdkelX*Z9=BEmf?+2HP<9E*FDIblS!OBfj)>wSrFf^j{pBx(EIduEStM{#HItsxpYq8m7+5R>c@Vv`xp{>CPAVodTTUVE!k;W%WbJo%;)@!N?mX$m__s2ifAGy>vh@`U z7T=YkTb3aagAJ%pyQjSTGe~Os-qa^uGTIEFO%+1p)0~YHqJh@{1+M|XD?0hgm=f(= z^7fSd_$tWTxUE*LNxHyGE!!i`L0wr#ybbocs)4KV-?8awg9z$&(_2|nTmNYKnfzB1 zdG_Mr!)_Knfv1e_W%}=){qpIEy(Did?SMaVruTg?kvh7n5ntVCtF++CIUCJv^)vu~ zudAq^UyZw@J6Z-NTZBQ$v_H<{3nc2TE7wR5BUYKiI~U&3P3v`#LFy`5v!H%Y{r)G` za>64z9;cHY(VbdLzIc~72s9p;yxbFwksX9l9hiJ-wHjR(>wRKftVA&4JWnkke;VC0 zqrJ;;$GhWSk9QBkgG-^rX=1ThDlQRMiH+h$ahG^d>=3)fwl#(x2&5G$7`2g>x@JM` z5$fG-*L4dW!a-q|uu*6fRtZalQlVIwCYXhI*PsL7$#^ncsoqN|U;qUYu0R0;D3G8~ zz}niI0#7Lv;1&=Cz6ntv0TeKVD3AaO7?Qu~p}t181-LYL~v;bKS+x7HAgG_sGvf5A%0+0n-!H@V&S5*az?IVt$?f z6XbP-zM{8e-#L#4k-m0h5mS%b zT8b|16;sYpa_EZ-ec6P*>_%UVlM17Yy4JGM@ng)RGbRiw^d3@95KxrIri?uqoVXt4 zpF{Z#D8JEkt(W%BDI)jA^g9L>iK)p;4r;n2B*0az2W>=%>tcM+8xFmpGo7hQigslT zZc6tam%e)dFAHo9x~DX4(bcV@tHttNoh-ay3JBXwIBgivd;kB1{t=)*59nL}Bj|LR z-QfO{u1x%IUG;HJY}OTt?_e!#gRFZ2GZVLi;Qfbq|3Aw6LwNrI-fzYG=kdOJ4BbL0 z>FnJXTFS(CbyS1&`1eCOA0danVp1V)GnI)d#7z9!ieFS;mGPbG%QXmL!ZiY@dscn%GL1AQ|@-uqC6x1 zjrDGaj&XVEbDo?&%Xhc9g!JUqV_jl8=H2jQ=UCh``4nkGtARJZML~IEaBn?$NqWy) z%3Y27HHM>3I5*DoAZlia2ILW})UgIHQD*fN?zjL-jJa0*Mg7EG2~Qc^>EO7-p%roB z2>MqTiGTmeIB`DC4lZD2Vi~It=P`<#&g}f2@d79Q27AwS`1=Sf&;%cD-xC+Ji_qEC z-145>ha++y!nce#aS{BToVXBD6SrcT=nMiUOlEv{KS_|2CH|-&FKI0Tmak9CG4pe* zmU{!{!dZb#%j5v=AHdzr0`{+0k7bfecH%}rrS8Qj2^!b+)nl5^XwcMC42hS*v!p4q zGe)9u&Mc%m>+tPGCB{v|f`ezoPFTR}Pgr1vM&Q)@m(`LPuoi~Cv(eKN`Z~^JR=lHFCzS|SJQM3`WYo{g`O~3q16O4zI_BP zGwgbty1Ab4SG}~U=4#8_Koz3PoS;!vVQ#=#m=+j))FR)h;K6tIm$L9{wgSIbU(Bf~ z`ruS4)sl-9I2m@tGuLNHX@zOQszN>(B_$Uw4mu0x1~uGsd*QC-W@2VZ(_%qc{7{q6-cHMmgx%ITzqW^@rJ;vpEL&ls&`Pudg->65Iwq6C6_qfym8-h58+0S zN>S2*@P!LdqcA{mf{r$0;iQ;7T^kQpK|^>I)R}NS%>trV0`@tEPo*(dX%)&1=;Z#O z#NKxMiO`#gj?A_sVZXBMcKL0P>_(NLzF&l+PR)LhrI@eVRfi687lNS;3hPl z*P#WPlWRJ|t#LSceHU(sCOmoEvh$Lu5#LH#?lHJ;MGs#xRgY=ya`KG_IbhIWF$6O@ zm}HREei__%F|GYf*eX@>wUB}}*sr8>Dg7j(3!N!y34NnA){EQ36-@M!u`o7Zmcz3e ziNh@V_p^s+ z;8f-h^>=4ES=(fD=q0kQ+f8aNUqV!)F@p>MZPnEohCZsa0eb2@tcZR^G>!z7)=Akn z)a%!$rJ8%72O8kXZl0>nnKaC*;ZyseE%EvU3%-+qyWcrsC1~?I(B}7`&8i;SAXh}L zh+J`%xh{n58qB(TQGPDU--q(|_moGjh+Gl5;{9fWTqq^ti*uat1WG@N(odoE(>DUDnaxgv7K1?EJosuXbO1lZr?=~HJSSzxNY zd=g`3`1yM5dSxp6J=Y?wo%X5uO0}|Rymp#6fkS&d+OwiPTTgq)6_G0R~5r5N|%+6c8vz2czU8$78$_bC6 z?Z?pe<7j(HPus{9kt-rsTw*3G^H0(YOX}I5YLlRq1KMIhdj!ya(*q5;B63CKioY>` z+VbD#kLA&R`nu}Bhqw?B7Xji!fcS6^MC6Ld6_G1GY~IyEc&%q)eVJ%M8oc?=!r6B7 zTJwHJ`vq7-KSj4+2jElS#O*&xS%cN!-en?*bS0|N$!414DL3?kX1&u?2L4ti?l5t} zi{N<)f$|hXuuOc>R0*#L_DRdjgzY9Evj+~F|Y>Z*?OJWyVy?2AvlVLhWY zOy4;j2fGcLQn@VX;ICuw*L~jeWgTsvYbU_;9VznrjHEmExTYE0yP^5+!t;vh_>oQ- zw-v8~e}#uEv+?cgTB#hz!y91Jj210Q<>rs6LYxQnQ|*Vko={eJmO0I~ zlKSf`xPMx{7pKzP25XYk!PbbI+V{vpi4voI&ke=(f>Yd_@&|mGok}6%P{bNmV)E(K zP?^ZF*7i<$K}m)D_&vWzXRrFG3u|tH(B_1ooCc4?R98B%MUXQv(r%>HMeFk#t5!?KBX ziC+Bmzz>RVw!tInM~ZesXcf^(2|41VM4YFloc2(#M$Fos7W1E`TMK4N)jL+>lyjk; zR>~yEPkrzP=~v*ng`Ii!>+SeT0$_Wi$+wZF=xr;`-e_4G$U)B!u!V?Lu+xa7VQGAbd+9nXFclOdFFaZU#P#WL|dKhFh(`X=iz@ zjc|LdyuAHMaIY7N$Qv-i8YR`@*Us`f+eq98UZbS(jnzOX}ns}OPTEuvA|xUFFujbZi9$3rJ7C^BUEigTt|Xa=-Dny6?#@f{f*F;bjoF(ALo zilM1&UjBZcwCr{r#(jnKr9wM6V-+|frTZb>Ka`F_Iy#gdfOO0Nx|yG5d_PH#n+mk^ zmvrK9MSvngXb<%z{F)w+g&(m~(jDD+Ogwr3yB@TQ-FN&4?ZlP|P01C)=43iUQ6X+l zE)$zT*NP&d_@?qp>8KBE2vKh(vz<_PZU^G4ef@m&g(Dip)*w-2`NBHjvZkxC=bg7` zctd)_h=%vsY#+t#jA|I!0IOgDK~Z-PZ6`^aQSY|X2TP>d&~Lf{jaJ5upzYpA=>D`* z+(pirzoXNM@}zYp1Z~iw)L+=+#k~oiSS9NptedS3N{Mr9Y`vw4Arj;ePK?ogc~Q8F zL5+Jj#~k%8g?bcUhTAKE@jxHRj9Xf7Ke`&Fn;*JX!G(H=m>yt7HIK~KYTiS;=0U9= z=NHtT@P^`lXfOCCL^lwBiSzhY43%Wz0>}(wfE?sTO~08~aOj_*>U_mX&c!xf{7VxSBeW`~Cd8&xU(~ zXacMkuC*QCURhg5{AWE|TYnb&|Ep6BXPpJ`B={<^N0ty#6+_P9Nys8z zyz1Gv+2cc2jr=G?hYiSUe&{MYLl;v)kQ{}bmKGUJczRqUwb6sY5?QG&F0THyzk zTap@kZlI3!s&jne0(ETgR~i3_xPcJ_}Y02?ahr$!8e3ca4#HA!sAPAC|ilLcBSm4btwWGEh+yJA6MJlp>XMu zfH*3pOz`L`1g~z%UCWF4qyEu=IVWidvD=Kr#r8sQsVf!1@Bp68(5oD?hWa@^O#3HfM6 zAKV^++gRXs4KU8ela;anZ?cqnS(vpP+T@is6YzDtY(UCRsj|3$ZB|OHr5aK#Tw+d8 z7OW_5Q_9m_YU^*h9lSN1rw{xB(5au(J7@B9c_YTkf;sj98{nhcbo@BsQw|;<+cVSX z?%jpyPYzlb|76BTKRM%gL|?eXndr-{DZIQK?P#-(R_@ZC`D}Z@RfKyBQ*du#irS_F zRG~7Ry?QgbS8sl*KKVM<-=xhuqtFW2Z7KZS{vri__koXa|D;0EF_?o~;TxbH;kE{U zsofR$+lu+vmZH(4@vhayR2Mw$sf`~Q++#2YTT?1ff;fOW#?`nh)X}1?^Kjf(SSE#M z8Tk$`&WQ7P6kYZ?jENiLBx0QW7k$9KM#&eDQcKi@vQ$`(ov<9xS42-iIc^HRm53Q#1YS=*WR)XVmIy_4>CX-FcaQJkKJO`b=-@^B z!Z-)swreCCHVdfk zD;TYTx1M4|p(Z76@fD`Q`Y?ZPNKaFvFp97ur=_&Bzk)-kZCu_1(lu!2(zm@-sW$M| zmlWu9Z~7ZOu(g`1ABODcvIslc;I^9$?n?NH?|b0?WADr3qbkyN>okNU0$JEXIzTs& z$eN8cf=U7b69f`A0RfYc1QSJwEH0=+FImafolepLQNV>o9R+pVM-J#HxUkGPf-{UZ zn=CGLq#>Xz_j#-ORCfUVzWclPpZoo8L#Llpr%s*P>#eumrRwJ9A0GVi?C&zVo4=T~KRG;MDmbyU z8`yI9Wui0PU)6k66H&Ws=64yUV;>Ja6qt5Sl*HGDS--0jp>YiSOS%p%oEJAUj%@z_ zk;mxns|}@^lpo0e@9A6$PpGv=FUA$cZHz0AUR~cbxauV6TUZe}sC-~Me(KuUpF^(o zYIg1D7JmLy<^I@}*rjf{oAw?DAkm-I_(5HkbAIEZx`Rptm)-2{)S1pf`YHjuz_*kM zu`^?X8_2UrqzCq-YpgXjXGH4t$4+;%9lO*n`Ij&I6Q7zqM?9myzP5>0)9R!(Z7lYu z-?j2oHV?h!c-${>|A_k>WfS(q=U{iaI5q<|zv(RHo+#P@<#?ji!>}4&dxO>RzixVE z(?6BDyd?9SKf_Kzwpq|uNsVOnNTaY8J^$46HP5eqzSpMf^;syFKDiF+!%ret;h_G< zV#k|&BonzH9fLWZsu!Pm(G+2aCpnty_Uc3GH%9tflTY-Xtcw~zzvJT}NG01}wDU~l zJ~g!G$iK#8dDOc!%^gawlS&qOHf?-+qmbRc&8;{$25%28e!k)PP0zpmyzi+wE$y$1 z`+Mo{auOd7_{trj7DPNAcsswt{bM_eJss83 z2xnjqH?6EVDZ^iSCTHZs*iq3;LHvocUT%@7wc4{w#ykf9?i6!~qE zwHcYDl6tmFu=i>w_;6GLo!a}z2wuvN`u8UuMmt?{NAiBAcW#-rBcpfqkZQ_lxO2w6@@PZpH+-1}Vy$#7hMKO85w#HZ3`R~mu7c~6_0AH?2#P~(7;N3mn3`65!SMjdUH zyrn8whTN^RhhB~E%{ky9Fmt$>){u&plZ|`3eivXocXL@nAGKHo$;B+*jyA|cll~Xg zXbs z|If`zDeCdIljN0^%BhEBa0yDf(e2}^kbjTsORBxg-V!_yw$Hm70=oZ~C9Q15s}ZUC zdkq=j_ND5ZdBoh%6#xCHYw$Vq!t5P5A0XPj=FC|olKV(LfgWVDcB<=CcX}4=zrg}t zka~0`deyPxLoWvQKPS9YQhWPqoxC&rTR9bfDc*EMOJ@eRwKD)b^Kq`>I2WG?O4l4u z)ZFAJaT*z)&waG->8$mf*7bR_m5XQ-$jUX7M)OwpWhJ%ZH>J2DE#h&H@M`j@qRp6z z@D12d0nPG?ricN}+A2n?>VQeaK`iPDUKCEhu5_XGW+VDI>A8__5?>7X$Hsa8 zlOewme@UT{zOhBvo-I2jsE<0=o^A))uDS3x)JXC?Er-+&*K^@~J%HA6^rXqYn!A)+ z?rQXMZhdRW_3fzfFE3+uqTE@l>#IrY&j?DESy zILnt6?8lsQnrU{gj9m-AD&KHFmO{^)G#d_qcA~Xvy0gC4S~~|4YIB^WwWbp#wP%&+ z#tn0KWRyv7?O)58TX=!_wAHGj)wZveMTwt)RfE9UWaCftt^vGv3Gcr({0`|nop$e? z^<74RmqP2`NH)zh3hia(1K28tMu=XVLK|IlA^@(OtA9VDK(v%;#+a$U*?4>n-c7I9 z>#Tw<<6&4u`N?+Krgyd|pO){h3Yul$tM?&pB_L>a7+<~N`P<87Uwroi<|m-hU*Y~i zA)8ado^e>EG-|n>sRh*Xr&yhSR7R?Ff6e*dT<`!om@L_yK1p^w$euW@k$s@=MJvw% zcOX0U@|fF2v^>f0ANoa6Pr`2%`>u-5;~u9`|;{BEoDjfWk39g$97PISfR zuomw|K73)UxEWzI!%#YOmOyh`dBvIvnsK^&9P20j3W#jZ2ak@{hP){h{}Ak7hRg~}22ayX&-8{ipqQgB z`q5Yvf9G8Kn>7Itv|9J||GCkCf@0omKPFjx|+IiBRvz+faA>E5LlHF&> zcom*1n+N|Ga-|pbd7@ji`SLP)OBp<8CAuS^=S$=B!;An`(}eNSEs-s>Q*~pf`dwhr zFaEP->m2-uQA-|K-aYw)cP6KCMm;u?`&&FaS)+tDoYUs4yeWGX%dGV{X$ zZpfN@V_fZE*zm0e=P7d$@)PV))yv99)n8Tb#fe@>{cygQPWOC*QTigT+fSK?SUH|0 zD&0MHH(d=t?Fn0+Cnjk-3#^G1_KNHG7i1Nm!h+p*tGmz_n#_B_f1p{T3BD*&)Xy+q z(k%JO?ET56jrNTccl-I>-q76$CEM2&I_LaO{`@{XZ>fe1#CerptB7O8^*5e~ z6W7JKUgM#;xXHW=*Cn`~SqWkt#(#Zs<&apQMtBHzMynnJsNU@pyw)a0t>p% zir-TF7UQ=Jzn03c;r%8F-b%q^Iih(X{93U$wkW?gmdcO|%C?%#tIwJ*mWUbUZ+tZj zZn&V-)tYPVl_s3e(>p)RXi>~K(JQU>@4?y%B(#=V^Aozqe;;=cy-E>W8xK3{j_aiU zQhu)f`RX^TwONz2hI@PTunN|zF49Rm>a$qU7soz@K4{9MJ{auD@wWLdtIe*`%Fe5) zZ7i_IO|4@-(&%a`tF_Xsc1VefCC}0RC8l;LcU3s55WjC@@ex@4cCH4FX*9W<2w&qc zx)NPvq4QQ}?b&i`|3>P;q9V#+l>(t;_~(K(#;=MX+bT zw-(;<_H-H#Tiu5gK|x$V%V@n@+qF}lN#XoN>N8^e|5;VAccr;JbVgWm>9s)h9cAIX zRouHNQA1`I`VrQnd+_dioW+$h@H@k4t(=A5SxzXIdh46oU?#$5Iz>DDT6(%vtBV1R zHohj>om9Vd96Ov;r!+>cDn~$h--~DOb(*YmVWDTPlaCIx5A5`WQVY$)-FbL=K7Qxp z4gDMM7kjYu%1wG~`X8@|W}Zf#zpwk_C)#y1R!JHs{b5UxY+oHjuOLnOdz}|J z4VZQ^>+HuN|LjFQqPNG8HLbCSV-`I7YLqXfS%ow$m2Ij#ppC@tU#w+BU6HKKLHIT% zTM(I8pNY1a=k#$_G+Qw3r~HUs*&BP!PPIyHpPfFwlSom_F{0L6Sz08Up>>zm~#GM)h~a|M5}H=yc3h6P)mI( zhE^N~KZo`j^LXjzpk0U)m*e&?WdLZ{dE5%>T+p0d8qX_a-@iPNuZKCHq)|Erb zeXtR73v_3FeTv$9=Un$q<#WV(3IDnB;OQdQIB+VW z!RrdCkLn;eGdJU*R4FHp{dSaiV)hE6@V;rTOW1whY_1s->46qd(wgR~BQ{t6^=@Ur zdUwYpe8Z!^g+9@ld7jC>mGz=R9vrlhf%D%$($(%aW7K4uJ*?gOESn>&9r2M&W>^ci znvR>Toh%OPR%KFFR>l>q&_OE6Qa;%j4GGC$*bN^JN)lGO>;9~mGY_)bYI#IV@F4&Cdi`X_DTWXT|;~98bEPbzsC5e zvQLBUwKy28 z$+e{}b1lWS)Ou}ZH&}rNgU6fzE|sR?8C}~6IU}2Nrd7fQUBw{FpyFCsKuJjVjIR|I z=*VhMX|1!iqe`=U$WG9dNE`Wu&7RU)ZqujMh}LM~^0mc~P2Phuofd^GwZ^%ORt<+) zG^FsljkO!C!v8=Ex6~YKuU3rK-yj>hS(yR`-e9|e9reGI!H&enL&{6wl;3WrGLWrV zqczbQfc27i{|V;aX7M%()gi97!yZ-=QzGsJI_aLk;icj?1iSY`%3yn+vi3+Rsj+oB zmz5!nUn~DaDgWuDlk*~#-dm2+iQLv4DJc_3#3}V&eT^r+c9xYLz#1mJs(pnS_508k zLy6`c2~;j!f2NSHBy;8B`&NNIrH}$t5mwzf`z z=wx3CC6y$vD?%1tmx2fls|l|m`Msx===;WG9OTl<7nJRd$$SK+WFBd`q!cx7?6SS> zyRaZs$GwX7utdSfXixYSHCXiUFWLjXX?wxHsLAC!B~{eF@wtl5kJn?yi|TN*(df@x z`|sKQq0`)bpp!`F^ILc<`*MevEq}mlX@)(i+uUZz4ViaQfBe@+>vol$xT-WaYVyS8 zuB+S&jLBLBbR6peYzzP$dzZabLffF=a2eErp9x|N(Y^MyH_sc1BH0b#BDy^jr^#jH>RDK#yQYrQH$oB zWcY|pi<&gef9@e~9aoi;{JmoQUR6%59QYMNjl}Ka)#gOS9Dc54P>;^NWQ9k&qKde4q)UaHTud` zaHPm}92UAi#-5HmIeme4>3uB0H8}JR!>#kiWb8sX?LhV-d=usd>X$b28q862&K97W z%_R9uUevcJ6GCShXvaCnn#QSVN^^_(T{ETmLd0KS-{RaZ2lSf?)cORYrw*vn9UVP~NZHP%()1 zr{z}KpITu5-dgk}zy1i<@kL(%_qTowEM~ON`Mtm4dSpU{=Qm|UBaM5r+2%?x^@+9& za15ZGH0=jyC*5!75ag?A7tMm*oODNolP%6Y{OVK0>asJK=el^8sGq-^UTXaA)t8)B z^UIC3uf6Ofn}y;|9;B)Jn!Wb$@lLW7`%e5z{nqp=@26R?r@T=3VZ}ex;thQdnp#cq zzSvtE2fud5Yg1m!dTp!or&zaZWTVw}9-3RE*SJp!Y^1$m2lvQb+fMzpYmjH?u9Rc& z(t^W{N%ONZo>s_jAbAw|4Ckt^VT4b9@>P{QFa^7Nd0RmA#K9=XV5eB;Vu52}E1TAb zIN&(v1G0RS_e@i2bn$?O0lAIqU#od7*GbZJqV#mP$h0uJbbxa}KEIoP-CdihJi2_q zngMHX6lmEMIa8|a#S>!XRk;V-5dm1y8XWwX}(LuIXXs=15bgrP2Wu2U!O&*55=?qiWe$(lyv! zCuJ#2o9&yQ+x*66%?qCXA;e#m+~QX84EP z>4^~1@XE$oz5Xm@Yj6@{c9qr6gg(zMSg38I+Fg6_OCE2CcRxOs`{KTD4EoGd>9qGE zJ%GGeA>A?%yKY|&zW3%pJ4-pF)Hgolc*;Tkznsoz8^5UA?)n_(XO}$Zz^SuUV;|@C z(d2ec15oQ;IZ3N;(mnGe>Wqn&Jq(=XO7v4P~R%AX;%AF476KX zWm{s)vSrxD*y6!^;^jh$zP;_deWm+uM&Y~Ao82zjW6`-N`ThCdp>AlWLG?g=>SnZ! z@4TG2-|QY?7qL2zc*SHL@nLY=f}!8@a1qJJ2oCq;lk-jp{Q!;M()ygdO6dryl=LI% z#26A2rnV}{m6jXUa9=BJ=#1&-p*&xZFMZ;1W!))iYc=EmEQk{gaH0NWJ-wG!2q$Qd zOxFhr$&O?{LE7D-T{k^JEiSk#@eDCDKR`Iioxc z1{I<8GylBxLr+a`wAC9OZS>Z&YmQKDB)jIHpj|HILcE#e@B{QDqi#m%=1!2khcp$P zB2au^J%_8r?-YGC(S21Bl3jE zy+JdmEtHt35SzK2^TnGY`Xe`jLsc`AVt2RnZ={)>XdRIf)vM?W5h`dnq>yPYiMP3E zZA!QI$GWsXIl&bjn%I+gEL}WVS(#Si)%ohO<3yZtW|-`4^fr52Jz3jn3oFuXAW!xR zxDyX!B@lPMa3(`qwyhqP+4R(}Lh8%rQq6|cUqo%vzr(No}-96OC zZB*<*LWdhj=Ib)JhmH!`J5P6#rsbNxYuugH`U=6dr4Z^%x2Pl^rSZ9l2N>kO0&Y|5 z^CxjSi=5(gwlgd&r8GzK9O#{tp9+tUmq+<0&JuAL=V8BX=RVdf+VS72B%AoawD<$?mzarEjb!;%bX} z%9Uk%0A*XNknTIlrVTk(hBFF_tIA3q?ZnvPIyZsP0SYwP9Wmv7Porx6DHaYNXe=kPJ$Z7mHb9G%c{CUNg9Ph`3IShg2(A}e76SpBG%1$&3_D7-3J;na8 zIAQB~i@5~$ENJE)rdrLE=4JHn^yZBvub13|65NA5eRy;0C#RW{UD4*@=2m?T(%!R> z63KLT#NRpYdvMhk=?1BpdDE1dgWSths?oiQ3Oc#~)DhJw z^#hx$a>m-pmz8pt#zzn(JvQst$?KK=^T%MGMLTW|t8>JB13I@y-FM2`M(g*M&BZS4 z(P3q}6T&(?kT8OT^Dc_&1eBjOc3T~3wi=w)x}(bohF7LaWr35DuJ8oXbX6uLp9<4_(-VdJxDtr#$bh7M6^A*TawQCG+SktfUimgEh zoyjnF=OnU^PTc$n**cuymX~R7xL#U@q}Wtjkbb`{SPxB0J+zYbZM^aYKSo@^jF;ft z*)mDRj0(Mk@)F3~Hg_+DHCA{<2-LS%)rbR-kJzo;f9h4dtw**`cGTV?^82`(BuH~) zuC*NJa;w;616I6sZ^U6vV%?4qz01)NbV2RIwjz_Gi@tZJ(a~9t z6B^7*?LadG!oP(7yOQmp`b>M6-ehl&yB+k|_HdN9N45*sZd_Bn*&O(Fw3l%z1~p#@ zRCAKZ(wC`>=8hiOlqTgn!POts3$67xh8%{4#m;);5Fy2_=cTiR);UEUWL zIl|%FF5I~dy<`J=iP;73Dvs`)3*QUe_%D?l-WRPoVwR^l2%4fL=1dECRc4pD%;fkB zTAuQSGkmmkxRh=e>lA6^y`5cQUt=c=kRlavr!A<9B2Z;@IpXe4@7=Jvq=c}#+wdKQ z?`V97;X54P5%`WwAR4NRrK_bIYz>E5!Y!TPsRCv8^9D?s(_|-HXYOn+!y8`a`+^#; z?MLhYyq>m?o6eisnIp{QH;GehZLn^#zHMzy{ZqYHDI(2_+;1Co`a`e$W>9_ z=iUOto!8q??#Ai72q#fT!j4FE#PC4(FIxXS3=acD2}WT3pfktLPTCXoRBw$K8Mwxy zz3F)9dAzB6w=Nz~1>o~i%&txm8q^@P2j~qMSy>rVBC-P6x!SYTJ6={6njbY!h?oWX zo8B0qZh(axySa~fsQI#T6gE|k!P4_D+}bm>6vYg3Z-lJmmVN_q2B?iNvLrw)LpJe6 zUoCj@qC%-qYFm}G^)@AaeL~0C_=ZQ9nw>nB(Df7TjxphVFZr9LIoC(Q`}!y(Mv_QZ zkSrAMR=HH*o4-)V)@N z)C&Xnd9hZbd$`Tse{;`fy*=-tm3!p{HT>$WAF6-ywn{BRb{gn;>@v{))HmtsvO@ih zEPDu9UW%#pOd1muPvnoZb3W83*mvlu{(SSZ386NGLRyojPqwF3#M`N-XMJ}EKpt@? zR(KWjJoTRs6c?U!<4GDDRR6TYn*d+$9aR4u+!{5qJ&pPx&sIffrI5TgorYvOc4Eb* z^h6D7>5<2Z6c154HpdRkN+0UGs6?S8x@iOw?Xt5aQ0-~y0n0bNxLjmV1H~o^5&Fn^ zzrcqB<%et}Pz_R8Py=}n2&vzZ;~RPOR?X80$%j=8w}VgqklG$vpgT~~5A_u%eEvc5 z)%%mu&##rG2Je>JTL(pPj@p3u6x+|akXtu$9jbQYT+9eAzY&gIdppdWG^V;bDWBx0 zBg|RYvUlHtq?`*XYH~knlJt)Tg4aT}s4E63%{Aur<^sO*l701!9x5-Dl=O&tW7ke8 zwS^^1QA<=KRMtcLw6fMH6nmX=8ZyrtFEs7DxknOF`|=sQvtm#o_Bx_<+o?peZgp#= z-Pxk~U?E>#CU5T{+cW!-4;AI7Jct!un~7?2i7&V*-+v~8?9EL>*R%>f+e$ZXHD+RJ zS!%7-!>G0HR`sgo$F)aJw>S}e#(_#T0e#Xu>QytPG)Z-2^3q(hR_l+H=m>Y@G-S=znS zmw#V7h*lQQ*xg#WijOzKMuX;mjneV?U-PA+p<%pTeXXda8H5=mSWot(=9f(>8&ein zCf>8=58iV+U#mHt`jmB%ReQ&!Tn+u++o<;bs0822l(m#@o@Q9x$9jrE)|IFpG&)pp z1?h_Tg><#S{x|(L`zQJ^=T3K69e(TnrtiXK-MdQ4)o)GOrrq( z7WZtpN4}W4TH9L5`@7rm33e%e<8v?R?yh}=-YDu9b1a?}{hcI~G^&m$h!+fhF=*7Q zk3OhQdKx}5g@y+`LAD1bwx8Rc?7WLKuh;FktZXoCH|;Y0!*twB1BcXCC!Oi=TaOMs zd-nWZ-*QV(`$+gK^HC$3+^}yJCCa2aiD&_mLDS?uBAh?juGmPXZb8(t_QmZR+Aoe= z6>Ms6Z%_8KYBSc~73MjDXZGEM&Z!37l8yQy`66FmBPuM_I@7w)`Y2}f8{@$8H26ay z_5JbJbj;-V9P7#}N`n1!y%l_A^0u+gZ9LXD%4Gi(?XX*K3AOhu4s9@ycZCGcu&4w) z;m^;4RxF-v3bpZ+lJQg~o?54nUYejMJ7M3p2WfqVv>XPT<1?&Pd-P;EKGU%qE8C}D z{TkA*-Hm&nB1hU2YNOFU1-h~s?X*?egtz&^#LkiEJrm;D5Rabt0_*aZdZPHk-Gbty z6u&?ozT|0(l8Ky~j#WfaO;9N+qKwFY0`jlzNr}fo`{?8MUYkTck!%zMHTZ|pJWFP`BKX_UvlAv0RbX>X=loC7_bZ-ln@pBEL<&Eia32e=3$HUB`!VTaApF0= zijc5e*N|L%+=r|DaPbLWI9Y1?4C8ALzPs`LR4>}nR|_`Bm#E7xu*!T<;NJ^L2l%Ig zFx+Lh>&DYAJWc)Q8rS1}<;1pQ7){4CiTYQLZ94`Hg`?UvodZzreKG#6{CEu4elchy zYjfV``m}gz9Z~0MV{ueNd+JLP4rO}bmlgJu!g*MG^fjCMD9eilv@_BWDDit$*2D^L}d7OTB>CW-oc z^PJYMzBaoUcREf`)jt)G&f*@NBvK8Axycie)~}bu{wbDZV<$fuhEc>YihQ#X&5weT z7QOYdQUtHxbY@7WF^eHjLbNjNoCO^$;ug7<%w3g1u}EG=JgL#3rW1|aYF#+!uK{j4 zvmyzN4r;kyc%+Bc2AxX!ZJ%?!J~0P-dxl?3yF17nX%-v;vi%1SafQ2;8q)ijVaOm& zr^v#dtXx|l5 zUs6C;2ZfK-io&Xw|D^O$>CF_kitAS%aEly~^+K`ZqJ0f%Vs=!ienuBkN_%-8_Rjb& zgQ&29g{`$G(F=L0hUJR1hvia9AQJ-XaKG`L)HiOM!#>dDunkOhtR0x?czPh6AgonN zTqy~&1G~T)!*Ezj*x{9TD8{pW+QFjgEn#&}4-BhYI}p9Wk5hBA)Ac90er;qk$--e) zk^%C7Q%lph3_%|EPjrLK~+**ZLU5cZE?|I;u2KUVKr{YR36w0ev;m>j7Fnj6O( z!s-Z#d8j)y)qe#=T<5Cj*Bz3%-Eo#!cs>#+(rJbTzuV61f%Q%caPavk;3&vlkrq=A z;2uu0^0(E~6S$|d1o&}JFW_FzQs8ut0odRy1CE5b|f5n;;>(aIh^Je7o?xb?)|3vafdqAGYb;Ru=-`6DVw}+o+lN4CN zldw+ItU^xcS%r9WMvTX7BZNECRZwP!2KYG6%O%YRkJXL@QSXs3ol zJ7O<%+{hx0HkPk>wXuU5vT^2O;k?le1$6#mh6jOC$T%5su9kpvp=_LW71`g3SrD-d zN*a)jQCAO*bkp1vtlH@8&1FQa1<=VT81(ock`&m06*KD(E$j%-lVNoe(a+KhWYNmz zxC^~+f}!L@J!?Ey#J!P%)z{9x6t~&+Ufc_P{?exo&-OJRMLV1tcxj-? zo@S`RsZE+;X7r=c%j)~7Gfb^xTs!+(T#IW5f0klb^4QFt5glgFjHWrsh)^9?*r3oz z!!2E-pn3i%^y_o$bt?Uu5YvX36@xChN%|MQDn2sVCmU?`DTXcG-fb7`9)|1bh%+O) z272qk?!h0GAHm)hQY}@d$Tp&|;@bP8zrm`e3Fm9uJljw&8&EIqx*5@~y6MqWXCy;P zzOY(9+kjKhG(!V=V(u;@YA*q`myUY7q!3>-n`~+S$%J#v+jf11bwkjXqTd^#OCNX* z`l@myPPV6|62$@HX#?kKC%)=Vp7)LIQyaDmIHr(1^ ziLZt5p~;b9FfOZWAjy5(lXZhk_Dn-9r1fo%Ov4z}^gZ2&@Ai1|ENNP{z6f62amQ?~ z1E*#hddXD7(8iuBI2Y%&H^Fi^;%aG|?M?B*7p3M2UZfCKHw}GhszJ*We4Oxip?@J< z+&k{7iL(zb?$gj`?3MPilxBE|nJJ(9RXJAVE+S6R=~!fSHe10V2OUMTK8GA@na zPZSg6gO_vp;FX{l`p5SzYIkjf8hAyg+Fb21AEg_N;^+kR9ZifZ6Inj{C z_L%JVMw1v|4!f4^q`rO>^!D*Nmomc4q93eN%1*35 z@;3Yo(VbH_+{runh${vB#tw^&$kQiEFu(5@@lOdP`rNMn1mDB&$PDdGAeQMPn%*#@9&-^b-0y%48U zsU+^YJoN3{XrbHIcBijo6?}BSry^!%vKT{eZe2nx2Ho+M&}5%zD4%a~Of*#V5B5~6 z8_EyII9z*|p)XH-^Tv1uC3d38~= zYn@>TQOkc?e|AgAyS=s{PWe&zQ3PHcTRzQ%yC(ZggE_JHdCYN`^JZZG`Xt`^gds}J z85Zn*ORb2fQ}Z;#YsYsSxx^(*%H>Xo#s#%l8dA~PPMdLsZO9-`gDP^BW=M-qk4ko= z8%P3mI^RpuzLB1!-DvN*2~)H&b{b=h_8MYMrt*b1KWfZz8xdEVuW8?o`3O`)M)X4C z0QWYmK^w3JbqC)%{idVcAb$957|~+xr``3t=VMO| zKT5qW8KIe25wsnU7E6<8xPB$X`mn-ePeqN6hwS}S(8fy_xp3{qwXhIJ-fDjcZl_vY zWOMoZkd|J}U&3pE^sJ+;|2taQLhFa5A&jfU`0ZV z+Bu#|tT}1m8$jn0_SPaj15OO{v(WW{LSt|TY*=m#aNC~?FrREV$tecn>5sbJx|~M& z`uq2-Qhe0GPuP|CD1-_Z*%2iw!&d`zj=yvfQ7@$lcFZWdVlXbQ1gW){catGwQ{!5I zXWFPWu3Yc4B;`%~?MM&t4HRfO6L&%DAw%T4HN;81kY?phmXb3KpiRoL9;JB5E4jeo zo-h~9aDt}vt(Re^O!n#++PxRqYhu-=UPA7$>VE!gplF%3&}*N#bq=24@c-Wwr|$D`Ew1(S0idE2Xl-Q zxCuBBcn$DcU=X0zU_w0{lGi3&3dGy!%wGtq&_U zthy$wx@4b``UUm|jar`}SrM9nEztA>^#YG1#V*nc7=LOedWz}6utmMmOB!No#!%Zf z#+Z`6!S80gX$#)86?iM~OTdor`Ovt-XQ&j2yg*95f?0uK{lZ-U+-N_;p|!XKz3r?qN^o zY^@iV>~ErHXgx`3{2Y1J-WBYghb!%Eq%G}xU$A=$uCzDO+qE~++qdH_2Rxnp-m(dA z(cYQZ_}mYFIckMXB&E&_Jv;5~Z5yln(iEkjbi#i(oefB*A^19;9x+fqz1cNY9&+B5tLi2x$VGO zy_tcvR+{R$KAjtSN2|PQrSSERa(IEIHH&tAOkzFjYXKYX+vbuCp#^=vDHMBeZ++<+XR9)WB2YCMJ7o%HzZ4+5gkJSl49!C> zIXAr%W3@)9#v(1mn3<5V$75;r+*>jJPrQv(-idL5r?2IpE$Agvt0%;pHlSSF5Z7$2 zgS^w5GJb#@Ioew_3D28z6gXw#rJ7n(@eFCU4hgqzK-o;#hi!@4;H7G4eQ-g7(G3Yk z;^LA-Na^>WARu{>jhIE)vC&C&ko&Uwxze_ABI1)gr8etm(vP-9Hq@NhA5$3BigqN{)H zWU>J&s3#+y^U*xyUkY5f2ZRQUs@?~?y&HRM??IN}))mp|Y}y0#xBLN<{ccb%lMLnr z(A1un)nfj;Sq*@+;tS|Af|BAIn<33TNQa_@@%3eUODJkZ0q*D3v(N<7VB9 zx4!4q5EO3}a<4>dQp;GP?7>w3!rJe;A~UEOlk4|A)f43>_|ZQopCjdv`cGD9G-Lu! zzQswruv9b2pgQh05bua+z{*p^2OYDLq(#C#wdBJBXEF4YtOD>mgkPr+)f@W> z>uLVf6Z;(n(W>MA=-${RYM%4xS+QgNQSo^oii9LAPTW_D_kJg>5fi=0_Ot!MGuV^L z*KuOUSLOF?u=_!7=_3W6hE8>BZX4{*Rd=|4i)*W18B9I!<&~5#qWY*DOJa*$FK~|j zOXwS*XWjcv|1sX?DYQ;?odErueDS_YxruIbdJO^Uj7E%~lp2DEIg1!zSRo?jc(upXYXkDPQv zp3U@>$y)wK?Sk_6!|H78$Z5BWJm%HGgKz`B^~_{0$u?Qn?|}9>p0PRBFq5N+i6=w~ z7Tk}={p(MMMZei#d!22wZDXo!JKJx2gI$D%m1UImZS$(qZ0ioJEzGolJeFH96KrEv z{N2v}qzFs8Zz}_N+mQwr>45mWb!>XV=y(J9d!11V#aAxxGuew6asvP6NE<1WXVy0u z*&-I#mL{js+;UrW#%N8W$!zvb_~wVlPA?X?yu zZ^f+yKczGx$o&yCKZ*BNR#agX9Jta3bJ1#G3w|rDb?86NqKbHPQI)k3{pcC1-OH)7 z7S-S`xOMT?qFUT*Y-lR`7e9v}{(47Fn~}#J$ibDBDjl;78F!k8_TAWw^BM4DFDQM@ zG?T&VPnj9_+vENa?Bza%JreC?7n*Z;+FAyyX80{etYF0Ip$<(r0J}T~v7zgqnUGvu zf|CMAlrzy8-bm+*@3sUXRxq?AeJR2IP-%E+QpwQ1JDaN^U77>iGn5OXHxKod)=JW+ z4^Uy%tfa1lu7^NZ{ZnQ9b-5|2BuNOeiAC}C$jeUHQfyIdF49kraF$fA&kA=YHZ~>r z^5ILPMd`A-^J>^9jjW8Vh=Nt1&D}N!Y<{;}kcT`&|Nh*)55A1Vj7u6`C9WU5mWWHt z;9BwhV>sr$Do2^ThL2}xnN>MD;RHsDv&QYaU+C^zF|2~hN^4*uq-~4AJ0fihMeSlK zF(99SXYL1;w(){%7*e0{SUOH4Awz*) z(57(^Z;8SDZ!G^C<|3)7E}(gzRS)7kY%sU9LVknK@tyUrn3aXC6`RY9Iymks$EnR3 zg!Ufo~ z?&xX6nf3*RxKqM+Vz{#|zCN^X#MYKdvn9cdK2G-zDng$Rvu&0LA#Faox}B#r!!Ir3 zTWD!n;wyMs+Ujv5FG%=#@U@SxWh%^Tp-oer^)&vj!x!2tp{>)QGjfvHB}!r|WR$SB z*k1%CunAlvjWQ6|koxl&ofYoNGxbNaPc3!b{o|aI#4#ql({`#6*1_lwS*+ae*aS-9 z#c0uw%6RC@IDI|aN?K2QPsJc}vleHaqE|_lE})U5#f->F0&+sKlO}g}bFi7>3CX)k ztiObgEg;!|)6iPb(=SR9vDSe!sRV^<+D(zw6 zmCpBxBB0Zp0UqrgYg+v6jEB^R3YyB@xwKQMR&OM+CBlW|Y#6tE8(lKI7grsM9V~S-B4I0y-CTb_BBe3-nEYCI;mL!c_{NtGf8@p z{3+>WKJI=1vgi*&4t*t;MHlaUPx&))IvH|NH@i#RKe}Il`UR-KLfd@XWM~q1G%N=+7TttPTd{xO<ddYyJj)uYXYqDBr#Ee7!12 zT~zW^3H2#oX|_WK)#lPt32Iode!sE|mdPyZT^*Zy=JCIEuux{jcR9ZK_^#=ODmbISs2af*LNg*c!|Y>wz{N)yGkaS8y6dDgJD@W+0!t z#{Fo-a_(*l&9aL9k-a?HGO9Kw~09UJKG*; zo8l=xx+SjSr+4BiPwb8>a~+B!yQr~8hMpy9wvc-Fs(xn@kCW6J>Fkp=?CbB7EtbJQ z4?CN2HtQ_KA>V^01H=@rwN=R*rzzQ%R$zS`QYcSbpH{{^>hp1M&Ckj?$qDX$0$v8s zP`@Tbx&$W2^X+Vo7us!byx4A=V^cetIa8pon&4J!?YbRkNraWtpoVhTqaity!%ADV z+OF74k-a?>Yj;a|)SC9O_N37W8*+fmWe$Is$Zp7$o?zgJ1RixsZSG2oUv-w(Ym23)k1Q$R&VJt~3 z*#XHJ@~0Q>-govp*!M8oYZY)ZTm0j!cD0V>KU342G)g+o&nHsHie43DbK8kM6l82q zDb8oD)mA-pHAI4>H$g}V#JJ-4@;(CEc z)4NAvk8_~Fe^L5gDY5sxX12$pK7u{3?<^T|o5vScGGqWK(>IXwg{w~PYl^=H35zw+ z*N$B4y5IfukV5ymA^knJA#>c0A$CuQ`pl4Yw{2)4w1%S9X|D4Fi(MB7_E(!+mj=eD zt|M0m!s7bn0cu6OY5MAfBF}}Z0cz7a+u-o%rjV}csdX-(Qz7o7*9L~D&*HroE4VjKxOQ?F!(CDSR@<1J^@`VryoH6seow_FXvTS?-OYl~r&-NH*@hXzJ!zmZpx z8)n4Q+4vTm!mj`RQlDAZf>nr(G$b_iZWxo1k&%_*I(2m*&2SsBZzj5{Zq=cp`}4&rmh9_=8f3c`-`0T^(R3d;lC}b5BCX{jf(@KgK@Lb?f@@=!D3G`H7BiFVHGDA^xtS z4I|-Ehwd#1U1lgYG#EDY6qHNAts(nofpU56-?!{%J(4`F z$BLj}OrS)Fo}p3&HC(K}wr|Fg`|n?r-i(k&uVheJXFVA24 zcs$Erx^&6X_`=2U@kKey3s{0KMK@hHPq$)m&Vohx#^pTRmF3nl|pphagEcQZnxQ?YA+|aQNi}`4Acw3hG z@#63R7V-9d;WNf%#;0c*mo3l9eGnx%sY_~4CF&NSV|N9n2Sza+whC*)U0U}bXtCHe&Hjy!PtT}wLR$FH`HYA@;inl;D*9h zwyA8hz(A4cLkYwtjAYNZdAs)qQLp!XF=l7fD}CPW^KqYl^tq*P-@eXU$M>Dz_qo0S zw+@aO7qh4D_x--?w;HCn3-9al@+rRR?TYJ2DXts$DU^|uon?e zK?Ss7U0F94!Md|Zrf2=x05*^fVuM*Mi(~ODfhDpbY^W#>O0ukQ$ztO}E0!%cF32|~ zvKa-1%Z&J+Lyfv@`O=)i#rb*0WvHe6rN;i_mMmUg_+a4xHgoYZQKh(k5VQ$VM zIm;YF9etzCEBX!HH$tkn5(#EHxj-Qq_J^kMCjJ?;k zftsz$nl34Md3Y#hMSRQ(He<<>$vKN3&sZSdy$r=r*gv~|-E~?%@|wAHNpAkKWhn8P zwx@Xwd9xP#NMc+a`) z+_-dk;X~+r-m*?k8OMGKn3?)u+AV3bCJayQo*JKOWMS-B#JLD}^!%9lruo_PZ=K)f zK81~cgr)-VG-HN#z49rO<9L9vNLJ?Xb{>9XuU>~tnWBoLh9k38Q8iJ2$Mwai%Tb~I z`xsfd#S|LTxA#@kvclYDi&SMM9xFRB2;)deogq&Cko$abX5BE$G4ax@h6oHlUJ#1IDZiZ zq_Pn#$a^Q1jl_$^CzU0kUNn3g>muq4y%{=Ue+Y>T((Z)d2EBk^D()JPb#~QZIL*Oy&`co+a_@idsE^C>>Y`7*#{Em zF;(Jx_OZkZ*=~vNXJ1HM05+ufq_RTxmBbIQLlQs84okdsw9hZ19J0tqc2VMG?6Snm#lXRJDqF$YiU9@u2n&+|HE#V_!oAk z#OGMD#2z+Q;`1z3;tOno#Ftr`#5!f7#BG#G61P*PNPLTuDRG!GP2zB6hQytedn7h0 z1rqmG76H#d`SY++s}~q6^~28r-|nrO?f5k@(a8_^;UD~PAKcdBr1{~e{P12s+!^oI z;@{?n^ZjtGAAZLV|J@J&H;yyCu^5PF@riCreJqyQS{NG&oQ&1Ihxc9_ekq(jsfeR}QqeQJ zc`s5yocEIWF28j@4doG^RF>|yR!;O=A1Cp3Z~}kt80=oeNA>>Fj|*RIjf?ifQ-G7P zNMzvIXf}=G`8=JelD47zQyluFB98V+Wz#i?@EHt`@eifn&WkDi33#@Ur$3KlxZ^|uty}mi#;ZBI$J66ME0b_ce6hM@A1p?H{Lv(WSnu#hf|qF zhL2~(65qv2B~D}I5~s7(5~EK_Jc-pvJek=fp2F%R&SdoxPiKu1&tOf!Eq-|p3=s9a zR>rxF`S2*VPKMvjo|Skq+aU22_MF6->;;LZvP}|CXImtm$zB4E!F%)2nAGmWy?J;= z#u?3g_;&WH48MbIllV^dy2NAHn-V9pw_dqsFjeBa*e;3F z*~b!3WS>ZUH`^`oWcHcF8SD$-8GdEV^OkYHjFZHC_%8N$8J^C*lK5`+wZxOyA&IB3 ze@UFl4g*{K-c{#)*S9jxoy>=mnM;PJu%i->Wyd8R$G(?1m7S7!0y`t|UF=7R)7j4w zPh@V1?`FRMZ}ZEW>dl)+#<_#}@SW^}3{PekB~D?#N<5ZbmUtYyDsd`fmuPmNxnexi zNj!nImG~~!PU18cB=JOci^P*z2Z^V!5a93p@_*Kw|1cRRjrnjo>myNBbI953Sd369MiKgqF^ zH5|7Iq<1+uj^cPd$0Im?f#Yc$Z{>I~$FFi+$?+Q;Z{`@8$LC{?RgPU8f6DO{j{nJV zL=e6AUmOqN_&bg#b9|iRLXJ;!T+H#$9B<$llRrN1b9{y4gB*u*y76a@yWK!TwhI>Z z96Jb1GcS$-&uTQVi3xggCdX5Gn)HYI7JZ7m@hd_YYvOT`2tFThT*xu~(c)|L?V+}e z9pG`kz9G&D9xj9Bvs*w|8Ci_Hkq1QUoqzv7jyV5Q`ajj}E|ih#mfDE0)<%S>jcAMz zrZGZwOPK0b!HGdM>&H?tKZF8r0ELLDmVe^#m%{0jia6RQ6?=g&??oy&eMILE#IwnG zwwpIR8o%_V&lG$Myy@JmEk@wk|KApj&E##-pVyUWi+-)zLaW16$#tc6iS=uXI9cbZ zINabT0jT>_@Qsu4E83`Et2UZ|aQaXiz4`}jl>a}djs81h#D7frj~5efqkg=us(`7_ zYh!`Ni&lrJIAqd3gtfgMwTo|G9LJKpky3FGHCE!`;OsKCnWx{M?*X@QJV5TjRc~DS zapC&_0eoo8X_(ry`>z!0qxt>k!1s{m{~vdZeS><4#+ahIIt{!5b6r=|*)Luk0j!P3 zNUBVHsI9fSZGHYS3~P`0(D_S$iR1V)bV*~@H#YktmiVNy+aw)EXDbtB_!!Bhpfi+( z2>%UvGvO$c7U?z}s2}#@{jh@4?#~;H$3niFr*k7e@IMH*c+=Eq ztzggyS9ts;?;YQJDL~6Z*AVJIJr(LRF~G?ETc`puOS|3Yg;`9?i z7z@$LC<6GTvRjp8jtI|GCP|#A(>Ro%J(SrpJXR@?I8IqCalEor;sizO=c#OnVv^xQ zmDLiDQtBigt!SkO?@M`Ih9@g;Njy$@PvQxRDsj5uLop}`~zB8|0I^u29CzTm= z2@)H1NfHm#-6?UbZi>W-x_J_h(B(-yQulzwBXo~RJW^+p_%>a+#CPawB)(HuFYz6^ z=On&U_mae8bgxT1R`-^~sk#p&9hVq zuM*elu1ajv-GaGC86|#NcdNwD=mtvstZs~7@pj#6iC@>%Nc@(r zN#eJ4&q@3j-3t=GuiGN=2fFtp-lbC|{z&(k#5;9gNW5G3cZv7t4gqKLd9|0)9Toln z#|8!4JN6jIMg>2tl;hqCwt~z7Y+`*BZ+B)Y!szn}kJC?wC5ru>VKb;31$RQluX zdoDm4Q)hVI=C+DM;q-CgOMU(Vk7L!5ObvZhd?{Rq%1dUi>8L*GqvETzy9-!rU&2~@ z5$-^X96r(bYIq9phN~3nqqjRC{XAR~|DgwPF|Zbgb#N#Yc? zMdGpSC5gwgS0tXmUX}PRwoT$R_PWIB>`mY?etFCA=It#RXB6|{+u1uZ{0{b>#CNg} zBp$;)lsK8G5|3lMBu-@?OFW)^BJl*aTjIOeXTbjZl*K%s;ym{`)Zgv+(&zuhGu;1^ zz2|Dw1MzCUK>av@wY}#CFYY0#h3_*c4t-J~DX4u2(|D&3@o=;;Mf(wrZz zFJL6pM;|(e9V>A@OO<#bn;>xkOOv>eO_cZnHc4WL+Dg2LWlFr5O_O*Dn;~%#yGP=O z*=&iIvU??7&gMzHg54+aBP?6uN7(|2A7gnEuVf1)eu5Q9{3Lro;#F*s#AdcwVhbyh z*vghlT*;P8T+JSlxQ0C@v5l>i*ukEZxSst<;wEO2cnz~iyp|P9{4^_-cpWR3_!+iZ z;%8Zv#Oqm&#LqLE#4oTqiC<*(5^rLS5^rWr5^rH^CEm)`N&FIfR^pf028mx`&q@4e z_JYK(vP}|iXImtGgS{m2o9q>d|H59C_${_g;*OcsKh@;yvsOi9cg|CH|c4m-q|zcZv71 zuO!~bzLt1DJ0$S|_AiP5&JIib5B4qL_~j23#pmW0Eqb_M;lpvu*dt2{^F}RCyd#li zWj&IgOXB{cCM2@BxOn+Lcj@xP`1|Q^+;qfRkdv2HxEP86OIH*vr?~M2OCHLPFUWZ? zXL0YFmhzv`u|tQ99Fa7d{*D~Yatm^n@(4pjgdqb) zCyY)Uf;)?rEWY2UJw9~69m&gv4jD~p3`LY73Gy>KA#tSqjAknqFDtyCMBKGUhlzxT zQNrG+-o$T+I^6Fq!+HFnGG#4Ct+F+O9vCr26CW+D}4Y;nJMXVcMbDM~Mo8KFdqNqUGG>Hk6nIv9H;L)*( zLy|-r$@F}2(a|Gude;D!SNI4IO62hp2jj-FVGplZvV0W3KNyilj9!}m zkoPii1YM)ieb1r1{S%S?9m|rm=Y|fzbN`FE_W-Y}xY~th_9@ai`{)$89k=5mciel! z7+k=ZVw!CrAY>I=wj>J`V*?=uLUF*Mm>S4OfY2c%9}q%9NFekUnoSACq4y4fgmT|^ ztvy>umXrJ4`~3HLem_22v+Atrvu0+`W<^&yfRiQ?o`sgnRs}Qanu2JV>ItJ!2S?!# zDokBq*V;<9#hC$E-L`(_5>kY5{OBno&H9{0H zhor^h|B*TK1WK5PGJt{|P#Y7Q99@uCcbUdQ}Vhp@4hB(eoxQI`BVn zH#T>0*RDVK(8CV-Pu$HLI=HL%IJADR<^O@ZaqYU=4)$Z$9XxNsvj4!2_cc1WS68*w z&7bh^xbdD%r(_M=%qtR2LmIrD((CnL}4bg_mhT5vuj`Xql zvT=$fJJ6U+HrWobFjW(@Sq4$5TnCY9W}EF04AUsx&;+&x=8_6_5SasPtsR14iYG85 z*o2D&JBZAW38Sa0U|n$nHBVdui%AnTTY~hF5~g6HW{XQ+XPRb9kUEk=`zLCyxWsj) zX{H2eBPq0gqIOa)X`N}BC7QCvs`WvwnAj;ditu4Z?6i8XMeXiFKsmH+Xs&J5nqOI0 z)#9qoq@dUCNKg?;vjOS(-wzs9Ei0kCvT|ipdv)cys>+7?Rt_GMMg3$B3Zqb)Q8i34 zk(o)Bj?rd{2uN$HtgOT2Y39K?0<}(y1lcy7IZifa8FtlkBN6!cbxynj(L^Jnf${|)IqdM4vzeO`KP7r314TVb+kR@Ru zy4fYVwPuVSZFT6`G~h<2y2iGd%|Rq$0^(Q$81Yg3pm7YvmnT`Y0agaGS?kt)C%1C0TtMJYS8 zcU@hmIwZTnfV27Lm5r^J8dnsRgFb;6OB?Egv`SBt0Xn9>rfpRSHMi7uFiPhHYmh`~=S(EU@V9e2pDY&6atvtH&Ofu-$rRlC=$*-5mV zxV1O1r0bjTS~jPdTnNS5KK@1J*#_WIw*vx<(z!pP^tt%6T7$x`^s}&5s>th0jrp0| z$qwcF_Hp$2-Hds^i~NtU@~X)3*jZmk&Ywj)=cXziL-UpFh-?@367&{we+9eH?v{Nybd=V*i9?j=p{xLT=?a)PGll zqaQyH8&G^hIryjg{Y{Sk`H{vv(Ix*+{i&nhdz2nV>@5HC&mH~JTD)G~C4WA;!O?rx z8{;;fu)0;@{s=4ZH|5(=tap3=|kyf z-S6n*+jX(su_%50gN}YH=)Xm4aQ~G4>T{01`bSu_?_z(`i;h0(M1xmtJN~JB>no1_ z3((yQe&ka6;jcUThbMPzqIJ*pC2~?$SPDGaUV-+p%%krF{OlhokR>no!e)e%!u}e&e0SoY2L-BM)`- zQGYh!rejC?Hyr8c*Z;*}o2BEQ=HG~;9Q{?$-NA|u`CPT5uSQLo-=+NijI$e>f4@Ra z`9+8NpnPW4Ir@GN?5zIXRPX4~hm3i>OZtD-g{*M+%Kk{)C9-{29|I1cK zZvy?;F7{p5?&xoWKB`OlrXS3aqVat_-AVgFAU11zztrsjP3V zs;Ox)d=r5f+(}c}-qL_>5dY4Q*cmeqVxW>4xLTEsYujooTX9cK{d#j|F|NKw`c~+Z z3wLVGJ1`yBx#%4|?h+ou!zx&$s$AKyc12Y~C8Ot+Dl-@bZ|}h}-WszG5F=_8x|(w} zBJ&I<3umGWsfStZ^+?*PHLdN9raNX01naRxH8sGE32^N-%>ia%fLVnLSXvFP{Sg^L z4d&bcYOQUmG5_iit!%12#{9@P28*3oimSw8V&y7i*?B-Q#vr>*0fvbMP4#W&pa8&y zG+gGd#PrkDI$U!zeNuBw0At!`HU(iSCwxf&Bm0`nEdhXZV09IUtveuE&07IRk}piH zhNmKFkj#-y3VBATp+O3KmjLA2s3d1zfFQi0zOAvU*&I@Y!X-PEYwPMzaAswIZmkLu zvcVx}Isav(q&RJ>!S3^?$ji3sX2gwKnlLXlV~}%-U_DS|U3*itX<(Kjk+=b>s(O{V z1E3~|MetTAg=FB~p9Ygf0##3a6ZH=5fLRMFg=zl~*}S%)p%UuNh7eWXyl$$q>RP4( zku$DzTEi<^)>hS2!>e@D44P zLPoG3exBis_jWX(w@WmFrkbghO`O+L1K(m|tb%NH!jE^xDl0YKAR0MGz7J9NLBpjm zy!JJ9-S=|R5h3zcOYpmW?m>lH?o0I%~wUp zDu*0_e3Wjqs;znz+xkk}ZFX^xxiq7-wgEe&mDuAn?0T6JqPeZoj-D4zGuAG!8CA(! zluVx@7G{n_Q;)8A_aZ{QcB7T(=8zJzwuscUq6J+761R3ud$YN@h{7d8;+xH)pfjWy znvQ_|m@WiFZ>}oBYF-5FPZtqfc64Kt50a?NRIz&zRyYFHR#IO zATaqugP@Ok5z418+-GMuug$BKrQ%B7sAgsq(Xb1NsRp{AwXL=0oGyf*03ItM1llyO zhZHpp+%i^Qhnw7ZiyNEG4MjAK2FTaCAj1swiyDtc($ZMDVgtIJ^=+$Aedq3kZrZyb zo7x+7-qLC|7ZKG07W~#CY$uyZEG=p|Y6P)OU9eI)nC(0$>KVHJo8d5hkqu^QY{PCM z#_?+fZyX$q!;~_QW5Q2<*nnC+0j36M4miBvu@PgS6rEYwK@4sy+yD&BUEAJ* zY2^-4F%Qf;7%@D<^^JWoRlXe=94507eb^HYA-RHR+FM~}O|8ixUqep4?T?e5HrP_h zofLC~W1!^D7=Ggzn56+jRdsc3bDQzd3`BX6Y(P55k&2|a^;5O7*8I}Zio_i4J4Y*$ zt8J@VY4%4CwPQliP#ZZon4j;Q*tE8(HsE-~aTLV~@gk0|9Y;~jZEM$H{M;LT+m2CV z#Ad$SRFrG`9i=9iWyQ@ls6`?*!94Cr zlxnWpfTJZf_$p3OEDm{cF)~mRW{D>F$(^t;!<9M!=Sz3AJuHsKe?ydlylW@KjyjNW zeMnKBgoa63HSUB%Yu6(?p@bECr0ZRZ6iajXz;z*#X{c)0tHiCInC+OwJ&Vd*(%nJ3 z&e7OOp>J$$WrN(*E0Dl(lvcEu0DV8+EDUlhxG*#%orI;;fP@n#PT)m{743AuFhAps zqa)B~3A@}>t3A`q&N!!oo!#B|d4`L%$6;ouWhNUYOTb@r%kQ65tk#O zbM7y6jLef_1`KiRB)2&_F7D*LR?86;1@I4?pbH`9A;*G2IyBnMaos~85f%XxzQ2suTq@6j?O=51G7z&++z{7l8j8{F z7{@Ec)91uWxLMyj&|8bqnEHkBdC1m~znRUzRfciJl-B0jYFv36IQVZk5_V_M!OJ|M zuD!v{CJbMs6s4?R>#D?+(4pCU+l3^qY?v^!8}h5Otebsx@SNy)q?y34!4 zRZVD2N26%L42C%>M}5o*z%*dj*EOOC0aLkN^J{*D$z>xh z3N{xZP|XQYWle2E)durJ%oSVeaCdHHaCh!_sIRQ#fk8|maOw1(0@tA=%w-6ob;uRH zzv&1Ec}gqSh?Te8YRqI*f%5^OKdEYL6+>&=>!(gOj{}K$Vik7BFfdn#Yg%k94j-(y zHC4fB>jy;+U$d5JfcFhN|LumKXSij8|8k-~xYJq+lvif22j1aUw6`=#J_ZPo^z|Rl za98DT=m0)PWI+mXVxtAacM9ur4#P>Zd8G(ZSC8ed;gEA2@HTOTqsE+CgwvG{zOv)E ziq|^!g$wg1to{w|TlKoF)pJ z>s$Wk+MX0`+!Pv#1iTDLD-Wxd`7{K@z2=*oN^Px0&tKDOW*1>NRab0dh&`r?T0&52 zB-?zo;Tw%b)wHsa$WudPRn2N#hYhd3dQGdj3+OP@CQLHlOTK7aJ(=wdwYAMIa+qwk ze{21N%vX{y--xTSR>jt@wp9}htkNsWmjGNrP=(v_ZrLY$n~ zFq>&m1038coFS|{26u7St}wTSOgL=~=dlti7CdNSJ_!jewKetdDUfr*VV1*MiNSSo zmE+CoF1QIyqFF0xb^3Sfgmosa46$61z|jXsI4dL^Qw2{R z!v`|$mmv~RGfaT9i)CsvhNF(eh?6Y(wtzVt1GK||Wez4P3I@Z$VIiV{OS^DhN#8p>U35M5?t3g3R%)dG? z!KLVBD0#X69qAWu8jE*kAdoHV>oEFYuD}(UNkxdZs`>`Av;!eki6f9_xWUYON#6#v z3KIrtE#Cw{Yx|0D3d%w@3sE7-RZNfuZXO6IYJo71MO`JcqLl48;KJT#$_&F-sypCm z=BiHcbo2XS7{lpbJHeA=$1{|lI?;UHi9W%kk+cr_cu9D>B%C|ve}d82AU7>oF2!^Y zYi4VkH<&cA9hgRJb`&F6du2qWfb1BCydCHpizS-cu_3{KnExZk$6#1tK28dF*q~a4 zzFg?svVR-%Y?g{-T}$Qk@e?OZnT+N|cd-dG;oG~=*w&PG6J$HdiSB~v=63&I&^{aS zt45V|vmmnQ?1CHq-=pD_p@Cye;kOkyZNV!w?JLp4pd}gZ=@gUPM+mS=D3S0?z(<%i z-ouWdIjBcGs{o26K6U zZEkN_iHRYxX3h@amfGejOgmaQRQ!y+5YiE>-D85touM}atVk*@jOsx4QIII2ng0rK zvRQ#f8d!P?I|otD?w@-U=IH<>u2m3Qe>Q!vu_o5nZ9qj4Be+CCG#z(lG>ta*1jr!Y z1J-?Wflb&&k^DF&K(N39o~Hv;ah_^f=CGEaX3G8r^Yh{W6-*8T9hEwJ{3IZvf2(S! zZbt{Kd%vw_H>@2{6L)huvSCwz)!d=_e>e=xBYY*671RRs&@2|ehay(5#SA;l&npA0 zvkC*BnTYD*7%JOj!C^j7U1|;6&{5I=c&O!kunb04)>N&n#5%3pDmy7a>CUE^hAiXY z8i2RJO0KZeQk`4<9m^Lr7-9nk#-Y6g561is3zfTbAO?H*sSZSFZVQkyK2|aU*(ES9 zb;7$jPe7#Z{`h%@hidLZd%YoOvuo=rYunb7E}v5H3{Ta(h88r|HENmj1Z$;cRe;4j zh?Py3t;`<-Y*4QP>}LVCo%`N8a={Zs&BuP){Gg3?rqwn!w`~wxKEu;9Ji*f!-rpza zPF=BSJ+y-^z@ zcHyy*vwJ5hP#6`~nU$Tep^Vv9jIYPx6toMhHq-~Dxk#+zc_}9AcYyG!)rv|fN?BSG zPtJ+V^hoxEg~AMftWkErV3IL0 z#NZj8Bl`d~khKE)f%v2k4zp-J{9^}{uE&!{KHC*=OEuGd=Y0`zfOV7DBRWuWszh`b zDZ0CZE69kBYoW*1l=D0PP#q%{qL(IH;z`o5h|D5D^*p-DO2aT@`!hxWx zb<;XfE_09QK+zul8;hT3c*yW_gqTr$({n96L;Mlz0=UCs6ryK%?C>Qx&%FTYaTJ^! z!3r=}$$5Zlmri(Kv>RHsBRZI!nv-@UpaW^gO!8Nq@UU7IeR)LX`A!rr1>@xiSq$m0 z2k{b_K&9zGiocBy!PRo6+Pf186F|jRQj9BD9b$}u@$xKP2Np39xu_GeZEYKohjv2J zcJ}&m^rl0BpdRbQDSpwvI-x|E?$Qj@_s+ta>C)sn2s-#2-HAC&oVm6Wo)(DTR)^&e z^Wn~EZEMX4j-_()NQxSc9*_s^1Su7O>&wO5cyGD7&2W{u7~8x-BE1$hsRONJ{I&oeyMdJH&Ne%P>Thj&#MR*eISk&>Gicfzm~{$7kJcFw-+L`wzf4hlm4FnB>%%3}PmTH_inf9>9$Xa#N(CA@Im(Gka^# z@U-!%$luG6zR(A*Z>rPPH5}Y%!Fizr#~*bF66^9!D!N<>c7EKjC5X%d1FTc7q!j7&=aoaOqvKDJ(KMjp0nPB^t^%0lf{o< z$po$`c5?1RrW9kVu|9=G%sCJ!MhCqiwT{HkGd!K$4RPKLh^ru6u3&}0!XQF&QijZv zz~UJm)gF$u)fL4hAeqf|1m-cEIC+I8EJ2~Nb97YRUe}o_Gd726H3!3F2T6YnQJexg zqYIjG$_C@sE~LN%b81W$E!6?4a~1ZR9mceDA)|$Lke}&7W`ZQ@F=&NOjVgAliOeQz67f}7K zR}$xy@Pj~+?Rdm?Bc_C>fJ&x3j$mm+wJDi;J=rS2!+oCkELs@xk%0K@3lL0PJr&;= ziqEo(K~4T-f8r$!k>rqF0M4}s(5MP8*@Q^q^X%~gMtwvSpKosy_3`9?jRSFkl?cFpC~)<_J`eQh(Y#2xoJ{jq#^%0+A`Y zc~3wyD1cJQeuh%!{&XbH=I0CBtIVYQO?dXm-;QU`{5^Q~%2$y+{~W@-^PeN!CqEmaBl6QA zJ2KBz`mba9)M|L6e>}{2smu3H3_Rf)z_9_-< z@28#bD(C)LE(Mgmr?D@|ZXxu(avqrFZN+6DD6}-&i*g^T++o=&(mqnT!?RNv`^U<8 zM0PegKRH3-tIB@GG<>S5tUBIb zOAy=n>B)5Fq$^5KVGwmp>PmW=YVfiHz?`1W4hh{|hIJhrz!D-e;bmr;Pj>6?hzJ9}UfLvG*i5Vos0Ebw2y+I4_9KCrU) z9k7hV=Mh|qU;m3B%iiWK#8`+SI=h+!%Ya*f|1W-|gZa|5t&+NNrX51h)mEd>pp_ZX?6d-AmTq*gHACO0qJz!_#>OI}y^SVC z?qPJ={rSuhYlkJEJv)@gf2& ze0NULgzv_m%GeHnSz}uR8S@j!cyhyTFaauq!JGgwwS3?G2892gO@M;=PB6uZc_ncf zmLv0i1H(%&EJx;R2*Yw@!QDWbQnna|5@+I(F{KOe=Sc?#!*XOHOH+pB$RZMxlaZ{_ z$Wjj(;IpkomNAGnstU^ih(ahJYh?LbRB#l7D@jcL8TlT!{n*x17y)d5mM`Q*n=NPq z@Gu9}x^yP!*%f#^0B)1Bw^DXDnJkdw9_4xv z4COZoiCRCxuUoyb^QbbuVvDUt$Jo69Q|%#^B4>gX%J)FYmG3WTa@JA{XG-=Ef?P`L zu@|Y!UId5+)8h+95kR?~?-2R{BfJW%y_oP9p*$_<>`4Hh#}DJT&Fuls6_(Nd7Zf6D zF79j8D;U=&VAQAuOn|CU*K~?HfO0+g6#-k%s0V>nEm=+Q5P-dD$*&RD%e17PyYXVp zCIr+>64F$$S_qeu05cyY|IwBvPDjOtnVhyUCtGM_ykU!NL{8@IIb__|l8G$*k^6O(V$01okF@T9Rb`rD3LlAHGK}I z@F0#M5PrzpX!_S7Y)*&I?wM;53|eD7`aHHq+QHi;CLoIccdb!9jTl?l`S`{8h?o+u zq%>%jJW-U8W~m`*mJb7IM2H~~%9z*!gkNxQ*ep4j51J*3B8AzwO4+cP_5~_vrVO%~ z3hOS8HEgC7j%YI_QM{z+ZYMx@ie6HD3afn?yrlTl-4UXu2)(3OhnEzaeH;*JFC%_Z zY?gf;pbX@(*%F3OmVQ!fu6Mv3a&1iUvbs4pGJC+kJ!>&(cqdg?>_&eo_b~ zOu0vQv0T0~(CrI~sMFWo66gtyJ>)^ddo<$#UTQA)zQHrev#8OMMT@{!)@(}lrm^gX z7-`93rUcVj6L|w{B?k`%SEM_Ghe+^yRHu@q4EDsh_mVvmp_ ziLt>klxH>A&1wm7U=qalQPcZLcBI?wYT%L_o<^7Kc{LK7Z9q6u9(x0F%)4sD8tE=I z!mG$;H(_{>^a#N6>}3gn`4}6DSJ6FNOR!G>=5riNBmDyAez``xiXG`6fQ9V8(2ODj z0&rliwaP>WNk#E02IpGWnMg$dRpeT*au*pIfJ3sE()3{gI8^+}$nXFhmOYmij|jlw z*{_(M(XoS(POoBwNsa`$cgbCx#AsUg>73Sm1B-&R?iYaNxwf_j6WKq|+gxeH!t%0_+vDY zqeUWpcTO09?lU|H@M>@Y>5C0erSY>LT?l`Ifd+3X#ZjR(~7 zY)@(~2{d;%nY%!aM*Na%Xrp9mDo|{)d(%b-+H6lME(;W6Ddsk)Dvk6g`Glg9yq*Cu zNM0|;o8{^ENIn3g*^`)2y#p|Al6z27=>dK4$CuTg1M9_lgZ zGV;Vm;{KrW`y7`O54<5_R{FujgG$T!OjhC{h06T`gcA=d)Xm>Y=n*CX{f>!TPo+=L zkR(6EnM*u--+(DUbr&4A-g1N-=d=XS-Ug#wAw@@Yyj>L<<$Ft9S z$kx6#@%Hh^6#r>F5`iCV{8z{o_`y;C0@B`NhwN3v{7VQ0esIF4SD6U>;4*(WX@MV{ z^9Lh>#79)`Rh0XK2z`7eph(3@*1wxkd~&IPx1oDy){+`Vv1(u81!1 zk_h2{yu9dFuV*KVfwmT^5q3om5WthS_Ksy$GWyGAs=2y(?AVF8U>MX}@UkS72e zGnCN`vxg9QqQ=8Gj>ix246`RNjprzV$R8_VIJGf+roy~PWCS&Gi493Vl(u|WDlQ6H z?pHS6Fj9~L`=FFntslC0Gt$1uNIoyMJtX zQ?*|R{A+3|_g)2Nm(d&1;OyLpWDWIg#}7IO+s|lLch5HYihK@#K_EDwfkt%m+7RZ~ zO2=>x0hsv{uiIi*Zn2}jq~0DL*~iDQKsXil+CkpCP%qgV2O*809q0`?3`knU*-E*0 zEU?|)0Aie70)qXgwTydyO5z`BXEO3l5lciIlW-Wt+f)Xye%R9^qak?_WBdt)-;GVi z$-%Khu##RPs`AO!^z+i(6R*ibXD<32n@nKLrtPCPw_brm1S? zDKKjCQt%|cVIO4e#8avDM|_*(%VlcX4eV2BpL+b*{}M#I9K zCCg3#k@H*51xl7H}GFQEdG?Z=yf6kJcCK8xY z2xr7gOD?KL7^;$c2YD^7VREsG2VPq8;Mw33FD-e91nH$Emog}8x91_yjgN@w?v?Zq zSKOb+QL-moaeuys;EMYT9s*K@7!sjia@R%LFAOOjshU8fh+DWr*MR>xWAIbUMA+hWVsWar-$jk9E4%=E4CGAQ_fL_ zq25d#Dvj8{H;)AY53>(FOn*Cu3*@PIn8`hlNB^JTc;J`EUWXhkO3=gfLk}~-(ZLTr z%mh75KOg(CFn3ST!}R+EU_Qy2g&%sDNqU%m=wT-4VfvwmnS_VwhaP4U9;P39m`Qq= ze&}H)=wbSyhnZkK^+OLcK@ZapJOn-E&NlYAJO2xzUXGgemu8G~Jb7DgmQxhAy zm`S>re&}MV;sax>h;%Va#l`fiVxLm6#JVE3L30r+q3Fct`a|PfJWJBW^hX39j!AIB z=8p_On_wsGk8)0oX5udKk3>^6!P$>LI$(~gO%5zc(8ct}#98a$VkYQfhG0HHcfy|? zXdaQEx8&~{fTI%hmi#$!Ez8jfdQ1Lp0XRNEZ^@q<#5*}bpUvMr0H-ABE%|!{Movv| z%I41tG*3^^Tk_`z)R_r-Oa6jD^K5M8fO~|$IeuQ4H=+Bjc@w(dnm3{Qt$DMhbKW?A zJIEUc26=OS=e%)Xo}Cz?PqEtj9vebN{HN3bj{_~c=PBnuNuQYt{U_g}P-X$TKfi2o zZzL{z3BqOjunn^NJDSNzqwv0jQqgPh8oRM;SwMS1thbmN_{q1x>hp9enV(ty-aD^(Qhb%jS26`1k zkV?Kl7&(OoR5I9iFzoCZOP8|bCCYSy6GuilACsqak{t@89yW~ESj3JDam zEj)=5^vr++{@7nwJ8(Gz*ILWVrw5sVR}sA3TD}}Jco6&>zNltfthKz%a0qu(kG7m- z4HY-~Xv?|Qux4YAkxAe1_rW!ynlW8$*=3r+)B<1czp1!QTr_C=$5=8$8OON^b}#^YxRt1= z?3b$WEh-cRhl_%KO!`=xV$^@|EV;HRC$Dath&LkbogNi)uN)`rKBL;KXUX)bGLE%h zQMwK}55&OkD7Lc)?hn*Bt~}XVG2wWPhwh`j(X-?ltDL;*O_O+o$AY*-ITtdbzMdsl zGkQ+wd<>iuaiyBUo&&>w0q11)sRX;n%BlXMUJ?awm>efA*_$4x>3tzFjdkfw?^dXo2XLI!r#C&;r;7kjIUeFa zh4_dV3dg?fah^Y&)$$$?P6ffnBQx#=JcCPRGil1KClH#w9rS-UeFc~-T7;R- z3O*BJBAW2#oB?<*zztOO#BOXT%N@v_Vf>q5|A9o=sa7fp)ADEhkY&6ja~vm%c8cYw zJsmNOv;&veKKKX(vmi-dmy>0gBoEWVrYC0Qw%W$dHnaX7{%lSu>jn zP6Yt5$N3Cyk>+dd9`xz`S1qT?fatyZ|BNzCfQBvx^nG-+LYy@F(_&A?#tQ$pS#a48_m3# zG<0!*=}inhe|yQJ%JaFm(afjYp81BIptbW`P~e$wnN(}dkHCdK5|qHlz5!JF*vwqs zhQAo=B=CQ4B%hwb^sF4cjOfwJ;Gm@!ExCp)olaKDINV}A9hhK?l|+&H*l}5AbcD(9>>v>M<~6g6%09%!ygBJ*8l{Jw@{|QOn2{-{j6d+KXgA+tklPX$(JJa-15HEFm1F&XvE z?SBNkZvR8UaQ`E)*yLo^9X;R(NS1TgBI;({w zyFZAhoHNDP17z|lY`LtiJgBr>IY*G#Lkg9ba~2kRSfOs^oQ1_6q2=M;MeGRFuA?a(M996 z+;c7OgK)e~ognPK+r!ui{?oE6coRSL7rfxOryQ#Jnx)V6;+`_pf4u;OxSk-7i&_EC zCdgBS3SJ8kN_jmX&I(ZBl0Kr8$69+0Bzixlo&zNKUSMZ+g(VOBAw>Q%BbV5&Am1qT zy&9W=jJG(Ev?8LwFtwFcukGveESB&=GmnvK?F7n?pzBpHWt9KpZ+E-$$w2 z+CJ>IW8W~>&{N-n{P)b=&>3`-$3iiCYMRFHj(9!r>(o>Kf7nfST@4L;%;>z^U@m*i z=zI;K$BZtx4@m8?7)o$~H0Uvz7Xk-8W^~~eV5G;4E+SF-xqmq>cPJ&gv?sDm4y8nw zF^G;$S%(2|3MXSsjV`CKtb|2Zk{BG_-vq22N-3Fg6tFy$QZkkIHBpnS+{R~dObL$e z^Khg)l!C+iuK<)D4Ttv`X1~gn+xT4jhJbn~1&8;0p;UrHDe?JsPa*1|6r9$VK@0o( zT)7QF9!gmczH;w9JiC2N5qBtsKn@yv$b*LW;Ldi{ETQDxNgAs&VwTy1ZbQqOR#>MF7I5S+1ZA8y@Ba)1Z z(R190B*!+Q=f;CkMvhZNx5VE=EXWc$wh?s$p&r`^K^+&P=f_!p-MAQnIJO~UUDPl6 z8dk_y7fqG0nX?w{jXod*b*zh)mAJ7^cj)~C2BYthvi03qCuQr0V_kA=2E#(?-o<2` z*$s95zMv!ZUqxS$x_`SS#3U<(@$r+$*aP9zUjtKA>$h88;D< zLmc69lpNv+m!sqmN4Oj%hd45BA|!`6G9OXBJH(Os_;x^?2+1Li%qI^B$cYfMmPBbJ zma2!tw-gyXIRUD{h0zHJ$vBZmXBsa}0y`5j2BS zAzmTVoKqN^twR-Opugq)XYivf;}Y0S*Q8ou22|@><&b^$5uJw2J)S7u%PD&I)z3tLKX*pv_{Yi1kFMm z#fe(Q`5;kdTcTsPfWsGSX`zX(pAmU)!mcSZ0 zr)^C1{GrBN#u@1U?fZ>8b-QEU24qbze+b@WjO@CZI6YsC^Tfe1T_XA336AOh0l|dq zWnW0n3RLedd)XU7NxGeEURWaiICiobW=9_EWX}=M^MjpizWIv*lv6Jp(!D~|$EC{( zPvw^S9G*jvFEc&~KDgjECRrtgitSf?o4_PjDCFhVjRCE?6;ez9F2ym)nvDX*O%L6^@k`&L z7ADnCe1IUW=XmKSXA0!yI9~eU_Dzn>)=$w?j+Z%(mwp*<)|2tFr)=NEJZjC#cWRFN#xJV*d;ZU%)8(??>BvS+e|7+4#0nAJzif zb0awJ0$TwQ<|(s{GQI8n)IGv7<0!G~$uPjBE=1}JYx06BEV_Eqd1V9u*fx4YvQUMQOL|2j+-OfDSjn)Qk=i$Jr z+c_=J6lEtHpT+Em`miEC`)DAF+|CyOI=7QyMDN_r?E;2wXF0^t;Q1~D+|E6O7`mO3 z-yLqJf^<7u!B_6RiDx(Zo}t@GAO(#*?>EZbFBbry;P4s$9KhsYPf`0X@(og?3 zjO&?BacvFaGEwgMrMGRSjQCaQ=id!wUg#wAw@`+DRrVN$EQD{dgoWAKi&c;^sCaJTqz*^ zDrPN-(&NIfV)9897z@ly+AR)_p*M#&kp7f!R3=j>r(F7rw?Nfu@nxsP|07KNHr9l% zxKyLQSRdI-6b(U)!A-tDo|=u1BzVdBBf z7SYdsfEsEa$1dDZWA?)jV|okd{U;Ltm}U4#j^gDWD{;ZjAbyf(uLgnq*QyM`{;W%O zqBj%lr>YF|s9+yOEwu|(M)-$GJp2Tm$}A9>Cnz)EDnENixu>!WM#lE%s|j|K$M7EHEcaL*1$zVew|SNsO#XvahTpFnBtGI+$(z-X8C-+A zEUm)9oT_5AvCn#xtytqiL+Vg^0oFDRm3i26!eeV-;K|JXUwD=gO&l%><%(zuevj~&&Zo&nG#k!5#iYxF0k(}ZflZ|nFYo&LgrUuo< zuOF(mZKCZiN=xZ(6KNh~fiw$|uRO4CqU4G(Vhc~ssPqLQ9qr+yFA(Vl!W>%dg#!PC zu&nMVd@bPwExS-`e}M2G7}rGt=WsR!vA;k}yS4I;y!8u6QgX*M>G^*Y^SXYLrUUD8aPEyrg1}mf<4iUXqfm>VL5NUB^dI9Frs~sw- zY9}lmvBFyb4~Jhj+#;vUZvgG``B=Db(9SMqv6%1<(8FRhKw*oG$YHlKtM;**AT|;( zPjnr})clvFX-7^F^TyaiDOP6*)A7RiaVM-9%Wi1-M4a5h&z>@BTEdu7WAVVzm_JkT zq3h2avBkrF_I(ML}QUnMAVa`k~JU}IfID1 zY1&cjkMK$h5gRE|H3?%%EOHhQSUN{{Ha=K2BVt3_)9++Q`-e^iW3T}eZVAP+mfYI!~0T^)11;+$_gv`$6JPDY-&{E1Skl(=+ znS`0}0cG~RNo9UVnFne8LHp1sEEp2=IC%~ZFmr%0IFkyW_egLCKJQVe3iNrI?dzvu z5tl>p|Lwxv|Mp@sb#z%9x;nbI0sC+ETUqPw!%tS5gS$DlI{4r1w>n2Rj&cbcT?XO1 z=-nLLY!!vUn+DP4tW6PhbV=;Gzq$lib#&De0FOGl$T+vZN_Voz(Uq4;=s973Ro@>8 z9o?Z=m4JoD9`c~! zJ?QO%mzptp;prS*zGm`2+FxBmMs;+{#9HU*lHeR&O(h*&>UECppDC)2E`#(S)zKxB zb97Zy9o?q{?;Ks`syezy1K-n<>OA-R5iVsFc?W@BXCqML=yKuXKkhF^_CO0rjpH;$ z9o3$84#GX=Ku-@1IS>rnflaRKf##E%)JWCh6i;T5N#d1CsVR&TNdo(PgpzVNKDGFF zWEVf#9gg?UN6(OQhvUn5I6k$XrnJ=O;rP`4OjdX}KDC60(35>q#*9lX9fA%)qhH1# zqh}YNT2343lk*s7>QIHseR_u}cR1eX;rP_ys=Y!Mty4$PKpu`S_x^&A9F9*_GU!$T zjtyh1WiX7f&c&#!04#=%RRE2Hs{m6VBYT{wdIrN)fLEQ`vc%hgT3rQrP87LSfCWfa z(JBDzLD4EeB1RD1n_C5-R<{a3Vz3I3K@f(+oDacJ?(up_w+iqpvhg5Q+8w!<98F)Y z>2s?9TmPrfXQBkTLsXZaH{|cxm5s#+$sP~3->tFH}#OTVcwEC z?Op`SJ=T$=tea<#%3!4N*$ZT=q+hKtWn4GUu29JHxo)1VCL3EQ*UhsvTFKZ(*-tpP z@M=VXQFszqIUMYRA4cMGZxqbwYdMj^VzsmmlDM4(@+si%R|D6~GIS0G`TqS;@o+%o z48V5~mbvF%B4~RfOUk{ClK0H-zV>~zCLEp=aq4_Z^*#pag3MW_iezs{GM?$exI6U> zu+LJqMJ%S+oXKJmU+5Spksi$kyaBv}Fneib!Y&6exEGVsM(`nmKP1@BBKSMiR@i}5 zd$6Uty;bGjP&ousorBoYcgNxZG4Y5z5_ny+y~6699F|2RNDhW z4_gX+u0s5%w5IbR@+|@%g&rYrG==)u=@e>^Q$iH_P6Y?pe{=`_JF$tlv!_ZT`N`>l zQuN=_itC_bAoscKxAo9A2w(CTgrt1W`gRCE>rr7xQO{ya`5RS7X+jHZ5%cqp;2MG> z*n6{Q{(>R{?9&vvSgH<1_QQ~h+RRT^Yt$Dq>iz|Q>^bd)tRC$Ir3fz~bqhiEr1m0G z{{@f<{}~hB8(Ya{xIL7y9A>GVvn#|f;z8!cNVdROg(`vQ6?#xMLVfC8Hh`hUdXB;wOxG)Wc8~i=-n!TuK$A zHQsZ;G4ecejP8T}j$lW;llqU&Uoh$F;3&%!g%S=*>SuUfS|-{HuXT}m|ueu%u9QslsGSCt{p$mnCC}<;s1DE z8aV{%_kOqnWzqTMbemvGuHm0fr@JFlfO2=|{)}XuQN_KOcOAfz;0oQ_Na}QjE-|v} zTry=lg4}g3nR+MLDxk5;Jn?c+bk`ZD@Qy%n%UF(CBEuY7gHw3i7UpQqU1!V^e=4Bt zI%7NJ0a35J&f%T8y6YT*+;#pEd@+wZ)@4jn+VXiiz>GY$1Ilpr3nr?JdAwmxcb!X@ z{t;o>buL|YJ&3SPcAZO?E97>a6Z>%UM0TAM`<{m&896;l>_-9yA8sA*ugT-CGxe6+ zC<-}qxyJn!Fx|Y8?h63&0ACM&6U3UH@@{f+-fn<;;Y4O~zJ{{otR7*%b0sHkGFQ|eszD( zpZyJV7gnJIw}q!Ln0SQ~dZCFI-o`jvT6hqXgN+u)hB4gv3!VXM4`yo5pEtf9)`;Qj3 ziNZFIY#k|!ygQGCSm7wi@Lz%wPUf6fmy0#v3{eF(1A{aruWS zxueg+kff z1I&hMh01fkB4>?4-E+s2R;y6Y+eP$72` z<<=-PFn18;8Wb9w`xR-83Jt+q$S9mFxBo}`&Cj5jCqGdbQt?YAi8<>=)3 ztqMhRuc8n0+Z2lDZX(pKP-*UVLhBSt=I$YMj6$hg6}7BaD4lzbv<(VnbG%^3KUSgg z+-w-xeu;h&&?q8 zt9t}0%}pZbZ#WTRtGkt@f9q!grE;|ufNoEqCu6J2V?yTtUTN9fJksu*BDC_{p``tZ zZ<67)m)sSD0Nr!6Ks|HMk#^rX0_AhFNPFSXjE<-V|ZA?aWhVF*>oMC5z zVq(!~zi~OSmjjt$2qboUF^?BJDFc(H45WZ`laSbRvOI(YET^O@z`R!h))0_h77_s# zk`v%1eJa3+Gq=x13J+b?m=xo$re6_ktf?iKh)D7+d>T*#3{CL3s}yy zg;&s6HrqlJEN9umZlL|b7M?+3F1LlBBZez%p$~LkX$wa{*)MJ3c>KA_76yUk&$cig z(A~Ch5&ocyjXVi$sSB7Un11mKG<^xAZQ&ZQdxh&kjuiM!%V?noqKXwNVN<*?3gMDM z6{w|!FTtNE>;|4>VKLPDg?Ut3I3LflLLOG93w?mk6n=_uu5cWl-3l)Q(}R)Tyb|kt z1r8ymAfGQNaLDiq94aCO4iP;H92$BSI3)Bca45(ZI0W=Au*Yl9DKeYbw4v<;Of+a4`g61 zKVOh~h;@_0K0jZOdW2IscEs!|QjfCk;0#YLg&0zgDJ_=c`)H}h6^bYL`GVA6Sr@&E zlH9OCpgqZk=2awe{Cq*`X=VaGUy$SH3sTQ0EtC5WJgKd0a$ZHZ+#7=dZDVc6tunbU zNPAXe=#^_22}hUBhCai(5W+OQly zUyyR2FUaxp1*w;nb5w39V|Yb5N9XpWmhDO#o9iSUe(l2%<=ODsn^ub z$+^?0<#n}lO733T`G(SV&Fx3IH+AiNPVP$D@|M!}$Sq`^y{&Tda`1*tDma<4ILFTy zq=E}5_Rl@aa(GW;Uy|EGC^(sNU~W92;AG0u96w)>`cPvyELTO^M=E!CZYpE{xE}U- z6-VS|lk*czZB_0orr}dfZFR0~5Fq#Yf*fBwOnsqR>T>*iLF!AbJ;CP-QeSb$E6Y8H z^UEf$$)b+Y4J@0&AnKUZm9lB7!OQVw&9doq207U84Li!*=L>RNcqp4imx48iufvzk zR=NH;uCI|7B2ds@bF$JRoXKj)%n43)O@5atnt7+LK%~obNfO_j+BRc&-5| z(u*{6`S}9I1m7CkBiEu^Nbf_pcaXglZHOy;T;(_kKdcW8#-80^rp*qv9F*N@;R<^o zdKEj;T8^+}zElO4Kwtn>W5+LZ-{K|K4=-f z7~Dg78^eQkJ2>wKI3xxO0kiM_f^ZM2deANaeat|>^3{U}Ez^1k;jz7h{x0CnfQQ|Q z=%R@3BUm<^j*Wd(%oy=F2;WVInvn$*GfoV#X2v3CcE_qvIhrYU$e3lZ$mzsvqS_|{ zp3{Iq4xWiPMt#MMSRyW-{S(r#%UV1}Gs|r&anqAJI zgyix^tU;q$eeB1~J~QV0K?pDXRd*WFAJL9s(b{E-xTPBqEP1<}B_E6Y1_(3uEeuO? zlL{0tr*B08qA-ug>e!I)kdO8n%axWl1_rr(jpTM2Vj3cMUtD9~gXHdj$L$UAGa;@y zcb(+i_|dTUCm^h6#rUnAfL3RYfbxlZfUpT-6Zb{nBL*wvW- z#&2R9P!9n$@ka>QA)w*kAUlvbeGd*8K>NLF`Tew9a^)VWRWramL^49*0{~Bwdh{2m zNA*-T$lgs&ldYwerg@SF7b7FJ%1qMw8ER7aV!|ARa0>Y{7Dxuzo*E#f@OpkvzVs}{0_#f;oVq;rwKf%9b*L+>N#1m2#)-7e*|V>fgI-H z)(km&HCx|cJu@-|pE|X>+Vc?cP>wNEEw?mme`}c>u0*0(yR#v4KSVkYRGFXB+(m4z zvB=G+5Yu?CMtqB`J2EL@hv;$Z#YY{cE)c}?Ni?} zLDtUvlKD3OO9HV-GlZu9fjKw9(mw<09H3+c-!nI$D1*h=pQ0DwVl0#Y`H?813CM>3 zuH2VI{bMT4ImM}*jI-b$Fb}Wk@D?D6Rjn2b;y9DK4%IJK1wnU)!Qbxlo_vK#75KQ3S zo4dj1dy^rXnn4A+R$OKY9EM+79yC0CD<0sbX5X6&nqKA@U$hxvT;>?xo5sRGxr8ge zm??pMdgXrnV6LCL?~UDnaJP%_z?F+$&?THj+9`kvysc-m7|=1b+PcD~2b^Szsd{}w7( zAPP`7fu@bVw+YW)UZVCr{Qb`#B1^1(Sb5ud#cW<2o4h(Ud39{^>e%GfvB|4rlUK(k zuZ~S#9h+)v?K|W0P0MCa;c7ULBjfIyQNAZ1U>Z+naA;q~h58|KYoAiTjxey;mn5?1maC-(^cY#A?7+MaL%L z92B@qO~1>Qcu{Hk zUABaCY~;IaiIDkk)90x!ILAi5%a(Xs<@CF3?ml|`E}OfLUcbwhaE^_9m(ATruis^J z_tEQj+1!2f`dzk!b8O_hY>7_aWlMabsnzeYB|g>E>UY@^&asj2vL&2jBj069e5ti3 zaBLD^-G!p=^Az&IE|a6g_ApemzDEgphM>%VEWuP z2&{X{R9ddJ?|bu}KrEs_{~l8jT+E;;oIM!f8cVY|=>85r%sU=IYy*~(B%c9m!~|u4 z#8^$ns|d?b3Xs}p*B6xRDIh8RM><7qRCEZy zfk?tSMzR^epy!||4Nd*UmJRHr+2c}G;i&?&o+1%4vbjhPEWbUB@Wx2A0G+k-lH`B(-?m>fc|5dsM87d{~A*h`x8px2Kq&V0rb&}>lyKKjl9C{ zPl4|}ndA}KqJ&%mQ%iB3zLUG>&Vcfva?j3p-V$hZFGW_^qnJ6Fh$WW7r>lYkLj~yw z2kcv*VAx5FEE^#$_-cSjEdzk@4dsV#ztQC05iy2(u2x;Y33cT~*CRBBOD8rTDKbXY z_vxg*!pGg$fsm!dswVq$pezVQos)$X6Tmc7N5pcn8ft z7zoV=t7dBbiE7^8cbR#RXnq8mhj3NO9u&C?roI-MddLn6r_$60RY+yOSA{neF3Y&Yj;ri11h{r6;fG^Dttdw_(xGV4+@4fllPCJ z@bFOKpLS4~WKG|y3aRW|Rmd*@Xy5RRC_I@83*>!96kZZ4+_r=szNHeQx%>O zD*QkcK23$+koN;o_#WW@#ol{|NmXTUqi3JWb*k!|>h9`pD4@G(QbUtNlbQ?)l0|3} zk~4y26EvtO3W|aW6Xr08j$sTK8AlN#DyA6~!zkuF<2d8^z3*Ce3UFqw_s)0k?~nU@ z{XBJgueDd&YlpM*(cJ!01QxclnA=;LfFcr<{G+5lskA@krGx z1Eax%TcS#np~^NYkiz1JOBVC`Fimf35qK&Eig~R?;HJF5>R$-_C%rsK1yWc)6}U1l zaG(f$h5}P;dj=qO%mr zas^<`&11xdmjUAqz&5hdw4ldks~I$5#!$(ES0P8um?dWX9XwTH#;ku$U^B62mR!hL z*#V4V%&Z_a^arfU=ZNyzfT8wurv4OFOO-#W+6kVo_GD3eA*eO=Crj#Y1+1w*`Cn6i zvZQ_wNHq1z@;AV0z^P(DM@$&N0GH`LR}G-@x?z&;=RMzmbz;ELpw@J+`%md!C+S`d zLQVHNN%u8?Rqc7A_9<2S8>agzRZEp?Rc%??S9_(X{gTo+pKY!TK7m}0bn>gv)gsM* znOB;nOvi6jAcbvHfoJ3e-X;RuLqKy8cw6uS2+VaSnn{=Kwjld2hvju_`-P6$a_H!$ zIw=1;)v+h9qpRpR0Rps|b`7#yyBx5(phg7V0T`agwr<=OsBID@4Ld?SUsm9|;0I}w zp2|!6AwX&GEJA{JgYxL|S`LYn$|rNIML$+V-wUTcy&P zGkc!SwU?0eyh?i{FKw4dyA;&TrA6N*(sJHZfxAWE9V+mCHko&+KnjZwm&Ec+jaIMU zYGOfMCGVWy{;R;dMc_Ls(B?a|K=XpaZcu^q^8(Y77k>q{rZ+8l(Y}kH-a^TX352Cd z%>>Ut<}Uz@ym^`Fze3HW;=N0cu8t}Dg% zpH=#HmZRk=os!#)5NA{s`Oa7-(o4Dmo=4hcBE3CfF2Dhnf(lrruMp`c0H*CM2`8v@ zN}i+A&(2GqDAJcxnn<50(k~$VJ*7_+={Eyb>61kIqkyd@pD`b=mZ1dYK0i_{KRSca zfs9?Q>I16RK&nFt0sl@=20>S`r7pvms_d3>$Pw@`f>QmiVxm?Ne3D6!*rxz;ptF^6 zKLel+>>~Ku%g3iJe7oj6;y``Koeqv@(X(pR5yi-(DG9`V zD}$q3K;2C2_*SOh9wRJ)L zeZNTGNLZxr7wNkItMpGqdU-EMZ)5IZ=HaVrlv*@eyxFh>oMLx{Tu^^FD4TO3+f*1% z_~hCR9p_cZ@{*ZW#c3W8$QVYyeXPAFETkbVe$!vQpZZ=jRKK!JLi;)5 zDteDWQ5p{y?_xw3nRlID3s?r}-2`4iSd6a`>)t_yXx}7)8Nee^((p6G?HQ#=Mo-{6 zw8x{ukLfrV(1gC&jxZX5YZ1t?4g=dFvW~W|J(Sgt5!N?+)*k)xtgnLYpJZKX|LIUx zKSo$rgG02wdw{jWIMfCF%o%nGJb948evGhI_0O@cLm+4HR!tSCLs|V8Vcp}i zW(VY13y#8Z4E)SJ_J%`Q{TN|A5*%Xi*}~e19=;Q7uaos5`ygX|tgzkTv%N2DEIbdf zWZ}bzEJ`dmvnER6S(Eh(Pdlj~Z3Y6C=BFJlKd`KUfVHZ1kivf|VJXAiCH{KCQZ9N( zOSS`W=YK%{adnn;Y(qp!3p-LG-$!H@w4S2`vO4brO{1f6D2H_A6);f03(;l}{M308 zVz%ISX+HK$si5N}_7=pvhu^*V*bNf9T4GN*2J>Y2?Lll;wBo-JjoT!y^jIvN;`e2q z^HJgaKw{S-X83W)95|+BaTD0|w9M|cM{CfDGkl+bzy<-<)4Rk7v5)7~_e58nJ4-Eg>nDgkGm~EJ6k7&OA3FbAE zV@*-}bmY@>AZ{j~2#880|DLd{CP$@WCl3QGS)uXG0YkD?4#_EFD3yzOXv4ydd`U@Z z0Y{LsrY+KC`Ywki9DXjsqUPajP&ls!#Dzd~=Q^Vqz_tlXhZ~6DVxt+z77Umj!FqH^ zLr`IDgX43HiDR4VVj^`vF$vRlC?Ws#V&cEOPb+t=^GXdAGte= zWR4-Ndo#Gx!WiTe*GhNkAv>N zUQFbvT-*?N0W`}8n<5hyYr1kDxl`!CNA8{=A(^5hxU|R>60Va*M=}Bnp;(cOj?z@} zBX^X`aw;i5bUoLg>;4dE)KEH}o6 zGSacxkqzK`xmNt_Zi1lm-3fhQk~3*FFdoOZ&Sc5dO1zM9a?Y8eknQn|qcfFcG@WN0 zooN(+4a1PlcdP85PmH=qWM777vAGpb`COoWGqA)?P3Jn`e_Shcb32-*qP&ZtvBAzoSV$0+j4dm%$qEkR46($-87Prj|=ahwNzbbVt+K5?AKoC4(JJnu-eV0Yd#* z_w33_`FvDzz--ap94VyTvZINYT8XFgJDM2Pz$|Qr8ab3zE_?z+Y%FhR#u4=!!`rfm z>!NsqS?LVjMrBLU5;Ve&h;77Q#b&{gi?bRV-rtALIoT#EEB7U3L35a;6 zrW#VTnk0&629;_GsgjudXtD*7AL7>sF=cJZu#yF@E8?tjMtI;Xlg&Eo=$zvbQAY2W zb05X?EYe}?$z3#P2enMX4@q1Pd9?i@YPy|N4b5&6jgmx@itP_5-v^~8dL$G5XV5m4 zhIV9g=u4uOG?jK%Vy6S7*wGZb0f1G+0`@Iri06$}c`>#0r&OGpL$g@KY$*yIAb3Xz zg203VmxG}4QYO29Z)ghz9u5L=D-i>jzEEHjD4Lxmi1A<{m}mpi$~19<=`0*21h#qZ zb1uXfV~ul>I_o+#?zyJ7K?`kqnd~d4sM{a}25FgH;ouka$ z**Qka1`%$w$mtRIG#`#w#d3D;Y9LB-XXi95XXow!+A5fh2ScT_6ldo|#A7}JXXhI1 zi6bNT8H$bhXXeHtH=IMy%*78qGZ#Pf%$$=uGj|-Mz-{qE&&)Z8o|%j1&df21I5QW| zotaax)Qb6M=B|Vl@k7td#Sc9*7r!hFlKh#u_`jT)yAC2`--~{1(HX<`L`sG;cF92{ z~}#Ovabc9z9o~Bs?pxaTQWIW>Qki^)02PJ`mK@nj4d*q3I5~o6Qo8F;kyajge#AcqtSd+MQis){1(dgM zY6Iz5e|Tgsbw2GzA1ulvd#MYwq6a-5*-LFyDD3gbUh2Z>LK*dVWG{6QFV?}~AurSf z&?bt4c-)eTKq-O!ZP4NY0y(3I5;OO?doP!7amp^H ztn6aS$}Xm?>|)BwE~c#PV#>-crmXB@%E~ULtn6aS$}Xm?>|)BwE~c#PV#>-crmXB@ z%E~ULtnOlh(mQ?|p~vB0D=Wt{vT{5lE5|dkw;ME^Svj7OmE#%N$)GIF%JGb>9M8!1 z25YOV9M8zIEVs_e@r-OURM+aP9M8zg@rCbvWp2H&6Gl_yO`WVb}_lnvcUMenA}5lF}eOOrYL)K?jgIF+&yf6aXiE0 z9s~DfI>Fz?IpnOLubr+NCAJ6c3Ji~og<8&93``%!& zx|8f;a^J5OsEh1kaz9Wzbr+L+$Sx-L!|#yecBSrOau3Mkbt zkX=mfA-kB|zi8>n?P79&cnDdogBh>Oy)0wwD|uZRL~|--#q*D6$Y93n&fbMTnDPAM z88Vphdhw;?4`w|7c!msSygqCfaXdo?GoF7uLk2V6A%hujzz)&Q;~9+*lD@z*2uSxL zH<S(D=T2#t1uzZg(L$Q#PKSagK^XolQ2;;8B`m~ zKZ7}Cvg`b|ZAkwgh5{@Ghmj%G=LA<~2wsaa*=ra^Ic*rbjeJJ}tXMDwUx>W@uK-VF zY=p7fY3$tqn__fgmCF%?`+fq+lfa=T@il@Wn@vW@K3c+bUlX%}%yovQy{+a|B`|bY zfGuoPkU9d)&CF0H;&OQflj@i$l8_5QStbLa%h);T2HG+i2wg@$P6SvfLq!4C0xW-p za<=qA>~?^fkSnO?Nr2FEB&|7H^iaoFs^@QcJ!`4w3(%^bwbWBQ9D10wW-YU}4?xv( z4)x3csCw2>&q{#M^E=wHRP<2C+NqMBg-Jg>OQ`22(5fCeEAl+Sv&+G_gcXL@>6Xd* z+7h;ZO|TTCYL`*%5P+(7In_=C2(_nE?PO6)m0ze@ejZZYIEiZ4f>zZ|V)C{FRKZgy z_*H-^cq#>d0T6<}ZVthHj9?)2l4+8jJ}F;tEd>{k^aV>fKarrMrD4frfC?0f0aVcr0E*5BOwBun%C4L)3hz!qhLr5LS+Zwwi9ds zVMf3w0hTXdhVNs^{(_(s^mhq{M_X3&KT*T`lo|^BK2wi+&jHo%0sDgy!u-mpz~H!& z9NkF~3hV_(0n7S#2N6scf)9k?RS+~EL<_oq1P_D)?*)N)fxhfPgF}IrLDAwdL3DGW z31EU(k+;kp+2C-*n3jhe%dnCVZd+TMMzDwH}}axUU&4S%%cY@&F7wB&525x8nWMoa&4!ATF0I(An0e|b#2A-OJzLo#816>}3$K56mqcIQ5-6jmt z1$wuMLbj)OnD?v@d7j>FqELaS zcbh0w52(JdT9&cbj+|5#{eT@i;Qd-)-U@a<_@c zky8F{6OSXN{M{xVM^5>>O}sDa-2ExZC^T_G)45*f0xeJPPjL}}O6}?WDHQ?*J-t6=fIwkS?@u{ips1(! zrz{pI?&~eB1T(^ zJ-t7rMxau!7vpx-3DnS=P3Rfkxo1~4^7Q@`wX=z*_ot|x<(}T3a)D4b_4NLf-wD*r z)B97DuZ6d*DP+F&s>HSOeqb8*Db(82`%}J=xN6Tr9dJI>Caj&O_ory{*1^;JQ#7uV zr}wA)Abefq?2z+~LGRkGJjN=*=g*lTg@*o4vCTrxWf0ajsyDIHJTrtSwyuuNj}j{Z zlc)rYLDbz&i54{sA|UMNg09^ayT}> zZKnh*6n;u3=CSL1Y>FW;@SW+{OY#JF(7vnl`!aOb`DBd;?~!Aoh)B?R{ol$_f_7sasE zskw}TuaN%Pded~xOzeQduW}N0SC|{YUe{_SmZvy~!5){t2J0>Bu_#QiDk|~=!n={>91zkrOk7xJj|9O% z2j&B()PUVK`lUEKH2XxXbmqQt9t^dF_J6yvB^0o~;wUaWZ^3fQ{#s;IT9J35&HhFq z6M3LDpl=nz@$u#azncZFs0l|+G-lr=s>AF?$L*N?I6#NEnEfoCiQGDD)Q;H3ZU^pU zG}!-Z#H6r%7#zTm2@QpB!Mq@URVI`n>u zxV9S^XucGI!3-2d2AR$Rg^Reh8_A#OFXGy69*n^SQ$Sa2=#GyODv<|`ESZ1@;wdL) zzkp{czm6A;j`xty5l)gtCnSKDG)Pq4_W%QvNHvp04X~f91^zd@8u^8AJA_Loz;Q*f z7ha+ecH-iFnyQdU^Ui?!e}o7mDspcZK!bh~C>UAZ0nlL@7moaql*3Aq6m%scA3}P3 zq)LfLKI#N$j6#XXv6M1Sp;UMQ?h>7#fEQjc179^iMxg?@pbwHu1tm`+P{J%jx@o3H z(Gnl~c^*p}N|;}MQ~-#;G^EjKUxi@IZjWcy@QavAM>QpUSf!g_c*^N^H{v4FyRF#< zH2f)!aeDIep>zck@6Jm6pT>omBxj%|A}UF8hVa9e7_mmW(2AiS3Y35i z6j0KH4;l>9s8|z67Bwnn??yOnnEsf(58=}1ASayYz^kJoEQpDY48qLtl%+GQM5iul zW|&{XOmwDfmtaOoEWYtPDqLqqcp`Sq?iH@q_~7;!!FuVx|)ef&inyku`4z2V7pQae7orF z)FOp~R_XB}6mGYs7XKpLV(oVK*?4@{?V*;~5pIrgdyWMevy9zox0l9+b1r9`xZL+U zW#V1Ks&cvP)nr@R2S2p+D-qWin@X>&MhY-dc?7IC^RUMp(JPc>7f8zHceKo0n9|iMV9@EOWqVASFribBjUnsz-G?i0pdI*NsH7ll{87Y{$ zJmvz!OE*G+(ZFDO`0Of}eJ}3j2SmGvsO=TzU8d)^hA`hl@ZDpusCnz-fWC7us6U1$ zESK#alOxS}L(3tNAekaTmRZhTAIU@s5?7#n;v<MBl1O7}#RUlBeY_-8Z?$Bj+7s2# z<=f(VM6|N1K10y!aVM#aa~b|s-HEPY`im*R<3reQqr5~nM6%!lv^Rk_)Doj{Raa8M z(oco8C2I;le_gd6K2I$(c=cm~nDx4f*o~xJUZPmGXl&}_b;+G2Vz+IzxET?JBRFJ* z$>?QSPC3FY-UPEbk8gNEud%A`LmS}^$=MNuf}-Xe6hb4b9;<6rLoj8k73*G(Nd9t) zVm9$Dcv9J1vW|?QKqGjl#bRo@gi3+AtX)0Uqu~eJ8djO_!+Z`B_F-6VHsklqSP&f4 zhq3>=K1{BAk(>0@PfvvGNVpoQz5u_-X?$2wnf;8JF*N;HX#jjfP>7!gP5d~CB2UFQ zH0{{(J()s!0I(9Zj2yiWK_svM$w;n3ShRePfM`iti7JwfiLeZW0$dzP{@EvEhegO@ zRw6^PvE1bgGPZt6zUr;t;%8gm9q`!#(9vh~*H-*Cqju$dmh0^K9}@oc&R)(@L30_E zcQTZDHGW8b$V?$_pdm~>z+FeXd5C4e@eIw{WM<=Lz(_T!qG?MMEDsddUOoNdi% zme1%$)oL^ay>udq3moWoMm4{GVf+6@57jq%A4;a(muh7hBG~mD8ih@K!EVzKVkb$y z5gh2%8K8V4IMDlQ1pQ@*Krh2wk!6TLZwZ4*_FD(~;X{0sp_exW1{!Q0rh`?Y&1?U&a7nGgzfXAmZOeDj5RY!%4%_~r}s+#yg)qcRFyP6A(prl1Hf*~W6392 zKk6nR(l0afYlO}G8HfU`7I$Ny5Ott?P6%fPi)iIw1Ty9WEij~FKHsK=rr3N#{7?}? z+}nz087_g;!%06J<)QR(1hygab^Oe*1}_0@=)>7R0$RdqhgbG36gbl`WfWF`0)^7~ z4g@xqA^Qw^bv=knIAote_ud1ju?*Q~(9v%JZ1Mqk6X1OWjAb%xpG%Q)K5rJ27z#vC znk(Kr0_tWfBE;fdY&ZhJzE7G??U$(qEm7?CgQQ2X^kk00YaQ;IK-O9Uat~Y`i|kPV zaeU@yreu^MKdS{&u@o}smXVY_A5`L&Er@&sKQmh0;=|&Wizy2&)Ke7Jfn_lih{4Wg z+mSHSj>$*GyaFw7Gq&}n(^kc_4%J)DspekjY+<#OCcNr40LE}+U_GaJX~`OJmJWHlbQGxt(7 z$8-=@5*!W#Ky*IhT@k`_&ek75>Y+m^z~{opMB&0t#*$~6@;#8}YsHuhvIGN+?kuz= zhBVA5$S+tzl(P)cp+Evfrr>YAfJl-l6o>;+$PR%y(y%0j0=+`@TH%=wnZ`i!eOAl| zO06A<*o-KYf|QCY5BmZcsIdkgAT5+4<#O2%Ql)R8+iY$zn3fe=nKu#e7UM+rXO6cNH7eJ{MT}I6iD;s>U7~ds9cd}hVuQQT-`|0 zw7FBu6=|4Jzbsb;zbscC%N4tn`EqsG|99o8Ihrlo`l407TW?JI$y2= zKcTSyyFO>&bW|u?zku-TrR`tOhUMP-Av3HkQoY7NEw*Oi5neKXp=Hh>Y(-wDA9t9* z?*T-Ykn+L7jEI?|2>ijAw;3Y?t0x!}w;Xd8qm~+`#ySZ`ZY)o%N08x$3VX0U$$rms zlCx$8IWClAgQOUyRJ}pviZvHa1nr+m>zN2?uQsGPPU$#xmR>v^tsRI?&7KDL0rWevn2&Ej z(?a+h8Ymu7_O)QoiqC_FPR~&{q85_fkDrMe5uAr}f=}FJ7NCcWtS~i{j8o*4idh>P z#(qcR{d8D`l!&>ouSuW-;7S>cm>Kwn*jJ1{%oy^pxPq^cN72ma55OJ@6r(bg)0c&F z62Kn$qhL#k1*cUpkF?{{s0Cc-q4X_+Ts6qH3HcYZX&V2XCkokI64b% zv_mrcfERX*Jt;e!1H-X}OL>gP6p#r0@R`#AMvcz*#-krWqaDj#$C|*5^j8$BeQ`%* zaHy3aHX(zqxXms|-2N+`NnS=1O@ol{C}ap06(FFe3gP)06*5?al-5BAEY!Jb6t}b)Mk$MNi!V6FD_1SJibVAy zEtaziXYh-NBY^i;(bP%AB$y7kj$CQeh~m~7Ls93dxDAL{hC<39jubQWW7ZYp+E!Ft&&~D+-g`%LV;1CdaIOj zhk?6+)$l^dwJ$c@h-6H561Du1zCl&Hsa?I5T}aHQIm`{fSdT!CZPlT$=PKVWkg)R6 ztPV@jfT7m@*S#O}Ar+1>6t-W}88nv?H_;Hbpa5wPnwyB5V+aR*9KXVi7YyNIA9p`- z^@cEw1Fyw#gl+K?hPf0BXs;^?xG;{*b>rWb%6Y)9LmIbeUFcAFQycX3R1} zWkb}W2Z4{w6Etaxkde`82=qksApFdV7@A`Ig-wQ33k?~EEAxB6EAs*}w`3^@n`22g z(~xGG(zQmam2L*{9pFo%$h zsam3%lLm8DDCnt<2O+XRSTj6k^dgjhzo>T5jHZY=t1PSkBoO?{dqO%?f&aT5s*rs$ z49YdwVLMkEWTh|IcMYQC6lb{W?FjM|XSmxs(pRFt!S2c-`%voVMo^-hUO-7 zcV{d$TbU0K^|+OphlX~imH9(gY?!t(9-t?z%)n0k!Q6-UTnuknK&BDOh@op znQ>qCC5D8rlE!kNXOjAY)&GnzRUf@2x1yjbx}6ot{rJPh*_ znUTt)`+Go4wFXF;YL=nFGvfxak{0A(ig6)1}{TktH&yaG&V z=0zl`L8c6p4Kq#QgKXwBE96mh(E%V>dOeJcx6`O- zX(^2Ip+xClAR*pf&Y~32( zi@tCx+)yf;1pC~ll6e+sE#Dk)0`6^|DvT~g4 zF&^{zrCd2q_FOE)nytxNU0k&#>yrIwE(DdH+#i$!=Ya`_d`r1{n;fE)QD#qasAfo9 zvL`v5Nx^>ZQm&OJN1Z1SSB@#*KGLgrLhv6b}5`0q7EwaY4}_^8<=cII|m1lNkpI_n6FD0$9|29HkED4W#un zWpARXv}c*XH_%ni@wYv5FpRJ&211;1ZDX36nW(twg+O4gTxB)L@tDyrF|5s%Wihs@Bt{rAA&t#LZCr z2ViV{8Hz0WPkdRJDOQ^ubkGIHkYq)U{axaoR8mk+q z%g`|cM9SSteI%(9j4K!F8dA4o?vmhjC2DWBcLjxQ^DRc)cZ%N#<_@GK?gRWxz_vP8 zGE49&auT&zE*|{=gq_|1VHj`yg{CWG@)H4VtbV`_ zvkm2q#1Glr>c$%2F47wsiJPYQs*~utZN~8ZNnDo|LjP0@<~%}||3;iJ1!}8Tu$bH~ za6Mp2%q8Ht0YCGo5u0B}cpu@{4L_AAHt(g)68jBeeqijo<}yF_^L#90Ea*4yo8S4d z8I0Ri6JrvL{lr)uPh=7^wxPKz@k0^|PG)g;@ly0W7Y%3H*2AXS#>2s`FV!Mr(Pb;5F!6LF-2lUNd#-WDIyj_``W&V+H;Y zaQD@$B0Iy~T7aiFe$_uQ6IX@F>|)~rR_B=RjzdYe$TpO{RpnZI{b5g#-)H?y*?vJDaCihQ2t$h_`KG5lt-SCugvI&0pMaGnzP zO@LVLmF*Pd8}kn!Zt+tcXgdY@>Uj%r%_2;*m@YvUh3^5k9Mm20UB$MRx6+|qgOtGvgyCvMqF zali}E*j#2q7KiE~fPKRjJ=oAM4$&c(0*@U05>M7WOdZ$nnqh4f&Tkh~RW#CQ0i8XcR0Vp&b?9O7VQKNQJF+&YIi zZ1GM&w5+Fg4&4v99bmPqYp4(4@qoLng{b}b>1W2eg-}4PZg&E)3qP%L14GP(t3i!F zyfv7Tuk|z=mG?p)#0+9=VLBs)uo9IXN-%dl{q^BXc zQ+tRR%*NBl+)lxj2V=Go6C&oV9M^A%*-ANIa#RaBb6|Vlwlpv|>lg}jhUmTzlc-R< z0;)T}*Y^=7ERWg_RGQnS#(OzWSytb>SjLOY5TL+yCrGSwkR;nOh{(+}wC|xa4J;L{ zS7VW44hRmKY53n?y2(u~gw_ORn4L&wn1k;?e()V;i4V+@C=9+M9DD~3489{AdviFX1gV?-04gHWbuNg%z8ph`iA@L=5wh zFBAD2+Ym9)M{c7nciV=DWj=B%kq_F2i1U5qW+ETA4H4J*$a9E%$~Hti=p#=fa{q#<6W1a`(j0ywj#b9DF>ZIxQ3W7qS)GWyPEYnG4whD4S%ZI9ioX_&14nfXm`B0Z2=d(-~v0556VYK)gz&WlSA^5Pd~ z;Hy&f;;&SK|G1YRFb=P3dnKC9|8O#=aW5ziw7VGu;lt6>40K>m4EYoO`8Yrw6|${} z6w9bh!d!id;e5?=0ONALh9S#geR>PO1RoJAnX6C1fe!*sMMKM{A@{=uN<%AHT&d_Q zLh>;#y#B(^A^D+GG|mp6$hcD#3WRqs?lgsh;o}IcR45c~(Hqbzg~H)dLiGyan9r#c zv-(ro5D1-l9c{RVsI!#93Qr-lRv{DaSqSKCg>V$Ko;qTyyFmy2p}=T&$vO}U&*cBK>MvGdTD!9rOW9z@D3G%geV6QL`q*sg3G z=BO)l)kVVBHq60L=xWu_UM*x)F4J@ibKs9ub1mluPs?0-TISNz@1ycW(=wNymbvt_%%!JgE1mluPs?0-TISNzGMAo~ zx%9NmrKe>sJuP$TX_-q;%UpU|=F-zLm!6in^t8;Sr*$s9U;}($j+T;Z*2Dh7*+g(f z)GCy@usSBY2yN#veSpJu(2gK}Y-3IVI*};>Hq3%7>J? zl(oh@DJqG&a*YV-fJ)wA7F*D#c!w{}Vid`EYZuivq-&dka5R4Af zP&ZBnE!uI`QZrpNP&%6km^qsoj-~Z8avGY5hM7$4TV!p}o3XtKW79@)z183YBKj!e z8X^qJlNrP$g#wp^fM`pKVT#xcMA;Qg^oNf^8QQOnz?8EASqY8`zA}P~_919Y1>Y9I zRqv6`G$qb@G!8qh_fQ~m?Odx`eOoXAKc0;>p_4%H-?nrA_PzhFd!}?~9JbGbK@nRf z(}V4=1`xJyz%yzd#4~mwAIuqfSaBYQNCmrbyN1Il>|hOpsHzTECW1X{1hO5jJ_Kt= z3KVoWX&vmRap43et%C#4gG|)v1lJUTL$tof9Zp&Yhb|Ph1T1OCkiV%rY0hxE}w#Q<)yGA)dxN4o};=4*m~#3lR=_ zUD%LV>1e3`??7CD20b)@A*+xL`jZG1@ex6{SUX6efs|UzhG9Jlv?mRNCk=xq4TC2Q zgC`AxCk=xq4TC2QgC`AxCk=xq4TC2QgC`AxCk=xq4TC2QgC`AxCk=xq4TC2QgC`Ax zCk=xq4TC2QgC`AxCk=xq4TC2QgQpEcTz39O#&h$B!=1nRTgM&l{EgHtMyk2NemCN*tH^ zA`F%WEJSf!>MNk#fCoS01I^h21{*?Ae2{re#D^Pj3NxNx4sO7MpLsBbT>cVtVS5VD zSr(j>>_}P-FeVS$8{@7n5K&~oAFh==Q4B zVX$r>Yc`4ePW0j(fI^(;%^+DRG*L?;_ztXzKFS(T%&-!DtAr|%kn@H8=p)>@1EIVC zG-?J8dvNVd_Va76Ei)(z+a%x||%YbvYq*IXOz}atg_! zfCJSw#w5T-+7e%lk`_+QJq#3LS8CqDcBK~hcCj5vEmA0mDS#r>>a)2P7Pgt{_ypA8 zs5j{<%9(`{;7w+6rK5O@uIJx1?{I^kH&t~66TC&&o2G6HTk!;hgv@BJ>N!^&gGOQu z+Ztx-RAjdqtAw^Qif@P``O4sOUwkmykP0(l3`RzhNv4iLvdQc9XimtWEI2F4c8py0 zS{Zk~By_9_X(+qA%y9~3oxzODL5-Z5kZ+Dx<&B+(8FxG#h6@gnd|KQ1Rgx^iygdG$ zjz<&GyokXvtbQ$K1ZdB|zbwsZJfBil>2}#0fh`}^ABcKZd8^_sN}Fqpyp+y>qK)NE zk=^Db-3<04P~kHLUCBn=ELS{n1&aR(BAeXJj;>=c4F;JZZq8Nm<6Q?#2 z2j7W^_U+EXc3AvAg0&seOhivZZC1w#uyY$scnLpKVLHtM+<66Jx-3Qre_hvu#}vyH zQ7CXN`W?s~mfjX$()rgI8vh7>@cnX#YzdRDX6pAtF%!L&#(L8*g>nwCOF(%Je&&v< z`dqN)a^MdK0sdNSW@+AGC~zNo84!9z%=hqvbV5A{yUQty2bo`&5&Vf|M8L-Y(*F<9 zg4YSaf`@6rR{(lQ(jQ^U>!t&gqVy<>(n5mb`p4+`TL?;3dYn2R16V$rZre$nJwBqo z-!u3+VkBLCVC*>j%*R#3a=|W47yc^P?cfebCWu`pB&v{&{{o~;Uew0w>C&0AP5>qp zxDie+WNq1a5W$PoIjdd>ZU#ZmRl>pj0inQeLg1jtojymv>Uk46X5S?oA5$dT+V>A4 z*gy%hUlxMTDRQ!KsK~n^vgZaO=BS8J2}DT7qlFW*q2p1Cm{SZ4&KrTC=SX^Kj*8ep z5#vZPmtG77u7{FdZAdY97FY;o**^5Q&&YWiO81yFTojhE}mbK;_jl zve%Q&)UrwTz}`n^ydO|3Umz=xQtR(%3T>;9U0ZW4d}D4zmE(j5^B@X~K3xWa|F#SJ zYeV&1Z+0CF@h7xolT5HT+w`z>Mf)(z(ENtENha8Tv_N*4n`DB6W(X7vOE>i}jSGjl zNhUb#42g?|xk)BCQl-Sh+$0kmqfjEuO)|l83Z)|K&`wami%5s|7=;S(+G9zM*|aMz z;h_jQ@}T*M8U;imW_QU`&^RX-IX;iYUNc;QmXAu}+K+jFQg(3SZTRoXHW^p8$+)sj z#?5V$IjtY^xF_WWE`>3nVUK}4X0sFPnb+`iRJTR6PEuIY>EbY0Ul$ zuu((j#_R;}DLXuZv%{_oGF%yCxH8CaWsu>@Aj8!`Mo2n#kq)PUAqLGF1H+7ym_utN#+>zsM-{Uka|GfCH{_m;`u(wuEF#E!u7r?c!iP z+CfF?lv=c-LTE^$vHnv)RD|JHYyd-6hNB4fY>WAb@c5g|N5=+ITIo_eLNa!VkKc~4 zoLY=eSP3Q;lmW=&c%4GIv5V7}+0=kzmqgc>C=+9sL^m>nL&q-317nwDZ~D8Tj9rqw z%qX;lS>{o)w}ioxl|5Yj%u$F!am;e;k{oF21q?QVqU0d+fQS!gId)0r$1YipUGg9= zt=SK{n0+jGOIaS{hR;&~I`W{s&RckZh$3V5B*e*dU^F#+2f|@GBQ@eIMA88?H8qkE zsG5<5R%#Sez|Ta)?6qW-v5VWwL)$OJZf^$3%CU=EOCqEStZpA=jYno!Zr`Rtm5?&& z_R}(%g3!l7?-|DWHKrKh#_fnnVX-U2VpoR6t_+J^85X-TEOupB?8>m%m0__f z!(vy4#jXsCT^Sa;GAwpwSnSHM*p*?iE5l+}hQ+Q7i(MHOyD}_xWmxRWu-KJhu`9!3 zSBAx|42xYI7KhG4Qxr}2i$&m`UL!Hz*MDNJXz>l=LqV${yKpgsxo`Z>R@Cw3X;?T} zK%{$T%SssLI;pzpYNl@B55>8X%Hl{1pwbuh&M9$HO*2j?{ zsM3kMP4U&zYx_1}2!E)!76V9&1t!AXQB{$QO;MN(Z}bvxbbt+2L;HiOmw03rV0xui zz0%?<3K(S!nNL&!4?#fNf6}-yk_#J|j8>b8m}R7jk#PHZ(bg0%5New#+O7wwx@)GP zyPg5uZUv}s05!Xc?d3@Oi6W)LLx|Xdh>m^WxZ}>niV}WUljUuQome!c`M4>@YWE6& zW}se**v>2h!!d-u0Y7|~w95>@Q)gmua2x{NHp1YVMF`=qdq40{3%bd>nAkbyngptH zpe=fbJ-X8~bIlEcsV3$P(kz#RhXQSY>A9o>b_I#^LV+rh$WgbGb0n>Z;T#YS2C>M6 z0xgKygJNcG$k8+>=8c0f&4}6G4>a%PXexoRTFChE;((!di_RAhuZZWo(Rzbr4a3ho z7-+Wy|M%lJ1ChNj|NMsli}iW%fYoyz>`C0EfGcHkS>d+R=)JVi{!E$G%#;Fw+YhIlLJ7BJku^mU=0}v;&m~<( zWcHG6U&RuhiMY1klCMN)?;x$TDy0Iq+YA>xgx|GDf29m(=h*ax)$JBMdM$_lK9v+b zM@egF-Dd)S4_GyQE}D{aK#yj;8qXFhXw7i}L+8G#4jzwURV9PCV*_+>SI}$qI96Jd z`GD2I#|G%&8v(an-Vbt)7x*p0d@12`(Toqx_4S`1`P~*UcEr)ZBLjv?If_8evV^PR zv7-1a5US#_qWJc_pm8E-F9r2xrpo+&?Kq}I?)wh~Do})Kuc1*Zn6sfkUm*G{f|FjB zes7>ZVZ6A_D}2d@0*8^|BpUUq)~m)u+{(;*O%Y9q*h$12O_F3O2ckFoF12wgdQ-7w zB)f!yKH}Rj6c`FbhHsanz$INA*XmJ4g18whg2sTN$8*Fq&sFnxf$7Wfm}weZ4;l>T zehAfDvJdHe__RNVdIig`W0dK~UNpPc{kbKoV8#84wfb}UqTuA`70Z5F3#7O| zS1w|U`2I4cKSzhLRrLyF;K%d`8gGpCDKf>jCSU}c8~)uiK!<82~>pqUTUAz#DeATVXS(*4Bu@Lm8YH&f$#cnm|mTpu0oXZ8wcd+dIO2bu`799_ON zRD}oOiWx#-kKNDw2k@dEyPtV5W))ytK1zfAM?4Gnkwu3?MTP(`r^v{IhG&k&1GJP} zV1I>3CxoSOA+}Pff5!Ge7`O}097>VjNxcU(&mhvjTq|X5W_iAp&lX_IGKiIHkf)cM&#+$c7^7@t~!^H94Iqj?cyydi?^6XTzz zJSICafkCQIWC7JtDU$7EiUA$1P=Ui8Sczj)UQ=h;FhIFE=1PYpA#pqnv@4sz>{$o} z&Y}S)Fc`l+g??;eS{X`{YMjnsUgHd3qoi&oePve`I8ETDgdEDWD;q*8Zw3r}22qLG z43;)U>Wf3k=-Iy5WNbrD>>v-dA^y4uvK=;uNryEvP`M`Ve1Y^Q6U?kY<(YBkQG!Vh z*#ecD<5q(s0ps;bsqs4ywv%B-I#WoOzDG5{oJ|N7*j##!_ke;9scVi5f$ZBjD%sX* z@u7M&b*-k)IPZZVbzOxNn6xtsT&e3dwGEsb2;HDig|m*(jcD-Ti7IC{RHtrInQfc` z#@(z?wfH`Di$ZOkIdFRFHkxKvwzC4u3Euu7z}&(H4*(U|EF*y@2BP|R5wG0AU{?m? zZ}bPNSGOH>4o~xYN2_Sdd4NQ@0$?x&2GI7V?EzuKPr>9(=fS4PbZkQMW>6GvVjBR2 zH?b3%ExA_5JHeMFk|!x-oGpXEK3O5#IfKHcC=`%l=S@{8m|QSrj^)jyadu@0U$lb) zZ#GSc{}JYtdnZ0XT`bhz0tQjUq*{0j*Pt-5F3+E8c_+~#vwL@P@~$1kHFi4F#H9)~ajv3?%M>buKWiZ`{t%Eg-aIOD?j^xlD%f&fB(zoq zdrmdpa9(crOMw$)63$Ukh0abw>l7+-zDH5=&Q&Pml+lFs3Kcu+NV(yCNmYrOe!gmG z;M_d~aTj!n(e$j-f_xjbS!nDmIGoT#No1Mx1TDMpb&*nmgglCb1a2e43Q5y72o`&% zlECRy0Q6~onpjo6)3xdGG?!NTc1!N&_6lXJz=!nY>P?VQV4s6$d?;++?#-ovk{?fL zeptx`Gc0e{Or#n+dz^D<+tZB&iaD<`y}RcN-&oxeGD%!`I zAE;b!obkf|zN?MZ`Nr8f6ySRbUTxsekKxe3k>uGVnRhXRn~9BYhXYgI1CPSZ&WGqd zdJjG$MFPh=Y3`1X1hSo48t{-U&I~#?((Mo9m4QqMJ0~&jkv;-Noi*fpbi6?EmUoSm?AuGym_f0-w?n>+Qz%zg;u>Crec3Ed!)ysl*3(NH%zaSCQ0-eIuuJS?x`mZ5j)m!klbvre1$n6Rq= zR!lz;_lUfoODEquO;4fBdky9Nco7tBEPoJ!^i1MCzXjjD;Hw-DKN!xzSZ@Jr!q!^B z(0pj+```R7XJ`4e!vNh!3u+Om7TiyjSoh9Z@PJs*%p@uHV$(FC$}d5G7X}b)!d{8l z#GKp!wo0}lW)r(U_X4NGjQ1F(-*=P^;pTsQ4{_WpM3cN(wE2q(JcU71pjlxo!r$7>yQMwn={_0uq#BtuYV%!Sxdu zR;;fMH4<_=c&s12${_{5DhB$rVQh*>U|J)b`|#Ld2s$?L1$LxR#;VT1ML=@N!x^L@ zj8&b%+_kDV`Y}|@YiwLAGZ@H=d^k5&b%u-vM#ienP)52kR&~bz9%1=*rZa&-BuNFn z3_t|t#;Q);Ex-ggR&{1FQom!Jkl~K_J>d^`#P5mxaL2K)BDo9}lG8Yv5Emw=>%aoL zqR>1gXOIXk^wJMx{Jn5o8iTq$HL~80O zm1<;Ao7$yuX}Q8R^|V3-q9e6ip+avjG^U=>4to)LO;C_}@kFX+&)PlEvv#Ft?Mlzu zt!setFCSZT{hqbQp0%6rSrfpD9(&gAV!hct>#=9;`aNrpJ!{wRS$phR zyZN5AW8VUKuJo+kc~s=FXYHP)g3*;Dv{nUs9(&fV-?R4Evv&QSwa1>d>-VfZ_N-mM zXYH|P?fN}yk3DO5!$_20yRt-0KVLO8@c0&XFSrIdkDj&1p0&G?^$$Y?k3DO5V{a*) zWgdIh?u7$IN(HMejF+CZyF$_=J!|(=5_o(kx~KVRV!3wxp0(zZ-?P?ovr6+U*Ryt4 z{}ZAe`&&F+=~=sTX`tlCQ<@(Zz5rmkyIzXY(ul{Nwfpor0>wP`tlizO3*>n0S-a2f z7wBY{+|{p0&rGwVUr* zd+b@e@3MgnRGx1<_N?9a6hzP3vBx26q-X7JlFVbz+TBd7D?MxXf!6Sn$DXzOU^j7? z<*{e&?ieeO?XhR=J~UsTpvRuI`|$Y!g+2DH-A8T}2sa0j@6pEv!uJ}`vvwc*Gm^!g zHQImRQ!M^0NC>A5HKbTZQ|vp*19829O&X%9Q{xFCs!pPq=lrGe4@BLF(&EUC@JU18 z(I(|3gs9Cxq|FYZ`2gllVYvf<^sL>TI|T6*5E+VN`H`0b9XSYMi-6=MoW>ah2|miHnlW8Me3(l0gI`?EsDQunwTn9 zsWdU(euWx%<*>y2SfPgAnjwHbQ7G#@%(zb#!k6a;0{Tp$#!{NR&r!l)Sre}#0^S#D zXSuhQ(3c7|^>$IpS6cU*NlV~;tx!+aO79!Ct9IpRD{vb5zWV~+a%G=sdeS&Lh%=|@ z$?S@;ndLsy^c00`kE?6xsU$-?8|FUK^t9bV$xaA6LIoyVV4|g;BW3vLm$?+A4Wt)- zDs#P|1MAGGv^9&~_311h*@c~QA@q!wky7D+p^Dmg zp4iwQelh3yHcDe$@dc`gk)YMIf_&HNTJ?PJHk9GfR+i2NqHrtqHGsaYqOS5jG9NDt z>|Z~NAA0XMfwdWKo#18~T<3z{lpK&d_h(g(rZ;XEMly}OSQz(_QBt{$_SS;61z&Pz z8*Rp@1?x#>F8zbAZ;+=>`I2x_E3x$+sZaiKmn!oN_3XC|#gTZKGIRw4eg3g5s99C! zGSYo-3pZ&lQM&n{Yt7agXXmS-eFID&-(Qrk4GRHD?^5!OAg^YR8L{G3rna&pbL3tz-v-|tj<#DNctUf?r4A=#Hshu3l{>+A_@1?9;@Rsw5~uMMCpH04O^h0wa7@@6ml!L zTFZ9Yv`rm*0Cz$;D70A+Vv7KYiXxjjDhSJ1THzjm;fWxfe4#BZDfNuLR6Ow^bafW) zjlw;K+>m{d$UYfRyQkCORQOtzbtX$eGnGX-PpYi3n8#MTE5+`oL9KRIirru5WH%St zRf~PQTZrcVgvD-!j|L38N7F|^)kQtw%f#-hp-b%!2=_^#R$T$nwT{w|j*#g3t;)KU zJ~+c@F@>D5Dr-OOmK2@~okM{t^G8}YMhiW~?^YErgHByGTFUfc;86=li^U57ca}x^(PlKn zT}qiP&2wyKp0y37jNKx}Huk_diN-!7&VPZD?q#7+_^*Uzs^uARf7vpTG=d!W+J;iL zsiX;zq&D3nl4gQZIqwn93zYLM+VFP3kZTHtzi8)n(gvv{Zv|LMo&sejRIPVpb^A*| z-6o+82!gs5e&)}C8g8qo;dE>FL=M}7b6%0S{|wDCM3HirQoo$1{#2;%19fM4 zmwYNOxOV_+rTJ7!K;&etG@py01%M!X5(^>jwPKS+xyM{3mZS@O|4)%h@*1dH%L{Xg z$og5iA0l@*ZQ{sz+BL#`d7itgG!-?cz%n?at2p!oK<#=lO*I0)23VW8?vept5|#?7 zaLK8lXIIoH+!t`KZS-CbSz%+HptK_0VMQDMsdjvwx1%t~QuGlxX-8p@u5?fH<@ee15($4>5@RrYP{sT`v~n2V6%%ENY6YYsiUc<-5};V8UL*=lOf4^|E<28 zjd>e@`Wkn3^!o@u{VmOR zEW-nXhBk3d77g6B#lBqwf=uqMkgRqM2(r_;2e8^TNNP#!4BxK7LHeUVV9hIqk7hjV z93r)751?9hy8j7{7u^i)b-@wPSi>uQYW~Q_3wZQ-3~uYed8~D3B4pJD(IKt71^2t) zXD$ualcf=GHEBHh>;p;LmI(FefXBPS(v5xY0Z7xC_?ahzHB$lC)bTL_4-Dj3SbhsZ zGLS=Gi7V))&qKf@=!6W%8hiYB*XsM-AjBW}I545W`z7^Oh7%p%97J#!y?Nw&LhvmJ z`d&%ISQp6%1)|}4s~Q(&-5X>I#@t3RjI%>TlRLpt5+?4uiAI?pw$A|ON)=UPoq`Vvo;cWQi4uza`f(moDwx$%?<73&Z4h zOg2D6C*r|S0~(426tSV&M_^Y{!#${m@qHMBVu@pZ3_Zd4hOiumUbbYa72g=9(J(1? z8|qg4!W?K~+X!A1M%#c`JI+3Fd{g*RNWuI>jO)Ph%{k(5e94k|2f#>--#(0A9HvjO zmpwLDPRMIQ;H;>MlG-(Y5p)7$Nq#;b&C~)S$~VwrM}o?j3){yR<~HONO3Xd&@EP; zZn4tI)HCCrZn1gGW~>VKq9Y4$g%s8EVspKDvE@z z-)zm51YN(mR?}xZ-D35Yl&G|)TdXv-|BJo%fYYkD`p56w`?TF>_wKXhS+)SXbfkBX z-ZWxV6co`YA}k1sfPggwv7siYBv`OSqcMpsYU~ATjG{5V#uhbLV|1;z0N%>*h2c?}7Zc_CZImVhjBs;^-^O<^uo_kP){{*1G{$TA z2Z|DA^a`=e)@iD6KI7ieap}Uvgx=LqNudc`68=#`<%J%MdrxOwS?G)m!atEb8L|_h z_g@7BQ$1C9fLVO-zJRwvX#E$e!AKFefmdYp87r`l`(5yRATKZs#CBy?A5KK5v45*Y zfIc#9+x|_T(iLWY19)=U64}4WDP3&;rcdb#EvtaoLEFC#f>%!IjQyKFr7O&Og|sSr z;3siPS4f=FMfPuUN*CF`iA;#>-{h38a2N|0ozfK+vIrHwoh0^e^U;1X{tHX!MK_7e zDlF}fzURTS*uSwv_LQ!$On19Jr7JAwWosU8@suvIf74s&iBr1R{taS-B{24H%t-I> zpQZ`xQ@X+$O<14OMfPuchd*&j7umnbc~fNnCZ}|f{hOT970y~GwbG|_g|l@I`joD4 z&TG(O?I~R$aY|QMmzPTFQ@X-;PZKIUrCWqHGxl#%Cpo1ne3J-rN>^BE>qI#k*}v&t zN}SRalBaZqlg5Ka-XDrzeM(n2f(4ZRctrPyoYECG)qt`+r7Jx8SQ#OGN>_NSLE`i& zUE%Rw0_jt_$o@^YTH=&0vVYSjD2Y?L$o@@E>00^}C>1d>7?BAsGwEY`H^(kH9 zPTB^^DP7^NpRTO);go|HI!N>{k|9f9;IUE#h!nq8mL z74D}r)2DQ#9+LgZNbpxG<`9xc6Q^{m5L&Jn%sh2GAtbv}-2AC!(~>)czZOq|kHCQj)p z6Q^{QW~$Mrbd~RDD*BYJGI2^*nK-4Zd{38CpVC$SNkjUSuJV07_Vp=US>c)J#CV!r%iJ8v`Ma>Hp$h~Cb@drw0tPGO`GKE zX_H(%*_LNv@tY$<@;)xq8}Uo@$dL!R7;}U|D>++6C>ehNBjpfGufoRyBJ^*?=--Ob#b(0m_9@ZN#oMUZ ziS8Vbdf#K^JQpsU(X_^adg>3T}kxDKygdpUHoB-XC+eVQ@VzL_y?Q@cq&v6 z)ex{&M-e`q=^6sI)R};HlBR4QFzqFP(TKzG+e5uZynB5`+U>6u`opo++zZ!s@9{b8 zZy_~KCxA(9GvMB`t$3eL0kDPCr5^YDEKTP%Hn#_S<~9;=pA%W32PJ)9IY{}rENozI z+D|(6Avp)^&u;t#d8kePfMehvSim06pp)R611f{R4G;cdkCNohSBeF`?RqKn9$%IDpu<*zP(K8TeB-DsIUSxD#OmuIJAWSvtX4bRFz#@rQd#f883+Cy4ic3Y@o9BZ}T8oifDN z66aktZfiK*5kH7He^PU|hO;l?XA$Sm>h!j7$mrJ~{&nJfs;(u@TddMc{CSG?8cLjZ z5#JTftv*w&N;#ocNK2?72COMPxgV#_g&<;;=d@pyAETh%=8?Cyl!hQ zl|Dsp*DQKKJx$@>MXZjWA=P2rjUUjPWol-bhD~h+A42#5#_uKZOIpRB*a|+U6?|C| z9`4Y>c;VV^#F;F2H+;9{r`Qwk^DgV$U0AuF42d2xB>Kp3=qbaYk2J+jG8FpApzP)E zg2MNao%`N0B>Kqk>ZAQKRQhT^t>sid?Uxqoul>(5-vQdciT;7wFGFjPE{~ij4)&#- z(g#BXM~}CmGT!>h3E?p9M>h-?Umxxp;PizZ(GNSnJBt`V1H6J^)I%M`7QnY5IPOC1 zQ9>ZShAq<}9Dt=aV0m*3;s*sj!UpmQm_aWf;zNw4L2tm*a0YgH{{)Y}cHp2ba7Q3u zP#O(?GCd(YJkyy#}M@dqxV${ z869(iq`u}RT z74X~+5B`l(HyOmvf|cDRo) z_7sBq_5r%%d%M}mszf3)6;#Et(X%lX z+~bWvegSa=@Y4RZ_^rH=NwkrD6}SxNJ@~7Z9~Qg1FMfba%4z?0{MN|xIVCePm|2Q^ z_Myby+bvG)1t_|=TSI&JTQZFYO7~&}%FfHTQ(0p^Gn4j7x26${ zRLGB7$D~BgkEWMNNi;u(NN5El&5zYdd2csA?g|Ol_jdE+FPGL1L39GbYZYUw8HkYc z;jiJgQLb#CU&Aj|iR{*;DzV*qjj>p-MMFw?%IDF`@@R|oKTA%2k+V?wVKk4&s;S7m z*Vtk`?K2-^u`XU(k%zGrc_>!oHDW~`&YaJ@ID3WGio8fG@-VU@&xsXz*m5Qi#fm(f zHwNAkT9JqI$*NwBSdoXb-X<;XPla}WN>jG`Q$<>lht`U`c*+DobIAPo#&eNYHC@CVJuvwl}_NxW6@@^KNTJ) zb&~z5@S8*^Qa1@#+B%WfLTg2?d&%xk>E2E5PlYFa9W>HD_u6a3iab1m1?2tA@Dbe~ zaz8WN)Rbenvqf5whmZ0W1oo$jv?325>n3se;%wIG@u318U!*1$+WVQh)$IOMaW&If zD{{G?8QT4+BCW_nYein96?qt0kr!!29!6H=McV3y(f(BNRVICwoe^|7MHOj99!6H= zMOu-E(f!OKM^^Yedx!f|MOu-EFKF-#RiqVp7+H}QX+<8sx=JYHvxPHu2lyH#2(8GA z4?>cKuWJxiuUyn zkyhm4#=9ggRpkCuc+YPI$`olu9^U)0K)E8V$iw?WX?A@-GrWHgs-^E|l6p1SpNs^5 ztzr(<(?lCgK1~OIu3zmn-Nb;McR^e_2pSNOX7-~wg3>`60p4Au zAm_cXYoxdR7#O^;$b7Eb2qyjk5U5P~rw>4~z#oR+l#jcye4NMsdkSGEAPsKI=1xFJ z#!oL?jK@p9r4X@lE+h2EX40v24}|&qg6V=)D;c4`?~%@>sdl7u*((s}pARCbG0+y7 z@Mw_VKD`ZENkVU%3HUAi39Ds2pPHZ6+r&Cn>uvt4pr0AX%;d$Dw)8fiFRo-qv5I~k zM6#pV0{?8iO~`l2S-nkzC1`HyZ9%NJq1{hG18rSz3q)@Vwx+jzm(_p{qxCio`QDe( z+k$_l-o`fN<;cL*+Zc$Dt>|rJAzPKQ=^9FTUrBEx6Y*J+K=d}BXXfP#skixBZzEIr zH%vnJ52d#ay-ic_jNYap<$bZTMe8X!JG>HKA$0gx;nTR~fxcL)Aua(@>4k+caeLHVy5#-lnTTWF>s?yw zZGq@*{xzJPw@+_7O6U}f-e$`!y?df5x99U+4Xw8Y{=ZOf)A@bV=xrKWY4kP?>3224 zCpEOn=xrK0(dcc20=%nX^fnEiq>SFC!IPEI+cX&IZ5ljP8NE$|r>X7I+c;wQu7=Uu zD8~4%#y0e}K=d|$I$K!uHvd0DZv!KV5*6!h`=CD6{K071s@@iCU2h9SZwt1rw*{Zm z+XB(s0@2%izN?}2wxCVDEpYTU|6I&fY9IDU-J|sGrzSveQKGwHA9Pcx1bfhxxCTAjHRNjfY)6pu>Gruu1bP_?JdtmZ3X?V&N>1!hONSuu~44Q5Aq z0%IQA%v|#7AUW!gmi21hdgV1yuf`h%R9#8!eob*ARHMqB-kII*F@c2eOvTrQuOYIv{={7FGe@F4D{5QtkC|zY;M8r27ykL zbX)Y3TKFjc@epo~{-48}kkG)J-&%*$n2uvJA5tn!yiF>8SyTrhP z_ZPwQ+H-B9ZdWWjl||J1S`h9eTJLStU&mo=c7B>Axq~G+44|&TovguS041~WNPH3g z)Z;p{V+<^rJpwHJ>m?hGqqva3DPLt~wdcKpy-DBuY_~{z9fy5PYOgFzulvC%KLo%Z!C!5o$Lzv0ikZR0!^SgIcjY=Wkk$ChJu7}1~^d9vl0cr0)zaLW90`&b|r zv)JpH3g#QF=trWEn~r!a@Ja#wkeiNpEbuu2Qx*ELz>GkdkeiOt>wvki)nkDLdHSy) zuZULOz$8|ACGaHvs^y0TukM8(el!hE!M_c^debpCBaQBqox13;Kv7=f#{#wTTC> zBI?HiHzPe&LsqS1FGgVFDbL3ObuBZ4$RDzfAaX~~<4 zEO{$M^^V!$9gly&_dWATh-gzOXN_c;Z0 zh5I5~W8uEo*0|umissR)j4P1tT9Yr_BB?c)}ymEAtpIoR!E?q9{*$6Bt~We5+F<7LPJ zLZuUB4%*CYA4{Fg_AwF6_OY$g4sRdVfJVVD!LQvuW&x!?9?|{b<#GQi-1HWPTD*OH zsX%u7_&tH__VH%|?ZEbNo{y0H-`YNA?>O7X8r;t9W6lN6_OS*ri4^?9(V%AgSUOKH zLl|nekH@2x%=Ymf(qMM`c!5B6`}h=r?Dp}M0@>|jigw(;Fx$t!5vVlJS0BRr|0b-& z=lw{%n(R+Tg1=TVhidYuvwd9fry;aTF_?MkctS|FSfbeH{Huid@KwjEquW6sNwJ-X5hW?}+<6 z?-~55+k3VHxRZr@@jD6MLt6anP3wcy>v&@xc&az84^r0ppf{}#Qr7yQH?RLyR0vZj z<+Y>O_a+iUe?RK^J+z9?qF(cJ&zt%aAeh}~y#*bZE$Hp|$hlTXv7OD0V1L|ED5?2Q z6drAZ5;By%&(FW4hRtVO7w{YRgM(4*#x(bXgV8PYE<~{c`KWnLwCiA$st2OHn-`20 zKT^xPdBJ!^l@~LcyqgzHQo9Q%@8$)Q)p3%Oem5`JMY^6Bsi<8?UNZ2&e(2ziBWJ5aQq=(wik8+v{~d*b9Fcr0oI*->3+#)j>1R{B=lv z1C!qfMyq4)H!%0-0o6<1H!yE?E*8J?xrCpw3SPVKkl42r2`zp==>OOdTS;O&0l)rW z;s|&sz(#z-ZWZG$1knChU`TZ$!OHVMuY+1e5LpFN{=3ZEW5BJCrTfv`CX+UCn~mNMsKEc zyN?B$tT6b{kEQIm?&>mz;X{z5+Er7g4o}L53+0nQxicvrE|f0>*h6R^F0`)$+;by~ zxJb|+0*t1eM6xZ46jy1glR%XnKbI}E8CZ3PF2ml@Tn?+6^L1a%W87!}lyIcE0$-9u z^7A!`BTT`TOHM0@w-d(%qbXL-_ufeSIH>gDPm|Zz&lX>2qFpuuP6tIM>cm7}|3Ct6ML@qk$gKZ)d4vvU6|mQl zLva6(h&RlHWDw%fn8)`%!FV>Ju{XTj{b2cD$6xieK+uwH0Eho zX70gnKI7rH%*)C*ul(_U2GJb9dF4;ojiu@0sp@*PMn*1IWaM&1 zMlM%m~paaz#ciS7hXJMMf@HWaM&1MlM%m~paaz#ciS7gRQrdMR- zaz#ciS7hXJMMf@HWaM&1rVIruX5?~3MlM%m~paaz#ciS7h|%ioE)7R1BXG zR}Zth=iyWK^myey8#GiOGj_OQ-=!Wxo!2#QL39OcDx82YHKMSQNxVvi601&QHi8qX z7-jdlL$w}Fji=0ruu3EG7{40X9>i?lpacRIGu>Aa<2H?Tn8BJZrMy6}CK79mA_mzC zMSIR*jV9I*VAZhK)HwFqK>&;FHVu}|U#|{ZuNJIV3)idSFrtkmS~|E3GNO=T#v0M+vkr5XfY%<_pne~yOy44>HZ=MoJ9Cd()G{FWAhGG5N7 zc2}Y%qM&NDVld14ux`CS0W3YzQ={lP0nL?%Fc>ouz!hxpoPQ*KOH|0jdn;06!p^8D zntnQp#KcpX_%Yzi$G6o~=3$O1%0X@)k~4E_SVv0Jq(*brtGPJ3C{Z04wonm`lox2~ zF!UAb3rPJ#P{&^IGEXfa^fvd?JzG>@;=Zf#-!u4U5&wI{FI7*F>ItIC z601FGh(_sxRv_i$iFpk$^DVmr?^`Slin22kEmTAvq!Uar2^KKHQzTuc_9NB=MGQ6^ z$dcrEVr&6MIjt_#c#`aVA%48YXdK_$gj8mv9A=uHsZ)>Q0OkfDv|)X-Y68O5V9o*Z zO-40Drh_hMYkvd+v+6IPgs*821E5ypC&wh}=x*?qEW!;i;-fL1C)z~C{ATD9V-oW6 zf;@r9Rz#JlTWWwhT__TDmPY>#aLNUJ8qr6xUZv_ClAWiBvqXDD<^V5T zzHF|i1hg+RRvdshrdX>}(fXxu1j4=z{K{kCxrrH+sq2}+T~ZjLzNpbpU?x(SJDJJb zz^y`M?`CDIE<(*QHUt2Li%H={p}^E1Y6>?;6kZ^O1CfXneoG1`13=v#XTtXt6O7&@ zom`5+qO<)I6I}$ne3wIj^(QvJsT;|BKr&Aux*7!$AanS7bp!@@sk)M6f22rqfhNlt zK$E?aWJ@mwC}giB*+Br2>>o^aj$)GQb+W6YWM@kiqGV??*~tLO0P9$k8aDT-NOnH{ z)CEPZC2K7#&3zYh!FoxZ!+h|i^p7bRfc=Edj9{I#c$H#q9|FG~ScSb|?H$44+Jb9n@-u z?4ksPlsI-U`s$>)CQI-&#Pt41E=4sxHEscl zn5BN68M+bP9Q5^W^E}SOL;cGIOws5qJz4!wGRVkRhwy3;7a-Vh$aBLX0!yIzJcEdG|7%Da z?m+@t&#q7eShj-vu;2v@4&st>xj!9o`U|w#Jwz4c6p-C>2_jKM{Xyfs7=f8Nx75o{ z)rHR>>G24yRMqGtd|G2L5~wOQo6z?ZxN&Fto{(_%UxV)TzakBuZ1B{tNb@Q7d$p>h zXnscK2cq@SsGZS_g8DR3-`1%AAk`NIm1sjWDxcRE)E9_a^?gt+-U1(^ch@NRS_+fC zDM=Z&K!>+Gfx)8`!6$Uk1E5y7g2AIX9hjNFe({oHp;}0Y*2C&ijj_zo3?;8Y-N#h# zDiZ1lT@-Bo7hAM<6aQ&mHn-soJZ&cj680<`w~6X{_# za_37~y9W_L?9nYSx;aq>sBEA`!&1&6?W{^wuPPk+;(nMfNm1W zm>W$m<>WUZm~&$&5h2MTCv#)9oGi`F_j2Qkf>oB|0w6b@GXqT$%6-bHN_;UEJj+0Y zl)#^&Qdx3(cX-QvhF2Xz?iw$no9uDh;~=oE`34|V%jh1*(fxxTn9)6sqk9veY8l<* zIJ!RoScFD5fd$_Aa;OrYfY4PS)J{h7M2_Uz1%S`RU){Hu;a;r5<-oGuihP(fj>Ml9W-pA<1{8C>m=7u})LO zI9X$T-C&(ctV4lSJ01}&_|t_uorOD-sgcRPOg>LB>H9kQ%_jL=CchkLH7M6yj?YI4 z;9bfVHv0zzWLeh2hOYl1^0^8Wo`~`}g8589IP>`$^Epm2kI5LKsQ-s1pJSQNLMHbS z(H(!fm?tp#cO`kFx{}EcQcTJbj^yn(GH4+4P6rP{ZgjX&0w@#-hTM*5|HddF4Q3Ce zgNG2>F(F)<7Bk6MBU~nDR%=@%-`j8hNVt3q6bct+yBL4x+=1-Bq;N57#gytk4f!6e zNOQKX&QDkmS|+HYIaQhUN#>YCp>-a;8$!zT4z->?u@ZWVML$L{`5a9mr>aTzSVeS( zEz;p{N2HH+NQ1-(q93P-#+so~J+WuvmBjo5F*E8pVlGm|cu!*;Y_N_XR^^ZIQ>rc{)?`Ht zHYV!B948TDXJE)@aMdK%|4=6IzK=iO+ZcC8^K{)EOx+QG1MddHSL_Z|0itSvXyl|@ zr%RSrqZr;x5oTT}ZKjbyyj1Utht0E%QE9!23}C%5IF<_U>ld?r!4Nde$F|M7dlrf!Z!_tp^k7gGC~KZopsu6#U?7 z`t@M2VA5Iw{{8qZV`TZQ`=b0~)gJJN9pLv<2FuWS*r0)2417!-9|jS=~kzvpi|U6LYAo4YxL_QvKxthpCN;slz+6Rp>AMHP~TYb4O~B z^w${pdBoG-(ZG)ZroX3w-vmtmcnvqH$C!VUl6o<4hK{%>z^YH?_Kwn3zd^-1$;{qS zG0tuimi+>?X;Nfo)dNpX0V0J3n#!*tD&2+37B)|lB7b8eTtUbS<|>W-w+MTPV3+?` zu)7l*U#Qpx5HUAs?42>bbqV_jb~CV>#q6e!5T3-;omC%}4Da1A)r&gi!ARK!JN z#E#m|%waFZ=-gA%t_`Y+VVf1Z-9PR>CxY^M^Dk&oycVElwz8F zb-LGC(4Xvy@S>vsS{C%LELN?03-HrSne~x5ekl(+tA`m|p%f_`qp9>vTPo#3d6k+|y$d?;uwOa66@I-QxU6jY+^u2EN6)Nif<>M2BR zP{$MXa7C1j8f_EMx}gn^*aZj~eKyifT0@6u&96Jzm8lNIpE?rdTg3L6C7F^EWjENk zkip>0mLck3infc9t8Q8vet1s<>;awf5CZwD@YB;T0Czaybnpl?ik?589tS+ifLa!L z#9+brB?3x`JRSLnjGpQByp}1(PC`gJc!DYRnt_0EM@zt7nbls|8s>Bl(I(KF4ju>E zPEYR)*?!{v2vCY6&$|jKglIdj*CJvM-hdFS{0|y{Y}uiYS&YEz^+%R#$Xyy^G%&p7 z@cZ7W2StLu{P7=WsLlJ|O7X*UW0eLA1?TZEr?w`z**F0J)Q!oZbbqu}<`I zlz+jY%SjCCDo^i%IU4eFJiQC%5)JBV2~Y2W7IGCI5GnOn!dL3|!EZj7nm{$a4D)1a zB7I&t%e@7E;VJkr^JHq$Zva$qa!ijE#wf_-h^^9oC`KiPPI{tB!_WDzAd@4uO23YP zDvtN`u8K4nSa;%Zbu|_7x8krnxWOA&L$+6~ufnePlnH+0ma;%Zbu|_7x z8krnxWOA&L$+1Qz#~PU&Yh-e)c>xqEYh-e)k;$<}CdV3?9BX89tdYsFMkdD^nH+0m za;%ZbvBpe}m+piLWM+0`uV26+^0lMjWtB>O)~D2G6|=SbV}{UiB{JCd=I{erPS*bW z94m?ZoJgB#rvu_Mzc~>$)A?q2(B&qaaL7ka%h^dpkqA7IMIC&D@^HUtE7Eo1T3nX!O48fx(eaj_5Z>VWsG;7x}_sDFcv_8TFC zbjLB>OW2768KxPc(_LuNZI*OLAYFq@ahqkMeSJjdWlQHdQhh@S^O45hn$By6&hLcI zZ4sT{37sb*I=|O+VCKs5yrUG;Pt!Eosb4Vg5hYVR1J~(@iI@^txrc@L2O!oS?YT)Y zyu*CpEXAL$?=LldbSV3&qnbmCw<$$Rg=eLyxVuSew+glTt2MRTHMOgN_c;EVr1kC; zY7>Cc%pPLob@;=kYNrqt#=nm0V&-t6Ql!4G&ViP{b#sme2W*f$7J>jUhY%BwP!j8K zjoB4*hQ?egnBN7a&iZW0`c9km4B#J#Kb#_)tlO!pNe_l} zqp{vtE@HYe|y5 zSBY6bNCM#@6DeTO*`B`;ghMx+20vyg`7B(+|1-qVs5P1nKn8HZ&!R=M>%C)@A&=dq3 zujOTiy^25z*WgG5B|f;#4HSDV59fHN0F(<=ILD(OiR4-yCZ{t6)YtNGj(4|!axD*& z(>s!ZzLpn#{X<{Ni@*}t*tbWjf`1NvE6*hXeU4X!_f_!$cl=e$4+~yhfgj+Ka>2hC zK+Qur^j&t!TkzvrTy}R;z@j`r_I1_-;@As*547yQ4*;wMKfNRy(Czpgi{NGBN29-@ zxB;ziztLC6riKlm+TUO4jQDU7vI+J`V<<^0%|%qO zXPRB*cPWHtg1Lgd3|J-C+k&ZSPC+oL2tQ%kX=&EP?^1-qIe}wnup%qY#vcaeE6Ae} z`^banxg0E_53>f*mhVx3jWQn&;!L5g#ZSSXgc!6JemgX%t|Yj-A~Etd2p$3cC&ArF za0-%Wg1eF6YXCLD-AJ(HI>fFfg(*xmkl;uGS-s-{c07*Y*QN4nRnzH&_F&}Yh(sxl zLb6K6HXn;2sd_O=sZKP-4_?Q+l>)IfgPCcT2j=$smZO+nVRke=ORzt~@yYVnfDM`- z0>YQw^Vrt-479b-nJDMyltnQcO3io>aanGxrR*DYS#GSQqBrPrgMooXh*!d&0Mk@9 zZ=U`8D*~t(rYCD3277uJ8ghD)h(1Y#!M+Cq+gUhz_K$68p8aE_q#9$fl$RNTX3nK& z%tTODl*Ik%<(L;#D!7sX2og0tlZk`b^d82@axa~JN&Nu6kV7T?vhkzHuc)6PSPvEY zDp)%X6;_u=pb~(gQs7WYzlyh&(fRnc<`ZzM<-%zCtjs~^$r@f5O|Q!^A&OSyh0*kP z4XBE|Fq-~eh7Ev$Ttfy=ug~-a6)09k-rz}}YmhTFyf7Mp*&;8Drq9c;ZFu#F7e*tn z&Z}MzxGs$cqQIBMcUa8NOg>(5J;8t2Y>R8bm1!@_-e$IcB&ZCSD_+JH^Rv1JWpd{+ z9T>2@=Get8xNw`*MGlK)EJZr2D^w`n$+Q_0TUD$j<*cDx<5k~_=u|qN9mO(IPfM2> z!d{V|r-?vSfKbTNBcRJ~dgX{y)G;ug79OV=4NRXmyPR&T%zzEac~ zEm)h&Ot=)J$g!D;^x?!0Ki9)&xrkeSnMvP4NIM4C`MIg;7^p_|vJ$D6l}Np;MCxTF zQZFl!dRd9o%SxnPRwDJX5~-J!NWH8?>SZNTFDsFHS&7ukN~B&^BK5Kosh5>Vy{ts) zWhGKCE0KCxiPXzVq+V7c^|BJFmz7AptVHT%B~q_fA`M)LfLB@cD*t<^WR=hQH0pf< z|7?T@EvRd@|BnRaTKu+G58$`MI$(F8WRo8+vmT_v>@eOp&C>WKJN#szfzh)WSjJ^X z^2#|FJA3Q^Kx4)O4Gfm;g|5wx*KwJSOBQ?CN#{zk96m5N-^=bgLl8@|Ls*I_a|9|w z8AzbRMYbR)H#2UMax;l8RF%Ig{Eg~Nso6pBH~ZN=&x2e4O?GL01AbLKzgXvX1y$NDU^jdv{!^} zIi7+)^Bg9M($dY1V8Se)J1l+4$bxLgE`VOvkjf6K0`!U&VLr$)JaZBnAX9SKOeSXg z<`=o`n_ptf!WPXh(@@Im)Ds2ed+#S9o&0oWUgrFP`(h_an<1AsP{gk4B~(R)N^#!# zSkIj|A!#?fXJ4*Zd%Kz0RlPyd_{1^Myx*W*)-}ImP^%ND-G7XVL%o-sJ7U&7FW9{> zaC`6x6D%EA$2&27_K;7_o~1aLe?yqxAVNHG{{a{Ur4d!n+ez{&JWLN#Z)kE?lbj^~ zu_WLBr-0d(>c@(4ml6Ie>-Q7M?yrP}{7;1Zuao)pj0M$RW}t5qevj2^ zlK7hmKS8)z;(Ol+_&KK6@VsT~Bo6Y!_j8EQ7bQXBCeVn2QvD&Y}G$A6>Ly{y%i zjAF|bUX#}AKAvGm>LJIl5jxyQLu>Y2B<#t1gdBiN^#JVoZ75f&Z(0$3rcTnENyK=! zPx=hVx{*lY^_flje^g2xj_A(k5PDZJS~Jvp!mOI1j9(Z^`@Qb_{7@l!ABegf;Y$RFpHbx7s_pMK_MClhuM9*`D&(ey;qT&mw zG7Uu=D|_*c>2*l_BrtnCP=`DlWsUI`;XgrS8@O-_kjC|7!`w$ynPV*{jvJsEHg1Ky${m=2~g z;A9g0Kx0hpih!96;4Ly>?8AWXGnc>WfawgF!d(7-pQ1h`w|%8B}u= z&i%`b0)md|&m`kj6N1vg0Zj8I3o=}Q_@i+$OBk1yQpz{&AhXu}ND$Y3IUP>JyKef;J4ljSunb9j6L;8Guw$jko#KQIb0 zcjM6vZ+W#WEDdG8Dx!6vZ+W#WEDdG8Dx!6vZ+W#WEDdG8Dx!6vZ+W#WEDd zG8Dx!6vZ+W#WEDdG8Dx!6vZ+W#WEDdG8Dx!6vZ+W#WEDdG8Dx!)QV+=pWgFI7F*P; zP}HnY)T~g{tWeafP^(#m>(P0+%;-NLK_%6!%ouv1W>s==mKn?O2i39i2f)jWyG@`} zB{#t{<2A&?2<8{mqI3F@kP9*SR)@2hC*NtP<1T5T&!b)2$CF!07rM-?~jmHCQ zVouM2-e%@>%8e+C&aDGGfPv>CBXwc(On|eHpd-z|I~|9g&U5jz20@({!*e}7$HVgg zJY7zO2j3Iv%*Ui&Lje9|nPnx4D`PJ2b-jwk9Ks5ugN0pJds+6&AO~R;5r%dagrkAb z_0O#Sa5iQ-I1B;Z^r0X}t5V&M7J6hp2&(U7R(svELcoNqM~HU^PSWmf0F_!lHRC$E3HZoLh(k)fd#`})!`Xc$MDIDFpGhn&5r4h zph}nyfCK2lqMT~tl*6)Euv#5tpf~P$y zrjtCzda5}{GM7o-Qbb>XN}(n8Ma6Ty82sN%Gz5uCx)c0xI>6GI^!|nE4?;}oNfEe& z;8_uPGQqnd@H~KCULDPV0~E7j8zMXJG;kbFhUZ62GXG%R&_w9-XJ}f_0^!R}RomJE zwEKRTwKkxHde)*(&stZ(ljDy&Yn=wTG?zNIKUylUMxo%xu{|KT^Y0TnUPCJXtC4_C z&=BszFpfsmzzp(tGj64ZQu%`jnYZ=R`R=0unYZ;b`8qzfq=MY+>A(bCl4aj_n0Q=-uGov#`B2{T2^&MWF&6g2>EeWv(dlEWJc(hAU zcEr5nz0}!6!*fesmPC05AWf2k2^f*jISwJE15)QvR+Y`4JKsy4&!z#jvgPxR@=_P* zvgGnziN0YMX@Qdb5iH7uOyqaT=L@XmMLMoJKbe>p>$qZmGoefL;X{Y~nRS4^f3T$M zoB#VvK$q$q`s)%h%5++}oYDusWmcE*HgaiN?RF31^S>Y`PSNSS{8NN>*O1Dm!GY@Q z8uIf85ZXgSL4E+CJvEf_f=YsWQ6z^4(>q;+jpF`##X=NYO(QCdRR7Ez{w}d(>`UKA zwbwQ8j~PH_boD7qeHFU3O7{3aWwIv;F2$kar^Ktc9g{g$&YuzUFaR}dYxNIlYrIB_ z^|vSV&p{l_>^Wi7PGzBHD`q$O1Ih9}km7SHhmht^fm)d=0Ot^fKMSzkCZx*&w&irlUN{LUBqw%-; z1t5I2*$U>F+*kDbAB7Av{;~MYso(Tzm?B2onMArK1TyuTCDmeG#H^jW!>^h`xSC_gNCcr|{2OUn36D&i{S zfGIoURQToV^4a~-%q*gOT|PTgL%vrb_i%E1+(|?x%I*0Lc!|hGLvAldU{5)N8#+^U zEi=f2bSoM$x(X$uLiCs*myD*DNlCP143V(HK+=-2I%#QUzE?7?S+L6RDAh8rWIS7y zmwWR5eZa3&j13uxkQ(?a#Hy-v_7U(GxO6E!RC*G3h-g(+YOSgYw5lqdOEi|3R#l}f znm9|$CX{1sF(D{qn)|vie+Mln)^is$bwjrFPdvQu4-CxoJOEu>@(b@|lHEwvS?2@Mg>vgr1g{ z7C5SQ#UI9Pz3Rj84;A6HI_wH0(4QCifZ6?!L$q;U1Ty}7jnn=fih#|EV8@SyR0CvO z2W`^Ha{Us?I^Kxr0-~Gb#`4Q7%AXP5OlpkVh(Gmm$7kStgukYaTqpjHXuaJ3m+x{j140R*LGEP%fE zMJgX^N`5B27FxO1hLue@Wc-&rApE{)#9w zG}NXp8>Mgot9h*Cz+@lkq|Zb-9K#$Y0k@0P`Z!YhCO}=* z<5|`p0@OylClKUr>o=LhZ*>muvii464y3*cavU7j7yDPbA#WwgKLc0yvjuM4rUqC z!H>GG_G%~$&O|~P<9V;!enc30JVMgJ-9+H1yv9Ko&1M^Vksv$*gl-Lzf@U7+;NlDd zdJyY0*vmzWM2;F7pe%B(K@f&{zMv~k*+4vt|T*}5)&aoLFzFVE2`g67N&!1 z5r~5g)h(>f2VrA~BXC7SU%#uD&yPhAH)p&c9GM@LpHdBmG2uBRt^f+dGW0-_RjVME z&l6K2G*|8gIh||-q*V!GLy1i@7CVPRG(Dx7v3Y}Rz_RWh36~dDkFqJ%#1GRFQV~&+ zJPL*iia{!sx^R%XO6g?Posg_Q3Rlz4W-kegap9n3G8<;nE~Vn~*Y!jR+hYQ%uXaKk z`hgB>#e%W1#+Nc>BVOt?ZRDf%+5Q29z%5Lr^c1p?BmS4#;L&paguRmOw`>C7+r=f_wFbHoA=B1yKQ9{E|@NrHqE+i znzKDnVtb%8*>&u3(_-wpvN$n8*tNzrol@N_8Gr|D63l4*)Ig^LAp8bav#l$WDdSeE zic=G>I&L(!5(ez&8@3oX9dT+M5ER;VFeR9oKL8w7=VlydTkm3#0~%r~x`P@`0C;~~ z89S)Gi@|^ndN_R9{<2+>v0ah1J(x@OU`gBw7@=R>Ux;-EdwHCa-4|+!5RXuzQRHqz zMa*^Y=Na~Qih_}w?YH$mA3} z=r6J=Cn8qGfO*S>Uv>(zb4eRhkR5f!O5d9qm-sWO^U7S2ILbb1d}qXu!k+md&HvG1cf+A|}Na7}T~C*feGsJ;9h31dHZn zn(G<&IBW_c_G~q4_A)dveRE*-Mk2#iWK?GchTq7a2n!4yW5KA%_Av<$a6okV zKsS*)i<5CpO_*$OTdZ$c*9`Zeb_yRBH<(LuxGAqeACVmOJL^$DGOzYSexrtn3>Y12 z3u73_L>^K@FvSS@N54yIbekcRQw#qH0|u5&;Xq~3sFA>Dro4Ptw`YikPpmu%)_OSD$x z5c_Xe46M-or%BJK+Y(~MD(_}6H^m(TS?W%jonpZn3#HD%MMn{`gR#;xr+0y!wHUZDf4c`MKUW} zE<)2X)-DGOSguvVFjfgGv`ScrsK}_KO6iQsD$5smh)=HvYpftBO2SAtthMuIyS5v; zF4{P36Cc2b7W|IJ?NeaxlI_@s^?zTG1kH>-uR~NmlvVv7Wyu7xPb>FCp35M+FkOCj}H-$CI1y=&5>{^OA zYXPlXY>QJ}_H=ib{{P6SPOn%VgAj@O#pz;d5!@$mSfNAQ6_hSqwOX#CAc?4;cP(*J z0mr&RiR)JqHL8ib0|hEu+krCNZ4z~BYx;|)u*96&qb*i!V=6OplXvmHEJwATsJesH zf6^pnIUct8dbTQB;g6jUcc;zneW1CaExKB7eXPS`|HF#LMpx@?UxYa`CZDz!h<0zV z+1>PnIunb~SVUTd#>zAo%jGbtHV!9JwQ<WoOmo^}(Iii}MT(b+3zF1v{X zxkgUzV-TfT`o;hSE*6TKNRs*cTZuTpk#Z221Gyq2O)LrZ3e4HV;OOEq&{hKEhdLl) zheb>s@j7hZO^HxDEhg;yB9Rse|Y$d|m7#a?% zyHh{d!xW1LESekO?Y zURQp{XH^mZ<*iy5>%Xlges^(#Zgz$QxeJSv)+!>qyJOs+cKK^K45N%$;`Ay`8S|8# zD-1IAUo)e#o2>?nSWfWv3@eh9|Ew85$p!xpolv@Syq*1JmfXt8hszv|cK5fv<(&@h zo*E}c@ZIkv&>wKQ5*POz2B8q~Fnh`?kLF=?bGlYJ<9tZog?u(}osMV@n} z7kkjaM0TNSu z8QYIp+mAWR4<%7swVK9D(OQmV&c_YRVO17Sw7N=WD|K5lsxFb7@I*})NeG_yw5c87 z^Vqg`*;U!rneRZZ?n)+|Nq;8iUS~WM9@LWnaCPhz(Y{!j43%;23;XsduTlG9A>~*5u;hW=4*+XD}d#nKQ+2 zZ9k}W$9J=g-JJu;&hXJd`U-rZg_%er@`V`*6lQY#Pob5gRMKLsM2oRfw}teinvaJO zMon_QE4QnY&`lRBw>XTj8MB{Yi{!RZrQ7Rvj;e}Vh$DskVv4SZY0NXWT#+5ddMnx-VYTXz}DJdONKrht-NF)bRtoo{oo4eiGdcH}D8LlEZbWuJ^ z9ed1aKvCl;gz~WvD$_!!T+dsf9nP?5j5{~(v_i6LWBbNLlUnOW(`ePEr%j{P7)~@G z?CFGU4RSpHILeXCKgp)Av!V#5Na))*QY$~!j!~pKdw&PyQ`D)Bj1y3_4TMOsXrVZy@nvgYIbI!N8crb%i8^9&3Gvgs=O*71J`GUm*``wJ9 z?#>tkKUp0|+5@MwT1L1_beP4p4&c^J2)#?a&CNX+iLjs>jxgTiTX#Q z040j6I>50can_+l_DHt} zZCOWIG#a2L&EYIHn8YQA)Hnm8c3Sq2w_5jv7*WSqgShQhKesj<-4S7xPvkGkC-~V^ zoM0Q~@OE6~-GNgUHHRYzV`KPM9c&HaktZ3!s-XmtXCdx!ccENq`^KuE2EAH$NKM?1 zq*=5gr#31X3Sm16Q@9%(8mp3%U}g2izKnb99FlXILZ7*ov;b zA9^OSrx%Yi?(3N%F;U{?03@O9x9yu}lj1cn?1-w99aBkZYpjBJ*@qf!Vj;4vS$OMX zqqPdzwzhr@s~-Vn3qo2H5dce1IpQ&3erJJ@wQ zRV7n2bg0V}+hM#ZooN+P4W5(+SPs5)zY{<58DyGis7jt^^6Z}<7^dOFE%t?k2-%vY`_ao3p7RTm1j zuPR-ZpuKH0Tw9s*q3Md2B|fKPIEHE3LX118qJhv>f*lW8#WB%faxh?{Zn@Z?-tAE> zT&#tSuqjW&q5?X`dI_DwvImZd1=*43+T@-ToIvtS>m%Y=ABfovwl$XBVsU~Ub6X;c z6WY``(q$*hW!9b|66?&gw@J&n0cojmNYOOd*IGx|opOU_tSLyqu?vG%;qW=sgh86m zaWqV;cN`0o>uEt@dV@n_n3Dwk3q3*)g%R;+Wx*Va34)Hj1c|_)UN?(ARvaB?p%sBK zcHB6+#8;cPlHcnX&p%!xV&dX>)BFBrq3Dj13Oh;)b|}h@Kll4l zXAb>pcldChKjO}!m8hTJQmWHjk1LO^MW?<<6%8ER%C}v`df<+vWe$SYut>%j6m%V@ z^=+%1gV*#BqQ)K_7lDf)u}lXGV0ZBafEuo|rA%eQZZUB?uz!P07+ z(SE`*AXurFo0}yMWjx+|h=-qZsmfy7LnV`EKRwzwGOPim)MQr?#a>XPT7iyqrXqsQWJHiULL>^X0M-)H z>hxqiyZklewtkGyZ6JGQ1{V9uqSKkH9i5*-#p)fAd==^P@4Cuol?#YeSE=2WP<4CN zQ3$o7dl_qYjE0K*W_!%N{>_NOz zX=tr~IHC)Q-CL>voxKe!x<$~M<~EWVdmFZGIa-FqlSN#aFVIyWn{nljWgB5dJA|;- zT}HMw*sP8s)4}Md@mh7k7+3tW)MK^sWW}-Ri}9ubqQUsD-1~4fg#RxLSIFJycKKJi zdFu}Qj_xY7$?9wgvl%_4X)+TJO~ZreRY+r395{w@)PEx3t%=~;xE?%O+uDwy2oASa z4Tk^iom>OjJGlmQwjQzZ7;_s10S99wh{R5GzYOlDVnkRQQO&ciNi_#bViS?PJ=A4( z(QOzyoY#^^#KTcnSr0Dcjytp*piuhVF%*wkJaJz_#A^(+VghbYa7?Dl2avjM~qzMe9FtMrmqNAYPDbP%jtu1 z?23^2^mW$A=!o_~hD(_&)^Or*90Ru90i5tmT6TavJ`x_s6&D@nsv$H;brN)lbZ=*C zv<=P2CPDey>>qc-DzH6~(n~CNBTRP+Env3qxs3mp`o}i5o%oZ=2nSkgCB&wP2b5Jp z%+%v-hHwN~MWod{#={u$9TR~G9H~dp+HjdzNAfW?Df=85A;uq2Lnut}{(u$(*zVA? zu6q>@i$;6Af;_(38L=I-JARYWQFFOdX4-=Ts!X$Cd2;O1)Q?;Z8B8R*(P_Yf<>9Y9 zh<9`XbO*g-a}?{SW+=vI_-J%tjaWl;H8HzTLB(QS)l59`NnIE4CpWCi7!<}`rcOjVwAXZN9 zib!tuGQ78)fBIPcps$rs{q)9;-FW(9$>%a=VE7j2La8K=rjv3j6Epa~Xr&(UWz=;X zu(Y(Z^F7+2(rBO}W^mMFIxI@E6^$USrL8a@HgOvwok}eHGggu3lXs2*qBR9V{uI>l z!KAwi$h+mzLkI>zb{4?tmX+rTW3O0tRV0NJnt(zIWy4@-9-rrwjQjp z@Z7$+G46IN*OCpgjSX;H(}ZoD9b4>Q+BQ4tLTlS*Cl<}^oal1wwKBPB!@BCrv%?qH z((T~5-)If!)Fs~ZchTL-v$oL;3X8zcb2IExEe3mY$JO2KuZNurk~WR*cuSnV$JKUD z;MpsQdbqW1RTr8z*w#X_t-khWr(_y4SbQ{vV}H$D6Sj6axFi#_y8{^TC*tLt>BED1SSV__>Di=PqpW^ zsE}x*M#vj57EF4zSP`FAK?qT2OISLSV{jZ5O`DLy41oR+GqTG7v{7_=5VrDGpwU9! zPQIXG6Kze4K(E+20bOtVj1muEY>^tx3KTTXa)%>n>kqZq%$ca8F;haV5-)j1gVtON zCT?d(n*ctSHiogZ2I(wrc3AW#W~%=@rm)8#3EPW!P&oD%GDEdu12e|VgcT3jxR7o@Fq-8+kMG*Z+S{&4jNapz?@)}$lZuf1?(ucG)u6VfXsf+isXsf=O36`1ZP=8970$Tb5VIK#jvWCP zn?AYdZm+d5qoOsFb>4w8yDea|Y4awRW;Ul`x0Q)2fZQt+dXh1V19ONc?BgDBT7!A? z8WcXeiivkQ^|?YBOze1C;*dS=%!qxq&o4_^0BiPaloNX;mmqSAw^I^JPrKs= zEWLPj`1Nxabj|#%pP;0FlA3CA7HO@iQmk3!#5BC^ zJAz;ayUPktk40-Vif-G!-OO!>`{WR0KRI*b7a77QJ2*KG-Nv(5-%((!3}s+~2@CGP zw8n5&fobE~yWxF~Ona;af&}@_cy#2|PR~De?%=JrgV(wEZm!$MZ)|8ysbf;)G{tMC zW>+7=rS{fR;EN35+8m?SE`!4lwQx+~?A$@&LSs1g2eH5njxk(3+O4=YIFW^DjM4g7 zI4-{4(Q=N4aWJf(=Yn-;d=$)eJB-}iiymU)W{-@A=(A#2TIf?8+$hlxat%+4p4iGl zFXmZAn7JVlnqX8kWjk`uu>vK|=PfH@>B|P%Aqxv072De-Xgs|Vm}IR?C-3MQVQT}; z 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

eQ=_}> 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 Date: Tue, 30 Jul 2013 17:42:44 +0200 Subject: [PATCH 072/345] update for new contiki fetch --- platform/osd-merkur/Makefile.osd-merkur | 1 + platform/osd-merkur/contiki-conf.h | 18 +++++++++--------- platform/osd-merkur/contiki-main.c | 6 ++++-- platform/osd-merkur/params.h | 12 +++++++++--- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index fd3a75b36..e5e47d7f4 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -42,6 +42,7 @@ AVRDUDE_PORT=usb:00B000000D79 # Additional avrdude options # Verify off AVRDUDE_OPTIONS=-V +AVRDUDE_MCU=m128rfa1 #debug # CFLAGS += -save-temps diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index 6a112d39f..247a0be35 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -99,10 +99,6 @@ typedef unsigned long off_t; /* Logging adds 200 bytes to program size. RS232 output slows down webserver. */ //#define LOG_CONF_ENABLED 1 -/* Network Panid */ -#define IEEE802154_CONF_PANID 0xABCD -#define PARAMS_PANID IEEE802154_CONF_PANID - /* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */ /* It has less overhead than ENERGEST */ #define RADIOSTATS 0 @@ -150,7 +146,7 @@ typedef unsigned short uip_stats_t; #define RIMEADDR_CONF_SIZE 8 #define UIP_CONF_ICMP6 1 #define UIP_CONF_UDP 1 -#define UIP_CONF_TCP 0 +//#define UIP_CONF_TCP 1 #define NETSTACK_CONF_NETWORK sicslowpan_driver #define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 #else @@ -161,6 +157,7 @@ typedef unsigned short uip_stats_t; #define UIP_CONF_LL_802154 1 #define UIP_CONF_LLH_LEN 0 +#define UIP_CONF_BUFFER_SIZE 240 /* 10 bytes per stateful address context - see sicslowpan.c */ /* Default is 1 context with prefix aaaa::/64 */ @@ -229,7 +226,7 @@ typedef unsigned short uip_stats_t; #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_MAX_ROUTES 20 #define UIP_CONF_DS6_ADDR_NBU 3 #define UIP_CONF_DS6_MADDR_NBU 0 #define UIP_CONF_DS6_AADDR_NBU 0 @@ -249,7 +246,7 @@ typedef unsigned short uip_stats_t; /* Not tested much yet */ #define WITH_PHASE_OPTIMIZATION 0 #define CONTIKIMAC_CONF_COMPOWER 1 -#define RIMESTATS_CONF_ON 1 +#define RIMESTATS_CONF_ENABLED 1 #define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_RADIO rf230_driver #define CHANNEL_802_15_4 26 @@ -274,7 +271,7 @@ typedef unsigned short uip_stats_t; #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 4 +#define UIP_CONF_MAX_ROUTES 4 #define UIP_CONF_DS6_ADDR_NBU 3 #define UIP_CONF_DS6_MADDR_NBU 0 #define UIP_CONF_DS6_AADDR_NBU 0 @@ -310,7 +307,7 @@ typedef unsigned short uip_stats_t; #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_MAX_ROUTES 4 #define UIP_CONF_DS6_ADDR_NBU 3 #define UIP_CONF_DS6_MADDR_NBU 0 #define UIP_CONF_DS6_AADDR_NBU 0 @@ -346,6 +343,9 @@ typedef unsigned short uip_stats_t; #define CCIF #define CLIF +#ifndef CC_CONF_INLINE +#define CC_CONF_INLINE inline +#endif /* include the project config */ /* PROJECT_CONF_H might be defined in the project Makefile */ diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index d3767f341..2ec3b75e0 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -59,6 +59,7 @@ #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" @@ -327,7 +328,7 @@ uint8_t i; #ifdef RAVEN_LCD_INTERFACE process_start(&raven_lcd_process, NULL); #endif - + process_start(&sensors_process, NULL); /* Autostart other processes */ @@ -449,7 +450,7 @@ main(void) PORTE&=~(1< Date: Tue, 30 Jul 2013 17:46:44 +0200 Subject: [PATCH 073/345] update to caop 13 --- .../osd/er-rest-example-merkurboard/Makefile | 63 +- .../osd/er-rest-example-merkurboard/README.md | 166 ++++ .../er-example-client.c | 14 +- .../er-example-client.osd-merkur | Bin 410797 -> 393919 bytes .../er-example-server.c | 279 +----- .../er-example-server.osd-merkur | Bin 422173 -> 398165 bytes .../er-example-server.osd-merkur.eep | 3 - .../er-plugtest-server.c | 801 +++++++++++++++++- .../er-rest-example-merkurboard/in6addr.patch | 10 + .../project-conf.h | 76 +- .../server-client.csc | 18 +- .../server-only.csc | 28 +- .../static-routing.c | 155 ---- .../static-routing.h | 20 - 14 files changed, 1101 insertions(+), 532 deletions(-) create mode 100644 examples/osd/er-rest-example-merkurboard/README.md create mode 100644 examples/osd/er-rest-example-merkurboard/in6addr.patch delete mode 100644 examples/osd/er-rest-example-merkurboard/static-routing.c delete mode 100644 examples/osd/er-rest-example-merkurboard/static-routing.h diff --git a/examples/osd/er-rest-example-merkurboard/Makefile b/examples/osd/er-rest-example-merkurboard/Makefile index 5cca933d2..17792e430 100644 --- a/examples/osd/er-rest-example-merkurboard/Makefile +++ b/examples/osd/er-rest-example-merkurboard/Makefile @@ -1,44 +1,53 @@ -all: er-example-server er-example-client -# Use this target explicitly if requried: er-plugtest-server +all: er-example-server er-example-client +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + + +# variable for Makefile.include +WITH_UIP6=1 +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 CONTIKI=../../.. CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" -# for static routing, if enabled +# variable for Makefile.include 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 +CFLAGS += -DUIP_CONF_IPV6_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 += -DUIP_CONF_IPV6_RPL=0 CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" -CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280 +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 endif # linker optimizations SMALL=1 # REST framework, requires WITH_COAP -ifeq ($(WITH_COAP), 7) +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else ifeq ($(WITH_COAP), 7) ${info INFO: compiling with CoAP-08} CFLAGS += -DWITH_COAP=7 CFLAGS += -DREST=coap_rest_implementation @@ -84,5 +93,5 @@ connect-router: $(CONTIKI)/tools/tunslip6 connect-router-cooja: $(CONTIKI)/tools/tunslip6 sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64 -tap0up: +connect-minimal: sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/er-rest-example-merkurboard/README.md b/examples/osd/er-rest-example-merkurboard/README.md new file mode 100644 index 000000000..1aa35b091 --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/README.md @@ -0,0 +1,166 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== + +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 Plugtests. Erbium (Er) participated in Paris, France, March 2012 and + Sophia-Antipolis, France, November 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](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: + + make TARGET=cooja server-only.csc + +Open new terminal + + make connect-router-cooja + +- 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: + + make TARGET=cooja server-client.csc + +Open new terminal + + make connect-router-cooja + +- Wait until red LED toggles on mote 2 (server) +- 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) + + make TARGET=sky er-example-server.upload MOTE=2 + make TARGET=sky login MOTE=2 + +2. Press reset button, get address, abort with Ctrl+C: + Line: "Tentative link-local IPv6 address fe80:0000:0000:0000:____:____:____:____" + + cd ../ipv6/rpl-border-router/ + make TARGET=sky border-router.upload MOTE=1 + make connect-router + + For a BR tty other than USB0: + + make connect-router-port PORT=X + +3. 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 + + make TARGET=sky er-example-client.upload MOTE=3 + +MINIMAL-NET HOWTO +----------------- + +With the target minimal-net you can test your CoAP applications without +constraints, i.e., with large buffers, debug output, memory protection, etc. +The er-plugtest-server is thought for the minimal-net platform, as it requires +an 1280-byte IP buffer and 1024-byte blocks. + + make TARGET=minimal-net er-plugtest-server + sudo ./er-plugtest-server.minimal-net + +Open new terminal + + make connect-minimal + +- Start Copper and discover resources at coap://[fdfd::ff:fe00:10]:5683/ +- You can enable the ETSI Plugtest menu in Copper's preferences + +Under Windows/Cygwin, WPCAP might need a patch in +\usr\include\w32api\in6addr.h: + + 21,23c21 + < #ifdef __INSIDE_CYGWIN__ + < uint32_t __s6_addr32[4]; + < #endif + --- + > u_int __s6_addr32[4]; + 36d33 + < #ifdef __INSIDE_CYGWIN__ + 39d35 + < #endif + +DETAILS +------- + +Erbium currently implements draft 13. Central features are commented in +er-example-server.c. In general, apps/er-coap-13 supports: + +- All draft 13 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=13 uses Erbium CoAP 13 apps/er-coap-13/. The default port for + coap-13 is 5683. +- WITH_COAP=12 uses Erbium CoAP 12 apps/er-coap-12/. The default port for + coap-12 is 5683. +- 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 +----- + +- Dedicated Observe buffers +- Optimize message struct variable access (directly access struct without copying) +- Observe client +- Multiple If-Match ETags +- (Message deduplication) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.c b/examples/osd/er-rest-example-merkurboard/er-example-client.c index b5abe9f05..8a0e0d667 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-client.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-client.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Matthias Kovatsch and other contributors. + * Copyright (c) 2013, Matthias Kovatsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,11 +43,6 @@ #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" #include "dev/leds.h" @@ -57,6 +52,10 @@ #include "er-coap-06-engine.h" #elif WITH_COAP == 7 #include "er-coap-07-engine.h" +#elif WITH_COAP == 12 +#include "er-coap-12-engine.h" +#elif WITH_COAP == 13 +#include "er-coap-13-engine.h" #else #error "CoAP version defined by WITH_COAP not implemented" #endif @@ -94,7 +93,7 @@ char* service_urls[NUMBER_OF_URLS] = {".well-known/core", "/actuators/toggle", " void client_chunk_handler(void *response) { - uint8_t *chunk; + const uint8_t *chunk; int len = coap_get_payload(response, &chunk); printf("|%.*s", len, (char *)chunk); @@ -129,7 +128,6 @@ PROCESS_THREAD(coap_client_example, ev, data) PRINTF("--Toggle --\n"); leds_toggle(LEDS_RED); /* 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]); diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur index 69fceea9d87e77b77480e2859c86a95e44608ec6..54abbdc8e74b60cd790fe0abc57055fd86203874 100755 GIT binary patch literal 393919 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�@6oC z6eBhhZ-`AnDZRhmq!n`a{)o#d_hD@y#=py)m&0nCi`dMqqn-QCwb##uj~&~lLdD1v zT9ekbX6Pjr8x)f0QVztp-bc2P;*(SOI?dPVzAD{%gz&oB#Y zxF48Fw{kjTyxv^3N$LAR-vx2&g1he0%{G_EKGij#cxW-Dp4LR*XL07^mR_IAE_Irt zYhHoPo|zZX4<|bn#V)d*`{0CVLZ{fD2!)~Vui&HiId!oIPosgWNU5Vw5Pix#zmdD(>UzoGmu^}Bs|-aPC$jJGgCaMv)xNiPCi;P;jOz&Zjcq??RR z8}i^MzPdOK)1bkdD>h{Y4HjdZu+8PR8@R35aTn&v+f(HA-9CDXxXf|oxm^avFC$5q_`*_H}pMah5!&*=1d)8gj>~@kM zkZ+&p9A$eX{CQ`u+Gjhwixp=Zw8v9egW+utNT};vR~cU2ae(jMrc&(R+feJt?yxo+ zerMOAw=oM7tRdijmwAls7-qORwe&V`fU~vZnGSFF#SEk>+#Fe#7hc@)NqlL5@9w6D zAg7*IqvGFGkJ;5{78$3gO3$4!WjrFBv zo5VTn^3h9gko$|B4xJOuA3ffWRm9y|G(fxffG!F5qhEh${50_6>hD9|U+`mG58J2n z55;tjm?S_Hw;zAz@qcRf@{}yDJ3Ie6WK(83>0CLwmL$v3E{RXI_wuwy?tf(KBfB2)d;CVu zM2e+npM`1&$;s;sPSWv^3LHZ-2L9^jLigs!9(v5`TY(;s_$FS7_Ngu#VdU(LRNR+T zE94HFmm~kNn#broEs~!`OMi4S9dQTMF8L-bt+;>GM`dHHpzm~X}A;t6dbr16)Hct#VoW;phHn){q`@d)+}J-ey2<0Inq zjOMI3jJ3%Tzug5d7Mw(0F68na7vY`g3NGVty=y+d-Myerzd4V**}0$%-!+Q3;~D-s z(a1};suP$`VW%j~wKRHlt2w-ERu9R>{WoS0@jQ()>o#|M2pocBn(q4m_LMZZtJmN0koBDQ zWaj!qdMwWQjw0`l`4xgoqch)!rM=hsaA}WQ9R4H`A^6w38a=m+jq(2rzV+A)s_*Ar zo3&P$brkI;>8<3qI?{Ag3fU$oxL15%|%LgyQJLgGf3%;@9SDz@>>;6 z-i!U?e7gC!>hV9Ov=lq!H->8D;14#0>d7(DPt=E>`t=%4KptK2E?$MOb2l%?(Ye<#5}k;?+$Kop9H#Nelk3D=4GCZ2zlU2JWjJ#% zUx{!AV|UO7Ph!_-aq=B9n#P{psN?jKGTj;Q zxS%!heyutG$F2Gr&zOAcmu8aMwQ?3K^ ze~e4f$H1UkI$x1v;L{q(_Qwurw78`c;G}(#eomV+XkY|nBgv2j2ZD$r)hZdUn`2a> zl@-@-2}6l5Z1a)3$5#ImTCHy{D=zClpuzRamMdFMpzezJ+IW1WnUGf7AF`%CMlVD6 z4%Sa6x#=XqU>~H@U&uR}hm{Xx+mne$UZWUUW&5V{CW--#9i3gpgHJV!!&ctTi&7lZI|c{=@qk#A?3l1^D9r;2r0kuGd;Pt@AhJx=utkl<8Pmf zJT#6xRJ)|q`YY&%DR%kAHO0is7yu4OdV}oSnez4p$;CCsrqYZJ8{rZcWct8L8iKoL}2zj>syM1U>3efxd&s}YbTw9!> z5p{cAlqwo^Y%bzSI*Gpj#&GG~YzmqBeUgrK@;A+K5;wMp_fhNt&|EI~yifHb)3@%W zb=$8MSCGQO>#ZG_72Wqh9PvW7aTM+)6T*TQwPn1`xwX{ezI#cp+V86lRQ0U$#K4q) z0i)iB_`b)C<)4Qc)p81l-anxBMZILOi}oFm+F10=gxo}BkVlLc;O;- z$=MT-a*0*JVU5O?ey$JnI#0P2;>ajowAso--UPUcC9V9lkfY@^!JL{GsYQftf!`mT2hK#iY~REReX;<<~g;iDmGTk zt&{2K>1sd>yP=F^YBm*@Z=uyb$)=?m9Y3=pQY{drM!bO2V;0GQrdT{M^XBT4M!wX{4*uR?#-XXG887mkk+F z=b16|Y@+qzb*vYEY?Jw0^ATGy2?X z+lf8*a$?)u@BQ|uA& z)jH=-@QhE_E9J;=8TTR{n?bAINOu`lz_0QZ@VN6QG3%|@1}+$j-9no2Hn=w(yQYuk z2X1`Z#kr+aj%V9Si%R>HwJY;>oT%OB`(+!i3&hFYXU>ha%X4$*#<}QXlvHh4SqQk+ zwqQj*Ck=7)c00hu@!poNwj9v@j_^+L7*BD3fEhpCy!dSPVz{!nGaO`F7e_jJl|tOh zXg@Qc;y}xYii0gN@?gK6`cT1lVRH08Gt^mTtLHm*B!hY%YIwcv0QNST_#DjJHO}!d zW(qVv_+Y`I80+qe-Q@p;i~Duc{V>hjUByioUTon055j-m7RbH4=-_$>+}NT2#(faJ z>TM0s=R?2EO|y`C+dk+EpkL_zKo9j}m=tcQ+d|(OiGGOE_3g|{TDOwXxO0U0VJY@= zF;BFE7J}x3ZUW6K{aOnSjm8}U?BA$4+1FY{ZIkwgVU~7Ddw%N^CFg9H3q-&958i^j zYc6S(Wwx@4QfsNm>G0X;%eP$AHkBINrEygKvyv=DN!r4`!*0sv3M$KuyetptW%-(3 zc2vT9!6Qa(Xd!m?HkHcqk}FKgg>iTbhGx0n&J;EJZw?KsyCdkSJI?78Q+T}%q&g)p zet`4J)7;VKq&?;%+B}3huP(oocKGJh*-Phx&acZW%{x==tlv~-rxM4GGkVh^JC*w% zg{KPNgPHYQkv+J!oVW3cy5g#BRh1l9)e(;lmHIWU5xx2%_{GZKesArLihJvLdD{m- zl0k9DB76V3#jsrr-}iyuhc5)xF5#h=c_>uMhi_3{hf!Xao0V6Sc4+H|yu8HNM^YC& zrAOlwjd_Q)MYTJswpJ|!7X?x9iRpa;oe&+WI)XE>!+z9@(x^jq>b-bMe-W?o)Z>ud z{r_U6*xzFcIzpu4v6-R%$e(r$JkAATjkHeMu=88t$oa)Rgyv}^c*I$Y8 zAF6SL;5F-yH_`wa8_;e{%CE|BCh~a`dy=v|E857QS#^ zgBG^9!L#ck!WQjNl%sG%tw~GeYc&S}6M>U|= zbHC49iGA+i27z|YxufBd*1vd2G3BW-C%xP~8;BQZ9A-h(N@V$8F`xa(<)obZf0v7Y zR(9y2aLUQgwcX!3u4%tuZwas2nXUFOao+SYQYw0HZ`XYo;Ylz0dT-Yh%x*mUBQ$ou ze({pFr|6|3qxn0xW2X@NI=$dp?!le({k_d<7oAAYbOjaVzMV<^k0?zVUq)Ws;PAv(J5Re$G#0g=*$Xv$7O%Op z>#p!{=v>>Pa(Sl9nC=#ii`uZ#K-J$;{hyB5i+&3u?|GRHicRrFV|#6IohtaFfaZGK z&V5l^Ui>xhN6Yzqh+0#mtFMD*oT6p_`KtGQ#Q$jYCG`0Jr21dwjS}+I>7oJOU;6Hr zFPVwESb{6z6gcL-*B;~hGgf=&yz$^u|3q7PDidPbXuRtcS82&k2(cx## z{@zHta}~uj~E?w7rxS?HSBnd=P_l4PFoqJA+JnuKo-{6fy6nc=Vjx-GI5GY63T8v+HQly z@w~zLWtgK!OmR;v>jtxKb#w+0JWltpG)WC zp5{l`nQDS8)8GBWoB?);JLO5F@f;4V2(aS@57vlHoQE{DVhc_||E)#VKB3LPc3nt? zwxCnYw^~S5WbF~{srm25jj5nC@H0nyq`ei!e%f=7u=TTvuLZ!=1h+C*h8EmjAZ*&y zk)6Pu3kCI=Pvsm^(SK7rgcM!dJRIVN{#yGdQuj~rDtWsz9rRsr7$Ovs)4#Q`V3RMD@Xdi%%t0xHk2TWSO4D(NNti5~nHlruz{l|B zmp$BS?`OZH_1hb@cf#H|dz*(qvsh0E1*P%u6>_*1$RyHoavFUd$vzBgdzmBo@zds+<9RJ`w7QK|Q3w`1b34gYK`Yt~i3$Gko z`Dbq?%JzB?^O%mWT(17%-Hz{k_O9qN1y2~{LF3kympgwS)yH4n+qG}g&)2l`wesF# zk@K4N^Su}^?VEvq;;01Z7)NwV@0#}OqU&)LBq85f2i-ZT!}_Nj>mQiFE!mfyyQUrG z{%B5unXGQk`>AG9Cglz@-CH9$kVTC`hB@sp)7`>9#*n(33*CdKo+k#p zw~!Gx%h&_azRET21plsRzt^;rT-T*`47d&goRYsFXz<9vNDb^F?E!clEd;#{q?@k8 z$jRN46z9#5_d3K$vbTx<`I>f`+YHRSrkw&Jz61K&ac=s9_BmQ^wBbCD-8O zihj4Bw10|n>31x`Nz(f7SUfgvAIwMEgX{-jz88H1)ys0+1?=gj^Q~46o6Re{laqK} zp45nUo@PA@?UVV+fWmyz_PUM2eAM^vZQ8qAzE=f)$CZw1$n>v7>27Ff1MKbI@2H0^ zyTPxaH6#MHcf0l-)*kQps=vq&S}jJ~X|*VNv27i%YJs-A@FM@Bfkk+Ql}7U-tYEO( z1hvuc7RQAx?1r~;`@Fr{HcN41{MvZ5}!Kw-oX?XGXGvPn&#=IZ-nm+ zuMhXQ-dh{;+?~(Oc+ULX-nw5yUCt4ZD|E5uL`?~5#6hi1EuBNRcTL>){K>bw;STY> zamV7F(>mVgKkYtq+=CkN>XD2Sl7I3X+WE2N&pKEnI2TUrx^fhEBY23xo*OWhm?i=sGxq1Vzp>@QGB(JqAD zMk~@HJMBQEsF?ikErWBa49+2*(Y4fasPdYhq;c5==Q92_zv&~lVsC)n)skl!%yFF8A&=Y35-_e|$w z*r^XjZ}Vi>n}PJ+_a2{@{AwV7r8eTcyN_eG^()QU*thaD?nc}mdgG~Od-P6^YcU;X z`nSZ1+xw8=C{8go$3$z}4!!%Dy4}_)_BYx|C9aaqT5Q1ji?lZX8+K@{k5xRj=dqU_ z6MPiju16esy9>H`L(;*1aD1SYFgC|D#-qRg8j{hxT~*k%lpGY+Cn}!U^TbO}Y{vNv zwPneDVRIB0;|7B3LB~LcJmWa5(HdW#Z+O;blF#5vtY>JSby1x#p?4jZ@|86BZm{!; z`wC@q@e=wzyz|?_QQ`au^gWte-}gWq$&BBrg)bS4`ZRbt?Q+ryNn)trd>N#lvWOTQ z*GpNR0v^$-Ygbj>Uqx?5*46E-{j~B0=O;L2`rUm2J8k7#7;b5KRu2_?mOv$cnU{Ri z^>$d#id>>PGTBCT#HV`G0(qyS0j8dLz>OSaG^e0dRdZPFoglKh7yg&#KeQ&Ie4zSvtJ#ld^+vnbY@U$eH}MYI>m})ft8sexYtUQT z>P+HX5j)gVj>R7rciB8EEaTqqW~~F}txHdevH=H$wWWjJjw4NsGaF@1 zuGe;)q_TGSeC~HiqglcwNUWmoQjM$Q=ihH>pCLxx%jpi8DAzH|>0Avf51b8e?YYaF z=0ff9UAnz)t18nv<+Z|h_VeBKSGCyV@yF{CLbo8fcTPK>f)jyG3TV9jUVC`KyV%3s zTv6;B@233>Jaq&98LXe|w6E|m-%X>p~$!D&UO0Oa12&z&7|cYx%4T+;;C7oFjH z&J6U^5`M}eLS3&y?dPJqK)Jqj)NcC>`Tm6`FW;Q*Q=K^*V}UQEwfd5z;v8Qqa?Pi@7JD9aCr8+PS{LK$RGH)3sWRJ_ zxC`()n3-}G(mIfv^zVD^X}&i{ycrA6FLmZ3jq@)tjJQ&tqku ziIsgO&aCsDYigGB`3A|_?B|}t-xZ!)hu4e1oll%uJ@_5Q77naZIu652P;?XZJFTi% z@Sx(9z_krKl(#vmi^U!_nNVG7>!9;r+56Gnrx)HLC2lD?(Yk`ylxg3D?npw?>#>fG zLP*l1x-Z_^d&>V!ytnsxQ(|#$F}(v!{9G~4S#Y;icQ=9a-IBYha5t^^zG8au^&9N` zP>;Nz?x^ntoRiQgjs;Rit&4ZX(HUw4;W_0ol(Gm{qHiuZzIJMwW0%hHMX94(xc*gi zqmphMh?`}nP$mU^?ZZC;-PG5*&bokZ2wN+P`qH>dC*b0I*tVr|OLZBWu;yjSn7g#xflUJ;q@+0H<)^?p$@x^!o*Hs-IVjhqc;!psCiiJ z(tRwW&spI42(%5eHOphXPdpzX#bP(S1O6^_&4X?L!u4{*C(g3Ba1h6b7HS8=~nU{)Gm!~ zHd1`7PjsrZ^!)~Nvp$tSYTIk=$MdkqC-~|G_x)|KxeYURdOy4?cEyBTYK1Ws&lXLo7eV)S5E+^nScYs`InmGV+5T3<)i8eb2W zk?<>4;b$~)(}P|T>&dxo=Ol|7`J>_=rr7~IBstMHYF~#HqxUNg-fZye4S8gAHZu-4 z98Pw}yG*VG$GgsdhqZKE4WTi8PBO)dcEL@_SF{YwpB{D6*!&b$S?GUUhphh!80k*6 z&vgEbGwhgiUxoQX9=+#oGPy16Sm!_J=P!1a;|4IjN0xXz6DbW^o@yuAM)Z~b$&d{O zev!N$E9`&4E5r}k#aE>q??-s9yrv0hw%`OvJ{Q!}U2NOZ&4M z70-e{AO>~ikrQt>8c$k{x3#D~2&o1n_v1&czP8g7oon0Uz6aGvzsfFkH0SApo9;rE z$YqV*GI$1e)#Cd)a9@}1_>1~NvI9hGBq`Qb#EEW`iItGe{SD4ne{Z(8VT?s@$D_Zz ziWiuSdmpqaf)okthDa$Al#ZW%X=?PW)u_(X{@_A~PxV$ykMN~jZ#z%&9_)QBzT?g} zV)rByw}Ckyvfip`1c^udV-SC8)$z!y$@iJ#0>gu51t7l?F)OEf&5k>Lar;nVV4S70Tjw6{q8o6IF$2Y;SqQZPv*Ss zq!oGJr_z)6r!af_Lgl?jjtkn?O%j1W2wM;SM+)^UIG9~dAr+ux$Q0aTraq`-2;KO# z_uX`T3(qY`YeHHm-$~MjF;7L`3-<$-5@V=Oml9(dfThHk3ScQQ#sVxQ#zX>3 zi80$;w~{CFvTxbgg?P{ANcW!ZDCc|KgE0>ickYLAX(@@ntVKWcuaT6io>p?`@rK9G zXdj_u=seA*`X8|=_Vu_E`Ji3)+s*Ibdwf%w{Abxb*VX+K$@#Kbvz`@w8ofZ<({)no zUw4}${|wCyiTk=8xYTIxhI%IIUxVF}*LhoWsp6Q6ox%GEI3Y};QBZKzcj6p+fd#_~ zp3%nda%dBFm3NqhU+2Iu+gRN68HstI=&8xy4*2V=c=f>_Y@2J_V|&R)Z`0GPa=mNC zu5xYVu80mB@ar5X{J)|74PQNm7piY%OEYk?zXp3xnnf=wxL@vcP!15+6P->ANgG3W z4$z77iQ7r$Fv%dJem@$o6CVW+&9Ro&isRTzKGBj+Sz9~y`+n0V(nUPTKD8#_+uFQ# zq3@>ln+jDfw!zwg{0~l+x%YaLXDp*tRda5r&6w4?!+z%XT)s`B84s;(XavH@dY+Il z)z0_keQ2+`lNw1)@5A>9`qu5xjv}{@A*X-4A-CzxVzI|}c7w%-Z#Q zhsM6Y`zPr1ZOrN+nYiYu-f#Av+1SQGbMnW1U&YM&@!qetqZRO?n!Qc5o}ksESIzFD zy~4=tRlNU5ZqNE(_uu3DQk$RJTx=8I+SB``c0aYd*e=;$te$&Sr#3CE$*dv&B;A?5 zcJq0nm{~t*eck%8^*gJSc010UfAq<);$L42EB$$Y*e2(ZFyciDZ5(or&PIHyC$AiM zIua5J341Rm-s>CfX>T>;?9g*@=gjBGO?rn1`da<*FfeZBTd*H&jVYfj+xUap*tMQ} z3bM_<%g7Egr7=wZ-#QXIs$PgJju6xU}-t-9K-N ztfQ0`VSkxq<$SL}-c*HFZtdC6O|JGg74_bR*U!nu1ir)$m1KIP$*YFeIVsp3|DM05 z`e?_$`i9ID|(SUE7=xgH36oUAo*6EuI@>?Q? z!n~)O1-!1}F|%SW?v}g@U(+il`i|?|*tF37nWmL9aN19=i0L-2^G6r{t&Qt^4(~OT zJGDB`?Z9i=uv$yS>WYUeiv6FjDDfBj)AiEaMXwvKRHbisJv+1Sez>pLuTNy33%DQsn>OHTLB)XUwu*3#<}xof6hw`5 zd&~-=g5BlLmk{%JR-8CkAATM03U3R%-gv#+A=iUZsjeMSLGJRXg|4co3b&8rp{OaY z@*%12an3-;Ea$~R`OeFOf*keE-v{09a5i2W)Zfu`CD>6MZk=5ck?AIhll42wLplf6 z`*d@h+~EW|>Ek+jeUOi1C%${>%F2eApWK7mICc#0>5e~nagfPTKYWUt;#`9`S0K)i zJn4GvU~zcC96O}2SZCQIqTR7*YmfT;-Oqe%p}nJ{YIvlpYQ%b1)i7_@JVyX{Nx*q# zCw>NUW6|iWstZgV*3Ye%u84dxIZ`o$mu~0!67rsjO%jnggeAMf3X&6(tySYXG=%dtKEU3oW9p7h9uJ~&sJrl{3ku_1ihuv zo|4ST-N;Gt?XnY>!_N1=bgi9Z$+?UDzv&w7b|b%jyVA;0cJ^|AlcR5_=I9yfzSeJ!Jiag|~ID`0PvF%GAz&jvI!O*n8t zOSY}GeF6^R|JD8ND_W~^8WXfmNBC&Bwc{>->RY*4d2>_GoaPs;)MmTh+mUy@gM(&Q zBrk+^%M#smzNA&r>27Ps$%5Yttl{1@v_dCIB3dm;%P=`Qp7THFxdrG|^9Q&Wf+A*~ z4~Vp#KUtkomHq(D0?Xod#XT4Ig7dCJFFVH^THbM;f3g2||J{9QXRXA)qVMj$D4vgp-abINB50_{pniPI_X3Tx#s$Oz-JoHi1rGt~gN`XOh`*jO3w+HxX!XFGcAdQtxZZx3tgF>u{J$CAtNh^ zg}fQ-x>1jc43Wu;ouQa8XVCCQQqe@W{Sl9Cd$11JgR>EjldCr=y~ zJ8_nI_LM~v8Jm$YJ}o0*W#nuTBICNa+?=@N*$Ek$Nw7zVYf=-ECRozamL;r&!KAFD zq&ZoZ@wv&#Nm(o5J*to<*MDX_9@Y{3Q zoQ#a=mh|;;%S1XUB%aRDsIcLoBZiC!T|R7N^vHyf!;!Z1Y-BDQpPQ3|q{dH~#b!;4 z8WItZn8iPuo|~4Im6*UL%$`1uOz?0mh9u!2U-WS7A)U; zllQt-)>dR!+Tw}sx*Pas?EaoYx3k3;eF=T`^k+}^Vyhvt^I@Tzkt3~2k#Dy{m|m~;pCz>Y;roU=^W15 zvS&KK(z&%}V$a?7!ficSC-z>qFCiXjY2(r{mOhrFOG_=3GWxCaWeA9|d|w~dp6&Pj z%J*Cg#-_J$caCY_zD2*56WbS?YE8RMPnlk9@o9@UO<$R|wfxcKGF>s<+48#_B*cE}WiEJE;W#icdW@R>($LuVh6|h3Kg_W^~*>1LnJ;EMkkHMve$hKhJ zSa;^jda$0X7Yky+Y!DmFLRcsZW8o}%FtjCw+W-2lTqw)2H{EUi58JPq$d=U*LbhKiPkZf1Lk){;LA6`oGko_kg?mb?)ce zuW!Er{l070F{pn4E6THWynR5wYt}DYm?JiXFfHc#rTVMd6MmxT*SFY*0w$b@Um6Oq zGpH3mQoZpDM9fG9;g`>m_!G;9DqSoa#`Bg8V%c!!rQ5`^5y)$yVp%kbN8*u;XCt(+ zY!vcEnvZ6E6duC@6uuMj5Gt14#p6P{ST+{9D9vM#lM;_pv7=IoR^}7f7=>e5jKUKU zmQb;55}T~>-E5k|lUcmNQ`j7Zr?LeK-@_IwJdG_?cskEt(#EnGEJc~eu{4F_S*F4> zS&qW9*gA!0vyBSRQRNiN=Bl!ZW%F2(axsTj+*R!q)Z(uzX{tN4)@J1G(@cjn-R|9^)fUO2>GvGV}wi|H1 z0T&o>p#g6);35MqHsBHiE;ZoI2E4_9w;FJn0b^;a(pzD`l?Gg8z|{s^W5BfrTxY=b z2E5IHw;S+-2E4<7A2Q&b2E5CFA2#6K2E50BA2HxZ4frtwe%yecFyJQ*c&`CJWx!7x z@G}PdHv@jwfS)tq=MDG;g#%H)sa(c^2C{ef7(q=SmNgLJirlo+aV-0qh4G01xjD=t z6h6YD6#kYCRrotLT;YGQXoY`cqZGct#whG&cPV_4#VCAzi&fa9O;WgpHd*1; z+Ej(xYSR?%q|H#cvlg##7j2fp0a~KM{j?O|IY@sZ#(GkP2D}G&3>iYbfS;9#O8&V4 z|6;)XVJ+QEHsJdW_<#Z5hEGcOBMmsofXfW{H3R;_fPXdM4wxCqF#7@LA%1rSGB#Sr zUTqmm;BLN#4P$FLo`hHlwMVC$x%u5(_a4X7IsP}t@wzL9*^*F!Evb%$vbPQ}HUu~Z zqkA9SE)0~+NyWmARI#X;a{d{M`Iw(>5zFp2jQf+39-(5{6vJ3K)i6FzzLEci|3;VGMIDOZ+r&zV4nJ#j-oOUxCN6 zY88hVR;%zhRTvL zZ}d1nqufkj9vsV_Rpt}f^9tY1UQ~E8ds*Qr>=lKlvey)z#@|=$evriSC!44=K&kiX(lYOD^Z1$DH zbJ^Fxx8u8sRG3i1^f(+*ZbmZ?9>cy>=6AC16~2r8pzv7cR5*qmRd^ixN#XJAxWW_I zNrhwCX@w`TGYa3$&MG{GxfGttepC1!=2mz*yQFX&y9_+Xkj6wkjaQVLXy(CpvunzH z3X_xCSauIH=@Z;otU6jMJcG4XIG%X{=NZ0LsecPQJY3QG$b(~8du2Y3`6xV|by9c& z>!NTh>#Fc1)?MMdSr3J$uwDvJWqlOBhxq|NZ-|>ik6VCpb0_oQyI6l^9>W3^9>?xb zcsvVIcmf-wa4ZW^coGX!_-+;f{DUD5XZ1KlDK~dA559{HRpv2lxWeODw8G=rD21_p zR2Vs}@I)4)@FX@~;k#L^!jst~g{QK~3QuQK6`sMS0e3*hFWXCBU~027l$*&0JcY$8 z^Qml>!uPN_3QuG66rRBrC>+lgDLj)cR(KX$qVR0CRN=X7nZol}qQVPUvcd~lio%Q7 z3We`wX$mi9=?dS+G8JCJvJ_s*aul|(H3~0d>l9968x&4v8x>Are^qz|vjQ9EW}|uD zns{5GdB^|BbF;ZfOCHiN1Pkm8U@KeC)0NNh29CFL{1=X&<9H*-|KRw3j=$yjuN=EL zwsPF64TWjrxHrdJIgaGGisLC9@8UR-<3~BRa=e%09UMQ)@#`GF#PL5l7P|w#aqQsc zK3??Q4>=yp@jp49$nm!vFXi}0j{m~(PaM~Ae2U{2IX=tr0gf+me2U|%9JlhOZ*}H# z*FGF~ziA#j6y}uAp@XqwsN>r^Vm`**i#e^GVai)lGX&v(6LoCNtHl4CS3Ixm$cI4ey5^xTy%YFh zHjrUhlVYX@>WNq0kKv|kVZ zR%KN6f6IuM(TjQ+QC{uS%cvXj?h_s3_(PSQenP|7k1}tY@8=IiKOz+E=Labq#{H0% z%GXnlL2xBhEE}o%6q<`pRpw*Ws+acUlVSc9;%3EJ2z9vM15+KKI`gxRd+2^0Iwj)7 zPmEwxCq0sTxcRPzMFqhLoWmffMna71{nHcjD3Q@p|< z+5&|`wG@TJv~-2TwJe1rG+F0kS(Ii~=0mg+g-2amxiy{OD%v{w|KpuM5+ zB+a4l6zv0rXK0@)9H;5sFw!+s6SafVI7<^HFVcHlxu2(eUn6@|^3 zNzc((wp44aaDwJJLrKv*XDEIq+AAd$%lu6d3J2)N*k| zfoYO*f1hcQ!b?m`6izVF9yqC3mSm!HWPw+hwko{JRIYHksZ!xA({_ckO*<4`W7?ze z2As#sFbhrJD!j==Obg;$MW&+)mza(#TxvS2@K)0w3YVF#DO_%9i@ryMQ)%j?aFwZx z!nLLz3fGzZ6y9zMQ20U99ST2W8l><}Qo|J?B=ylHtNNwsp9=Cg&xgm2>PW-6OALMTA zrp{yt<-m{3zvJf5nJ7O=Iq;L^?gWWGfWDi=`<%mZd8k!!i|~z_JvMWjP8@WNQ?j#MUW% zH`@SgTua`~<0%Ss58^lmKTA4N>_{ z>z&CW7=#n8_Jg;%gE3a@0>6i&k=T;x$KOJ^p9GgwQ7Gg)heS2Hh#vshb&b69(Y zbD59AYgi|R*Rn1OuVY;m-oUym{1?_k;f<`9!Vj=M3fq{U!g(w}VLR)ua48E^cniBj z;jJu4;c_-e;VKrQa5W24xSmBQyp2UEyqyhI_(3*Y;TaaJS>{D;m{Ht78&jdot%Vc=OmI{mL)wgEP*XgNQg2gWUR_eO-o7)WBAgjoS=x1 z$lyD(I2j!}Bx=O)=+X3d#Aud~V#(qTqJ)E};L#DIBcouGmXW?ZKzbh%d}mDdkf_lV z#t=A(ico5FMC1siMzh@X?9}DNMlQV$6#);WfOV&O;5RuPX86i5?tX|0S;nYYw1$(1 z;X`?}hQmXoij@(Jj_`zHKzb~AfHy^DgdyY+hNv6-b2yr1r+_nFr8ZimHahr*d={>5 z`pih-e5BzE2vKC9Dw@a$icB<5CGhCb$f#&hMk+jyTNJc%8%e=N4I4I^C8uRr^opPt zH0*}LmL+E7E=x-ibp)lXR}yZ;bH-?|7p3$n>OR#f6r3QQs+pRekd~X6q}R@{6c(PF zEh;f;D6h~%!-j+n!yN_XE-@(??y_;2z)W$CqDqTkhX%8?ls?@M@uzPEv&7Uj+$fT} ziwuE9_R!V289Af4eFz*4ADxx7O4mjXCp`+?;}7W#ibVK#W=BhZLxSOtD!T9o?T{$a zk4DR-R)uIJr|X}kR7ZxO4h{lAg-O=qm0_l~I7-(hNRJV4}2deXX_QM2J2=6cVRvnFd=^lbD@s{heDiLBK0 z<>9N6Rwbllp&!y+N3Na_HD%VHxn7m&ah^QO(pO#Tz+hz%lsV|gT|W`w6^EJK&AYz%Dyy(iiN{ze<>I4V&@Fv~TV>Wu-d z0fv#ob+=Tnc@rV0$`th+rl>VA91>-y!_=koP?agFs;E?OI((?^6g3=%!-Z32iVhE^ zBY3EpIiit9hM-?Vo6v*x7*kKiTO7r~oR(zC_N0#*J2hnP{jZ}8}`r2L2si54D{jR_Qa zA`@t|iW1qPr;lt@3Zg`|$mBJ*6WOAtj;vJtqeQOA#5K1QnWCqStW@lyM3*L$*4$2H ziAdQh%R0SQL^aC|gSpCxTUPH3)b5)sP!2ikGn2AK%{M1ovSig6qWAHh1R1PEHXuF! z^AKanT8_ZY=H=(eiSM+w?%2`w$bAIiIyA-`9^u^ zX$%>u4~b?oI-*f`Q_A7Z!sh^Rrc=YbjiwW$$r%clqJS(>g(&Bu=+-hZ*5o9kXA?k< zW67&>MrGIAqB&EAX^xkn-pYA)x{88?(s?$bK!wB70jL-m zFD)uu#6Y*n5;nIAdQGwlT3O3}o2KcR%U5M*S`v~_&2ay3xmlki873*b#D%3kZKIx2 z^i%rWjk+wuG>-?As~oF&hnVP5HzntJ+$Az!jvAtIqK6Pc7;HrIM0QIrs>{*)De99@ z(gv@}MWo(WQ^VtJK!&0EAH7$O6k`s0FZF$o6Ojz6aR>x0P6ncSBfX=g$_5uQs?=M1 zoQTLqiO8bg^2`*`Vq^+bK^f}kx||FPdYEh)X3@(erY0wg9*xqhr(Bk`syjJZNtRWH z*&N!BsJncECtDWct5<7FCL9l=aWFwtZ*tC?J+JK0txZkLNl|v0SxFv;ydObqkVM`j zDUsw2w0V<^jNomOiVCYez18x*3L4&TVeYEFvCNX4Bs9T{Iv5#~4GPJ*;XUiJSH<2m zugP46`3%h^LDCU`Io>lXTfJhkWy-RfyfpXlALc^I=-m>~zB!dSo**(Cjq}E==Tike zrn$+MafvH$@mZQ<<)%?dr>5hYFwGxnhf(YUx8z%7nb2$&n`LZ~PKi8TOpik=V0J;4;x;rPR zJVC%FKUZ>hH2}KHuqWE1wV=_UfzXo*;D0?d0{X?UC;#c7TS2dY%9C!=lbVGeaSaXy ztp}ys8?S(df&K(~2WVR_hW%Ngh?``*K|fwMC%OUV6s{MJj0PFZqoAkwECW3QIs?b~ zpMv%RM+oJ|G*EKC29(mj6?7S>3zWDRGjGE#FY?+A7Mgi5p9)9AL8Y1oU}Bs7WjR@4 zk58}?P%0Nvc_^<(q0d4dlA;~&?nvwx(4QQ@m=8A$4X6E6`Ip zB?h6cfVRix`&m$_asW(h$5a{aAFxN!a)l!JQ%dP3by5)aF!F^GBlDBWpVTNpczSin zckWH>%?0wi!{HB6oFzol=@eQU3h_dlU@|9OC&d*->0f zjF?i+%Zb|iVg&xk0=A^%a{y_N%!v7MN ziHW_OL^q zgVJ}R?iBHh2POMNovzdAW>6~MM|Jv^ZhlDDp9IZ>y;Rh8P3*-Y`TYfV3ICa(ls+q{ z%qQ|A>ciGj>An*7?P0zXv=8VTpp)qHI8SfFdbMkslL#y+Vd}1ore@ zsZe~dKLoF$mY#&Yj1RB(&^zJg+Ze{^)K;p+04CNJiYmFhflHtpj1cy0Ht`wpaKSflIoA&Qs`y8 z$SfZ}6Fd8y`Y!A#ekGu?-cUSt=;naDy}t;3GH{RS9*!0YHwF5(pjn{A6_Ar7W&qt(G{vK+&8@;-IFoZ8B$b!q$rM4;cph`4p92uE1=RHv>cmQ z$y+jl8-Z{TI+vdpHfs^MAG|*Dj!>4+5p|#)G0MvwYAnP*Rlc7on$m^Oa67f$o65 z5}6(iN-7J#kD;ghktz|u#5%oiOrMW#=?B_JcwR~u@qkscac491CbsOj{H|Yy_+Aj`WO55i`S&a+JZ3)AVsQ@d3CehAoL3_aNS{Z7Kfj~2x59ps?s>Be1au>Jce#sn z_W|5dTuD(px)h6kdjqH!^m#fZd(xLcPxXit(f6VM9`xZ7lp$z+si=o7@zH&V;0LHw zRPIty8ci%DKz^UhsXdUQG_E{OcGZa4)JEPnO!k)|)7~D}guY-QE^rZYP1hZO8 zZu%AM&%)il8nLcOsTK2=UiHoMnexKKj^82uCBl9M%npDiQ@GnuM-k3ERLULD{{}h- zbkc)joLU1a>o<(K1RWD*=`y@I@H7wRPl2N9aMc!nLmm?KaVltlFjn(~rO>Z{c?#$k zplFgT7L5l@hP?*51~hCJV=X+viJ|mM zCCY7Nf(+*m*iV9G%)7`V(957yZ$ccxJPVY{VL#~epz9h$e+tM|EdH9<$ut?B1NO)U zwoj+;gVOh-_lbO82TJ+S{k`Vxatse=(OMZ!AK24(vp{P>NiD_C>wUqb_5-NA4M27j zXA_IGOaEln1HVxph<vg1fIjLf#tOZ{+Te zZIpLphfouF^|smKR%M{$mYz6QoW`V4&t=poSY zpi*rBp!~%u1tb!`1TOB;oRE^6zS5im&VV$C63l~zB{wGn5(Bex%-A9)iGoSlY#VvV zuw_fse2NHxo`!>FAE7NeATfRt{*cp}wU%up}fT zW#+KX$Zu|C@T*%TNh^w>?u*VEEz6VGE7H#3P1<#8ck|bhaxBZ4vp-oP-qi z+^sFsGt!fE7yptj4Bv!zgNt_UZ~k&l#>%90X1;|D3U=Lk6i+I9{uZ_{H>aQqFs;MQ zfs!Q`@;U22Sgy{6NKp3hEo>o)(?U`_h5z$^=0XHA9wXO{g_j`&X|gJ5XUGz1_p7us z6yGwE0~*D0I_g0hyy;fINUIxtMY1$B!5gaz_Z7*GNh^adI$32yJKyYwTWpmU3&Eqhm@3OD2h_-6Soz zU|i9cZEJ2O!=V0=?z)IWglnQe5XqTgr&6BxJ;@q@0wDM3yHl zc*Vqt8ElaoXvSa4(z?;c6KY@NJIVVsb9ujra8{BU6Qa85sl;g^7k`V>t<)U$md6;8 zNF|xUtI#j=7S7xrOI>7cYorX(&B)C{YHs)xA0ry@SDb`AfYG9;h5G1nFij+7nJw97 zhzw58h7@AzL*$6{pma$2VRW!;Js(@XmG%kX{{g>{CkVd8(wi3w)o8P_rT+DVl%#}} zMyqUAF748j)*5YiA};bo&@s$f^d?(mx1FAmlbXEVtoKil@f#t#T`>NEElt_5dH=z} ztS9H4Ke5Mf%kGf9>J0&tf6@LP`V$vobZ3{O6O8DdsI8Q}s-6s01eEePUWMtL$RExu z7$bSz)GH}3^=!7@Xq=0xZ6+=e_LwxLzRzQP)M$*OYW2O2$W|UY?<=VdVOH=X3%G_&5o*i*<@9w^nXHI^Lig2$V+MRqi|N+RjY6ohav z?Is7AkW-zJn3~{mvsJp`eMM6GatOa>?U7eJMN>9$uH|2<#)wkM2XG z$U>v09OW!|%np+@uzbj#7XqdRRF6uhECP8Dw{_% zDK~ZaP`h=cE=b!1t)V)`EWj zlG5_(L=8593;s0JG4m=iEJ1>Wp(Swzq`;dY%6(-v+XrKnX^}%%3!c>?2E7QUB_(Cb zk0Z*=iJytl*`y8D(dtEug1&EAXOwzzV0yc4WQCVaqC8lDGq$Lcw zV03$ze?j(7<_MO4lUXDskzsogY1Fc?Is&rbx0cohiD=(E8M#IizB*&YMkCqbFzjD= zyk_TQWb#XgDzL1iWf>VcaKqSY{7j6FRDVSt*`UJ}j%<96SXcOF2G{Gd{*O!hjO1h% z1`pg4bDcF3qi5nR;6Yq>bl#z`V02HSTO-Fg>oPOeVnI8fOf6u{;r&rg);hkv zOk&HG>(p#?(w0OT9;uxrvM?HVc>hQNWm(pmv$C^OSx*{3xG{ZJhCiX1sf^-EWl9{M zU|NzEB)~=lveuHdibe-y+LOuhnPsoS43nml-27E#zSgobiMRWYlu^z)#F3kQ zr_2%(EZpQ*Wuhm9UH6#i4-|Ap$@7;DkbXWpG@}{?!Z2%HGKLNe^e7KD!eEeNNljym zJO;cfiMbXXS(l?xoq<^jMtj~`80sBqvU8VZCF%1=Dr7eG78bmLvrlvz5d-cx3U!r2 z5k|t<129v)&#;lKx|x0i+uKYZ&E7HUF&2K=Oh1I3Y^IN5SDWc08A&8i-y0sm6Ha}B zI4iG3qz^)uh5npIRWoi1FzksN3^Fp;vq+-})!uZpF41bJb637S#@G)t7~|my{$Z?O z@ZrfN*k*z~_FTCe+OWyy_Wig$9m)^Joa1kpkLYh!$e9MY3g(XJq}>+*`~y0g6VUpG znjfmHTAt7fL5X=oT27#J9G&S3yW5X_?PisT?55(M*rE|^6@*X)|s z?5<%=YYuDJHLrQita-(}rq$o~drnnP&*1Ys@9yt;-@o4Ze7feIaL+wA-+S)4Rcn?n z$A}^>gkj9NYcMV>$Aw$uE5vcAl7bm5+2)!4&B*c;{F+UIlEGiKK&cjtIYlD!ke?Cn z0)z`dbF{EzwI|>Ld|<`e7YqU|Ue15k=4LpUDdveVp8OvR+692*Gbh2A`Dhu;6(TeE zc?mav9ac?P*L6qCQY@M@tzAnPj=cPX;Tlbh9s-A<#E%EWg3xi~cOfJr(yJkaPsbc? zs#n#IY>dB4L(EFKMiQU<~l5g?^~hN3@59=IwTozOGRRlhPC1D z&Dd}ppWTe&!g`j-E)(={GhLP)-!{X#{ImK(`yi>nG%-usYfmU$!fR{Vy#)$2wXPY# zihI2o44N;?!Pl>GU~eR^G7fzTrScsKA6 zEL`xD@-PVdpEfT_P(`q0LBH4&uvC^Or+@u>}dA zf>Qh}M&kynIT}-7x}#fQkphvswm_~vWHph$Y=NZi_?p&A>#`PTK|RwF#Z#7_TA(B{ z(WB88n{{GjEp&_Bp_w2RAuoe(#+5Q>UDtwFg7kWbqVr4+NAo&90?BAA8ep& z=Ck>QRkU|GlB*``!WJ0T!r#j=xFNr0Axtw^g_vA5D#|=tq^)OWp7Hl6|`EJciA~Z72dR?q;o8j{7FG zp<<4CyEQWCV?2Ir{&bkme;EiV!v%YceSpPsYN2eGu*X^ic+K*;vz9K!CVqj{6o9y2 zEbuu2yiCF016;Zk_Phm)*Fjs$f=>mijIKW!n8WT$V#=Po0=sW)p}9N%X9>Y(uE+&Q z&Kd%R*UZB%eKkIBw#YgT;9{(QhhTJFYuyM)#jIJpf=f#4l@dmG{o9*ii6urB-Dx@PGjOs>-Hc#XC+Q@=5pIb?A^#`5KrXmV)3aGR^hiwaQWo1 zN{WPDNf$%Qj;Jx@V%EG>LuRc+0nC?sgt|)_RYrr&42QN@fE)tL-PRolOAk5Z;593( zr^^U|G$nM$zB)`s4A%JYo|xKKF0*bZqiHfgzPkgmWQE{MokLlg2zI+LL38E61ybYB z(5-blAeXPfRKpy@>|RDx4cM6fR)%e%Gl^NWoR&%uyJiP$srL*<=T_&dY1p(*Ez6!Z z*ICH)k!4u!FlgtP#j~%a*6&)87A`$x4$!Zap_f5}l@#-R8FF@rMmUs^fWik4+V^x*AgXtO|8QYh%f3m46S1#+)4KE6?a%?G<%7$k6Zri;C0 zWh~)TGHWsRR9njkm={IOLzatW=YcZP@;NKf_fZJazJ4g9$l4Y771r5k$6;M)egpQ0 zb|A2lJ}<*+nFZ{<&>Kr~g0iHwCB!K+MVwoP70m+)kF>^bg`hW1NJ?4q%guW zWoXI2X8xyEXw-B)dUz3Pa9BbtuINQphZHHp1&|EZz`BwKbtQ41=RSz%2E=S8+pp8K46^1~x78$~)<7vY-Zmd6| z_CF5V_VRfci+LB0!}tk7GZy5ka2S2IC01D}@>-Ed|Gq~tVR9a)$~v*iv?yaN-=WwV zkEz~T_w#rzyZFk()=}8#5sl>6eugab_Hd}tI-agtscx;POZUM|2*IQ(ysK6$#i?^J zj{#?m!_T(pMR*C);oC1MlJkh>Obw9yI@8bKv7X}JZ)I+vhv6VJ7(eK3a~B=FYRxj4 zJsDLd!T|Stz=C7~%qIb65xz6J%1Q@)jnGnSL;#5?^s)d5XS(j_JGxxJjta+aSUd5^ zP0A%O?)@o%r3HT<0Qh7pU(&-uw)j3{Mwq>Vi=Ww6rvPT@_YcApPPj3Ev5r`79S{Ii zMi580Laee*4=}n8Ak!-A(g3H&fVTwD(xq(V7GHQwWn@Ro?0gg;r~z!S%Vw{z{#Ay; zXJ}^y?LHfH*HvLgI)?~q&c8|csW0Yz2(k9W7A~g>Qas1CKw%WO&ToMUyVo3G)k$+1 zDt|MeVBgp*>eg1sRp`_6*1$XBgVqF|u2?f6r({+fH~>8AMrK=d={yx}{R1>Yv6%&y zHgT1(9z(M&$Iiu6vU6V#PK`Lbf(&oSV`vKnp0nw1MN`RRIsy3wSe&Z9@bPvpfQJ&p$9 z@#A8Ar+7AZg3&+*r&@f@7n_NNRzn%C#2Bi;vqm%(Yg0+36|-@Yx00tXXP_jQk6=1S z(b5+8T7Z?9iYp~G1p_%_l+moS0-V|+O9~u?AzOvR{Hd$#56Vzs&ZHQu?zE{xt~enC zdK?d zox29-6{x1!%W+otR6yYnEM@*}fMBBtQrjEuEmAh*DHX%T0aiA2 zf&=DKyxnsx6~)n!HG{q@QeQY8VFm7t<`Tx3wOYK8_6I5~+mOUICf>v9f%`mI+MpEY z%|2unHpSt@a9DuSc>?0lN>^J6lpz^|*<&q1oMHvw7to#K7PZnzvoq7jA}wHG%4$5P z&+hLq;19!8E13vJ29&`e)^!0=>`AkjfGiWNzqY`K>x_U%*&Xmx|J{}7#j}E*ylmwn zG|sI2 zZAqKIY{lxsMVBi@7y9^~gmLN$bo$a@vv~OeJsE@()yl)e(M{4jfYn;0mo2l^rR!YYmLlrCjSbmRC&mC%gjzC}wa zhsKcl+a2P{sxXYO%9;sHLP$*g8`TQ!p4cbh9?F>z2OoOLX{Wo7k}k zN1nsOJ_3GVmTeM8<6qQvXg`X?Spi4wMS>k?rQ1=5bF>|eAIyIVXPf+svmZG&qeA9J z{EOL$aWVoC8!{qeiHpOJ*>(osh+tyrT+119DnfQG$e$w+#e3usyoSM1$K#pIbcdUH zbfn<{erjWX;w6kIsXN;P9A|jz-LAFK-vBn6Spr5~Bov(}9~!W0W2qlHfjG%X{%R8` zG^b`T3AGmsoAg#)Ncra8oACIh6IR)@FAsn|Nln|S|2+zoVAjPJT=*VmK(~Mhv0ARC7 zG~(MheqhyZuAxhOj_0XnAywpGoB4+UqOLvg%k>;iBDJ23U)#eF;cNWzB$~y{U_08W zKgAFC!^{w(S$g`1BvyiwdzI(|Ss7d;wts@)LHB{pKE-t4%F)c30Gw6HDxy2S8Zzk2G1usSNM^2jZQ`QTZmTaxF0Q%NJ1*s~9K8 z{&%Y=gmHZUI2_&;vnk(;p)vX5B?IX~OfTej^DU~{x> zUyoo++V+Wz`?GEPK~Um$B5d6aP&65|ZiW#l8MN*J0@|1lrFG8}Fq+cVy;Ty3C0n-c zWUJQg+7E-zl@Cv(M^k|I&k94}K>RZDpyHX^@c=I+yY@uTvR|Uuqp>MG?up^8$h!mz zdQ3Dnl{rE0vm*4tjP1qR_3gMc^4}p`bpam6s+MjNZ+r$&4&5X^QA6k^@kwt1sojJj zi4k;@&q6rpCh^IXDcvMKg+%FGZP`+oPTWe+>#$vXRD>NR`DFySY0eKIu|%5^0C#oR z|Lj^X8ATvIJpe0Ht5+|z;xiofIJ>qw*$;x^dpKuE+#Je+-ADSPYcoODrdZcz5xO>G zxi&AIw29mVOyUI&n6Ay*bL|_2|27I>;;ubMp473eot*n3{^!R-xdg$b-w=Ef4=aB< zlrVX|GRMx}h6Wz7A_WkVhcXIykGdZ@%zwk~k>5FHS@+|LE95+2<$3o1pp`!YQ6IAM z4}kWtm46>llga-XHMQR4=c7$+F!_@q;y9CE0_5=~e-KjnmB~+s$c-ld2L7F5@=u^A zoNDqkET3-jK3INZ@(DnfnEWM3=u(rv5TY+L`QIY-%T4}|_;-cL{{t!9hlDUR-*58O zfF3Y;?iwC6R^$o@Od45YBOx?T_hXaicN!vj5~6w9KAk+jx*f~^08Bi8Bcdnr zmmouK{vjlq&OZk6nfwwYna$6F1TVi5&+7bNpnTgrzv$OK|2yz>$X^P4Et9*AHk$k_ zM6vS2A;jc)?qTQS5F5$wkA!l0AK^CnYJ}V7UqmMJ`7AVUm!AlMh5U<%+atd}l&R03 z3{21b!;sJ`zX-7!@(l?0&Uc0Kee!ca?VIlce82o_P@{i70{nnHKT!ln-jL=&#x=ZLbci=H&BiB6e-WTLaybFDT84@n%x;#VN=X zW<2k3$WOjZfp%@eTf)+QmD#pyE4+^pKl!&g!kP6(K)2*;=ZVZJuQv)Q`MM4}Id3OQ zc|%iZ>wSRu$v5M|nfG>M>ThYh8gD%EmV8^|b@8f^Zt@+ab@d)Y`6ah0tc{3rje zdiL25SAO#%uJhB<(XTrK#SnETzwt zbB0G3N&#yJ!{@!$^{!fi}fOih1e50Jd^!6t0 zTZLwO-%`qVn)mr$ikf||d0*&tWV|0#=3?*Z5rBSFnM=I52k0klJxg_f9EQj;Kt`>? zcdRC3o`c5iJ0fi68_F@W!PDW^JrJ75q04Ij6!L5KHB`r3NFtZAW*-Xf(6OFD>Q=<9 z7R$^eS8=gr_M0Ga_fLYpi=j&9;gaAfggYKx2jo-+txio;V6CAbu4?W>fn(Wm0CHEu zFVdL9sLDqCY9z(O$aoDwb`f(Jb$JqC=Qv8vtRs~!!(G-{=4c9uE!koY-ePLmW!per z56V1(-|6hSH&9kL5*mPsA<_*-a zg8L8@-L_CSPI@&`rd#HKnTF6h6w+B#^iu$E_u-vB)7eN-F$umd4axK{mqRskg>5E) zjYz&f4Fp~=te-Xpw9D-WLCQl^PYwfssZeae7PAn(7d_1WER#RjhFC_HS!8p~?2>?6 zM8G%*=+%H+nOkkrV#~LfLm(i%007nuP@{)oX3V{+4CV0UZBT}H6;+vgMAl3y!;!|^ zQ?87PzpsV(9)`v!^O(w{JiY)9GFc!h^HGt>NwS`O);wzS^5zNnsldlu39N;A$^2CX zBG2*%ft-C*;BzAI_f%2@K4(t>Q&3_m^Ldr2?FJd=Hp;xCGN~ZnP6wI1QmHcE7MYKN zt$`P{%-i-|2)~J+3f$I8$q6Vj^Qj7?FuvXn0(lQp1#TCCd9=9RB5=Db7Si*!nE6|b zR<26^td(T$Ma_3RWSZ{y9$RD^}v;*btBix@VcLB1@kR7;rkyN<{3wHv!?#Zda3>HmW)cjCUHf;SpOc9Ei zU3QSk>!&JnipZ>i%m!RSw9J$U4K>36YjI9(C9pqx`fL@*%=1Ns$P%xts=$LpAQxcu zlgN9J2;|hF0_U_6NH+zuP6bjJ-*^atyymI`*NVX3P~dgsT`K}_F9|%nmB8;Hz?`81 zDeM<2kT+vh;ARo{CIx2LI5vyGZvbnBpD6-skU3Q09T?!uH9HjGXC-M@i?p4=t?FGZ z(hdTw`Mp-8HP^^^q+_1kK_Ktks(Md|z!NA?)O$h%{-z}Gsa67cuxj4hK_D;cs=#+e z;G-1C)rNUDBAvS=@cmW-=~!z%SAi@%zFQJC!rQ$n@G}v}%IYZsKa0#kS^Z4s{-TxS z(>MVBppq%|2bH`Wc5;>cy-4l{bOU@4Ec3mn$~{5PF;xBg2*>c44kPtkX#mCOE5K5J zF*~P5IR~)T=D$P-dS753;7HlSyufamj>?cg73QH8AcMS!tZKN?2f_FaNWDc3H@ZUx z>qQ?o%2h`V;;S+)cVpHVz?yhPlw-#Nz({s2)h%kWK*%4GU5b^CCfh-hJq_HN`wmf7 z)NcW6?mI+x$bE+>bN?h*H1`_iYrv{NM^T^;3I+=Q+Rs|YFfqlTO`EK~H z^4%c$J_d}M?*_>?T_!ZyK9cN1n(Rl+_ZUr!r-gQ* zu_CRx3;i7xW2UG;3cFPW@`ASt+*t&Uf`FdVMt0sYA1Zm5R+8_cs(Y(sO5LWCc}rX+ z?XJs@W^b$%3y#P=Wij61WS8z_}`r!uXz5$*}J^ID~GI!Bb3wO3I--`$Edctu^)cu9KILsVKul$Ro0f&UG#*48T# zw$f^-ibj&;`s0Efh7(?CS83;qv<7giwDU#UM8GQTLXmcqN*j-<%^auFs2AUH0^N8A zUZrgiX7i1Gsz2_|LH zt>*^QjES&8bpWiXjg!;{0fzLW*|~~4ln37spykm)q)($XS%7sA={$d}=Qi7P5a~yi zq<0kQTU9!J{b3%Jp_h8kQQddN>7PoEiuCJB(xW2%p_25dNdH?&dQ7DAqsdmM1r#RpSOfxIPEb1GH7v4^3DP;j zTtkD|AaoV(gsvm)7yy0wK|Y%B>y}vN_Y;uXZ-MQ6Hs#$&@lOKmcpn(dO$0kT4BpJ> zF%09#!u1efwoCC)eZD>!S>Rh3RLM`+bH{*JwfclnHxi_s)d=+lf=7-b$fex706YKK z5#Xm17o%1kuiKf=2yO(}`2cG1Il+qvZsd6K1ttFpAezK_WE-U_T2Uju%o$qo1rSB4v6Q znxul^LieLR)UGhEH_cLDn1TqgIa|!!Ek;NDo~C@i+5aY{_o87^pK5Z0^5~-T;1y`(a9z1e>l;#roB-%b@DJI7KoN~Uh)&QG4SANuo|gAc&ek zo9c(3S!SQoGHOVXsI|o)>Uab!YbYz{1w{LiQP_qXaU7zzN@qNkuyod~QVv%TmRU&YcLRoGzKOx) zjG@#fl{}x4MN+j$`a3yC%x1qGdn8hFB5ylQ)(Eay%{UHaPGlPpBbSh40>=z>k#Z(8zUybMsucs z(KHf@O*DT75{DVCoHdq??_C~n#zK(C_uqlfvFU7B!8~Qe=Yd>Vc~IZ%c09mDk&e9* zH1A(~A*YFb?nl_?M4#CA1`wf}e-(OvVx~g4o%1qUMvg6fkK%IflW!OxtHgYEf732#^OK|NYk4jwIy~qq@grjE(}v!1Ljzo2ec(H z?mmw>DRowi`NRR2dmTp45}3DA13*rsa`Ahhg}aoJ+Qc;-%l$hvOtlR_+vSv=$_HT7 zy%B7wb^*wGdhFePaL-UE z=D$JCGifqK>H4owg)L(RO8Kvmb1TK$wP}9|rf>HwDq+`Ve6E_^v(ZNYc~*qGL3h`f z!_4sRcBScpXKTG9Cz5SOZ($oKY!k_LMJZ>ILs)iu%n**f@zg>%yaiXbRrz_ZquzVC zGxhDcxxk7bT1*^)dMLG@cq3>WG z_jxStuGAW|d>)Uxs}!<*9+SJP6^i;iE_c@`6!Up(?#hWBTMUoS-L*HEgM?P;U&?s*uNSD=pT@!Ip$i0Rqg?}T*S$CXy_k7Nx#ahGs* z@Yk}`o@V*jwH^H`*3xrd2vp-AN|`Tc9=iBF3B9a&=<1JRd;XiotMk8Odw!z|Q@>r? z!;dnzZ)?1sKGSvoK2T^4{zjJe`wI2(52VbGW(cjHzmV}h(a~ste=%vF=}0xm-yOB! zeyOw}{#fSypLh`oa25JMnwfOPEJN({`J zGLQn&OG4rp%eo2&<}XSSST7oZtp^d3KxAZ{&I$}8bQLT|`WYcM%Mc>$jenRM@T{03 z2;PBFb&o_yg);;$&ft!{pv1s(RR&T(+EgO3a+SnMGkdDiFD=nuEYTT4RI)kt10@Ew zfKdH+N?6vfioFuCLb2bL=&V(xvjD?l=Ec@Z!#d7>g2tBROc=@@4s1t`?Hv9)a_qVk z{kDUho=amzQC+D3F8wvZC(){{qPS8Ox-Dypwl@qMV)WQyu*Rh*C7-(ZUBYgJTV ztKvZzEq-N+(;;%BDXOnkQGKn7>T6Y0U#p_}S`{xr`CMv>>T6Y0U#p_}S{2z0?=!{u zDAxN;QGKn7<-S(wisQpP!wOQqWD@B#n-ARzE(x?wJM6QRgr^wpQ89$6~))8D85!j z4%!2XWxiJFCz<_D%hS)ikDB$lsZKx3bpw|L^tDQdzE(0oq@QOSg0GcNCyR9GYn7x? zD;@e;`Si6)zf6G~sObTbewEpVua!?DNvbsLH3WRr+;Za^-v) zfzzR{l}{6K`c1Ch?b^IgU#s+68n4EuuT}bOjn~DeuT}aTrFHe`Yn9%nv^t-@R_V~! z%BQbY`d#Jh>C@LL{ho3*`1G|(zpu1DK7FmyA1JM#&%?@e=xgQE6rK)!t^A(U>|@n) zuuosBbm(j4k79bC_>zY)K7Fmyp|6!sU#s+|8n4l(uT}c9Wl}CvefnCZLtiVOzE|8y^tJNoYnA>+Ie+Q%bSwR>LbLsEDdoFU zCH46}eXY{pYu*?7^tDQdzE(bct_R4W=u@_4Z)otfz2UlP0W%%neySj*?;J~LVOyS9HMOiP)a$VJ6p1y5#Y z+Ul?u_CJLJnJHS@2_(ss9GgWIX+T1mY1|~&7}~*2A7f~fISD^leE9a@&di(XZ8$f_ z7Hu($;hxmRoCFGd{|zTvGV=q5h`_fB*NTJGK*Ri3bj72Kxe>{jN?Ys#K*%4sX98VI z;d;WSP*he<#P1+{ufojhTZDgy8U(!q;C9_0 zGDywp48FP^fJ~JbUQl|$Uk^DF&&j^hK{DL5pyEv%oxK$^1*K)$mhqqj??J)TKTG{~ zlRcq{px%34f`odp$jvGid9Qb=;A&QXuP;G2@DD(+6Qdo*Y1Qg^H)BXCf58^ii_OP; z$>Otm@JT^3>34s$)`2Ej9z-NVYdmHwh zAMv}NF?i0fH_-jrW=^z*7Xi67V27Cfh~er}}^{K9E!8GEVotfNy3} z)1>BB0UjjRNOqMbyali|*ksw|dlDAgP<_C?9a7=?DYfEk{`QNfA4>oi$I z{sFPEEn;9aX2?;}@~A7VShnjy72xxwZQeB{O6Rl1>jXTo@uA4ZrE3l1XER(Tm7Tq+JrxzK=9n zLwOU_j56FE0_8xGbtDAX)^WfDmf>@eOu1#4-jA=KVgCD;;s5TImY8@Wqc=dgauaWK zEHQG6B{uka1bK@kHsnOIp$f#r>ol8qoly^h65e8QMw$k62D!!JjFK=XH*S5MafU~v zv^XJx^o+B? z;@TJB*~VOtXNFwzz`cpgQtqYx%eyJrV2!gd0&Q4W6@wW>(aF_>(i+FpH4cjm+ITJ2 zIG(O?m|I>{XtBoebd7Ve&^md##?f4K_FAlQJYC}~lhnH*L)2T=I7b5|C0|-IMO6AhhwxUm<>c-YyOHD#PP$%z!PjQN7~n5(6e4e1$4j(^>xHY`T^tGOrvP} za>TgEFxo*H)rul2crPUHNb(lVq2!ut$iXiqBLTk3pImduwF+DvF97j<{P@y>PIDOH z7&g4~DWQghO2q6W)AxxioCiVZB=gWo4}wKj>Q-m-9`o}@rowMABc;udN8RsYN>!*Y z*z8&CtXJ#CchHB<=d;%CJ@+25)|00NSNX?0~jRNsH5fhj{C-Nt7 zbloI~{Sk#=ns4l@olM*$7M2rv6xeQ@A)GBTIvHcF!kl1RM`Bb8hTpSrQdd6w(pP-% z8ZiCamt_Ap59WdsxtoyJV7QJ?hoT8*_qTyca5QuFSVwBDmEdUR?5R-HlAE`&v5d;K zyPX&uLt&&at|x{tGGges9&aAk!#V8uC~1!B@p0xvka%tb zb}Qa!ZV@nAfrR1{%|AqZEX@T^yfmt(PXSX2)|{HvshHL47?R z4=_=rV{Ziz|JPoqwB$bTAS?xt-1kaJPYWP9Qz6@m%W$5WmPbt{7%8>uoruGdVxCgd zNx&$S!fS|UFspiWN4eoOMqae7;(!!hV{{wkBo4#7J5fUz-rY%a!J_wV7?K#lHO5sT z91QR7WXhD`-JL>WCA%^Y(SmdYzB+{CR+~@V*W^U5Ef4D4*Ml$=cth4VR^>7X;7UgX zj8uUihVXV=3q+4|-!zoz$^o5wYV0Uz33tQhkLt4Nv$bR{rvxpF|~=Hh>X7HJ;PxupZTG!N+9 z(g9tX2Xt=ffG*7gI=B3Q?k^CLVG%m^F-T3O$@HeTfrTX(=(tRi6$kakfRo_Pzhbs@ zCfp(CG+8l6Av?iovSRKzh{7hpX|iG-1!$vS3hnI7r~@FTAjf_MIrb~av0p)s{R-vB zewj%F!79gonW=|zw6oXZ+1~sbPmhB2LA^W8M?FCXG4dAF$Xie&Z$XW`1vT;()W};< zBX2>CyahG#7SzaFP$O?ajl2al@)p#{TTml!L5;ixHS!kJ$Xie&Z$XW`1vT;()W};< zBX2>CyahG#76KzLw7+x|b`k}#>=wkbTZo_!L?G7V%aT-Ww#)f-GW$l3u4(Vh-J4RmfeC_b_-(JEr?~eP-fZ9 zKFRENSe|{R9_G;mx5wFM*|pdMXxYt%mfZx8ezMQA;lQ$+ScCuB(6XE2+AbSfb`!Mh zW?!a2jA02{cC)WC+gO|?XxYt%mfZv`yV=mPo1kSk`?~h3T!NO}Y-rg{d;p!YZ*sVY zWj8^~ZuYHH(R}UNnglJo*|#-bmjo@l+0e3^cnp(LcAL`b6141QL(6W0mfdV<*-g;0 zn|)6?8xpkaW<$$vf|lLv2TJRgpk+53T6PnCn4{3Lo1kSk`?2adI6=#9Hni*}XxYtv zLVpw7qD|1Un++|y30iiupK83u1TDMS(6XDLWjFgdM^d|XMuL{zY-rg{(6XBiExQR? zcC(>nH$ls8Hni*}XxYt%mfZv`yV=mPE8}}MwCpCnrIgUJo1kSk`@QCUVS<+3Y-rg{ z(6XBiExQR?cC$Ze>j`er4oB6<^cuDDyhWQe=C6V-pk1d#9&1*A!W|N?Gqn2&DnwS0 zrIEp+83qPyxVYzds1DLM*RWN06kF6a{5V6e0RZ>~S00iOlfsTWf_Zvv>_0o2T#&vYsWNjj&KzDd$y8b4?{b?B&?&PJv) z0=$~eMy4|dU>8=e*~scW381EP0@Jw(pr&&o(|H^q^7A9}vqsVZEPtq+3rp#&W;&mP zSJM$wb73$*jv!_=d(i}f9A3=oQz2jpKuz{ACVM78O?EAly#^qXeVED4mSmZ=c`&CU z*{@5<9>ipyrC=$>gP6VVN`mK5aF-#W;JFk$0w4s}QScZ;427oaMKC`Xr{y-9g6Du& z1&^lSI|)jDMsvmbHbKeHXy&IdG%VH8EY&>#)}T>LU=l|FK+_q?%6h{vvF|j&H<_Tc z?$_D6ZvtOOIZSw+&G|cmuOeUstQ>|CyOuKEWa}P5P#XJN1Xlv=I*`PhYz@oE!+l_Ub zmF@V2&yggVzSjD!snzm@0p!ZF9T6#3!Q*g5ZXc+ zMx@Xdy0d^KTj&u2${T%P3%y1X_@8Z|Y#6RR9dXlpQb71d9|EiK%gBR@XP(3Zyp-(P z`-7I1&2xO8s}T-tp{Iff6$4wSLd~|&*U898iCvozBqR41iRmO@G80><=90Eh$`v=` zq_`QoHkAr&m#BDfu&{hMP_hG6%1)|Mc2bqHld6=RRAu>2%AFJgYv4dRQDp3bXO&rk zXNKbRAt1YJhL&@r#IfFO-cPyH)=Ol%XIIF`atQ^PAWJv7d^m8>Loj)KfP~g<_t%Q4SZ*gr{zlhY6JO)Qytjv7hqPjgm^hjnd8S^$Le-vnP%6~MQx8go@}7E7Dpc^)gHoXmo_bI!)X`H9N`-1X^`KO!i>Drx z3U&3=gHoY7D~*m}Wdje&Tnvq+g$Jd_tx?H?(&HAX2a%8@}Ts%Wh;45dfdA0;6W)J?-fikmF~`~Se6`U-18Y^tK)3xUU0ZT zw)YeG+zXdUmx+2`q8{9fIQU?z=Dk49i`h%)hwR!l)XQe|M1I!}!Apq9240#Yu@mrU z)O0W3F7Yi-y);LIfG+NRfi<{$%?yE}o_cAn5GdxUm*&X=B|P=gyhNasr(T+O36%EK zOOvk)Jt=tKpj2x(!4;R8c)46H4j}p_0rTlboJCrQ{&Zn>ZSRh#OvXym!`(+>8Y3I zJ3?#lHnK+FSE!GtUYb7%t)Hh}nmX7G@YG9F2f{&~dTA8B|6Kc9JcGBty@a5u+YW`J!WjY=+p=p% z0Vo6ORT)SDsauJ(e~BcaZJM2ffDPVKH?G9mRAOZaQW(Rv4=ypVQG_`;rG&jJ#AYNE zr0@W+IoH0l#K!to9a*FqRsn=R25gmK?Pu6sGu*I+Nqhio8_q18eA;m2{42(nwkC!? zYc?1&3bmb=h4FgE&2!o`>)Besv@4lTFlKg%X_GK@8eQBRVraDEV%zG8 z#>6wd*~A}aINybTz+VAT?Ipc66m`-t&^j1iGBroBSmh6VZ-cKWd`FTm@I@+e<~B!C zW^e)4>ev>X;U6OM1JIqi0T)E+)Q@3(Re{x!*$w}|%oo&m;_DAWX1e=^%pJ^Js&!hq zTJ&I5^-rZ*H$nX(S19IGHtR5EO%2t2+;A}#{vkD9c5g2pIFE73_zEI-rUTSt4}!@a z4x;$qJjPYz5P)66xV1eHGJmGH60YlAO!jHYJO;e@bM0fHQo(Fu;#*s9A+N#KrM+x< zw!94H7Z9htY%|PD^`N ziaHvi>R8<=klWyA_S}wKb+=Il-McRT$2ue><_wC-7lv+F}e5^i87TfDZFU+!)%HE|$o;)xw3%q^EtZ$9CkZd|zzJ$P1FWa3{#aM;R?fiVqqq;V}1LAQsm6DQu2 zkiFi0Spbi`3Vt}nNW6zJfZzrEkP>VUzXnVB_KVRHdzCDcm%&UvBpIZTm|D7ic za`!3sbg`v}thMaVP*Rw5ta#S~{(r8JiBD?}=nIALqSKQ}{BkK+6DF20iKKliqv;MT zWhd27MR0n5GGWJUV{b*YbRs(b6EIic>@YfkAuB_5KaBsftz39jZza0yIWNqaL8Z43*pE#kM82bFBg&v$}OPt&CRFFf<` zysHI||2XnjoqXy+gyUSXrN(punN`TEz^U?S%iTv_4)QUe}1866u#o~K* z1+3fhOFG4Z5Z)ebwc6U4rhTB2qn?Pnh zEWZL3l5vM{W{t~=cIfYcW{Jp(c0@PGLfJ_fxTEg^8%yMfT_Aj%(qhb++o*X-NY32J z&kAEIejc@$^1482=s*E&`EEr~1ggoDF4<=kRVryefUswn)1=K;ytRLe-9Bk=L)f1S zm1F6C-LVFUvw5ZaGYFMq{QOFKz=vRh$}xV#Fg=h31C=3&Z-4V&;NXxRel;UAzv&U> z`Av^5&u@BMnBNFF8}F55Vv_sxWaUJLmt&!(xlc*%)6+EfX~}(hhUPwl+*3ev?%Psr z=tW(szC=OAD#n|C0T9J9OUo6@91<$VqR*^UC~EnKB3>dplxLW6Ii?yGMxzsDcDSly z#~(z#vm^MuLe?MG%-NAjiv^8~G%5eE5-78SnTiC=dGc}&&S(eXhgs)1(298X%7y)q z1*@aEkzC7dc0Bn5%M)Pfw5&g0jzE>Z8cA?K2v&@;teRP~=3?1pAB`QM6IsB>oy~rf zbcbO&9eYb!$79@A_n}I|kq@uHsFj%CKM#r%sX`M~Q91LWV7`DT#dI-03Fd_`?HIHI8n?-_I3XIj&Ji!KftC5yWy&F{b z&Sou|j=70U@`r+X7#el!ITdJnCRp825>|%87_%c|cfoSWBuM5+kew{|l@Q5H2@-ye z+e4(B{&805YPnJ9CefKS;p|Tzhycml2{LWDeL^HNC`fF78$%@XD9E_w&J2;PFF`uE zCW>&~Jk(ic-BtuKDWBjpS=~9%_Cmd6I0;+@LJzB+qrEr$59BiLh4@#0(*X3yPdJVn z)AR8$m}*v=02+^Cb54y<6Q;rW=K(~T%O;8^x{o? zSP3zRCe3>+mIGuEV8foSjr&>fq&^oC7609;FDR@ihc|odY^WxN{^;OSs3n#}(IJZv!VF|Zxg?5= z9ExZ38U{yQif3r(kBl_Tq!{`mqa=(-V(5>IGxS=+yp==*E7AyedV*r;k4!YHfP`C- zyt+R!$uI#dKg8*|1k&mGauD#wdBjcAQ!c3B3PXTyl^JWjw)# zq-%ii`=ip#P>E(ZT36yEb_fGiXi~!hA+)wtQ_Cp`>r0z_qCyb)a0DtMynw~~DWIb4g%_}(+l|J2win_ag}8hzOs5{enuA$bRt>Vah*@+Zu~d`Q z`P{xBEmlMn2+YvSsKGw1v(yVMyLk6RkoIQl*&T^=fvkNQ^>6}mQ)1?9fM)>2S>`V( zXNF-8?!phbI2ar`$E zg=JeWR+fgvOCYkmdw&DIV=(3f!(yv`{XcK&qCC=zj$VrNTMdhH@MZ6F87MKj&D#62 zB)QV0+pI0+%8i919VasMeKK+t78%AM8QF0n!+#XWjVQWS_3rQqf1>K1-B)1jtUrO*L7SL(nfw1tU3;BoI}cXU(1tY96g-oztY9p7oIH3}i?A z+VFvvYscd@302aVG8v7-DK>{TVNGdft&(Py<>4Bn%9N{Zi!ZPWrrbAMwXGgeeEe$w zisfhLjQ_uFu}WXkYAv;`!=;UswJkCXVh7!!ZJklxw(e-%wistOjn}Gey`^m{Q$$s^ zHRO3f`C7CszjfQnvTbp-R%%;K|L?V}dJIdp#aoU++iC}G%g3#mXj`KPmD<+-(kHcc zysTAP!ZODZhE<2eKbpuR020py$HddP!Y}b`o+A?#&iz*RHv;4w8Xxz`ng!()X z$3jXQmU{SSo@w_-gu@%kFb}My`VOYN;1AJHLiF}h=262!54by&r(zQ3X9WjeW}xZk zEK2UuLNeDN#mU5Dj|$0GLcfl)YXH~kn>ZI(oy>I7cQS_6^omwh6`kJAZto+y6Um`N z)i8F|Ug(i#&mRTbmRK|atMlXJ-6w~hfDw0V9_TqlpFs4?0}upyGtd?<^w`$mwx!PU z%Z@EO%kR-yejL)Wv;3z<+^LYAu|NL=>5Iw8{(?cw*74gxvA-NCkR9iti2W5aLbqRD z1h5_1;A8Sma%E-50x*{3rwQ%2X@kn+x}0CQv=hO###CYwJY&f6g0ejewn}lF%S!v`121lZ~N(?^H+v?L&o35+Qq02sBhHuUUXtS25PA7EN_LVpU7hD4-_3^`Q`|U+t@+ks@fN)S#YkN(xRj+mZ0iqb@xg3W*QsR(MOG4Zp#H~RF^$(3ZYT6LjRF1Q_x3I0R zn{)9S@JNRWB922YZW{5Q=OQ!(oXxcHw&V4X>+ofurU%CfD`rk2<*;(C?g2jjxS+|i z+jvZ)v=@YbW?gcPgkxqExmJ`%eisytd)f)kPe5f48&#@oSz!I#oFU&Vjr=csvozZL&C*!uo29WKry>)WU4F(3^mtJ8 zo29r9&nlE}mf}7=s6-@zgb$k0I%OHErI{}H%m<{ zYZCa<*#dJj_3K!V_OVcEn)=be5nm)En2_A1hc33_i-j7gZ8GlMl{hb4V*Z4fk=pgf z@>!n`0;=TW7=95oIO?n#SOZB1n}dO`wi6qsa`^1k6)&l>auYzh-^%^9JBO*)^R>_LQw?)0X+w#X%|JBY9$cwDN=oFLpi~H@^9Mp)s;|<#{1s(Tb^fw4 zD4#zNN{5^s^1JNZ4AtZhD5G`FKLSNl15{>@{OwRRgc|ZEBSRt7FTb@68kBb_Wst@j zmTyZv2P-rx|09YoHB_N-`BCHypousG#rCc`@znJwhP)hMj=32@wADP1c-`^O3uNbc z#OqG{NT6u`d8p~`q_kL`N4)MXdh)dnuGj@E~+w z1-t~0c-{RKs>Hec1XKs!nT!P0SBsYvGxFF73P^NnDmeBXB@QZ=35c(juv9B^JYs~T z&p@iS-2;1rkh`h|l-whzEtC5WPdk?e1{WK79-Qtw3_OlK2G90}Ur|#*R4u~?&ifpj z`1WQQsT3(Ji1Z7DRdXKxDZ68@Lb#owl8${M!foYrwxZu(5YF>-wxU0SDE|bPSQP_a z63E7zp;uZJ1DOx3rV;rp;EQt1>)6jC+*VF%D~9hMgCL&NR*c|AgB8hYtr)$J3X-a; z7)Ny>D9@AHibj5=2-fmE4@)a1D`$e$Q!zy=Bqh~TF^yS)H+7!p)D<&$9~7>Z$UOx# z=RU(MKu79QZJRfr#Q)rUlpIB}Ho+ft}m~Sz;Ptbr3&QOPU#s7&$Mo-ge7#556A`|%o#i}?B||>WbNoA8M>Gkp@I2p)DZEZ zBF}?>ZYyTvJIzl=_dV+g-wj)4r(*>8l-Lfs6? z*`&T@=o2c``Vy6ti%5OP+!<1LCsk4+g*UhG*$S)wD>&{qIonX(4&3JB7zeAJA=?0Z zfE#AB47$s4g{106#rK;Ejma4)D;GFu9mPQ8tDCfV*Eu zO$Li@-QzV9rks&B!>giaLo@~|j#u^FF;It}Mr4wsxX;~O^AeMlWY$KQ%zhBtu#yFF zc!bFuT1w^!d6iGY5u_a{;S)g{^(bWh4Zph~hz<2*iFN@<){w+7^dbDTvLBAHvTq^9 zs(-46NoXlhm0zej{2Y~*!a6C1=fJJ%t&38n>scTIDds=Kv3tBgQrIHni^n zcfW$=zQ$o$_v7UCDCE71pSi>lxDD!U5bN%0g%=^bk?@UKxaSv>$(#Z<5BBC=SJu;4Pc#|wGMRd0=xvU>NVJ5MV$$F$Sn}p2I9Iy zKg$epj>f+sG>v_YpVmU7!&-O+-1x(+!JGsiU!@}Fs51Y8GNVzOpGo6sSkE?_mr5`0 z3`qmJ18yg9Kfp3h)*)s;{LGj3Lx?ToWFv@5-3^qPq*g@U4ygx_D)YipP*##!6_I$W zNU_Fz#AFWQfTS)HJ#S&rc`}+ik@l%3-E8&C2Ai!WtEc!zua49J+=Qtl6)KkGikU1cew$N9BhsOK5h0yD&`8q7JnXo z=z)tUv_SIeMzu*a<@Twx3)ysJ{! zkX4E+QZ6e=akcUSDFHN3&!E#n`y+V$+ac$5{3;JXK1@azzw;}<>;Xu7g;|Wln6uwR0{UuJ z&+t8)=4)e^#BQ3*u}sD#{wu6ousVUD4C@pyb=wDU<%d-I8=;3E<7{JgA`?CiM?v#c zSR2!q$SZ6^#JUhUlE`aqL&PZ|vbrabH`|7Y%R^*>$UALA#9bls2S&f&HbgufB0nYa z5!(>)eu&&gF>{O*V_O*{_8ueyKo#g#f+aEqurxVr=A?5SVh(JDju*V;X960d7 zw3=O~TP)=>57)-B1XEdW8LeQ$PPm|~4 zcxD*Pnm&xxC{7hD%N6*c+oh0A?<|rgFyi7V0M9Rh>j7H+xpnq%4?;|G%$#%3ZL}@a|EU;)4&jR_7Rw> zLLeHYsmkl%}c>%13Fc3ZV{BnyNymCQ4IP2z8A< zQUhp!%Ip!PsVamTqBK>7P`@ZmRUtGeN>h~?r16GDX{s`V6&e+#smcshXk3)0st}rJ zIZ^rER*a=#_ku{4Yd@5$)jh^i+z0vurT9*(QtTIpCn!tu|FUh1vCJL?^MmEks$!3c zX-zmZmf7Qb2xL1nme~`>2o!amhhp|lN{cx(mf5=;Ahd)-W0^f&rKB7h%k141N;@=` z*?TD@_aW?k70~+-Ft3P^N-HkC0EdNulM?QXP)Z)NQBLS_Y?yAsPM0{STq+>adam)f zSWL-7NNGD^PXwyMwh!EZ|Cy_h6)Pj=vW%F^GHNc%(p(nl%d^physXv3Sz9OyD|%QQ z@vx$DeIhc1cTXG|sUkxeL{paHjEvw+0uM1MvdHMs0!1B~r6S{$Cf6q-jhc16J`tI` zr!b}*nx!IBW(kyrCPjwy*x1L>Z&!dGzLp4em>bC`xHzw9_9;g-P1ubH$IWbLov`;q zxWbO?$~(oGNH5?rGx0Q;sd(C%_IO4zi}8$R9zxS|tf-jvqWvC21czq5XnzKgQ8_`6 z4tQQ5y>t;B$P%YnFJUuLQb~Zw7_=wZhEX!fuX^J; z;aEn_2{KdB-xC=dT`HN8bArr*8Z_oidpy$_IVZ@>0X376bApVV6J*9ij-Qcpg3MNM zR%PUzAS34l8967&RHB2m%}hhwd`8X*GDm~6kdbqOjDZdvtY|M*YrM~|pt`d&#*lbF zEj!EkX)2)p3fWdWm`lxYywci2!zhrQlg35(VOnZW>o(s)PAYMCDxNPn=8q36pE}38s!?2?v?(+?6HPxtIiuspAm62+4G>K!y{CcUCMbk&O?t zI*P-Zjm8m76{|rhpK#YqA~kOJmcmJJmqLP!6KDMI6Nh7 zd)J47Ov&hylF=n4qf1Igmz0byDIHy0^J{30Lr+%1`&tocsmb0;AmhZT7_Foxd$T0& z2bdPG*WOI_1A?0wUqByC8fH?I4enmnmWt&OFq9X|W)#cP8Kq+R_jhZ-hclNUF8}u8IV&ea37d?;nlp)epU(hH$-Pg8 zEO#UxZ{e5bBaYEK9$fvr2XH3gtX+hb5S!G1l-F@1!GwDE26VVWCgziNghF=gT0%!E z6p8(W;&F~rC>pzg5M8Pv#fipHq-p1Iwk^dA5Vh&Csbm|<@B$7RN{^6E$8rkex zTu7prF9ArAB&^6sWIp{yU^4xjvo@mtWf#m{U^!>AXdo@SYW|^?^J`5#5t~i+bGS6N zYm>3Nsmi&GWY@Z}U75@ClvWj6PtNm|mW#C`?E)rj*A`xE%AECXf1Ru(iHlt zh9m`*rq^jAoha_&pCG{FBr*#lfiIJYFO!HblZY>qh`*^bny@dEh%b|fFO!HblZY>q zh%b|fFO!Jhz6PoJGKu&yiTE;!_%ez3GKu&yiTE;!_%ez3GKu&yiTE;!_%ez3GKu&y ziTE;!_&SMHK8`Gy{iNlZ&CtKi z5%JoLWxQQk(BXMUThp7kJ%|hcFyrLeYv6`TaTM^%IF$e9nqlbZ?Vhd&=}&wMJ?;h; z#31!kpMfaz@r!-p$zqOgatx`{Uiu4sts>8>1aqaVG8wX}IIusCP&FTM*p75y zcN!_R4F`zL_Wxn;yW^}Vvi-ZdZ|)mn8YyToRK_4$yvaFN)QwgP=bnpBZ9aJ z3g!%$Mbyqz7D>9Z{PEU&+m_&&*%2kIdxLyQ`J?~ z5HB5sCmn<*9fT(xgeM(@Cmn<*9fT(xgeM(@Cmn<*9fT(xgeM(@Cmn<*9fT(xgx9z+ zlz7rXc+x?5(m{CAL3q+Zc+x?5(m{CAL3q+Zc+x?5(m{CIK_vV;xZ48-~|KO69#fq2(f!IH$Gx_CD-quaLR_Pj(dW|Vv^I?=4I+w+*heESv8x=F${o2KVV9ZVj$$#wHu^fANOplVkmoRBG9s>2+FMNO(BgHV&yof=C7f*RSWq2fXi*BSV7 znbJjUe!(>1@6`AfVQIaop1RodD`dOe8Sl+d9ib$zgZE}?wnea) zsXhCRvE2URifcQLeGLnB3&(}=N@%+$5t^VLLAviz%f}&zal+Y@?5{K5R}o9%NSaJ5;z7 z8bIi3ydS((H zuEfp8()taC;8}{A3I66XomkIw-vjm*FyI`f<2e8==YZ~X{8}7~#eY_)_$bg>tz^pC z%oxh49VDhVjKLNu&ZdUt*%6ejMRrp|;Rgb412N4F<(xtYs#-{9?gG?SO0kvX>$K6x zk%M8xUdT@jgxOup$FQ~iT;Mu9h)~Dl5yBgbS%`cFzbLeK?!g3(GPK0%@;BygOL>D5 zb~YyJSTL-&%?u+p8JfLEO)BQW>ZjQr18)@c40J^RP_8d@Ni=X*@%Pag~ zH+~5EI}qTnS;xtUyWdb?w;_@r!{R~S-pAy39D^6JGF9US6Kfd3p0q^3%>bG6572@q z2q35aL<_3NVq1hH>_MjMM1oR@9%3chKu|LMVdnW01f>x@LY;pF*huDsk5cD;O{i}h zgWn-W(>2(#uE)=O-|`AS*pcbNU$v}BoR9BwAwgp`QHAXGk3q_0h&FI5De}mvz~Gf) zqRuL0J2|T!K}ra?VJ7Tc1A-nrgK3UD1Y}`nLI@lb`C!1|SUvvI76eEAUO3*RNcOUS ztw-=AB^>pf5PV3H>x4r^9t@E^9w1_lif~+rV8QdVz+yIZd`A&;a=?V0CFqfJYK*CMEJ6vb=rvJuyXdk_(;XFo} z-t2#K;OL|8fww4@qs1~L&MHF`HtRQsZzdmcF=ux`|A~AF{yL!O!&5-?TbC}>#S7VC z8&d6liy_#bVdHWbOxwFMrBOM+KZkKO(DwxbPA^zug|{%+`$z_PoXP1!Y)sq^oaC>7 z%-|$H!{821^7Ak~I%SjbXt4O4NN2y__2@w~iLH#{N zhn>bi1segxc^R%b;LHJquzek>ZLGn)?ScNiA$Xgj4zl6of&CV;7mNcy?YEGz z2cS~Xeaj|*(*ZV=wY^)J1YBc79m@>`owq;IzrN8HU)VAVJA>@}zLyd3VSr`mdR8#* zdjRFDXw1n3kHee^w{dqR@l$~H4+3}i0-qFtq^dMWk?J`^mA9+f20JL}O+)YtMa3Ox zL$cl?+G_!j?9riOba#+8VtM=o+-<;_ZU)}KddkH6MM>)~7FC&>7%@;I zD1sMA!ql4~rZF@QkP^KYDr=aN1EdVhtR|9?1I#9f^3OyzT|$EfnHzz^#ocZlN03Rx z9c>Jywo=Jqv|~!1Ba+{Q@9F8pnql=mL7mVq3FrIQT`2X0oCcP-}mupQ#!7rVmg8$%J6QtubaQ;WvnozQT zt%-SonOlqe)ISvdQUD&NrRX3TEJ9WlV6m$IbW*r>9dJn(kF0rwyj>0J6%Ry%SNXb- zudUD5P5AsGyQ+1*$eMQCx5yqxk@cDiDgWJ@X#CZSuuM(t!#P$&F1gm=Nd>aCGIFgt(1JXN?-3wKa$e#hxCMa-bYgUS2QkzoyB16YRK@DGSQqa zWJn!=hjkKU*w*Sc`63$zj{2?a+Zep#LqYT#oe;TQ#HoL~NZ7wtnQzodc_JwngVJ4%hgm)ipcOT}$aIt;@f2kkfhRZ2BX(p4ZzahmUrJ~4M zQfvc7iiXmp@vH3b5Jw+-7>GD4x7Q$z=;V6h39l|z29)VM z8Bm1lKc)+V($8T}1C9Qi*d>PaW)&VWvY5p!5sc%LCdZQ=8M2dP0}L%*rdHnqyeq{0 zNgS+AC(RGFAe|r*NxDkOcY`J+(1Uyhm54F-P{|#j%_6aXWMW?h z5XUP~0U+T*N_geh67I@N*hL9V!AS|bDPa^J3G+A^KQm1KGnxmyc}3NJN~R+~=N^6# zs6J)(`)Q+?&ne+@JPKim0Kx9LgxN%~*BFZYUd0a1i@lm+Uj$!D#9mFYKT=l0{6My| z4Owb2gGVOtW3+0`S&{@yBb4ndvW)`B3b3B+Ic9e;R{`)d7Z%awE)HPH?$sd2UjuU{ z^%NTOJ)~37;i`;aiR5_JP}}{WFNOG=p?rS}Uqj4vi-hwx7^%LnehF9lRp?g z0YdW2+D{?aEf7_Kxzpc}gTh>DT=0a_hZcL=>g9ygp#zeZY$7J)C zTh_udNt0XF!o6QYOx#Y$+zdx)`yn@FxeP~X83vQA0OBYuPZ@K;3=BLHhFxUg zDD8EkAmVaK7-wfO^n*6$a&DFf<9PS_G9ps;2%ytrDL~zk4EHKn+*9Yt<3Uh)PvHSt zN>14v55uxD936QZ!VwMy(NPN#2@|Cgi;iXlM(NlBD>_DvkAQVKumvWAf--ODL@jF$ zA#{#GjqJ+MGlFNSpP?oH19);g7V&4wyqslUXbRay@04+ZWS1#vGgM(AeSxHRD5)Xo zE59C6cx`}??jq@{BrUodAxgSUr4^e$)1Y^L&DvlY(Y*}GN=6}>xDAtSX9>~0r$LhM z1(eRi1YD_aHBI*$Q%xd&k-%!j&hW34c9}?RNEx(+V&Rj^% zmx7OGTuk5*03zdb(5|P9OOauNDC0pxert@#;MW2r!~R6B-BjJsv>@3%h9t#Gc0xdQ zH_04!vJFj$WVacTv{5pC;6$X|O0w1)@fjvK(3NXGIe2e*m=sWvr1aAUUnrx z*!eRMHU8D%%nDql!D~fLceYW?u8t1X!SR6-8|#(%4)07zsPE-9N?;*)7Kr}U;r;*A z;f3W@SgcnR?OJ-rSZ@Z|S4uD1hrJ?tbM%$5zS>tNVzaDRzfz$}$|>VmEk_5w3QO7S zrwR;XJtBcgAsnJ}8DG;1!IVvWb{cC~t+a5~)9>*=A^BURCF*Lc=Sfm>hR`zgU*&wFCnFdu)QmuwM z{R7n)pK2AU+JLG!h*aa&(71`@2KywkA7QBAB2{vi&pw0fb3w*^##|34$FX!E_bGmdoCa&Mcv@^Bl01`*bi> z3&_&f?_d^(>TnkjNNwvqbUgk%=4+7D?_iEZ2lMe!Ao`6ROmG_E63l??p3`7{NRB)Y zU%`~vtMH7-s$2AY1f$R60raJK#zulAVhS}wh#OYP-+GQSgD41n$#K8pK67t6SzHTGl5Zu8fNhz&E`tvM+Oz(Fj|9*IEEDa z|GF-30966aGlNLC=x~7Ynr9F#+)A*3v4aWjBuI2rVvADauZ}p;qY?A z4&}IQ zZpa+`f&N{DNq-sX7m+@0c93%2uPF&i z7XUI#rp>iN1I!Z$qncXjBcUf28ieDONGac1hlUtRU}S+E8Y511R(2_6WtUP`b}40N zHbx7|uBiq?R(2_6A3`{im0e0%*`<_~T}oNmrIel32qtIC@Jwc9mr_=CDP?7sQdV{; zW&1;BK~{DtWzPd;VODl2Wo4IAR(2_6WtUP`b}40Lmr`~)C>v&Fmr~ZihH_*C_bU|U z%)3ZA_Lnm&F=-!3=rhR^%-9za`ny6ugS@yHor^`}UU|od&uxp}UiG!D>{A znMl(6MJz>5SFyL{#okBqGgRyaH0udNnz>5HolE7iTk>(1e;~HP96@V$NP0+mnvz$T z1{Cp<;EB6L@s-RKh9B@@x>O85?!$W!&+zj;{7gP=k_(j|0A}0=8ee5zr2Z-+=_1ma zAcR*qmW-vts}_=SfKvB?7oirm5$X>?-AJ~0v=PDS8PL_(bf;yw z!G&C_lye$5Yp@jVNTRXSG>95T8%E!zBn?dkam-EqL(SLuiSA~J zj#hPNkgb6+l(SQ1y+cD!VKx^ThL?b{5xWxHV9CAnSCBJmzbMZy@N8_JqtO|B#2ga7 zRw-@p24AJ5M9TKOl(b0sgi=b(HPo|C5=O>zCQ51Ydm~L2;j71MX?gKXAw85zmI*1z zo>bD60qIF+fNC^J8=6%lol`$EcuP-HKgo+V_@I$ zO!uLplnRRv5c_iI<4aGbzcH2T1+$=4vvw-8_6mT_QS%NX@DeR*@y-6A?M^uC?1XpG z;u)sfN4!KtHBH_R+CcF#5D5}bh92por&ulSBuC%y~57+aGjN8 z2DEsbWc?WoJG(&Ek{g1ZlOF}bn8b_tw>1#jz-o0osXJc=45q^ul|n5GlsDIiTE}Yj zE$!;^fKr?Q3X2JM#QU+Ko72QaxtzM%O(i2m`sSrog_?lOnRL0 zX999+R^k97B~G|hKrHVh>~;vISV$z1!Z;b1<{?8#BX9#;AqM!y0Cub>Z&B%LCVd8! zDxd5tj~{mgrkzvR9=IFl$eEZd97r;*u6{HEx(}i*yQYgO#gs;sw6}`>%7%v_h{-h- zh$x=UVTKuj&bgYgFX_%iAmk6d@d2PK0o{v2S9t_FkWZP!zla#{ol3q}ar%p5{6Fwr z?(^*tzHZ=aD8t+yS%E$@FXy#D&R;2YuaU~f?y3`hkn^@L=Pi+QN?y)eBIn|~oVQg@ znMu-~5BGWZ(7@~<@-ZXBd_5zFgfwy6MfiOXR*w99+z^kZr+=E>r&K-)l;u=uj-f<+ z9EoP$rlxY)k6CqxNZad6yGx}F2hBYEswDUB5oy@rY&BvDF>*A1SZ%D%0>)pZxt1C( z#t?^yukk}>yet}U=Nwi*S!`V(0F?bmxy~3;B_|1Gi!f~=B|hv3%0ob@s?QSDs{+;E zg6Hq};WewTx`DZ!@~|0)jFh)YWiErv#v-$?L|sOiTUc!UB#ljGBiBZPc0GQYYh(Oe zD>H>?P6iuIDeGR9m#TyH+|Vbjz_Du1qu!|-fC)S6l66*!&GF%S1m6k4Z9=dC1T{%Y zovNe8$sur1O|po}T*-JuwjUS`4D! zI=A{~NB8_wE$fgy|7JjvclV)5+YuM#L_RcmCCRYif)m-$6oqU(4EYkGv$tQh@+vH->$juOH{b^+@gh(~xBBROBN`Uh0T zigbr1_}1egK>6Q#WRRV_I^EJwSapz7}_%%Nai(i+U zUai=4XylTY*x5_PJ`%v6V&6p$V&A~G23T?h_Otk(9pb@r39pMxMU5z2vS@}CULT?5 zuq#(m0QwC+XmSk+o)cl}(Qy~jg$th>=?E$4xpOPhh&|6Ijub9hgmE|kqq!F|h&?~T zjKNBFZfjvZu*AyF!BAfk{xM?EbL8ey(oen~EB7`m4F4Rc&2cYv*ov~KskS$&Vc7U! zEVq%M9n};hbBjs#y$?04OTEpR}CdkW8M&%Ai{Mc;nUV>3ya?Z-~ zX0A}!jrOLE90pA8f{>KGzpfA&xE7dVq8r$;G3I#o zz2fSWh^tc~u1<-#Iwj)jl!&WSBCbw}xH=``>XeA9QzEWTiMTo?WsP7!iMTo?;_8%$ zt5YJbPKmfWCF1IooCnIn5^;4(#MLPgSEoc=of2_%O2pME5m%=~T%8hibxP$#OMy+( z3+xM!$O4<`!5XxL&jwzOvqjrqDPI!Befon86-+)W8Lid0NCnPBLH_>Pk&|mBa&oOiPOg>6 z$+Z$WxmKbl*CLg@;grS?{xcZltDEsd7-X7C(GucQgESq48W}(Ib&13GDQ#*fGlT;> zUO+f>6ZvBEt&JT>{383V03gOU=i6l&{(VH;QoMOza z;Fd= z+`+!4e%agj;Z?tc+a3v~#tUblpbi(pcI_`gakT4jEuQ#m zyA<(lB$2C}jx36{myly7IX3(wj&^MhqxdZnhm2&cFJzv5A7Y2=qpv2?AZ~5Pt@!yNm*63NYPHM;`P%ME4Jy zBOJ+@?g1jmq5bX##nDM6R@Y6C_A;fN49wa1`4<%+o#ip}se5LEHjujKqbe34SE< zTPyB-sknE*95&5`+BBQXk*yA4Lvp?%f~du0kv(|r!@onP`7v0m)C`ag;;X+p@rfy=G&9LYgl%7Z0Nnxh; z7{I;6mIK2aY>>Y#&LH_AVOH~Pi0(~$AAraT7B9%e__nL@;gY(IOM0b%DLBH9!2Asx)Ha|jV5DD+FE7+C;BmWXc@F`9@C z)bhO|#sbl69JSzWnMfT^%+DS$Dd}!;ARl65?8nbQu8M2Jk|EDPvlOVXGl@JG(USdT zGzdF~6SIk!;YPDyIx!Y)nQfjIu07#8t9Uz<_FI;Pls64iVNAcCIY8fsXds~eWq{U2 z**)W?Os?idPQDlQ!I=I$QDqK{R;TbU?7ReV130R2?5pKTtmN_C8D$30>7X}K%UcAJ zCyr7qhswsF9rzOM{E?LmVjeH8!yTKw5T0O8Qpt}8hW2mGR3Bu{Rs7R={6eN{nz>Q& zJMwsb_Z0^?9#Q;G;-x!Hq*1Y~R}kw@C=L4LzE((OEiI7yP@=HXt*9X)Oy?)?mc!8cs7yRf@K72$?s>@H*&OmgxID}#Lm z)RSM>T{vGrIr)W^!HuFozu}tyGKZf0%7Z-Yumg0iJrKM}9`*8H_N5Ggqwq`1gNCOc z!2`6E?Aly;%*X^aI_V08Jw14j9HxmLC#cc<1T`ZYXksH@AR(DzqZT7bLMAOXnh|hI zBiLFqMpMa;yHajOcICu-aTQC5+MyBHKq)MRVrKvlaLFAN@whKu8skl3Z%rX^sXEUAlJMz5oQuB&Ic`HAEJ<*F?w0$+ z<%we!F0|YVAFPaTKnLJf`Cy~O!fBRU9cGc(HH{MsmsoC%57i`&!|NcosSh@Ze@U&) ze6VSpmDFwSgU#ZFC}6jR4>pf;&f~TTA15ZZuwtCyl)Am0m-2}nxo=`e`6l^^9qohJ z1Q!(CF}~oO3LYP3EwpQjtk_C+XzsM|-zZqLP7g2FT(n}c$l#OXm>(M&uy!pkPm>f&7FaL@CJBWhCsM&n%MaLUS)ov5=Cs*XYKk_*n0Gu1Bz2&sHeoq+s3fU_?tzTV7l>(}I(!bsA?Ytt(-=gx z^WH%wq^4^nw7t0l0L@S+>+x3H)J(soc=sFt=m>>sqzg#Rrh#@1K6h`&A8}r{)XeeF&q|N%luh&6mczonY!a z3a?pZTV*`=WL%q4Ggl*Qrz4E?Mv|`JXVn06UPH*WPa@d}DCm&ccm=#a&qnTLHfb6( z?U~J*TH|pxmAR6a;@UL@-g@OTWFeH)6R0X6TB%5yE3!ERi4?#xrHY-ZdV@P#>WC1+3{u` z*SG@tLU`s0g|glsDeg&y3cU#^@yt_dan5qK(X1UeP*+pL6l7lLo7c5-A6+l{x=@16{*D;3+ei_uM!V)s&g^eo%?0lIjB$5%OLm z^r6Ouy|)N`q)^=3fmWFLSfP}6FXKK@z5;IvWqwNWc1_k>Oz5*RKzy_14JGO4tp&Wp zSXpK*BmE&L%j7dwV659QX}tnCY&nmR|BL0o=1e4KV&%4(Jsa^A<u!!I1&?Me!vk*Q~$_2E)!Zwum1-fZaUI@ze^QPnFTcyn~j@Vlr*>##Kn?3v< zz@3KA#gPU4Iu=t^cl&Y>4my_F;KQLEy7mHe1fBoL*pF>-Eh+x%d7@%G<}Phyqw_~L zoz1!6?818Vk6wImp-ytmtF(h=_jy%1okE^fH9xg^j5o`h=Lsig@DLv1V|EZD_p@HQLuoDy)mgPKATgQ0vnRtm_7Vup{K%xDF>`&ww))iO zXM=a4#@63a@-3{`xduePbw|m6eKv^qHxZc$ga+P&L_{$Y2o2H@W&)wXPXKAjCleTo zpN9ut$}#hI1+YI82o1Rq7bYD38Y@GY6?wekeJRE z&9{YF`*l1ESA}%(G(>}Q(E*88>l|8|+ z{7hA^Qj3qAPeM)t;-d=0T0P_wd@SCH?IP(ob!^E)6LX^AaLc~IHACmPtlc6PSJ$MT)Ohf zeO>wFK}#r4T>0eT&CyAy`e_VO{W}HVnNAy_-sO0doS{(Gr7NEdTzQwSd@^w5<*a3L zHVvdJpS5{0p1AVKqZmy58FrQ>=dtfnjq@4IYg`a$l++!|Qh-0^(j846*Fmgl2&wyl z$El=I3mI&n6NFUkZ2%%R71wV;S}rFDsl*-;WV@Uor1BF4mlK3klGT6{1eX(pR4R$? zRVD}}GC|1Nl$wwULMp;YmlK3kK^8$64s-a;#;ko7$z+0%-iWUsVNga|)4>Emax}ep zucX1aoFJsHY${c;z~uxXeU+xR)a3*reYHZ>E++`-V1nRsf{+d-2refG>0p8&d7r*s zbE&P%2|{`cP0LRZ(l?bbZF(i%V+dw#){)>!ye#KAdL`aEG1E%vm3RsTSK^V34OFkh z(@MrBD&2&MgiWl}e2gTRd3bH2gL(@c*t2$9nA6aNQR~fQEQg{-FlvED^EE~pzCk|4 zFmwS1*z!dvW86%87T^a6%XoZ{Fh&-^#;na(fLWXQ-OvmqHEt#+J7wOia(4i%V10)L~^bGZ6mm9Coy5y0;rzMgf1ia z48c1IE@u(E0}%UcXEUh>B9rwGB1b`F4Ni|wVM`yf82Ba^k*JTM&ZVmNX6ofl?4}p& zvgU!T>U%U}(~D+YKu~$vO4;8GDHU=`#l>!6yaYKxQoR<$n%Th%)Sh}y_ZXnZ0-`8?3Z4&Yi!P>OLA zV=p4e-qc8+VJ+3fU&+K*0>CuxoLa;lZYUitF4NaM!<=u$Rv31UE2y(toGpkOpqXId zeP|gmHq8fskr6F!HUFO0w!Rsdu(K6ZF}BOs>k%xYkk-!%!JQyz{s=X<=F9A`b3+J- zwYYcuyGhZu8jc~sU-WhZM)Vr1c@=5eH52c65%se5POeALTL|_Sf+f`3hHBcW z-p$mzj1(PJ?*i(*Mi3W+g`nuQhGvjCa_gi2vZB@Cece-DY&IL+n!oGJ(StkwX`Rqc z3o$1S<5S(&&euaJ48=F%0Z(;0{_PFms1>5G8ya#YFrfqa7{_#&Dg+G9U`=OPgU}}CKh2G}GQWC1CS}xYAixD5qh`>|TRB{-k+`v

y(!h^w{fn%{48tMi(-@1yy#Kr`2g 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

eb~Pl{~*z8 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 u%SX#@8ekexUaScB>xv{*u2&N literal 410797 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�q^v|Ke4~D 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 z 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 */ - - /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ - // jSON Format - index += sprintf(message + index,"{\n \"version\" : \"V0.4\",\n"); - index += sprintf(message + index," \"name\" : \"Button,LED\"\n"); - index += sprintf(message + index,"}\n"); - - length = strlen(message); - memcpy(buffer, message,length ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, length); -} -#endif - -/*A simple actuator example, post variable mode, relay is activated or deactivated*/ -/* -RESOURCE(led1, METHOD_GET | METHOD_PUT , "led1", "title=\"Led1\";rt=\"Text\""); -void -led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - char mode[10]; - static uint8_t led1 = 0; - static char name[17]="led1"; - int success = 1; - - char temp[100]; - int index = 0; - size_t len = 0; - - const char *pmode = NULL; - const char *pname = NULL; - - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); - if(led1 == 0) - index += sprintf(temp + index," \"mode\" : \"off\"\n"); - if(led1 == 1) - index += sprintf(temp + index," \"mode\" : \"on\"\n"); - index += sprintf(temp + index,"}\n"); - - len = strlen(temp); - memcpy(buffer, temp,len ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, len); - break; - case METHOD_POST: - success = 0; - break; - case METHOD_PUT: - if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { - PRINTF("name %s\n", mode); - memcpy(mode, pmode,len); - mode[len]=0; - if (!strcmp(mode, "on")) { - led1_on(); - led1 = 1; - } else if (!strcmp(mode, "off")) { - led1_off(); - led1 = 0; - } else { - success = 0; - } - } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { - PRINTF("name %s\n", name); - memcpy(name, pname,len); - name[len]=0; - } else { - success = 0; - } - break; - default: - success = 0; - } - - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} -*/ - -#if REST_RES_DS1820 -/*A simple getter example. Returns the reading from ds1820 sensor*/ -RESOURCE(ds1820, METHOD_GET, "DS1820", "title=\"Temperatur\";rt=\"Temperatur\""); -void -ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - - char message[100]; - int length = 0; /* |<-------->| */ - int ret=0; - int grad=0; - int kgrad=0; -// ret=ds1820_temp(); - if(ds1820_ok[0] & 0x01){ - kgrad=5; - } - grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1; - - uint16_t *accept = NULL; - int num = REST.get_header_accept(request, &accept); - - if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) - { - REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d °C",grad,kgrad); - - length = strlen(message); - memcpy(buffer, message,length ); - - REST.set_response_payload(response, buffer, length); - } - else if (num && (accept[0]==REST.type.APPLICATION_JSON)) - { - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d °C\"}",grad,kgrad); - - length = strlen(message); - memcpy(buffer, message,length ); - - REST.set_response_payload(response, buffer, length); - } - else - { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); - REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); - } -} -#endif //REST_RES_DS1820 - #if REST_RES_HELLO /* * Resources are defined by the RESOURCE macro. @@ -321,7 +162,7 @@ mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre unsigned int content_type = REST.get_header_content_type(request); /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ - uint32_t max_age = 0; + uint32_t max_age_and_size = 0; const char *str = NULL; uint32_t observe = 0; const uint8_t *bytes = NULL; @@ -336,14 +177,22 @@ mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre int strpos = 0; /* snprintf() counts the terminating '\0' to the size parameter. * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. - * Add +1 to fill the complete buffer. */ - strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); - + * Add +1 to fill the complete buffer, as the payload does not need a terminating '\0'. */ + if (content_type!=-1) + { + strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type); + } + /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request. * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */ - if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age)) + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age_and_size)) { - strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age); + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age_and_size); + } + /* For HTTP this is the Length option, for CoAP it is the Size option. */ + if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_length(request, &max_age_and_size)) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "SZ %lu\n", max_age_and_size); } if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str))) @@ -433,9 +282,10 @@ mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + REST.set_header_max_age(response, 17); /* For HTTP, browsers will not re-request the page for 17 seconds. */ REST.set_header_etag(response, opaque, 2); REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + REST.set_header_length(response, strpos); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ /* CoAP-specific example: actions not required for normal RESTful Web service. */ #if WITH_COAP > 1 @@ -517,8 +367,16 @@ chunks_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre /******************************************************************************/ #if REST_RES_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3 /* Required to manually (=not by the engine) handle the response transaction. */ +#if WITH_COAP == 7 #include "er-coap-07-separate.h" #include "er-coap-07-transactions.h" +#elif WITH_COAP == 12 +#include "er-coap-12-separate.h" +#include "er-coap-12-transactions.h" +#elif WITH_COAP == 13 +#include "er-coap-13-separate.h" +#include "er-coap-13-transactions.h" +#endif /* * CoAP-specific example for separate responses. * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process. @@ -577,7 +435,7 @@ separate_finalize_handler() 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); + coap_separate_resume(response, &separate_store->request_metadata, REST.status.OK); coap_set_payload(response, separate_store->buffer, strlen(separate_store->buffer)); @@ -642,7 +500,7 @@ pushing_periodic_handler(resource_t *r) /* Build notification. */ 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 ); + coap_init_message(notification, COAP_TYPE_NON, REST.status.OK, 0 ); coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter)); /* Notify the registered observers with the given message type, observe option, and payload. */ @@ -684,7 +542,7 @@ event_event_handler(resource_t *r) /* Build notification. */ coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ - coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_init_message(notification, COAP_TYPE_CON, REST.status.OK, 0 ); coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); /* Notify the registered observers with the given message type, observe option, and payload. */ @@ -715,7 +573,7 @@ sub_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s } else { - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%.*s", len-base_len, uri_path+base_len); } REST.set_response_payload(response, buffer, strlen((char *)buffer)); @@ -777,7 +635,7 @@ leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /******************************************************************************/ #if REST_RES_TOGGLE /* A simple actuator example. Toggles the red led */ -RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +RESOURCE(toggle, METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); void toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -822,7 +680,7 @@ light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -857,7 +715,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -915,7 +773,7 @@ radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -925,29 +783,13 @@ radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } #endif -void -hw_init() -{ -#if defined (PLATFORM_HAS_LEDS) - leds_off(LEDS_RED); -#endif -#if REST_RES_DS1820 - ds1820_temp(); -#endif -} -#define MESURE_INTERVAL (10 * CLOCK_SECOND) -#define READ_TIME ( 2 * CLOCK_SECOND) + PROCESS(rest_server_example, "Erbium Example Server"); AUTOSTART_PROCESSES(&rest_server_example); PROCESS_THREAD(rest_server_example, ev, data) { -#if REST_RES_DS1820 - static struct etimer ds_periodic_timer; - static struct etimer ds_read_timer; -#endif - PROCESS_BEGIN(); PRINTF("Starting Erbium Example Server\n"); @@ -964,25 +806,10 @@ PROCESS_THREAD(rest_server_example, ev, data) 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) && !defined (CONTIKI_TARGET_NATIVE) - set_global_address(); - configure_routing(); -#endif - - /* Initialize the OSD Hardware. */ - hw_init(); - /* Initialize the REST engine. */ rest_init_engine(); /* Activate the application-specific resources. */ -#if REST_RES_DS1820 - rest_activate_resource(&resource_ds1820); -#endif -#if REST_RES_INFO - rest_activate_resource(&resource_info); -#endif #if REST_RES_HELLO rest_activate_resource(&resource_helloworld); #endif @@ -1030,9 +857,6 @@ PROCESS_THREAD(rest_server_example, ev, data) #endif /* Define application-specific events here. */ -#if REST_RES_DS1820 - etimer_set(&ds_periodic_timer, MESURE_INTERVAL); -#endif while(1) { PROCESS_WAIT_EVENT(); #if defined (PLATFORM_HAS_BUTTON) @@ -1048,19 +872,6 @@ PROCESS_THREAD(rest_server_example, ev, data) #endif } #endif /* PLATFORM_HAS_BUTTON */ -#if REST_RES_DS1820 - if(etimer_expired(&ds_periodic_timer)) { - PRINTF("DS1820_Periodic\n"); - etimer_reset(&ds_periodic_timer); - if(ds1820_convert()){ - etimer_set(&ds_read_timer, READ_TIME); - } - } - if(etimer_expired(&ds_read_timer)) { - PRINTF("DS1820_Read\n"); - ds1820_read(); - } -#endif } /* while (1) */ PROCESS_END(); diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur index 6d2e9f30f052966e70267cb67715fd6e8a6dcdaa..4f434e5d6682d25ee51c632a4bbe11a2703b0a4a 100755 GIT binary patch literal 398165 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%0DJFf{{yDB|Vd!YnrhYTN%aAbi${p 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 diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep index 916219dda..1996e8fde 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep @@ -1,4 +1 @@ -:1000000000212EFFFF00270D41544D45474131325D -:100010003872666131006C6F63616C686F73740075 -:0900200000001AE5CDAB00000060 :00000001FF diff --git a/examples/osd/er-rest-example-merkurboard/er-plugtest-server.c b/examples/osd/er-rest-example-merkurboard/er-plugtest-server.c index 051b44be0..5a791a09c 100644 --- a/examples/osd/er-rest-example-merkurboard/er-plugtest-server.c +++ b/examples/osd/er-rest-example-merkurboard/er-plugtest-server.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Matthias Kovatsch and other contributors. + * Copyright (c) 2013, Matthias Kovatsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,33 +43,42 @@ #include "contiki-net.h" #define MAX_PLUGFEST_PAYLOAD 64+1 /* +1 for the terminating zero, which is not transmitted */ +#define MAX_PLUGFEST_BODY 2048 +#define CHUNKS_TOTAL 2012 /* 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_LOC_QUERY 1 +#define REST_RES_MULTI 1 +#define REST_RES_LINKS 1 +#define REST_RES_PATH 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 +#define REST_RES_MIRROR 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" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" #else #error "Plugtests server without CoAP" #endif /* CoAP-specific example */ @@ -92,31 +101,136 @@ */ RESOURCE(test, METHOD_GET|METHOD_POST|METHOD_PUT|METHOD_DELETE, "test", "title=\"Default test resource\""); +static uint8_t test_etag[8] = {0}; +static uint8_t test_etag_len = 1; +static uint8_t test_change = 1; +static uint8_t test_none_match_okay = 1; + +static +void +test_update_etag() +{ + int i; + test_etag_len = (random_rand() % 8) + 1; + for (i=0; itype, coap_req->code, coap_req->mid)); + + if ((len = coap_get_header_etag(request, &bytes))>0 && len==test_etag_len && memcmp(test_etag, bytes, len)==0) + { + PRINTF("validate "); + REST.set_response_status(response, REST.status.NOT_MODIFIED); + REST.set_header_etag(response, test_etag, test_etag_len); + + test_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + else + { + /* Code 2.05 CONTENT is default. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_etag(response, test_etag, test_etag_len); + REST.set_header_max_age(response, 30); + 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"); + REST.set_header_location(response, "/location1/location2/location3"); } else if (method & METHOD_PUT) { PRINTF("PUT "); - REST.set_response_status(response, REST.status.CHANGED); + + if (coap_get_header_if_none_match(request)) + { + if (test_none_match_okay) + { + REST.set_response_status(response, REST.status.CREATED); + + test_none_match_okay = 0; + PRINTF("### SERVER ACTION ### If-None-Match will FAIL\n"); + } + else + { + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + + test_none_match_okay = 1; + PRINTF("### SERVER ACTION ### If-None-Match will SUCCEED\n"); + } + } + else if (((len = coap_get_header_if_match(request, &bytes))>0 && (len==test_etag_len && memcmp(test_etag, bytes, len)==0)) || len==0) + { + test_update_etag(); + REST.set_header_etag(response, test_etag, test_etag_len); + + REST.set_response_status(response, REST.status.CHANGED); + + if (len>0) + { + test_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + } + else + { + + PRINTF("Check %u/%u\n [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n [0x%02X%02X%02X%02X%02X%02X%02X%02X] ", len, test_etag_len, + bytes[0], + bytes[1], + bytes[2], + bytes[3], + bytes[4], + bytes[5], + bytes[6], + bytes[7], + test_etag[0], + test_etag[1], + test_etag[2], + test_etag[3], + test_etag[4], + test_etag[5], + test_etag[6], + test_etag[7] ); + + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } } else if (method & METHOD_DELETE) { @@ -126,6 +240,233 @@ test_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ PRINTF("(%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid); } + + +RESOURCE(create1, METHOD_PUT|METHOD_DELETE, "create1", "title=\"Default test resource\""); + +static uint8_t create1_exists = 0; + +void +create1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t method = REST.get_method_type(request); + + if (test_change) + { + test_update_etag(); + } + + PRINTF("/create1 "); + + if (method & METHOD_PUT) + { + PRINTF("PUT "); + + if (coap_get_header_if_none_match(request)) + { + if (!create1_exists) + { + REST.set_response_status(response, REST.status.CREATED); + + create1_exists = 1; + } + else + { + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } + } + else + { + REST.set_response_status(response, REST.status.CHANGED); + } + } + else if (method & METHOD_DELETE) + { + PRINTF("DELETE "); + REST.set_response_status(response, REST.status.DELETED); + + create1_exists = 0; + } +} + +RESOURCE(create2, METHOD_POST, "create2", "title=\"Creates on POST\""); + +void +create2_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + if (test_change) + { + test_update_etag(); + } + + PRINTF("/create2 "); + + REST.set_response_status(response, REST.status.CREATED); + REST.set_header_location(response, "/location1/location2/location3"); +} + +RESOURCE(create3, METHOD_PUT|METHOD_DELETE, "create3", "title=\"Default test resource\""); + +static uint8_t create3_exists = 0; + +void +create3_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t method = REST.get_method_type(request); + + if (test_change) + { + test_update_etag(); + } + + PRINTF("/create3 "); + + if (method & METHOD_PUT) + { + PRINTF("PUT "); + + if (coap_get_header_if_none_match(request)) + { + if (!create3_exists) + { + REST.set_response_status(response, REST.status.CREATED); + + create3_exists = 1; + } + else + { + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } + } + else + { + REST.set_response_status(response, REST.status.CHANGED); + } + } + else if (method & METHOD_DELETE) + { + PRINTF("DELETE "); + REST.set_response_status(response, REST.status.DELETED); + + create3_exists = 0; + } +} + + + + + +RESOURCE(validate, METHOD_GET|METHOD_PUT, "validate", "title=\"Default test resource\""); + +static uint8_t validate_etag[8] = {0}; +static uint8_t validate_etag_len = 1; +static uint8_t validate_change = 1; + +static +void +validate_update_etag() +{ + int i; + validate_etag_len = (random_rand() % 8) + 1; + for (i=0; i0 && len==validate_etag_len && memcmp(validate_etag, bytes, len)==0) + { + PRINTF("validate "); + REST.set_response_status(response, REST.status.NOT_MODIFIED); + REST.set_header_etag(response, validate_etag, validate_etag_len); + + validate_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + else + { + /* Code 2.05 CONTENT is default. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_etag(response, validate_etag, validate_etag_len); + REST.set_header_max_age(response, 30); + 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_PUT) + { + PRINTF("PUT "); + + if (((len = coap_get_header_if_match(request, &bytes))>0 && (len==validate_etag_len && memcmp(validate_etag, bytes, len)==0)) || len==0) + { + validate_update_etag(); + REST.set_header_etag(response, validate_etag, validate_etag_len); + + REST.set_response_status(response, REST.status.CHANGED); + + if (len>0) + { + validate_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + } + else + { + PRINTF("Check %u/%u\n [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n [0x%02X%02X%02X%02X%02X%02X%02X%02X] ", len, validate_etag_len, + bytes[0], + bytes[1], + bytes[2], + bytes[3], + bytes[4], + bytes[5], + bytes[6], + bytes[7], + validate_etag[0], + validate_etag[1], + validate_etag[2], + validate_etag[3], + validate_etag[4], + validate_etag[5], + validate_etag[6], + validate_etag[7] ); + + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } + } + + PRINTF("(%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid); +} #endif #if REST_RES_LONG @@ -179,10 +520,119 @@ query_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } #endif +#if REST_RES_LOC_QUERY +/* + * Resource accepting query parameters + */ +RESOURCE(locquery, METHOD_POST, "location-query", "title=\"Resource accepting query parameters\""); + +void +locquery_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("/location-query POST (%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid); + + REST.set_response_status(response, REST.status.CREATED); + REST.set_header_location(response, "?first=1&second=2"); +} +#endif + +#if REST_RES_MULTI +/* + * Resource providing text/plain and application/xml + */ +RESOURCE(multi, METHOD_GET, "multi-format", "title=\"Resource providing text/plain and application/xml\";ct=\"0 41\""); +void +multi_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; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + PRINTF("/multi-format GET (%s %u) %d\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid, num); + + if (num==0 || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + 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%s", coap_req->type, coap_req->code, coap_req->mid, num ? "\nAccept: 0" : "")); +PRINTF("PLAIN\n"); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "", coap_req->type, coap_req->code, coap_req->mid, accept[0])); +PRINTF("XML\n"); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/xml"; + REST.set_response_payload(response, msg, strlen(msg)); + PRINTF("ERROR\n"); + } +} +#endif + +#if REST_RES_LINKS +/* + * Resources providing text/plain and application/xml + */ +RESOURCE(link1, METHOD_GET, "link1", "rt=\"Type1 Type2\";if=\"If1\""); +SUB_RESOURCE(link2, METHOD_GET, "link2", "rt=\"Type2 Type3\";if=\"If2\"", link1); +SUB_RESOURCE(link3, METHOD_GET, "link3", "rt=\"Type1 Type3\";if=\"foo\"", link1); + +void +link1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *msg = "Dummy link"; + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_response_payload(response, msg, strlen(msg)); +} +#endif + +#if REST_RES_PATH +/* + * Resources providing text/plain and application/xml + */ +RESOURCE(path, METHOD_GET | HAS_SUB_RESOURCES, "path", "ct=\"40\""); + +void +path_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_path.url); + + if (len==base_len) + { + REST.set_header_content_type(response, REST.type.APPLICATION_LINK_FORMAT); + snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, ",,"); + } + else + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "/%.*s", len, uri_path); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + #if REST_RES_SEPARATE /* Required to manually (=not by the engine) handle the response transaction. */ +#if WITH_COAP == 7 #include "er-coap-07-separate.h" #include "er-coap-07-transactions.h" +#elif WITH_COAP == 12 +#include "er-coap-12-separate.h" +#include "er-coap-12-transactions.h" +#elif WITH_COAP == 13 +#include "er-coap-13-separate.h" +#include "er-coap-13-transactions.h" +#endif /* * Resource which cannot be served immediately and which cannot be acknowledged in a piggy-backed way */ @@ -264,12 +714,15 @@ separate_periodic_handler(resource_t *resource) #endif #if REST_RES_LARGE + +/* double expansion */ +#define TO_STRING2(x) #x +#define TO_STRING(x) TO_STRING2(x) + /* * Large resource */ -RESOURCE(large, METHOD_GET, "large", "title=\"Large resource\";rt=\"block\""); - -#define CHUNKS_TOTAL 1280 +RESOURCE(large, METHOD_GET, "large", "title=\"Large resource\";rt=\"block\";sz=\"" TO_STRING(CHUNKS_TOTAL) "\""); void large_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -323,10 +776,10 @@ large_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred /* * 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\""); +RESOURCE(large_update, METHOD_GET|METHOD_PUT, "large-update", "title=\"Large resource that can be updated using PUT method\";rt=\"block\";sz=\"" TO_STRING(MAX_PLUGFEST_BODY) "\""); -static int32_t large_update_size = 1280; -static uint8_t large_update_store[2048] = {0}; +static int32_t large_update_size = 0; +static uint8_t large_update_store[MAX_PLUGFEST_BODY] = {0}; static unsigned int large_update_ct = -1; void @@ -348,7 +801,7 @@ large_update_handler(void* request, void* response, uint8_t *buffer, uint16_t pr return; } - REST.set_response_payload(response, large_update_store+*offset, preferred_size); + REST.set_response_payload(response, large_update_store+*offset, MIN(large_update_size - *offset, preferred_size)); REST.set_header_content_type(response, large_update_ct); /* IMPORTANT for chunk-wise resources: Signal chunk awareness to REST engine. */ @@ -372,7 +825,7 @@ large_update_handler(void* request, void* response, uint8_t *buffer, uint16_t pr return; } - if ((len = REST.get_request_payload(request, &incoming))) + if ((len = REST.get_request_payload(request, (const uint8_t **) &incoming))) { if (coap_req->block1_num*coap_req->block1_size+len <= sizeof(large_update_store)) { @@ -424,7 +877,7 @@ large_create_handler(void* request, void* response, uint8_t *buffer, uint16_t pr return; } - if ((len = REST.get_request_payload(request, &incoming))) + if ((len = REST.get_request_payload(request, (const uint8_t **) &incoming))) { if (coap_req->block1_num*coap_req->block1_size+len <= 2048) { @@ -451,23 +904,102 @@ large_create_handler(void* request, void* response, uint8_t *buffer, uint16_t pr #endif #if REST_RES_OBS + +#if WITH_COAP == 12 +#include "er-coap-12-observing.h" +#elif WITH_COAP == 13 +#include "er-coap-13-observing.h" +#endif /* * 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); +PERIODIC_RESOURCE(obs, METHOD_GET|METHOD_PUT|METHOD_DELETE, "obs", "title=\"Observable resource which changes every 5 seconds\";obs", 5*CLOCK_SECOND); static uint16_t obs_counter = 0; -static char obs_content[16]; +static char obs_content[MAX_PLUGFEST_BODY]; +static size_t obs_content_len = 0; +static unsigned int obs_format = 0; + +static char obs_status = 0; + +static +void +obs_purge_list() +{ + PRINTF("### SERVER ACTION ### Purging obs list"); + coap_remove_observer_by_url(NULL, 0, resource_obs.url); +} 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); + uint8_t method = request==NULL ? METHOD_GET : REST.get_method_type(request); - REST.set_response_payload(response, obs_content, snprintf(obs_content, MAX_PLUGFEST_PAYLOAD, "TICK %lu", obs_counter)); + /* Keep server log clean from ticking events */ + if (request!=NULL) + { + PRINTF("/obs "); + } + + if (method & METHOD_GET) + { + /* Keep server log clean from ticking events */ + if (request!=NULL) + { + PRINTF("GET "); + } + + REST.set_header_content_type(response, obs_format); + REST.set_header_max_age(response, 5); + + if (obs_content_len) + { + REST.set_header_content_type(response, obs_format); + REST.set_response_payload(response, obs_content, obs_content_len); + } + else + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + 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. */ + } + else if (method & METHOD_PUT) + { + uint8_t *incoming = NULL; + unsigned int ct = REST.get_header_content_type(request); + + PRINTF("PUT "); + + if (ct!=obs_format) + { + obs_status = 1; - /* A post_handler that handles subscriptions will be called for periodic resources by the REST framework. */ + obs_format = ct; + } else { + + obs_format = ct; + obs_content_len = REST.get_request_payload(request, (const uint8_t **) &incoming); + memcpy(obs_content, incoming, obs_content_len); + obs_periodic_handler(&resource_obs); + } + + REST.set_response_status(response, REST.status.CHANGED); + } + else if (method & METHOD_DELETE) + { + PRINTF("DELETE "); + + obs_status = 2; + + REST.set_response_status(response, REST.status.DELETED); + } + + /* Keep server log clean from ticking events */ + if (request!=NULL) + { + PRINTF("\n"); + } } /* @@ -479,8 +1011,37 @@ obs_periodic_handler(resource_t *r) { ++obs_counter; - PRINTF("TICK %u for /%s\n", obs_counter, r->url); + //PRINTF("TICK %u for /%s\n", obs_counter, r->url); + if (obs_status==1) + { + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_NON, INTERNAL_SERVER_ERROR_5_00, 0 ); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(&resource_obs, -1, notification); + + PRINTF("######### sending 5.00\n"); + + obs_purge_list(); + } + else if (obs_status==2) + { + + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_NON, NOT_FOUND_4_04, 0 ); + + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(&resource_obs, -1, notification); + + obs_purge_list(); + + obs_counter = 0; + obs_content_len = 0; + } + else + { /* Build notification. */ /*TODO: REST.new_response() */ coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ @@ -491,9 +1052,169 @@ obs_periodic_handler(resource_t *r) /* Notify the registered observers with the given message type, observe option, and payload. */ REST.notify_subscribers(r, obs_counter, notification); + } + obs_status = 0; } #endif +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age_and_size = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + const uint16_t *words = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer, as the payload does not need a terminating '\0'. */ + + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_if_match(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "If-Match 0x"); + int index = 0; + for (index = 0; index= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 17); /* For HTTP, browsers will not re-request the page for 17 seconds. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + REST.set_header_length(response, strpos); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ + coap_set_header_uri_host(response, "Contiki"); + coap_set_header_observe(response, 10); + coap_set_header_proxy_uri(response, "ftp://x"); + //coap_set_header_block2(response, 42, 0, 64); + //coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, APPLICATION_XML); + coap_set_header_accept(response, APPLICATION_ATOM_XML); + coap_set_header_if_none_match(response); +} +#endif /* REST_RES_MIRROR */ + + + + + PROCESS(plugtest_server, "PlugtestServer"); AUTOSTART_PROCESSES(&plugtest_server); @@ -515,18 +1236,16 @@ PROCESS_THREAD(plugtest_server, ev, data) 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); + rest_activate_resource(&resource_validate); + rest_activate_resource(&resource_create1); + rest_activate_resource(&resource_create2); + rest_activate_resource(&resource_create3); #endif #if REST_RES_LONG rest_activate_resource(&resource_longpath); @@ -534,6 +1253,20 @@ PROCESS_THREAD(plugtest_server, ev, data) #if REST_RES_QUERY rest_activate_resource(&resource_query); #endif +#if REST_RES_LOC_QUERY + rest_activate_resource(&resource_locquery); +#endif +#if REST_RES_MULTI + rest_activate_resource(&resource_multi); +#endif +#if REST_RES_LINKS + rest_activate_resource(&resource_link1); + rest_activate_resource(&resource_link2); + rest_activate_resource(&resource_link3); +#endif +#if REST_RES_PATH + rest_activate_resource(&resource_path); +#endif #if REST_RES_SEPARATE rest_activate_periodic_resource(&periodic_resource_separate); #endif @@ -551,6 +1284,10 @@ PROCESS_THREAD(plugtest_server, ev, data) rest_activate_periodic_resource(&periodic_resource_obs); #endif +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif + /* Define application-specific events here. */ while(1) { PROCESS_WAIT_EVENT(); diff --git a/examples/osd/er-rest-example-merkurboard/in6addr.patch b/examples/osd/er-rest-example-merkurboard/in6addr.patch new file mode 100644 index 000000000..92ca106cf --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/in6addr.patch @@ -0,0 +1,10 @@ +21,23c21 +< #ifdef __INSIDE_CYGWIN__ +< uint32_t __s6_addr32[4]; +< #endif +--- +> u_int __s6_addr32[4]; +36d33 +< #ifdef __INSIDE_CYGWIN__ +39d35 +< #endif diff --git a/examples/osd/er-rest-example-merkurboard/project-conf.h b/examples/osd/er-rest-example-merkurboard/project-conf.h index a29fcf429..9ba0f0000 100644 --- a/examples/osd/er-rest-example-merkurboard/project-conf.h +++ b/examples/osd/er-rest-example-merkurboard/project-conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Swedish Institute of Computer Science. + * Copyright (c) 2013, Matthias Kovatsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,44 +29,60 @@ * */ -#ifndef __PROJECT_RPL_WEB_CONF_H__ -#define __PROJECT_RPL_WEB_CONF_H__ +#ifndef __PROJECT_ERBIUM_CONF_H__ +#define __PROJECT_ERBIUM_CONF_H__ -#define PLATFORM_HAS_LEDS 1 -#define PLATFORM_HAS_BUTTON 1 -#define PLATFORM_HAS_TEMPERATURE 1 -#define PLATFORM_HAS_BATTERY 1 - -#define SICSLOWPAN_CONF_FRAG 1 +/* Some platforms have weird includes. */ +#undef IEEE802154_CONF_PANID /* 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 +#undef NETSTACK_CONF_RDC +#define NETSTACK_CONF_RDC nullrdc_driver + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ +/* +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 1280 +*/ + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ /* 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 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 /* Reduce 802.15.4 frame queue to save RAM. */ #undef QUEUEBUF_CONF_NUM -#define QUEUEBUF_CONF_NUM 4 +#define QUEUEBUF_CONF_NUM 4 -#endif /* __PROJECT_RPL_WEB_CONF_H__ */ +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 + +#endif /* __PROJECT_ERBIUM_CONF_H__ */ diff --git a/examples/osd/er-rest-example-merkurboard/server-client.csc b/examples/osd/er-rest-example-merkurboard/server-client.csc index 8c45fdf02..0c09f41b5 100644 --- a/examples/osd/er-rest-example-merkurboard/server-client.csc +++ b/examples/osd/er-rest-example-merkurboard/server-client.csc @@ -1,13 +1,13 @@ - [CONTIKI_DIR]/tools/cooja/apps/mrm - [CONTIKI_DIR]/tools/cooja/apps/mspsim - [CONTIKI_DIR]/tools/cooja/apps/avrora - [CONTIKI_DIR]/tools/cooja/apps/serial_socket - [CONTIKI_DIR]/tools/cooja/apps/collect-view + [APPS_DIR]/mrm + [APPS_DIR]/mspsim + [APPS_DIR]/avrora + [APPS_DIR]/serial_socket + [APPS_DIR]/collect-view + [APPS_DIR]/powertracker REST with RPL router - -2147483648 123456 1000000 @@ -37,7 +37,7 @@ se.sics.cooja.mspmote.interfaces.SkyButton se.sics.cooja.mspmote.interfaces.SkyFlash se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.Msp802154Radio se.sics.cooja.mspmote.interfaces.MspSerial se.sics.cooja.mspmote.interfaces.SkyLED se.sics.cooja.mspmote.interfaces.MspDebugOutput @@ -60,7 +60,7 @@ se.sics.cooja.mspmote.interfaces.SkyButton se.sics.cooja.mspmote.interfaces.SkyFlash se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.Msp802154Radio se.sics.cooja.mspmote.interfaces.MspSerial se.sics.cooja.mspmote.interfaces.SkyLED se.sics.cooja.mspmote.interfaces.MspDebugOutput @@ -83,7 +83,7 @@ se.sics.cooja.mspmote.interfaces.SkyButton se.sics.cooja.mspmote.interfaces.SkyFlash se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.Msp802154Radio se.sics.cooja.mspmote.interfaces.MspSerial se.sics.cooja.mspmote.interfaces.SkyLED se.sics.cooja.mspmote.interfaces.MspDebugOutput diff --git a/examples/osd/er-rest-example-merkurboard/server-only.csc b/examples/osd/er-rest-example-merkurboard/server-only.csc index d5eee34d6..935bd6e79 100644 --- a/examples/osd/er-rest-example-merkurboard/server-only.csc +++ b/examples/osd/er-rest-example-merkurboard/server-only.csc @@ -1,13 +1,13 @@ - [CONTIKI_DIR]/tools/cooja/apps/mrm - [CONTIKI_DIR]/tools/cooja/apps/mspsim - [CONTIKI_DIR]/tools/cooja/apps/avrora - [CONTIKI_DIR]/tools/cooja/apps/serial_socket - [CONTIKI_DIR]/tools/cooja/apps/collect-view + [APPS_DIR]/mrm + [APPS_DIR]/mspsim + [APPS_DIR]/avrora + [APPS_DIR]/serial_socket + [APPS_DIR]/collect-view + [APPS_DIR]/powertracker REST with RPL router - -2147483648 123456 1000000 @@ -37,7 +37,7 @@ se.sics.cooja.mspmote.interfaces.SkyButton se.sics.cooja.mspmote.interfaces.SkyFlash se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.Msp802154Radio se.sics.cooja.mspmote.interfaces.MspSerial se.sics.cooja.mspmote.interfaces.SkyLED se.sics.cooja.mspmote.interfaces.MspDebugOutput @@ -60,7 +60,7 @@ se.sics.cooja.mspmote.interfaces.SkyButton se.sics.cooja.mspmote.interfaces.SkyFlash se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.Msp802154Radio se.sics.cooja.mspmote.interfaces.MspSerial se.sics.cooja.mspmote.interfaces.SkyLED se.sics.cooja.mspmote.interfaces.MspDebugOutput @@ -98,7 +98,7 @@ se.sics.cooja.plugins.SimControl 259 - 5 + 0 179 0 0 @@ -115,7 +115,7 @@ 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 300 - 4 + 5 175 263 3 @@ -127,7 +127,7 @@ 560 - 1 + 2 326 1 293 @@ -149,7 +149,7 @@ SerialSocketServer 0 422 - 2 + 3 74 39 199 @@ -167,7 +167,7 @@ 25.49079397896416 1624 - 3 + 4 252 4 622 @@ -180,7 +180,7 @@ 0,0 702 - 0 + 1 646 564 2 diff --git a/examples/osd/er-rest-example-merkurboard/static-routing.c b/examples/osd/er-rest-example-merkurboard/static-routing.c deleted file mode 100644 index 628594892..000000000 --- a/examples/osd/er-rest-example-merkurboard/static-routing.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * static-routing.c - * - * Created on: Oct 12, 2010 - * Author: simonduq - */ - -#include -#include "static-routing.h" - -#define DEBUG 0 -#if DEBUG -#include -#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(inode_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); - } - } -} diff --git a/examples/osd/er-rest-example-merkurboard/static-routing.h b/examples/osd/er-rest-example-merkurboard/static-routing.h deleted file mode 100644 index 0dff0b7ba..000000000 --- a/examples/osd/er-rest-example-merkurboard/static-routing.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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_ */ From 2441cc38eeea514e9e98cc40139e6790b56d1107 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 30 Jul 2013 18:45:44 +0200 Subject: [PATCH 074/345] bugfix led button battery --- .../er-example-client.osd-merkur | Bin 393919 -> 419560 bytes .../er-example-server.c | 17 +++++++++-------- .../er-example-server.osd-merkur | Bin 398165 -> 425544 bytes .../project-conf.h | 9 +++++++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur index 54abbdc8e74b60cd790fe0abc57055fd86203874..7711d871a0bad8dfe8604e0523da3e159a0cdcc5 100755 GIT binary patch literal 419560 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�)Cpw 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 E2WmhD&Hw-a literal 393919 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�@6oC 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

y(!h^w{fn%{48tMi(-@1yy#Kr`2g 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

eb~Pl{~*z8 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 u%SX#@8ekexUaScB>xv{*u2&N diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c index 36fbb5635..fe5240ea0 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-server.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c @@ -44,19 +44,20 @@ /* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 0 #define REST_RES_HELLO 0 -#define REST_RES_CHUNKS 1 -#define REST_RES_SEPARATE 1 -#define REST_RES_PUSHING 1 +#define REST_RES_MIRROR 0 /* causes largest code size */ +#define REST_RES_CHUNKS 0 +#define REST_RES_SEPARATE 0 +#define REST_RES_PUSHING 0 #define REST_RES_EVENT 1 -#define REST_RES_SUB 1 -#define REST_RES_LEDS 0 +#define REST_RES_SUB 0 +#define REST_RES_LEDS 1 #define REST_RES_TOGGLE 1 #define REST_RES_LIGHT 0 -#define REST_RES_BATTERY 0 +#define REST_RES_BATTERY 1 #define REST_RES_RADIO 0 -#define REST_RES_MIRROR 0 /* causes largest code size */ - #include "erbium.h" diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur index 4f434e5d6682d25ee51c632a4bbe11a2703b0a4a..58280059d9c7db942061ff2c5be97662074d6193 100755 GIT binary patch literal 425544 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 @X}kmiLhKbu6MhmfB-k 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 z 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%0DJFf{{yDB|Vd!YnrhYTN%aAbi${p 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 Date: Wed, 31 Jul 2013 14:32:15 +0200 Subject: [PATCH 075/345] bugfix hw_init() --- .../er-example-server.c | 13 ++++++++++++- .../er-example-server.osd-merkur | Bin 425544 -> 425736 bytes 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c index fe5240ea0..dca42a593 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-server.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c @@ -784,7 +784,16 @@ radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } #endif - +void +hw_init() +{ +#if defined (PLATFORM_HAS_LEDS) + leds_off(LEDS_RED); +#endif +#if REST_RES_DS1820 + ds1820_temp(); +#endif +} PROCESS(rest_server_example, "Erbium Example Server"); AUTOSTART_PROCESSES(&rest_server_example); @@ -807,6 +816,8 @@ PROCESS_THREAD(rest_server_example, ev, data) PRINTF("IP+UDP header: %u\n", UIP_IPUDPH_LEN); PRINTF("REST max chunk: %u\n", REST_MAX_CHUNK_SIZE); + /* Initialize the OSD Hardware. */ + hw_init(); /* Initialize the REST engine. */ rest_init_engine(); diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur index 58280059d9c7db942061ff2c5be97662074d6193..687929672736bd49639bf1f37ade4458910a7b3a 100755 GIT binary patch literal 425736 zcmb?^31CxI)_*S2rlBQGgl?3!=^|TclTuI_7mA+?I7*9(iW>ztP=o@`D9Q})C2iAm z&C5#~Pz0(XvMAt&2*N`}K!w6=>bUS)7-a9O1PTiD|2yyXH7%ku^L>9Y&3kt__uO;O zJ@?#m&b^s`(``31#tiy@Jq&jm^ta(ioO(9GP=@c}2Ad(mFv!r?U{&+~rdPms{Bi9Q zfoG~qpCd>!^x)LI=a504$S(PhoJ5+DQ$I*HJf8B)e1pM>9H-$j{H0IV`j4Z&!BDDx z^!%Q9qqbxG2`t8c8ISfd+%fYHPfwfixb3DH zlc!97^bsT!-4=eiVvg;KIYVs^Pn|qt#-r11SNy?7FONR_q;2-(ryr&FG0)kae%4kp z^O;9yX8q#zQNh^v&iEH^iQQbY<@ovw>+|a0SigC_ zwfKq;rT2^AP>nciOR)Y{IT%9)q*2J0gg3!j6gUx20_ z^t&>W+76eR+&o(zv!7@h>y7m`3i|}2ZM(O{yU*L`-Qr#2jS7^?X1|aU6{zzq@e$20 zrnpA)2iWgb`u2AwgT^b+*2>5y{xw^ElNC;y1S(fEL(mkuRXWW5#BFEA2WQK#GqZox z978ZEj?s4;S-n?u8#%GuSj%E3r4cPPlr2DCKbp9&FpT%bT!6k}ZXIJ4{6gLkOjkU2iv@d6}0I|XLcy|Y})Nb;|q#hiOO}=x zf(;StBCN`UtULXW=9I_{L)Q&m)ACvFnwEd&zG>THlQQ;ZH1u89b8FANJ*^5!xyeH( zwfrG>QcD>=f!rCk`8F;?$e7%BR!_dC&@)Lb6CpMAZSBb-tbj~)wzAsfCDCt!cgA0~ zh)uAKS1zbD;Oz?st{k{=Am^ff>Fta~F41EL3+L(ZCwAm*9N1v@+Us((n&I{aD<8%F zHSLg7qZ5tq#Zrjo+L1;Yy7@A0GVkUwv!Vjuuyf2=#-SuZ zFiIEdkBjHT3&FBC2H7=8G%iO`iZ3faA0bum_hQ9cEBBP#WnNE%=Pgf#YoTkUYa=+> z+rg{n*e&j&s>xNetI*OTU0dSH_|BG&-``$HZ8-(KrE|%dT1$&UbgzkCF~gY%k<^fu}OV zgbYEW%$=)lSj7Qfu7ff(-Eu8d85BwWN&$m7V1(c2U_E*y!QoBP@#T zfJ3J8c`loaO3}D{!;Uc~S?jBXy8Nb-A1+_L{CqcEVdL_Z%PWCLrMuGp;xY}>i|P$) zI=Nxh>#Mrg+p_%4<({&NVh`#q(d%{50tm)exjS>8XHoVf`(;v;zo~y~|1TNv7`F4| zb~bZ=3D$t@Ime&@Oj9mq>#7J$7shUk*@I+F(=_?kf zKPR3L{lPP=?d5|n^JP%b+@%eH2Av1mJG2yieHsfXY*EHQL%eO(VwU{?$=o8eY?@QO zLZ69*>oFECSy;804SFbCvI6v}aMyYC@+6@P|BZ|u%6`YjvU^!=&I#Lw)@kfSR(qBt z?~w=P=4TB&=kO1fLhM-V`81CA%FZ}3B1!oy?wg3ip*j|mlwx{?jq5!rY=XH!L%+j~^XPWB!nEy*-THn*mx*FVC(Fn^c&7E7;R9sgnE($kkqUF%gdkqwF+ znYNR?!0=woQyy3V&QM0!w6Y)aZPR**bC zdIx)~nYg57Hff35*xy)hvA?)l%`-{q^%_qd>HBlfiXRIw!k_(SpGZQ!fH_MugtYo2 zm^ma{l0r1Aq9lFxy#Xry6uF3LGLdTVWx7=BB^^cW$-*pwq*~XK=UDB*eV{{S;Bed1 zu7_PWxvp{za76`L)O`qX*thH`o7@jGq;PRnO_frAuIgx2kYzkLs_=JJgOTHzxTJ7FRh_$y(fD0(A9n}Y5aeF#&USBS zrS&hkJ;>Wsf5zS73bFynx!#rIdMxXiEKkh~H5I)VrYx?jsk^}P>wj8xcvXdX z3FUZTxnOx6%F#;m)AGa1gDe;2u3etJd^>Xk)5Xhcmaoiu#oxwGpv0L~Ez4JZbe;)< z$Ii{?Mom67^q@m-HlIxWl96VRb$C<@y?vr;W-DqwsHu#7F|AGIbHT;A_~Al?O`#nq zy&XHK$S2J0R9EG|#X_w>TxfC5|Hv0uQnJw1&q?E62c2?}tI9Q#k^W0uX$_JNJvMZj z@xn~zm3!A))lp5A%)zEmj+`f3>#r4a#nUWZsAEIxl54AK7S*^WEiTl`A)R-|3Mty# zR2Jpm+JA5V!7F~Z;^l<5jY-P)tWW*tjUN65eyVwH>PhyBd^+$$U?sTjMDO;LkC_`7 zH9)88A+3zvm{u8RZnKpQ$+o#qvb^B_VXYBSis>Wyp7z2MvF&LQ-jE>YnEcUvf1Y+W zG{Z?kSf#t{|6?C!&lq@`9gJ;Lr7!7egR)0v-rz?UQkEa8+`o#fL9yKTW(u^^H$n#Re2V9rg@(8SS5O^D_h`ss_f5Yud&Exv;PI- zaIH+)qOxga&mlFoIn=0@;}?`Y#s8T<+V~~ATg7gIirrl*c6SDAeh5pGD~>qi{{JUz z^H*i8YLWi;k9wcrAn4`=kd&f)ci@)5RjS6mx2>h&%rcuQ>4~RpO{86B#OA9! zy<*u1%W}kP#UHUgYI^e`HV{y_`8}nI*oA2;(>A6J3H+t)=(2OmbS?NtcF+F--@TW> z_p(lWdj>Dc+G{HHxsrPqe6wdG~K#cwVP?H z?^M5Qd6#Pk_ceDwR^;90eW@4Nsd~aaQsRYwV8`^7YKI{0c2L4d zF4PpMj>E0jmnGG*<(r7|_oAX`*9Z1%r> z8MX4LnqQ9mUMrGUP!G!0a(ez_YQ7u!QOlB+QNFud{^Q8^lySfzw_#L6OhZaTg__^e zd?HuJbE;a#g))Oyj9g(}mbR=)EwiQhXlI!x)iR}Mr*~Ou8MQ;!wAY}0X?RXo^9j$` zvP92d&+k07-STIs`R?{U($0zd3Q3piC-f4w!RlA1mV2%FNM~C!Q5L(c_B83j{<>UY zXtnvJ)RkEqvo6POfC*NikWu?wQ`h#R{0;rr^)GHJk!#-Y%CE<7h`jA&Wf{?a=(6jU z^;(v^tW+(3uuH!mLFvjecl*uKHjK5$yU@GByTRL6u83LKe`WuT{b{yU@QvVripfG|M{sK!^m1hvt5&g& zEwPl?AgQ7TCk-Al_?p4)ZoPOM7*&C%Zk9f~FO1P$ofzGxV)PkWyc9;;P=_%39Qik@ zSls%*z^JMlMo+33m9|@@MvPk&pTrO0ui>|1+^V~kn~rkTz&u9E@m%kT_Vo9-n!C>i z($W9HUQgZ-{p#>_5j{_R3V4+E8DM#`)0Mgw=uF~F_6gFb@^ks`*+arOp@w~`YWT0Q zo0IOrewXC^nAnMFy(F?|a>v3ltNY$2Y=zhDUz**6_81-}3ze{?RvBB^w~TA*?KS!M zqNcVvRa2@O*$3)Q>u=-qGF+3cSL-Q#Dlf0p_k|kNYDRt%k`aW3*&lnuIp!6sV7IO` zTB{6IX8#TOUf9|=*xEGPh*zw`Tdk4oZe_ezWtwD>BFoUkO5Z$H*pEWDaoA}q@+5MIeB5?;;VbniJh{Aoc}jU|IVW6(+C8H@*<(XCKym<*^Kej}0_qwiv%je4B1Z2d ze{VWK9)JR2c+`!VBNa-0bpNyJ2;37%7;k1zL06?QS**(YT4tJ*R%rJ3ituE66w;ze z@3*LWKjBgb9co3{2W3_6MeaA;o87Wd3qGkcINEMw*~T) z!_UaIECNu;8)gbM!vbFc&xJ>&&^LICj&ilf;X7z_pSR-sC8O(nZ;3zR#okV%CD#(> z;*U_GSJctcbEPC_-R*Ufj?QyF**V-cZMA1-n-w zjh^(<_Li3T_Lla@_Lf*@ez9M0>CUn zUo^X5!GR*RH2HhFj^R_10po7LxWCVyd~kjtK{WfTqR%k@E3Q{)9y}oN$HJpIq5If2 z`C&D2bs25G+26UVABB_An%VzlACfuROfv*$DaIO0L(|e9mzw=2`mi`_#9#%!L-|?x47^qrpMcr! zHQKuHJRKre1AQs)6IwzMfqtnbm25-z)du>Z@eW`_HXJ4|kEh z^IbDs6WwFn*SLqc6IDO1<{gJcuIII|+op$7R2$4liFo{}{UzX@>^ap~c~X2Ix>ma= z^;>qn(}H^>`R8akpaf=^=ci8I|1?Tp2~Y2|&>6<_b;HJnhVs{`cChPQLtRn+$x*YS zw7vf8x#l+vhA|51?sdzq zcM5s+Ra`~9DRge@n4DXO391h=j5mA+ZT_ts?;JK*;f5tC6`A0dty}xYD1IyLL6W~KRWYTvfs-&y-T)vo{I zf6?}+X0fyOlN~l98l|U%c^IW{y3s!}IUzcxcS_0_MmjY1vBGr%`Dh1KjjX!0>i()h zaU&ycjkrG|M!7|zh>WXM-o5}o{P8V$^%Z3c%gC~-`O(Qf2|s$-OJ%i5OHAZTAFzM8 zJi?Xb`cz#{26;w$ZuQ*n(N~6l!ajUYdryh9BU&M71$oBxnCfjOTm9|pA6h>K+(;hu zhtT5fTPn+5ETfe!O4%ue$DtyAVdToljgglchurpvcItSda~Rl1UVk#8>*20 zo3VLu|H4j)Jf5f4YIclkcEJ2j|2nw@R0e zQ22M0E#F^}TPiQe4LD1kJ5=h9W%sd)ehYi8?6tAi-`OW@{e@qrY|i@Y*AIfVoG5!e zD4Vl|X8wWrQ;`;BDod7hIzOv?%4jTUbi#em`TknvFYI>j1K!bn$M-ZT$9IvJdzMnm zFX5+_%`GF_`?d)6O`VTV_q0g625I?I4$%yKpeN<(x(JoNX;5CMu4PHfnwBjst;{UZ zyz*bf`DEFDHSOIr-O};!zm?u~9UgAoACt`wf!yf5yYKGmg8_BzH~TYkqXL{T%i16CzL=}o)zU4@hr}= z>}G`5iaZP64R}wKVrvo`4ln&_DYZ#0?Ty=wznVrcR@DefRE^*=NlVxFHSOIzggSkW zu~?L&HfA_H*?CHJS>2>+H`TnXugUurFXh;RbK5RWfok@T-0iu~F`|^&eR>}u>;&YR7lSI3U&1^dM3b%P4^w6GVIig*Ta!-7}p>gf9n zqe!9k=OUyX>|ORMdd(s>vuO{_FC6FD!HNL?o=Cp=P;TqcW9IXz+mZj%Fi-YK2uwGwe=hU*~(OF1Z6~RnezaO_D|@OhuEjy7A(%=x$l-+<6`jsG3lso%%>R z(P_K3$E1j}i}~;Y_9T0bg{eXIret+Y-(>|&)Q5BMBhC#~dtUNX$Grrtu&!o7Lv7rW zh`}Km=Miz_ebmP~scpwEMuo8aWrQK^yU7!JaogDvt-P}o;;Q$$V9=yuP#O1P#D-8M zY=4BoH09flmCYI?JHmSGGBkWIh1hI$AG>`wQxq;lba$ULP*LB5l7)5AGKe`(2X03&~nRI`^siHOv95BjP>TO|83CDNg$=nim>9?{d&OG^EI(#`bCJ zkQVjXt0`I5bc+6>89D{o_w!vDt^o%%eS&5h*;55K=hkBL2-1LVE81@MJ~Lu(RpZ*t zru^`s*k*gSS8KloTf(Q%u8^? ztrw3TqCF%u`kWf<&r+mEuWk)h0*)q8tP<(uHD?W0CVjK^MUH+-@iK>00s`dpdT z<~i<_+d6D7L#3%#Z)gj{NRdbzf0N(BYY}RKQp=(+(?~*)tR1f$@|^WJf=LR^22+62 z-|2*HYTMh`*0I;od)f{O{-5n=v?xF=PGK<9_Ao>x>fJnM5L}TKp)_(FG#BZ-?`K#EHQ3?PVws{4kes5Mky2E(IY>%yS+$)zZ$am+(mo8Y5a3) z>;T2Nwj%!59jOQvh`KZdsAi6EtpLwa=E%&*W13#H-CE<0P-Hj}!~r0eQzokU9C=Mv9md%dnPW_q`7B({DwJZl}AnEYOkm zHqzdS47f|(G$LEnxvWcmiVo$3H7Kz*@(iOgn%vjMZo6F;c+kul={^u_qR8d>c;g~X zfeOePZJv@&bnrl{Y~#JWgU6nzBdWnR&ly`EsE5DB6FV$$ZHX&3D$so`+1C*-F{sN< z*zA88F|9LGIC)yr&ETFscryF%L)y0F()Id3!ydyPSCg+}_G>!|?yz6(tNJPX1kL`( z=jidCW`El-tg1QHEn$q!{*}XIAsu$P45KMv_TQW6MJqSu?}o+Q?Eh<0Mdm~WEx^u6 zlE&xavD?rfEh{7m{LN|KCu zGo`Z0?4OcGeV&v?ZO`tulPW#d9kvIasy@z2zSI@xtm4aE3C?Psb6d-6c&EEhc`aY+ zjw`R@%iRg(h^(rzR#GoisH!%s?a$2q10!T%JZNzTXdw&#gQpwSr&)NKjVH-F+PKGi zgHiSt8WnF5tSzfj-p@4%55l7LkdbDwCp#%*IAnp9irzLc4iU&^|G3#z=+l5ylDb1L zA-^*Y=XFquq8Y5gzdAp1o^l>=zUNGETHOZlaG!D=tj;-LwAbk<5baH z-^rg9N5UiT`Jo<|-JfgNQ+@E4qdVv~cL`D8lv95=Tm-e)Fl5gW|4VVBlev2 zh-s4&9Xs1NHSRR6BYIJb+;(3jL~LlS#a~nCZi!ZgGRf?JcPJ-*lVb6$i?;aIM)#Fo zzvHcO{e3;TQ;6>&8WLZau;W-8?G@HVQylxcXii)ky%Z^Hk#e4?Q3w-$D%AHGt*4iY zZ$-O*@XBehn5_ZaH}TQnkCe`{LwEc*j^o|!L)6%gHz$0c##*bM2Sk0->V$P7REzpr zH24UtUla|#w@pTy3fj~l)IGzwIN?p;wMNBj4e)w1`qwe#gtwyMQ%l%jj0tUO)N2wQ zRyV%hEwX$y;`ZN)rWo9pkGw0BeK%675nd8X69UF`C9l3Y;iPfXNev5bD(9lnHTw%8 zh4_2D1wDdV>~T-YCcGW(5Z;L?_x4>B-;wZ6DoFvW^=ZkgX5^;^VMQjn<#pZ>UP6)J0s~9zt z4z$7Uk;zj0=YH)%i?BslBPg!#fuVUkcNj1ufZtT%cyBpp6!-oya4PkjwzphZ=u ziChyWj%Su83;vcKq}h2PnG?pdvi8fQv`J}s3)`{}T)xE1tXWqST?4IKL?=D}2znBX|2;jc-!3oV zLpltisEU(L(Wd`~qG$YEGbg@hu=w6G)PaU?8+_o0wFb;YgZpjwMz2_6c-Bu5@moM0 z2{T{|C?Q4Du5d*g@t#ePQyfB5N`cUvQY7q8;qdOo`%=8G#k+1Nnb@|0eTMP|=pVF4 zrw!%I)FDdIHgQX|P1qW}n%xjPK1KF^o1%EXOEC!Fr&xr2DKD@% z$#$=!;Nmt}eM8E+6ix&tA}|qwiMT(-c6DAvLE8%~BR12Xk(M8w7uc!VjL3GkG;LiP zCw`0a-=X~XD8Db|$^gZ8QLN1k$#+HB34R2&Ay37Q=aB^+Edw%JbiYBrja$+%BE;ht&#(qMsXoBX8)Ynmq z(row}6?i=WoPJT-D|`~YV4zq01U&F@v}d5%AAc9E#O3G#7w}SACMSN3S@%h2E~PHW z_9B(*lFA9&qN4);WSlq!Uap5(u~^JX#L0}#NTj#^glJ1nd=fF3)%bn_I|*w&&vW85 z_*L={fk~-TJ5wL;lKL3DDxCNz>^z+K2xc%R98ICKESxZs@$Ee%L5`RB1A;uWsQ?tb zDr1nHAMbSBtJw3#D(Q}qidW8Xm=H$E%L@iF$t!#89d*z5l+6D9DHWMpPwLRLb1{7` zhUZ99*Bqm2B~Q<@hDh#fk<~gDTvJq_jIe+&ld#Ysny|u;WHs|SaU}C#TuA0PJFv|} z$0A?9e-&$)ldHK0C2$j#McyC$%Co9rJKMbc)+jiAS^@N20yL zF;OW;WU>c6FV7pSc=D2zi~|n&E)@?R>rocoZdc)VrCO9dF~JnNR!VdX29J(}W|^Ow zB_-u0h062zP){j7Z(7KcH!-B+KDZn1dTKg&c63G*=*1uRAsSHcTi2HOgt1CIm2iw! z;SLV*XvGGsdPtf0tDj8~!0R3KXit=2KTTb-{#ifa7N#hz$eb`6)W}m$sJWYMc~=|P zwJq6F4o&~bRH7n{1kuY1i|t=iwH2Ep+h~6j>!XNrEq^>_9XRUzRiF)V#lltt&R8KL zBNdxVc!a`gF0K;XnV`6F#3B6&PgKFfmECyeP#khxrP$#oR1P(RLE)93vgPxaCGftI?>?+YEVh#~bx%CUCzQ^YtlK3JAr`H_7R0 zNs4$`g}iyGUg1xvONBqDt`+8|>T3d0MWl*I73Zgx+iNGe!BuqfEJ_-1>>7+8?SV~m zXl!VOCOb}7YA0&FYws%&C1wO&{z>v;@jdAHv#HZ8Hx5z=t?d2AVp~!UnF7V{+ikY zZQYh?byyW^=Co6sunDyJ5VYA0+HC2h4N^s!;;Y6RVh`%EZ z><}XM4xtkt(iA{i^X3`yM$XI6dJ{#(xj-RX|(@h_3mg5-Jvtq?BT}jD2{1v2ZBG)$z;; z9QwDg^GphZyhcxAC zI>(4p8UB>v+N=hL<`=6Tw|8xe7|r3!*cn~u3A+$X!jb?~$uhUl<&C*A*l;g``i|irM>7!e5-XkgyroyE46Ctk<7sQv_ zxqv5AkD;e>Q!>jDSxx=a`k{F@QC4`KdF-yDnyVa&#VOy5bDlnnv#->`7K%#`t&@eK z!B}VP_gr6CBX~qQmGX5PmBN`N5p!5Qbrlu(7Ng9urbDgr!$l?XjC=l!(!6*up$(<6 zzI5!Zty$sy?|+|W@y$-XRDFx@c*>>HFO_ET9lJ!?-`?}nI?Sm&d?F>|kaLNIoi{h$ zH_q&T5TkwqTGImCf40Y<6PM({BJYABXbp|VH|-%o&+$2>4ntSR7$1G(K*51wR5qL|}VHwoU@*@IhRJvl6 zGLYBWNHeGUq|)R-{wB7Y#lT*jk(mlxoJQxDs;aAYvzzN5 z`QgvNE+do1Y{~N4K$1NTNfrf*@kBh|*YSKmo*(FVeh|+OA?{T>_t`@-1+*Ort-0j6pR15x zm^?(Q@itnKg$bx}x3T6(pm{Uw$oteNh)a2($Q2?}}3^Bm>J!@gHjs8Fiycz?-N?V>p`8q|GZ z#EY&<*D>xq=gDqp^`L#y6s;i_G#~8^UM!p?+v}8^Z#!Rh)~Y4Wuz@v>1{NF~+R4Zd zo9yT*X-|2MGt6D%ZJ>Tow8_>}J6NxJlJbQI?`mFvvSWwks+ds!pgjU7f{)l0O z!I0jI)Am}d64akWJNde9gd`zLCN#}^dP$V0d6$VgCS_LR@k>S*Xi|j6xEkkh>D;d= zG)g+xf$3>G`5qxDMo=`JMx{$(_PO1Yy$(?im)G{G?OQ9u*Fd~Pz6FwT#hCxp*Kj}0 z7^_~G3wgsX)f?g@ZMFNY^Sgxe{WwWPF@ zNtHEqlPc?sQWd_d>MoP2@m*b~^Rxv%KZ^Kx0#r*IQOz_75S5T*90`9RaT)xg!D(%G zpj=Nrj;HuqQ|R~bpcHenxEnacn^bRuCeS0e_Efn4(@`fW#5L_e9MB8ZB$pPk7i!MH z`?(;&a>|o~oqByKB7XZS z&HlO((TG|gZkcq&$LuZmKnLY$#@+XIFZWc zq3kfV?8SBI1dzsgu<`)<3RQA%1FTOW3H*iiAC697RdvTU)fA?D`x+< z!$@jq+>s_)fFmqmfFNL(vlEi#Ghi?oJM+f}SaE_!>qB~|^w{Div)`Lbds))kG?~T; z$5G=%OuAfpjn8Nbt(DT{GCU=Q=$5NBThrz8>nS~DYpr_1;?B_h0AGaUa_J#C%Sw0M~wO3V=O3D3&iB*)eX&-_0%_wbG-4JO>!>QK_{DxbBH@I-)`^HFCmVfte}va+m%z zqCdOQ%U$?<5%VB&zEJCZ0j|mcp1CTXR)tD%!mgNdhZjBkBBshwfpsZdVthyz>?rS0 z%TqM_rUAD}UDHg;jet(Hv9^xkC-OG*!h!Mqj78Qvlf~#D?tP)ta#5ZAn}Pm4lKhA0 zM`Hhw_RD^j!=LOGPXPbp&_8^Dt#c>MrdgoB#y_qHyahI4cZ@@5jM3Vu0VSwRYquVZ z?AC+ds!tY$O#^iJHo@K7Ayo9{?+zBI@Y`4J=7i5xDt-=LLx5Gq`Fv9?yA~t@qG?nb@who37r>cj_NJ`=e$r0PyJJk(3>&3$78fRsGH#%>hGvjF26JYSCZSr}Z&L`5SGm zA-=EB^Xm?7*u=_D1mw|2?vZWBF-mL}+sXZtGy7L(JFy-og)YNtvs%LHtH z6v#cGV~oZPZ3VJEb9G3OK~1)_HQtyxSRosyLAJ`~PD#r@5Y$>a|9+#EOKa@o1AdL0 zB&_n(ODilq3=~S1HrkRDTAAY|LuOK_2cCLJ^zIo1`##2;_B}-D<%~4kn}+s~B9Ob| z7x%k`HI=S<$|&{zvPNIzQWe3QBjL(-=L6eNr&uuVFc~z=T=Uwyub3+$|aSxm878;{_Fl`O?M}2 zNk56|YWBTEdp#SHbdAXtn}@ros*_$a1rDL#Zrrd{^ zc%l)}cvdU%Y{k_z~ft?Ia0%?)`fvYnz6iVFuo+?jD6UivRUw z&sBEE?TeV)iM5XL!)gRF#rSEh?oQZe6hd@<9#Jef`!UnfTcSCoo?KDW>5TVf*t=n4}cpZ{bbZ;cxNhMRcEPt$yF z`?zAhSbWYhn!kfD66ab9#Ahv+aoBw1DB?2~S^T4g)z{7PmT=;qEa^oyah}By9E}~# zOq}Q`!ATdcOIroPvz8)Zu7wkxM(!Uh#lmwIqPL891@A;DuZVB)>CQ5q?AFspY4X+N zf9Kqd>i7^$!W%kAY##2EBg-tk+lFaA`+jO)oUwJYIC0LU`{cUAHQM!#>lNJiNjQ^4 zA~>`f=%;uHGyTL)SPIikXvOGV0eV+%_uJ`gjLvIE5`IRMHSyYX(OQ2S;xE^N3zmWl zcsUXGiX{dU>ihdreeuCvY_iI0eR65+$zMR$I^3OExdN9+(Hx0LcbO>422+3rJb65w4qE_W)8FAlU#Z z9gs4tgll`}8K`d|!|2RppCFB2n$%Z~ACC*tt*zwYY9O9b?<%qeSFKB<&zY8jx_6abZYr=|Jo$ zw3Ha%H-z1qt9xoxK)ZR2TA;JN;}Rwr4JUC5UiGv;#y`W~oNy297}R2dv=p8wfzROc z5pmxPO!ouJA5~0g{HSD<(tvoD*9Q)PpGW6a@~6@1MvBzecqD7i8AebD+6p!X@rPrV zIC|fUk2QZu(09W2nT$S0z~ zpjktf@2`_JKVH|=b8HT7E4?`Hoa(F7{A2>J^Eus;qT9BUqDkxyWHM@m-<_#Q5SaKwx3jJFLnB^wH1eMvq_K3i`c82Wps|RuS9;X$svMjfi_Oj zxQM*MJ*9LS-Pq9{&1Xk&e8&uH>9~n~9yBCv9i`e@FLAO1H?8U%8P=wbv3R=?5eKL3 z4feHmt2*OpMW9%n#VrgPA8|#V>gtjSM=x2uL#ud*9M20I*Nzw3d4??d7T0Q>?pY(ZDdi?6Kr(Wpn;boGJ`RJ20Pw3W* zbth$DrU1iODPGl<5`vU&RnD_WNE_n7xFF#~CvGgTJnwFta`oiX5~#KZRHHrC5LkaT zt&Fv*XL41!Pch*QA?h3TO4apXnI}j+5%r`|gnCbX{i?ICwTwzHVuzV6*l>EmubeH? zD6P|n+C*EhS7{^JTOy5UBy0rQ87ex_71!B!Pn(`j=UKT9&LEG=9$+Pb8ibKH9{Q|* z(@wjDKjd|t_3+JKGIc|@)b1l!*%=!E-yZINF)6>7`bkyILKAsojxm!&{tePeyPn@# z(MFc+9BbtPeQbN+3>QTaIJ(r$#3=NrCr`oGA%duB#rjH5r>+re2EAjJBQofC4PThU1~!c&50iAFi8Jh437ZkT@BSm`t;FD2ao zG0L3_&n3ZGsOUJB%k{8X>gS0y8tB;dkpASF?h3=#pYl32^sdrLgDm_8+KTAL0g)47MQaC%d}X(1ta+ro)cXf9f+QhG~dKU3(@4?tSek{i+1Zx zqq@qG))8JA4`QV&1{O}2sICBd&N+6YYXWXkcm`7Hmu1ZUeX~ij9>8DRK_(2hx)2jY zr!W>Nw*8qnJ>Wnu^Q?5!XlZO9jm{l7Lc^0C;&3ZTYdvl-3NgCFtqWqkNRJ8>pjHuT zEn;*FkETyt4h?u1VC4grnC2DpA!CPGDW<$g%!5RBsPJe_@Zz1rJMG)F8dAMYn1uUh zijDfZ!J)Nqnx=7+X27AG7v-qN2&^nuT1hvsDw=LU5Jv!qD^=K9&ycpCaQ7tJfVBfy z>l*waJMMPHuH(S?)^Rkt7 z1jKw~WNHwOow(3s^;vy&O~>-i827eS!^@<_7i46X9uGfPcX=*75l$zsSw47n7(RLU zIIP@$4s;Lq-78)R3XXteJeQAgJwY)c+d6*De4(Am873L_TcDvGNIr!#3)-k<#g2f_V*^_Qt~br0v5QK! zn#fwBkCHypG`>3b>_81I`b--a+k>OvH5hKy;!sFph2?tz(h(VR$(Ao}cSnbgD1#Ri z@Io=LECJ8F$fyN6c{EnhanPek!@Ni~e?7P0!AXVRvOV>$#ja1Y?WbQd&|+L_1nt)s zNCSE2q&`~V*?%VYaIU72r3^fCV$cfEl4-uFd;% z9rm#jdFK7|3&}sA-M~v6*=4kv>Q(#N&9K1;3f;=5?Z7A=!t6ggd*=jZq``f*Wh7nntG!2^k?qt#KEfIb09!`*Ut2pew zYhNL)(Kik6e%CuVL+#ZxwO3>xrJm5YZWBqge*>E{$NOZ@z{L7RLSk@1!n9LKcuETL z@aT^`)eq18f=)b}P9@_xIq1Uk*P;G+?jIzt|B6rwo>PKlc%Bx;UhHk=6sJcDBTG;^ufK;FJACODC=GJiA&wC9B1mHGNke?Fr70GF4NX>6Zy61FLy|zwZO@|E_3ez-5H3%M zcqAk@De|G@v(ZCiufvXlR(X;#S##i5Xq9rm%UaCHCSU`f76b1R^k*k4=z!M)R?B2q zH|kod+_i|h(($kE{SwYVX?>2AtT^Ma8`gcZ-*S`A<1_~;LIQe)@NR|^t&-h>!!w^} z#mR?hxRLP73OElBN^4qH<}Q~% z$bB{A-3;v(`euy7p&@67aKgH{YS>lR#ZAE7?sNPDrMtN9CFZv*&wWN-uhyl~RcdL2 z@Or#OSP@Ti)rQm_SPi0LlhVkFZd0DgdMxWFN z@v?7qJke}w6OG^o%w5g*q}9#H^a8s8IPu|+Y@nV4)Ef)Bon>TYDW+K2KXX@_l#w5O z26?LKH5%90c*YysBP2TUrlk*)xcvGQoK9w^^p+4AjIugxURYq)&h+bdD{BxezK!6e z58`y3aHdFY%i`OBbS>`@xg7WKmSzMpZa5#^*-JWewYjt2Pi%jQQbIQ{9KH7pe$NKy z0pq%t-O^c>X7Hzsel_7n^;Z)}!y07IEQxHtQZk}I&U9}ZB6mv{^unn z8JX+g8GS3BchJuA?RXF5j@oMCn68F)Ztt9oEq46D^c&5<8 zYkaVXA)>lzJ?kw|PRlQHo;vu9JQ{YDKV4}9PVfq0bU(h3p`QGHT&ipFxSY7Fn(jSy zI*K}FEH6}Ir=X21!TkYnx#I!s07=U);K_D!GhnQ1)q2?L5Rl9}o?F8`)4Z#=85NS5ZdRj~yZ2BpK{??bf`)Mw58`ZW zoM(_JR3j|~2jk31e6>)4Ur{hArP86Jr<(XC8tI_|oh)$8_m=ROan@ER{tgY%>@z8w zCET2ar?IUr_5D5RDoOiAgv*0Crwaa*JT>Z7u`#7CP){U;Es$m25 z%3P6mv=6_eVFjFO*y6MlFW~UYb&rw`sc(IP3W>@&!SN_NVM&2n)}_~`-)f*#f_ZuU zT8z|E%)pHE<}Um!2ww3A;C8T+Q&svvy1gC8sq5pKI8QQ3Mv_`|f^!q(^p<=tsJP$` zl6k&l+AVz;XO=3CFKKxlzwNRXWh$C+ejd-2ITd$s$OWu8J}>cDlsXB21z}izP}aM#*wu z`&QgdIYqK4-xxa~jeZM@upNsN$F%2ZWa|D8V-}^jq%n8hH%^y`1K{!a47&Qbj#ZU< zY;AqUHd(QuzAnLO2Z{46&?8=tf6O*mS&LO^DOROK$tJvY$x_kCq55ydd1bBkdi4Fh zI2+ak2i63#8IHsp*H#1C=WRG;KQgSD_^<$}MOY(r{ar8R6>&qc_zI%$yRVIA|Ku5* z@CIo7W*nU*$Jx6p@%w#PFW-#o!JUL}iEa?Nr2xMJCeyuL2hDA%hj!tdz$JgrG3;GM z#ANe}`_2Br1!NO?3+wRP@s&q7@g30N-S{ZFMMIs(6GNp(>zni_f6_uTj$R2_MY4c) zlbaaL%9eatxCtKhn~m^a98h%#VD&uC$X*=lKw1Jt;&i=rrJ98`h7?4;gtZ2b8lj|V zFggv$7q|aP(rC&Z6eW2e19JsF<~qpYg5X&E>L1P z9Ysc_E}4gQu4Ti5#F@mampk3Z=yuv3*Lbo=hv*I_?b#Z#$RzbNJu|$9S`Kl-nhe@~ zmI!MzUSOr_uDcSP>bBEtc4kktKNff_ps!m~vj?i437XN+Akd3-8D8P73{UpX5dGrL zO|UP!@hdRaP}C21cFyi%*DqT({O~`LR)gU*7dQWKr!+5~H^1cZ>|&SPv7+m3(A_0E zoXhIH9a=!t!L-hHs4rghV=1s&3#{~840T9hJbHH4HyqS-OjD?5agQz%DXguBsRf?T z;D+ZZb))hW^3Stk+<;nakuEC^OR`JXTMxY62bCtDf^LE55Ad9a=Z$#YglC555AnPi z&wD}DEqIpj+<@n;c>V~_v+(>eouHt3^EXNVN<-i8v|cp zzfiC94EcLWDm(EDlG^V(l*)8h_$^270H?H$uuP|4e_fwZJBr5k{S5BvukpPTEq#WT z=mg{Ec>V&s-JI{{Uy`Sg`uffvesY-6$Py&4jzM!tI%qad^{Pq}KHosrA32mA#?MyR@|s$ z)xUcDt!9_p+soAZ74_D8)>n6dsr7>3Sbr7H%Yak%3pkPWQvpZcMS|kTx>9_Cq)Uaa z+_4jq{+Har@%a5CfqwaelOI1eyIDWC)HGcIjq=&DI|*X#{|**(SD(Tc8Zk-f^(p-F4&r5-O@&4Re4A)?8G zwJK$}j9)8I=+_FMVL<-I(V9XQ%kqO*<&uSH@@SKPxfr`XtTl1u9gI=VOP}NR$y-%D z=khtal;Qx(3s~OiUQk-wV^bPYQGZ(%@9grnGTsHeS7O(?DxT!^DoDVU@zghMH!bCE z^+z7ulY4v4nB?1fkC|Tp%}mE+YV52O(u*8&`h@Fl{~UT(5qe~rV?*t*u0$tMDXOd* zRxVR$v-A+ogwgMwY{Qxye+_xZaz@bKr$*qEH?*F2<9I|YnnEiiI#*%}Et4Wp?`4TJ zK!SP*JO0Dw*8XMCV!|WP+4C6}_ni9jRljdz#y7 z&T!ACwNk&ww?+gG1nde77wrb90`CQB4iGJ3*;X!C;(JGMq~ZR|-urBQJv3nrqy zcE?=&H9YhnPX6s1$0+8L?3qW|=YVbY&zYfXo(}koH6QS9c%$}+@5V{uJ8@)#q7!*L z;uT?MyaOktIQS*#l%7}I2~OGpy^<4NgY9B@CNxQS_}{OO0QFzaRD@SD|4>g}3j=oF z08Bcd1R0$%jJk7T>GTkx5VPm)!N7um^nmIv}qAibB!yCXfKRl$;P6XHzb_W9Nh=YqP2+^? z(!9d;X@gGWcZ|)H**kD|>j#V?W*qrEJT0!}_ewR(Dl!j;y5nOC-J*K>|2;-vl0@{u2D;*KqS;2W`>{2tMu}L0|W(eSLDAzMs;1zKM11`%aWK&7qv~ zaYWCw0-dX%+oP{tQ;5%W+iKW*o`&iAU&*RpaDUQ9Z4?7Y=lN}4&1|iNONtt@}tTu~u;>gKn-0bG5 z_fUj~HDs-{RL-r>YCbybM`J_Vca7yu1=rqdObUGl{AW1i=FhMB-YA@=KG9vP(|$Dj zCyePOQ3UkJAB)6SG7H3)Gs}QSeGzUEEcmcdp992|?=_Njx4x)r+UiE!v^{P`=S=}& z8jwUdf_4rRc0}TJL`T$Dl~wJj+m7EK(&Rub`cBaZVX9Sjq=0)7?O~B>nHgt9G>%qd zb(Au2OE`Yo7M#`PR^l)m#JYDticw<~-tThjGDV?NJUq=1Pq*mni|;U=&U6eleA=@T zr6WsQ`aY{@@!aEbZVu4DPgO~N4tGjhL$!=aEkpGdE)2B=^SWTz-f4TkxUFjS&g$w8 ztoy1l%84QBMGu^8B|6>ZSj3L-Kl3|a&tDFis<(k(Rq60fbdBcIC0UpfNor*7LKUVK zvEkgWdDs%|Z?bWSsUwdEN%4joBGuWa(I~wWx+d#maITc}{N3yZ_?hVT@6jqn_uin> zT)SsotF7VI-TO6@ zj~lu`t?b(4hb9$L8yWS~V)s5Lb?tMPSWe<>y4m_UHG=K78;FM{hlq~47jI-MQGp;P zJHDr=@L$~cPIgTeVa0h}qTu@&OOjUoYAGtavW}$7Q#tc;ZqIoDH|R9n5I!C7>%5a_ zH`!0;9?1QB?nn52xhFfYqQ2@_O>5ODo2Oz$zkbsF9{QhN{+``YUz_vNMfcNx{_<}8 zDlX16$okC#WPPRIHyM}n;ICq+wM}PiiF3ExH406$YaFuOuJQSH%=|HS?!b~JuXr|* z6VD`O+4BbuJnsm^Ad3;G zL`688Sl1+9bHk|I+YVRxc6k0SXfezl0#yxTJWP(og4%p{6XEx6j#)=T==z*2j~ zq#w>lNQINeBv_Rbv1c1gf!97?OGmUKjrlR$o{qQ!w2zabXg?`*rBpYnp|vaS-(``^ z!mb{euK?E2O1oe@88?G&SMPPY(EuiJzrELqq? z0%<}N0@=e7KqP^%1c8LG2nd9b1PBHal7Qgg*qu&77Ra77Aj+bExPmJ>E;r~Xs3V|` z;4;#QD2oV`^Wo!eiu6R+`4t^)_UsHsZ*!$CdRlEZM`mQ z_H8{8e}(gOxt8@g7bmhG4HeeJvu)$InUo3JygJRo&pVJ-^S-R5f6zU3rh~r!iZTTf zW?_pz)&VOB78Nsh+C@+3qfX!SrkxMbmz$lMw%(3>aL{I_tzE5b-o?oQBxBVm;#S3S zVO!&3TWlkAK+gPj@nYz;##^Y5nc(__MOd;F`&-ZOs^5DaRzxhC{wHieT-tWAvgS~REcli9)lXyrk=nIRwa+P7vu&+X0>FyggDukVR=Hj`~ryGCcX*Y+9 zwD$n-{u_EHV#6F#pon@3PddkRDxr|lxN@j(MWP2{B?}ZH%{G~r(1D9Tg&t`9{SPH{ z4JGueu7qxvDvMq`7o%)vPH{whPblonnv17H*EBY_NcRGyTTm5Bw?Gl~-|14U`F1YT z5Um|FxE*tYT|S$oti9T$)a2~haoG2>i&J?mY+qa7vj1t#8J+dEk=Gk(RJN?Q-^Us8 zJy8l&U#^lo!Y#J{aTo0EWpomfcVW+Oc4&O)(9popAj>diqC!1Wl-FG$gF{+{T-UWy zt)_>e#IB>J(F;*x0!7qQ_?9&-pOtDTK%x?}r9$&fEzK(}EUlN%_LS}`Zz%t)+=#ft z@fGxi|FC|MP&u0Kr4+5mzXm<+d}Y%zTg>;=(_YZER;{OX!rs%Hpvt#kLz}ektM{1q z7~vBRA7N9G=$ote4Y&8qF9#1)G?jRoYD4owUFjGUG6Fs4 z9bKEQv~g*M{XvxHO_b*?>ai$Mfg|eajg}>9!m~<*qccY0aeBzK`l~uCN^R9xjNZj^ z^wwgk-L0X*-C7Kkmj|Y5ck%T^`L)@U=4)=@tHsep#zE!4kfJ-6;y~44jkrRkyH0uU z{Lv;FF}rXYn*nZ!Y}-#B1HA%A$*wKCNGHOJ^V1)~($6~Om!|hdoNOE4EcCl+PVnf2 zxktn*)1BJ8p31_$G-wE9e;8HP+ASrp3*k7T#5wub2*_u}7z`cbaT@-2|m?P|Le`Wla)BvFOCV4D*w7n|&s@cod_xZAg>Q`94vp$d-K-C>pW z`@`-k)w0VH?qxrsOh*{A3{$A;=3Dl^$~P>#Dv~XGVo=J7sCU{8qs_mQT6`m2zHvp? zwyUOGHJQM_uj2cn28jMEkY6z$lC|W6+xJ0fVYW9$YXwyHLv?92Uvi~%+7+!;+&P^z z!+7~Vt&RM*(gN+vD!3$3>e^TGo4y}$4Z9^`kCgpXiM5qiA~eeP$F)W1LB*M1uj2dj z_NJ4{R-8^qJ7pW2O{af4MLxZ&OY6=ymo-+|E;QY0)Q8vr?SM(feEf|!nrwA8+5=;% z357OrnE&>gaQ}TZ5&ouA& zzp2sMBw`wg`+E>}6vE!??^Qk8zx-n5nM#c6CXDa@Ze*tsd*LbKbV+k!J>Tt}j`ICx z{Pv3n8c(15rO9Ps%~WOYNxYY-#?D82t#|hYPcv=2=f%$0?SHl>`;)J^_=wA#m+-2- z0@u;gWFre8dLH8UasTUak^Sy@;UNGo1Z4QG>XOfjSXyW2w=x`Gq!3XMW{NB;)nsn0@B8n51Ljov0CZ@n7|P|pS* zuWC2^TKTAufgObmj7lu6kt_oSLfh68du&LOTV>vi9iKPQ_w%7`^`b($O`AP4JP#{H zkgSqyX7=U88aJPqnpQpw5$iwr*X_{sNaKg zT8go{C}u`SVC@Qf&g3X9I0=^w=N$AOdij#h+KZ5D@5ApU{PqWwLVNzz0OBNH3!s%q z(g}ORQCah00DY$mcCmKDIczo*n_t|$J{y1r;V?bO4}R?ZaH zW3Tk_02^AP-A1k3dw18}-FA21-D9`C1^)|ui~!<#qQ+DEovG5O9B<$A(@RY_zg))F zhOd^>>LzS_#?gAWSe;)BdAYVa9}ldp&iepstMg|e7uQzj-vHKD=SzUK)%iKV+Uh** zw-b{82`a5*z7pWG1|L+P1rWbAv{O1Wg)a`y#YN{gqQ5PR$&}4JLk`*$UMT zDq{ncah3BNT{+Vlg;vhLqTIA{rZoz!oHqk&y0~^FT0If1;bZQ}b zYc_f-q>&D?bwMFwYyl|u@(F#_NZa>L&7%!mCjTMqfM}EpHs(M%nsq#@&Dqocx!aAe z4!Ar1h2CrMakWa)z^U6MC@txt8Ib2*zG82O!Dov?Yi&fMHLiqK<=Q#Yj(nsD3fqGE zI!=SuXf5;qOo_eb)EW`JJ`rHLfRlwlXWT*4+xxr-T?@UuiqeeH5IuJh z@3~a-f7ZjOXKTID4Lw}Y0j=NN;!=0oA5D9cwSCg0sYbFw1IF>ldXgAw`%=Q4Pg<)N z5^p(AE^7I_ubrOI&MIv-DE1_$*f-!DQ?iUjdq(n4kp#A9811-rQFPj6PL>3;r^3=Q z@vJUs7}?LE7-@x#W;mTy5&B#x?dl-w2K1c+%H*>PPCWry6CX+YvxT*B5fiQ9w5$7_ z+qXPsuf+O}3F|vCHP7`+ta-j)*3UUjTa?&)roj%Q@qD=LV@M`xRn9%P04WwLKwj0) z_w%ZLu3tM?MU72NjG-OKzhe(Twt1n=Z2m@h+H-&Jfu1A%2lg0=9qc4gjjTV_<4W5# zm+5c3gLL&ten@RfJSS~Hk}-%q0O3_H2N-R{uLZ$6FHSoO2tuzNVF|JXnMcrWduVTd zq%8Rt&7+5eZ&??Y+sIW(+)7;$xbm8kv!{hJ0}9_Tix+o0DK{ca`y8j`O0`g-BZ zkbB#{QTBqfyifg2pgzjPh1SM8XzgMT6)aC;9|QJlV!!TwN2rrZOuH0rqcrwK>BRP))_VZx zT0%l{LIKviJ!-wP^I=`bY#!hl3fmjL*a_(COZxhnMsSp^7&}OiyTzKNWGvT?dnoyJ~CxuQew8>4;c&q5nSBuM%&V@P^hmwNw_Pg>LJo9z3UbW z?dbX*bYS={omT?hQWin`<}pP}bx{v1M#NU{QELi^X0Z{P#WV^M?{V$m`00r;i8VWr z%I!!4m4*-U`zl5pcO3m@s`2sls9l|a8GxhdAhr8^*a7_k`%HTIlD7U4r3CXBoSlF) zZ|^rC`8v*@DfXm)13Zm2y?li(gBT0_8pPesanx73H5f56h9M1gYUt=7jB2F)=I$s* zUm#sc@*!PGcL&Kv{?Crtbl!`m>yd)-RvVv5n^YU0Nk2~;pN}DJ+W5Q!Skv`b39RXQ z!~&C+WM8;nV%+wYaud=qiMHoM-e$B7;r*Soh+l(-=0s>WkguQu)Z@bsdeqh}r>Ew` z3QN#IQ8w;&KOkN@_8#0%@Y-{bMvd40-^T;~2%c3doeW*+4A+&8yRLMIL(xiSFR)fR zYk{@Wi3g_Ap<1TWad*7jKy6{4vyG4@jJthrgBg_Xp(D1c?a&HB8#8Z+bay<_urV?Q z=iskS0L96`lTK22Zn(*<>ztLYU;BmR65j19Wfz+W3_AJKR->l!J z#PuI`Bc^UfSOIFc>ydrvE!)vsHYGdd6uiF>Z`;ea^vK1zzl_npkz)J(Q<`B^ByUS_ zw;LO5NS|}|unTKPG5Y(W=tlec=xB#Iy1`x;jh#i&I~-nWadfP`IJ&33Y;Amfq3n9jvuyU@h^< zekwR56?FJ0bj|XbK8`#N3i;ZRmEb1@B_=*#TR(j+Z>Pr|wV^S_s^|KJS3Td4Qts|Z zQV%O6vlJzia4xB707lnv8YTD`q0#+<65@|(57Mgv=ai@G@3Dkf$kqjo2bDG8moY2P zFR3Y^`Q+EiY~9)}&9t-`cG(424N$4m43un-Q0^-(ZoA0sko-Z4&`xs98m;%L-qz1G zT0-|E-eju6}ZSh!(^WZ1V6ktRz#AseCM|9Fd3QN8#+;rK9ksD(zbXRjW zDQeCZI%_N!D0fRf(5g-C>Q-%OSGNtP1~#6y+pwGN5uBF!a>b(Jzj;+xvc|J^8=bvU z&Ah7X@T+Aeb0JO=+4e40vhYr2&1Pn**~G*fA_nweOBkNtzOqGnyLAKWceb{M9U% zZt#2@GT=JosTL{QSB-R5Bc0VRv+am`4bqy`d%f*K$6J2P-`l?wX`oc;)A2QIHhI*x z_0wwZmQ&k^)||1U`@cHt(^V7n#kV8>yE8s+FK^=VZ{Nd1XCgeTkZt;oj*rx+$OLhgG z!CK||uVFb@f8y~~*!{#R{Q4rL6ST+fHAnT^aS8f#n2%gl`oS_+Rqtk{dc7IXJK%XF z^fW$HI@D`+EUtlDX;v)jui~6|oOggw?g-_lMui`9Tvd)^qtF1X859&^S9*=FHNxu6 zPkeo&nNBiySM@P9E1iqHi=qpo`klSB5t8Q=he(CdnTFajOBw06wT2FXxv;vB?jyrX zkeYF~rKYe9JS|dF#KZd|EoWh0vOjo&Yh1s@WS)uC%(T*KhIjp~i(#Wjx2=*Xa>drH zbS>>tx=9K48RcFYlJDEBtl!gpPwPE9yT9C~Dv@K~U&-JS%00~!q2psKz|KX#>dsb0?V4X` zwq)mr_r)q&Uq>-^Y>`HViRL!22Dtu?&oIV1HB0pCuVU88j*8W7vJYCSh&`(wwYO%* zn@f?l099MjB?_<5HSS(~! zp};cEHp2X5*gjjY`WHIA+uI21A6J#Ln3v)VN!W1owpNGLdiLwFx48^!8fLV5dUjly zj(4Y9L4lKn59U<}zb*M5^Y`HT^Xe~jx`nvfsLyqJyEnM9ny};uYkpXX=hOI7zaBf9 z$)+65(8a$aRVQ2MC}^?)t(IK%Q(_)y7S<_4Fm{$QVkUaDP&JJ ztH=j>Rld-x>Rn{AZE4(8RQ!-Y=E;PDrjJLRXgl$; zpy(Ps|4%j+ZqMmfwD+{onW40z_-DE6S?XV;ofc2p-(KT3Hk}DAXu1}f9l9g5IIy&K zQ}BkS1ngoWm88?C)Z*OT=?lG1q8hUH{F`N)&y zPi}j%&+gl`H{azWu_lY67DBcVy`gP8250=l5LbnhvY2&_W5ce;cbR%rfg;i>%cQX$ zwf)BEwO=Ee^`pEdg>0u5?5f*EYmO0o#a?@lR`1iosdcU8?+K{{QN`Qa3Vo-uTCk&T z$L<}k?_ky)t@mT6vSQugzTdsz$+{N4t848(L%Qxe%oPccA zC2=OHm`Kxe3eMjM#Q7V6I|^SaJcF{F!!3l)wbC9B8VlCi@8`SbXIq`t1yDBcr?%yi zwY2c(xFz)ASMSs&z;i;HmT6xYy|VQTPPv!*uI;ce@zI2oh?T9su=h}x_E_8Y9{!}r z*V-Y*THxrUl0?LhOIvYjC`LkhCuP`5NJur?jxFo0;$qh5HPEl8u!BHjwRUk1c~Q;B z%sq_=%l$|1E8;wEY56WP`N9o$4B&*L;Jaeu;hMUO`zcT*5<6X<2jS~gYf z4J1C&Ry7o5H!QFSnk?R2icRwAO<~$|>~skvs}UhhgRwh9jO&`lp`c8EK?**eL+$;N zeS^{(TuAW_vUf~8rK=rQ*`cTXfPcc_xhE4yBlGs>-gdzqw@jr*12xIlgU|#WR3CJ@ z32Q)Px4}o*lzbsjk-t4=L*s(q`f z*?pdWf=4(1);<4YPRp>0aC@x!T@FEZSFElQ6Lexz*w0N4tP(vn`(2!9NV|*5&s}tK zazD(zl~8HvT-~|)?EUr_GkCdnYSYYH7>Rxwb*=3Hr*<{fx2x1i|NI-}OxUlmBc;VN z1N=+4EePZFSlbYsz&;6_jX6xLF_8B8l5?~s?6OMKvOMoZnTTtHKGG#x9iWb*v1bR`xF_n3 z_Eoq-klf&qLKJM_n%By>Kp?H)YBT2HU>Vc&`Eue5|0%-nT$4)9rd-DZ3Fs;!+w+& zv(VBIX>3VF^wgG8RH{^zY}y!#8lThlFw~d*OG%=!rJ|%FpkIUir;XP)o<`dh={588 zYJS2ZaRBUbeT2S8do#Aprc=+IVUaoB=BFbDYdM2 zb#U|d6|hr8TIR(#IcZgXTK=J}Hs$cvqn%FR=N&kxo^;Xk3u_9A0&Z0x-GN1?PqD&> z+L#9$WMRK5MALROx2tXNJLb3kd%<&6+YWa>=C=7N?XwMdP)i||!R`E&tF;JA&a3CS zN)PAfVbzn$u_r%mLzLm|b*Y^}cO7(?Qddw?S3>%pMreUjI@x?}hYHy~)~DspvYmCX zBmXUCIb?sdm-U+RVe!!o1I}R6o5$roeK$sKJkIS~pE)h~RldrNlk9|Lz=?C0ng0U$ zVTm2K=zFZh>1U%cnrr-O8xu_8h8)6}a9)X0>G|3#>p7i&<%&ifv)u^2tuvtgx5rE8p-{|3_sN3TnO_w34D1n;eyETM5HA;W z$)oo0?DD-dk0a~py{ttzeGFXD{6`Z=U$m`Sw3mDc6SbmVZ?=_}xx#lZ?N$G6&8Ia! zR#yrP1(z}EeTeV7{8+&y_)#mTc<3}k>R&`9VdW6AS!(+|9c#;$midChU`Oa2*m{B_ zLQ9udd5_Wyr(t^(vx4IajV*ocA2{1Ql~S;pRkCJdX17OL55JU|{AdDEh_esq-)M5q zDacwceb@DVv+_Of-*|?I)Mf-+%{QW1POlx>~BnYkz}1S^uc|7IOF* z^~=ZT2rMdkp3Myh0SJ%H9X3vxwG2E#^~Qi=q9%)OLE# z?_Emow;Yivjt!u~UxfZWRL^702yX`-m+~E=QqQLyXV>`|l|h%DQzk<vs`7igT-_RCs6&pz;}l1~;yp{)TlOCS?wC6$>c@d4$XQa92J-W|BKInV=tWn*SksSKYKK!hs5zV zIM#oE(>a=ddfQ2@(8Vm%#-uHII>iF z`u1G9qjOxu-j&FCu!!3xylP<^j67JAAQ~!kQw(aqABNg0%$v9bkL-*eL<`?!{uHu} zX3m4T+hf&_z$p-a@WJe(F{T|=JLvuWR}MLS55YHoM-BI#bESd5e+2L6Z-i~oD=NQN z5ypc1uN+74)+TcU?hA0g*+E>$Ci6ku7vg@7;{#``AHk<+qje*FYdGi-<%`X~s&p$I ziG5k%56d9m1)pevTLiZN?s~ZSWnU^mA<@`p0r`#O$-Y#o>YJ6{bX?k1WncN8(u?M6 zg@SJWo%bO3x~occg}I`t%v2^ydgcPq@{L!N^=0~gsUKDUtR~A)ljhKGAWhj&MRmE3 z*X2=XT^?}O9o6t&=+RLhngdDS`ZBG)v>7IqLM%Vmi%LPX=;u`hv%3?Z)SffEVv26H zh2^Wo^B(2<3B)KuGUpS@EW|p?T2Mw3zZq6b+5K?ux8|2weyF!?T3=zI8ixcL)D$*n zQE$H$oh^C~ex{4XmZ17d-p8w~B{iFCsyVK)k{%P)`c0(~RDCYq#mwLG04(A>VCD5~ z=?7~MC7#8W0P8$ForkyQ!<~;W45(kgV@c+*P%R(7Lwy}beO+r&U(L$V@(+1^iLs9? zQ@Co6#wi-}jw^HPx7L)`%z>r}xzMF^(ga#XJ6aPQsMZYPXR6VtLv8Bp1C;+_-r|Yk z5QTkm+5fz*Cu4^5jUvhsy5#or4WiD!nX^v0%6l@+*o9q0I;qdy@vQo#a(}&FRkLC! z0mo!p2>m3SU5QcI-BGGi?>deaK_{=wwbH67l{mG7m5!u(KWNXGVS}&7tyXFhq~?#R z6%RF|?f*p$Jr!;{=<#`PHdA-oGlX%OWZoSUq zp|$@MS<2Jw`h2%iuP8&x0wukr_CE!w7jz3F?0DI_alGD_s>9h8*AD+<_6?1dwgJ#C2!duoG}kU5ImyKb>{DH1@<+~9JhEi_erg+N zUXD&!S05OT+3g)9!+)GR-YIPxuue^L$$wOSTiFY=A7u#(Qa}CtOB2m%T0<&A<7J2Y zy};d=EYwOjRDqIO=3wlaV-+JAon+B9pVrIhWH{5A0*ir5Q!33Kcu(l9AIIq#vWN~-R*=D+-1)0pU2Ej3R$LeTze)d@pYftR;bd`pfJNP&TG=|$I zK)$KXVZ~@ibJ#JqW+kSg$Y!pfJmgmhEzzPn3y@gX99kC{7SMkfBzA!nVpTIAR@}NE zZ(U%OJ%3O^1$gxEc*nSkZt&}7r8UW-3Ts6t*x_-vdo+OKL)=I;o)uNl)Abcbw2EfF zPF;Y#tcM|)YKFbnU;RUEMvI2M@-?LJ5)P>{TCmFrbHrw@XB$$r5v!uVW1WAGG8N*w z;3{RdSIpN+a7{%03FVpl-%Y?-R>%WigT%>ctugkK%st%P*DSt9=cySGRx6dkg?AN- zCvC0tOknRK;dx!YUY?+K<@oh1Pa9-u!<(dT-mo^*`KHF4b#$ zJBw{Ml^-6!cxl-Hbc&-=pzk@Nos2h?pXc66sG?H@Y*yS|)b23XvXxofC~UQpgqdW^E9}X!s!H2G1faMx3V?3~B=luxl`K z^6+HodIN0YMsfS(q$7S)Ime&$&%UXg1tL8J`r41&_dDendTz9CJ&$b9pTbD+Q24!lXT+`ggw)LbN}N0RO6EdJuryULjK<>df$Af@0($J!|04( zE%e^{;1@@|IQ7Nk7x!9!4zb&Y)mv;=>Q2{{qD350+Sb!LbVvKRgZs|B-3|M!55|6< zXq)Ug-+%J_$kmF{$i??c9ew6rC4XEERxdvnX{GVL%u*YMN$ZhnP#NL z7Lq_Ll_~k(TL%|q9b7~@qwA^XQ0u3jLt~3;l&3yIyNhTpM}36Od89r<>&6`&Q$D4Y zAIOI1JqpRzwv=TJotnBfxjDI(j^IAbIN?L=KkJJXE|Q(L#_B8Wvw_ZUnqj7Y!YfT3 zM)~4|%*hSkANdaRvzD}s=+YsaZ9p6m&2RQqJ{fSJm*eMmJ-!5GB1xE#P=quzozW!0 zlPfPcW$#~tHojH$cclA(0R4rVy{)z-fY@7M(E9 zq+alzZk5>G{+sI7=w+K3I4C$OFr|r3aM)-;TQC~!Y1(X(a?%P(T8Pkm8R%SP5h?i5SY+A25FPBz!t7^GS7{D-jSjs8fT%Or3k))W>K_)$gKPS zNBj@XiKrZ?z1@lXan0UHdd+4DJBMq-sZWxH#+6t-9251HvND@ASA>Kbr>g%b_WQYJ zSbEv-2Bj1D)`e$8-9UrFCZ?36Oyz*P)JBPS* z{dHy1nFoH{gc#x@HQ6~yK7}R%trXCB`>nEl_PdbbZm25hk?0_KhFAU%(4WEl$wG34 z54bdqPWuxnqcjDB&(PYLK5hNcQp0PG`Wb7E_*MM0wUJ6=%!LPjq`4-gLVWo=c0wKV zgWLxir(|0V_FSQ9MXLZ5-c`=tswN$P>{^%#KEkQ|F>GKKD$KcJqdK2drR6P2rI z3q4eDc__0)b75GejmE9`ssR|Yj>f=J1#~4za?;h2oSewz7p}5woQ=Jn3$QQ854PR? z$eQy}KNCs~=T$@ILHm}(lTWNMIFae7pI7w}KhiG131Q2qWIbw4C{6nJt@13F&5>@# zoJ$LBtB}W8;5TPMgH=0~Qpf;lPDbr!z_xvu*=J*BpN%!^0^91kC7j?4s6|2pKi`P+MxR()zDP z{YduN4(H91wiK-K7$K>v0M+A!c9WB$tCkk=v3dYAo(GRJljfV^7+_l6(fG(D-^nQPgctjW5z*rJc(DHMHxLc4dg&cV|&2Ujb&>DY{s8u9ouFNZ_Cz4cIoULJ?Jc6+wVEDb zIL4(I_0()?U+1B_RNU|IC8gjOtY?#!+~!L}N8X+uFwhXk!ZO%k&+ z`Iha-;Xd0Q?Ag*{C%q_>`6t8+Znmb2Rm4o?3^@o^3A$RTd|T#=%G#gn0c-g>a_+Mx zQInTYgCb}3$d9N$DrBgeVz#sZrtKBmrqJ$BN{?xeSM{p_Ux7FCt3Ii0ski)?4;i1(vlrU< zUGSs}ICj74KGj_z6%%`3>9jntvx)X^|B9UxSh2yr=2rqrK*6x_Ehy<+wY-n>WyF;(;r?*=^`ok zfR)#kEbvcH@f}6aV3q~?V?S#8mvOiw!!phG1J<3W#UTMPlLY5kG{(+f5A!9k6Xl7HCyM0S5m1QP=v)_ zXacOfIKanIV&2#-1%2Q%KRZg2&NqvPo#7OWKZ#fo(=_&Px47rxV7iC7h2b3SAC0%! zry2OY5&PMURgwNi>~0IJ58?J*N7Mycv1cma1?UIFpsnmV|5B5FrB%P9joO2-{6Mx* zPAZ$~z4mz5cf|e=YLR`gPh^AQp41!G0EE4jYYLtB@ErE@Jr$s0Pczv;5bcHRD~R4m zmcDUnt3U0y6Eh*R<14JM{@Oyep-+Xcy1nsjoKmHiebB53mNp;_(X3cfK5UIQ8eMZW zYV#x?oTI`nS!U0$h5X)piELsV4@l_|d#Mr9lWgpm=6cA^UQHuNBGMm&^i!`+L|ILo zpPUdFHXzA}@=60&PA!3Urcd=v?l2i)%rnVyROejk9|0=G|7rmEPiKsD%KV*Tgza0t z3o#w`6eyN5?BL|FV8o%44-E^)iGfiXfWGt!g4}sR6O>26AdbjqFvF)1J>W#$V&?rt&kTg_m*d@Xtc+*tCIFk zhug_2n?{XDvZducX1dtBPj(Q<`b!qqJOy?9!#+q+TYc@Kc3L@0(bZC3cUmu^vvIT? z)qR0At2#u}HLE%ez?xN^Dqzj3P71JQRVM;iv#PV%ekYqNUcD^95)Bo)$EXPU-crpHTv=T~t%k<46^0Uw43(8p&>mG7)_Za%ft~ zn_F652QPLWXGma$5VR50&_Ud~7uV1WEF4n!oHAycs*K%M*(nJ>@4!&=XzctM4n9y& zYI<)g-t(5a`p^$H&ou8ezicitTg}8(uC*`QR;fI=Exgmi_<0A4_uo{W$5-8R+tuCa zDRJQRJP^-ac@|VwXuph7sRT4T+rk=26fXf9oMydRel^tNtQno!!`qojYi zt+eS}XCdReoqyBjcKULn98kJ_!(A<+otjzrNFlWcS8n!0#j;Y`Np4rS2v$IHvGSL{ z&DQBs?==3m8Y_Sn{POTi$8U50oNfC$HTM41Kh^2J4Xz&6o9mwO{hRN!#?Wwj`+8XUUeP8Zy zs>78Ii~YsyxmRsQ^TN99I(nZhVAI$BxSl99?VdKhVfx7QjY+cz9P21(dOEb^=L4Z- zKO72OZv!oa-bhGe)J0kw!EAqZ|8o(r;z&3whjg!Re@?R1;0uESLNwDc)pTuLS<|ic z_L}ak_to@hO>+;j_Y-bcD%*5F)*NA_oEAgAO!kDnRbZ2=N~tvY^mS0EL(Rp$n>&an z2IwVrswUqP&F$)Fp0gCv@o)Kwvrl=x>TggDl^*hWNA$XHG3QxcLvPsd2JD1X74_(A zFYfnMGkr~bnPL!MRJ^{rtbI$QQ26^enDGsnj%ighvA5)1yfvk2T#s1q#^yPWe<(^N zgQoqIs+exE-iI&$uEcs@#F-YAHpS}N9e7h2QlC<_vTA$PzXJDFeHSR?*2N2n zdV${sQtLmIYr~x#cm2%$AMIx$xsz!3#3#~@s!*NQf2Wc@C8SYHXE7rOovo=i(>HX;(rZu z!q7YD@&9+0ohe;|bm_WB8KlgG-T+w#w3yA1vSwX;^x_8%TWlqveXw7#uU~}UW$c&! zMd^2=u&UoJb5)o^yv$1tg^|M@F2BOaAV;O`Wu*Mns?$d{h26s0%bNplHQwrW)c#mx zhJ9<~07qry9D7Y@hrafd$E$skzn^3ARBMJt z*lUKZwbu-Bx6e|I&?SN9nT7NjC`^h%YgL`$tD26Pu3i`AWKc7}!E0gYl%}s%ZBUX= zUkT{?A47hMkd)TTH`}VcFji=#cdoWPq|!zj$4_7OfCRhwdSO-bO>rFa#`&zJy=#^^8&Lh6OqNL;U|rzP(ld5T8f4 z4Nb9E4l_D7p|qY;J=Mx#!|j`fVTDU|QwJbad(|tY>y54pjg8?pH?`}H?m&^Y9=9lk z-0qpV#!Tf;_aq5=OCgz(R+2kVlH%JHr>})x3b=Z+gSz12m4L6hMmroRuV1dWRx2)C z3oxj?Llo5~#Bs9|Nxv{ozi_f<+M^OLWZ)G;y7rPYty-M_GVX2G zr{P@f1!F_=*iSDji_H(2KZXYJ|5UzxU1?oOV}jy!f{%9Pp4e=RhHx!2JQovf`W^<+`Rpn6{Pzj#RQ zRcu%H8?+Y&gipIBWk|8N+Z$uunE~Q^J8mXws{^s z+(PHDXoqZ^Ih z?L*tt-d{JNj`UpU*&@$e{{sIy|Lr)B*8019XzRN@j^2O6?dZ?nv_H!Hq8%;!O1rwN z&6VH;vg=anM6TM^U8}uyBtEZyt}%Ue`ii{8t1|ntyVBTS`Y%e!%S+E$+keDeX^*h! ztFp7Ra`G}(EHS2Lt;j>bki50o>AA+d^fh^5*_kOBD~u^C(u^tD*_j!sDR~)LE5erL zX02eUS(#ZmEQc*&i`eq4v~&i)ti_AjxLM<-&M@A!ish!S$j!>h4O_G-FAvZ1GV(Ih zM+J4OUmuCfx%vzMoQd09)rQ}h#%=ENeE!5<3ak(Rmqxm;R<*Zw>Zc(r?F=6_Q zu*8`&jP$ipSu57zYXKv3@fz zZjHHlDS4}M#XC;F05&dXQO2s}#&K&>mS<gq|tWM8iW3yrtjR3hQ9pmyBa~)V`)aN5&u)DXmj&&P?ktYE`P^3fKr|DU`7y|xgu9o0v@L3WaOckGmTlhCrl+K(=NQx1q^6^!jAIjG6O*UJ&Q6{O3J(QiYg3TD47#5#M zRf;Stj4p-!#ZYR97B}3d4clSZXJ~KWH~f!*T`=4-w9)w}%&%2&t0di9iLKhUqQDpN zcevYK9^!3mp-_MMlwV{9*TV>#_sw+mveSa6514vbmcKJQLX-P`)KC3mmeDIaoi z@$Zf6EpFa-d#f*@e?0q-XZzyOl#U4<+aR{8j&&Vd!+pNv{*LEbpKo2#$(!|IWu5kR z>dD%%J)SRmGS=w!bGV4*XSa_c2pRCkS?`~{hX7siZub5R_bHvzJ2Td{^~P8V;fp6n zyMNX_jJ0R&dUWp5MlrAsKAn7gm>2W+4fD0P$!wdsD056^yUhKWR1Wm}!jB;$#%z8b ztRoBT9o~CkYsMD1eb}Xo$4NIw>z*F-+%nwq+#Yc&Y`v{@x!WGM%r-B%z2|ns&8y7| zt^eNoqTAZG3){Zdbq+6*aV(a_u`z5cGchyEXBJk#3Rw}`$ST-&wu9|tPqL@jF8*x; z3bY&R&U&z(I2)iB8^D6tKsJa4vk(@_!dN(qV390}?RWdK*VDZo>vh0wfUlqLUB0T@ zUwspO$NK)>x61!@|6=2-M#aB^;y^l5%cT0e)se{<~H~4qQJz!S%LEc7X^Ol z)_+jPLHh>o8nE^5{JS^bJeu(C>AKtH5gx;s5_5}P-E>3QgQ%!@ z7+cuNiuxd&hF>OX*c+}1Ke~MJ3q&I68h~E`N8(Q$8!YeQ*brXK7>vvv|c#5zj6hIvW6mUWf*Vb)XPzc4?E*D<5SkLd7Ub@)*o zHtDcghx2vVqQeC`T&TlEI=o(oi*>j}hf8(1Ooun<@J1aj*Wn5shS)*ow@Qbrb+|@{ zYjwCzhwF9Ns>7Rfc(V>~(c#B*c&iRSuES60@HQRZuERTYc&83Osl!j{@Gc$Rt;2hC z_-P&9tHaOe@UuGnoDM&)!!PLYi#ohdhxbbyi1tqP5(_twy~D={>H=}BfgFBO7&j-5 zV_&jRCub7Jje_+Knq;$PSZi7&HzBzCZSCBDL9B)-bVNPL~e zNo-KYOWaDCC~+HQlEm$m$r5`hQziCR5+&}eBuQ*k(j@MyECrr{{HK9Op{q!TcLLu- zp1AhoXJVp}AJgHVbT|NywJ;NP_z@lcREN9ZlUn%UI-IV<6*_!Chdx&=nTccIEgFJ zjoMfUYxe_VQNS@6-Tj=;LgA7>U2zDbU2$lcoIB(GW5H{RD~?Ujjr$XkAI(2rH&#y4 zjgOQ0I5?hvcQm+6aj8z192M!f00< zo326l&tQ0sUle~EC#Lw{!Mhne{&^hJBZ`y!>57w_2jTg`llw1_{20Zl<%{Axgm+i* zI8!;c0LNh7+|&6s#ZO`Aiesq)aGa*Y>5`YD__eyA_`k!u6^Qe0c0cRd+Qi?{-h2%H z8h#eIz!{zb#j#QRU4ch4n@mFtYmzvYosxJA`%&Vt?2N>5?3~2o*m;S^vkMYWV0MY) z*)I}LVh)M#V^@I>>(cy{GtJjzn6b=-nZV6 z)=T0<<|pwq)<@#$%qa0p765z~zMCep%7!@85GccpWG;LUyIcB?Vgn?;mkpE{Jio*- zEL7rH7B2A^7Af&qHdtcJP9z@Bq9vZdMo1jb?vZ#ByI11-Sd7F|*cgcuSRC*ST^`e% zd7LQ2L^Btjz$Qumcs5z$``A>8C$mI}r?Mo86WI*leBHOIo!^=z!`#bUIEKxZ{;_PX z#ADbziN~@9634NH5|3w#B%Z+1B#vi`C7#5VN_-z%2E0#~Hr1K7Oc`brbK!g03h5ui zvL%jXITDXyc@mFht0j(OYa|}e9+r3lTL=7|E)5r)Y51!QGm5$Jz04&2V_3e#v8+Ji zF|0`9v8-6)I94k0IJQCJ@vL0p39M4$iL6@UNvu}lDXd=NscaK)r#7zs(i^w{eP@dd zGf{`**;eU4i9I3leQdkLli5y*r?RIcPGq|!p2nV*IEg(Y@pSf_#536o63=4$B%aM) zl6Ve#MdG>aHHjZ!2PB@y-jsMgdrRU4>>Y_0GF9Rfc2MF)?0t#T*#{D1&M5Ix_L0QP z*eAex-fUzW7oSFa$N$Z|*-YdmA9;wv1Un1Z#MW{uTfp(d9B<+HFC4$f@j8zG&haB0 zf6eh%i!S!Pix_L8jq9yP}`#G31|2c55_*= zVGs$fa~x-IOnxijNq~LVY+~cGm(e$(%$_N{zi6}<}Jruef#eW8Lu`^ zq4)l8ZvRxa2ayLVTdE_%S{)IlI-)*8nED8nEnzC#2$Vx0B#EE?h`BBBcGjO^sNh#9 z{*pgkaZ=hyI7BDI48{B6ii1EmQsO8U13V9L#vo3OAEvP5onfZJ?Rr|=q&fZcb+q*V zuOnVZ>z#E(Wo32NQ8$#=b|>xutks>iNI`X{m2FEI^5 zfKcL!W5Z=XA^Gzp=|5V|aHWNhsL`3!jQycICe$$Dyxs?h(?Xm#~s!VOt zg{hrX{z*G|4{`p#(wCc%mwe>cI#1BpgTQ~*e+?a}oIgh>#{4<{g5&!*7URV#j*oNy za*j`M{4~d3aeSC#F{Yg7_#5u;(TU>!mg5MHzvFm1$70+ekDc6C(0NMp?X-yGC*-e} zpM-(Xtmg6jQD#yG|9oeh+F0P;hOuXP_)X3yuJ4kEmWKBbCXn@3sLgy190O@GUS(&U z*bUgtL-=cQ0O~JV8;fIsa_l2K0?+7*V|Obt91)(WOqMvpphB@R_q zNF1i*NF1(cZ9a}gDkkY4rIboMLaCN`q@v{>@&V-~=^vxKCh=J1O^L@Vs>Jci2NF+J zK9M*AXOKg-Y!f|Y%;a=$K&2c&K5G#KR0G ziH94CB_3rcm-t>ot;C}YJ0-r?@QlQx4KGPN#_*cNafY`f9%uMK;<1K962}|9ka&{e zjKudD&PzPeV3&BB;hMyd#u~J;nr;Y|c!t3xbDn8%$(d&vT=L=BhVe4|e8XIc7Z?^u zoN6GsE?sdf-9T%j0xvU^OT64rDe($JwZu7wEfVJ%wo1I(uv6lP4PQuHWcXU*^@i^x zE;cktTx$4H;xfYpiOUVYNnByLDRHHtJ!p?ebG5-s;u=F|iR%qLCAJ#+NW8^hl=v~j z-4Z`;7%1@*hDeE@G~6TcQ-<*p?=(!5_-VsbiJvjdmiSr2Jc*w(ESC6r!!n6qFgz^r zK7&c({f1JBUow1RQls=dp1DoQ=53&9%vDU{OPjcM{WKo9>!uIy#u;b{K$VF_kYnqYk*`ax@+RU>6JG2i-~wPR4Cx-Y@V)E_=ewkD zuwCL9wo~F*_LRh9*lvl(v8N>-&z_NZ0((y4iR=Z5;qu^JjD+U{QnjH^S_xt z>gSvKxnwlTArO52A(YQJ;23r{=lQ2Pv7fV@g~FvUbj3j-NV^DAf2Rw46w~??%}2EP zV;p8F)TZeIzogT3iPFtY2J3WJqNVN%y{FNHsldkb6pO3>uj0Z9 zEWr7094Jws#M9W_5+|_%5>ICXC7#8CC7#VfC7#Q|C7#D3C7#a)OT2&$l{lG2OT3Vc zka!WhN8(g=uf*vrM&iY6jKoV>oWvPyyu{1cM2R0{lO)b$lOQMOcKGg~HcKFgHY z!d6IJ#(eu|Y#yo*&zyqi@^yoc3F{4}eVcrV)|@iT0T#Lu#=5+A)I53qd_zrkLT_;2hLiQi(cN&GfD zAn`lwO^FY(wrV%BleNRAG1#+{)Bxh@u%#l z#7Ed?5+7w>NPLWaDe-6Qgv6h-uL+0cEzb^1P0h|+xpeW$&|J1UDBbl`Tn4jZ99> zTArN&b?{JzFOA3>5FQ*6G%ANXBSWGhhYgJ$Nq>ipWT{J2a(IA95g;;XWcbL4NIc2R zTCv2ay&e@bDke87awNqOg&>jP@){W)F-%?~*{T(}8B0h@TYGh|h+0jVY--y>5{H{pTm(X zcPX_0Wp1NIZli;4D`yev51$z>f)Cey0WpdKlvNWEPKk-;xda{=5)m0K>PW`t3X6)C zVIwHo$RR^Uvc;KMDb9xAtY|zNjHfIuYt^F6bkRmo%g#o^AMujWKX+E8_Nr+6)T&T% z!f`dtj1{SwtJ2b)tuu5f3tN>d8ZlZZZ_tB7qe6#->B6O@FGjdr=;|j^S|h2^BHF=0 z>>VX}qqX;4j*Ac;Jg9G89!7O&BD=V4$;t1z$ zYTlX=iS&dA3=bX>#MX=u{fJSxtt)ium^m2}Xa7m)`9#+j zKt0hH@Hbl5#?gqvgV-vaud_3tH^4Jus530JYu-gDsPsiUhc8+UJfk9YZJ0%-1oa#$CGn!`A(a62ZP$x3 z#}QNz)Zuk6x*k$_LX@D9S|3p#D*$C>Ce_=!wihq$n0Gdo7=dVsYk<9?A4a zic--s*YcSt6ldP(kxYH0AZc3GT0Rp+B67AoWsS2{M7Agmoxd!IJ2vkuwC+DVKt1rS zbE4%ZFHXtPnog9H#=A14dnAeh`T5U7OiIoYM4p_yWW}n~)C}g)52hhx zAX+n;2Gc*J!lWRsv1tf@f%m55PDmNE%Qu@T^*~BwdV5 z5ka^Qjvl!1w+)R!}l!NZ+HVsbJF(TE9@bG(+qc>n}+x;nm% z*ol!843$esK#|Bw)Ob;lwQP(vd5e>?LED@#Q5(w^FV7p1?fei=2EOwk?$P$?5&tA= z@=melt`LzSRt;*g<|0liakc`0>W1+upc+Gz&L=tI$(^EJy;w#qA8W*zc<<~b%X70+ zQq$3Pus3c=vXk@CaUQ%H#X~1AM&wTrA16abbV$d$@rYK*z>=8|+#Aszjd|lCQKH&V zAbK3Sy@*2hMD#h7pZ1ERBTnK&ga*~8dsT*ra1vnZO}t@iaY&-#B()J@AOT5|-**KO z*`Q{GNYIV6NF<4IQcr3@2%#mFNU$r2NNl7?EQpbd{X;j8*YMWlWu<^@E62IsVue5yO z-!M3fL9$ZOVY#c7c&aFDbk5t0o{#^|l&)Hw5}Wqm9X?Bp)2d9W>5LWFT1!mfWX#Nk zwBC)&2D5Q9m?Nm-!+i?(OR*F{Vs^Uk3fBYo0a)IqS-nRaCbyZZyG&<69SBf_s4;IdG{CIyy zmiGQ`gbR>Qg=(LHeU+^}r$_Cb2DLioW*FI`3WU56)qSGy>TfgM2cpt0Z@Iz-fe zBHVene-19C;SgMWL|&9e1MB*b_Fgm!gX(({Tq@T@xKuvcCBF038ZCSg9#T8o4wt@j z9WH&R=PaXdWabnixC#o&H1+(73`luo)RPjpdvm*P2^CVK_0_FZ~L zX)&OZB9}?GE=#xJTjc9wq3Z9j;bRGvIHy7qlAgcDQ}uz5|!i^}h2SkT0J# z;Xa0LaCzYuFdAury8whO}O-(HseJ40^!p0Xs0{b=`Msz^|8k3RyzHka^AlM_mBOkc9Zt~ z;PK-9IJlI*8F007!Yyxe2A2Jp7JjkrIkm$zxVOQbJ%O=_C=czL2Vh_ew`=chpD4=n zIj4KT>Anw_>h-(-kG(e!v!c4%NB6GNXXvieed+)W#evf_G_#0^Ofrdp1BieIkvODj znr3Vo>~02)8pPQMqF|zlQ-~&tV~pYu<80y_=UG%V#wp?y6Nl)1-?gf$&uPf_{l4dZ z_uhZ*dAe)Y8ur?2kG1#Ot9BveIF`mpOxK^gr|Nin)FIgR2Yd?(BdmY0$(W4s;M!3B zlc4tp{!4^xA0>yXyrBpajDR1*QGh2PT!RopfVlzTC2+Nv3NPygNav=*@sA3bdj#eT zp!>6xZ#qI$N%Z5rW4^sJO#cGV2LX3CLj0LdM=JjughL_soH<%f6u@>8{@E2&w1Q2&)nD$8vah zZkt}jorZtMoC#mj5`yNnxvJl12*dtGJxb~nk6Wp)9AK8?T7)x+#E<3s6kztZR}j** z?}K?d|2Vu}<1Y%rlY@})_(OMq9&26-_1FwL3R8Y;C-dgFJfhaWUITvBb2T<-E)Ay}V&S{`CopXYaJp3U;Nbj+Tk2u!P zM(|P3ClRI*z7oLxLd|C{giLoVLe|qvgiOCRpr0IsKuNir1(@yX3WRL0+YqunJRHE= z5mMg25KcrmdQsc_j`>~$xEI26g77+omjFI^vG%*Q2%7j|2YGG953wqtQK@#M`SYwI7tM((!x{!fNnMLwIi~>R_!t?}3tEE3S_D<)M^&yV&r-JV&0{Dd?@%%Bo5_Iah1L1Ze z@w*KF_nxhKR-dEkOhq`CMEs7y|5m`i5J;a5yk+@J{;9%i5u(b>mk5bpfC3wfa0|jt zC|CXnZ(9!@gx77*e*7K6D!|>(!`cUYTQ_1ohVW_>!aG4ckb`;2`@O^bo{Pr#8`Rs- zpDS$v!e_ug>SD~pVvM1`X$Ty1<=`;hwoA01-;I#{@&$y|2){(w8DaWT9lJ&$Bz_LU zsR+YgcicFpai37$7SIzR5n*qke;(1V2K~T*j-rTuC*saAn@5InJ_a9k<&S!dMx`u5 zxCLPf;npC;t-v<}W;^1K;YWa9L-_FJXk!TPy+YgJpkLwD0Vw$KZ?)b*lHVX)9rN(y zFnuD~ANXS)23@WB7X&WD@b8$j4hZ?Dfll1ofbR-~tmj*<(e_dt?;m(ap+r#LR_Fr0 z@2=H#(v{cg{BQORyDR5)hlKI20No3PB4k-P=Hh7~{U*?t0GGQlc%CAp8~m1=bi5q@ zJAJ-gfN%)-?nk&CVfgC~Ui7CQhVrhsS^Mjk2-gKnWeC^&Ufb)>5LO3xwh8{`;(r_P zix5`bqT}*Lgsp%}Zq@#A0>TM^??lKvB(~}NV-~`D0e89$b4rBIAmlhO|8^rsF@1#a zM}Vi^fiw`BJ2f9e5K_*G2nVA-Y`shM9rQ;HZ$LN-^mh@WiI~$Md@aI~dvwln7Q#o7 z_rvc)8$vk#0rW+!DigZvf?b{kj_Gn-SUyMnS;x_{5N-i|;KOQXx*g#a=znt_H|B&C z^6{MJpECHE4a-X9)S5i~m`# zV9Y=`@Kv;Plvns0h8xGcb9ES>cpv{~pi@%z{Rn#_d>0|xW%wI}8^<(VAI3{<*L>cN zkgr_ydK2xmfd53{{~4A{K_vlZyW}q%XF~WaB6qaSE7^Z$0-iuTe$;s*;0_44AUqu5 z7YJEC7rc!*2g2^}=)45C^7|TBNA75Y{Wy(@BTv1oT?BuLMx0YPzZ~s2gOHSa63wN?*#tZmTqFeT63;>bw8zBM?5w&{8CR|f+erPpjG7+a9b_s$UNm|Q&Rnr(UFy`(UI2UR! zp{~BZVMVLSqP~Sx5H}z-gd}Phh~-9b-NFX5Eu zT8pu0i0y@vxT3CgkvaT75RY4lgJjJWyP@I~QaLPEe=Z!PF!0s5g_q;qh>ZbW*kTSS6?TNq&s1~ZW((lIbK!C#g~ z^qv_K;1j#NS;w-Ai*cb0j*om1NjH6R$Y#I7rohIIqj_uVc{VRks+|>5Sr8b#nXA@C z%jcVQAwk+Kc0NHxX`mZF8`f5PN}JR?%AM!=*2;OlP`J4vdaMks404HGUpe|$pHg?V zp`pZLo_)LwPc-S_=8HCBa9nT#Ig1`P?UIsb#C^ExPSsEFv^WcMAt~DChK2BGX=tvk zYpKO?$xSUd9U4U(Y4^*Jk>ydyFz*1UQXRbC8vJ?)w7b>-ovJ{g9q0}#G zs9#!0YB3u_T2sU7LW*SKACd`fldZ;RvOXNPo0hjOUT}PEFg`W6m?7b?3$IN03`P_) z`#%tBgY4Y>U(i=JH=4fTsM=02<7@xB^uOS!Z(NKjG+%}+b@S)9skSs6RfB9qRluCj zkS5H1ydGey!!uIaX3$7wiqT?@FGR0I)2^ipkGU#DbL?wF?zR!5YzTQ|tY~Ojh=adP8f7Jtm(?|4U}_F0XVR9oNL%6- zv=!TH(4A-=YjKH50l90z$%6LwXCwB$zUC^UhK z0bx+BTh=0qHmqDcVwl+7;R#&_7YEE|>TA)ekm(ll6_`VOFllV6TZUO51cmtd%bAB- z!Gk^6&)~l58|c`488T20K5NYw>pV=dLkxY1&D#Zt1&f>Jn>`RO|YzQ`Kl zbRx{Xjt~>fn3=pe6#u#}dkh5s5$T6-Nz@KEp99pR?a{1wcDd=-mb#hJc3)6_Jw+fl zY#&1GYbZevn-4`W)v3b7UD{nz9Vw}?;-v+yJ|}j#45}+8ldzy&OlXF%`Lt$a7FCimaQz1jppp z;;j3nE#`ipqmspO@-e9oO)JOy#)gI!VdBVvc@zJRnRl`=r+~aa(vPAK9c~sD!uyOc z>j5{n4274MWSSN*1yOJFO$v#JARcW^aQQJuMmTY-Gv@yWMDLFi`vq`YDOUMV6q!!tmXY&aXbecBssl5UmRDF?@-=Qew?(T->zO@YDhUB@d8b z4nk?^W_S~3*CraTWV~-)zHD(z{mSJlTWaMS6a6DHher13riMnde}vTub(4%bW&p-8 z9s9`Kx@N`l)mVHVNo*awuw>9`ZC)db&<3+G;$GZ>k-Tm`pP}q$^UYvBoMaHCpys;O zwaqOpi%nNPWdzM+L-~`6u%U`eBP@M(;h`21HbsQhbXS%7G*Tij@lYD2Ik8J&>Pk6%y3ZpFMygcp7YULi+4Q?He?DA%U2w4_AbP*^)|r* zqrHZMdlb73eQFVUWn-fxjAafI9{3B`)j)?qU!u~g(;{?C5kaS?#3z_ZvsR?&nrlZ5 z8M^oIVd!3505`!b^oLz&>}yK96>*E=iR>zoJ@*RO)6qYd;=dkEHk{{>Wx8J8hH-b6^r1SDt`79Xy)QyJsf&txR`=T zm@-Hk`#nI;I%=C57B5^h4>N*F%*K>KxqC`WE=9NumWC7eH6Q33{vjDe(R-hZ& zA!=KWZ-Uh-jv5GM>9gjb0?dl#Xb#H@5F9~QHZ@_?GG7;<>sMmzL2=`|C6P1^hm!5# zl5IL&{2p1Jg8w!%reyH+B9v;um}q>c6MA9rXzi!K#W&qJ)@#@2PFaMJg&|J-DL}yt zxN_M_42kFft*uzE9Z*CC3Qc2`Sz3gR;>Z~qk@&^1@7BtqVsY#7R1OCYQ#<;2Fk5#4 z!b@!Pv?^s%EZ_osgU1{R27wkgF)$n3VAL;v^YQN(I)3~Fv`YZV7jJ^628u3%Igw`Z ze-_~y)?nU<>2E*8jAGG9Yz~bueD?5%{SKr<2a#2152pcQHED6)7(y~8!@{pLd|l{x zgPm4|WOyDMLiLL<={PxrRsgsy1cG)??=VSX#mbgNQUL;C1T)u%B=~hNgelTOqd*(1 zBU;TN5!~9a3|$Y)0RG}gL48d=MGIuBXwY1Tu? z_#~@qLos2P!BNHqf*xw4%f#!eHdrUXW-n+TBo$b2YNa;~gwhdS+xlTeDAd%NHUukf zdm9*ZRVj!waaCuRIxzem8eq+fuO+FnXb>N?p+rd@U=*-$xylwYqYcHBZfgT|zVc-o zLWZ8{NGT9esLEVXg?=(I6#gPW4NVQr3pvN2fuBzUgTcBDE5g_qi}|EFJ}yKrXk@$L zZ-4x&PYv7Hw}9|*GiDb9lD3X2-~${JJiiT;*=VS=!Kw7dC3u7`AABv)QW%4~#rf%+c-97*J@bGH0|WU;tSO`^n8k zcxWxQ9duChdJ%;dAH2vSE21`ikS>wsXf$m|nRMd=WDQM_pD!Zei)4zgWi&2h+oCZA zraP_(ixh}FvTt~`o1;??PwR6OSL=vQqq`=cx(K3aX- z(N8R-N8Rrx$v!>29>EgrHWUG;(6ud1c!djN51(T@+9Sg$A11DCU#in*EYHL&zy&M0 z*}!5NyigXUSjjE|yt1jjwy_Ztlm%vO0OCD-fiDW+WeVN|u(1)Q)dh=TTEZ`baYwzx zc%<50m>sv)uYipMh6>t1{uv?I%oVu+$(a#Qc;$T9LR#@Py+!6!fQzxp7=h7swfP+& z6|-{j3hrZ=S0aqsR(7_*5=)r4l-6i``qe_b;W}DTi&v}~5o&cfEVoRYY26;&&uhk} zT0IxH#QqWa4C0A=HSzr=!Yce$1Q$M_TBJzmz;-#btU`?;7q#tRNp`e4M->d>Y zE)UpzU_*e}2iurBp<{ijU?qK4fYmY!*!MthjN}AmNt;%PQ)Y^|xBx4f2NM3=9#7^< zcHy9l1$7;;|6o@NBRpMzmi%kxzi)>|O%Fg14@Hxcv7acwMSX@tLC7dg@_G!15n_S4 zrvTJhU|ZAzQm8)Hv!55>gNb9EsYKfj#ZsYqG=>J#uK+8>C2j-z7GRsuvKD9~ka~r= z6|F^v@aecZh7O;9K<$4NwC$$(7>oIODTnd1f@UnpmT(y58=urAz$z<6UMmvm3i>b} zn0$_tO&^c)Sd=lAXN|VU<56$c>>kf)7mo&QABBw`(MW!MH)MHk?+Z2B$J1FW)vXbA z>1lc1CQnaBl?P#fdp=-6G6Ck}0J8|+LvAtYpsx{XG@}DZ49>p}fbdDz z4}C|c3s|*b2NZKB?tU`G@bUGh0G1Z~O#tA_!92{0g>1@$E`kp^%SLRE0A}g$9o$nm z;Yk6Ec|?;rIsmAQAWmwBXffvn7@Y@@sl{vwaJnOVO8_-CvXPr-15j4Y%+7}af*Qcm zy{vA9`F8;dUqh}9+I=SIt}S6kdWHyU&ffv}SGV1JamU(|9S7OFk>WYE2!&DHz(85R z6n3w9z^Xs*GF1LXK*74PP1Lq_$QJbJ`77b5@_u^)_prn;rD;sCp1B@6=Lj?2c9Kn9=7_yjdp z9t+K&0$juxsvy?dzvI_M;wXx_mvrN=(H?Nln41&lm+X zb76p!Aqzutpy`Pi-&Htl+&U$HzW^2HObXBR^ORYfM*=;L3vf-a#M9d(Kwlf6WnzRX zV0KLBti}&&Bw+njfDQ7;vKjynGHMl!DS^+r%QhsjjmcXX>bdn=Zf&*q$D6xc6a=%-*+>5ac$6(mo+a!ljrX&q0^t6-KtmE)8$x-z!TOS z6JT*v1>2eW$I3E~dIn7@!2T`Z4VKr6Wp}`Ad{oeJi)jtZRs?qP--<5u4L=8i+EwWE z(O|QYT+ASTg9U8@ z^Ayw@{nz)vlx{(x!lE0;H>!jv@*Yo=VWDzp45`1_C9X^%!w4;A4m1fNwTI9pLp~;1 zjAoiLZ{YVBi%CHv2$A>#WqS^6qD9XRvuYPIJ9`xSrCrD}*2Cmu_Qn!AMfnKsg?UIPHIqO$Avcag9C1tYXMF5cxGme- z5105DI~!ED>nP&o9#Pz}==<>rmTzA;HICZ_DaR+-GX*S3Bcb?Yd#{L3xLc}0Jitmh z)TG>{PBGwL8Fsd0zb3Of`r3YRY_WNhUW_yi=3*bMReGUPvXJnhO6~ zw4&tCq_Ng`CN_?&hjJ4q?sUervmJzMd%a_G(Dsvub5A(#jKfv4SVz_$UElpMTE(t6mtA(%061568{UT7}B| zet4iI=PH!;zlZ~>Q>el}o-*etDCZcKfFLcY)L znp~(*&L7Pb7Aw@<&r!+}g{u5NGDk}ls`j5`>WvEZ^1mRoOrhTXd6e0tP+wEdis*7C z@---V++#?tTRbcQIsPI{DU(|- z2Afk;;@`=-x&BUp5AKaBDItTf+$5aU+zQKjYlM@f6) zO5yD8ug3x;`P4%KRrww{pM6!JYM)*+$rm&az5EhjlP_x?di(UxOunY^`ug{<=HK{6 z;`R60d6PRd-awyrrsQ9{AyublkbeSZs>$~h8tii)CHdh@Yz894GNc`P(tMO@4i#KyxwdunsaDdr*a}HXUJZA@(XDGrR+d z!(ZIFJYrzhlz|kG?iCV8P}Y@@fPFQJz2 zcW4_gpCX7}xK-YI+^KNhfs12y+?gIRus)T66p)rjBv!7HZbwcs>y>^^M87AZ^A1tT z7I(Hr3~T|R`j16e)~|~FEn~a%+2+F>EK(ot@KzXM|UjsIFIW~&a7^NkGQY1|t z<>B+3GCMh?jZY!0?11>DlCGV$vI@F6mGpm);ZcUMr1Uthi@usN~=_ zsFH))o|PQT23K+r+pCg;*N{pMT6B|(z0qQ~w zG^MXH+fGfne+=T6zQ#u8)MWhE5SG5qCgs$0^w*Vu>UHoSdzw}K` z!<-uF&8GA%jaTj84eLbd4vp8#ABIvbeOqb0{S}1XQCeSr1In)Suc~K%|1C%>eOEaL z`YlZ1Z^}8yzmJ9Up3(;UmtdeNeP3xq{5_bX4^+xfe=N$k^h4EinBS4*@{#H}+@Hl1 z{;srfehcG$On)e+X1qU>y6jZiME@d`R_P}iZ<61OGCy4=<#LFhpe~;&=M4WULZ55u zGyP61>o1h^aNlEk|4?YQ|0YxTQsW)vUq;$LHQv!azfE8IFXcSezlyZ46sq&nY_MOi zm(&~lY1Hf+&HF;XTREU_Rpw&XWJeg+?%DlP6bX!Wrtz|iP zw>Kh(wlZe(_By0vUB_~&$Ri@1jn#a!xT>iW@MX?bAoExC6)pkH(Y%Un6)=;VK==wu zEOV&L9Kuf_hk!XDUIDnrvX+I$R>(kYs^5WL;SUMs?F1-i?{F+NNFyeYe1BQBxLve3 z3lUTcg>ND(THG#LyhK>ExLvehWvCXnix&L>_xylb-swyPFQ0ln*(U5=GIrCd+5>x* z#{N<0y&eVcXZTmupHkKFy~ayWKX#pCsV5K7gsyzCT6H}|biI;kONl9b7h%!$6w&oL z!lLUbqASk>sF4yoMRZNf-DK-FStRy78j(HBu}p|3bs{mow5^HFl*CFDT(phcv>(sC9%^0_oms~9`3N!ac83sy|e5OB+t&dw$HLb0A~eY4BYdL zJwldQ?|{4SV~A$)#Xbbk`8R}o$5LOODhi!1fzJJ!jqT#_xls<`eU3R8Ts<99n8I3S zw5uo>kDZZRYx;adOwOr76~$vG0AsRj&(|S>v}ugP`!J>+Vy!7B`ySr|pEPzp@wO}Hp|3%|L2O^C$yCbP zK|GDKtk0Rs!sq6UQn2u>33rfU2i77vo0Q2c#QX8JX5b$o!X6r;1`^dm)K5axSfbt{ zYFmh!PSixES{2*LARe0wl(`ynV#jdt7Z^WY#As1y{Fn>ocOmM3Zu}^=cr1gQ-C8^f z4H~ii)`2ZfgGPM#^|(#Ipb;N&HsjXdc};^xNt;2VWb6Z=B%PF)G)l(UL7CXEOzHLmjz_+0ta zXL=k3sBNa)68I7RE964OD{jXHyp-%ZlR?Yy*xQoC6gmzjR+z+8DhmZYCYm^eIe~sA z#<#o^vzCCEb&?%8y55NUj+fwKO{YI&-0_l=o(5F8a+FC<*1Nq&z;waKtLZQV7v4#X zj1dW+hH%ovC?RA7mgs_V zfQQDZnp5MI9z6r#^Z@Ko*4heN#f&)BaB4c0(nTkEc>H{cTZyt*1&L`=U55#}4#m0- zi_n$v#dR(QzOz`uQep{n9oC-f{7(39qW~uEI`ia89lJQC^)DjyheEj&!Nz|Plu4p5 zlSE%8iGI-}kx{^V;(amj{)5jb|5_+~pYgu~aKG`-N2h$i`1=9*pz%w9e8~8l0j;(E zJt)3YtiJ;(uCx9tsNPepzW~V7tiKLLcDnUj5#bE$zlPvk>+eKIUvK@NV>~<0`UivM z3hOTd^egMnKtfxrKMSINZT*uW^GfS)LU5J!m!Qh-wf-jv?z8@lK;Cctr;!kz#j&R# zwDj^AGJuS18H1;W{}x1A-$H)OZ-H7R{%432_xW~a!rzCr>0gEDDSs!DbNwIVn)YWQ zR)s$koEiW3xcB@&;o8Z61j={ux8d5&9}P@*|4UqJnA~mL?H5ahS}2f3ARMts#KaO& zDHe#%VtMEy76)G}4PC{;kQ2*7f3YYG5KF>9u^{XrmV-fJG1yZq1%t&xu$Nc{hKNOA zZ?Oan6$?N#xn}meVsgz2_jGc-9#zb4Ry4WxbaKrmg2}a4G`UU`O|CtiTvH$>*Pc$U znQct2J)K<7L$kr;+SAGPFGOZXPbb$p>{NP1lWR{W*J|DKQGckxw=`b0r;}@q*UQt% zwbFWfI=NO_U$1C#?djxNIR|<=xmM0Wo=&cnHrUh2wbF)oMU!i_d^@DTJ%K_5<<|-kKgRI;34~DTosy9@vg4*wN_j)jur- zNz8$FV~D7h6jzaP2SJ&kuA(jpWTfZOs8hR!)WHCItugi_3P~*4WS4HTHIpItF36`h zuRY-aPoI8w-6=NEcF3?xo@7lntzco>q#AN!+f<^tZoa@n7ZGiC`m= zE=)+j8pSf;?a82B={x`u+wVXQ1AwVeV!t7C~}WS({p0d2~1-f-ae-Sk!Sfq zAkRBefzOJ-_o$=@d{*Z0L5Zo7&#O#rH^}%jX8diHNd>2?k~}9#W$qA}2JL4MPhYV+ zoV%c;4_F1h(@x2ISkj-UKnmmJ3QF>DB^9_+1kQwjJw@P7nJlE|Z?X-WtX8f{{~U-q{=Ji_j!+)|Oa zfSV^lDfeLE=F<(_F$l3EcH!pfP|7`AxVdy6$VY=6E}9nA{76wYZ2kT1NgSG{?jn*tVm0&ifJ>Qo>zf43HZMY*WJxgzi)2pDibdFP72 zn<9bp+6g=tGaC< zT3e0Ov(Y}ei$ETvrRqH)0`H|jQSS*6_);YBFYN?&7U0B0ING5XbD86XB7jY7Mv z*5WPy+$l5GT9lkG0a{t4Wg`|c&IsO^9?_uWf& z$$j?{=03sUM{=)G1_M?FsziYWfT6%x=6law6nHyQV2~)V0o5%39DD6}O_oK?55FMaJbg{`Jx-GC%`r)&jgx${A8P~MPo%YVp?>VO zQ&b>@@e48#$Wz-?;K3r0tG|IF@ZeqZp^~Szlf0c(bc9N#RDP2Nl4%rB$+JZAxm1-i zR6DDL4~r`!RcE&o_&kfeUIkJZKW+noJT^`R&J%%;Q&kZ-uVfPh24ngFnJ>;O;Y^FB zF;#kgyEN!`Y+u%1Mfv<-4$|PcbDG9W(yP9u(lVmF6yprM6NWHtB(KESN_j*Q8p&s@ ztxI+pPIyk8O8ccqqs>~S{Zgcz7)iTSq}`&@egVPuRFy`(_|YEd#)Iut+B%W;IHk$( zxlW|L6G=Nwq;*FzLbr*mp2l5t<4JfbZK+5b2JV6K@L4L-ik^_mL|`zdhD^ROVvpEG zCeP1PnX^RZG|1djo{+P4l{veeOdb(tZ&jJhF+Wj+T<_B`XL)*8oG~16f1+sdP%Fk(TuxNgprLdviFGdBS+HBaJ1@1*RPzV}qi> zK~tL`sWk$I^v6(3Hor@G@Yp{skM1JO_v7bm>fPHy9 zj{TJ2-K4(DL_Z_=0>NK!Jo%iGzXOOSu@ad;sft$Ah+oixRy@^FEA3*LllNs45j`#z zi{W^}qR7P#HCY8%EA5vuM}HD9r1xTRoTt($xjSG;=edw7eS=8zn7=2@ zQec>Z2#I-{Z2cyyqwzpnxZd3ReWv%KWm5d07&0=<$0qcAykBHr;O%y#Ry~a^;)T%w zJF{xPW~3L`BBm4MRL#D?3Rp$(7#9BvY;ZRK#4Ltmf$Nao-=54if2FlFp)x^!y$p%+ zpiC{jUrQceM9cxQ1@mjmbaoOxpXvNsveXaJwDhi${2W3!&6a+r@YfSwMy;QarT89D zeUH-^|4D(dqcnIT8m#?`biYX;?{hGe9R?%D2bNZhKLa(K=9vf4K0m_0O*jL)qEDR! zT<>OF_6jK@&I0rX_(yEQ%@JS8 z6p7lUDu}usH$kf3AzELw72Dt(Rva~?NYsWNLDW-m6GXiM(OzKGWzM<9QA3JEJ-RxG zdOU878Oh2y5$%Gbja}&!C>vrW+F?C|Xn)2HfBo%VY@s8pR6QFYKb?n0$Rk;`5e}C| zczG|tVpke2jp{bQ+UQ0~qx+t)^o3DE?^gp@%u@SGBij$~sAEtC=iq-jgb%~uyFiAe zpZA6$qiz9y0&;vYXoEeLz#_5y-3aPPTK^mnef$HzFW=IA8-%?=CYWnc`~UO3N_po0?>cJ7hM@nHjJpGQEZpLZ??;UIY$u1mgIoG+ zCr8{%wwhpzGtsuinJDntPK>d27=y)UJ26)75k-8q6B8`Gr=7rOJ2A;#AfWhcCnnp+ zM7;WJC!!5b@!5_*`fPsWWZ;Xca; zed@>?K!k4DiD((AISM((I}`&`s&v|yWMrh$LodQD8M$d&I-LYKgO#p;pD?rP)FhAw z<#wPCO~<%LF>03pbX-1X%KQKX4qRs@Vko@>Yk+ozq>@Csw^G&-K7duXX(K2HY(IB zO9y^;nL@p@=TT;pLV*Ln$H&zm_qeygn5ECD+dNC^(`4y;>V^*dS#FcNp#y)GzNl{K zz@Md0svA1+XHO&)I`C)dqw0nZ{8=^xH+107(r48T9r&~KU3EhT{w#f1-OzzQOJ7zu zbl}g@r_~J|__OqFbwdaK?13!r(1AZoUsv}O%~4gBKCkXNg{rd;lNLJgXXyj$h7SB$ z`og-Q1Aq1mLZJhHmcFrWu>-$*5qn?UVJUhgkaVv5>#IspqFma!p#y)G4*c$K-$Sm^ z2eWkGcenlyY#8#gcd~A-e@380mJa;xjei#?m8Ao}dvgqP7rY{qr31fvYn4FhEFJjW z+lL8Mk@XP6{e#lHEFJjWyXOk6LzWKw?tP~S)G12`e)qvk1nQhUjPd@gG(YA>$k^}0Y+Svv5$&wegYb(RkN?hBfSURgTuyDw`VdS@rF>|fJ( zeY14nci*6;#i{9^rGuusL*ot1(t+Ro>pnsol%)f|`<_CBvvlBhKb#@7A=xV^a7bh0N1gfnkK+f}IGC z86h^qJ484F0iF%G1`hl@O+nTDG4512@4&@TJ?<=s7+9amKnh4_MkH3QlK9XJJ?&}d zSJ`y2Q#$Vum27e6{)mAsKp231JHoPlHQH|xD-`=xL}#rkodp;cGyShRSk`goV>Hqt z2mXD5t>W0u;lGMw7rh6%JL&pWpybt+3Si^U35qLKo?C@BFRoPi0#~Z^af|}q)(6OI z(Hm|4!%k?CdA_Y3%fF7PLkSs9JOyn&FTPfJ^|i{YuT@@st@7$?l~-S@y!u+@)z>Po zzE*klwaPC*Yd+29*P#ebw|Vuo%B!zcUVW|d>T8u(U#q4KpIXR(bKY%8Rd6UVN?c;%k)`U#qyvUH37a8*6Yn7K58S?TX zL!J+d&Utx}Aulg7US4F#%Zm(od66N{L4HtPUS!D2iwt=V=6mJk zMTR^F@4fRJw1?&kUSvo=$?W%NN%M^&IX!b%3xan7!ZTMPc>1&k^Uu4L>2HENGMTRVWtlMY{G$kNv;{Ws+tl%=m#I((5KOJA$>`$`*<FmhjCfDS)@PCN*=~%>8p|sUu4MA*DC#q#+#JwMVX&+NOEcp$_4qs%*($^~ejplt}mcCZ$@I{6!eXY{psV+;h+;~cVudSz1S4aOsmC9-< z@U==?%O2|e0%OWG<-_=0GMST?59ci!oxBrMK2k+G*^@Eel#k-lk@JCpSYMUzs|AtH z((+M0hHDTuELtnd$7;NMwg;HX$BW~AO^@ugNUeOotE9+!X3H>=mG7^dHCcKOl~4S& zq}~T3bqVfdW%zsCi0Y@BSd0QDk>s6(*y)PN9$G{x+>R>_cud5aEWMX24%GFolidf# zuZn}nMa91YPsPDJiUVumY+s0|n4-0tLXu1=?y#t0osm$*G%k{>Z9UlRU~6fU8G?V< zW%x;;p3Ixw)AHGzShUG5hI>*kdo`JdS<444nWt(5ek!O&9HjQK%>MyU65Ml;7`b6>eqq@9_`b;>{7Ml z&lpn5pR)z+!RBMXVDXuOJnp3LzsOu}ITo5htI(e9?1P{olufNQgIL-2NJU(b1cGhB z&S6`K$2J0C_MAxVKe1B&tf{+tO7*gAYvlchotBoGYfxZP{yQzp|7n(|*z%e;WvEL9qYE)&m;UuONKyRuB$Fw7q|Vo8R;19NgSD5H}a% zX38EA+vlum7;o`^A7lIm==DJF{X5(|MEcMnkhb^z0RK%8ziL|x$d>X11pT2g@k3KJ zQgo#b%dXELz*05}j|05VmTJT+lg4%gU`TqOlJ>KfMX~{n0+RSyDs5Ner4cWSBq@A4 zVX+5~w;X-0AuKP>j2G+W6NJUBVZ4|aYW76RHB4uMU5`YU68<48d4GZbxfhD_Q`YfB zf%jR7)xVu&IrCz(=zj-!4^ms*xpto(WIb5GBSGG0{7k@81bzeXFxe)XDsXZr=;8x; zh`k6&*Ao6C<4=>CyB6>;d8g-4X~K^IHpA@@a`d;B1#*cNN+*sNN1|k8j6yrCVjr2p zQ6V1NfL1o*EksJ-eI!(hwIjws=dvA^<|;sUbO7{X3F`$=XGAUgT6`}64JGZ-I5a11 zI;3PKNc*#PBwvTY3q*fmTJhLPiM6JROFJ&9N6`429$`5#L_8XP(<3F5){Z(1GVNsA zB@wMLzSfL9g=IL_a&-vQDxl1dp}S)yr!d9TBRmd6$0@W7Uxd_~us`uXw+shwvF!HM z6*2L~#;t>Lg(lvTwzpUk!>2gFu(JSa2{0 z@A+`!(iaDFaEp`{C%(mkgE2n%cHF~IY%MKWW?5+n)Wam87Xxr-)TW!Jlc9w(@DS+4zI$bW@s)G*i)ojzV{-Q z+|o&(1MCP(Zs}ybgC)20fEX%MpR~NId=fl?CAVV;2bSE@1D^&_EV-pqNOYYlTw}A@ zY|k7m2o`>3Av$i#oqIYk;y&)yt}8Q2-6q`VNbj z;L_PvlDgVsWh~)HbAygHIXjxDYwdH0LELMKC)iE4w6{({(RADgYbxweUq}2H07#5! zu@%7f;S(ahNk%7YO$#0S>PZ$w~GW0ZYn}P;#>UyNFMuw^V}|ZQZ5$Zej#->#jRu#hvqTt+)(PGBPW;0iY)r z>g#230TV^Woy`D}GMtyrejE2v0HsI%7R0asO6Mr#;C(-C-IY!AQIjb~Dmzq8yFy7Z zPi50dz$jFP&j!t4R(0!+a>Lgc_XbBt4oKl^jP4}aiNo;jPS!gN@9qKhVA1z&cqcJ} z*BDzuI2hjD11VF6cXtYj9XR#iCR&h=z}JLu(scgBeO-3sx^Sb;-5%USfj4A+V>&E@ z0M2woz!(+CFI@<{)A-z|bKkU->BQQD7bciLSVhv@po>7?xUxa#Rwn-hEz;bebE6Hq zG&ktnXoD`z4LUd4pi6Uu&Mn-admJJvScGxsWTYmK$@G~!fQ2O&=%hR*%jfQi0Vl~r`wqL~|G)2dq)wp)EG~Rm@tQYF#abWdG02kV+k!`<L>n-j}!PAt1QvFzr=vYQjjZcZ$_ zxdO{>=1FG1dsF7=0eGUPxIE50!>+|1K+A3>wCtv6+08u9h6BrPik96>XxS~}G$#{U zc2l(MW?rU1jA1ESb~CRs+nAiDXxYt#mfh5AD27aE*-g>1o7t|tsxtK~XXxUBCvYUBFX?;_)>}EpCZt5)zM48aC zo1$em^Ec%jl%i!f6IymtwCrZySK5#iExVb}vYVo1HxpWRQ?haMk?J`-Maym`wCtu@ z81G~Ho8X9=6fL`%(6XDNWjFJQ#+#I)Wj7OAc2l(MWXxUBCvYQDlyE49KLd$N7mfcKf*-g>1oB2lbzA#10 zZYH$srfAvCgqGbDExVcTwecg0yD3hly)k@vv0-s8?S+=z6esrHc#fY=O^+1k^x!Zg_hkES3TaucO-RMb`QXvOeMa+ji?^1db~*_!2t;7!|c8%qWz2J+0neE=6pnC z$7(@2qFr{JYF8rKWykYzg>w?5$z=D_3hgXSCObi^zDueC^0R?sBa5m*x4f|SN1r5<9hylo)ZrUH*A zP8DwB4r@H_tV5Z^9Ts8U&Zqb}mg=2@f2hbe7J4m*`ICuUz}PjmE0eic9@peb>>-?Y zgP}@RO&9S~OLu~|N>)u5u`G80>?KPq0n0{0t+y%X7ZX7p3Q#liOQtgwAkx{7+MFrr zFpVvmPG2-@P3H`z(+pls=M1Lv3xK^?z4i=N@BIKZowJzE2LLslvzd-FO48ZZ1?jAm zbO6f_Ip@dLHJw(bGZ4I*j+mMcC&&@Rwz3zUKv3SHXk8BhTL5aZtC;Mg05#dwOm+uA zWbY&AxRyyj;d1^*%vJdT1tBPjV9#~EvGG(gGEIOgYYfLf~KSgPj$tVW}l$RutCfTr^y zbMuB}Vpr@bIeC)_O6%Uv*8KrR%4WiLHs_&Z0DgrVE8tXsJ&yJPzRA|zOi&v8TLiZP z?EMjh*taP)9?Q9F(f7Ha;$%VkJ{BW{VRKU0F}*LLPNT>Xj}1bM4s7c^3mAqALl&5L zY%ehM9zqR9y@wKjWj_wYT`bFesc<|t5FCB37eqax5Uh9+tbJ*Ub$3`UNU-eghV&dW z9BK#4ZhEs9F1!09&K3Q@^#8`Po9?c$aTg&2#kNpl=Q`67H~j+&2v77O(2D;G zxlr+nCvgEUCA-d1pk)GE=ry7WF^%>R#F`bS5oc)39tqZ zl#@lqR9rjSCAd~loL&TEcdg*k1u1c?ciYxe?liiM>x&@eGP3-N0^|}&0sXhYW&$_L zp=gbgUv~rfn0s}jr1n@(B{-V88?{4>coGDM;D0z|)T(~^0r`*jH zkM)$NZj@94Zj|0`-6+R_)paJ}+R^?H*YGOqciLmj5rot9_P@W>hGjY}Y zUrUB4>lN(^Fhi3FJShKyAv_@-l)PgRyok^}N+HKn4@!kfye|;RJw~B~x1HHMR-u%4 z4530Q1TPV9+yOs2c=i! zLFw&exrH8-UXcf-SL8wIap@F!PzWS6naQiDFGJ%)o7_6*3_0rra@r|cmnmj5OUEEVIO)kxu(w(gT>$x0*VaPj+ zC3WLZ1xk79rTHs?%EX@I-g=inX-~a0ZSRB#Ov=pK-vzCH_%fr&9{X%$Wt#(g$8@-rTM+khIm)7jee|y-B1q| z2QN(>2#0yYmZ7~{b&SsbC7;3Bm%6+Fv9&&gujQ_3f>{Y z=LlTqD_n!q-*_U03h#=-QQ^D;mpnY25&+7;dQ}Eez|bcm9Tkz}?j6m}TwsG!>iDjb zN?9AR@(xlM!*!NM3~Ur(PR@<6cZJvrxeHR@C;2K}XG_G!`c@rTq!mHIKLTt=%i6DC zcdbC@jFRB1o}Kw*;lrmhN6zOk7Id-O&@AjaYq=xi%f$E;#+8o)*i+bA!1Ql2on>uZ z#B`=G@o8$$WFx|MUT<`9yWH|?@|)e1R`go=k;Mb&5l$I9jKuL&g-k8l>*1hCgFh`SbXYvlOR$0)AXTvm>BMbx1bbt^>mWp$4Nc{2X( z4|XC~{T!4*zb{#{{aL@$K$%18k^Sg3(ys;=%Kw7$7g@?)hkumGv`GF!%6}d5MM4wE zCsM+aVhKN@1fI64KS2~rb3Vok*N3nYXrw!Top0DBo5`UK1LZ&Dow9!#O5Uq+00 z>^dyt_BftAqwj}gf@yZFfsYY4Mwzyf>2k&zLneZQg3VSg3~**F9cf%+V-Ar_^}}pes22=1s~;I@TGCXz5hR{vU%{j=jT@iM%rvl=~h2Gf(4!4Z=TwuVm7z zB%v}emPI5_x=*P?RQ64%n2OKlqdG~WQvAqL+(LO1BPl+o55U-w5EfrZreG)dQHboo zo#5nfEUGcKSAvz3%{{)k0_luX-ZA7_ka)c zq)yxkPEE4>0u3fgl}IQxIe6hS(P>LHh|x}PC+-ACV5uo}HbQ=9%Yx$pt6k(mCA*xC z3+VLgDs}#is}Ik+8t`Q2BY&Mr|MCFtlbo@Yjqd?6t8hSXK>NQTia5zf`T&~z4}nUO zKkf5 zlpUo|2jpTRG^Y1J7rC(1p*mMWT}vHms~l9QOF;ZK;=Y+n=nz++?Pr2)6+Ef zX~}(hhUUHkxu<}(+;^ec(2Kfs+`vqg?{EJNKoqNJEL5ywd8inRzM@&75|ibIP%1NW zB05J>wy8#i(da~(*;iF@lKcuqX7rI@WBqZ?oEf9EM9{cMlkyKMfim&LVafkO4(H%# z{}TT3%s3UaJkDOZ6d>%5_7JFVn;di|{ek5Pu=H5AHxEakN_*n5(qq}s5Ig{2b!}}u zrd`fS&@CQYz{owVLrHg7rgITW9fD57xUcR*9V|ya9Dz|IF~4~plz6Nony8AZv>yoO zbBIz*FZ;b<-j6T?Y$r+X!3Zi3eFcloem>n6`b8vUSy&#z* zLH022DaDOOSEACW`yM<;Y{jn$5VyL%C;it?9>sb`R7`1s?)egV5g$_zulW01%ks9Fu+LH3>ctWnwQdhD(Pa)?wpNU;@{0n7g&p;CwVzL!FZ{rLvm zLhhFMTGMweQ~Eg*1?HvvTDUbMua0@fizYI0L@J!fJOxDupkEYDWOny~zW;-XOkleX zW+8E#h+BN0FDWn2Z$j=-hq#!O7(`3$Vyb_%3<7M}4{PIo20Uf0LSmc?(U4sn6jBEj z&Gl^6=_5#-`3`QSI5Cqs759?LSGbW>%1wHIvK{8KuJwI}^7liwY9NKJ)TH+$+u`&L z4%s~1n^$8jx0A6?9ZUc}247*har=S$wqd#GJTUmEVN5@2_+QQXg2E~}l?m-vha|<& zUo!k$YKbXP$%sX`!xPAqa7q*#GZJ74zeN}uy9KwQp+7dpGLvHHkByakL=r=PY=WiN z8lGF?^czhw-Niq#jKEd(l4qhYBLvsa;|<__@nHT`5% z9B>08**+A*ja1-eY#hjaQ*8guL18)OqK;AbuFMyA?`n*}9Z<5tu-L9&|M!c!5^m|0 zjB7;t?S@6}VU;+ue+^24ZnMsjb!5U!lWwz)lq(k&ap^d*k?)a_v#{7G-jb0WC${f* z0yznGoY-hC$k4MBoQ1{4C@q0Oq6J(j>Dt7VvOs|4vQM#$C)kiw0z?_5;P7;E+p$2n zRKQM=*lEs7SewL?l?>M@6X!u05waJB>;WcAW`lKAjf03qSo1~Wof$##aaUK6nnC+k~aEnj4; zctBOGz{-I(GV>KBWN2Wsv;Tk?sJkp$gvU}l9i(7@xV|!~#53Ae;u=)q7$&*f2mk*+ zK(IQl&?<=rh%{@YaDX7gx60IRfand@Xn>d|@d^eA#_`d$(ec|25Upg*+FNvhAkR6< zS2RHUq5S}H2L}jFxuXH1>;H2D#DEwyH-GIMwXJ*FwXLhswrGU--yI-!ed8`1E9~?t zh;F4%vw!+v`3FBL*EXzOG*q;HU){yf~E-~?WydM&H$l4vG$l~)sQp${L z&n9W5W#Qkf6_DNt67L^ZxD&cv`4-?Vk=nIO7~_094;XTMt6USnl@V<&AmtYFde$W` z9WeEWW^f#UY)b>ilS|2$)~^%e4vGZ5QxEqSgcn3ykL zI_N}=!=JtSFNlHhK!2k7*VM*zE@HbbV(GF4#Nf11+@)E5%vA+zc4PGr2W|Ly;5tl# z43@e9fkgXs*FOLXUo(e|Cr{Pln70H!L_Y`7yGfasSQdJ~-JPj~Kbx{DI6#DggU@Tw zem91ads)kLA5_ISk<5R@O7AHxVl?!tO7;X?Ba1b=!1SkkK&n{!DIcE(O~*tu*83gj1kC5a%ao= z2Qxz7?W<5PPFx;Dn1PjYdh8?uFj2Zpn`W(%lQBJCgV z>b~7K^v!ecaA9U(n1LC>kTWw314EW90%9UZ6(mSdVZ?v|5zK2u)`%H*P0PAsK*WSO zXI&Ko>T6zCf1l4&-Itkt_w1f`-{1M3?;qbe=l0a|)RXF|>Z+%zx~oHr^9yjmSQ#S z!4Hjx<0*UBw^^X|s9!utTt%uc6e%j`PJE})qxzCmTS=8tcd~+#I358cb2ZuXAWO?b zqzP#s4}!8_CeGW{pqiW6Owk@R8$y1hkYP$u03TC?t`ORX7BW+jHq6!o96t2xrSPbPe7sqbr;|{iI^zM0oRc$rAjI8%qHTtAVV8*hKNg| z>1Mh9tIkkt2%Q0g^G`JY_f0tO2WJ-MZd24TjC6(S3ew%Km+x52Kj@-<=h5D#SgW%^ zo4$yYx52MipVT_~(z^SUBF}Ek*UIv(yHBj!N6Kcek@Y4)*w(|iznVQo%*~3;1T!eR z!H_SljshjMnY;ol}=DB=i9oh0d)m&M=QeL`?&4IEmVYm_HjQFw?YwS{h}!a z)K20W;7t7ooWTjAY4DU+uN1>do0eiTO0lW-KQD#9o>K$4JhJ*!=(b0i=SGQ*EgSXj#iX0S<5*wFXt#S7U$(0 zlb6HigC|kWOizxhl9V%5nkSg#57ptQwxz(2hDiMf+&uuI3y#N9$5;yN0{K|+aY{iq zv@u;=rtob^V_T1)!N+@%#zQ;`gt0Km%I0R3-(*`it?XA(*_pb0Wn1Hem^A;B-CLP~ zS^Dh1e;?A@<|#1B>%1M)YZ0>P85npbvVz?7bb8%|WC$yKPVe(bUk=^>?NQ#-krS3p zPaJB%DvU57#GwXEgC)X!CLC%Y>$`ZLj+>r1)ZiG&4Y*K*2YD|O@lIr0DKhh$o)K<( z=0U#x%9z16`-3;i62ug*hXahuh4#jG;sPRyw9SFYODHFyLdo^Px$16!5gu_IoF_F+ z`?yLKoG)2e2Xv1;VSy1`Ah}j~gK}pr#is86BXjcfwNc?QM}Ekk8p@EVjC zn&ELOZbAD{@EO_pU{l#n;KGZoxLVnA&<3(ok+!o(A?;*0fHIi<7}rqtY6uQzPe5)Y z8*PozJG%?!N3#>5DVF^ex$*2^$V_A(1aC6?7Otu6W?a+R{-7_&o(=j;wiJ}vYyj87 z?Cqd$mi+{2e0Lp%YMw0zWs7VDd{C6V3h82_Sr=rCh;+;bV8!xPc->$o%tsxCmL3EG zxqD$`q_fTn<%(gH4@Gl7LqepB&P(P7LAVcPaswMdx!lh%*Uu}?T|4$5RGRytQC^$e zaWF2@UCV5jo5Va1s>)T;77yy0>)HtFnY)pcJvCq7+}+gPOG7oe%i)el9}U&zUL~am z4KbR@K7Huf+u(+r>_gYyjU@b#<37DR=p}*79QWznA)g5p$Z?E=7tiFdd1swwyb-n%p**A>CZj zNZULc>1MLU9_#uP(m8f!v2IMV9WumHU^x&?gZX0MOJuL!Ho1n^ zjJtBlSiflw1hE^8_2)!`70GIi4VbJ2N!7*bXf6chxZNJBUjimPFq`9!cWjuZ46%A* zBXxyDqE&m3^nJ{QC=_OH{T16wR~0p!qo2XK+>7skq<%pt9!>z()8>ZSa4H zlHOCbdb#egE>L5;i|0@^N_fiIu$3rvE(!9yWX-X(iZU@zdV z=ttJ)10-JvlFB|Po_Zy~0UMs$3bZ^N+HL`ypkC7xC92r1)wJJCn^q_pgalV3Hhlud z4p){U??mm0nMTLI&_U-bWr8H5$=ZKJ+!I*D5om7CvwnA_Q zh?H|R^%PPknO7>*ET++!wd?=EOI_5%s8nT|9L4-U;4cDm*T%HUGL3GPtdd!n^gzR9 zS_?m8+5IgDT?M!SKXt6)CqH{|f4=!Ji0sMSO~|=~xl2?p=HwR!I-b=H*iojUyod0E z@^(DFOkJQqT1DK;8sC0JDe$){#qpE48wLpdlVQyF9;VB05hrwm+NzCgCbtPZ4zLs^ z1o}e!)L)d?JPPTFgkM!_Awz7w4#c`dvyroqx$h}H*ekg^^SR7f%G?js1Agv@%oR<{ z;e(d=_K4AqXLqTrsc7z3_@RjWbVBd@kp2+ADp{GRls)BNAfop(K)#P(AM9CGnS&uT zF&r1f&EK(<+qGvz6vKUd&Pq*VMwM;^LW&DAHbPI;Z*)Z`X#|y!Q?;!$4-X~$IU7l5 zhfUykz)kDDuVb{|Rsn+X-g*EuZq-^pgYZ7HX3fCFM}%+83!5nL9|8Bhn77EoPVXV$ znTB7LqNVE`GQSN1Y^1Q^b~}o6OHD=D4{G^5yS74F@CkaqeFO;0)D%)ScND1})s*#l z%A9EKt|^~pJ9;pnNcFy^Tm;ItnC1RiZswtyuD%jZ2g$d(x_VfFtHb zAgrcAEX9(G>KR~DcocBui1x_uCAL-GRw`-AslJKnWr2kdjgE?rZT|?} z<$d3hDw7Zm!};+mt!AY~HJ?LlRh*7kZBb2Nq_1X;MLAW4%sWZa#mK9<60+{Z@6Qm# zhI+2BbwQTV`%U1TI=`|Xvsl@~nPaqH!RlYFy+BjCYIC~bX;cs&sKx1238ChnZ4gtSX zk#?H^R}N~A{1rBR-Iasam5}!Ue(G9V;QdI4;68P;hHH?X zM))qUK(3b&TiUwjp>24Sk)ShTx?wA?EOkMwl-sxKCru=fpH8 z<}HuwGh(izoCA+*10S+coNhGGTY zo-&Mq_mqJoqecM*uCG91Y($Yv!)%pbZRpXV>1xBfXzNkbP2&~nfA)ygf3)9gueau^ z-6*QV3AmM?fIDpU)_lpr1U$$IxOH#>9^?evS}1R!$OJsZ`g|F`FfVJdOzJ-{?s5Wd zEmCWNkE#P~`qwMA_~Y?IXBbmI5*O6*DUs`S#whqMKBE|Uj%-o1gbxx+;T*uydgdlp zHiBkjW2c00OesouKucjm)>2%N(mOB3Z6d{kX2)ghh)UjA(55y*&JO(2GI+*y@H;2H znMUioLM_1TnieJ1G#ao)DJpk{O8F{G7_fl&&5G$0AT-Tm8}KfP6k|c=8Vyw;_h#nq zItcsUs?3`2LV-SCH>qM2_q|e7(MGFTM>RK+@jJvVSl57{xO_M2J5lo~1)s_MA0^-a zqH3Y~fJl7dkAnJYVTI~RBCj_U5u<(ND@5L6Dk7%)$UAAv-KHX9m5;oR$OlYC#AY9P z8Iik8MZ|SJawCzCn~I2?KC*$xQ%yxg)i7~mGwCD_>nR;T0Sqxh^vFoS(&R9ilbdU? z*-uDvayKrKu2iX<^bL1Ns0~Q^g*+sEf)5!Npuw2NF{SzYG10N<{m5rd+l~X#f4E@n zFZG7ZK_{UEHeRGK2Qy_z{B$l7LAl^j$6%Q6QkeDgfsCk~bjtvx9t7m>ssm8NWONyB zMpg4Dl19wjB-g#T#+gj0z2vHwCu8W#A=;l26f@ZkMN@;x_zRjxvQHk&i~%n7J6uRU zNwahVOZrCOs*s!Bfy5+|6{sJnVWcA2TusXT)C|I=5w!1QP-Q8L1her|qY5iQP}mX| z&g{wFmByk^T#nAQ*(=2K+N&|Wf(@80g48rFZJn=`0kF04Ho~v05m~BI9l51tVW~=0 zF@>4Eg{3MV2n6n}fb`BfD-_^Tl@CP&T&hxCbY3#Rr79oF1h`b?L%9H#s(h$8z@;i5 zDh+U{%7@wnj)T>zyO!B5z@;i5stQ!n7B8=BfJ;?A)H84+DSK+Zz5y;(sa_hY32>=O z_0dpWfJ;?AG{mq2!6V>0hu$zdw$)xd8GbcB573L>9`xesfAC@h+V%bxV(p7l$Riyf6#mThz&0uvRBTBZpVgFdlh?ID*BetY7Hsp zIk>=Hqao8-%Dj^_WI2Cf9^Y64U%;78Xsw29r$Z+|>onvz#e^C(gg2npQOv0aXoF>+ zegkdzJyB<93hXWtI#WZ+Suh&V1`Xl$tlOyQtYzSeC+%}TBzKbZ8!3n-m_X>fnPQif zSTtv~VQ(UtS&nDoDdt-M;*yYI@wgWI{JVgOceO7*(=?34+*xxC`x3ea(h|$&oM70O zYV9GX9my{nDYC=PVw&1O2O!fhBL3n+$;g69o#mT$>Km z={zTjwdp|p`4Eg9hbXrW0>kuuA91-h9T>S>*rKqcJ5&BCJdW89U`SDF_);21>p(RK z2>mf7%F&iO=2WC@#X51!Kmp@fnAu5WYh`sTqfYWcrF=a_TBTf~MFmxqwf z02r1F?G5u`E)Y?qV=h8oM9wmHNAE`3r8C?ytVY--pH_9pG6S|mm*889ECG+Lb<8bf zy%+5!8LckD{Vl}N8Yam~q0s>(LaD$St<|iNDBiss$TzUC6%&pMrYUjza-ZpZDL_Q-<=AL_FGuBGj*Zjzava5? zfP=Sfm_>k%v?U_1b;cJR0t&G!er#jA;){K|^jn=8!ZF-DxIeLhTV9UIQb*)O;^g#e zDTmLnC1uMkm>TdzT_;eBM{|@#L3y(ZH^HsMmJ!q@!Y&~A3h45#02&= ztkm@!7ba>#(>;{Xp&T~QI`En@+CpnJfs8&a6sK^~jN)IY_PbTG2T6u}Pn|VjkVK}}L#iz9;KaymbqF!|>F8bWP zrA)TMCf9OifOZ4^715lM6DXxYKP7uJu%$eBU!BU$N2B#Kl(t4Gj;vgD#?W4d>IS_G zx1Z78&-BwZfqkyX*rczPP=Y*iDoj7yII4qG$Ep`yUJ_We*5invV!v|uBE zzEZGI$_MNQ9|_f(=Fu<2TMj2k3W&FJhLeVgH)}#{j*Gy+s>1z@SM2nGPR*2@F{%P{5J6bhyrQoCBmBwL$Vi4j+CAjMY*i4j+CA zOwdr&SxhODG!zdqf}Ns)WKbg5X&OpnoMQtHo3tw;=`l#Ta-sRiIuwX#*zB99pmDC3 zIW3PpgIKvpRt#sLECDKR29CZR{}b}~OF|xhNyy_b3GeZj^6qFA{mEqAgH~aWdKBbg zlTm9@y@9JM7m5b@J^Zs%)$pP{GH2o+Z(n;7RnVEQ*8@82et}Fp?zhyiCzF$7Ufi?~ z?+2EIJP?|=6?#?TL9`7s(Y-6Q8#1eKx(oqL*c^pxQccHImufK7yS!k{0-ldMy`Mpz z!??uh!z9(SW}W_w+%R@Z?KuO!6)4~^8gS}#p2IqE>UAxIq)wb+5k1H{9C4hHJWm5b z7c6;^0`#mRh2t{b0GPyf70h92#5z!YfV8eb%F&jF&7Xk{$>+SnW)k?g>5SouZ$f4j z37J(SWLA-oSw%u-6$w47uqBcUc5MKI!yqBpjY$+V$Ve{OeWO6y&%qwPpTj0Kq`lKU zI0?2Tk_+~W)9*0%u@B02G2aG0iq%Z@jKBenk`;=kZ% z?Z2q_FE~#7FAi5xz(H5JECT#RTl895sPmz;i!=04S1nSnrG>g_$TSK<;X!jjl)?Ne zJeVmXi#BL5lr7{X$afZH;VfKFX}Q(7*fLp(Ox}UCylNVmvK~xqD4eWBrfLZ5Rj0uw zcOdV9=A5iVd%aAVn5;y5lNlU(vJyKuS&7xq-z{Xa6062*Q;3q}sjeDHgQZAf<~pT6 z)?gNKvJ$ITr{f=Phhiv-4Z))X;@zTcrO3=rR*E=T$%8zXhYO!!^BACWY>yGe>so-W zTxhTR9xfoF$gnvZdA3Ye;-mk9v_oga$DEB!I)J9e$1(%91eX}`aV!BRD`E2-vdUy7 zQJul?Da45yCdo>ni2)?SO$OFPt!9k`=NgHD6+#u2dp}X9+hiO<9|L_-G1tFiS|D9w zCda7{kw^@!fbj{L2Pb46oRE2NLgv82Pb46oRE2N zLgv8^COr&RO$aFZFNYB!@Um(cI zM0&RN5?xPMgw5}8wJ%0z94e?=Oo4lQ!_+}DwLlr8dBbR*1=MOA$PHxbzoy{9WFErO zQ7{Xe8CoZhiB2suB8o9Rk%bf^aU(KSqMjYQ(Sm_%7#qfYkzX{Y4mnvoz#&qKB&aQv z%{{E`7%e$nz~=^4s~^CtmLoL*T%|@UE@0#9no2bQZjD`;aWXKK#b6ZDEK)hbe*N04 z(W*N~7VI*qJ3R6lO)imUO`g0~##^J!I7*M20;#q#Iq9YpW5n-uoLF%*?YY%bgacz> z{N~c1AzDv1Zn0Q>C!_Z=+AX7~F8cWt5_Z?bm5A=z%gm;8U@+(|B5?;C;{!7TGCGj3 zuO{xOo?*sV{aPCc1N9EXdY$Dlk@X^_%P+|2 zjf}2?;1JG|I5Sc=s1_jX#!A1=$Km~n?oyvX;<5N4An36G>GKaosDBI+y-41h(-$Zl zF%GkZ@rKa=vOcW#hk%Fzp*~VQ7(m`gwoOQM@pF1#C#*)7n?OdJ`cmC^{O~bSQT1$I z)qG$*RnXS2dp8iRRna(Fz4cNQ5%Vu})jE|D%!|ZKB+a?vP1||_nEuPVa%RfbXIsya zL|yn<>x#1z7xVhB~OO%CVh6CTF=GL!B5Zot*_ zP8*Zn`3zuH1GC!-TmUVdR}rod@~Wv!>qi)mKwiK4iGbTlp1IK~mxX@~R&ftTwUnY{~vUbqV8+}A)ca-!a$g7g|kt%^dCvBG=$nPX#tL2%v&XOL4ZM~|?DW{9jJ^{G1 z^i5p_?lczOYrt=R6#a}W0-SErMMf_+%<7eJt7EaCA5+p!S{M{KF$LM8DJ0b}95DNL zP#6_8v<8pX(dRiZqDJ{Kq4qKXUTM+qi$Sk%#g)>@+z43veWgXezXP}`Ny}FY+-xdf z4gqS7z~caG{U?e3mCToVI$7Xn0UH&M(BQ?Eq7h@YAwT8~IbIC;7=+r8X z5)sq~Fuvi3=v$=&ib5{Xf(Fnn16bbLoRpW%!?vD4>l?Tfe*0MF6V}Is5fG_Q7`)il z7l3PTp*2q1&2Z#ZT32QH4Gx$v zK=j*3$r0(@Z0qb8Fz-=PL?RK}+HW@)S@w}HL9&FGB}TuGG|ywA>|F3P`4#vsP?7oY(Q=A1pdauu`GAkK@X!|cI)crCkXlg4u9dlCFHn7dHf)z@h( zH=sJe*MqqM6<*3A84GgUfC{fWT?0E|eZd&IO{qG@0w@Z%n_$FWQ5K^VWigF9uz2(Q z%TdFPpJ+&i5hct7(Z8AJV~#!@2L7wVJ-iwHN|JdqdhDfd0qDqHI#Wil8kcMF3-J=f zjppyAuLZ2PF6_y#A}w1N_LO6hL^vZ`7xq*QVK%@Su_NzPL`@0wf*Za9Wz775VkFQD zP3N+*tQv=Ah*jlAoPl0wriS#YacCCF5Mjp|=!Ire0AuW!$xSG4QmMZw7c)lyB~##V z7rw?8Gw0x%#Hft$j*KbZJ95FJTrrdQBp$&6jtdk*0;bcDE|6GeJF(;e_Hv{XvT_?U z??gIdhR5)g(5%cuvoa6O$~-hH^U$o!L$i7ws&^D3T}#onWU)HZjY)Ve&Ut90J0I6V zgc)bw80n!48Gu%5D3p0<%&Y*7-cgA3yPbk$E63Xb)H@210jGcgf@D81Qpd8vcP{6l zk$P`iM|KnTudRmoi3AMXtf%Ya6g}%voc-*NRkc&Kf^BXN}i<0CK&-7Oz&VaG%QtTf9cnFiSSr;&qDOL_mRM zgDqaKcw!G~f*Wk{A?j=quQ%A@`8lg>u;sxp3UeRmVrED17O}Y(;6vw#IRU2RLVHuU z;Q}IxjG0}Lr#ILVqt8WJHrNtlv`=-@ON?a(?$FT(Zews{HnX@LV-z6)D!DJ1S z^fu?L$pIvic8YI#Y1T-5F23aTjo_owev@?{z#_Jon7IY`q++grcl{OV$h)Y7oa#0b zfs|ONx|5JaB00LcChmt0%fuJV44(^Fcjw zE`#(EHW@rD%Je!8u`wLCfQ=dn+pbik%uIpi&84@2qLqXuS5V)LATGtS|5e2QMRRiN zthJg*iDMO;H(94@_P>FwOq7jb@)dBDIm19XCW5Kx0ZN;LnHIU4O%pp5@a1gXG$>{! z0Tx|{oYty@Ww}$a1ylMt2pwP`&(YKxZeeN0K}s3#Ep;n3%p+Jw##?!Fts^*`mflA2 zUV`G<+v(bO2#RlS{{XqojsPeQy@L)N2av|zMPs?<(dGhJF&9>}va%9uMC;1qx?&3u+-9RO%pOH;V;tN){U&GwH-uY}+Y zA-DqsmD2^m?#i~lwHu6fj8al3a#u&Ga>gg!Q5i-N%rOl~=B{T}IVdf7?zSWSS$R8=vw$>yYjI2og ziBfHA6%k)DME#kf@nLWvGLZB)4K4?WlRplHg*ZKdLU5ry}^2MomK_ z$$|Y2vfqKWnWOeQ$oLAN=A!$KtpJTH6b%RCMBYYv1W!_xDgz!K@*Cb2Nm zyR}COoq%C^vn>^>LU-fnlX$^2oxA}%2$hz8u-VcNHe33^W>fcyXi|o$d&O-?{{L{w zZZ##A=Q~4DaIiDf;6FKK7v<=M0{p8}b}89AWmnxo=hmTc`VW=A20)UB4XJ@l-aP{Y z6jsD!869j5z(rkL(&`HG_EKzDFY30X`FfJ?Nsq7hOp*L41e(UL2dk{6chf5S1XXt7 zA`t!i5iRgAL|SVROJJZ1iYJ;pYwk~V?}Z98(ESZ!&a1$LookVfIHQ4go%4~78bR4*FzbGR&=7YS%t51R4GtyX zPPh;8r2k;Vw8zPz>yGTzII>sc$X<;jdo@mZ8Eufg8b|hO9NDXJWUt1Ny&6aMY8=_C zadwr$21oX49NDXJWUt1Ny&6aMY8=_Car(DLx8R%&`ivucHID4nII>sc$X<;jdo_;i z)i|wRIllr(?8sw~-8cD=fGJ|x zMn2K)q!n62npyr+&T&-+FRG*R%n&yeL{nHtjDXyz=EVJ;}!Xy$B2ahwf?Oh$TP^&EX%qll*Wx+0)} zpZ^PBp}(Tw-UEN4(6uh=e6|Bp7i;Y{xzgWWJ))m(%a9% zC7~`PV=qO99HJPMhvxJo!yr-^Toy8o6sppzvNyrexXQ+(%C;U4qJLUf|9&Y>PIk5i z91C53|0MhD=Hx4Z`jrdMh69|lthE5DPNSimBL&1JYo)Dh_3@sTao zxc`UZeuFgW&m;X7(nr*+{-9i=Ul4=TBemp8c!HFxNqI9UT~6%ODIzeao}noV6p5E= zhA|$)d@?*o(NVRZRD%>LHfbt~tRuxwposB70#!$mt!Lw6EVbzV_YS)M`+so%S#bZy zi$TQ4QOyl{M2GzbrZAj=o2thYK(dpodNL`4I#2k(D@CXGg}M_J>DB4Dgk;jbf@6Oe zpOaomdN^br$p$N0e2KQ2Ybde;r3R7M@2;Zig5e-NR3wu0YEAwIXksFpy|dAeWs4|& zKpGp0NXs8;BMTt5s}AVdq?-Y{xV+3Kpnn8m0(W2j4_r0iO2P-m*`QCYLE2k3sUY!ve~#XN`X0vIBI|I%wj z^`O}66-Ca(4`MkQ=+azAv0+SpVPrex^uwbKn_Gk)sQEa#VnJ}mCOpIR`7QZ1>cKq)?_L`8e>gEE3S@pxKM+t;9P z4)Ga9`QDqiEwEjm70&QHV2gC5S*(UrCMG(-$sgn$g1bV?>n!qGgCTbU={ieQjU;^N zLHJY(EKvz!hAJVUWpCmKX*qG%5JBHeO5=+FGK?#5GkKj}5pLVYo!*bQ>+W9)qW|-q zUf?toJ}{8|Wsotu)9WE5_4#+~F?o9jw!>SttVqZgF6^3@krOr}vJin2@Oa>yENS8d zJf^`U3+OljZ>WH#>z#nNQb4?aASdA6C<+{RTPfuGD-R);3lVvcOSP|pE@mDA-uQS5 z(6M&{10Y_f#4jnAhd`Bl5*N@?a?Ip-sGl+lj%H{iPZIQbv zFUmMUvcL=><$i;ZzChAXHR(kpef=MYlnFlRYa~r^w9Vd!6eYF54~h%bbh7^SA6c6v zh^|&7YtW>R@!km&T?2$41vHn{#sPxS2eURuF>0yMf04a~nnbS86$S0X4|;#{P5X?L z{a{)V*uEfeD(!5cPA1Refb}1Ex}d#D$#;|NCy*8YmEPRl2PCZ*;F8^q3~G2CKX8=v zrjQ9z+eGc3Dd>+Os94Sx8PDqP2Ub}e8vhVv%m7p@Gym~y5$gcbw29PtFM$;va127I zmKGJ9*6I@oe-pw>?BU(EPJT}sW*f{$kWj=&E9M8;R3|B*7TfWuy)FCJ3lpRZ+1fDCciU&xhM z1l29npGbDUBFS1!w#p~Fk7Ru`*`*}gp-6I(CcE7yyNhJUfUH=8gu7-y?gnz@?jlo9 zX4_UJLhsz4S*~6ru&wq$lymXGzEEy;rP}b5PO8tV$VOoPi``%tM?r~c?C6a~s>)2@ zTVfPw+~KWqQNt&K=>K(iSb6=wro+>ZRfejAs59vuLp4mYujCe0$ln1)Um2>^ePtvx z*9Z-4E>uxD957VJ(Lrxfv7bsQ<|c_mzZye2z~C~xp#zdJllb(vY(jN%hqIl|oDBh+ zOYa6jf!yH(d52$v)+u-Rz=y!|IG_T#!v{VI@GF2>9Mdp}2KU8qR(Kr*O@g3iayJj= z-CURfT!&vSjRvX4vItu_^dWvwGl{xd`gFnI0vq;2Tn2KlqTEkFo5lTm4S^&kmbep7 zAln6sCSQObSokD0S+Naf1n!YQJqez>7Xj~GqrIWXxv%khLTUoK1Wf3 zfk+PQ_j>HJ$i5Y1JPu;k4CL=2fLEAi)9qgokZIa%Iy#4$RpEV*@-}{2&m!un1D<-` zq@GoZIwom7-+OviQqO#{r;*VcKh3^|?3;zXNcE#Hj#OklUb7cZAgUX6+g3;P9VJ5r z!H$t&oJ$nN^3rk-){t#=0=8w74yKhwmRhfaahwLj_zm(*V>vo1uY)-kB#k?mhg@W> z0nvZh!FY4Wfcg`4uYhIx51zjTDO(^IRox4s0ZMXzim8WXFhNxn*vY>g&0?uI}-4T1{uT<{5K8oS^t zxM1&^|Gf+NyouR=222a^4GeSCT3TtIj;kZ9?7@qX3_gzw&{yCZk~c8Skwk^Ld1y{z zG=Od-%r`L1!*l><%KCvhnPdpSu;>{z&BMO~6q9!_V)70~Oy0qW>31-^$SRYWY8>O)RRApP8Qw?|+ zQL3#YD7|Vs8x)PJEf<9yC&45C%a-djLjlYQTc}z-WHphE4Rv61yf+Wk5Zl8Ee>xeAYw^RP$iXW4BLpTr-$O)LSlC z$XRgwa>F~#tUWXS{R*hNgWGAH_Aw%otB54b-afNXK`e5N4oGeFGrD9yBmmJ%KcusS*DMgrUF?91Mr5r#zG8WYKEa~J-wFMqq2EAWScuN$93nrI zcWlA1l+b=T^bKEH>rG)z?%m9b zXG*zDu{9rpGCi0m+%Y&Z*?Ek^s zmiqxSZ>!F4rH-MVR!Yi6B_>jS&P$1ll(MDZ%&9Ic?s-x$GLBdv z#hC);Hp>@d^r7XWH0dWKJy}Re)}Tq(`=lqG1Jd;*ZK2|{XQ3j=H=2y+i?@Xj7mWmg z_c5uq;th?_kzfUzE4en~r;dYt+*(2SLM}?G#ZmxV%U9T%7Y;$zQCu>)99p$&kD_az z2Uv+1^B4jV1|;o{7z^4ygl(%UqKkG@Sr`w|orqhA=*wQlwt4~)A@LOGkv@7VK3PhF z+Tp<1Rv&VFK+^`U7Q`{Z1|v!bw3|q>K}_0KFOaq8v)II-dVbWo)3 zaV0QV5%|0%)P4gBp1Cb*Eu+JFy0Yhkn&K%?7(8UaG;Ral8{qoEkj4Yt_!u4*Tn{2W z3VS0P`i*}+vhmRae=PhT4sh}ewKe@&NRY2bS^hKBVLn4``Oi>?_(F{}i)092!+eI? zn!Q#aoV;N+AQdsY;_BjIaEA6#c^I52BSyP_#V@`A7jLW#)V~2B!2!~)mBx{j0TRoo z-O(OW?0D?KDvUJ8z@!Y2_>jmrAkw_&?P2BubLb~xv385tlmGC*czfXv7MnUMi9 zBLiec2FQ#IkQo^uGcrJCWPr@b0GZiUiV|dGfXv7MnUMi9BLiec2FQ#IkQo^uGiQT7 zlaT>3BLiec2FQ#IkQo^uGcrJCWPr?g10)~FHl3+lHVRdt38>*KkYssz<|(gqTkw{F zxFd9)e9}ve=gkDNkgN$zI7yhykn}hc&jn3Q03mk@Iw3&PQ5Kk-CI(K5Mf5(o9XGk&i1G<{KF~48sBow_AjN z1!2YT=N?6TiBG4?`=pkS3S~XDR6kJ7JxbBc*R`o!`J}WzinQEvE$v<{Z7FCj!LOBg z?|zY12a;0O5HnB24-2lX(}3~UQgx-xzf+3RTVnAE&UjTc;GF|30<+rYLjWkBpe^Sq zMXH{fvK_{a9N$jB8+xSN3`(tflc>JWS6vGFHuzzu*;Cz2)lxGaz9S>$?a?w%hRiaN zSu0ulD6=PZ50o-aT>-Bx2km|MX|Ij*yjG;HqD&kzLs{=@d9emqe=UT{U0@mIElG3K z7GP}aQ;Y#I-i{A9A~;P5b_l^2ASk~?5a&RSZ6zIWP~^8hhce2GNO1Ir!totNvi7nV z2}CCd8ic?G1}`8{~79 z!gvfLi)n0uWN+x1JE-ZD=l+I1(g3d-J}_lHlIZDz zoX7{JYREJ~9Ob#tCg=59>@MBMVR+K6{~NFzeC#1Q)vY)7*Z6RmW@1X15=MyeL6Hw* zT%rVf*lWOAu@sUcnJKCU`Bchq-bJS!vL_!2R8R(@DNM4{7SdyVQV1leJ(bMX6xeUi zV`l6t`z?I45B0vHM|Z=1+e^dZcjOyYMrbB1;F6cvS*^uB;=>1w1U~X)*ze*isVJ~Y zna|>Xy1oFBi+!GRl!@{1#O1RLd$U6)!LH1C$g{V2pvs(2@B)XWN5@^j5YE2P=>{q2 zxid9s_& zk@YuUZHBLP+D4F7O|`r004fg*W!giKZ3cA-q8WbW(zZM>R@2kTd8Sh+=bf1~X-ZV1RK4 zQd0L`tmM>h1g4PaW@c!dTFJgwLYf|KU$w{b_ zlTarop-ygBDGbO-sFRaWCnup!PC}iWggQA1b#fBwg05&(_G#?OPMr1WnO|prc9Qng@k@7^L*gtjk{o%8-#>YuOjs@uEiIDx|l(S zTntAJoeB2tik>vcSJ#4lP6HV`3BL9k?Ef5Gi-sLMsWqShgFuD`7UZEb!8)DilHx;)OyUC)BN}0ovZXqWKq|Bp` zZe<3?T!Q~Od9N=g@Ac*6y}q2h*O!y``f~ccKIbOXyAwX*X)px&zEt=~CRwK6*8w`p zFVlyE03H2~2<_-;NiMcG6&qMBXfRAnuA`NWbOv1;OPmptm)of|Cvb^p5Vo z@Ti)sb~$pavfKF(GV>@Hx2txP5##}}ZZ{2?hO-Hta>Dc0laLh=J+^U0L>K!;)AiA% z8p45l%895@>9H_TovPGb;Fe2knuhlxXj>WPnWu}3Vbn(`QMoz-9#W|$!PNU;ZL`e4 z(fM?izra$i2Ej?3kwcLDAzXSQSJ^RaOH=F(}PuDG}kd7C9` z>k7cHqyGZTd;dYgdr^A8r2Q*k7|I7eD*uZjZ^3gs5VadSQV{nV#R>b(!d`nKV7eaP zMrGcagjcY9+eO{mghl*z5nr+reftiYbF1VZMtC&g+XQ|AFx0;TQH6bwY~O=Nxh}LQt13h)FC9Oa?!2h++CdZb4#?iUz(>kcyE_rYy zTaD`JD3*W@h9mJ7r_pXQsd~#e(tZ`-XX&`UGGLuR_*lZ#l7Bhj(S&OxKfM}o4;Dhh z)quNoW&VTC^5urnoo>1l5t7>Kd>Y0pU^&1&_5jhd4N`}Lyk}P=hOR-P28pRi^a{nX z@B`|eV}RKROz*ScgPAAbC=&eC97{aY$4B@c>iaHoTQ0@I9C-U32VNYlZ1ideX|Gb+ zI$$31rPYG&Nc_}=o-`lfOY5@_xvwt6&dn9z!(X3^P@tXoRXs(AJFWv^4m&?GE~6iM|<$tJ3(<@V9Qbi>2Xy3UhdCF4MPW<)dA}*40)dAFWwdkYyJ& zcCpV!r`h@>DDC(><$tAc<{z?K$7sO;#cbWwzLsXJo0^xFrl!+ITe}_%huK0!J<$d+ zdlov3ik;Lo$>wc161v)5PT`YnmiAh})nd!xHU}H{w_S#o9BH$e|Ag!s+WS|CoOBBC z7ulmAvdd|}^{7KV^gN&Do{Yp5Nc3dlMkMAV0SEs9EVr-2eTA2qZnsZCX|_m4r5xJW z%2qV97C(6SR>&P7D~T=bi@^L7C@bXH#+G7g3bHEXOi>N@18mfuL1Q0gFK%0RWE*gP z0t@#9?@OF7NW@{J;M3JW>>%PYB3{vmyNNiLEN{{sw)F=htU4e*qyud09wP2%kM$V? zOxwDTh?hw5t){rC5Qr;@_(3DK6H!E=KWoITKvcg$1a`|r>g~j|>IzIux?9`24Pry= z$IrpeP55O{v1Z6quhswsV%b~IiwDr?z)!*63Af~uggE6QrOLwR` zNlTvL8#?HZ#7|QfYW$o${_m79L*1hB3-b7nNk3aXqVdNOFWqSb?b9^AL#{WG`({Yf ziCi*)rg)0?fHlO#E6+ODn!C`V1(HP0aF zzubfeEc>9E{1IG0OUbUumB)lkP=k}NMmos}YS5pcCOJV3 z<|n8Ld4?!7`UMh_DKv%;R-i0NhIgT{%s^P`;OU}qx|9xdP;Nrroex)Y6-$W2HB6F~ zLc;?{g!mS$;abfaapoG~f&GOlikEGd8sR#6l@BJl=4+r&DdxtB1cu87iP;!r0+EsP zkcOzpD9_i)ZKa3_57F#+=;ECez)5wWvTD)7B8N$`h{?%Jrg5JemmyKWi-j{2f?1i0 zyY+ttq7ZW%cZg15D(((_8c5B=lrSZXH2WuRmuV^P;==_&R z3WT}H;a=nsJK82642HSL;a=>p$*~9FB1ay~;r3Yv^-)%>YqGKvPBYxm(Fu10EuBJ? z?_sgtrBjF=sv$n~L#D)+tl!vSzmoh0R6=a>Opkmkp(z>)IJ0NWGh$QqjTlPCham58 zU9%CxY6c;(Y4<}$;%ww}iA`VVc>P6e29s3JIY(@!ZiG1W6gOFHmWI+ve$Oj5+iNMw z`Xd3&(NMW`0kL^B&@68Qv%`>Q9gUiaEnu?69Z>G5c<6awWjy?KFGQzuDKe~U-EaufY_?bpv#`PR+m;KIh#ss>nCQVl9iGt2pr(=N8(=-A!zK+_!OCDTw#zyi}4aQ;8=uluiz%xV;)GNb(bri6^zi z8N)h~ChxnMx^^Nbm3W~xuj|Dox?b{h8P+25yqpDHf}i(IC0<*a=Xt#e&l`E3%c=Iw zk)UhwBFa>x5}&wX6ly1(^r_#7za`avEh3Oy!Mx9Oo}FAn=yMH)lWTDoCce;6EIEOB zUuwQoGDcS)pm?)9os1Itst6Ewwvz8q#n&AL{G&3`bS*QzAt=q_Ggn}&+p%cXK5QG- zG^+aM6ks#T$*54Vspic?e#za)FiNh1HdS&5l$b`#3j9+yVMpV5Cho_Xm|H<4XJYOI zOX(cEfxk>KTxc!3am&;rNb@!Q)e^px^RvQjt3s*yPC-%K~27}#?_vA+zmRhdScW%j zMHSHUhjQFSfg<225pXR8LUmU^n?!Gx`sD_+?>T#Jfx$`&+seSsm5Sw7l_@>^I;;~cJr(;{_;tIDs`{8$fp8Tv=o$7! zuE~$H_n1hNzc3X;ONwuKx~Q0lxl5Hi>;1XOU~?-td$JvUZn7Qi0azt%>2vcD!085P ztN?ok>}});?=R(uvRGao4r?Wb%9-O1J7I4cSswj&XNlP6m%L^01r=^Y*scQh&aKl9% zqNGdOsJcm`9W83MA=?;m{UOMozzEs49>R2Sz>8G2gtvih?E#|Jd)%7QE*?$cw9$QE zF{A^;X`}mdfMo*oCB{Vew*Y%2K#cC(KK3cFQelwd7h-A|1-VmgHYlaij0LVmw)8py zqjooH-#y&kA{@0R!E$%D&43A0()Mf_V_4gmFSc#fU<@3Kv05GCVcHNggEUv{(=_dz z2BU5vY)JgVo(%I?ejYvXcNP^lGuJ0fV=7SIY;Y_J(fEmy2FwQUx(r1B=VpW0zi}Q% zJ4^=Z??)kmd?I9sPGKex82SW|IA%kr-yG*jVr+ z$xPKbI8$|M79uBZCbn0?0;gKZ2!aoRjZ7MW7832ZgrZrq(f&-bL|o5`R#PYH739N_ibyCQJ&fPka~aA<{ZQUz zC?EAh`4~g_=u}KV#MXVONfcR3zKXK5(y zKF}VJAIiH7<)eNm?`|svG>--{luw(xk&;k8x`4^Z?BNKVqQ|rE(i#^tnb)|)*C?es zfwh2m%w;$lUCLY6EN=m+eZgb>5x$EqW3ri^AjCo+0T8jV@MlO;EGG!D$eSX_bU8tY zXE++`FSQPh#Ob~K1K}egF8j%S?%weX>2|_HDMiLre&etGFo0~`` z6NLCR_-?!5a)J=|CkW!v__ZHO8I;QjLVR0WX^JVA6NLEhb!nTsoFK%n(@<-d6NI=w zL2x-ii2D-+mlK4zKS2=R$8XYJ>f~~Q5Z_MI@)LykZ8_NGeGZEOLE2;+@jr)^c3?Cg zOis=?Ps}u8`g2$s@;`?~GTxy2b6C2O@fMYCLOHeyHCLyjn$_{xHqnFn_|w6%xioF^ zlVvT`mCT)jAZc$zTwUk@A8Cbt07 zCjH$)y^a=vkNFBaWxlNC?gMv;?1zmI&WYfpo>4-$hH_e}$H==zEGFCFGsNP`Aa+(o z>1rCg1GJ?G)lOo;UI);S0WCFPxT+1Fa{#a@dEu+ z-sx*d)usz|4^Y&(P3yg#dV388x_U4uwt=kGmLUXb#$JLFBi0c724E>`O4X9M1TieTE$=D^1)gmNPxmv$CGn7^ zJ5lKNldeo1p!^>dNiNc4^&rzW{y-bcAb_6xiLM$208I5{dQp+#bIr7hOj6DlNVnc& zdWpbxGBsC)WLhrA+ya(AIJJd(iIzrn-Ba4y4Pxz^kf`h4mAZc)QcAdXs$4uRjA!jY z%2LOqG@Agyu%Cw^e|+OgON4c$jipb&2UR)Z&2j9VJ3|ke&s|i1tu!BMEMoJnfnw$_NGeujGhodk8NY&Cj!7UuKjT2PFIvZN^7XR zVFXYeco*V3R0ufRRq&SSa5FR$EZAvd@ZzocATTnbg^kKBWa@Z3Ft!zH)?kEqU%u0b zpkO2ko)v;L2r8#hb4Tub+g5)Eh&2?^N$cH9y-P{asWk#af(P~X21fKMqw*d)wsVC< z$NNAP;@vx?5y1;WFkA?p2SMc{l-gPA?M}S~M0C@7pQ7FxLHrIZ1Vyhg0@0^w{2nHH z;pr~K>5aqF(xhPwxf(=fa5_9|=@)mrw{-#&g2-777x>|8U_3Ev5Ul_sr>g}XfJ@Dj z+XEALnCP{uc>QN*d3nd?AQ+~)KcY4pMXHYit0PsNl1TMMAob&7Oogw(1(E7Z{QJ;{ zgGPX{ZeZ9pU;=!6EHILpex%CBY`sX8Nsd$U{250a5eNYcY6DY$rT`tOGBa=*nxZ|B z)_RdDV?7Oc}S+ktYb=?*!x!l~hAL!(IbZGf_ufJl{TsP`jPi7XFBs)Z(V{YZ6~ z(B>mm@ppO1k5o0tNOdLX(&m0#3l5OQk5maHAu%f#8tw;nl$*6I)=JeC=Lq^e8FVUTkDNcCB=GOml%FbOw!kt&H0SV^R+ zS#_lPp5XmRm0s16Y6I|vin&=Lq2?u|rAB{1LTdD2q{;}?i&UjmLM^*I_fQQ5z|Q%J zAB-&`xkR6fnWU8x{w*O9!#^F2QPII*Y`o+#7^?tJKnG(?=7X^pe6g|cYo1sgjD0ME z{9tS*1aY<23&vQ|M#0$6;A|3%QK}z|G1CjijDQ#pbKU_mZJtarFBrQ9d0sH4t=8p> zU#rXK2V;63<_BZCw0_{=BXio9KGU(`5v>P8@%EGkIj4IR4rfd7jss@Vt@d z;W}~r%|}7kOs^BiKRFYQd?}af#PI_Z&s%}(#PP2#0mOA;m+QpwulYohRsKh1gy>pk%I#?xAr_yx z0^_M-7VRD%wvE6vs`}MfsO;&JM zAir21wt7x6{lHm5&qiFLj^LVDA5(FIfKkeI_#s3iSiB8wN%b~sLH@qxp^r+`->74h z=0TqPf#-zGW1sH>iKK{ufe9Gd)w9?*>qp&0PRroTW)i)Vb7? z)Ox662uNV(IT3Km(PlBl^c_GKbGnP*pCx~V@J{+At~e+~HUbvA;$qi&!b>R|r(+@i z0mAo<6nHb_y$ZN(?@@qLBHy6*5T&5CrcEj=QA``QDO_xgT=g3*2 z_KooOw)O>;|cRfqofFER+y1wisCet@*t16HzU?)Q<_c`*v#7`BO9r<-Qn)xVQFjXri|6KS1GJZ!H;=U=OIJ8Nq z`yK-7w)##d4I%v71+zvFT zp9ZzAy>=qE`4+%(+qIM1?pnfJep2nFRG$)--d)4N3(!Gf_KICN7}OR}RV^fM!jJvd zI5FWUpxai`01dAo{4!lNUY=~f3NW??)m1FbRz=fp0t)7JRwt2dz9PI4OZmWM;@Ada zU$pH)^sD%(4ITNMY{ye^!8YIf6nw-1ByH=HT!YcI6-6A)re#|{5^*(_&14-x7=@p-;plzqjtGgW|xPwTC?8)Em zCeYnH>imV4dd7j^z4#OBgE@b-#-$!PRQ0Kig=4H{>4&R0WV*1L@wXFd zma0yukAi=b$IuErk<3$Y_jot^tXGHjDjW2&&lxus5}%i2!)k=-0|cpZb5@Rb<_l~# z=w)BP$~x2^**=y%K7T91%iKPejnBwM+&-3#&&WmGK9-Ho$d$PVFMDd9eHF?h;`Xtu zJrtKOb4yzcRz=)CmOU*`$;S4vh}*|vusKtb^Jm#&6(`HG%O@M3KZ}l<3S0|%(a$#k zn4CYe3t#Q%M?QDqt8fjvgvQ!?HYMU7=!a_Woh{sCiU%O1_P$p%Bbmabg7`4ae#NsG z^avX%t5Kpo$^gIJ(`b*`XwoK6MUa%TpDBG8QT^JCcPsoPPcZx%LQ-~k(^Wxi*3pGF zS$C@2tAK7)WDX{iK(M>k5=E+v>r{RWkk!%n2l+)%BsPk^oM$k?plUVrQ$qo z_{#*kG3|B4i8rSGf{{`i)5PFVdP7O5!6Dw5CI*LiW11Ko;*Duya45a4@zmf@dWYn# z!J+i-O@Ly9L+QQy1*E}&Maw{GConiL`wTVhrkYuM+QRY1H0n%hJZSMkv@9H)_o!2? z^J656`6ASxKDW{TcxhF+QvttD_ymEsAUuKai30BlxOGp$dYY~8c69gldx2c0?EwNu zd!)Uq(mx#Z`#mDwbS_2o{-V1dJq{7PT_NIhw0M6a4mR>I-nwTBZx16vyG+t&NM~>{ zA`iHI3h)%pARFyVcEhAy;dKFHIqXSN`cIEUu02Z#h0t;aiB^6Z6H}h2cxNND?-9iA z>D9uW8GJkeJ}UwJ&WC6(N6vFW0FNP}V;{1CsDwGu0NE-B%Tn8+GsU|~ydyM< z!Lqoxbb)x+h&L;7C^rgaU-CG#c-~N>J&Ic94dq6m?5A1sfH0#=vPpYb2%3)8{&&_f z3^sS7kMc8TfymP^@vV;e2|fPq22v&YA-|>j@B>tm%=w!k zOb%aUtF}K2?y{cPI2wWAt*j?D6!P_OMRoP2zb7JR!%0M%;;T1j00#dWp4iar z<&g&IM&`uEAdDY^Tr-hQM%5D=M8c?ps5O%`YN3WFHr5ra+8RBv!NR06l=Ghee!a)g z5KlCWTp2r`Qb7#pl9oh5Rz_?kUXK50S_} zw+R&HYGV0J<;o4QbmSGQ-yjv{v{<8;xMa#4GK+;t2mteC4w=Pxt45hyHHx+5ltX5j zTQ!PxWeAZBnN6})Bj=N9Gy!3LG0(sW#~AY*?4Le6IvdU%&2J+Gg~9$+Q@ z(A8}Wyk?U2+8EpJZSCnDP1FrNzVSfR#}%DmuibGWB9TvG*OK#DXg$4e5&v7VuaLNZ zQT!DKe-q;0L;N0IFJf-x5u^5J!o;%(>slLQOA3Xwys9a zWzkOx|LZaG3rwQVPl(pTBg#xgTMuY>(G%12Ce};!Y3Q(#U^C;i0YC=EFwzi@1;daa!I3=3eK$BbW$KL|(WXUMXjIW}QqFq|$MXMl}`zXZ}(?M~M;6Yjcx989|c zMZ@*uV7j`nejIGL5}vw^jjozw@nd#6K4@XH(=pg+IecWNV=#k(re8iBPFx|&ez_V= zt|l! zsnhvRK3vg;z<8r#Xx=QaJ#*x@Ay(v{ir?}XB%rg^dRz^Jw;u4T33?wrhgP-iT>zWj4W9LyA&otFYAbloxKZZM z>(x)PGCu?eQqq_dvJYTyD)2j*W}ey#UcfVpNM24dRjoV=!6ElJ2b<<}=9US0YAc8j zGKD;~6~qUbN}Tlt@j<4L`=5iYbIb-0GWGNtfQ~Ib6xO#@U|&EQy|7PZ9Xc*XkyQ85Z$lEDfPOEZ|6BR|l0I#GarX6>!we&Q;`bQ|dPXrTVD@%KO7Kq&!GE;D)l z1UPP5RV`bSgK5$trNOF88Z290M$V|wC6P+F4+!q(EF3pj3>3D(GEib=QA-lb+N*-? z`@&1?RlyE)%IHU~Mp#s1uL@=|ve>JF-5BWf0I~rjKZa)pXs^nT-4L$sdw@d`V(nGv z0bTYyfYt1@~3Zo0xlUb0m==>cQ|NDR_mbr|sK zeOjj)K4KJWuOiS36f5#W#w$zk16)$B_aPooMrx!7*bHuLz^K~9FevlRs&6qTP7grM zN=~9yZ6{8iM6KGMPU#m;gv0g=>Xv@t9C&APv++ZhRLumfsw*v=^b32zt01R2tN!EX zkorjah5Fp z=8Sqz19E(tv%Gj#CWudSmKW~}-AcsEZ*MR2G-nW>=8S&CRO8c}qV)#xY0l_U(v44Z zM$%WUotue#`t3t91=9z98s~M>bY9~=Q1cr1fnxbe`aq?-b&eIuKCo1aWV6AnTnlsw z4V;~uBY_wI#TpkJpI?DMvBm}QVNS8e1@U1{vBm}QVNNZ>Q}Z8439B_Ou%|cG8W)3V zjSEi8vuRpuTnxe*_r#X)4{ppqC@f-#3~n;VLNl7q%?8AAaie2O!uFUdvA>CC;sb*VB~Vu$1t|uyFWxej#xm{x)#m zvAEHNr2B4y`@sg#mxF)gdAn-F`?rEm^6a%Jwcl<4_^AQ?i1%-yBUCZXMysX(^bA-X z4Fw^*RN5(VYa>p?gTR1wW!}GqmrJz*!srAd=c+WJDB}HFLEePcN7G5U%1~}J_RpYL zwFP;Uyw@7S8L@u`7F7FZP-h6k%qaJ71(m8Z57B}MkTS2n{vr#n*s;2>Q zW2qb=sNU)h5KIgw~e1t%4WHooSV*)QWsG3z;CTgdwx%+h~A+?d!+@oP?BdfVr zA+?d!*u$H$DW~RsX2EYaHnN(B$cWm=Y984kPRkzN6q{(xV|KWHqnPmTc&zoEm$0Q#R$)*u$G*Bdd8+ zF?CZ;jXk_6HnJLfcvCjz)VxFT)<#zI?r1=oz=mSfQ}&oA3AznxPOB(nBRqzENS#PDG7WFTth+A^S0e>`T|jMfAnDkxO>FaY zR9g!Z8>L=zDtx56o-<3{8Agl6Ek zWeG{lQWDI|3e6AK1zWi?fep!>zqtqrdJJ1@7E|9KkfLGA_naeA(9e650TthCg6c}o+s>5$f~|7svC(gV z`*{#sn?t?VDAi!5{X^vlVv|qwaX-Q0c(5K&`uh)qk`(XTaQp>-UOy-?V456Jsi^lk z>NdO%j}Gr;GX1gVG3~X_lk|spA2P910*@YV|6Dv*k*NhlJ~`+_%yXDx4*IqCk6a5- zhVKkt@4f1W=>B0pxL>P&knVcM!EL1%!F@m7+vJYC5blt1|0B1M?(y{hAon(Lwx#>! z>YEXl?2(h7cpkY}`(ojQ=R5E2L@2Ji>5XOfWsL9uB_bE}fyYSB3%rY|U12Hv%Kq@V zfwFlS)j9ZF&<-D(QN8OJ2|ni&ho)3-8R^2O7wJ$B^M12kt@vDoSoQu*AUcwz=lz4l z4$Kws&#_bw2A*^r+04jQ8zStJJvHVPz*vW8Fuf{|dJZC8OcvH5Q@5D}&!G?Px88#B z%I43()F|3;YyQqY2wMeaGowrYOR1iV2-ubfc1Jd`Bo8-)dXn?^iFvH?=}n)N^tr;6 zz=h1OOr>lITn1{Hn?Vfu+cusv4Fq9#&eRExPreaII%n!)R51pZHQxemRP?O3H5ng` z?CL+Xvz#}JeiNjvIR1HW0sW_Ylz~lE4ysnMFsCt>k3bkRa)pkcIVj=(-7fsk1pgP_ z6!X8@yUnfbNV8%rF|(0E_ZB0aaTtS4z=wQ-@rM9A=N(I?5Aw+HQf2yD_~)zGJPwuW z*#lTVA=cdB>}1z|Up)tL9Ht2Je=eS5l4z zT&T|OHwvXy%&iUP_h*?vNiBXr=m3Sh;_uf2bf7|haS_9Qs8CS6m0<@dlr8Q;=n#c+ z#bLt%N!4QRT5KV-RKqaIK9pn*Lj%ebg6xrdlZW%^b(CUcin|gzS|Lx?!L!mM$t3i0 zCUnds#41GDA6?1V5%HIk5Oc5}gw}-Pi6qXV*;jbQTS$)h?d5cP9H|<)ykfgy?6?kg}>NE+8vsGLqk3EH*Ni zKhdy;;>N`MsfJaGFAzG53H$ARiVq-0_Ghys-tgkLHvn|DrZ7S|WRR(}I_cbk=b6+w z_mR(>xAE-=FSbxTXK1`kaVVip6!MBY5&D)we(@?on<^9(ml4`bp=>7Do#5uYS17!i z&TXXA30{XsX-}~2ZB10%bG!*d{~_nhDE*)O0+~6f?K|jw%A&OWom?+MOQ{!~?e9|& z>n8*k;%1D$6YqUM4Y-%%6Jl-x8Es@)d!I^KFZU`K(Xe3)(PmSA>*R`yri+;DE*_J+ z;4(?_Hy~9HGT$T31A$upE)8?vqyGwkJy^cG1NRX8dHY`u?`B>lltF$a?@AxjfhJPP4Egsb!3lJ?U6kO znj?GHX$q*?)8VT3M-lC%4Kta}@SN?@kLtOnb9LypNA_M}r-KcG|El{F$XdLQExh~| zfad;$`Cw7+PYAYyLL7~zE)-0ma}1q@?{9;s(M-7tf(FfKN1K&Rh-6-?!3z)9qKoyT zxsQTi&w~&tns*GGRr8kY58FRUWeRV>yDHjwOdiET8)o!9OG_y4qL5cy3!`B)OCi75 zNMf@U3gp_3XpTbJx&^bpj~yLk&Tog6>oTJ5K^6-0!ClX2uPd1rg*sY5CqzuH6^Rz^ zUquKTET9TROSD3=#dR^@MEh{dBFv1%Bbmc}HLa%NorLyNs7JAbNf`|sZ#ei`loK4ZeL?~|iEqEVd^Ta(9(V??Zv$&p9E5=M18jDh) zhZ(*z!G2`mh+{zm`#tencnYar5&eJ+*6leb6WvRpVC^i}H51+UU6_2J`WJhWxBD9e zswwWq{5~*8pknbol6-KnKnE0eA@n;%d-Oc z#Rpl?D?bz{TO3R1)}B(d`JzwCw~ZF4y4b*s+|E1B@$5t0f;lM6I}R36s>N1xQm;__ zDM)ZPc}$@~8Ldo(ulykFZumCJHU3Of!-<5TmnDdG&c90hgP=|X)%%|a0?Up(XI;u1ZzFp12R;)d3azEV&dkT18;Qr(@Tev^%8zJjEXX0~7kgEgH&_l&ZbvCkr7KfC z0Y7J1L`;VHY-xGg0r08!FUM~K19k6dZ*L$9&#U%4s=>XW;$yz`B7$4)MS;VPD~)Hl zhqF*W1wXjnoj6Msud@h4rEI)>ht6%G3HQY`<~^3oasX{?)!zHe+M@vb&BKb4_a~E6 z4mSOZOyn+)^j2IYY5xj@+S$o@ck&i?8gbkINEYv8eKekf6xl^9I1%6g4*K3I!)M!{ zndIH%Uml&PRWWlp!S z*}zlWXj}N0TgDk^Zxz2AZgZeO_KIrp^ zZjQptB0BZEx&?G1J-xqqA(5cp>0Qx#za@~~2wWFm!B+HJ5XT≈K=i4)5ai9CGV$ zXcw-9YIwI&^<-yHXcw+!JwCJx*K+G{DE4mLV-!3Kkc1iT@ zlIYu|nSC%6$p(Uw)wd(++of3FZV-LDGf3qh+oj#eT&!=G_8f2hOX??qN#GgUB=)ZyAlIYu|ACSR3 z^zG8U6bjZ3^zG7p_f`|Ail}dw?&ljietS(seY^C)?*uAF)VE6yJ}=M#5%uko)wi|O ztiByl-!55wJ5PPPWcBTc`gY0c+Y$BcQmk)B)VE8qz8z8DF2(wGM18vy>)R3a?NY37 zN7T1VvA!Kq-!47H+M&K3QQs~-t>7_UM131~a-)8zZ%5R(OR>HkQQt1T{0EPrCwLL{ z?b0g>LfeCI^;?b2yddDOQ{r_;A2`gZB2eki4g`gZB&;Zk6jaS-X283Oqc_3hHi zxdLS)>f5DTj}j;!QQt1zcCJ9x5%ulT?bi!b$Wz}g-SN7#ms-3}LFysJpMnH;*<%VJ zWi*@$U-?1UDEQWS^k$kGP6$C;ND%9se_{NCptB$?MgRMPz_KGx8kZ1)egu!Q_bYny z2R=WSC>H?`eY=BWAsqulK5(4?)hbZ^b(Ss69nDJ&3j5>n!>o zL|%JC<35D)(R<-K#)Xq>RSd5WJoXme^@!Yu;^>tFR#7YNUTFv*x=@8z67dndk@jaG zwKYu#^l-p|y^o~!aKPmH%-sVItv?(Prxj!#4U9li5}F@IN%2YCQJB6ckIRL}hf%uT za?9fhjMDE=`iV2s|3=1JA?q^UT*U1qQ>ODMojoPN^O#;wq<5Yq*S;|$?<^6h&HqI; zdR|RF0C&oNmyPIx6<7|QZ2)_4rTt0NkavYdWTgFnjdDM!?FmMdTwYFoZ${KX9OS&q z$@41!GlRXqvwUuchHw5MUKSI8A;Rlz(w^+0ouS@NME=nCNREk|t_iJ;2rToDe6omp zZH5vr7f5X4T&sAT6b)l^_3 zBHY(!8e0Nh2XfHQryv|dNRsI9GmUcz%lum5>j9%AmNTt$eCbJ*q0p+ZVAfGuq;sIsnh{#QM+)B?16%nXDSUI+5&0e^v@a$k zDUX(vZzC*xEBqv2@ckld5N`u8t4!xcP3ttIrF@qq_PfB=w91lJ^+lRigQV372(-pi z&`$KEib*Gbt(3v@jnXu|Lmb z#t8Wlo{Tcfy>-OA(CIPi2?z#tYX3vMIV8We3O&g`tVz5MJT0=VM5b3Ej&it_aLnCa zqhv9CD{otnYq}Uo3QOB~($z2bI$k5`ZKaepM=%n5k3I`DF(x$kddbh=2*gE(_mVQ4 z1?*wcpYA1z9n08*y`8s5>}PzBvEI~}do$)ol(46zW^ZTAjS~2E!eZNbTI#lZiBNi# z7{Bp7QrYAN;o%pcq#3?LDD4PLjd_Q}JWONmMIPP`JjTjkp9uPrrZO;v`?mtNz#D+M z4%+QI()GLuXe@6{U4a;@@aO$G7`FiMxViXQ_fq4#-hqHV0`71=Fepr3#iXvq)o4hj zQ3OUU8&k?CCMiK^pHo#MAD2K3o0mKpP~(;Cy!1uLJBv zQ`?Kpru+*67!C#60}$$MvzeecUHcxAy!2+t`Otcs^J&tC4+Hin5Sk{;Tmq=$0mj@= z;C`2(T%-+eB+RczSXzq0vjBHcNAwgv7Vw18l$ihU$tL(XbVopgvN9TxhqZ4JJ`Rid z7?@=ZjJ#a=7?@>_b_Aq!24_j9V?9zCl4ZAg7{VY~>oXOYpGfZtrTIJ1)OPI&%}ao( z?OI{>O}@~-ogt|2Kq!LRB2s(F^GNAcrS=i1X~n%L&8g=VlApI&Iv?U{Kd?#6BUeg( zwrjB1e--QvfIUiv^}mX)u?Jx7zy2!i<7B|(=OZEX5or(h=9Bi_cu4~^v$qP}b3j)m zb(OTU4X(5`a*w352Vtp^dj&oWFiQOdQaaBQFH$;2sns=tn)HO{N*g~D*u!LSJ6E{6 zE~dUhqW&(XuJ9iLYYCq(+?1{ozTczR9}##=W$W98?;Dts^aqEFezhAgwLA_Nz3NK9 zO6f>xfqw+7l6I8nV4pJlP}YjVyTPW(@;X{{v0DjYe&{U=sPYZ|6&ftng%7|${cVVJ zQ7~@*TC`Q`q51;L_+m;@|G*=klYS$-ZdI|o_7h&e2Xe}5KjC#5VCA)4c)b;{@;X3x zeS$D}8z{U@{xxKaybTiGgs%&b*p2w}CK)^j!5sd)y|W*q zB*r}lzi|)qXBB?dZ*IV=GjG6k9Y$0{`54ZJ??Ruo3Q>NU?EsVG8jAR-#?Sie0(*EX zT_K)Yj}fGG#S>e=TL3c^3d`LfD)T((=Vxt?@W~Iu zrf7}^UPa`9H};&e69G-wR%M_Jey+6x;^gO3>63o{rf=J{V(Ec={iVf$6^660!N z2RdWJ`{NeX7~Tsr8CeYPh20p~U) zptptTW0M8FEleJpEX3y%<*~^^d_GYgn=HiV6XmhV!l`+_UdjtMcqXS1pHGy>CSy<^ zn=G7`XMxzqCS$NUQ!TfJ74){S8d|;!_IO;ThPQ>qpjY$r4FEc)<;*iVye&+YA>wCp ziY~)$W_$?b*s;J$K4C=F#2f$_aV$rD!DYbib z=4^@!=!{cbXj7Ej**nE#kt2D_rs(sb8nYLRPIISNUG*83Y+cRShOF+zqChbtydWic z%SIl%tV=(3Syy)}Vmfz<6@60G$1dyg43x(%>&ka&3TT8Ez*Y1&Aez~WH8&5mGm%*Q zmW?jyoTvHI$1cMaFG~69W0#@5Q%oMa4DFp_^4MkkmW@1i8NX#Ck6p%Z+2}IS#T-@r zc75zJyp*gtd$H~(kLD6{KJn7+vXkX;MH~4463b4hJH^6>7J$A!b{RgB#Tcn++4GWG z9*>!{GICxreEey~>4|bHhkxKL$Qs9lFDZ{*hW5OqJa!q{^OEw|W%v%s(;%#un7;^!=OyK_%kVv3 z?kks=S6H+Rls+rSRG58+3hZYp%$kS6Utn`yGJJm;e9cC=9thM`)b2OR>B3z!b0^@* zYD~OQP8RNxjdHqh7tN(M)uJ2aXq}gZJF`(v7w)2+Um&g2MmeRNTDXfh%E`iAyircp zhvJQLvTzseM&{y$yJ!!xpbK}=Uf-@kTDnn=PA(0x&x#hdL(5`ArRgkMqBX4xchNq5 zgq|+k#T(_+s-9Z7OE$`(r(mLHqa10g(SMl|)`h$17$vL=ckxC!HTtI(?&6JdvIG@x zl#_+Kc%z&w+(jqy@FO^kF(a#}H|g}dl5Z3`8cU<012QN} z1ou)XSUZ^fME6zK5zvLZ=>Cy#O%Fi)jyKq-d zE!>q;3wPxgRT_2SuAEx9E2kFj%Bh9Ba%$nOoLaamrxxzYsfD|8YT>T@hVrQkcjf<9 zNEhzPZ))4ug}d@w3dzD<`E7Qk@xopC-2o`AK7Rcc-ak+}ts4$P5x4F>07Fdc@OB`! zX7C%dw)e*bvvnrixz_K(oo`(R%&OKu;?19*t*t$1D3$3;NP)Dt|w?XM^-FhfQ zqV*GmhOJXUv(&m0aii8}@mp>^3BUENi5SW;>I8Qd*qm9TFP%ieg6UEu*ua9EVyq6+sXN z)>q#qV(*Uwp7`t-WAB$>?ORdSn=jk-R=)l;jYALU(p7?-6X<* zk&JMH=iLw!Jw73NJaO8la58^98O;nBNAyEI@3k2HkOcjZ1pScNf_@s&PxHLm2+4}6 z`gFF3{$lImY5v@@z=f{@a=Yr+mrU4L1F!eWpJi@UUUb;xiI|EvegQ zbyabYcOW^s*Z0WH^~%wHF-P|ZM_Yq}a&V7OI1cdI!r}cgN5WCM;S`D88$s%~e#iIW z9u|PfsytYW)Ii7S_SOXGCycgnwKdeLxaK}o?jTZI-H*%d0U(p)ao*!Y0>o3b;kJ8yL#%h^k^p}m!kCW=?L-Etm zmpnC+r_m>NfoY%b*o@&*CH%@R;kR~yf7bM0A4^d8sxRG1f~Wa+ug&DO55uP)5$t)fS1AVs^24gqhKn`up`c3^X-X% zQ8&Rc0FLj#F>VAL{_>HXgMc%5_cJr5r11gO#4-(dj5 zpSQku94xDjD6BIQ!HW>IFN0@#moPYy1c|-%Lpb@1KkVebr%P-SUx=V33|{2@v76u% z5OfNI7khbR%}txJuSL*}4Bpopm<}FA*8YZ|PZ)f(=dguraR6e8y}?qO5iCI5buHZa zX9V7h%#X}O5ckaR_fZ(vqe#6?gAotmJ1&DCe|fpH7T@=P*x3w6Pb`FW4uE5CI7W8D zF>)e)Iyc784Gh~Bj!{_E8n+7^!SWw@o%7+?3O*zEhhyZC_!)N+e*ESAI?uv)0fIU& zhNB8gIwP-!qw_ZY0P1`Ij+t~k4#!eDUV`IdIPh;hZ&OO=uRIFMMvsZG>jIoOl##ABy>4b=3&HI=K`$3i>Bac;W0U^~uj_zXO8 z@d1A5D*hZlrA&d^&zlxDw&UDJm%>ME$GI5{l+FA3dv zYE|-nd(}j;6<#_RiB?VU&IekFW`e4T;zpDbFGa1I;$0#X{1Pukt(t}*k_5BS!X=ri z>3E!qP`*UfuF9SXt}gLX)EMM-)x79A=kw}^^3{xDFGVHr82%dMhio^D#1C*uIp^Pm z-$q_Qovqov;6vf%t<^R5_4W#Ht*)7QI3mE5k!j=w)76DdClis83Y)!%_{d9zSu1SL z0Pv1`6$@K1$KV`kkZz;gT3wv*pNvZ6;zT+bl|+l{6A5V`YH^ZAM;#1_fB^>@{AG|nu7Bo!uriZdOy;1h2 zhcmy=v^au=c5ixxd(*>sZ+i8$+k$X7_jn-6-t=(Z25{DJZ+fVE(;MH~1~nh<{5EOP z#1-1T=}Os}xGLP69?nuu{R;P{hqDz5DmM-VG)Eyl3mWc5=3*09xCdEil)dTUUb~}L zk~#|)(1|jVv!LO^k&r^vS%sZfxI{}VTj937aG$k=USoxO(?h#Ay~4fep*3+;I>=SL zH$CTn#6&lP=eTe_X;--TA1+hEnF{x&hsP-4sKV9L(C$sIaBq5OO#A{ptSte>PQ^sI1p5}y1rv>ceYD%_hMoETnX9h$f*+?yUgt>7_U zg?rP(cyD@zd(*?04wrOs-3s@nhcC0!;NJ8K_oj!hD2To3IawJI6IXbeR31%S;ptp2 zX_UR`;Z1v?1S@Y0f%nY^N?~Ry+?yWWqK6m!%7ZNEmA{m*Y=!%d!do8}C|~i(&24W9 zR9)fT^zina6uX`U4euB$b;q-yq~1XBry#-I_{tB$mcqB*qc_vka6$;; zj`4brbkEs{B{+>80#>P zG49k@+s3h$GFB(hG}hsawXww7kFlnCj8Xffr1ir%)>Ot?NVL9(5N!4K6k=d&Na+yzN#p+rkMBm+maYhA9yb7dm)U|KaH4F;h zsB36Ea&^Zy>e@Hz8iudNZ`3umh;P(2jMmsC_5X>w7R-X4;B8ISqIof$+k5LmbMi!G zgVl38>XyBFb3W&N8%hWMwNM?#GrZJbLi|C&I}K6#Eat5hyHV@3$FW+dD&q(Nu_DEM z8JMlIKr^3|4Q8v{u`z!tsGAdGedL-A^_i=8T=%6q4YMRQR#H1sDXs?%stug(O?t;b zf9f}u`PiFiR{`w53Bkn#KP0#f!6gLS?m&8d<*2~PqBfJ_ol13YQk^?879!r+WakXV<0%M%UI5fC_VIH`wE8#DBa7tb zJQjKXDRi!&vkf8rk0p3M!Hoe9mhIr!0d+ivUsYg zHq#|H*?iGE2PM|0HWnU{JR*SdE!IJKG^uJ#yN3x8tbNFPng$M!*aG${sa z@Se^D;6?rw_$~jMQLKHCz@zwUkRLMM(19P|l5*tVh+nl2R&QV9V+Kt7V0FqqSlz`w zShFb~aTEJs&1NqkKJp^wqnge2b+>F0Pt$F|9Me7+`J}7%!NLSS52nV%iF7h5?SqB& ziG)%>)WRfRsh*7=xY=;pH@!Bvv2;TkK(l`}pdYe_$$n_SAbbFXvLEGVpcc4HulC&HR(w)UL@(Y} zEcV=FTXE#Sf+%X$t=;Q)L}zQNT|g(Lh*sTNdqJXDb!+z~x7MngY|4#%URh{1<%*Mw z4Ry=7KR5CzOtO=4wPs#!1O8kyuU`2V&fNxxy||MxoL2>BRX1kdt4ZshV&*OK3X*U) z-J@)-{0sLW3)alr0aK1K^U{ezD{_bm7yeZsYvz4LtHzjl-;*NzGG^Y$=gwnm<|S=o z=2gNOW9C)D|6DWgOpIgL$!N^Hnu0a+UV;HFG4pCaV$Hl<=k?pInRhdx(hssQ8q6Cr zujI+h8;D@cyf#l?+RR%G8j=4GBw)?FWUwe^UJ3)DW;{-ctm!X5Nk^X?~*HS?Y!kTvuES|B@bxL=?`k#|0Xcl=#MiDq6>Z=m>7kl=3em_h?( z)G_l$zFfTL(VJ;%I3Yxv4G&m=@yox4_y<8(LRupKU_oHnktdBy2tjAVqshCA-u!{j zjS}Ss0LILFmw5ah9@QjA`H@kP1^F1Ln49}{gSN+)Tlzy`Y}SY^Gu&lskR=$ zF)h>TjUZBs=MkiWxe|X+GIv6pz7nU81hu`+NUh?2`!~St=RHB6>9Qq>k+ywGBK{H) z`%A=WQ-S8)358me)eV`Op#b~*jS)9uX!{0C{XdxYVF<|#@D|ep{{YB8u<}Q;BFX!b zSex*#Pq>`JSpB>$80%>XB^$$@7FO1U`rDsNVBS+4rfvalyUc5zVKx03U>{-hS+dec zQh1I|JbH5~Sv=Dtp`)J>VrPSxX5=T#$nd*t?4KsF&!ThCCkXyeMC?RF@A|<-us_7Y zLz@5{g}C@PjGF`Sm^76bJQ2;!0a?2_U>G+C;4x{I48nN2uT&JFK+znH%=nq@b_Isl zpONS9oL1{Qo3O3!Eg*eWwZ7Z?!|f}lc;n$@u%&N2(4}uYoCilWf7~}74gp;7ufcEe z0{qnaM!&7|vs-vSL@kFK4uXFuTS-INN*c;m(onXNhO(73{BD0F7s^)BP_~kWvXwNH zt)!uBB@J(H1Nl(4l7_OCG@LpBg%-+I((qYOD2FHEw>})-4^1mP7Wj>!Y$Xk4D`_ZO zNkiF68p>AEupOAaLfJ|h>Q>T{pWBRTfB2&jWP2EXy-+TZ59Jd1P%e=V^%D8$F^FY# ze&Sn*Aa5$?*QXOBguK(7pELtBpgNcD23~&hjRIxm9fSN7h44n1&-8-zQN>kbKY_F0 zXHn<%9-mTdxDs)kPANEnXyYg~HF$i=t8RR97jU?XhpkcQJ*6#tk8v`MHvkiFyWs8* z1l&Faz<35!X3~HBR5+XNrgI_@nvP-vTc1fbJxgD8%5u-7*~EQ~zLOaZ3=*%0_cG($ zBz)4F|InIWKv=UdawF3_A8nzhBy=+qx}Qy>hj$vI>Qyvses^dSEI>Ezg=Y&c{}W4O z6)<~ye<$YI9x+~3tp5O3i@ZI54ii`lczxCa>8B9<0{*;9TKNbpBVW$Q3p_@weonZ{ zp=mYCP5ygL1drDa?6y6C+dF{;{-vqEPQ|f#c+wbt_9dR{y(bW2| z0_gcR1I}#Q3E&?Pp>-=b`bB84{da@QyBiKZgE5qjgW;G6NBc2w_{;tNoO$g85B#fQ zk`=HkZLXLZ@H?_OniXN zicj_0AcDsn_SkDl#=LDXlmTDtQ3Km4S*yb5KD|5+bXVffKE1pp+z(pV>@oVx)64Rb z#0M73vorJppC4{P=@iZL!|Il2M%RY7PFU%(&kr+o?glc?57+wW@bUcc$MDt(D_+5T z5aA&wtat^J_~f}T!-ftY^1D6vaJlJS( zOFWSpgI9kO~8W)G6&uT%)y1E(qkCm>8!w95cOG_X{O2+yyUSNdtNhDw%~7B z3N|3BY{92l()PTb+|QZ&J4+23+u$m2kU47)aHksEIW&R zq0Aq6z@7UfW3UEWwyEzF{o#mPyABDc9kk9Punqn~`61)s<@fRofo} zJUQcDwZnV_f<-ywUNuu8JRM7uC9XKWg@}w)z1jERBqFm`y*UG5-pVh`RBxfVN2}%K}7>S!!8Y z$BN6A0;T9PsJ^;(1KL^}U~{jXN*7jC@pB1W75-FZn*6FPFN3e0b~NCke+zzVFT+pi zJT!%{Zk;N~hGf5P6rIdImASgnL_+o>>V$P;CJ85n=&BY#V->0ey*o%s)Z)5{TgRl< zr<0_38)V%iMfW4B#dVW4Q`v~md)1lpV;1WWr-ygME@)s|dE~`w_Vyt3h(`kUA9|gh z-k;cx-v@F12fvFDLANWtN9=dl+$+K_0#P7_G;Bh}PfRb{0H-;V}8wX1EA9!y>^VX<8W7NAD^^IMCc@CpK zuTigL@$M~A$-oL_VoDr!A*1%VA7oqhm283^>jC8T9e@L*#t$Uej>9KEWD0{H zkQ9E+6t0sLNWJA1NnvE(7UVS~IT^TG8rLwv-3ZESb=R^2&HdMkSvWNk2(0Ejk7a29ucLD7c&D}h%n}0_~e2C z7}XltDz9)50!qi2vjw3O2m@avGh>DUEf?&ahsQf4F^=5lf;M0bI)xbH-bECGwfg{d zU@OV2t4RHcRL5BBRxlV66r{m(@U-R=>>ZYITj6&32sHfxnPPDg zJTbC0WrA>gaYAthl)tR;uSWC|Q0SMZ1AW;bFjw8+1=YnO(LDs!)MbKdjk|6E6IFzU z5}IRZ5uv1VFQ^V8$AaBpDFihaH#Y)r2yt2bRC(=waR)MQti{> zS#WS|*{k=a6qrma6gQJSA4S@Cw3dZXXzR#~Y*18mM+k8c`xj9q^{61eM`ZoM*norp z=?!#ZA#_jzqOBk%%N=PEbw~%woghmxVQ^?4!^F(uj%cC75(<-R`DF51uE#`_>)OTx zB{jL09$#H}(sGhd%Sn|=6ottV7YdUp4iTobxD>58)~ejpC2|w0+>~N+QteT?+RIj| z>aA2YSgC64Vfm1Vm4sOc6{Wt1D{swK-g>(7)612g-ljf^tdBM!+G6TjT2vpDvuQRE zqomLwL~hKaCfkzOtZyq&AV#o%LXOqi-p5nfL$yoVFe;3Mybg5zRiF$LBr-UW`9z9D zv=Z4*36~?hh(62#)1pO|V3Ba;b+`i}w8NBuk>(M$eROu;?nWkMl$6jqhNLNyQAKog zI3{XJ#!w#Plz{Y5V@IQ8nEP>V2#%sD3vA`OYx?SK#Y*%)p3CC7HJ z(&U}4mC`fZ#Ol&xcUaLMk(S3!iZf}Bv;w=13iv38nQr9WZPVITFe^@?XeU3;^&oTW z8V@l3bw&H%co;~FZi6ej-3YpE467Lm;({*PV(t}-pNs-YPlZQMZ0FBzr3HoUbi;|R zfoMsj)xoB(bPB$DH>ZHjpOSM|6RMZbWejj ziEO$Y>1)zbQb?+Tp~X0^^d!_G9W9~GAfsa;a;VBdDNzn0RSv%D@b7kFwtJIKtl1s# zd%C?>FWYv_o^s|-D`gNqIJ&}QA5NE&P)HGYTt!an_E8gko zzHY^*tMcDL?{llB-d0V6t(rz1eky~Y=0VrfnL!V?7*&63PO1k}h@`nE#f%As8_gYY z*yNoi+v4ISZMBbsg*s~OFlwC6Hu{Pl0)LEtN-Rm5HO$e^k%VNDk+ku&7@+T=7}z+V zJjfYzL~+D4gNox2*PkPvogKwpR5H0>M*~vM*hc}gqaRw13fS<3tFJ%ABy+*8@|Nyr zs;weZW4osU9q3}T*Qhm(UGi=_7GwzBiq(8dR`bF2zAS%CQseGPqSdDxKtmiVomXSJ z^RhDy(|O4RR%g7h{E~RHN++hQkS;5-y&E7+oSmiQ$d$MB{34b%C>x2iL7t@Ukv4~+ zHX{lIQGd>0;zr_3!*ssH;&9@~&wyAk9JK~g=EyZtvYibIR;zxnZFWQYA)7;8$zU#1 z)7GyyDYf;Vx7Ar?tFzilL`_^;U54#KIu}JJ>&R5C%QcI}SU1)@DNvpQ7+kWhAtslW zqppIja{I5HK)d~pc8c{$p99-WQX;U>*gCDmGU1dby4uwhGXy^tDU@q-y6fqw9a1kl z{Pni#Fq%Sloub>Nf?D@lR3iMQ^Kz%xs7iNw4I-&AHfc}J2&-Z}&NGq_I2sLClJ>b;YiErq}OEL^=olTe> z2=pws;>vElYb30fB!$2>LWwb~Ymp^VW6Q3|Hqain?XI~+xy{J6XU1Le*D1Fo|4!L4 z|Fus3+5X+u5GDXoOI`CF+19e=%zYyi=sf<3LXqx=v{mGj>OzA`q+dg;6S>FK#f`7w z1t=7mVt3--wSn2r3k}TJ*qlC+IvoYYj<0NDE?y#t<+S8Eoic^ZX=H43jc$j^G%B_) zZE{0k^Azq71DdZIz@+mfjYQ8)X%tq=H7Z1lLl4$x+Z7vq!&*HJa^JYTVv^{V$A}W- zbjM#`S2PCaxC=1FD_v*0C$*DQaL7=*)L}r;9NEtnlYSOm0DbCoa1L#cRqDRlqIBh! zW30FYSUs#wt8uY5OV8$3LYy?D3Fsu*3rjE6m{!HYqq^@PmWZ*l0enfG03L7 z=`Ynw#TDyJ7QP&Tcx2c1l{0x3#XKLET1=i9#32*QGTT74BZ_F97!NtEDJ1#o(qOGF zt$Ll)0_(cV4SRPpjInjBIdiKUpsWsR?Z9ajkn-qAD~%@3;t7o=MouWLTzVt2k=E6( znOGr>jEO>~Dcvl*xz>)=EWeqFwoq8Z5}chp^%{ioO3WlW+v#KHH?47Li~Mpa&RHK( zX>e9XIBPM5Fu0b;DGPAYU%K{R6xHXr>p4yn6Qw!YvNz{QMYCVB=#4z z6gnEKYhTGF-5ItR*y2kjnVYW|e6m}!Kt%Oq-+kvA< zFcRCfdx|ASVAX$cTsTQQ=}tHXn|@ge)M+&6gPL@#u_JD5^hl2q^`30Xh`V%APlBX` z*rjIy8ZHUuOu1qQ2lZ7G^3PY0oFuDkx1Cr^+!}T4_85R{jn>)*QDSLWVUcwI~2n1(4|Os|gihBe3!Gh{YXMVtb}$H=U%0dnV<}s8o=g z3h$k+a4hswx#(kCArxH|AIGAvwbW+2u#|$!R@Ptbk!czEGFx|SMTsWCCSZ45SR0}> z38W>?ZrDMQP{izp9Rt?s@a%5bac%37t*x>v6!l5{LVLAB(P)LDVuhl~t$1n=&Mu?o zm`fR-xR%VSH$8DLlY#+zYuU9}B?8MWTJP*ywac&@caX1S+l~OVg2qziXcJaI`eV43 z0WayN#URwxll=zQl?|Kh7X~IHeIjs!66O+dvzvRs5hHTF*%7y)RMB8MjE0~JY($=_1i(t-8i?A&iAX|h5!S=)?$2Py~tD4u1 z{%nMaRHvBcgG97pZD1SLKT&&jh1prZz+hyBx!Mi`HFg+Cc94n+)OA2o%ZeCSD0q0k z$Tks*amlvMq=9LZtk-rXi@v(PwwfudZHWJj0Vq~OQi9#p4A$KMV3+310AQEq447J) zvqK4G&Nf4X*KVtHfR$lq)t@qthS!}wYp1p(gF?02odAB(p4MolT+-4C%ej4TKHX8- zi4^Ed51a0{{)hL3#wCC{vf6>QpGpS?onOZp+xt1HCQGN1j6(#INt9#BrLq}QNrrju zD6mZuwE^p@9nn}hj*Ud8&Y`M(%l(!pU>i{ zh&kO4Eh!d6?p=)spcOaMlO^JoY7p${tr~&MSaD+{fUu&tb202PRb_fD+l8!cyO80w z3+d1fa70o_pF1gXMKdsxi#b&`Ev3$El~S5dMBHlD|75w1>nW~0)>7A*Y9beyr+zld z7coXAIZ3ZSXRZFArgE#hRK@uee`_Q+tvBh%U5%pXa;8dzvs&g()Lq1+rIehp7s>|; zfitXbr|GC0Ya%y|#o9Xz*tNlaK`BWD!^()$yQPc78j4JjbnV})y(P7Bi)A$&EKFMr zb`h(YC8yf8Ep$5`ees;wQ6atR=eE0)O)3#u$1cU1N#(@NZL%5GG=JayvGe(B4TG zlI%!I_3_CF<)pLPn(Mx;x%J7-F`u&q0-=uepzFGcsw9b`Df+rqG?69t@7D5Rz(nEH zxmGvZOXKlU27azS)Vp5vNZAiv5$I|`bPfAoN~1`c4lCc*8hbu~$*OH?Na?Cuq#IYt zdXmUTt1;mtSADH8rEMqbD{85uSpeT|K}ON4KKYrAGplLP|5u8Io$046m`OQ0R!p|) zu7Z$m+ex!c>N&BWN{Sh??D0nfmR*HB z*#jI zpYH1nW=g9W$+m#cPFH1GYh(qbzz)`Kk|zk#tJ@%8`dwh@q}Fl+3ZL0BZ@A!DOWhXW zAlu2T$=GVQHY5CV=cvxm_eF&)mW^(wX=%GzvX{w~NUH;hMAlh}46Q_#Tv5dC5!c$x zlY~ZJWN*MVAhskUiVdzPHrkF5%XW&CSYo(jXUK>RrTZ$jb`(>^cCk(>uUESId&i;_ ztEb5UEQydT+r^?9qf(yiP-hZrb7rR4;|B5K%+zieHb_?EF;eigJCeAprD{39bb8*; z+lY`p@s_S%Q}fc3ShK2>NV=ZYkXp9mB2POwn~>}wIz(i>cRlUkN*B)Buyxtvbds)f zvKo2fLTE2*(M|RU=>Xg(Ey1nHDokH@n6+nRWZI#Y2j`S%s;1nH-Ki>f&xayY16?^y z`mnD1gA%L+$94xsF5(?R2?lou8Hs0iwN^q!nRoUE$(jX45@$xSPN9<5$!TFGGt%8* z({*JcJ{heONLiU6ov~?I9%uD>_bjyC6Waa09-}5Qdnl-hEjn}RVvM+@Uu|+XI0L4~pMu^k|mp2m_9Ev5{ zR5FevEsr-87$!-WHxyV9kviN+u7X1=v(sQZyBlC|W;><@(q=s!YlKPbc1ey-%8s14 z>*^R{#%e=H>*W0gSWRbpUoV+$V+CE?^#o_yjd&9sCXgX#{hWnj+oCirwl%xoP8uIE zKGPb%`Y>jtHlLPS$54t1men_s{dDP8VhuK?mDHx&t#f#fZ75U~Jh>o5h8x?^kZEaX zN!uV;Z^yU>9jO|VAqHkN%3GKFX5zNfY*!K2cuZ7=r9=j;DFzI&=It_%0YAHPm`J-T zKU_Ve=$a-a2DN$i;GHrrWc|5JB#)cDlE&)2F2KOWE~U z#q85y|(Hj>m=b{SIPK)Pi()YlHtl_(jQv8qmf?6?g*8`RdKDFpQ>J~ z=-Zyo=@wDFwudvc-KA>?WYV{#NIFNCyY15`(x!{EbA8ZP@v$5K5w0FdOO2639q@9oUzGPM6SDDXw8&XSKpTGmsgmasSFh+lTE5OwW<=; z#nl4Ks}hw}C6XJWbUzgqGANOaF*%t<@O}fMijW*`i%KpB{G7{F;@%)7 z5ghNFdUB11sJ50t&?9VzVd~Cy7^e1}n$;F)SFGYT`qit*ihJIg$Es|lRj0Mww4FCy zT>lO_?H8<~bYo7|mK;NiZHg#eR8RMF9qP2KQ_~CEjoAidg*l;4by34e_Q5#{0>}0K zX%zuIJynDOx-AIXuoJD-sz5T~wAN&jz%)~5QP_BzpeKEX)4NksA4cJGj&db*-DxFw z9`24>IKb7FHk1;lH$sHfC?$|+)j_OMA|lLEv0JnSgEP4`%e2#h#T>;gkBcLgO?W0b z%f}_-;BtY-nR~1`?bUU8pC!&}aSpmLuU(gu(uvn3`daF&Co8PmM#*p4t(t%39U1uZM(dTr*d} zu1Taeu4(JX$e9*1?%#0=Z_OO8PUP)?@#RN(XDdusK|(+6=m7sFW|2fIfJnG)XLYk! z(~>zXKvI(3L~+kU8RX#MRD>NoAWv-ZcJMGDk6amK3>e*sG$#mFJQ3g8C>b9-q$UWq zQzRFu%U+~c{$ic*>ZBrFfllW_h3bFT9&H5{r&iqESZg}B;?}-%;7*MiTriI7#acL| zOR&Z<0aE+SY**+g6S_%-gir;mu}`ydCDb{7my!ib7Z?869?z|5yDnrTinm-@@k7>hDZy7*KyurA`k1!R5rj;xpq3#l+qX3STT8TJEF1bpTEGnhMmP<-b+j5MM6ntv>PCKwx z9O*cC$)O2LA1H&&4X5T~&vbRD?Bg&Q7j0ybmbB$EUn~eYN|MaNN4Xw2XsN4YSg6JF zPtx!-kGO&X%?Jr54a;p6NsAh9vdK1qv~2@3pj{p!2x4}52-(#3U>ArGt{#*7K^yz( z%8u2;K4Zd4k0t5ZvYlinyQ0#Kt*d&2P-k-jjTxq%Id*dO$5bA{uWHh;dL+#mq>cjW zvL7m`g08!vl1@hq_!{3G9vq#Rb(Y!*rDVHRdki0}$Zu*WS*7bzL$FrQXE*x0CY z#C2*d7%838svM@-So?(mQ~g>Z26j<}Sg6&mcIqTihPqd50vzCU4KmS!+QA`zkX-=5 z={;k)a51$XGkN*nTfK0mBL5EN$hhr(!4b|CAm@n(?T8&ybIK5j78-ZRT?|#$ASr{1 zouE(^q*TO_y684tPkE-r1!G{MK_()Xnyw_?sSAIN)eEb$R+cdKsVq68-q%%+-07Y( zoB4cGi5)HMJ-s@!uXFbihE|yU!pXY)vi_;>vf`uYMt^vwYURlN=n+@jo77n z+;t07quq^Y+Im+Tc3fMjUWMI0hb9xLPr4-tjZMYp20h0DRIW?&bh!stTa zz+ljI4x401Yt>oa`d{iJ+=gg-2x%R)W_~O{H;Wd|NZxgvkF|hqMZk)dUep{fPc?R5 zGmb#8kvbwl(7EJ?#r>JPk{n_9qRq%LXSo)Ff5Y2>ZD(5Vws5;46q1a^A*;V7&xcqO zf^!>>y(yx(d$V(DAu#F598&>n0vmnp1UXrINVPF{@D#r71E|N{gO|tr%n=CjyubXpfL{;pjMvdI zLjTWNxNz}^d5eb6Sukti@R6giWi1^rdk?&J7<C(W_-6d z{fggXIP*Ol-#+la(S$#UujJ5tUp3#i@g<&*3M75#J%&TNf*(ub8^OuMX5!lm--Y;+ z*rWI|@wW{eveu-w=nBr03TT9r$OGuLgrz+Uu2J}Q;5z`{vH14JcVqM25?_*?iEj(O z-^Z5}7U4@?55bqbF2|Q_osMrSzGvY}ycPI@4LnT?QH;d>ahSB_Oy)c2ChRyJXJ7Jr=?V@!iKd z;^vIX>e?dHO^xMu9Ln)#e1iq7u{+>mNk51$YwTf$%xB1xaIr3)G2hn=#^21B9Z3P< zA-=?G#g}!|Vc^l`I~`xv`PTTdneK|OiV|HvhtDbaGQ}(KB`*)*OGT*`q$&j zl!oEU@QuuOSMxm(U#4^}zM2AE!MQ$()5%CzoA3285?#Rs(qL~if%o9clpe&F^7}Bp zN|CPMYC)!x6d%Qx$S;`hE5`pdd^HkX!AgllCnLRqFC)Ee;13M^H+(e`UBNvP>F);V z6N6N!(a81ql326(w&1Ig@y!H}NMt&R#4l5Hzg_)VdJI=0Bp19SMEaW)2H;B~!wfvy zz|-+%0I&6RRh1s_3Yh;qatMshwT}=wRn-rFq z??J}@aPvJHUyV#xaIr+DlSF=kFWEgiMgnpsxFQ~WZ1T2LojhE#TBL4}?_DFZP04;W zB{CMgAd%07lYuJ?&sUi5wZ{KO^IeIrMy4zHt3YGk^C zld4!sFPOlW@MYw;&G&D{{}c07V;W;fDPAIx>9l#W1!KR~-+rCa{q5I@{OTGbTMjfu zG9J7qk?15lS$v69ZD0&R0ypBTk?0COmPl;|slP$$z?V&B6XU)-Wj!<|~XEGA|HyGA0%OpF}6iCR3HxP|Rk6Cv-xEs{uNvQv*QBek0E zSo58PuSTLPxJM$C$f(n13-G2cUs|Izp|+sEOn zMCb}$5+Zam<>mNtU^~OWm*LAuSK+IX=n9?`Il9&$-H0#qc!&9}GX75*_&M`^4PPaK zZzlNZ8pYn0t}S)@RU#x894-!R+;Yu__A?- zfUoA7uHbFyahh>U7?rD5e3@J)zKlExU$QkDUnci`10QI@mm2@0@nyUd@KrX>g=+|W zZo^lTqboR56pB0H6yESmeS9?%UBL+w=`RN9Lwp$t_a6z7W_%f`1z(Ls zS8%bYnshRyR)aJIUq)Wr_;;A^I_5hXUnN4<8^D~7FJo+qFO!*xFDcG7@DdY#IKI@W zk2c}Q8UNGqRf=>4=Lf8$hYZrg_>$-|=KGTQzH7qsm{=G$SuQ}HEJo0#uT__BUx z8+Z}E|A)Hwfv++>>%230C`Cj>mKRx;mp6kfA~H0lh>>DUkwwIaNGWBJQpjW|&`c)H zFf>aMQ%osR8YvHgyzKu6rG4+F=hJ)b%I0CAuF=nYb878kO=QO9xGUuDs^7v7C)JtlRv_{fz z|Fpynh-&LDr~-~awdJ_e+o9Ut303#kq5STd524!9cW{g|3@ZN!>tmq&E38*pp9|$z zmYnrNwztFN@)}k39HK(qgx>~l%d|g?_&r4B?#rv<sO(o-GJ(`E~h_&Ds|ux zLi}ooJ`_=PEQN|bNv6MwbwpI|Dzh4@l$F-kS>FT|VmnlS?z8bG{gT!Sj* zhD@Ibry{ozRj0>F`g-v0`~Sp%B~adDVDib}U1rlPv)0^h?u3eV0484z(T>=30V>*M znSMS*yKd8Ca|DMSYRL?91yr;(F!`Ght=XnsP|@0C`sEPqFrxbBDAX99h3dbHa{1%1 zwyq+m4!y?PfIc9^o#XMqmm=De2|1svDZf-OWn8m|s;$Q!i=0RV?P^38+s;h>{!M8$&0+s3_TgBlIav;sr4p)7=0WX?%V1Kcs?{Q? zYHQ#axC6#*T~e|&EQvNmg*gW0e8Tz}sIVPQziHlqF^HsOYpCmeLOQ!lAO=Y83u_rkNi zy#B(l9~G|w<(jIMo1PR|bs-Ti1#Bb@wJm<$p%lO~v@aqvlzlzcuo zNz@#j4mERT=A0Bc`E=NRBr1}qZ78d!>B`(wx|T>bz0fb!Q>OmC>1p|z){2|@rS;JE zru5V=wWmz|;@VMjldpyaxC&9mjZl@?0+nf-(|0+2ztfMvm2bDx+o8tcB2>Na znZ+eB|3IkxL!k1NSf2ouuL6etfXY7ysz2sI`PbRL!Q2Exea)>--(kJY`hKYR$Dra~ zHm}-#9qJ{`P3!k;=guei^I^`w5~zAigerHQ*#y6az8)(6CMdtHwjYOa{=uST!xM{4 z!DK3A%%tqeiLiVhBWlJKkBTiC2vy>6b1YPlQtMSvHCb%E*7gRdp5ADE6O`XB_!`^? zlfB`d`Uv8;l5_&9sEg(;sG^F$BXT%Yh;i2En$>0l)F7;e8q_UN{@bA5kk|wNGduz{ z7{{T?>oo6~5230)a&)wpndRm}v)*hpw?ftTxb^Y>ImVd@Ro*hF^46Hm<~H+~dEUHa z-i3-gcudT{-rNJVNt}nt*3gw#5kEoFb*LuXfy(+As_5eHj9oGiDt#oB-zX^i1gNf? zW4#$BzY;>XAja7uDf#siu@${fTY|e)c(qdaK@TfAYQcZ}1I5_8Qvl z0^9waySG1a?eE+D+W)rfwO@+gR!^_@B;~IC$no0WhZxIW^}BvAzw~l7mvuU|=lg-D zUjO6$K=-S?25=z*Dr#W&n+ISVeMvebIt(>+PC`wcvv4rH1T`zK!k9zS=SaB@74s(4 zy1Z@uzR3|yh}0LxoRU`I$@iCqvL@MMia8Z(x=yz~-+B$yCRPho;u^ErY_WZd^=(jX zX@zRb9&^9#N1=9>6HdPXV+|#p$8rfOLZ>}$n|I9za3J>L?~1+C55@?RsmcdRn5dX4YT!R{a~lT;qz&+@W{dT?%jC^9>A^?h9GdLCbVA)U?_HHLbQm zEt%cc4?|7ub5Iwl%P>r2sC-@KW2X-u7wyBK>?KgsZ;aE+p~|U%$wIvln29t6u7GjM zOZpHg^-yK4hKki}ZiLZO(ta#$P^BD(%FzK;N+(p#8&J!u3+n#3?{}vWB<&!j1S&!) zRD@Mf5!OIOXo8Bc5h}uN80!FwHjpAJf~W|hB8ZA0DuSp8VvL|zD@i#572!107+i;n z@H$k4+fb*M_hAX_KR%5h=_g1jg~~C>tTd;YGoT_ZGONuRv(a1w6=xGvTed;f>=2A~ zmUNet<4_S#K-Kv))Z24spmLmtigXn!(gW*#Ux@zoP<|_+;xt3ew{1}Vt&kFX-?sE1 zRdG@I8*W=YoD)2GWAH`~-Mz)<1mWqp?l%Q&A_WHmx}ayCwWGQD0|6=N13o?w(6v6@ zppbJX4Z638_XW(n+}!}()_q@4f3I`DYuxt4{zsDM&ziDG&#!==bBe}LhLm}aUnsCV z>G8{N=<%7SdZ@1d6OY4C(a%BE^mV8?cF*a3C&ctYP=|=ap>7BGIpL6RyjgC}hnm}q ztuKX&TMNG#Hp1_KO}4kd*ltOBQt1@b?s*z2=LM+QJ?|Z{X4U3OsFF58*>{@1r`Wl#2E6+Nl{3th&f}R`ybd$=&vn7wcaO592m0 zsagKYI~tajy|c7B^TcltN0RTDkdN1+`K@{YICn0Zc^px7&2L06FIis4O%gXla#{M? zt1odQ(m(SIBCwV_-d}kLHS-^v#oxoj^5_Gg?jr_6t(c+aFev}w<_L47SpvTg`!uK(Hrt$QE{4iq zW4#XQiri>6+r9&;dHbREwxdw>xN7@t^PyQ(7UTAXDt94NJL;Xj+H5vkp!^2DGnO+B zO0R(0BWFR?Yk||N;d{{=pii7rn~=d)at;T*c3HM^RM2q+!X+uNJ&u302JQscK9eRo@S_+a84Kk)!ZGz!Ol{ zyEE{qO?tq5FD`26y-8s&?fEt;_rQO+zsYU^)HlEMrD$2g{E~g*u7nyC&7;Pm=9rit zu7yrX>eFjWI&f;OT=gcH81tyzt4TQzHG^+LMeQ;lKt*_L^5b6N=z`B`2Y_Oh zhRF)`%b@R#wHyxBFQcH|HXQHtiRL6ojNT{um%^<0eDLb=jP5D3B6qRrVKF@YdZ*9K zgw416p8R5XxZU@@^iQ`*RB$KF6{P!4t){-8E)dn7)1U^T%A5^jcS`ypETTLYLJh=X z>$TP!t*&Ug z*{4H|U#JYT2%bPwmH(p&t)EOF!m5 zJMtDRl+0bqzi5@Ho$6ar{jn9Q2X~sSFwRv;S|y@9_e0IVgVv8*KV$uzdEUHYc9=KK zTQJOQ>kptt=n;%1OVTP4Rq~MUizN?((L<6}Nd;7_X;7ZCq3XEMdJRRz*`oU38@l+r+?e2GbOc)LpZk}rn0vm`EdEInW(J^CwW z@|oa26j99>Zcc#enkpFf7^km-dhcTm)P;W!)PccKDF0(naoS-lL{f4(6mrYPM^MfK zzdt$;hH7m&oCPbLJ`L)AX9XnKQ2yWZXWl+eqn>)hn!ae&1n%WvJ-1C|UOe*p?bWh( zmgVQ@E55%=xAM@L*)CO8?@;B@>kFgSv4lhZ?adPM>alruA9o94PAmpO7ySBRRG&8$n9biD!)GnseiGN&b_ zj83Xx@>{{F1yR-5<+|^O+BOfv=qxGuVsMtINJq_f^EAY{_bK`{?8QaAfW+&mdo1T^ zA6deOk!xP@+d18D^i+^8{-V~*IalDS^=mNJTGEH{5H-;EpxSvq=OO8*oT3&#u*buk zha~N_qCEP)E5;ZAV=1uc=dp-s7pHt`hb#-X6r7>=+9B!Z%ZqAXs_`qu?tP(J=p0v6 znL}anBbqHGNIwQg!B|g8KjRenjzJg4<~$^=c8X@&MD%2yqE#SO!pfYlB=xN*-fuzjzt#i!pC3eQM_i5Sj&6<`67>nMfWjYGE z{W09wedA9QpJkhV2H$tQwsLuG{*dlPouVm;d;HoZ|Lp_SOE`>UlaFtm=Dsc<`=X!s zHS#a|rRYUJT(+bZq1yo%I=8Cl7KvUOH8@J;)TNp(bSVg>TXvl_=xF+#HpZ{An;QLex^PhKjTlYErJS zUT3Z}*O(j3E#@wBuX)fsVxEApW|ERC-=dmHRLxF7&EL~GCrQb@a2=7T8eTLzp`0H> z-5M27Nh3>2T0+N2R5SWRISNlMOy;w7rhqoABip`2$xZJ|{#)>%@rYk=x3QJLmL zWvVfk!srZ(k}u`1fr_Z4lo_Xw}qgRQ2khYSIY% z6eo|vW7o8Q) zPr?{PQu66Ap(LtSXP{1b&q3Apg3~X;#T4?)Xd(=dapA8-j!9(|QYmtt@bx;ND zf+}zij1`xZYz#bMq`l#?hYG1;<8Q#y$ELP&|JHJyNIE)^xa z+AGHTsIcUZLlJ`zm1!81a|u)<$3g`i4;8Eo>UqU-s9+VgPlM{j8BqCWnzPJ#<^rg4 zmO;g{w+{DL@SJym6ZHl7`feus@y)PASZH8l9KJAMG_V1l-Zthl9c>j z=(973YQ{M`T`;ei*I_JPotFGzuA|eAR0%SrjLyoI{8sqHqeLx>*P-fs-|X{)F;jnY zF#JL6B~TqS3T8@voZD{Fl2S$|xhIFh2X@CGekT#Cph{imccq0GfDEt>YEU? zQZ_)1V+&LXJE5xG1~u6a!U^y&l;1I^;Af%c$p!N&EJ42x)mOKn;@vlkE2Dp3_+6y; zhbm_nR6RyP`HzKq)mjP_XA)GolcCD3fXX)&%72;JVD5zK&Q_@UorQ{X9xC4hsCpLIo{_u_q-Z&Hc3^C2HoD+o=L7QwVNXgei zrUu0EIBkWh&UUC}wo@*58x{AM#4X`N!8Z|A`CCf56|DWHBJK#*Qbbv&DCv5zE|9o8 zSl1z{q5Ggpx&YN7UFKbL$PY#Pa47poI0=q{npI`CPqMwj`b?;fu7{d!jW9M>Qu6uG z+zocx0aeulP?b6aRoGG6Pg_3=bs%y9s?wKjzwY!~PQMRhVUqlf9uE<@n*76R^oLhP<0*xLtCMW84byKBjg+}<+)@}$XRC3%INWD!DD*#`0d~^6Gbs* zL6tEFD)u6?+N_0Cx%d12e=OF0|3`z@Q(umDf1CdqZnVP?C~k7RAQ<146>2he!gyYH9Z9S57S!g~1=Xf|P&pn! zE$yQJ5>LbW!dMMS$=`=+^g~oN20=}PQBVgoqhWNG+Q5T=OigP8Ju?5sV!%el$;L6 z12!IlD&~03Nm9}joUS9P^KL=y?2nF8Sg=*z^NdNS{Fn$+%F-QOM>Um-41##{{ znec)xJSY;*vGwxKkBvMr!BzA;S3y;)bk(NCDv=^-wkeM}_L!UVkhBns7(d-zgY-Np zOQTQk4SR2B7~S#=4NG67(iXKWs-dBowcC4 zjd8q4p?iv6GBrh|Ge$`AxdJysP3~>ZdlJg?wDoH+X$dciZrXGkYIC_`mp(rn^#O1b z>4Tv{j)bb#Sg4R?P+LW%?ek%*jHE^^E1|Zhbx=7rLPgkYZim|Nc3R(M?lF&=$D#7K zo2Q{_bjG|075A#`x2)fVn(+6XUOXdS<%dAU8wQncgjoU=w-oAbpbV=171n1$<(mVQ zZ@#(ATxB*x-9xrQdZhPR|M9nJ2l*5;;%Pg`laHFbl}Bp-;`in>;a`09j_ z`riJ;+jD&j4y_6o54p4J1T}r6mu@ONR`W?(x8t?kBX0Qf>E8HRVdSTrj``_eM!=sM zdSZ2I5R-ohcMB3V?)%LBaePUUl>Ae0k|?Jm=Fyy!q$IvoAyH1J%=Vm3I#tg(gYwL0-4V4fA#Lu6ZA7q4oWd7-0a65hNv_4HX}aD5vpIv%DOtxM|j_ zp^utsowV96>);?_J`XDHV(WFbH=669>bVsrQ?=i=+OikUK|cXwk4pMH zDQE3*5vnd%%^Oa?V?Kl`yWfvSzX4En8)y!K@x6r+NZO7@!*{`nP_3B)m1DX&8!F-g z80#eI0x4^tHm0>uIhvt7_m~IFBj$0a5>7+4p%aGtP^eqVdrp4@6|cA|vai|C90dJ| z$q|TZ#2B~{j)l4_od8utIgGa}6}BvbszklH25MJthAMQ6(+|VgTuJ`E2Z?ezZnm4} z%=3^;y>HRC`)P~*UvIEQcYE5QmnXsg?QPoeI~dp<*}9X=)=iTOo~&Rq&%E`}knXMB zc61`-H(D#XdnNS3?VhAeob3Ki*d8C3&h76w=p$hAKDB=a zl8$?4LwRn13cd+yf8GmqcYntAn^2K&S-%UD%c0PRh$k>TR??M_H25cC)R9nCEQP-V zCqa!*rR_6e9DGU1p|Eu3AgZWEcB+QTv>Iv>9EQ4zowEHjOfH5Ku**)mYTlITV0hX8 z2vJeFT!#h^g1UxHgSw{8g^Ie=dL2}Utb*#GW~eE-395s(+P>4=0~PNej7^f1><;JV zHxP9sejh3`pZ*EG+aIb@!=Vm(#zFPhMC((b3ZD+u1v9PBg7TYdy$NcxnxQJW5i0IZ zD8DxA2h8(M?=WvdHU2hKoPKj-xdWjZH5jVvhdO;YtUw=WeT+FCY6?$+@xk=TNUF&~ zs0cMsEm{H96Lr=bt#359IK2(VkIbG&dJj1+LiI%lR9mk@4b&~Dwst|4a2KkCM^H5w z!m)8A(Z3cnfDVVyLlMZcc-$)GQb?NlHE)Ht{)jnrAM8a$XBn zahhqr)kdDJ`s z;|!AY+jyR`r5$S8oVR}2yk_3Dz0dpNv>FIi(hwLUN?Jln2~?y~dsISgyj4(3Z9a@S zBz=jLbx-+-qL)b#l~YvY zo|xLnITU-(8_D;Cjf5)=UcH~2>yxCpr>CCyI29``zdoesJP3Bbc~>L!?4778uQD5R zjgu6n8q`H)GgR}pL*>|M?lF(peiEv&?bgr1*jrm6X&w?1SKh!`Bf{HL0 zYLbtzeUv#K4ko=ED*tpS|5>&#f{IgXeKl0go2|E)o1vb5-3oOn-|6%NFh9W8u&DP6 z2R3@h_XZxKJPt$Ed~7Hr(c8l&P|So>XOt;|H?f%6`VQ|ONi73^)CKHsJ0DS7&*io zW{!fIxMN@}QBra%1RH0kGN@)uvR+|MgE5n&kKj=SHKKJ;vvL(w@oUZXW($(~6(HpABBUH}lCurf2<4 zp8QcsxI@YuoY1=5=|1NqFV(%&@Il__i#IsgGngm#VRg$)8Y}8$ju=0mDJgc8I$#O5 z%TP1!rulm880V@t<)N&FjIosGgLrf~MxXb`i8tIVfzeaaY&<7G4NI9lCPT%pHP<-3 z+4>Rlw0Q|Wb@)od@J$L{y$_%6p5r?aVS@Jdo`g#KacXxNYMZ;^THJ?f#Y5{O7sZd> zjEB#YUJ7HoCA~;W8PwHfGE{qKKrPW(P>~l~uQ6AeYhgU5-H4uuGr(2IrsxH$1wQR-u$l6n;(3G-t6{e6g|Dq5xEwD&h3b#W|h+R30 z`m2!?vFHAhMIYc0)nB5fdRC94qo{v`r47pSka--c)OM(x*PMRCybWUn#r#`5MCA|* zYn7HAb0}}})o_S#*Wn&PT_O7{j+qCVgQ0>BgR0&L>!YB)SEm$eJxzi!xTK?`Oob|T zI#h%?P}Q1mR>PP>(rzsEP&rmYQud@hlynwR#w+Gkh*R%31OLE`Rap~qQ-U%lt(F4O($8eus+** z1C)OgjFBWI|2wRa^@y54TcLvOHrt$j7(P$>QK&+W+kOi6M?dTI3or&(13IvXX#)xw zJ(cIPc#874Vs_+WNvgr}I@An(1XYVZ)lnY|r4NOQFv{s;p_V}<)V=c@+ZRE-l3ND# z3ar*#ZF{r16{^d2THkH%gDUTkdBo|*p`OughshER@Fk=d;8lCvg0a<-eiO?b_^t2( z)PXNI0ig~3%|TFQjf8sDI2P(<$VA&K%^6UBRo3UgSdyea#WLTPg=V$63`S2$=kTnv zrNL}8*TU#2>C1RF+p@uIF}FfId*2p@CfXKG2Cv??g(uH0-*}_&`;g&YIlYA_e&QB_ z;7pZe?uZD4?VD7W-${{^nhlRRoCcExG#TY@cv_6+PcD=b8 zD#BXp>#T3Gz6Iv%u-!4!vU_9U6)5$KkrcC$NIPBDUYE7sJZK&@&zYCZYfyE*4pq`^ zr{6bum@lm}(kJog4^@Z3<`{E=ISDFKrS+NSTo~&tN$)p`iZtI`Y}T4}kQ}|QnZ4MH zxjB$m?`uXYB>z${Tra!NQS#@$DKuQbl<-_CrMGmc9xbYy9u5&@X^eHXq<&J0EUTlX z_f|Zhv|@cq{*7DV1O3p3+~NLns&00EszjYBiW=MXP}i~+sQ%t<9x#u>*eXd2@Hhdr z&!2|Mc@`??d8mjNt#??zX8i`#*muDgQIeiM5*6XDc`thO-YX+%)|>1VfAMeVmE4yA zKhZ1dr4La9Q8mdj)>SD73oNN;-lO%Y9%|QSJRZB9lb6QQro$LR(of@2Wy=C{an3{1 z`|wz5OTD?)Y=*?@z3r~ zDUyD`R6n)YV{`QAy?%e)NA=tN2K9ULpoo~}_wM1e zo*KWw98%j)(idCY7st%g=2@r}avsL{AnB}A)QeZ_*^%>*bODPfk2_E!(udOp=|iAa zX%~>S*<)}m%H{^`!=H%~lJFsFaNls#Hqui5!3{Dc|w9}DVbCDz^yTS`KiHdO0 zJd$&glV@`G4SMd~;<7tdJlsDNHDk@Q# z8qE#nMi`wXB`v{OqMUb_`^^0?I!n?%dIah@qbpGDeE^kn?DE*|DNyi z?)n>{dZ;PqA?c@_BG1j}$%gRY(@sQ%I{=mGnDtB6uR-1Ny$)5KyD%0jNte{(6>*^Y zLPZ*8jx)=kB3D3i_Pzzai`}QV=>HF1Pv4^7%vV+DF@R_LDxeR)_R?!F>5Ck?KV-nh zoIla+;o*Yp?#K+vMF~$3biWIsY5XiwqUkL$Wtiq6Ax%lHzJZfE)4vy3iKu*Yp&~7a z{p>Q5Te(Q#m1Fl}PUnni9W+w%(MXD^p4#Kss|Uc#dop;sKJHq2g>a z+n`+cT0d+aH!s-U0b@CmlI@|Aop$PidOiLShRS^?>H}ezeo*&mBVi08DcKZ)lt}#f zF!4tt{tSL)P_Jbs!ssu_Z~j#xYSzzy3O>i2=k!I^mzwoXUkTM?O-^ryI$YQapNG4w z@3s9X)Pdd^7%L&kkN8Vei!VS`;)>Y`Rk`bsOua9xdjqtv-ousrY4<)o-&^q1OAjC3 z3X7}zDtyBi-OqG`lKIBu?sq7CpLmu2w)_*xEYe<>t(i2x4y`F zwe@x8MyIz}-(r2Q_5Icl!|?J7#>$;WN_K|6lo(oMc0f5_gX*@M<~^v3)dQ%?7T38^ zQ2B>Lt@RNw79uJ6eE8;vO2iV3)1ZRRfXXx%D%fJDFEi_*g6)N>%web=I|Y^R64aJ^ z87kfl^N#Hgq4tE)uf*kD3YD)8>VU8jDqoYi!Q2Yv*9KLu15n$;IhZ^QAKbr+sH$9p z3egFb<%ZL{ptAO?cQd~2b)Vx7~sJN=+})I0?h z_l)&(<|U~7*P-fv$9w=)Zt;g>IRl~WBdm{xvQL4ETWR|u>(wyX9e$2*jl{nQQ@$Bd zwcY|Xko%!ZKWF_iRJ0DL(mJ6!`gN#$cg#m-pN8l^5-Q#(sC*SLxfg!McA>;ig@=o4 z5EZ=^s_rdNr5`Yl+I|8m$_29ns`RVY`*V_`IK!dR$622MRf|fe&w+a6qy{S9N~nB| zP~~oRdK*-I4nR%MLr`%~o9ChYuRz7S2^HryRNOmI{{2?Q^bt_{XsEd3tyjQg@7r|e zG7V9os-QwGHdjDpT?utdydEmVRv5a<_Ty0buQ>f0R8_9q{tznPW9$81i}q1aT~rRW zQs+XIUkg?48nfBl1ogboW~g{Oo!)95gvx&eCYQoWJSFkq+ttdOh;h@Al>FMjG*M0I zB1uiS2UYX~s3sJzir=5n2gb~jlCOqsu`i-BkA)hl@i`|+$!~`*&6r@PiBRuQPKT=e zOsJBoV2ms&xfH)x1W`S*%1*1HTDI2uMyTp-b$YAW233<2)=xtfb_uF^9Z-dKLgl{+ zldp%KdWfhZ`+OvB!zECSn+Wx)W-e6L8mO#mp+awl8pIv8A9VT&^E{OQb=x06HDy?1 zOdkamcM{ain|@E9S@-VADM&yTdem)sQgpm zAUGYW3s*z6ZxdAhJy7wEI{g$>ymqILSRL&nq0+}&FE`hj&9-l`zRx^jo;A-w#p$qq z*L)0Bui+n!^(uv`|15J6R6DAn+OZAFe;-sk+M(KU+38o!n`XZ?G2RfU@+Uy$n+%n2 zrqkz{E1bR>s+^5ZZ!vd5)$brw{^Qn9+TQ8(yHNT2{#5iE237tjsPUfY^yyBY3zN@; z{cFBWHDUbB%l=eo^WE0!Tgo2}VTJNX>#8 zq1jMNU=EB|8%aO!6nQK_7Z>I{@Z{^zaxbPd50xaREMqvOBv*6Jg-)rS28o$eRuaFV zMxu<%pq%TV8qf&e37eeW0%K-L{ta-6%CysLgUY?*u*HznOT*=!>Q`yKRQr@^(TE z+CHe}oP>&Z5h~v;^8wV=z5lwHJ_yQx1XOv`oL&XPBrt27zQ)`HwO?(vzSV3q_dw-8 z1XbP%r=K%#nzzlnQ0;sKRqsAO6YDp?9AplMvBxDPw?mJQv2ikdp3GCB8a30LXD)yW zz6h$YTA17kuQi$xweN0(-vhTo_1ku+M@!nEZpjY8AA#*qMVy8Dw!8~a{@0v-115hG zzP$3TlOEWmZ*$B#04Bc^X2TFfm(+lp(qG~(NP7|QIcCz&fsG*w16JG8-6Wp!!JE2uYcKz?_0Yuci#xR9|u$Af(^P)x}DPC>`t9z zpBIs$=S5(;QzPbfYUJFbBgna38M%99!l|;7y6?&qZ9mFTJ#vqG=FhIX@6;OEk9mYO zc(c&O*|`yylw1xYJ|9t&e3`il%DD-CE8GBe@UjVN2iXqew2_pY2|;!vYI^U7njR;h zGMzThLM@leFlLtYDN7EaCRA>Y|}%!i6u zZ7zeVWu4h*HbXr{vk9u!o1r$z-7rR!lpG38-H)iCN6h0;K~F!G@SD~!P;>Dk6zP&xLR2cRMzHBUj6bQunS*Pz;X9qO$6HjEKrxM>g- zAC`T^^QtRIK!nu|`qWZp7wL)HBeR9gmYh;=K0v2K!H#UiSt zv1Tb$tIDlcLPeV4^qG(dy>H1s*k55;K`@hLV)lb9H1%;&+|)?xcz&e;#g? zBAyK>>i>D>G!j7 zrjLNiG|_qmRN+&tS3&KH^-vpGBMj>t%C8lw&kmX=VWzL{hR^b=8`MHkn}w(vi-mod z>N*6GT{n+n465+S--MuN5#>B+V+>jXqm!iM%kef8QPrIUOdu>OxuvQF`Y~r75T*=3g;iKIgO~y=gdy1YTts& zd zqs-(^T#c?q9aQF3P$f0N=qxGO7M#~3D&j`-vUwZoI?@IG;w7UJ~T z6yuD8Ds-at+2(wx%u8X+EGcOVnd|Jd87lL3DCgZUI!p4G%$`70jjuyF-?m=-shB>* z9BGb*npb12mqSg7X-;o(`ZjYHRN+TpEF2ak9l3dz4uA@mNzP()R<>kkaPD%%AuX|{ zBcU=+Hm8}h%mwBOb2ZeivCiBNV^sfvV9h>vy4Q_87)YlKg4iK0g;T z^)vfJ_0b@6C{*SVFlLsN{6;9T!p4PA)vJN3LA|-v++psA3VzINclvqjSD^~K>-2t` zW4yso`_@RP{H0ExY*s*R5VN4_vDoSLP|I>9)G}TJHQ?)P-)Oc#<=Y2iBPD&FltWN8 zIto?t38)rcFt0+L3_gZ>Z>9Lt@we{=LhW;dq0)!Jcyd^RqzIFsB2I%Et=Uj@m}mO} zbCuZ)<-Y^UZ?Dr2na6Fv02S}D_1m`JH6K8=sPC3okCEnhsQ6Q@H^Ah*x@t5dsrR-) zz2w*h<+&He-jeiDQjXek9BRBSSic6<=DXG(Sbq#vm!Ur&?IX;I<_vSOSp((20jdVO zVe*Gz<2Y=WlS=x%@NVTrdkx=t!gId;|P>bm%)HLcc`~E^4&>>JuVz~7YP}6TT zOg^kBJOxQ_T~yg)4%E=EfQncTH3gciZ-q&fa_&H?g1c?m3*~tVYBHU6`dRaw?f1<` zP|LB;wpdbsb1+mLhgu&C6?eS#$x!iY%#}`Wf@$}Z8=02!6hoN43op$fL)BvxRC#4EE^0}?L`peSA5AtZ%-K*m7Mn|9%qb~}XKf9L%Dl>4V>X!^%ocMy zRM1`4&spyYl;YhneG`;!ZNRnXORWwZ}YS9ycFB)xY?cA_qeG zmspLt>Ho^F@*cK$!c^eFEhbp6Jho?1E&XHy* z3|9;&|3&5svmVO70jdUDVEi)Iqe$;2<*Yp}Kpi}l{c@ZHmGF7=9Z(VWn`dnAw0_qd zurr>Q4TAC?Y7RF?nPbfHW|>(I)q)D^Q?1XizSw#_RFAB4`evu^f;w;7WBmwZ6o&Hu zp5HjD)u>7%d@Y$^VgSjqqx*O;Uq z!(%Yi{26YKQRW1*%=U8V)rmBY98>I30X4I#tj{s$!_#*bF|Kg^9$swNFyjowod}U9c>QO;6sfhR*+yhm?y>C>3l`Ml|KIE@z z_Wt%o&r|=Io`%)TdaWis^Dnq@dFC^)7webT$GeUqT1o9aP-^dVQuaX&)Iq2LI%=LY zJD`TV6Uy%f)Lq7H>s>Goy+UiMit15OIYdPk!$zIaQ+sdePn{AUe!E8G4+-~;ACbZv z$bZ2&^l;|b(*UVsliv<69Pc3NuHz9@Pxag7C2kHjheGw}FgOs7gu0lHwtcKQ-YhdG zLB*d8^JAHu4~3JI8@_ZHqm$f|&fqi+QJ2C+P_v^NswS(TYP`YR0+W9V55sMfxGvmp z?naCuB_$sVhX4{)-d?Cs`*Kc_l1~RGiE=t<9?ChX+R4Lj(@m+wbfU##(3@3kGi0a*YP|kgRHF6}>8{ng$?zSgDZHZOZ zmqO*MgIZ6UZQlWtcdO3rNb}(t7>kwUpDw(JsB9fj#ax3re7g?ShAx*P zq4M3aUbH8c*9Yq5?og<5M?o!{$+pk5J|D{O0@OQ{9Z=^qT~Mzu?nC8&WDffEs1Gwo zK(%K)RDH{#>NU;wnNZ_7-})l!ORcZ4zRLPq>zk}^x84R7_n^}co5x}DmA7e;o^sM@ z^8(bOyJG#S*=gQ@s#+I}>p)WSOJR{ol<_Xq_!aGq?HmQwKjWb4Gaiz;_g4$|u@@Ir z2Cp7(kb3xfFMg+a74O~ii{LLTX?Ss2Pd9ADEBay8i$9G|PmGO{Mc;#y^-#^FM-R2( zeWZwrRccOz>Vrw|! zc*lfi`#fX(HiWbnDK_^;YQo2((zimNQ&(hrL@fv(Cxz;(Sx`MQ+xh~i*}m9%jqNMU zI@?#7Yv8-_UklZvO)&PoqzjsToS&1eIe8REayGCiO0-x55}n(m!H30<|NY zw#ON$i08~pP?4@#zX7#V-?DxOYNr|e8_{nlRQ{3H$6B9YmO|BVI#i9Tpmv1CP`6pt zQ2CddE6h5x!CVQIuhHBE756ZVEtFJCN{2meK<#Nap-R4G4%!!T^u8u{GWc)m8!6wi zUuX*-p6l_q*)$LHKd8qH&ARsRT?1-d^5{8jc#{#;V^g87aaB+~J>Ohx)|w4aJ-XKV z2D1ffM(nb_$K3DqLs0onJN+Eg47p(as(Hh_ZQe5^u>o*W;4;=zk?r?LA?c<@w zvka=-a;MKUXFGiX)C^nX^c7}UMYHMxa^ZMdJ>JY2pz7MgM~Opn zeQm+#j=NnFd$@6U#*1Tp?K>LkYw4lvh4JlAJYm!~93Js%9JlO=;oGt&hEjB52-C|d zV(tkeKm4?S`wb=C$al9 z&~PW82rt>&5j7LfLCwqyP&49+)A@;kp!b7X3&UZY(~|tvCF5)?g<6PHpn^?>dZTwX zRL}+HBC{IGuLkO*q8{pE-vnbJlCF?)1S)a|RHQplmweBL+MP8!p*Dp3P&pqu zeaz>g-&m-PsshG{l74}d*--7Rh056g6}i!R6I72i!x!Kd7$Zn(CS?aygf^(0`^%1vHln;Lf=F2anb%zV=xHHe;CxLkAuor4poB+ zbDGm0Mdi_%s|-Fn|9M}C{Or}b~u_Vll_54}*cjMwR>WzdklBDEU!}A`ci0Xw(s9@90 zIc5!1uzILRfYw0mUz=eJCMnq!x^xGkf*phkb_{BG+o9Ti9cqiZ4He`rl-~oWe0{!< z29=b2F4S-+qKspqoJ-9q<}9ch&WEbuQmEjoVXUDfe?+SpQ8n2D6|4;^^8u(KJO*PX zNl8mQZA8@G(+)Lc7oakCn4RY9W*5{x`WUJveUGF;CHd=Ih9D})D6_(xY0ibQCX)OC zxJE?v#eS%(#4)HKC(U--&zR?(e$~9`^!rfVFyxDAA(E0m2{UyvqDHO4oC)PT3#zci zPG4z#v$@sW4pqsWP;quc|Cr=V^r&e?v^yk_2pu~13LsZi(x zMAf+O@5CDRHwT-;%&|}{8gIQEs_;svLTADlTvGD4;cR*tqNd_1sAjK$>V|btlYgW2 z7IQaDTK=1|9B|ShsB%t1U6W7C<*Q*MyNalyuR}GV=vZ0>Ny!&N`vxGY$U#t57-4;k zSqfvlB{ktu3FTR3kJ;t|a|KjQ>R@OTj1kr#C0`2Lz*ZaEpz3xSsv4KgPV)g&^B$W+ zemDA+n&nXWXG1O0MX&_cK+T1EsQfFTD$@*A&SrC)xf?3Z9_xq9V@^L06{pMTkIg>E zW4wV-_7T>{Tb~S7k7-Vy1vO2UTCatneo*DFclsu$Z-J`!J{UVuQu5jGyK=`6HNaP) zg5H5@+(W2feSa?&J{U?L0d*8V9>!pjl79+wu^dqoYYJ2k&V~xMz^pdwV5qV6Rb~^^ zu(z07q2_Qa)cYg{U@TNp@|R&RK8&bBjzP8HI8;qfnP+UjWc?ac;hj#u31d)6$=5^B z$A}6t^h69g3aXGX)~8vYVa_ubnv0<-Qx8>GGmM2uO5)e6Z9!Duw?PHpZythb_Hn3z zI}H`&g6$pFU$=e-s*PwdrruAFq zJ(xU*zg2p&sOZ;lISlnO@iM;L#lwMpo%{W6{*Ae>rmC~ zvi`sod*yW{p{Et}@q}o1x;jLDl1k_2agmHE%k-%Y5kc z;xENJp?*;98w3?^r1jBIJyQW=w@OMbg-vS#qPlUJ*#H$}4OEbg*7umFoPN&wHK^eC ztq*LE`9?s0RpA&!g)B9vn{&-tsG=IJud%+t+~@QI<}s*;7tccV*CnT4g&NmRsCc)m z--Bx6z%R$Dj)bbuXzNp~&xOiY?ew)y-(>E9+KSt(?=ugZ$INq3aW2B-uRfwF__|F) zPRBdq5~#&j233{GFxegkWV(~8pzd$yTAy#$Ky~se_sf^=5;)()RV%H^3N7Qu1fvo_`CXE`!_c zvALQq~s66{?US{PTQ}ftzrHjLzI6z46E9_V%{|GnSK8#`VBHiLWL}a+L|hzJ`ZZ9 z)H7K35oJLc8?2WQRpM2se(HiM`Jr6y$HgP@Q(+-4`jc4S z4KUdfzjz+8g$xIkv@wJ~iKtj-ph~^~HAWqB;bD6=SV{2w7F0noa zYOYU)3N{mlId8q%Tm@C}El_iC8+;z_hOy9n_BaAnopz{5=gkYYcbI+uG?v^CCbg>e zV5E1#5m0q0F&98Ztc9w>TBtT`fMK3Pm2|=O8@4~PUVO>x87lu|sQ6Q@S3$*J2o-0A z)0^O4^bOXJ!{l5TgR_Woy$IvhAnD7b+=S|&J5Yt)gDUKS_0j)5R(c|oeL5sU?>Czt zO?0#Q{(omTo8jHHSKrj#X6|kJ+zsPf^!D8wyjR!lUb6drq6XzIgEJdym={6~;!^7? zpk~ZE>ziPl29iFAWe3#UJPS3<9Z-?_T#oB;FjV?TsMmUx@% z75Hy(U204|>ao!n4UA)CsmYXOP|hOhdwQBB z@FmhGK~-WF)C-6O)~jJGOwylVsj+1#{BiVU(WCbXUfD+zeAU0R3I0;!$`_Wsw4~;x zhBtHd`B%Q?Jj+Q&_e+vSEBWPco45io?2%AI-(Y<;)SdG>s429;_7-!$c^E4HF(|(i zFisUo?<1uhYFEBu-hi5?x1mbBWBsu?up>qs4RzHkvpxkX-&Cl4Ro3UiSR&*DWuaLT zRj8{AW302Lt);B>#It+@}Ig1T+r3X?gyIo@N-ar2^i*}Q7r zFmIc8%?BpG?iOk=*c@t(GRK&ua5CjigzAIoP<=KBs%F*J>&(?oUu%6mqz`)ET_!P5 z#YJBYUcDcpKKZfW^vT`szpImbM)sLLF1s<#kJ6VY^_f%N>of`4v7Y ziaC3{h}!M9a&pm@tX$c^@gw$JQYfH@XZ2}*(RsR4OecNeB#%=`9r_1&Zi4dIW$rN# zn8%O5vGM2j(%3cQ*e>GIxW~h2>Hd}4qZ5}nxnCHz-vkR(+imn%_ z2YO#x+r!P^{O9D=`_g*T?|JEG2fOd!Z|w&cavN{hi~sfB^vXZco4M7avEc(8OKNJo zA9Sx?5ARel8bvoXF8pcS#W+JHB!3r97bR*kJdJ7Q)Gr^Trk9*~kFOSZB!3?czf_za zD(R`%!s0YX<)<%67E8?3&xKu&FG>1C&H7#oaJ^ zNLoQkn=MDoOHi@y!RRSzBPoxeR{ns$iXKCuVwPAR2i2YlPA_-*EbDWj9_?KW6{iNu zzuxvn+t)+wd|P0wfuysf?13ur094LH){mR*P(66Y`USJ!jhJr$lzjw@ktMAnWsEJQ z<`k%srbE?vHdL=Hg5>Od*TOu2fB(eab4Abn^ymR4K_{uGzF1!}6z$UW*N=bl*Iyg< zWo&n;KA=x``w(=#k0WOv^|qp-+vH3A2Xd;i)p}w1O{DL}-fp|}rElkk+wr8gQkh{; z@uVL`AD+=KqO0Ml{dM%g8T}#psEm$SRGHC7d{a?TSw^3Qo{fj8TmBmC*?8;Gv-Okz zK>nrmk)ExO^b-E1_Fd%9>L&{HYv`jh{)pZDd(ulY{>A;fmp=r(C1c->zAU3FUe+#s z4*$~n_W$Pmd}$)R0)1r0z7TyvM&F1&CZiujFVE6|vN-$9>by>Pu8Oz6uIMMVr*h$p=iJzWpd^|#LJNBT_c4XjC(pV|i@ zr~2{di;6C0>@DA!pTC9Wms0PY*wgte{Q!D8-qNq4r~M4N)Px{{c`j9>weWCM9-;d4`3FS*agI;gF zFkb1~nY(m;ZvLasL?>GufArbt>G%}pugAU~W4d0Yx1y)@k^Trht&j9!-^cpxr9LOI zZ^WLCpY%iMX?*GD&>6x|Kk52Q>!0dVNK^kye}sRbeMrVWki~l>qqn2)v0m8T#Vm{! z->+|Vi}9tODbU9-c$FFZQuNUo9WmD*%CEn4ex!Ojf240DKU+d*kMzUnX?qImSH!jT zH1=Wkmwv54zmLwg5aP-HFcVL@{)Y2U{Z|-&G4=uP%HK~&ABCRI7wKcs)AFTP7WgZE z)?fM<{;53q>u(_cdMdxu_B6lrd71L1FGNqTSJF?QtD6;1`f2oZen>AyN&8d!5Ok(M z&c6yh?GM@Ym)0-UN064rUy6TOM&FJ;Hlv?JADYoGqhHAAdww8)|DgDH(6jZ!wP-?KRg&-v@~OvuD^6Yk=}^ClQcr7yKyyGWNq&`FMr(yMzCE>|@;?>G#po z^(np2kLAmkUWVQ`Yv%$omhQ*FD}Wbf##CSJ=J_G-M0*@wQ7pfzE%yU;2>u74lpF_V+47Fdn{uDOV4=l*9f7#EYv!&$h1AdbG^Nfy| zo6qvUhMg&s^B=P?zg}gZhEB+weHVJV9@F}y>$$LfC0a=Q4d>o2{3kUk!JDQRlI^o8g{GkOF12WOYZ)0am$oWrNoS*-)SEHx>A$>1;Nm1S(F?WA1`}mU@ z-$e(ZeChg2+bg}#lJ5SpkK~`)C;M>h>3ophgg!fCN6gJ1*)L#E_h;!H=!2fi$GcUX ze|;zWoEN*7zpOxCo6!r~Tk;<`yTX3n^^vZ>biGNhuF21j)Sj+?>07YZkteJl<$o!^ zKgd28JzZag<+sY8Keoq^zbCzp{Aqv4-iV(17sk7TeKqz9$CG{(eNsm6Lhoz6Fn_5Q zGJm7_7sk(ex?WOyRmOggcyluPbOt+ZulyIIr|}BQYsKD-J*|)QjTybr|AOn2&Ohm! z@lV?;{XDwru7A=y3hcu^nD0;7N1>HE;L{$$OKuk2T_Ph|kpc>2*~J{y(OM>gl%o7ShE z81gS{&p{T7eu*}%zjXcX>t@J`?{1 zq=oj_UZ`jN3-h;;Ki6O6zm9&bAl|Nwe)4BC{e^$Y#(aGbsy^t8GyaJA`!($QuNY_v3u>^AM)lcDN{g-a)?yn!P8{+w<{QAq5r=N|xPg>f4`h~aj zdL@7Tc-zQ~UBAcHl8L9EE_JOyn|E=;oi*yg@Ybifz{(+lUe_{63>pPG1GY87`7HR%*5QLTL zL;54ovjWXO_whiWr~U16y-4{*prbthAjhgCUtj*>nTTDaPrXC>Mx@){i7=0*-xcWNbu^N)bpCX|_h;81Y5ws3r$HZo z5&y?PpFdQNC(J+R?^G%m-~hLWKZpHvlCQ7d&|gIY{@sI%@=iY-=sCwq|JUa~h5SuO zUy$TUZx8aM`Qye#yo2UX0Y9JQ>-90P`762Krg$UGA80+A}>Y2_*tUs z>-!z_@i*nxrF7E##kd`T1}w%`rt|mTa8rAc=C8iZ3N&CbA2OZ)HsWIYlIG8`^#+HN%M>K)1(LONgIcY8_mUHi9^JZb*hh>QJ)G+$mv6$_fLlJjFDrq|c! zgOq=Ik|+K8r{#Q4`T}SlZ%Ka%+Q*xEeY5^L=8n%wf0E`qpqo?qq#ybmH74YQT~haJjCVi4e5M;YjL0fi}``_eCO)Ekj^)(S_94ZsJ#6s&$pU( zg>=4)v=sDct*_cUI6PAA?;fZ;+t{{Zbwl-;#rj7prGIc>(=7crIxyU~X`s7nR^Px# zg>NhNb&QU54_DSUuUXsDvbwdcv7!2GW5dcN)wbWZG*((#SFiu=%I0UP&8yq0g+!%$ zTlc_7)&6&DHg%6wM{E6f`FLRDSMy=l@Mvde_wX=&@3eiBs)HX!9eW8feWIvw$+BgQ zEp1Dd;%NrV9vU1Nj<(Xoj{d>UEl*SjMz>a48~ujc-` z(t#F4L1^xQ;lWy=V2At6CbLna~F#FAa60 zQ9Fh^Ykjh;u85ZAXDTp|0jQQN{J&&v!^+jw)+NtX*yhi!Zdkc|C92y#Is!Y}YYgf^ zMhe2PbFh8LA~16PxXl7&D_g(6iX!Y)%?pm$8tEwRAeX-g%&^H3R`_2Cr zUHnTa=EFjHPk;NSVJI#bsqIh_+io~TWa{!QYuobRtgc?Va(#8_%H}1lzpb=2u5YWZ zXhW>VI;oA zDMD(^>b0%Q8rLYmo>|h?_}r4;dRIw7yR5Yl{05c3wR@y@u&b(YQcaevS(jC$wPCqB zqQzs|%H_)|Hnvrku`M|;VdVHtr5MXPd)sT3mCbF9t<6iCs%sis*EP0Q8(Ujfw^sUk zs$1JfI(rosW%gDK6$9O9rJ=$8e)DHb(~_0VX=Ljh934Q%(r7$1SR2XAYg*a-o9gn_ ztP?R?!?Bw_^k~u3wqaOWIaHs|JojtCzJkVv1=)pgik+TwW?0Z5bT2Y{io1 zXHeCW+YBzM($lwT6h8G4(MLbdMvK&+YuoxT?svBL_jj~+ZUIZ)vM;Pap+T3fY-ng~ zuC%mOf4j1=siC^OX~{DtMOSggOFmU2&bJXD)`7DJ8*Qk4!~%|?xN=!zb#3#KbxT$@ zX`WvXo}pKV-?jvpn`Y*CC7DU6_SE!GCDD>uLw#gtN%t8PVWIOMzfUsvbN zx9WsJEz9dJsSS5mQy5j&EooZWP@P|$_bW>c#vz()KDXAe5XL~I4(QUgzV?2uQ_v1o zo6zc0+H1A;mpsix)LYd)p}5!xuA^|}V25VdO6MpBXB4%yughdYUAMN6RnaplBm85V zReTr4fvh_-zOfBWo^0sq?jLEdXl~(Rtlk`NXiMNMQ24A~lq;Yzz^V%hXQFqZr*6f< zuFoByz)r4Q+q$y4f~y)SR1t8(KsSChesBQa3l8xUkIa7N;3{t7(XfgTm^aQXMF`lU zW&F58gMVEaXy4jBVY}4jm#x9;s(kVBP5aQ$Fb5e*J@&+}0>s*=<0URd>lJ8PuP~#U z3+-0L-(9WJ6DEuKc(4Y#3vFq`1LJi;r3LJH#8QPm>e@dVyJ1uFl&q8 zux_F&=2aB2l{BZZtS6!&-g8us5WhYZ;j2!pd9?D$%2eAeXAg z=3_I_h^jTL)N*?{#zX8i7F3^@4+GL{omRqh>G+`vCJYP?pu2EBPkz}lQc1-=3k%j@ zIP^wM%bWV{ge?RXQ2mdRDyn~QQ+0lr?dj?HnWI)N$40BUv5KX|vK8Z$P2d2w(6)Aru^m{r7EP0;7h7vg z%$|?+!?UYfe_LIGwL{tg*@|hTd+QLp4Ht*f$TEuIG>we|eH}%KAxao=+`aM()N0?* zLXJ;9(=z;gN4BlKe-wMLfv!pm7IK{T8(UXmqS;_uF*Bs7PAb!CRoY}rqoVe)r4qiMPj$-d|_xts7;m!o3!H(HJzhwRB`^%U#7_ zP|Rgk|FYt#dF!XVG>jE)OJYTvyjbhQZZVCSp_aBiuINv3SGANbnmwr)Kl6s{G0N)M zsS~H6A}zTnMZEAHhbAi)QU6*##Gr zp4G;=h^Tru6f=HouA+HcICRH#8FfEVY2oQfF+TX@<+EAr9HG5zCa!NuZ>W(P?5qse zIyH(>r8bv5kr){)&Lz@ukd)NAJG=XEAY?UFi}ej`Dh^6~QH;&$NUePU+f;r_UVbrq z=Sll9j1zqW-I%*+2IRP066O@$i`9t=t7?k2Zjts%FLw9$SGNodzBqs>BpgD>w>7dbSt0u}6j5N>3*=*ys+A#9`kK$>N>>)raG;XwX6fO*7Kj z(?9qkHi|F$;ft)}=Ddgv?v^lra7$b1Zy(0gguQ6A3R<@gj$rn-)fyU!XC2kFP_2yc zpb3k)?xFsdY)`DrYKL|$^k7J6v2?cL`T8yNl z0#*XXqB_t~Rgx;EK)|u4TC8IWQY}_}uU@oBu(8_llBOSkJ1a2kZs0ligp8oE3Opm3Wn8UZ(emGY2YnVIQ z-ftSP8^l4%#0rM1to6_8#6bgpL@$!6e9nG8-jL!Z(p3_WJ zOb841^E%^f-YL%vb>?MqX?vP`9gP$+WM9vK{Ik!KWq z8$+1G)WpNcf;&9a-HC}l&35&T+tD|=728SP(3D>I1ZA?n^A9gp3&S9+8Wy>V6dx3D zYBcy_ch`6U*KaN;R2Le3xQ`EKwzd!87@}76Y*nzxYR?l21xn~NLOqjZ2#!%{>wU*|AlVyJzKTu9r4RU2 z&XmaS-J^XA7ZmeLid1(*3g8MBTgm$#>SIlIxuZ?+Fx4y8QJYI zTABYR!<+>o7)$BG(mySW@;?txVKptR+WJye?Tg4C9KuOJ@8F9V3SKH}iYtoe{G!9xQLI)Q0Edxh{UOY;Y6<{iv;UjcH>2+yd0_tc5$x?v5-2f9Z_*Ox`vw z+AARZ`*3!VlykdYI6wMO>F{C7Uqdf1{r0PciI3-Uec0=81<%q7t$3b00E_X&2;&S! z7+{}qtMlsUCrZ8Ze_iS6*~)_Y20JP*^4zHlgNhy96{L@;r9iE_V{kAmy}TlGANNeC zi9_486x8s@;E+8Al2iF4k)707{)Cduj{d%ZEiQ?!j&?#o;p7H^Qo0aZtH&9GWTQ~2 z!$LcO0p7P&Y(QkBjnu|$_md80mabi1UDDRpT5W5?gK>?U+8p6IOJ9Fwh|@#s5)uqa>e(gB z^w=+y(9nSAd}|t;8yZ{drB|$OSyS4!`ZsAZ(X`qABI0nk4-d5P*mhu3O2X)YQCd@u z=8)Pbp57&TxDRh!)E9xXq@Xp;LfS2wkIGgU8hyNdTkUZ<@Nuc^=-y?yJo^-Lc^i0Zn{k*>Z$;~xH7hIaJUZu0Z+p0+p+@=08P(Jix^X#E z%eCO)VXGChrm3+JPgu*sgR>b1E$}sM;6#rlF&;y7)ex_>F|})b0X%GLZCwBC%C<^> ze{HNjxq0ogp4`#ig@dJ;Bx^(TD z-{O%Xo;=r!(x*sxwxvFSLAIvx&ze^!e=svzVoCEFJGO3VYC;gUtz3sUR@7?fHA4s- zY#=%?R2q-Nw*p2@x9nLwN?eTx)&u94CKPZcp#*J8>4sh6VK4OKp4tdrt%ljg=I z_uG=TDte4ROS5S1?;jcSCRnzlO5fINX)JoX6}M(B-tSqnCJh|ydgb`yKEV4q26=d5 z-LlTMMx)aUNjfhsh8IsOnmkoRZx*dtqd-~P8rrHlGB$*jJPs<%i`I1B0>KijNNQM& z=}BA1=V&UURF>dfRL1-EJp6_!kDq5AlqxMwx3T!Y79dO)2Np(v{i zjyClUO~0N&AVkd2zG1{Znh%vO2A<@P_0?son-B|pQ^lH@hO>DwifJNHdGswG0wx)*E4&#j*Ng47t!z*% zYm9+?RewJ>|C*Ll1aawU1>^Z3mlo)c3NqBomLgJN>lHi|?Cix!bVU=<5azrQEI4>( zSl1a+pTdBViiUNes@1K0jEs20T#8*Y%1oz)dSr#pY$p|3;kt~iX;2m)nL#3DEw%-} z{?l?v`Rhdi{|&8*w9e!52rp_C#j*1!)s(9|(NV~_e_)vb%^e+BWUvHNCf&Xk!}fo8 zO9e;6n6fZ?6h<$c7jRe;FPtCvzY2JPI-|DOor6O!1!^l62a`UPRR6a#-y#JF!4^ zqpL<6l}p0UD&L(S!BiIC+O$+c-KuKX#F4hykU!(*qBm!NZC zq=v%|v%u;xgqK{nr^oXVja`ZC8rCBdbF7u`r>M5;uWadlsR}z4>wFoC4?eJQ>dNfv zQH?MXbky(`Z6~K^Ivf2xnbeP?s$@`dLi^|#pS!>jnWHcR@R1)}gO@%f5l(q{B#;z# z5AZp*)rl`}a6CpHRWIEYM6%l|#uX9WtZ7(78s_}AB~3gB!9%C^{$Y4%%+AO$oKco% zADvrZ5fAr^^Ac{7JKFL7ap%xT%?`XV9H(<@Jm0|r6)&0AKMx3+EX~e?b#~ST`&EvP zd2kGl6Gt(M-{}tOcwEi*(lDUb8Owv0w3tZd`_H+C>{jgf-ohB>sTD%E$R*=SlGfQt z)Of3nU*wd-##Nc7<4BcH3{xvKG%m;7f;ZD_r=4m&-2MB3!O8@#q=KRh8G(UnaH~Zd z-mHa%YPR2FU`3s+DZH$5Mk-Xu-@g9J8o@KmbFRVmt#b32^Efr8%5Wi!{>(*VRfn|b zjg=O>{Mx8h8@9dARcfk!JV#`AP3Ngwa7I(L2@8Qb)QcdKU(LBMVgSUUd74B+GG6b; zl!8|l?R$Kw3)UVYI%k6qin;{enxR<3${;mQ5VkAvD4GR6_nYN z@6;5vI~9*}dH5sMXl?Uv5NlX@rC_rszm*AEjqT*BtJo53>8@-VLGQzt1Wxn$aHM!t)is#DQvfhg z49{9VU|q%PB{dAd(SZRpRKc>&=>kZ_8iDI1+eJB_!?2me)l|}^y*K|W?C7x?xq#l= zu??}a>_{5w3N3tw*O|=E8xubU&sXF5UIv=dH7Jl&j;;C2?^UcSB`y2Lt1JYdw6VDn zpDN+&C4IesH_O+os6N-a5+_r6N;*ntt7BURj_zeI!|On!cy*ZLI$w*aKlNp$eBv5s z0AIc21f3VYvh~mGk+V;pb?H3t%yZz}V$JH-H5fMdCNqXrEn0PyL-(Omx(OH$+}t`H zwB@&r{Dh${VOh)CI!;r|vq2#$jX`N!y$sYn)7pp^`Rh&PD~5GUJJ=|7+C$31W(ARk z_!4m;SHX}uA4?g`U3~+*)oma6B#UhLT|x@IIvKW)Msf({vBTW-9ujz~a-hHnhKFe) z(?(Nxhz|=WGlc!Vq0V0C_2F|m%!ha_MMI6`(%2@fI$@)-txVR=O^G_L62g)j-|%sL z$923z-_a<6a-LxO`ji3Vp7s@qM4F~(X6ow0E#nLG zUXJ1%rcYwzKF_VMWE3jS(Q%Y7T<)OUmNih_HENB5z(pe&+w)@Du%3_>K`g~y7E){` zXdX_4SF}juvvN*M1;bj$#rxawL^VEz-Z|-nYUNcP!~~tchi1y)3)0iIlRc zv#mtAiNPM(hJ=#E?IjmtC1;{Roo5<_1k@K8=L178@$FCTFj)pZyWxkvB`4Po&uQ8y z(-D~1GTW9TGeoP&loZ5KiCiTO4(TM*TOXxWtR~lLCC3cc>zXAK$9MHoTan5G7H+9o zKUQD@ZF;AUFP@f?G9+d-%jzA5OnI3+Yw*K@)N1e%Uz-Zb3#SF1e9NPf(gvGYN*aaX zyk)dAs$zLD3k>8EDXy zVMUtvw1UBp#QB^8F2d$GD}~G0|EY;BFb9NrMYi%P7PUZNewYTql5p$eX; zZXLs#uBXyBg!<|KCwzXi?0kuY`SEHu&dNCcYqiOG@pFBhEmwyJu(-f_CG}RGHzTa{ zYXHiePi^chrI$HqOCDVTg>?3Aft553jikd(md?gYDR=N9-O@Lf@+kt)<*RJ83aY>t zPzn$7Z84OjU{KMNWGN!(&=mjeh$FTD{nXztKXLT*k15JJ*gGXXd>e~r{u6ix8Z8#6 zkG5j%1z~H*K7C6kzv4*Z`MdLY>_GeBTWm`E zlYjJQ?J%Xkn7+#F8``$8Y7Q!T$wCGxd~PoWZpF)M_6BwjUJj$*u<=V{q`j_*69)VN zM2dGy2mTaZb)bW%()2W`8cN{%gErK_TYNbPs*vnuT0S$0lNsi44P{bq z?h0Rzm^4aeG)V*;eu%+VV-<1w-PPWOLvObZ(T)$vN?-K#;NTfYl4u@0rNjBVEpc63 zu2N<-g7(AaX0+m9C-xU@%UbZwDb9cRLQ-|>$Y`np7xVm5vnW{urk}l328J!z#`i_l z3EfbBG-u(jr>90kAIA?~6mCL4T$uLswAdO{1*I3feDv_2M=^)_;+kKnV9-R(E5ke{ z(jLp2MZF&?&E<0M+J;oqzG1n=UT2ME8di;|nl7vJeBlj5WTmcJMVbQ0YJo{aV}ZAa zA_zlkYOErQ`c?5tvki(irdMh>^kmIkMGD}840Nij%!a2FMD{9d-!R@9#Clh+XBDB# zqh8c7y@+Z~!JL^L>E0ocQ)>_2(!?*;us0Ug>0^Mt^dl)S4QGT1*u>C=RNcp|S7saU z>ID&>c;9ar58?U2s03+SQ4$P8_-5u!pjt)hX}%Y!e0Zdd*Q!dh%?{d|DI8xQC;8lj zvemqVSd(fEvrjf|@r+ExVIV}WPaPwhPRcJrqA(Y#W11x13gG$!s~etSbfD?fNf;hwP%&8&=v$eP# ztKu_B=cHLnD@2;0b}mvmwIT{ri_$`w=$TUyWmHg}PGS3&N;E4mqm1!2gDYX4P7HZv zf5WC!(t`tf57q@ugIVglwA64?Ez7BjruJiv$vj+cxd00b-Nxb^uWT0r#T&n#Bh?X# zCfJ8TNPmqNyLBBip;(kqD3irno4YoaU)MiU0kDdRI?~_~hDJ6jsBDvJ*I<)D&A!Cs zSdj928&%s88u~(@9E#Fxo4d|h9>v1wIyaiUCE28uqA;tANzpNMyX@t3#y4f$SUDj0 zn}VDA2RqO<6dCBk>a9Jk(I)QD5J6W)L<|r1_jO{~he-puun*!#AA=PfC3f-$Y+M}^ zu#RO8Z02jVKECp^$v;o*M6W^L8E7w*q>Y9q!pv`GTcH;-Ayi^zu5TSGNs&zOqVaL9 zE$twvF~|ZzieQa)2GSQ-724ZULu7JXz~aCIHzwKHQhkObJh2Ny_B1L6j&`y}Yar3P z_4VqxMxI!=zAR5#?JM(8PcD;^YAz;lgoPL2`IAf3kMA3-Th>Y4p&&>-X1Y)sR@Lem zBiP-etwBmH&lI`8vXAQZnj4?{sJM`(DTdD(^+1ERu(ilw;E?XcuR8TlYzU*#MWA^I z<3$zU_3-~xAC0jTVa0rRQ7lT0?>kROq}>2#BfaR&ob;AT336IbiK&HLN=d?at;&nn z$to+tkj@NDS-AHrS|PXvP1QBP0|wP(xSK!h*TWBMhhB2s!~PYxttHKL8l2Q%?W!*i zo%AFsO&yI+QT6b4YvFIo;~-*d`%vlhJADtt&m11(rzmI$ee$5sQsnfK#5fZYb&`Pf zBEF%pZvt!#Ei8xbqW z&DVl^weo2Vfp@;-dl4Es>3D6<(@R)r*LoIS`@$L{y+@_&J$>DH8Vos%#N18!ml+r& zaB!m6wD4M%iE`tgblZ@I2lFYnbQV^O@BV!MDA^2w5Pfu4#G0YaIp9U^gJ+YmOj{LMQhH0d*rd^94RP>J z3MU(svCL!|9}Wz3Ay!`UXQ0W)MWo?5=_WftFvC^LR2b^O*XHnaxVlNJ8N?;lBofi! z8>+2UFv=Th@2getwJZFUw3K@;JE^g5f{%mo`RxFn8}e03xz;*M(#e+PE0=V5-vBx_ zI-Jy&-A=FM1QXb$*iTIv4S`GW0Uc>N!_d}RFS<6DJ(x`FaNo{Y`Cd!Wr7>1y9SCQT zd;us`$xES@;5NOS$u#h`_2E;S!ko0lOUBx{W6F5PKKB?jq2JMZmZPfJZ@1`pO{Ur_ z5*Q*}%6p08N?h6PgW13cqZ=!QXf{{M9?;67gZh6)I{0=re=^jn zYprWKnI9JPZROd651(io8)^smxg~}OTef>JsgB8W$^T_YX&Vm@vF(#gy(@|H@i*sHZ=By{lPKF{*7CbUJh4$gYb_8<8LvB;nR9=-TB0^6Pva+K#OH-GW1P(p$O3STT|=Cm%ig7}O`du$9yzH7O2%xkrW zsJ8_~T3PVtg1N5KBD&nyC9Oq)n2Io@V##lxr_*()6MKF#2nRml=YRGn#3lhzF~X|!C%lOPy3mgGkjy8xOc9t7Ki!-KaJzn!7b{YG`jc&0vf>m zA|6z86w{NBl2=!l+f+z0TJ@65oz2jYNT=%npWSlk37@$*R#;Ev%!iQ}69E>1EMLD9 zn&uO|;FlI0fnOP#?~0fsJ;Y5vQH5WK!#mJyj^2*m!EA+|wpMH>1SLbL7%i~V=GbC7 zEUPl1KN#)dh|jJn^=q6zz`Do)1g6FOENkX0}oF4@jFkYQ#srY z=VYMxvI}0rEf0y^m*xWhuq)(%y5yAY(^wad)n_sMsfapF8twQ(gy*pWIL$i;NoXa#bm%P22x1O}W*6~f{K=K6 zl^5QeR4vP)+$G7GUBs5}ce0asit>SeKF?=zx!u(Fj`ZdBd<5Rz(zD^sNq=7I`2_qG zuzzx8_axq5P+bPzoHY36B;qS6jrUJN8u2vfV?J*S()Xy0yp71ePki%5lsA6fCZ&8{ zxBH=^HRvav`47>jd7UV?N^({n@hr)$e{<4r%eqspNpgAlWjW)^e^~OlZ`XmhQGBa+ z5Ac~F_b%}HkbVjHKG~D&sewO&Yf|NRJ8|1(@E~r}Aq}oO?jexPQeXuVPs1OWnOZ@F zAWmHF9`L4%Z*s(kMEAcrX=^Sw8~jN)n!;_L!MAWbY%nUM;M9tF%%z?7EKYkqsyVNG zW(aZ5FZ1Z3%zKitRwGU_h&B61nG2G!@`))kwUS5H58&S?zO^9n!=kNx;?|Jv`l)Mw zkRv{bKU_4m()#A4HKoHScT{p#F7dsRvz`<6nVi{6yj^m61N4Bu1J|@PikQ`V!C{V^ zOU_Q{n3hJ8Jcdpp)hsc~?t|njDlw1ccfq?LzIlZBn&`X+S-mBtUJM1Xr@^)d~1CslT+W!}o|LOW3 zgbjx$u!H<#;#+>=bE5P5l6OJ;+%EDji*NafKNFqjC+`dK^Zew0CBEe+o{YaKRo`CM z!M`mz^DnW<<^C?)KQE``|FoYi@*#J7499}u0F z!~Ao^xAA5!@LPfQ@+tR#_%?n~-=l#hJ}f%->%-vf65rZqZy}er7xP|{oYn6(@RUDc z`{(tg+$~&_DjgJ=3=u%LlBq{<`ReXC@Lkf9kGfaDXZEQTvw~{wmRxR?>#et<(c|~Y z>v7J0kH&-If3w)pva z^b~mSP9RVIS@Eqr;>)6~JmRlHy4ULxcwdTtr|8P<@_hAUNPSe)r-X~OcLOCq*Z(of{7mKMaY6o%;^+EHes2HQl>LVpH@W`1z*{K3 z=_meHblaPg)|P8f%8iL{Bg{CN@3!s82nQNY3JG0kGL)H1P$c+kTmPzX)`!$3x&xs=PoKEjGwo zlVC4z#{^q>yDazu)!i_zYhoTs_^AgauLj!X8VWgUF{-*Ixx59R0&kc2w$a@WZ2FC6 zzRyCs>u&~cxA^9XeZZE_Xy*GUq4Lc)(*t9 z!DnpZqamI6cu4np-4EUw@$-|KSHLrU=3m-%SaSIY@F;j@hqV{;OjHi*aA|`43Hi}KC>QZBC# zZF*4p^ZG0RZ$;n}kBGMV>;Qf%&|V+rYZBl5K)gq^#VfJpv-Fs6NOD$>Qh#2rQoq%o z`u8cH&FsXc-_oQ0Cy_R(vT;3bR1dfdw>J#BATwXXLPoQNrl^KSKMlMp&`rSfkn8IJrdOP%N45ug2k<+A{s#E_Kp*(WvHiy7`8T6B zHARG#e;RnAUhog@%_*oUy^;Iv4}0@$@FrX1|Mw;zwvE7(jHQ22Z`Q}^|2JcE8hQwO z-XGhWe<)V}-`Ug8!jl|#{<6LK#~w%j7~|$G_+bOa+uRp%wx}Q9>U-oLilIMtt?Orx zI9sgxnX|ooK~D-U6*T z^NkJp=f$@b3-JZfwl*dHB%~AX|0`Va{o?foJ?g5@1==s2_0^JI{InXuWU4h;Ud@|5yfUgDm6W|+x zz6pFEb}YW~n*scEpqB&J0=*shXrNC5FPc&2UkrRD(AR)(1o|fM{qmdnV>6`qu0&-4B%64b8^?IP`p}SO5OQ(lg0!@u z@-K>?A3v0Ot=CfTx016q@ciF_cT;>TpZMXK^jj)*WHkNbF%dY(l>GC>kM&ZtHrYQv}xd24J>MmOHKnWmd<+IQ|`IE)4BkA~)pyN-1jz0-H_&8SoT!;6u-Lr5!j|gy@ zd5#4-Wvi6=tk1oHd@o2Y9j5}H2(;(B54`)uw{de8@Pa_QoZr1|o%Xx0CY<(r{ex_F zyJ-)VG2(LMPZ8hjAl~!OsFm=-q5UiKTJ%y+lEG_n^)eQvlv!YU?&f_FE?JT0!ZjFm&q*f?2oZi#D_ zn=Cnx{?oK6_Cs=3;qqD%ACOecOU{SlM$5_hO58NE=!I@_ran?%cXA#OH zpPUW2+$Q1yNyWV6>=4&Vx4h&W#pOMf_!~*Z`jB&5QpP2|M==Eal{8h`eERsfo4xVC)(tR-w)|Gfp3L$;=5HZt0(LAr6R&;;_pP8K1GY_Y3Wme z86R#xV`FwmC!QP9iI;|SM#<|T-Q$6Nx*)$;R8NDQGi0~X1Hijwx6!n_M|zAd{cp7E zeE>RV;KF=6Wj5~fREE`scwNPz!V-fdAF0bDl@SYUk>?bz;=6~W1A>H-&gZFme6Zg!fU-G!4+(BH^(nlax zOL96OJ@MHF^X$dtWAV)mqpJP?>DS&b(BxepK zu1GGQ5=%J?1Ipb}zB~-x0q;BUb9+vLcUpY2oA`UtdH0-(vL9CYCP#c=0(&U;sQ6|# z@gdQ9{YtqMzL423x!mr#;O!Paw|h2t^TaoMh~E&M+wJY_p;FTJ>V(sNuiq5Zw@WE! zc9(SCE+yZl#FEbISMu}vm3*sTN$2%Dj5?nUejvVU4&y1ehjQm6XYE2fMRK`47s3Bg za=AU{!Mh~B*+YCwbZ*bx(D{h;njG;$(e~CX@j9nrBJr4L8}5jYhIFqt^_m{DpZJL6 za{DPaM|^7^;`yQxe|Y#ze8TDQ^&j)i6W`j4*viA_k@ymn__)$RBXpu&GsQQ5QU9Sp zyWCRnn#DK25Wgkb{71Y$qZa~NP(qlFfKZ>G!3AGS- zk!VXNrY=w44*Xi6T`$eOBEID#zWq4!*%)yDJS?wqIUVy|RXℜ>nV;vAWEckKHWK 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 @X}kmiLhKbu6MhmfB-k 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 z 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 Date: Wed, 31 Jul 2013 15:20:24 +0200 Subject: [PATCH 076/345] bugfix compile error --- examples/osd/rpl-border-router/Makefile | 2 +- examples/osd/rpl-border-router/slip-bridge.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/osd/rpl-border-router/Makefile b/examples/osd/rpl-border-router/Makefile index 43230a17f..04007ff5b 100644 --- a/examples/osd/rpl-border-router/Makefile +++ b/examples/osd/rpl-border-router/Makefile @@ -5,7 +5,7 @@ CONTIKI=../../.. WITH_UIP6=1 UIP_CONF_IPV6=1 -CFLAGS+= -DUIP_CONF_IPV6_RPL +CFLAGS+= -DUIP_CONF_IPV6_RPL -DUIP_CONF_IPV6 #linker optimizations SMALL=1 diff --git a/examples/osd/rpl-border-router/slip-bridge.c b/examples/osd/rpl-border-router/slip-bridge.c index c7d718501..ebf4f3c36 100644 --- a/examples/osd/rpl-border-router/slip-bridge.c +++ b/examples/osd/rpl-border-router/slip-bridge.c @@ -118,6 +118,7 @@ output(void) } /*---------------------------------------------------------------------------*/ +#if !SLIP_BRIDGE_CONF_NO_PUTCHAR #undef putchar int putchar(int c) @@ -145,6 +146,7 @@ putchar(int c) } return c; } +#endif /*---------------------------------------------------------------------------*/ const struct uip_fallback_interface rpl_interface = { init, output From 9c1b87bbb9a886e6a84fca61c623115d297f1546 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 2 Aug 2013 14:04:39 +0200 Subject: [PATCH 077/345] add coap 13 --- examples/osd/climate/Makefile | 62 ++++++++++++++---------- examples/osd/climate/er-example-server.c | 12 +++-- 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/examples/osd/climate/Makefile b/examples/osd/climate/Makefile index dbd2c1410..e12d01b5c 100644 --- a/examples/osd/climate/Makefile +++ b/examples/osd/climate/Makefile @@ -1,44 +1,54 @@ all: er-example-server -# Use this target explicitly if requried: er-plugtest-server +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + + +# variable for Makefile.include +WITH_UIP6=1 +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6 +CFLAGS += -DUIP_CONF_IPV6_RPL CONTIKI=../../.. CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" -# for static routing, if enabled +# variable for Makefile.include 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 +CFLAGS += -DUIP_CONF_IPV6_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 += -DUIP_CONF_IPV6_RPL=0 CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" -CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280 +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 endif # linker optimizations SMALL=1 # REST framework, requires WITH_COAP -ifeq ($(WITH_COAP), 7) +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else ifeq ($(WITH_COAP), 7) ${info INFO: compiling with CoAP-08} CFLAGS += -DWITH_COAP=7 CFLAGS += -DREST=coap_rest_implementation @@ -84,5 +94,5 @@ connect-router: $(CONTIKI)/tools/tunslip6 connect-router-cooja: $(CONTIKI)/tools/tunslip6 sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64 -tap0up: +connect-minimal: sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c index bd11fa10e..9fb0ee36a 100644 --- a/examples/osd/climate/er-example-server.c +++ b/examples/osd/climate/er-example-server.c @@ -97,6 +97,10 @@ uint8_t dht11_temp=0, dht11_hum=0; #include "er-coap-03.h" #elif WITH_COAP == 7 #include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" #else #warning "Erbium example without CoAP-specifc functionality" #endif /* CoAP-specific example */ @@ -259,7 +263,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); } } @@ -299,7 +303,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); } } @@ -637,7 +641,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -672,7 +676,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } From d5eda89c39b330c5603a99fc4dbf20227ca02d4d Mon Sep 17 00:00:00 2001 From: Andreas Reder Date: Tue, 6 Aug 2013 10:50:26 +0200 Subject: [PATCH 078/345] changed char c to signed char c to be compatible to armhf architecture --- examples/osd/native-border-router/slip-config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/osd/native-border-router/slip-config.c b/examples/osd/native-border-router/slip-config.c index 84d256127..9d93afa7a 100644 --- a/examples/osd/native-border-router/slip-config.c +++ b/examples/osd/native-border-router/slip-config.c @@ -67,7 +67,7 @@ int slip_config_handle_arguments(int argc, char **argv) { const char *prog; - char c; + signed char c; int baudrate = 115200; slip_config_verbose = 0; From 58504df2c4cf9e6ba8e3d1ff09df8346413a0a91 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 13 Aug 2013 14:26:57 +0200 Subject: [PATCH 079/345] bugfix packet loss --- platform/osd-merkur/contiki-conf.h | 10 +++++----- platform/osd-merkur/contiki-main.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index 247a0be35..a3ce61151 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -101,14 +101,14 @@ typedef unsigned long off_t; /* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */ /* It has less overhead than ENERGEST */ -#define RADIOSTATS 0 +#define RADIOSTATS 1 /* More extensive stats, via main loop printfs or webserver status pages */ -#define ENERGEST_CONF_ON 0 +#define ENERGEST_CONF_ON 1 /* Packet statistics */ typedef unsigned short uip_stats_t; -#define UIP_STATISTICS 0 +//#define UIP_STATISTICS 1 /* 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 */ @@ -157,7 +157,7 @@ typedef unsigned short uip_stats_t; #define UIP_CONF_LL_802154 1 #define UIP_CONF_LLH_LEN 0 -#define UIP_CONF_BUFFER_SIZE 240 +//#define UIP_CONF_BUFFER_SIZE 1280 // old 240 /* 10 bytes per stateful address context - see sicslowpan.c */ /* Default is 1 context with prefix aaaa::/64 */ @@ -238,7 +238,7 @@ typedef unsigned short uip_stats_t; #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 +#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 16 /* 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 */ diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index 2ec3b75e0..8c5fe2de4 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -102,7 +102,7 @@ uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; /* 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 0 +#define PERIODICPRINTS 1 #if PERIODICPRINTS //#define PINGS 64 #define ROUTES 600 @@ -287,7 +287,7 @@ uint8_t i; #endif rimeaddr_set_node_addr(&addr); - PRINTA("Panid:%u\n", params_get_panid()); + PRINTA("Panid:%x\n", params_get_panid()); framer_802154_set_panid(params_get_panid()); rf230_set_pan_addr(params_get_panid(),params_get_panaddr(),(uint8_t *)&addr.u8); rf230_set_channel(params_get_channel()); From 1968ebc626998649d9b2b5c62659e988a8fe7378 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 13 Aug 2013 14:28:33 +0200 Subject: [PATCH 080/345] bugfix buffers --- .../osd/er-rest-example-merkurboard/project-conf.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/osd/er-rest-example-merkurboard/project-conf.h b/examples/osd/er-rest-example-merkurboard/project-conf.h index 2271a3e6c..f02a4c5e3 100644 --- a/examples/osd/er-rest-example-merkurboard/project-conf.h +++ b/examples/osd/er-rest-example-merkurboard/project-conf.h @@ -56,10 +56,10 @@ */ /* The IP buffer size must fit all other hops, in particular the border router. */ -/* + #undef UIP_CONF_BUFFER_SIZE #define UIP_CONF_BUFFER_SIZE 1280 -*/ + /* Multiplies with chunk size, be aware of memory constraints. */ #undef COAP_MAX_OPEN_TRANSACTIONS @@ -78,16 +78,21 @@ */ /* Save some memory for the sky platform. */ +/* #undef UIP_CONF_DS6_NBR_NBU #define UIP_CONF_DS6_NBR_NBU 10 #undef UIP_CONF_MAX_ROUTES #define UIP_CONF_MAX_ROUTES 10 +*/ /* Reduce 802.15.4 frame queue to save RAM. */ +/* #undef QUEUEBUF_CONF_NUM #define QUEUEBUF_CONF_NUM 4 +*/ +/* #undef SICSLOWPAN_CONF_FRAG #define SICSLOWPAN_CONF_FRAG 1 - +*/ #endif /* __PROJECT_ERBIUM_CONF_H__ */ From 015a6a3c65873b68cb85e0f51b2dc0159034d5b5 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 13 Aug 2013 17:23:15 +0200 Subject: [PATCH 081/345] bugfix buffers --- examples/osd/climate/project-conf.h | 81 +++++++++++++++++++---------- 1 file changed, 54 insertions(+), 27 deletions(-) diff --git a/examples/osd/climate/project-conf.h b/examples/osd/climate/project-conf.h index 0d77f7f2e..53f695671 100644 --- a/examples/osd/climate/project-conf.h +++ b/examples/osd/climate/project-conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Swedish Institute of Computer Science. + * Copyright (c) 2013, Matthias Kovatsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,44 +29,71 @@ * */ -#ifndef __PROJECT_RPL_WEB_CONF_H__ -#define __PROJECT_RPL_WEB_CONF_H__ +#ifndef __PROJECT_ERBIUM_CONF_H__ +#define __PROJECT_ERBIUM_CONF_H__ -//#define PLATFORM_HAS_LEDS 1 -//#define PLATFORM_HAS_BUTTON 1 -#define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 -#define PLATFORM_HAS_SHT11 1 -//#define SICSLOWPAN_CONF_FRAG 1 +#define PLATFORM_HAS_DS1820 1 +#define PLATFORM_HAS_DHT11 1 + + + +/* Some platforms have weird includes. */ +#undef IEEE802154_CONF_PANID /* Disabling RDC for demo purposes. Core updates often require more memory. */ /* For projects, optimize memory and enable RDC again. */ -//#undef NETSTACK_CONF_RDC +// #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 +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE #define REST_MAX_CHUNK_SIZE 64 -#endif + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 1280 + /* Multiplies with chunk size, be aware of memory constraints. */ -#ifndef COAP_MAX_OPEN_TRANSACTIONS -#define COAP_MAX_OPEN_TRANSACTIONS 2 -#endif +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ + +#undef UIP_CONF_DS6_NBR_NBU +#define UIP_CONF_DS6_NBR_NBU 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 -/* 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 +#define QUEUEBUF_CONF_NUM 4 +*/ -#endif /* __PROJECT_RPL_WEB_CONF_H__ */ +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ +#endif /* __PROJECT_ERBIUM_CONF_H__ */ From 16c8c3853d9818e08349bed0eeb67fa2585dba9a Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Fri, 16 Aug 2013 13:21:06 +0200 Subject: [PATCH 082/345] initial upload --- examples/osd/embedd-vm-merkurboard/Makefile | 98 +++ examples/osd/embedd-vm-merkurboard/README | 31 + .../embedd-vm-merkurboard/embedd-vm-server.c | 529 +++++++++++++++++ .../embedd-vm-server.osd-merkur | Bin 0 -> 455108 bytes .../embedd-vm-server.osd-merkur.eep | 1 + examples/osd/embedd-vm-merkurboard/embedvm.c | 311 ++++++++++ examples/osd/embedd-vm-merkurboard/embedvm.h | 53 ++ .../er-plugtest-server.c | 561 ++++++++++++++++++ examples/osd/embedd-vm-merkurboard/flash.sh | 2 + .../osd/embedd-vm-merkurboard/project-conf.h | 80 +++ examples/osd/embedd-vm-merkurboard/run.sh | 6 + .../osd/embedd-vm-merkurboard/server-only.csc | 189 ++++++ .../embedd-vm-merkurboard/static-routing.c | 155 +++++ .../embedd-vm-merkurboard/static-routing.h | 20 + examples/osd/embedd-vm-merkurboard/vmcode.evm | 43 ++ examples/osd/embedd-vm-merkurboard/vmcode.hdr | 9 + 16 files changed, 2088 insertions(+) create mode 100644 examples/osd/embedd-vm-merkurboard/Makefile create mode 100644 examples/osd/embedd-vm-merkurboard/README create mode 100644 examples/osd/embedd-vm-merkurboard/embedd-vm-server.c create mode 100755 examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur create mode 100644 examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur.eep create mode 100644 examples/osd/embedd-vm-merkurboard/embedvm.c create mode 100644 examples/osd/embedd-vm-merkurboard/embedvm.h create mode 100644 examples/osd/embedd-vm-merkurboard/er-plugtest-server.c create mode 100755 examples/osd/embedd-vm-merkurboard/flash.sh create mode 100644 examples/osd/embedd-vm-merkurboard/project-conf.h create mode 100755 examples/osd/embedd-vm-merkurboard/run.sh create mode 100644 examples/osd/embedd-vm-merkurboard/server-only.csc create mode 100644 examples/osd/embedd-vm-merkurboard/static-routing.c create mode 100644 examples/osd/embedd-vm-merkurboard/static-routing.h create mode 100644 examples/osd/embedd-vm-merkurboard/vmcode.evm create mode 100644 examples/osd/embedd-vm-merkurboard/vmcode.hdr diff --git a/examples/osd/embedd-vm-merkurboard/Makefile b/examples/osd/embedd-vm-merkurboard/Makefile new file mode 100644 index 000000000..11973023b --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/Makefile @@ -0,0 +1,98 @@ +all: embedd-vm-server +# use this target explicitly if requried: er-plugtest-server + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + + +# variable for Makefile.include +WITH_UIP6=1 +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += embedvm.c + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/embedd-vm-merkurboard/README b/examples/osd/embedd-vm-merkurboard/README new file mode 100644 index 000000000..59c1a7f57 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/README @@ -0,0 +1,31 @@ +A Quick Introduction to the embedd-vm virtual machine +===================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +EXAMPLE FILES +------------- + +PRELIMINARIES +------------- + +COOJA HOWTO +----------- +Server only: + +DETAILS +------- + +REST IMPLEMENTATIONS +-------------------- + +TODOs +----- + diff --git a/examples/osd/embedd-vm-merkurboard/embedd-vm-server.c b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.c new file mode 100644 index 000000000..146d75eab --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.c @@ -0,0 +1,529 @@ +/* + * 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) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_EVM 1 +#define REST_RES_CHUNKS 0 +#define REST_RES_BATTERY 1 +#define REST_RES_LEDS 1 +#define REST_RES_TOGGLE 1 + +#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" + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif + +// embedd-vm +#include "embedvm.h" + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#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_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"Text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.1\",\n"); + index += sprintf(message + index," \"name\" : \"embedd-vm demo\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_CHUNKS +/* + * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation + * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer, + * the byte offset where to continue is provided to the handler as int32_t pointer. + * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached. + * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.) + */ +RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\""); + +#define CHUNKS_TOTAL 2050 + +void +chunks_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 = 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); + + /* 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 defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + +#include "vmcode.hdr" +#define UNUSED __attribute__((unused)) + +uint8_t vm_mem[256] = { EMBEDVM_SECT_SRAM_DATA }; +struct embedvm_s vm = { }; +// Global Variable coap answear + char gmessage[100]; + int gindex = 0; +/******************************************************************************/ +#if defined (PLATFORM_HAS_EVM) +/******************************************************************************/ +#if REST_RES_EVM +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(evm, METHOD_GET | METHOD_POST | METHOD_PUT , "evm", "title=\"Embedd-VM, POST/PUT player=0/9999\";rt=\"Embedd-VM\""); + +void +evm_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *player = NULL; + int success = 1; + //int length = 0; /* |<-------->| */ + int16_t val = 0; + uint16_t old_ip=0; + const uint16_t *accept = NULL; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + gindex=0; + gindex += sprintf(gmessage + gindex,"Number-Quiz!\nI think at a Number between 0 and 9999 :-)\n"); + break; + case METHOD_PUT: + if ((len=REST.get_post_variable(request, "player", &player))) { + PRINTF("player %.*s\n", len, player); + gindex=0; + val = atoi(player); + embedvm_push(&vm, 1); + embedvm_push(&vm, val); + old_ip=vm.ip; + embedvm_interrupt(&vm, EMBEDVM_SYM_play); + while (vm.ip != old_ip) { + // printf("<%X>",vm.ip); + embedvm_exec(&vm); + } + embedvm_pop(&vm); + embedvm_pop(&vm); + + } else { + success = 0; + } + break; + default: + success = 0; + } + int num = REST.get_header_accept(request, &accept); + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + if(success){ + //length = strlen(gmessage); + memcpy(buffer, gmessage,gindex ); + buffer[gindex]=0; + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } else { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif +#endif + + +int16_t mem_read(uint16_t addr, bool is16bit, void *ctx) +{ + if (addr + (is16bit ? 1 : 0) >= sizeof(vm_mem)) + return 0; + if (is16bit) + return (vm_mem[addr] << 8) | vm_mem[addr+1]; + return vm_mem[addr]; +} + +void mem_write(uint16_t addr, int16_t value, bool is16bit, void *ctx) +{ + if (addr + (is16bit ? 1 : 0) >= sizeof(vm_mem)) + return; + if (is16bit) { + vm_mem[addr] = value >> 8; + vm_mem[addr+1] = value; + } else + vm_mem[addr] = value; +} + +extern uint8_t rng_get_uint8(void); +int16_t call_user(uint8_t funcid, uint8_t argc, int16_t *argv, void *ctx) +{ + if (funcid == 0) + return (random()%99)+1; + + if (funcid == 1 && argc >= 1) { + if (argv[0] > 0){ + gindex += sprintf(gmessage + gindex,"Try larger numbers.\n"); + PRINTF("Try larger numbers.\n"); + }else{ + gindex += sprintf(gmessage + gindex,"Try smaler numbers.\n"); + PRINTF("Try smaller numbers.\n"); + } + return 0; + } + if (funcid == 2) { + gindex += sprintf(gmessage + gindex,"This is correct!\n"); + PRINTF("This is correct!\n"); + return 0; + } + if (funcid == 3) { + gindex += sprintf(gmessage + gindex,"\nYou currently have %d points.\n", mem_read(EMBEDVM_SYM_points, true, ctx)); + PRINTF("\n"); + PRINTF("You currently have %d points.\n", mem_read(EMBEDVM_SYM_points, true, ctx)); + return 0; + } + if (funcid == 4) { + PRINTF("\n"); + PRINTF("D: %d\n", mem_read(EMBEDVM_SYM_dbg, true, ctx)); + return 0; + } + if (funcid == 10) { + PRINTF("D: LED-RED off\n"); + leds_off(LEDS_RED); + return 0; + } + if (funcid == 11) { + PRINTF("D: LED-RED on\n"); + leds_on(LEDS_RED); + return 0; + } + if (funcid == 12) { + PRINTF("D: LED-RED Toggle\n"); + leds_toggle(LEDS_RED); + return 0; + } + return 1; +} + +void vm_setup() +{ + PRINTF("Initializing embedded-vm...\n"); + + vm.ip = EMBEDVM_SYM_main; + vm.sp = vm.sfp = sizeof(vm_mem); + vm.mem_read = &mem_read; + vm.mem_write = &mem_write; + vm.call_user = &call_user; + + embedvm_push(&vm, 0); + while (vm.ip > 0) { + // printf("<%X>",vm.ip); + embedvm_exec(&vm); + } +} + +void +hw_init() +{ +#if defined (PLATFORM_HAS_LEDS) + leds_off(LEDS_RED); +#endif + vm_setup(); +} + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + + PRINTF("Starting Embedd-VM Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if REST_RES_CHUNKS + rest_activate_resource(&resource_chunks); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if REST_RES_EVM + rest_activate_resource(&resource_evm); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif + + while(1) { + PROCESS_WAIT_EVENT(); + + } /* while (1) */ + PROCESS_END(); +} diff --git a/examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur new file mode 100755 index 0000000000000000000000000000000000000000..c4bbbeb36f131672577d7b73e05dfb5ff2dfeedc GIT binary patch literal 455108 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%0A^k#fWqUI#w1g^r_~}V0 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

+(X|6lZGPs!_O4_|dX9EeSN&0i{W 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

gJNlKr}x_1X|cD{ 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 literal 0 HcmV?d00001 diff --git a/examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur.eep b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur.eep new file mode 100644 index 000000000..1996e8fde --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur.eep @@ -0,0 +1 @@ +:00000001FF diff --git a/examples/osd/embedd-vm-merkurboard/embedvm.c b/examples/osd/embedd-vm-merkurboard/embedvm.c new file mode 100644 index 000000000..88ec457e0 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/embedvm.c @@ -0,0 +1,311 @@ +/* + * EmbedVM - Embedded Virtual Machine for uC Applications + * + * Copyright (C) 2011 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "embedvm.h" + +static inline int16_t signext(uint16_t val, uint16_t mask) +{ + val = val & mask; + if ((val & ~(mask >> 1)) != 0) + val |= ~mask; + return val; +} + +extern void embedvm_exec(struct embedvm_s *vm) +{ + uint8_t opcode = vm->mem_read(vm->ip, false, vm->user_ctx); + uint16_t addr = 0; + int16_t a = 0, b = 0; + int8_t sfa = 0; + + switch (opcode) + { + case 0x00 ... 0x3f: + sfa = signext(opcode, 0x3f); + embedvm_push(vm, embedvm_local_read(vm, sfa)); + vm->ip++; + break; + case 0x40 ... 0x7f: + sfa = signext(opcode, 0x3f); + embedvm_local_write(vm, sfa, embedvm_pop(vm)); + vm->ip++; + break; + case 0x80+0 ... 0x80+11: + case 0xa8+0 ... 0xa8+5: + b = embedvm_pop(vm); + case 0x80+12 ... 0x80+14: + a = embedvm_pop(vm); + switch (opcode) + { + case 0x80 + 0: embedvm_push(vm, a + b); break; + case 0x80 + 1: embedvm_push(vm, a - b); break; + case 0x80 + 2: embedvm_push(vm, a * b); break; + case 0x80 + 3: embedvm_push(vm, a / b); break; + case 0x80 + 4: embedvm_push(vm, a % b); break; + case 0x80 + 5: embedvm_push(vm, a << b); break; + case 0x80 + 6: embedvm_push(vm, a >> b); break; + case 0x80 + 7: embedvm_push(vm, a & b); break; + case 0x80 + 8: embedvm_push(vm, a | b); break; + case 0x80 + 9: embedvm_push(vm, a ^ b); break; + case 0x80 + 10: embedvm_push(vm, a && b); break; + case 0x80 + 11: embedvm_push(vm, a || b); break; + case 0x80 + 12: embedvm_push(vm, ~a); break; + case 0x80 + 13: embedvm_push(vm, -a); break; + case 0x80 + 14: embedvm_push(vm, !a); break; + case 0xa8 + 0: embedvm_push(vm, a < b); break; + case 0xa8 + 1: embedvm_push(vm, a <= b); break; + case 0xa8 + 2: embedvm_push(vm, a == b); break; + case 0xa8 + 3: embedvm_push(vm, a != b); break; + case 0xa8 + 4: embedvm_push(vm, a >= b); break; + case 0xa8 + 5: embedvm_push(vm, a > b); break; + + } + vm->ip++; + break; + case 0x90 ... 0x97: + a = signext(opcode, 0x07); + if ((a & 0x04) != 0) + a |= ~0x07; + embedvm_push(vm, a); + vm->ip++; + break; + case 0x98: + a = vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff; + embedvm_push(vm, a); + vm->ip += 2; + break; + case 0x99: + a = vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff; + embedvm_push(vm, signext(a, 0x00ff)); + vm->ip += 2; + break; + case 0x9a: + a = vm->mem_read(vm->ip+1, true, vm->user_ctx); + embedvm_push(vm, a); + vm->ip += 3; + break; + case 0x9b: + a = embedvm_pop(vm); + if (0) { + case 0x9c: + a = 0; + } + vm->sp = vm->sfp; + vm->ip = embedvm_pop(vm); + vm->sfp = embedvm_pop(vm); + if ((vm->sfp & 1) != 0) + vm->sfp &= ~1; + else + embedvm_push(vm, a); + break; + case 0x9d: + embedvm_pop(vm); + vm->ip++; + break; + case 0x9e: + addr = embedvm_pop(vm); + if (vm->mem_read(vm->ip+1, false, vm->user_ctx) == 0x9d) { + embedvm_push(vm, vm->sfp | 1); + embedvm_push(vm, vm->ip + 2); + } else { + embedvm_push(vm, vm->sfp); + embedvm_push(vm, vm->ip + 1); + } + vm->sfp = vm->sp; + vm->ip = addr; + break; + case 0x9f: + vm->ip = embedvm_pop(vm); + break; + case 0xa0 ... 0xa0+7: + if ((opcode & 1) == 0) { + addr = vm->ip + signext(vm->mem_read(vm->ip+1, false, vm->user_ctx), 0x00ff); + vm->ip += 2; + } else { + addr = vm->ip + vm->mem_read(vm->ip+1, true, vm->user_ctx); + vm->ip += 3; + } + switch (opcode) + { + case 0xa0: + case 0xa1: + vm->ip = addr; + break; + case 0xa2: + case 0xa3: + if (vm->mem_read(vm->ip, false, vm->user_ctx) == 0x9d) { + embedvm_push(vm, vm->sfp | 1); + embedvm_push(vm, vm->ip + 1); + } else { + embedvm_push(vm, vm->sfp); + embedvm_push(vm, vm->ip); + } + vm->sfp = vm->sp; + vm->ip = addr; + break; + case 0xa4: + case 0xa5: + if (embedvm_pop(vm)) + vm->ip = addr; + break; + case 0xa6: + case 0xa7: + if (!embedvm_pop(vm)) + vm->ip = addr; + break; + } + break; + case 0xae: + embedvm_push(vm, vm->sp); + vm->ip++; + break; + case 0xaf: + embedvm_push(vm, vm->sfp); + vm->ip++; + break; + case 0xb0 ... 0xb0+15: + { + uint8_t argc = embedvm_pop(vm); + int16_t argv[argc]; + for (sfa=0; sfacall_user(opcode - 0xb0, argc, argv, vm->user_ctx); + embedvm_push(vm, a); + } + vm->ip++; + break; + case 0xc0 ... 0xef: + if ((opcode & 0x07) == 5) { + /* this is a "bury" instruction */ + uint8_t depth = (opcode >> 3) & 0x07; + int16_t stack[depth+1]; + for (sfa = 0; sfa <= depth; sfa++) + stack[sfa] = embedvm_pop(vm); + embedvm_push(vm, stack[0]); + for (sfa = depth; sfa > 0; sfa--) + embedvm_push(vm, stack[sfa]); + embedvm_push(vm, stack[0]); + vm->ip++; + break; + } + if ((opcode & 0x07) == 6) { + /* this is a "dig" instruction */ + uint8_t depth = (opcode >> 3) & 0x07; + int16_t stack[depth+2]; + for (sfa = 0; sfa < depth+2; sfa++) + stack[sfa] = embedvm_pop(vm); + for (sfa = depth+1; sfa > 0; sfa--) + embedvm_push(vm, stack[sfa-1]); + embedvm_push(vm, stack[depth+1]); + vm->ip++; + break; + } + sfa = ((opcode >> 3) & 0x07) == 4 || ((opcode >> 3) & 0x07) == 5 ? 1 : 0; + switch (opcode & 0x07) + { + case 0: + addr = vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff; + vm->ip += 2; + break; + case 1: + addr = vm->mem_read(vm->ip+1, true, vm->user_ctx); + vm->ip += 3; + break; + case 2: + addr = embedvm_pop(vm); + vm->ip++; + break; + case 3: + addr = (embedvm_pop(vm) << sfa) + (vm->mem_read(vm->ip+1, false, vm->user_ctx) & 0x00ff); + vm->ip += 2; + break; + case 4: + addr = (embedvm_pop(vm) << sfa) + vm->mem_read(vm->ip+1, true, vm->user_ctx); + vm->ip += 3; + break; + } + switch ((opcode >> 3) & 0x07) + { + case 0: + embedvm_push(vm, vm->mem_read(addr, false, vm->user_ctx) & 0x00ff); + break; + case 1: + vm->mem_write(addr, embedvm_pop(vm), false, vm->user_ctx); + break; + case 2: + embedvm_push(vm, signext(vm->mem_read(addr, false, vm->user_ctx), 0x00ff)); + break; + case 3: + vm->mem_write(addr, embedvm_pop(vm), false, vm->user_ctx); + break; + case 4: + embedvm_push(vm, vm->mem_read(addr, true, vm->user_ctx)); + break; + case 5: + vm->mem_write(addr, embedvm_pop(vm), true, vm->user_ctx); + break; + } + break; + case 0xf0 ... 0xf7: + for (sfa = 0; sfa <= (opcode & 0x07); sfa++) + embedvm_push(vm, 0); + vm->ip++; + break; + case 0xf8 ... 0xff: + a = embedvm_pop(vm); + vm->sp += 2 + 2*(opcode & 0x07); + embedvm_push(vm, a); + vm->ip++; + break; + } +} + +void embedvm_interrupt(struct embedvm_s *vm, uint16_t addr) +{ + embedvm_push(vm, vm->sfp | 1); + embedvm_push(vm, vm->ip); + vm->sfp = vm->sp; + vm->ip = addr; +} + +int16_t embedvm_pop(struct embedvm_s *vm) +{ + int16_t value = vm->mem_read(vm->sp, true, vm->user_ctx); + vm->sp += 2; + return value; +} + +void embedvm_push(struct embedvm_s *vm, int16_t value) +{ + vm->sp -= 2; + vm->mem_write(vm->sp, value, true, vm->user_ctx); +} + +int16_t embedvm_local_read(struct embedvm_s *vm, int8_t sfa) +{ + uint16_t addr = vm->sfp - 2*sfa + (sfa < 0 ? +2 : -2); + return vm->mem_read(addr, true, vm->user_ctx); +} + +void embedvm_local_write(struct embedvm_s *vm, int8_t sfa, int16_t value) +{ + uint16_t addr = vm->sfp - 2*sfa + (sfa < 0 ? +2 : -2); + vm->mem_write(addr, value, true, vm->user_ctx); +} + diff --git a/examples/osd/embedd-vm-merkurboard/embedvm.h b/examples/osd/embedd-vm-merkurboard/embedvm.h new file mode 100644 index 000000000..1381b24a8 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/embedvm.h @@ -0,0 +1,53 @@ +/* + * EmbedVM - Embedded Virtual Machine for uC Applications + * + * Copyright (C) 2011 Clifford Wolf + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef EMBEDVM_H +#define EMBEDVM_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct embedvm_s +{ + uint16_t ip, sp, sfp; + void *user_ctx; + + int16_t (*mem_read)(uint16_t addr, bool is16bit, void *ctx); + void (*mem_write)(uint16_t addr, int16_t value, bool is16bit, void *ctx); + int16_t (*call_user)(uint8_t funcid, uint8_t argc, int16_t *argv, void *ctx); +}; + +extern void embedvm_exec(struct embedvm_s *vm); +extern void embedvm_interrupt(struct embedvm_s *vm, uint16_t addr); + +int16_t embedvm_pop(struct embedvm_s *vm); +void embedvm_push(struct embedvm_s *vm, int16_t value); + +int16_t embedvm_local_read(struct embedvm_s *vm, int8_t sfa); +void embedvm_local_write(struct embedvm_s *vm, int8_t sfa, int16_t value); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/examples/osd/embedd-vm-merkurboard/er-plugtest-server.c b/examples/osd/embedd-vm-merkurboard/er-plugtest-server.c new file mode 100644 index 000000000..051b44be0 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/er-plugtest-server.c @@ -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 + */ + +#include +#include +#include +#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 = 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(); +} diff --git a/examples/osd/embedd-vm-merkurboard/flash.sh b/examples/osd/embedd-vm-merkurboard/flash.sh new file mode 100755 index 000000000..fe0d83f0d --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:embedd-vm-server.osd-merkur.hex:a -U eeprom:w:embedd-vm-server.osd-merkur.eep:a diff --git a/examples/osd/embedd-vm-merkurboard/project-conf.h b/examples/osd/embedd-vm-merkurboard/project-conf.h new file mode 100644 index 000000000..2b6d52421 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/project-conf.h @@ -0,0 +1,80 @@ +/* + * 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 + +#define PLATFORM_HAS_EVM 1 +#define PLATFORM_HAS_BATTERY 1 +#define PLATFORM_HAS_LEDS 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 + +/* Debugmode Dont allow MCU sleeping between channel checks */ +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 1280 + +/* 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__ */ diff --git a/examples/osd/embedd-vm-merkurboard/run.sh b/examples/osd/embedd-vm-merkurboard/run.sh new file mode 100755 index 000000000..c20cc4e5b --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 embedd-vm-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex embedd-vm-server.osd-merkur embedd-vm-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex embedd-vm-server.osd-merkur embedd-vm-server.osd-merkur.eep diff --git a/examples/osd/embedd-vm-merkurboard/server-only.csc b/examples/osd/embedd-vm-merkurboard/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/embedd-vm-merkurboard/static-routing.c b/examples/osd/embedd-vm-merkurboard/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/embedd-vm-merkurboard/static-routing.h b/examples/osd/embedd-vm-merkurboard/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/static-routing.h @@ -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_ */ diff --git a/examples/osd/embedd-vm-merkurboard/vmcode.evm b/examples/osd/embedd-vm-merkurboard/vmcode.evm new file mode 100644 index 000000000..437207516 --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/vmcode.evm @@ -0,0 +1,43 @@ +// $uf10(); // LED OFF +// $uf11(); // LED ON +// $uf12(); // LED Toggle + +global points; +global num; +global dbg; + +function main() +{ + points = 0; + // get next random number + num = $uf0(); +} + +function play(guess) +{ + if (guess != num) { + if (guess < num) { + // hint to user: try larger numbers + $uf1(+1); + points = points - 1; + $uf11(); // LED ON + } + if (guess > num) { + // hint to user: try smaller numbers + $uf1(-1); + points = points - 1; + $uf10(); // LED OFF + } + } else { + // level up! + // LED ON + $uf11(); + points = points + 10; + $uf2(); + num = $uf0(); + $uf10(); // LED OFF + } + // report points + $uf3(); +} + diff --git a/examples/osd/embedd-vm-merkurboard/vmcode.hdr b/examples/osd/embedd-vm-merkurboard/vmcode.hdr new file mode 100644 index 000000000..e145c8f4a --- /dev/null +++ b/examples/osd/embedd-vm-merkurboard/vmcode.hdr @@ -0,0 +1,9 @@ +#define EMBEDVM_SYM__end 0x0054 +#define EMBEDVM_SYM_play 0x000e +#define EMBEDVM_SYM_main 0x0006 +#define EMBEDVM_SYM_dbg 0x0004 +#define EMBEDVM_SYM_num 0x0002 +#define EMBEDVM_SYM_points 0x0000 +#define EMBEDVM_SECT_SRAM_BEGIN 0x0000 +#define EMBEDVM_SECT_SRAM_END 0xffff +#define EMBEDVM_SECT_SRAM_DATA 0,0,0,0,0,0,144,232,0,144,176,232,2,156,63,224,2,171,166,42,63,224,2,168,166,15,145,145,177,157,224,0,145,129,232,0,144,187,157,63,224,2,173,166,15,151,145,177,157,224,0,145,129,232,0,144,186,157,160,22,144,187,157,224,0,152,10,128,232,0,144,178,157,144,176,232,2,144,186,157,144,179,157,156 From 7ee65e72a58d135f197f4b78e23c7aeb45ce11e8 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 20 Aug 2013 11:18:58 +0200 Subject: [PATCH 083/345] add coap 13 support --- examples/osd/pingtheplug/Makefile | 61 ++++++++++------- examples/osd/pingtheplug/er-example-server.c | 13 ++-- examples/osd/pingtheplug/project-conf.h | 72 +++++++++++++------- 3 files changed, 89 insertions(+), 57 deletions(-) diff --git a/examples/osd/pingtheplug/Makefile b/examples/osd/pingtheplug/Makefile index 9f5e50f5a..e3da53956 100644 --- a/examples/osd/pingtheplug/Makefile +++ b/examples/osd/pingtheplug/Makefile @@ -1,46 +1,57 @@ all: er-example-server -# Use this target explicitly if requried: er-plugtest-server +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + + +# variable for Makefile.include +WITH_UIP6=1 +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6 +CFLAGS += -DUIP_CONF_IPV6_RPL 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 # pcintkey PROJECT_SOURCEFILES += pcintkey.c -# 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 +# variable for Makefile.include ifneq ($(TARGET), minimal-net) -UIP_CONF_RPL=1 +CFLAGS += -DUIP_CONF_IPV6_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 += -DUIP_CONF_IPV6_RPL=0 CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" -CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280 +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 endif # linker optimizations SMALL=1 # REST framework, requires WITH_COAP -ifeq ($(WITH_COAP), 7) +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else ifeq ($(WITH_COAP), 7) ${info INFO: compiling with CoAP-08} CFLAGS += -DWITH_COAP=7 CFLAGS += -DREST=coap_rest_implementation @@ -86,5 +97,5 @@ connect-router: $(CONTIKI)/tools/tunslip6 connect-router-cooja: $(CONTIKI)/tools/tunslip6 sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64 -tap0up: +connect-minimal: sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/pingtheplug/er-example-server.c b/examples/osd/pingtheplug/er-example-server.c index f69e7f8c1..c3a7bac07 100644 --- a/examples/osd/pingtheplug/er-example-server.c +++ b/examples/osd/pingtheplug/er-example-server.c @@ -53,11 +53,6 @@ #define REST_RES_TOGGLE 0 #define REST_RES_BATTERY 1 -#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" #include "pcintkey.h" @@ -85,6 +80,10 @@ #include "er-coap-03.h" #elif WITH_COAP == 7 #include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" #else #warning "Erbium example without CoAP-specifc functionality" #endif /* CoAP-specific example */ @@ -431,7 +430,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -466,7 +465,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } diff --git a/examples/osd/pingtheplug/project-conf.h b/examples/osd/pingtheplug/project-conf.h index 54f947d7e..a6836b39e 100644 --- a/examples/osd/pingtheplug/project-conf.h +++ b/examples/osd/pingtheplug/project-conf.h @@ -38,40 +38,62 @@ #define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 -#define SICSLOWPAN_CONF_FRAG 1 - -/* For Debug: Dont allow MCU sleeping between channel checks */ -//#undef RDC_CONF_MCU_SLEEP -//#define RDC_CONF_MCU_SLEEP 0 +/* Some platforms have weird includes. */ +#undef IEEE802154_CONF_PANID /* Disabling RDC for demo purposes. Core updates often require more memory. */ /* For projects, optimize memory and enable RDC again. */ -//#undef NETSTACK_CONF_RDC +// #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 +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE #define REST_MAX_CHUNK_SIZE 64 -#endif + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 640 + /* Multiplies with chunk size, be aware of memory constraints. */ -#ifndef COAP_MAX_OPEN_TRANSACTIONS -#define COAP_MAX_OPEN_TRANSACTIONS 2 -#endif +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ + +#undef UIP_CONF_DS6_NBR_NBU +#define UIP_CONF_DS6_NBR_NBU 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 -/* 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__ */ +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 8 + + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ +#endif /* __PROJECT_ERBIUM_CONF_H__ */ From ff227b7a04e315556c9da3ed987bdc07441a212f Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 20 Aug 2013 13:02:56 +0200 Subject: [PATCH 084/345] initial upload --- platform/osd-merkur/dev/batmon.c | 55 ++++++++++++++++++++++++++++++++ platform/osd-merkur/dev/batmon.h | 8 +++++ 2 files changed, 63 insertions(+) create mode 100644 platform/osd-merkur/dev/batmon.c create mode 100644 platform/osd-merkur/dev/batmon.h diff --git a/platform/osd-merkur/dev/batmon.c b/platform/osd-merkur/dev/batmon.c new file mode 100644 index 000000000..6ff0c135b --- /dev/null +++ b/platform/osd-merkur/dev/batmon.c @@ -0,0 +1,55 @@ +#include "contiki.h" +#include "batmon.h" +#include + + + + +int8_t batmon_init() +{ + return 0; +} + +int8_t batmon_get_voltage(uint16_t* voltage) +{ + uint16_t volt = 0; + uint16_t resolution = 75; + uint16_t offset = 2550; + int8_t ctr = 0; + + BATMON = 0 | BV(BATMON_HR); + _delay_us(2); + + if(BATMON & BV(BATMON_OK)) + { + // voltage above 2.550 V + resolution = 75; + offset = 2550; + for(ctr=15; ctr>=0; ctr--) + { + BATMON = (BATMON & 0xF0) | (ctr); + _delay_us(2); + if(BATMON & BV(BATMON_OK)) break; + } + } + else + { + // voltage below 2.550 V + resolution = 50; + offset = 1700; + + BATMON &= ~BV(BATMON_HR); + + for(ctr=15; ctr>=0; ctr--) + { + BATMON = (BATMON & 0xF0) | (ctr); + _delay_us(2); + if(BATMON & BV(BATMON_OK)) break; + } + } + + volt = resolution*ctr+offset; + *voltage=volt; + + return 0; +} diff --git a/platform/osd-merkur/dev/batmon.h b/platform/osd-merkur/dev/batmon.h new file mode 100644 index 000000000..c05f48200 --- /dev/null +++ b/platform/osd-merkur/dev/batmon.h @@ -0,0 +1,8 @@ +#ifndef BATMON_H_ +#define BATMON_H_ + +int8_t batmon_init(); +int8_t batmon_get_voltage(uint16_t* voltage); + + +#endif /* BATMON_H_ */ From b6bea56c27964f00bf2db08578b2d1f026d7dbfd Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 20 Aug 2013 13:34:01 +0200 Subject: [PATCH 085/345] use batmon in battery_sensor --- platform/osd-merkur/Makefile.osd-merkur | 2 +- platform/osd-merkur/dev/batmon.c | 10 +++++----- platform/osd-merkur/dev/battery-sensor.c | 14 +++++++++----- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index e5e47d7f4..cf862b1af 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -12,7 +12,7 @@ CONTIKI_TARGET_SOURCEFILES += dht11.c #Needed for DS18S20 temperature sensor CONTIKI_TARGET_SOURCEFILES += ds1820.c #Needed for Battery test -CONTIKI_TARGET_SOURCEFILES += battery-sensor.c +CONTIKI_TARGET_SOURCEFILES += battery-sensor.c batmon.c #Needed for PIR CONTIKI_TARGET_SOURCEFILES += pir-sensor.c #Needed for OPTRIAC diff --git a/platform/osd-merkur/dev/batmon.c b/platform/osd-merkur/dev/batmon.c index 6ff0c135b..5c61d125f 100644 --- a/platform/osd-merkur/dev/batmon.c +++ b/platform/osd-merkur/dev/batmon.c @@ -17,10 +17,10 @@ int8_t batmon_get_voltage(uint16_t* voltage) uint16_t offset = 2550; int8_t ctr = 0; - BATMON = 0 | BV(BATMON_HR); + BATMON = 0 | _BV(BATMON_HR); _delay_us(2); - if(BATMON & BV(BATMON_OK)) + if(BATMON & _BV(BATMON_OK)) { // voltage above 2.550 V resolution = 75; @@ -29,7 +29,7 @@ int8_t batmon_get_voltage(uint16_t* voltage) { BATMON = (BATMON & 0xF0) | (ctr); _delay_us(2); - if(BATMON & BV(BATMON_OK)) break; + if(BATMON & _BV(BATMON_OK)) break; } } else @@ -38,13 +38,13 @@ int8_t batmon_get_voltage(uint16_t* voltage) resolution = 50; offset = 1700; - BATMON &= ~BV(BATMON_HR); + BATMON &= ~_BV(BATMON_HR); for(ctr=15; ctr>=0; ctr--) { BATMON = (BATMON & 0xF0) | (ctr); _delay_us(2); - if(BATMON & BV(BATMON_OK)) break; + if(BATMON & _BV(BATMON_OK)) break; } } diff --git a/platform/osd-merkur/dev/battery-sensor.c b/platform/osd-merkur/dev/battery-sensor.c index 56837baa8..1eb7906b4 100644 --- a/platform/osd-merkur/dev/battery-sensor.c +++ b/platform/osd-merkur/dev/battery-sensor.c @@ -42,6 +42,7 @@ */ #include "dev/battery-sensor.h" +#include "dev/batmon.h" const struct sensors_sensor battery_sensor; /*---------------------------------------------------------------------------*/ @@ -52,20 +53,22 @@ const struct sensors_sensor battery_sensor; static int value(int type) { + uint16_t h; +/* uint8_t p1; BATMON = 16; //give BATMON time to stabilize at highest range and lowest voltage -/* Bandgap can't be measured against supply voltage in this chip. */ -/* Use BATMON register instead */ +// Bandgap can't be measured against supply voltage in this chip. +// Use BATMON register instead for ( p1=16; p1<31; p1++) { BATMON = p1; clock_delay_usec(100); // delay needed !! if ((BATMON&(1< Date: Wed, 21 Aug 2013 08:03:42 +0200 Subject: [PATCH 086/345] bugfix wrong define --- examples/osd/pingtheplug/er-example-server.c | 12 +----------- examples/osd/pingtheplug/project-conf.h | 6 +++--- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/examples/osd/pingtheplug/er-example-server.c b/examples/osd/pingtheplug/er-example-server.c index c3a7bac07..0c205ea82 100644 --- a/examples/osd/pingtheplug/er-example-server.c +++ b/examples/osd/pingtheplug/er-example-server.c @@ -88,7 +88,7 @@ #warning "Erbium example without CoAP-specifc functionality" #endif /* CoAP-specific example */ -#define DEBUG 1 +#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]) @@ -494,10 +494,6 @@ PROCESS_THREAD(rest_server_example, ev, data) static int ext4=0; static int ext5=0; static int ext6=0; -// ext4 = is_button_ext4(); -// ext5 = is_button_ext5(); -// ext6 = is_button_ext6(); - PROCESS_BEGIN(); PRINTF("Starting Erbium Example Server\n"); @@ -514,12 +510,6 @@ PROCESS_THREAD(rest_server_example, ev, data) 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) && !defined (CONTIKI_TARGET_NATIVE) - set_global_address(); - configure_routing(); -#endif - /* Initialize the OSD Hardware. */ hw_init(); /* Initialize the REST engine. */ diff --git a/examples/osd/pingtheplug/project-conf.h b/examples/osd/pingtheplug/project-conf.h index a6836b39e..624f9a900 100644 --- a/examples/osd/pingtheplug/project-conf.h +++ b/examples/osd/pingtheplug/project-conf.h @@ -29,8 +29,8 @@ * */ -#ifndef __PROJECT_RPL_WEB_CONF_H__ -#define __PROJECT_RPL_WEB_CONF_H__ +#ifndef __PROJECT_ERBIUM_CONF_H__ +#define __PROJECT_ERBIUM_CONF_H__ //#define PLATFORM_HAS_LEDS 1 //#define PLATFORM_HAS_BUTTON 1 @@ -89,7 +89,7 @@ /* Reduce 802.15.4 frame queue to save RAM. */ #undef QUEUEBUF_CONF_NUM -#define QUEUEBUF_CONF_NUM 8 +#define QUEUEBUF_CONF_NUM 4 /* From ffae9fce58077116d95fe4d322e9452e8e7c868b Mon Sep 17 00:00:00 2001 From: harald Date: Wed, 2 Oct 2013 14:22:02 +0200 Subject: [PATCH 087/345] update coap13 --- examples/osd/wirelessplug/Makefile | 64 ++++++++------- examples/osd/wirelessplug/er-example-server.c | 7 ++ examples/osd/wirelessplug/project-conf.h | 77 +++++++++++++------ 3 files changed, 97 insertions(+), 51 deletions(-) diff --git a/examples/osd/wirelessplug/Makefile b/examples/osd/wirelessplug/Makefile index c05b6890b..17792e430 100644 --- a/examples/osd/wirelessplug/Makefile +++ b/examples/osd/wirelessplug/Makefile @@ -1,45 +1,53 @@ -all: er-example-server -# Use this target explicitly if requried: er-plugtest-server +all: er-example-server er-example-client +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + + +# variable for Makefile.include +WITH_UIP6=1 +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 CONTIKI=../../.. CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" -# for static routing, if enabled +# variable for Makefile.include ifneq ($(TARGET), minimal-net) -ifneq ($(TARGET), native) -ifneq ($(findstring avr,$(TARGET)), avr) -PROJECT_SOURCEFILES += static-routing.c -endif -endif -endif - -PROJECT_SOURCEFILES += relay.c -# 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 +CFLAGS += -DUIP_CONF_IPV6_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 += -DUIP_CONF_IPV6_RPL=0 CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" -CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280 +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 endif # linker optimizations SMALL=1 # REST framework, requires WITH_COAP -ifeq ($(WITH_COAP), 7) +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else ifeq ($(WITH_COAP), 7) ${info INFO: compiling with CoAP-08} CFLAGS += -DWITH_COAP=7 CFLAGS += -DREST=coap_rest_implementation @@ -85,5 +93,5 @@ connect-router: $(CONTIKI)/tools/tunslip6 connect-router-cooja: $(CONTIKI)/tools/tunslip6 sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64 -tap0up: +connect-minimal: sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/wirelessplug/er-example-server.c b/examples/osd/wirelessplug/er-example-server.c index 23751d68c..987c341f0 100644 --- a/examples/osd/wirelessplug/er-example-server.c +++ b/examples/osd/wirelessplug/er-example-server.c @@ -100,6 +100,10 @@ #include "er-coap-03.h" #elif WITH_COAP == 7 #include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" #else #warning "Erbium example without CoAP-specifc functionality" #endif /* CoAP-specific example */ @@ -122,6 +126,9 @@ #include "dev/ds1820.c" #endif +#include "relay.h" +#include "relay.c" + /******************************************************************************/ #if REST_RES_INFO diff --git a/examples/osd/wirelessplug/project-conf.h b/examples/osd/wirelessplug/project-conf.h index 1c3dd8933..f02a4c5e3 100644 --- a/examples/osd/wirelessplug/project-conf.h +++ b/examples/osd/wirelessplug/project-conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Swedish Institute of Computer Science. + * Copyright (c) 2013, Matthias Kovatsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,39 +29,70 @@ * */ -#ifndef __PROJECT_RPL_WEB_CONF_H__ -#define __PROJECT_RPL_WEB_CONF_H__ +#ifndef __PROJECT_ERBIUM_CONF_H__ +#define __PROJECT_ERBIUM_CONF_H__ -#define SICSLOWPAN_CONF_FRAG 1 +#define PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 + +/* Some platforms have weird includes. */ +#undef IEEE802154_CONF_PANID /* Disabling RDC for demo purposes. Core updates often require more memory. */ /* For projects, optimize memory and enable RDC again. */ -//#undef NETSTACK_CONF_RDC +// #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 +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE #define REST_MAX_CHUNK_SIZE 64 -#endif + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 1280 + /* Multiplies with chunk size, be aware of memory constraints. */ -#ifndef COAP_MAX_OPEN_TRANSACTIONS -#define COAP_MAX_OPEN_TRANSACTIONS 2 -#endif +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 -/* Must be <= open transaction number. */ -#ifndef COAP_MAX_OBSERVERS -#define COAP_MAX_OBSERVERS COAP_MAX_OPEN_TRANSACTIONS-1 -#endif +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef UIP_CONF_DS6_NBR_NBU +#define UIP_CONF_DS6_NBR_NBU 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ /* Reduce 802.15.4 frame queue to save RAM. */ +/* #undef QUEUEBUF_CONF_NUM -#define QUEUEBUF_CONF_NUM 4 +#define QUEUEBUF_CONF_NUM 4 +*/ -#endif /* __PROJECT_RPL_WEB_CONF_H__ */ +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ +#endif /* __PROJECT_ERBIUM_CONF_H__ */ From a58322a62b212dce99eea397e425a1a35b80ab77 Mon Sep 17 00:00:00 2001 From: harald Date: Thu, 3 Oct 2013 17:11:23 +0200 Subject: [PATCH 088/345] with coap13 --- .../osd/climate/er-example-server.osd-merkur | Bin 0 -> 509938 bytes .../climate/er-example-server.osd-merkur.eep | 1 + 2 files changed, 1 insertion(+) create mode 100755 examples/osd/climate/er-example-server.osd-merkur create mode 100644 examples/osd/climate/er-example-server.osd-merkur.eep diff --git a/examples/osd/climate/er-example-server.osd-merkur b/examples/osd/climate/er-example-server.osd-merkur new file mode 100755 index 0000000000000000000000000000000000000000..5c6b8a843c9bc355094ef53be41fc8a19743eb90 GIT binary patch literal 509938 zcmdSCd0-U9wg)^N$ucBNX2KEzgmg$)LYA3?M2HJX5ET?nzy(o}ghh!W1ldHnm+l#| zZ`0E=37`^i14IR`3%ERK@T#~#;9l=j-c{)=Vn84r83-uI_dDIwnFP4^`o8!5^AUQw zy1MGrsZ&*_&N+3ediAYSZetk6p#KXn++)z6(hbOJ>9?>0u7@K{R|fM{nvU1 z+$WyZu0Vt-FI@xA;U|Do-=zc@40Pdt*ZbQpA})keFGL%f$6o#3V6fwj-EbX#>FS<; zGV&V?Yt&1B-wRJvc9^?QK$tt}iYuhQ7PmO^>UWg(nSs}izY>oA{PVv_-!Y>ntU*yd zpLH1jm-}Eg%sm{J1=o?7F!xm4Z^v~bE-S8o4SVkW3#W7UXW#$K{a@c-b^q&lS~%Tv z|7hID+~08jUF!3~>F=ud?|o0v(+iNw|0mtwd$jg%!lFe>3l~1d4qxJn=xvx*uyF38 zC)r!?n|ysbTQGO-Q}dQAVIP~faNbh|OXtn)ZOAKFSUC5F;ZOHAAW1UP+?8|74eaoz zldtu^w_*4a08e7)%r98DaNYuT_%fCr=FNG6C3y5a=^1wE(`?bA74x3LBM``&!rr>D zVD7ZMfkE!wrVvPaEz*TneJ+ELemTfJSwt+f%-q{-{6Cd-}=3rD_U* z^u1iT$R9??mvm|2lk?`HHfrM81#`Q-S+r=uB5GACZqcG8^A|nUm1@b#g>&ZXS>`-7 zM-9$dv~cOXg-Z(;Eu8z*q9QeF$-ISg(KEW97cB50vtWT%KHC4Py3HwCre@@|Z#M6i87bPeF?DBfQ>V%OW<;2K<1=Ay zgJHXCkE_vj)Ya~~>`Fwsc|9IrH!3ADf7=W~qLI1_< zM>;C6tWA_H5+~FIIfdGw`H?GwC!f_*>1isFra`O~V_aNot#}#uncNSp_=f4@G_c1z z-(Yg`rW)^#nq`!Q6hOBI?NXtKzkA;O!=CVu4(#bCw>v{rT(6`JQRdV84;%d@J-}_jV#ey+?o^qqY_2=~#^pCQ*XxuKx>4pc;K2zgAu+C6krS-y-Em5kBYRNk za2J)XmA(?`{S^Bu{$uyyq_0fh4?T+ZCEA^17?pOl43lRuhDAjiw=nNApD-r(f#o_~ zwlME71lwP`tLaGZ_4GO&Dej9IM|1u8{;w2e1tFci+)K)kKTbKE6d>(QI-Fz{TO_o{xT5r1nEU#aTX;9}zh=xUh@jgfG!0Mhq9%w2N}TE;^5j%nW|7i_Y(< z)X-B_Bjx{JDg4(SefA0T*@f~_`E-1XyCdnO>C({8&=0O#@o4i>`5-f?j>2lP#mdZwo%EIrb#CE;y{zT$-Ji3h18v9dy97Gnzeh$ zkJ?=p&ZBo+2r7_^WWJ5&u^L%>lP^Cb^DS$U`|BV_lPIrqlsR}gNz&qez^r#QJ|_1q z1IiOqm3(=zT<*)O-G9OC*Yu0YJ$t~B#whzhyF(84L83Q>XTEMEt{4JNpA+H~CWMqH zCV0)Ri6Lg!EvTi*{ZXWhHwxYiIdXHm`gOM&VFZ1v4=K8|Ue>Bb>x9*&TS{*{Invyz_Mo99h>0}66FUg7WIFuW0A7VGT+XBCBG`R-_ zJGHLK2=%6d-$rz7lQY821-OxqIs}HDT&%dU$3v1I>mS+C&n2Gi(=j> zGxbze6V?BgQ_kB+5R>J{a`jgh_xk8L4x;Ea2Jz_tw_g z;3Pqk$-Qpc^USTS#8--cCX8O0mMyFdnHZO;K)(FxXshdHphn!S%@<#LcGydZ}eW2 zl8eU|XA5tIa(Q(#s%}Jk%cFb-?-GNgPaMDs7ozcBL7D@)RpBe49 zn|Wd;dV|`7c24`2ao0UB)`(&~_3DQt{-nQk?(NxDKYQd5$=zD8!xfwyEgRQ z*#4=3lf5~X0g|H|tZ-?VEj6$}iNo(?Z$3sz5k|@DOv$Nr7$@^g`Y1BF@9d+G8AJU_ zx;Aw82c|#*Ebn--rARL4*JJio&XH;eg;{Df)okol&SLuWS^skpT-Phvi1EYhR_ zGlD|A3-(@Q+WK6GKFV0?lY}fjEz;=Sy7z{(#R^lmQ^nX&KecnlUXHh?#VTByMd2;e z_L8h}MA@uzw4eEl>RkOI{}!)v!h4ml{?UQsyk{Ab$dj5`2l45w_Lf0sdjH{EEn2S4 zD%FV-{^ydczLL`97E{NN?)3kgkGeO5y0Zr@4w*Y}S;)e$)k8#vxY_8^8%w8@&Me)= zf5_h@%oLs!RtXiw&lSI3{9na-o!n>t$$Y`oL^T*U8Fv~74u}dG6f`&}9@1z^RF*M7 zA|AbuvBR9y01M8mr{0nGh}*@Q;)Y^wun|O$U{T z+7rU>iJ2wlipNf!l`o6!|0^18R9J~<#i93Q51tx&WxpWF{MF!H!AljYMIYyf!p7u} z9B(+1`SE-lW|mP08EFYa{JT>+T9nU9ri1bjEy)4lUd=-7K|_TCB`&(__AzuFvRt zY7JVdx3;~Z{X2%*tap!=tLpPY^rq;Y(VRnYyy$q#5hz*t(HM~rADn%#;NS2}vcNSs zYn`i|i=4BZxy~%76?~NHSbUr`n}ZNed4B@HoeZ=IdfL-lhuE&-Vd(w&wHykaZ8NKM5(HH zjcwFf-V!32+zV3+Kyz^3<)WvTM7l~@__`Rk?g#v>J|wK<5X0wbZ2LyT7s5ZPkWLHhZacql3tvuR2A3GswySyj)WPV z-||v23w_o{Nmcj%kSRSut+*uVBZfcqoUBnhD*4J5U&TD3zNh&L?Ty)LfRx>oC+}jk z@+8bgQ@vH?FO*mHe<3izOJ)AK4{>C@+?>w+SJC9!mf%&)L+D+EjlZ-ciKx3+xw6dT zYMB-Np9|dUt>B;Isr1E=q%@1{cGa3qQti9Ihj6?WX2Q9vG1KhS|4O3J?f7Id+rlI` zZh(Hbw~t22yOO3b3H%LY3+TAW^mPO{xTbT=*G#{zG2vy-RpQ| zWy~)|)=X)EWQ+duSB6I$GS;_!RG5_fSLR{-jvL_t}U)5?WyIO6kx3+ri zCZgrFs1$XL_S2~JpX9HHnbFLROgVFb`I!5f^W*b1rGBbs7d2s?Mt<_bU)9K6=B82K*%mHVvWM&W@p@8{t;97$m-lY ztUs9C_dIYn)6raO5{CR0Ptn%%42_9?_P%y{wpatCuk9b(cd0r8rQbQNlX1V~c!?~w z{_z6ow1=&Ovbw_a8*_pg&d1t}$_y!)A9?A1i7oyPZQn;2BJ{7<<=+vP zbENpK+nGBbo|S8pHNC)WDo>o;q3Jy|de|8nr3#W`Tye5hY`~muKVGNX$(w3L2Sy0R z(oCPcYy7Se(1B^TACGmKgcUv`byuT z{!a>j5;VJ3LI1^pd?4A9_cI~rL6?~#>u*iG zE%Elmy~@+fZuw`(VANj3?^Y_`GI@0*olLE_!7dV^+Rpmc8$Fcbhi>J(ckWA{9nmQ9 zuqDnL*VOrHBWWUg8b9vQ+996*)Vp`HsR-+)q8LcjX{b^l9~=Q?-JPipz|PON{CWSaYVBES>`J7^u=Qs@}!C>|1I0h8d#9 zMT53E-X!T2tZ|VQ8upvc;ayLxlrKz!rTU&OOZ6v6!^!=nPDbWBIO5_)<>|(JArGmh zUXjWPy_1&(xjfD(|2uxC%Pt`vjn=11CTA0^l7!&Nh*b;XrnQ*iNUj0@ zC>D#s17NSX0V||828pHi(lx~%U))WIyE({Hx~6mwLvX_&vCuulGwa{#ms1!?J|s^~ zsyf-0VwcaStUvjAic3C{GV;+|@bk@i4)HM!GPP|XKQ{rgQ(zKWZy&>EQ@8z9{m|Dby{u(_PCikJy)Lvv^heVQSaTkIg)2#$p z#>dFQeW=U*sEaJzgwV}uXf;BdTEB0i&!-rKf?%^SJD4m!e$5RtgF-PMG8|S}NP4Yg z0whD58R3#4G3X7n-b#3J!o9)tdyo2iqxyRT{hspI){Zrr26f&@TT$CBOtdd<5dm{a zqB?GV*4lw<^B`_xBCY=D`TV$zx~8r{t1dN`hg)t!>4%)f>9VsVU2&GCo7`VUemdZrpthh3L4{}NDPLTZ zUL+Q$b7D!lQ!Gt?iE)9e4`2RR;{3$IL<{U)cUtoWq!ExtKpLSmebkR>swI)q&9-Ut zj#1ew#kkhUwPIQK`usScMek2En(u09O_?BjQ_eG_=dM(eHb_kJ24^2jJon(bDJFM6 zOZO2NTi5H6nB2eG4hLp-#<(f~yA~^EI;{duNA`ftV>QUhuZt6un*jA@6>9a=wJOwj zU`*?&`iSS`*gC_^nA|S_JGPU0I<39wkO|`$*B5f5SlcZ&#?>hD7(;q0ll!@>lgz1I zzwa8Sw$<;D4^HjjSB-`V5iKL?o!YHaN$^mAO*xTFHwWoYpg;N;z*667Ba-ca{r7T(IaRZXfd={H`ekd?-}SntMeCoXV}-!I9X0qhdMi}fhL=q4&qs4&S-RQvSeV)M zXjp&gJ7)Xz52g%pX=`{iMrb^ehsmR1PT{dIrp_ro7RHH>!se>QTx3p%Uyk|d-b=Z< z=63uXC(a8i{mCh_SRpI~b;=Wf#bRPoTC;zgjP$f zkWJ$wGlJ)yQ5yLN1Yx;erKhixXoUgmxaw*`fJ9G} zf*&UYCY*gN@wmbvw-dR`6PdHr5?a2uld5-CzqfQfCp>Q8^EvTx!^!nLsOA(Gfes79 zo^~5S^+llg!myKTuTw2*e&{i-a98-d;Vw&jD1NPC7A#1!#6{w2aLWd9ySN8^@Uqyv z&fJA%dE!(hzu8~E)C#MGMZzp0SI82qLbx;ZBlKEaG0uTK zr0gqa+4Cv1iZ~dnWl{FpT{VvL?uBcYuU)u)`TB}>>IH^@%h#@H@`cuyHB+cF5^2_l z?KCXShBbL8WGSaSsdN^!)6U3Q{H$4%if3hQ_15sUd&;3JkLGRisPNS21YA?FBAyz3 z7oR6nD`lP?CFMcKPuj^Y#mZ!4-{8Z)%*u*7lYP0Lbc@ZY)FhMKP~y>jBHF?`qQTL^ zXW3xtmV|t#qs2{Fo zGw?$scr;%S%zhMqS%dL;+t)2M;N8&!uu37;GTs&@GbZ>w zcr8W`Sj8CI`n3>$InNXbwM-F8{i45?VrOSf|AxS==bDatTgnAqjBnYS`M2Q1o!Xc@ z+Rc7Nv;HjuG#TZmNb=X99*9w^{x+%>CzJb|0hDv^xWj?^dOX3}HnHMVX0$xo)6r?bO59Xt_~i&G25VJQ8FqDSBE3B!pYXrEG)S`Kah;KB zTI-+beb3at%D;9?9ipZVlt#2?%6GQr$-Sib6W7ZVTJq$6*X>~XHxxkzm>s?(<|4D$ zk?-JSnp6B7Z7Dd~vThu0IXD{k6Y0W#grhA5M_bm#(X@OTM_aCPG;R)Yw9`J0whSC? zsgI*A14mmLcKZJ%N2_|Pq=@(GcO2O^_E}guL()0;_TI)TH9EcrU=0#@fbI+^-!5!2o7xqa7pw~nRe1GF-X6`u}cg%x4; za3Ok!a8rgscma5B0GDNK zKZx6;WDDz%c0JNQhqTXkON)3B@gm~I=hNkJ9f4)%US}qT-)fy0b6@CG&wOSj^H;k!hECLQBWkz3X#3 zb7<4&)Ajs_MXfiY);myZlRGGwJa@>q=#R~+f3$|58f0N}x*}{zhv$c4^!$Gd{UD&f z0_d;)ub}f56KMO1Az%Efq3k#(?lokK`!JTaKnmTQ4o+h$#5(-}y#Gpl|2f`&f%mWC z{VVj|5)4UAG8A9F*qASVYM>ls@7V8)If$4>alf?!u}{jJ@JyJ=T^JQ0RofDj1y=o; z<^kf!ocK&w`AHX~r#{)77?vI4S+lEj^_o3pO{D*EVm?aFH-vwLb$Gc9vIxa)K`x48 z@f+gV;tBCwothKgOs9E)6EYbdGcnz(S94+}Qw}IJHsheTEo!p2(o9|vQw)5x5$i-s z;ZkpDl$A>jQLK~-emMeU%!(Kvyi0vym0Z-st9iMYwN`$r-8N2XNKH@#TNIX0T(&4L z%_Y2!!KGdjR(PVy;`W}=VTAR7LGu-Fi&gkkeZ~rbKgLZND*l%$k((K$g^LlEq9|;K z^qC1C*ssw0k92T?+u#&DhHT;cj6C6o3|d3nh<4eU;S^rW*eGnv*de^0Q98>tWqa

(J0a)UPzzX&Yk@Zp|{BH~5Fi-;E|WsI<<%o=$)41MGVV0&W*aikkFIPr!IYkO9Eh?Mx# zP4b7B185aRlZmw1K<@)#ZZ3u-kNws%+hnE0mZ_AZua~4oDdnj~Ws=(W_)E8|ZD?|z z9`vnsf8^ng{k8e^2nMB4;R{0y+;&;#zHT7+@ahSIpm7N;w*+HH2-4lK8)^OlQ^ z<z||L*a7#uWk)Xv+F*j`m#r#W`%#E|9qE08Z3>dSI|pd&DbbxMxWl& ztxqFfM7)T2aSKL*LypEonGnV3onJDKG^yTCsq$!u4((S8SJNu+-;bNF3LuoBt4y}5v=KkGGv|AxjYX{`e#W zpT~pNM>UHNE4-Z^(H7C*WGwMVm~HodFlCA`5&kKnbUUP#Audi>hJLXe{bB|B#na#- z8qY+mh*%M^;?o(cpxtiqQtHJ>{S;C!LF%PlsSzt8Rz$40G-IChSL-2pSp9;?KLu;K zouMXnjyB$w{%x0+c_3^S*GaRn9`|*le@umVuya+NRryOnG&B3=d@hD-(qwkBfYYea zFg~B6@~2C|z>Q{R;%m{;Ls#)h>T{SS!72S5l5HB>%z;C~yXg#h;CG&i zD0$(mN>w*K5JNnd6~=*+W@eDB&L(DJ1{s$@^aE!)tw~~B%s{J-N0d^POl5Pz0hJ%? zw2_6Q88Gx@q(o+^w0Q%xc@wnR4%+PKMjOP7h!+tr?&y*+QU+&%Ha+wBY11uJqNEUM>)%_r_zh^MbXF~^BY!=00Nk$JSM$468jFw`ImUWF$#EOU&5i6Eu zRQYIa^xldb1;{ZQIp!e8+^!sm6%i{UR-BuWD)qH(^>V_WkoM0=yBcY^uC$015i25A zEwF3T+9>ht7-)4z zRWDfT`9Fi7d@$&FcuJ(I-Zw4L6rPNk`bxP;mn&%h0mqkMtu;XMcuGBYVDCZq86ay{ zCdTwdtW}g)IZt^UgB=QYcusVVh#Qs2I;h8Jc#tmtER$v(lXsE1dF&*`Y?mLnj9p7) z%ceW_R)`zhcFJki@!@v~IpX-f7aL>qnyrf5KK=JxmcPhQde)((hjinBKbpufv-6tT zI^^$|WZ?i4D;DG(26lf`w}UjH^2oQ+hqc)oB=FbDd!NG!%gdNa--1rLZ^-{v+w)s( z{W$#5IJ0YP#pbmne;Vq8=Q`L41;OMp#i4ItSI@?>3V=LB1!Le|?b$!{CJ5EEBy&5BZ@ zCA+G}JhdgvCjPzvU5tpFFR4=H3ssJ2>}07>!?Z%-3zde#_u==j!qO5e z*-3s6!>WK{zS(t&84+g)^e8g1BVl(kBqg#_YujQ}50RDd(6=)CXWmpFd zeaLHrTFrte3`A zdh&G=-6tjMG$Y%lQJE@jU?!cI+DsDrL8f<|#__|uEO~q2#~bEuPu|67*eyxg%~YRO zCHo`|Qb97L1+QKY@~18Ky(fFdL~sb&Lws$x+)NGDT}f4FPx$#a{-aULt@-;Jm06A7 zb*+b7?&fO};?Z)ZBx!izj#9(iDM>m9I*IcS$P0{SR}Iss3||TAfkqEFo|m|eMltH~etHp&=-K4HBjrk3=yiv8km_HoSq^gl!+w&J z@P4M<5wA!EQ<{1$jaq>Ad=SrxUxQYG${wbw~ixL4Kct!$AV zhXhTYj3)QbV-_$P7ui4HNRZLHSR#MKqGY0dLFZ!W9J7(z$=NxPd$8&=^qheD5O_-Z z>wgo{MS%kIQx+%PQAHf>hU#-nJa$@?osCbn$?EDWb|dvu;?VN5H|${MY$)pU6fR3V zd6Sg%sgLeXJ8%|Xi|7>U-og#tyvM`bPmG~)W^(TuHXJ2wX5Pl`_5YlUn|Yr3EB6m> zZ@Bm3n9AY`AQy$3$S0gqgqvhxIQr5E@HMhpQHqsnin6#FxLc4i z7}^)58;NwI)O03yXuR3Q0*@FI*#jd?oM?d;C%ln*zzn(~CyfItgSYfoOOF5q%O9wT zQ>}wW0~Yy*#qI5qds&aoGa`I!%-G98n1wW&&9LLN^ zJ&61=sCP0_&|aOw%wD3cCR1tis7}R)8C|o9@|L3Bzo*d-Tas$dq{%`m@Jd6wRWbFK zj!Fb=a{bF_-S*Te7~i+1-Gtxlw1g&`JR)kWvCOn?=vIbiC-SClTfQQGiF?~9@UA4# zKaJ8q%y7=gV5f6nFi9fsFkX1D5nuZxb+H+%vGrTM8g_PuJ!O-#Pu&AME{#-^dwzl) zr%f2W4br-J(M`NoNV3Rg(TwpI3oM5LOGv1S*=064(c|I}7q7W`WZ;9=gxNhs7`?ihZO zA!@Hw2>R>3SZ?M4$b`q3*WzDt?@VIr-@B>6wJ|se^b2X+{K-AkOeXq!~=dmN3-A zJ-sVVVkdNz$tDak#ox%wP|5X zd@U6Gwzp}mwPBW1>}}#ww|dPk+=Wo^-Y^rb{P@#paZb^Me0@v(Armc9`lU$9PXs^EAo&d8#&Cb!MKK)QoG?W6tJRwJU^;i>#c*;g609T zll&Sd3o#f=tU8urA#ro!U{eI%tcuU~%_@bMRjBPAieK}yAb$@?Lriwt1HW*>V9c5{ z1L(coDGo!KvA`q_SG?(7yoooFZWM2lofyZ?VZk(}NV}pmoDgR!u?>XYvMOFnYrx1h zV`Nv_vT_~O`ET!bMATI$#qDTbp;efoji#IqP7L3>pk3KNWq>b-7*aj)h1!y^b z&P1|<#!aruaXCaX_TX4k!Le4w>*-mc51^ynXNcJv{;dbGBhA-uhNIu?_O%zy+a$q+ zAgN zZK4*XRvKcm^pMLm+t5ko?($jX#03O(=Maru+V@4W`{U)$mdnC)^q>cV%gWc48$Cuz zi_7CH>7mUa!6PsS5km z9)x!UEIp$r$LAfi^B~syLCI@4lOi9Mh_(T=6X7B34x~MDv`U^YuZE`82b#j$Nma#M zs)YR{gwaQ^k`Yd%L1_}Z&L1v!(|bsV&~nomESAm`?C>l&`z>}}(7u}=C+H>zT&?Ze*(?o zd1iF%jj?e!Kj&c7QRDu&BXLIQGlu+V-a$Ug@*kP~gO7yn?|&rF?ERw8Kcf#aWl`&l zb)L1>vXS-RMuqa9z?&?~6B*KlY#q?|!ENtKdYIZkQF%NhiVscm1h}CrJ-_3 z#q5f2Dn707Fq4iy(EJzm^sDydVHl%BC6X^R7)z2qQ_HFfe<9|1bwBjjOJQAOn{4W1 zFP(4f>Ct&DD)pS@G>b(We*wE8sEto0Y4cG^5|v8%NpscK7EUq)tYyU<)>}{Vmv~$K zVdW6^gi6>GYM0Bf%QC3W=vgcOy}oBDOh3aybThI(R+(jRt#?2F|Z_5k|GZW zC*aJV$J%JD^c(HpPbG9}m=-Eu_5VI_Y8SpV2hM5JFqTo4g0c=q9t{?} zrBNkR_H2|*nCg2&d38@JdD3yhdlqeue9sc%sc7TG_bg`D`?x;9wHp^GgR-$6iuauG zwgnzD?$<^a2_INiVD^~?-uk{J#cGp_^y7sF#v0%#6qr9*M{o9*)4e zKm^tWBB&nF#3Nvdh#-1lRRB;6y55&3UN{#l6^x7W#>y8Nwv^JdfXD%3&Ht9XI9WWg zY42ecdEe3;-o98C=R{=4E&dufra5vPZimBRoy7t}l4SgT%S3Sr`(awJD^>o7@E{`?(|B3GO$} zAk2+03-cma;n4`2@K}U2=y31m-e-D$YWikq+t3R`_uG%yPuPF6=ZkYAio|)K?V}O! zvX9WbZ3|Mq;=bojbC&^UKHwAr&f|dd#8q&}|GKJ2(Qb6Y1}9!E*Y>(nD@RFm=GTkiZ^cXzax7+8 z45~!+1T#Pwj@;=ggc1B$^(3ociFz}wOU8CmZt7bX8G1|SoRO7wphPD&@?L_vCHy^{ zsybb9akD3WOR zIx}JLJ)yLgO(hY(CJgn`bjWmSnYO|upf;LpVS}z02o6T$)KGr}d+7By7VK(VsnB_r zIKct7yQ5fJff*;6Qo`cc8SNV4@~5`dZ&m0#3I@KTl;>DvCr$-3gD+#XO1w$b%09}_ z**uG}I^*Z@mEe0($;4%~6XBv9Au262yNsT$ilNoKsAM|pj(GZ6*wHPJd>P<=*dcYx zq1B688s|Tt<@H@ApR1mL=T!cFPk7OM5_F+kgu}M=<|su%eRnxsBG1^s^OC z7GEm1)ki6Gf{D?i&naIw>g60cckl|&fcfwY_~Htw)a+Uip_OtfiN+e8H%R+Eb!tNX z^PTN5xU@G;V3|^yRhohonFSGK<)hR(K6*XPzOx^9`V%0lDieP;gP zm7&zfU*kXEOTz0_|HLxKI>&2{4;)h+*^ce%xI@+2$-krUL89eF=1V49 zScF-&C}NCbn4`a=mxKK56|pEn78ga_s_yi2JV=~O8#5eIJCPdm4z$Rk2<+~OpdI&g zzE1!82zAdg?E#mOPC+^w#spy*=5{=&bDJrSnT~~y)!!`?j6@?(Gr$b$sHso3`Dx?U8NNijQoaCEm3)SG;L!mYBHJDq6eF z7)#`>;%Hp(Z4#}xQg9{XO2U;`jCZ&aaE-!c#g&398CMdn#B#jHm4Is$E-S7ST*e&6;}$bWL!zO5?{f4TnV^F;j-dN!Ig|F z3D;`Z=&g8*YZR{9Yn+uf>J8+=y9VrbTa8_BZ??SCQYFM-XXvRG^1-7}Exf_$J?#T+ zI_d9or+)6%=MZ+n5%4K&S2=Zpa{Bw72?rKwnH=;-GanXdhw~nY^#R z>hpaxD=dffy#m_LVsPcBB52>tW|T+z-ht(0Q73QNqmXiY@;vN&idY-&6qiMWc(R2h z;Qvb_o@eM>w6(CMX|PB}g#RTZ_r(z;0p^KIq023aAg=0{Z=8tb5KB7MV&DQC?z{PJ zO~)ci5C!Ooa$!#juv`&Q_Mj`rf8r}-eE7K(Dx*%MHRU5k5mM+lea?iDpSce*$#?Go zza@aOG(xItJMl|XAY@0Mv@ULECQYA~L$!GQjM?=R=BCBKOD~l|T26#ohyvwpA?-2)GN$rF#}qR zyr{K5y?>w$TL^!@rxVxw^XaoK|5QDn=zK9sago_3zpI|}K=t98e`B_tey8i)hY(L2 zJk3Zd`f=8UDI`mfA4$(xk_SROqh!14DONmFqlT7ltz52p6%U_z!xU0&GPJX^ic+h##Yh@F&EF#Dj8+Qy zT4;KLp}yl6@?~+PQhr!Q?#{P@J~&OH|4>asDZ-FKlVd()v{Kf> zLOE3-Jyt7+PXD4ez2Rr2;Y}$r743;yL-&yI>oU4;aCewHaY_Z9ooijwKjGN!&uq{L>g0&afp7%EtQ1$=7va7L50c`G`yt#9;eOKa zVmi5}Kf)$yMDYNG2Ou0GjVz8tIHB)#68T@G;Y_I1;<&^kURSYT87PUx4cL|KF5ZwO zcs+;-N8Yi;vXH?l!u4#dm?|pb^{gyruw)bM3!7&KYr~syb!+7#>PT3Rem@G@pAG3) zq$6HH-kKHg*0fu%Z6QC26S=-l`J3A+|7}UpkAQn%;G9{k)0quy zveQ_^z6^WGRO5Pv=3+K7HTVJVPI$-dOxl}7C(g2fM6+@)>4W&U+6OI-`C#w5Zf0(-|5wesh?pwMYvM(?ltIN@f%8qaDzZNK0- z2hS5&+EH#)PVCdYCUnT~Avt?=-+rt_@clj6-+G5(@55KD(ff~mW^p`v#LcYYn!w7g z9Cm&aP6|?K{B}}LC^IoSlGzNK(VMVOr?dle=TSzpcTKQn|2g}5qta_%KwV9E17wQp z(P9}a#=5iq_dtm}3bh!!wX7)q(gfI)wXw)s;w7GU@h@TT%0$*F-pXziZ(}(=y-q<6 z8lmH?*L$w_h}MQ8=c7*X7S^^TyLF8^tBgzJgo$iz(YQo>OMtya;*N26@8rv^bdmzM zq@k!hk)RTMCqV`DFmAG&^cjmzA%<862`H#F8Dk~tk&+GObc>8 z&t&s++E&Pwtu*eIrr(0odoHl$$!m(l-(x_%`=#3Ua)({6aMULAd3IZ#SEpvRP~p&N z)Sj%!KLZ-g581qSYFmbcwTlkDCL1w!cVO&p3Evq_r>bc+>4~e+d(!8>MDVCyJu%Pb zL%Y52f&Gsf_MDK!md)fu{G#{&sf*?~jc7HOWmJ|*d=s@3$B(kc7dck*S)VJcm)>lb zf+Ty^1;v5zRw-HSuTF6RsQ3h{t$Hj(_(?XSF7t|a@UES@c4Ya;wIjpu#{Z<}COZ&z zGO4-K>johWwWCw!?rX@_^64pY2KE*4TCTLN{u~Rhn66PJ2m<7Kz+K$co7DP)n6CWfFvlu++c9qXLL9eybh}*dalO8dN4S^43S-n%do#m`$(>TO% z!ep38E_kuG5D+I}{1&0iMeG16Hr=SaEIHt}P5ra1`K8t!&HA}vV`th>n!i1CuBv&H zg?P)*PqWjUD0z}~^5ASSjg_5AY)4WjQzn1ALGIHLZHZr#A|$z)l<=&WSX)MRh_X;R z_0Z+J^cvCmE3_Ys^tIDJL^q92hesm1}ddLEM*V7C+9s zlE1^7?I})RLAzLtN7{#UDqY62g69D446NmJO50O6_mttg&&#B#l7H}8%pwzRCL8iF zaHu%8;sks`P`}|UX>G&USf7LzD$%}%51BR1G%6&V-@2(&m(@O0eZ+&u$ijH|8)O9& z&)}M0XfeW;xHGB&XIbsR$$3Y6e1DDh1tfH{npH9WnY$J~YyR1rybH;Lo1_Q5#&ib3 zsdSPiN^C39i>|wY!)~O`FNj6qgIUal5WMQp629%KNCFz^S;x{ zeg^xv(>KQ$&~wbP2_A{2J~7ef8MD3QG<_%Fi*e-hpq&j$;i<|QxgDonDlW`4t_(K6 z?Ho=P>`2NJ4rbbf#!R+pn#%j*tiwFkqEU&%Jj23cqv^WEnp-rhh`v(535Ou_9L_9H znobWBeM-a|L_fPUPE z!3l(a_F-@m;ZrIGJ>i@mP2=9j6Pu2my3kEK&hF|}tZ*#TiW%TVDK~jiexC4C<}{mt zy6dGCAgq^`im+Z9gYapT+>VkD13Lxb4um%${0qWo5MGS1HIX09Nhx5Bwlw(6VaVV2TIkD)gqvc<)uCDcoJO_)C zZ74MxrNuhZ9Jh4qQ!6E{Ep@!9EfwHrkqYH=z)z#qcg#$2xZKo!q03SbRQEu4N}j$p zCA}$=B^r?lSh@dVoZjXM#W?R;X_bG6w*{@d@cgJmgd79m|3@_Z39Z`%Jak&@L|CT; zkFZYfsa|c@)uX3Z;`AlzCs(xZzrd=jS(_VG%?8pyw(na!_l~@E);<0K?qzhQ5* zHZNf6 zacV*TroH&~A*J&3d3;v|J?!I5n!TOQWX$07&4pvf@YT1dOUA9xWKTr>W;8$wF+&Pz zjyw|_rhF|;R(09^>Y3~Ry&T_D0sbFnIv0QkfCl?iO4u-Crm`;hZjfe?ih0fkxm45U zh8;_YN{Sk_nuXl3C1qz4>As&a_Iv84Ot8|-x1XVYcVKx!@hAB1gAh%7smXt;3jS0U zFDJh)_59M{594UPc>NgqT{eaj#-QwUxV{U4lh3TdZ|a%A`q(p^kj5GyF`4C%a7%PC z=3&2t-c^T%dJXtvRZ);Sf#DBHjY(4_88jg6bwBfxOdhDOLDpa6*s6Xjfgt0|IaoXg zdfCBLs~t{~h=`sIOiG_D%y7;3oSSkd=(fivZ+ym7_VL$j6>4Vmx*DsKpU3{y+7SJT)i)C)Z3Cyt_$&QZX782>ADqi4pHYo zS8G-Dc`lm1xk0qm_R9S*4yR-ON2|NfzRJ9>TDONkrOQHe_O#|paS*<$hs1PN634J) zr=UG`w+vT=iNp0>b0Hq5IB__%xZxVK6Toc8l#8H2j)J}a@IZRkQde1Ad8qcY%I+ur zYj%fn^s#ToJB4q@lYHkpy;hiby$N1BnneuObn>_Io$ER`5#RWMTnG8i^vKpZ z!d}2U3z$alQSjkonYCFI(xjjNnZU!>MGH4%(Vk|LJ1mEKeI~xXg*}ds#N-A@L8qfy zs4a!XfTDb;?wY!9g4%{`SMe0{Kz}Y6KVBY`wH5A zX0qc!*g6*6Nm4O=pG#XQ$;bO5jBA2acBeM~_r7Iw*J;6!4HSxn%?!3>_^wRK7aqL6 zNO@T5zWjY=D^AYVPWb2XZ8pc|x$x^KeucNhNxwIfj7Qi} zk0ydJ^%Wn#4Y>-Z z<@^0lDsA-r$%mzUNjrJ<7W88}fpy~b`K>saxYa}Uv>=mv4%RBpJwpDO`d1b2lTMxb zy`{LkuAJ6KEM7~6xngCVwdF*{FTtBSPc#-cf0F)faI9B@@k`JbGrzgz!nul5^^mja z;p_a!+Hzw6@b^VZ}PEmM(=j@boo~r-|zBWAztv0@rv-@sGQ4X)DbB2E(N;9Hyr+^%TeW9`NS?7&QW);^J`6i- zuf%5+qvfP8gzQyqiUXwo+4x<*r(r?9%|m~hM|Ymuw@I6`cn>7isN9pVV(YK{jgTwL zsbW4&d4~BL&W>)txyINb>D4gTcBUqDeCWetQZmg`g&JYS8a!?9=LmHr>#nL^~*IXEte#{ z$=v*-hG>8chopdXz=huq_NhC!F;* zxDH-eI{f2Z@Grx9-hKROZQGGFM6JV4z|~@?4qE%u+7Okn4f~=075>Jq-gGV4I7XcF10bk>In1uCTN~@#Iu9dS%>!Osuro9 zwZR%e81@0vseT#`(N@|YN-$Ps>(INmlr}Cg7O(Qpp!Ejw-`Bp8H@6|5nb&YA%o4xf zbYy6dhyLK7E|uZ5a(pERvg6yRHCY{q-Z@_EL5JTUCz~ZLM85mv6F%-tr|Jz!dvJKz zD(q?x_4oHZzI|bubV6+~Ss7@r0o?oV)J8{``@2Up+2(4Twbg6d&+ksLr&RycmQvb` zGw$2!nCupO$5XbSCJua8j#DNHmA+{q3x67^2!9?4+mK@;!aESA@8?*$Mywt?wQf_t zoxL(~+Qiwe)!<%InXH}hpu=&$TKsAwL-@ws$pIctXBkQJ@cX{`uxFe$C+l(ede5sS z)J{UaL&!%ysp~hFZ)Wjq!}CZfpg!s>#X`2g3d+9I-?R|@3(>wr`PZ^xd+?UOvi=oX z?J#>+F*P{1;zG;5n~nxQaE5vdeFMehuFH9SiW^}GVeIOaOlabB8 zfQqnq_n;yVkNtmztL`5`Ev2%VOu=}b zixaoC*5hr=Sy|xGZuXJXYCKvEp{C!vwVM83s7R}D)Z9{WZ^gWdx`5Q*1 zj1%-U`Sx1%*T46X)q{6Y`A!ifiTucZYR@lFCYNh7jmB^E{=ZULPCIc^{gKwb?#iJ(w>a+xJz&*HovJ!Ttv_Dh zViQ+kC&9BLM_I>=9C^v+=`Yb)|Anw(B`7)N_%a>7FP-XzPg7Qu7b`vERw}EY|E?M- zBaaNY3gFhYwBK|gc;Fe0DmqTu8vdNNV=0d{pHnf*K|4H(RZhJfwnDde0Kyuz9UN!} zgnG0Ci}yCf>X>)$5Bm6R@8%(V5?{4>h>5U1`_oS;E1Em6MGr_hG;TG_sr{ctxvNGx zyUL~2Y5jdfC4I|sQ?H%9a7spHu++EW9p+_Nz9;@a?7ew>6vfszUNsO%AY_q!%_Ia8 zAS(eRh$exs3MOo_2qu99i6DekK)lRkvQ5?*Cdq&z5D+k;0^${1t~9voRlp6rmn#!M zKt-6yK!R-V_jFI!bU^Rp?~mt?_xE`RI`f_C>ZKu$09<9c*I;Rav!P3u$b2})Zr`-XbuJ;;XY zUwaQam#4f*x%?&-`RmP1-^4%JVne&yOkq@3_ybDrl&er+b@rs(slRrV6z>%<))eR~ zDYZ;9P%PG#&wv)L0ZofcR`EDUC)OZcPe1I9e)wC<3*e4pl89DYY@o)rXTuIV8ZRA* zy5cw$MLWpfI9|Z|MQ?=Gv8zJrwLKV?EiLeVyQ)4EeWO4cD$&}5^7V186%_u%ovZLv z&+R?oOL~|@lvjzd5Nkn|+xBrjA>y01SEQMC?iOpVBu%Q5MXYakw%wu7_apFBtfapO zmWhZOTWkiDel2P(7A+i777PhE&BH3aCrTVGN;09|Q;uNJH)UQ@N^y{rZG~NK9^&5B z-cDW(y54Jrnli2U=nZ+a8X}>tmAX_zuAj*rx*5`n8AoVcLhX6St?A$k-&H5!k%??R zsTQB;G){j<&oF%<>AU9=LYYp zdv`=G;+*6SZ~)~AIPGgR;FMB-sUpExPrXO&4b;YaBf3kCh*#8egVSg>#uyR1925*T z9tTf=eg@SCX#vg|QPMuZ3C~s|P+Y&t@ZoDX zoys)3=$r$2I#B(llb(B5_z&-nvzkE#Jqo;`i_!oaPCtm5p6W*(yUI)n4n?!uLpD%4 z!2`&`SjjSR&{4~zK@Q90K~Bq*L9x+#2Wb*Q2MzqJ+EOKaBfo}y>*JLlSE^dus%3Gt z9sZhTHte4!kY9q+mm1ETLaN=@1*gU&LND$7&*vya;ZJ@&d+kg~ofSF>o*1Rr(apX; z7k}s7Z*WvO=!A*t-P3T^V4E<=aM6CcmO^b42U%>B25qrT9<;|cWsqOx`4Q>1M+fED zrVcXLrs3Z7L1gJwPQf+KZ{duDCDwiNg&ntIz#fPRk{yPpM5hza2B|-=n^j!?VtRgjwyoC~$f> zxAU}nwmB}}^Euz~v;khhl+`}vGO z{1d!1Qr#(UCY515#HIi2Fjx!0%lsqO>3FxAWc2jTR^v;K=j0s*st=|1N~`sVd6S<; z96hK$$=^w`4xiCS$|qJs&eLkR#a4oH7KhR7aRPJ0|85QKbnou98cq_$EpEBw7_`9o z_}mz3303+@Eul(3sU=kDC$)qs{iK$lohToqQy*`XZA$+p%Q=1BvdvcDN{Ydem4qq& zFP{LVqdmPHmpq=!l$tcuokri<@vA4CWNW0+^ChIYM{pg(brjcE@w7Yib$l^)OumUH z{^Q&DBAleXhIC3MwacC~$ybBl5LiSSQsg*y@%ou9b#Dtz z+5*Rgy59u_3s`p@={3eI5Vn%Q>1x}h zg+#k~$_QFH!qa0{X~s15D0NJC23E)PPv|k~n0^ab9n)rDbxcnOR>yQ7Xuv2E{mGKj z>Jr8sbp6x59f#BA(04MMl$O-W!TMGgz(1ZM@1pkVg?2iQ_x%pn_qa~r`ZunB;rb7* zlekXd`Ta)#|2hLSc3zD4=Gf)`yu_=ucD5Iw1B4| z_pZ0A?V&`s#5}W(R@MR1)=Bi-8tC%UDe+rUH|u@S4}5{YZ zEmN<=fEw#TjnhG=j>tQEO{kFbEJicY{@hfeP*aA@6tt9fO}>>>ib}lA1n0Ya5iDF1 zda=@$5x-!tdUtQTHS~G49@TI3@e+^@Y?*+q&x5X$~!8AJ>*62H2eT zZ?adRJf~7C(wMK1rQ%B?h~H3p@=clR@JK$Deym!}#_3_mY=S-el zY0qvwA5r(%+0wMYzA?PFn~imcwKt9|us zfU*L*l=eHU?`qEmd-h^*mK1mCv;>{aG(5PGC#6pCAsa(CxSzDgxW!>K{)5l+U)-In z&e4hT02iG^rKbg7$`orkW($lP-Htb~-5l(dw-c;}?<6S~iq?YI{#%|&di zvC>}hFNW?iou~J8?m8krk2}S%>HE&Z#ya}zSJ`Q#!BL4hPl`3z4#pZB8|v1}mLtwg ztRF{vVHIilF?+5UY=^MttJXfzu%e!0>LpOhqolLoc$d$cg;iX~<1GhcR{2M)IyyQ^ zWb>t*dru7XnLTO6IQWgeOd4w6tvHH#UXry1zl#54qJ$ZMo>S*~rO)cE2hqM#EcK4y z_T$eFP)_RCO^hBM{pzLn&PedPMpkwL?MKq4%e`m9l@DX~HpJj<^mv;@$Mm{((%I$XC&bnO-uw zJ3CSJAs`q{Dhv)i#sg`7sQfXFC2!ZI!$s99 zmqi=~?VX=JoQFMVi|r_KI)ap`1>Zw&gN{%j`2sZ9-a|kB?P07rTwfmUPP36={H%sNzNxx0y)JeZh)l(q- zHdRj{37B-APomx%ptkTrZ z7;pDLUZzWbu zj!uWS@;@61n~y+?X=eOzHEsr|bsOye&l<<8eVjcHDKi6&C4&(*@*dRwE*N~wIoM?! z{FXC+aIMoYc!LYpM+e6{J2^|@vt2D9iwqpq27lih(+YoU=aVJVx+R`9l))nxbzPFK z;_m8kYM2B~cV*3`r8Wk)J{{??GHBfeK>-Ec8U(lv@k1rD*G4jII=y4OT5NtEzdAd~vd5UK#EF>u)w#(23h_8(;fC}?$%+l> z7Z>GkfM4|t7uoxu(?X^BFW@`aMUr{4;Y@qN?{S4cq&>=2&TQ<_D7qICXz5XCLR6gj zY~Tq{yLXPPzzRj7rnEx+^1sqlzsiIJgZ1Cgi#iFtC?D4}X(QL8ePd8VddybdpqyXD zhff3r$2wS{+M#AWMrLrG9xG<`EW-^@YFZ86!gVvA=(@#*^)uGdxn>)%d%atyT}f(J ze#MUG1l^~)rd2Y^U2AP=dt>K%CpADrY0WiG!7 zE^L)-$#6YyA@z?Ajt+=sVMeQWKe9^mmc~D#y1#R`Olu}~*ej#*qq6yRnUg&meKqZ`-CR;q;?>H%NZ4bd_UqiBcuP>Y+NLXl|H)4I4QN-9hsd}1OFTJjO4!`6K*xxF zBm0d4cM{;ph|Y2JhBd(C&?%uw?ItwOXui04pp)eIBl%Qb6sqpib(X`tBvqqAiSrsS z@46WlCcP(Y^pjLpSxMaBPogJMx%!xfV6EjnVGS%3P>a9B`xs|O4>2yq zj=&cy=$wUe)?7QLXcytHN%)oA#=%m}3|<#7KuUxasMBq(bWb#1bb?Bs+6cw21` zAxfduB2ep(WZUX`lJ?3-KTy$z8TBCeQ>-CAh=rZ05~+mtPb{{N5%Q7D)zfO~BXIK{ z%iMen?&xuc)^s;{`8k!NUIwl15vKc1y|H%uGn#V|yUMFf^Kcfw*mMKCtu$tfjrz07 z34G=J1cjC0jG1An=l90i%{j0q($64|@-m}Q{;n|Q%HQQilZkBa3~;>fcdQ$|leeVw z%wDzE;6r8+^fDr9m6KcRuN37Q;m`Uuzx3Fh6lUDSBOgmh32^KH-x0r#GO3`c=knz)cUq;_nV{l+m`fcuzdqtoz)X|};B`hr0$@cWP^c<((wVdqF5ij*t z1KFga(wez{PGA@z?|z;8_3igSza6|#Q~oDViW2l7D#gz;Jf%1*O7XK?igUQ9mf}ZX zs=>)}Ddb!Amu<79dtB%Gz3LZSH1{G(Ut^ zHl6m237Si<$rSDEfO;>NtDLu(PIEccEVw+J<-Z0WznIp{V4K>EDBK_WB~i`~sZuX^g&0TF;e753eyM?9t**s9r<@l3n0rG`o{xQGwIq49 zjq@3C#J6(P3X<$nKTl6>;42EV3P&FDgdFEV)lb=;wb73I zM0@-pl4FjEnE<;uv_H_mN0r#+nWL9AGD_ve}@t2Ht*m z`+L%%87&V4ceRAEG>(<%HLXTCheT)59 z$x~wV?49X5&q~CP?B}y*txfSiy#qVIQgthL*!<~hQ(DMj=ILaO=0xfj?mG)a?1Jhm zN0b!iB20;0TK&_J$%$RS;Fc#7%rI3(({hd}=_lL|(NV&nOu5a>Q zuWIdtQChukdBKyZMb@+-yRe1%7ITgHbu%=gn)sN#$ww8YmSmJHDM2ooYA&?$xQMq> zMljL!=#txfWp!Lwt(!U*p-e@E6=p?mp30@q4@OOGlt-poE*h# z1#R=&X3jUJn+r>8UZ_#|23lKDdrsOlY?lFj!r<{zf*mAMg35+u;mwH-X zDMzd$7@9mWju?y^Dn+1)0bx|l3n|o&Ny>-np(n-Z0QyIDE+@Z}S((h8}6{SS6X&!uzCk>!kRDU*xG_nv%&(XTndPgSN}IJ2nHX*IHn`)?zyW&$-73(q74@17UZN8J>kz z61K7u9*tqK;L|3a#}lo`2c}w23?%E*TObL40p46U4cubgJaCV7i^lUf!fgn*A>6iQ zpdNX}Ag|D_16$wy4Cy5*eyN*26R_^nfp@Hztp}~Ut(&bC*0t6})--F1HNhHf^|!Qs z537D$L6%NcoA)nyD9C#QovO0Q!9>#A^7GJ`Q6-oiH@ z1P6>~EVd2IU|Y|WCzKQ*TQ^1He$!DEV11oAEPLQLVlQLXeT=+5@9S*ZZ(LiDZi3(T zH<@9!!S*K0MIG*8Cj8yY;6Vd)d5B}K|Io;z%?}^qbv_$p5bgO+}j&;4p%P_)i2)7~J zwjM32v@@L(zxx^00&=3Q=`#WAKE`wV7->={r75a1?Jr+zI;i|r(sfZ3S8E}wP~$(v>#Rvz8f-Dl@g zyW9_r@8=v&JscD6I_mgv*71}gBWbB%g<=b|pEsV#Ih}eM_neL&XEk7i)4jI1N7PW6 zpGab=oJm&B-TPI}e5?=Vw8*rClww$>kL_L}|1FjOmdSrTGEIM3=i-0%U*gGy&OY|# zp1f8W`x@s%9$SdL@@CbvUs{06gloK!c>U2Grnm5Qy(mF;Ew8!^H|B<>H!hAaIp+F4 z-K`j$KG|}*&u+L;6l!RMwH`;2?}l!q6;lviYAwtu>WlY<#XrN1mqWKS?u{7Xc-i-z zZnR%q9NrFh+TqSWL#4)J5sy0l>HD8Zyf3zbRG5vsRftBjBy!ZZ?F{HXfA9GmfHS~buDam09ksLxk1*=OgE*a^@_ndYJ;bE&NhPLNawARV=-et(PPyq|ZmzMYFr;U8eH{FJ7#!3OXnkAA zTVn+s0_#0wnddX!8ahX_^bNegSW=j8EX92v-0v>+jQQS0vNfd^^pIbX>^7u?+xIjS z@@9zBS}Npi@U2a!OF`#?cl0&&H36+re|ktl4A3;UcHdZ1QbP89n!^jqbNTe^H^;&I z{3LqzOFlv_LnADRl$AgaUyj*Dx`G%TrF+W|T0v#-Mrz(op6^!NwRpX3VX-taw`;}D z9y{CYJlx^y7VTuoR8tC~whzsqpF@U1=Z|YSdA@9_k4I9E*&32+F0m?gnlB9?;hBR2)>G_!}NmG6T}%DI<6$n2t9(A89r{^v&6JwCHBZ+N7nI?(7`zr~H)Z%N_DSA0W!v0s zPj92ssnCdqZ?5MP0_tKl&nP=6u~+-!G(uo?u!sCH%bt?ec<+p zjt{~ckD3>qU!iiE<@2{qXKJF5f#T%tFj@1EJZqM2e?dNvsQA-T%B($s8Y|B7Dm<>1 zqosLAwfp)E&xRa;tg>!Sc!g&}D~+^pNH*YC`87i1-_W$Z#{b1V=dFL|?RPfc*~m?0 zm1W@6ATy!00C-xUEyg|I2E11M&NH_y-&U~AzOBQK&#bIs=$dB5s4yw7>k#_uYX;arza zI$zzv?MJyD-kO!u)^Fmxe{*-6XSl8M()z*NaN)?8?N50HT%i-qe{{Z`+W18Dr_ncf zcyv7Uq`r4c7DLUDU}82mIR-+;LNjJ9FO&Dv==?`n^u}mvC$h+@0vv7d~!cAj~3TYpJCx2c{kh{cRmWp3p8=Jg#r*Y9_qW-d-s>b=!)X)AS=^hYP7sN{1sv||l+7jN>vzmzn1g4fEc@94)k3vecB zuS^A0eO*}Am=%;lRtFT_>W_HK>YlQV9HJ1fxb4m~@DE=$oGsXOfbR`x22RR?Rhv@6 zU1{32(%gHffxkEtb`YyiZ9QMaXfNe0r>Qb{)GeGr93&>u|EHz}Y!W$k|sc-5f^N$`2+Iz2%PYBeIlxVK!FBB%PAW$Ea*3`OFMT>40B%=R)58)Lf=(ayfs*uYHgg`_plWrJ?Lu zt(2eSX|hj23w#Pv>8X{vO5}r)SJya6c3^~##$)pQGt=JE;LLYKD)xxpgA~}OY9r^; zCg^vZFiMend*=pvqBCejOhuSm?@?LR|B(enYAuraePKNb>C2I#6Qwu#1@xspWkbrS zm&m7BV6o-~S3H|PnsFTVH%Q{w)()*8=Yo#U!b@r*`0$Q$`8wHK7#d(Xk}M@%HKScd%ID8=m}}{6mY6j>_t6~Ij71`PlMN{8fTul3U6+7>h0Nh z@22Sz-Jq1Ybe``&Luvlp?nd*Yzv-ckvJ|aD>mjlk)4ATSa^mArwI}dyB)9Bh?+q<8 z%+s?Vug2WlyS6vZ7sxxqpfbDCjE?dWic5MYUF;o-yHuaFeQE1#_vEk3yMlTrt1F%` zmRFB3N~OZQzRaiUxe9ZI;`jD~`MSBh<7QaR+E7wd(g$ZS4_mi8gW%%|ELBrP(pEL+h2 zSub<_f;7deW?DLIaZMwMO;OJp**9abQ+=k9pTQlnPF#^@zs04Brwt~uRp4Aie}7oy zhZa=dKA^l~v6_-G@Pi{CAGvqr9fTbT&*&pxyi@};7X~_^M|!nWc~CKNdsHLk<|24D z|E26^*?GBiM0=8CYNmz}O-qOUCUt!K;w@F|$wl#^bzruKCXiJVqAF@!vTCo6tBbs% zY<&%lsCRiw^k3R_CC#N@W*^`*TkREmk;;=%IgQR9#T0Ae0k0(+1mfuD4<7a zr)4Z8QZo`P;5DfS2SaCD;buMn6<5wCc;>ge=Za#v{-exfsqIsjw)R8rse9u+b>C77 z>DdR~0X~x{*}TUOxa+PnPB2`7O!EM5km;UU&vzg#C2v_c)0jYV6o)kn-2U8z0-1kN ztsE$`h$6>q0X_TU31pi;;>UzDB+1jh0a=9kcupxeiJzRr5n<(6L;fWb>&QwD)jMev znw{{A@Yt!8GSuvtyY7)Scp4W?d#b1Jd;-o!$syKN3jAU^<(5=`0l9s`3#V;P=_W;* zgJHeD@Qiwr>PtSpdi}PFiXP?N%gJ7n(NP8~21=i%QQfVgb%hVOwNE;J-_rXEjiW(x znwEj|YZf+(u`X&xbhNW8^VJ>iq7SUUSkI*B=; zjkTL~ru{`oO8hF{PG5j`@NvN#XW2DgSVG#Jpbwcd5jw{8rpyEUGP{wV#i$F&eI5D% zB$39N{7y?y!nrforVy{9P(RwaE44jpFE>MaV4G|&HAAjon`EyrPsDd4-&3$Nx6C|^ z-#)(^^!r;*VZRmB6%bV+TaZOH8)_Q)&zL!^*o7^wc^~AoYBJ47-!BhrBe2l?VUbeaH1m6LgNIR>Bx-0y+;1iB>YxQmZdv!sb$~he8 z)8t*psehSTe*`Mtz}Hn6E374k5_Qy(Hfw@wDk)Tk;H)IYkEgkP`E$V5;Xx5GZ zb=^%`478Kx3u^k`?t54Ld3!J5Xk|x$*6ySbq?=!L|Gkkzq@gy_rbS{|zJSvJ5ue^Fl~Zk^ZPJ%7#Tq+M(9x4LIAnx{@U zebMVk%i+N6`vjtQ*2y02-;?`mMF!~{)0!bQi|+Y>OHgO@ zD)qP}%Ut#yT3?Y+tFxeX{QY@5Q6DZd=iw=Su5LcQkttg{=SZPbnnP7iKrYBHhRTCC=2$|9-#kTspO&v<9^S z*}nI7-GPsfc-J*vAoE-_mVQ|D*XrKWt~B0e*wr-;&N(0-oB?qiL)-s?v4OqwG=u3g z$StXcugm;{k8?VHQ+}ywogjiwbm@+E8QTDBp z;XKJF%YADK_6kDH1I?iw2e$NfatXFkWtm_sRD%Ms>wE(7Xhnl{Q-=*L^sWPPd48Gg zX?vnZ!B>}~WNJBo0*!f-lUDKaIUOZ>GbIli*%{EYQd)0 z9pWD`9~g|JWgt@)umHB)l^Hn~sv64CuD68xbK<$P( zple!D;4oHDtlSD^pRb_GB%?hSlyc-%xOj-sSr;w)bj$7c4OcvQnXwO-SAmknOm~f_ zXfKbf4)%r6f>qwI4Q%TAIFCsucs^3dH$ILMKW;BDrcudH{{+7`&ESoO{ND`b3w_si z%X54Up10h+gR1Pax)iR~sO;src9+7_8mT5+@@!3dAN%=}Y06qXDjVkq zKvk5`c_Q>1F(W4DPs!iU=ZZU5c)J3Z!XF!9dq+-}W@#mb*&?2ulTWT|JioT6XI(wk z@i?=A)2OEMy02l6pwu?OPWP0Vrl6L%{NURDwZm&C*Y4*F9#=}&J^MR;3>?UVR+{a; zvG3>e#2u8QynT6x@{Z-lxutrG|K6Z$keV6s@~{T|J$Y4-F*>5oAAe)s4c8SOZK?F><(RO2Z=!M?yc z7yg|m#x%N4@l^Xv>*EQv&YAH3;pCGxJHg*OW?UbqucO^5HE(sF{LYiDrBgfz&!i5H zZ6FP=HPvK0eZxIFPfG3ln|r8K{kHiB3)i8-rtxIrYvEjJS^u*WfHC_7H(3oRK9f;qgwg z2cYoc3$y=zSV2E5+H;srT^0VQ>OvPeN-9bnr4{flS3&lpHf}4~W^mXY&uuerGhm%< z!8)6?nJX@rR}im6Yj?%^&JX;h83*A@y$!Ux>tNBfXa>n!rVOLCMo}I4LZh7p+UZp8 z>`WqC4x@jZ=pcEGVriSGsAM@DFLin2*U$YFdP<;mq!MN$(=+_Jh9=j+f}h^{qB79pqAC! zMkK4 zA7}ZYmHeD<19a3ur9l-+DnOsnGNqUkO08uT+R{@$+Q(H|jFv?I+9xP*uWagDu)&^R zj;B<5+bf%TSs%%Hnrha^`KZY6KBRx2Jst0zZl}C6fHLf!^nJ3Us~7Bk7WK7xceK5M z=YWR(!2d1m;tt>o+C7W5Vn>wGuJ+B_b3+g5Wt&o-UQP7q_sf@~uAjLRMQ1w==%>!< zhGB8UI!89z36>R{1u?-_dq{DHulVWc?(2TW&XP%P=}B@+lcvozKA@U3^D zdf+bXjeM~J=+#|zFR7QInKUak!x2$Iq3Q!@qZ3<-}=|T)mQeW+9qCYpd^|Jsa-$NH15Xy!x_Td21SJ~qi(D($y~uCMa=!EnST91>$PCS;xo(}oR+V2h zXuT+y`QLcy1(Ke_G9^N9zjDvh?j^YzZ zx${qZBK&=3#|5mL7pKTe2V@tYv%y|Va1_n%7rDW@I?f31M2Zbe+GpLwN1sVMM{ljj z_7!g6a^z3>zvnCMM5k#<;*xHp9UX0~u~D8K3?*fMk#aEXIT>uL<620{yHO5$Sd{mj zs_YYkTd)6t?}FSEXTgyAMk`M4bPRW?yABJ%*$3p_=4a)c7aRYmhNyOK%dM7Z42_O) z{J^(>Q<`c0f!E->)M|0$LkEghj_q72X^HT8tk$h><>7@&i@kD2>808>3wxYS>}SX6 zQOCsljHpv;NU6)qk4imp_+J(URR^ z((E)rp1u)!dghLuVP9*5v#nG~l6LE4JG3F3=8mbZR#I?T|1yO(PC9jDM%4@;vbPVkv~dDR)R*df~|aGZm8GL?H}vc1M{;!Us* z(HNhHaeO^qwYOw|O`!GB>(eZ-U_s;6082rTHo>Yzr?enR;n^?9Hb_i^-g2omQDw?A zsUCGaamcS-uCd~2odjFH^KwlAu=nF>B}L~ztpz=5Avka{?Cdq*`w@IM#`lD+qKAQQ z!g}W|cyRM^CZhy1u)p_M0=yhyum2Q(QC>TR^gLG2^M1n)cyDt^&zkyoW$FI)bm-YZ znx(G8R5=&z5|WiI`8_V=nmoT$4ZC0Yhtp0$Q`uzd>>hvGH>LNW)>ThLDDOn;8p++J z2H7%FceG_=ylK#PWqnYJ(=t#Wy*H=Vx6$7D)WIeB`@h#1W~4`%W<;F@mtgZUUZ)H zUv@5c)ZN}h*2*BIBW+2;v4ED+QznHAuw4E=>OT0&>kTPO*k%hT&hI~-+GKz~t-#RC zb0ixIT=A5NZ1z&x?$*swa-9nJQD}o^l>rJts8GlbSfbZ7RQ&y15YU!fp-TOd)liC6vP?poT z5|3uZXE3v_i8I6hqVnbu%au|@EI(>n6DQf8!K#belUh|Br$j}_Vi(y}QdWmXm$HWY zGpj5Z!!kEq`^!FI*%Tp{U~^StTh&na(=S)fXwxvD*U&0vn&emc`{GZc_4r+U=AS){ z^<)tyqT`tQSEBczWViU~u2*onK=Ii02)5%=VRt4Gc4yw^^Cm9#$-yYilReUY9UltG z$JnlqwH^mb@D?ZAYDeJZ%@&k9i7ZQgw}SeYUNXQY&1^`})ig(To!VMW^E27UttUlF zX)f&I6}xE)(Jt!mM;&B|(|DoC)LA|ke6KyuyZ7?EqdP=r^VPBh;1c$~6boSnV{zOV z*ZUYV-^3Tk1!K%yi!Z$Mj=N6CR+v(k+S=8lF37Sk$$5ff@*RUAfu~j+=uj>4M1XHl z-!5^|1fOADC$;{R)7kum&@EK#Y{I+VJ(hB){yRIV{xK_|mOMS-f7eRzaCaYS+CSck ztAG{t<}o!_?}M++>|d4&8?Z_X;M6~8GQ)D>V@TK00;wcvnrB)Co2bv53~uXA8+rJ| zSf3d567pL7b-btb?zW@qu?(fs>pO0FHpUdR?Cz{nIYUKf_ga*h>(A-$vKQRw zX!1WWkNKiR#5EJTutKeODo2T&>wrj4?%vXZ{Acqi?||iMzI&kr=kc!Ojg`!WWr`N2 zVq1bVU_7ZRl)Ub$@{Wo(q(hibl{^MSlI?ue-_k6--kJ-Y5>qpSwE!}&!e+`oIqiuj zxw;qn7AhsAdV%edG-w`G6GykIq5cS^p)KWG4OAxB*_G+AVr^6Hdnz6O98X+WM%p)H zjgNsl56vH#KMb?eaLi5<D-$zmn$GYMf0_Qp(1RLGvPUD)dCK zM87GIL*ND57Tj0R$cYPA^4f~LwjrO_<-8hsZ{z)PZm;tF?lbW84jxXF#*BB>R@ejG zCqK!LzP>r9jS=&wwYzuK%U$2;I-#zmL^eWpbleZyl{>obZ%t>|W>nQS5Fh_8`lEMM z&FL;t6!#YN1t{*NpgTcZJML?Fw&m59dgs=z`&yrEeYG|5-Slji%It>ps+=l%{(1fi zryk^8b;phoO>hpLgn$sOQCl{6&Zz z24ns7eFNpDcE0zbWSgC_-EK0@P}+dZRJu^M%o$5&@q7h8Wf{bcfW1e}F$ z0<0HLLfRMsX=8XgzHPhFE}uVrf)n4_(-^k4r-^th&p1=*z}@=<{^m|)=CbF?dOIRa zT}(bE`yE=VSuSwjSqi3EoE9sO5yynHD!wQ>+`3_8y`1Lz12#JHV)1w{RCgv zb6nX2f`;WE=%0Ju=Z|tPaFoh9Lz;eG$#aA|&+M|*BG1dl#(al=ebArf5d9bT5F(mr z=g;TG{3h?1+acFvG~W66P*JF<(i&0f_d<^bZZl#Qx|MIW-7#7hapL0k9m?+?@A8D@ z_wNJm2NsN&^Q+DuSqwR)-l6aRlB=YD1}qU6`cH70`Y(31mdg6aI}PA~g44sLko3^> zUQ&2^Pf4EvOcTT0q;zbh7WlJ zd}I|-?6%RG2D+=nhz%H0S?^fXWwCcgyT#2HH(ZkP20{CGP}0>#9tIu5 zbmL+pX^qpHddt6x!k)fms9GOQ@0M~dGir8-9dbzv=w?n;M%CJsij>VM&I^nB_60?M z5u>K<>X)Kk>XawVw2-CD|X9O&yUg(8o0j`#YukjSP3X1h9h)lt_UJIwoUH!Wuixty|`4`uX} zq2m0!sQLQ2NOMr+Lu+@oOLb-5ZY9mW=}o`?<|VxyF(|Sb{&H!5!~j@H0B_i)9@1|^ zT%ardZ$46g^q_r}`zo7Drs#r|KF)oWaktt@F_5yaj@Z{O-L=&BnNIs6yxsLb6zzF_ z)xOH1`TN@Kxzb$P*Dk>IKqoH6BJKMq4s2W~afasiztcmCMSm#z(SrU^bl&3FkMj?d zi`5x>3l!rtmr73Gf2-`Y+HP_yBL&K1b>+@>(v_Dhu}6*aB4wizUK4QjNYmaB8_;-U z*q06R{HxmPi1-7Fa`%kVR62Zo+nuu4@zBvX97B&j;lDD-9P}Jc?~~p~ageopP4_2Z z9o^WSkp3v7M3o6vTBiqw#&nLE6>Iz98qI@bohETsl5L;E|LCU;*N%*gPQmZ7ah;rF zX2sr0oS0|~YIr=wO(~;&~m0Fcp6;l;lrC2QYu4=5jbA&Vc6g4+^$$)XTsrhR#wxj%_znpyw zU!3nY3Gw!7@0Hce6UU1U^LoT(5qXPI8vUL8cpf~?F~&s`bidG%iJ;z!kvQ zoR+I2>DjLkuW#G=1 zm4{ivhBfcZ0@x?9Ct{r)aysVB&v`hfQ_kods%@&0XXB_|8GAL(kNL7M;=YgTmC2q7 zo1L+2S=N$OVMBUlKFcO8&&gS|WLfsYC-id`EnJqha9QNCRXJHp^~6vg}0*qn}*5Xd&y>KU0s3JrlAl>#3ZOAtAjoLn1=vEq_XZ&r*b_ zUYYvg+8783d6qrXN*}T!Yspfi6`~)a4|y~uDlR0V71M_-%y=qG4jQyz(bG8@3nS+& z$bKqgSyo6Z_G~NpIT54RQst4S7G)}rESftP(expnfQ9%?zZh;YdXSA+GCOkfooLwFKp0OS2X(U9@Crw7X*1vg~CGvK|Z>rqq*u>9UMv%a?{cuw>bTA?_%V zPdyqU9>Y7UkBnaaRCZ?evQ_%z(UW6il}B(}4vXyNd4#G=eP%Ln))Hi~M4vn#& zehP2=$f98j7R{L->u!A}|4LcDEM@MbIg4_#aG$CsdrsEyj0Fp3&zX;akxR0&CNIet zwtVhfBrtDD)?C(WDI2~hDK#=SjzvA4wO~Qy{Dq62UKl-R(UL4SXW4@TV&vQUiCJ^9 zvZY1q*r@lD-?di9twwo3-ZSb^l)3T>snD)u^Q`29Y zwt4ECQ@8o`k_X`kmc)|TFgBbSn33f&6U$@ytbmoV3buvSu&rzxdy#ENPv&GHkB#Xj8iea&=KZ|2YnVDJWz{{h1EoYM#EgGM(a8=6erE-5* z$|hzlU8YZ6vS?1$QhLRO%d+QZNA`~z6gjy6pvWg;=MET@F?%+fq;wlLZ27Wf7!dzy z0ey*f@3eDw8+Nh9#~t=}c%wt=n2GFWi`b6CI)-+fII@3Sj6QRTTpi=Oz0>7P_spQv z-7H;Ob$PdQVb?uf@DB3lf_{a5_@wbkY+%b>A%}u1f-8eJ1aAs zUEX_r=mVj>L%-`eTy9x?j=R)Lv*#>T#t>W5@}0r$2HrOK_v#tUigFG9;URj)6YoqO zo*F$SmAW??810>%u^@XjDrH_)MrPI$eb&l3Sy`D&^}|z=Qq#sKO-ma+A}M*q#I#9c zW{gl8);)&xPc27v&Cb%tvdQzZm+J99gNVt}WlKOkkf2hn`fzvY`>-hsmnvijH|H$L zUIxOlK))!5hzrwsvuo>b@tr-CIb&n9IerQi%S6RY16d2iw?VEX#=7D=6s<|0a9nvZ zQvM{f0peFO8z@sm3P@&yK!TM|GP@s?QN@EnOjR5&=zTI9g1)4NKft;PJe27Leh}qQ zKFRDMxh(W6nI)j-so{y}eJV~8rK6rbScDH}Lj_J|i2{#6TFNJxjbx(*9>vB9Jes8n zJcdmccr2SH@WX7Tz~flDz~fn_z>lzb0;jMA0;jSZfhVwK0#9Ts1)jv#2t1h?1fC+= zCYe3TibVKSRx0o`W)XNgs}y(!TQBfqY@@(4G5VEHGMfbopyJ2bO9H2{R|HOHdj!s4 zZwNe_9T0d9dspC0CJCIyJ`i{=`$XU;*gplHhbMY4BPNHfXR>gL5_5q``R_oUg$J8eFKsMH+0@;9?Cf z(cn@IF4N$04X)5&2yn#vS~VC#ArWrV;7Sdy(%@ysXU(7%NpJTWT1n~I&ml}*Ug@_-o!C4wyp}_|<_$v+mRfF3!^Q0LJoQv{26w25GZtUF(OB*@Pw{l6J zmhlLbO8IPcf0xSPqvT)j%XqwuZ^$^+9gBgxQ$AF`p_oly0zr%eP6Y1ez88gW3a3vp zI6d`~jMneq{*es+v4_CPnmKx;W?mkJ=ao+~X4y=E$7trnv6{JWoS4@_5qG0I{v-HK z{*|$jC}${}AY( z#q3UamJ*1+l#aLi7p0Sm_zUE8X3Kara3Y)Cq-+$2KFMs30%V*iFr}&1Eu}dZ@e7bn zZ#ET+WP=<}jlB-xD&7j5=Z;U2h)1Gl6`aK82|SEFDe!Q%K;UGyP~Z_PN8piciNK@S zGJ!|46#|c8D+PX-trmD3TO;sz_BUWjQ|6=YG8;sk;mm`RS*{2l!SVzi#R>!-&58sb z!-@qS%Sr_v$I1mB&nyBz!qy3#$|?n(#Ht0J%+>>6(v$z{9(39 z;PGsWz>l!40;jSU1)jim2t0|sB=8jWGH^G@crumdWD&r5z^{ln4`}dE_L>NPknIup zA@;h!3G5Al6WN;rC$R$p4`Xi&Je<8Na58&O;E_xccoaJ<@EG=iz+>4*0zb??5qLcN zOyCsuPvD0&@A#Pe9gm7QgP8}9Vqb~yG3*liTy6{Fm_Ym;q11+$>`WhhoZHQPT*0jIql@-2}$mBycj*3p|2_2t1O73OtJS7I-uZ7kDh|EAV(0A@CzC3b?PVT5%@%R5`zHT+%B^U1yhlOz^uz{_T->X)}t7Uvp#?Q$38yT;W@y{}T zR>pT^{5Ki5hala6fAr}qW21}{Wn3=fM`di2@j@AIma$pJFUokkjB90lNXDxZu>bcQQ3 zz9xtJVROO2ZppZ>j00u9H%Z1F?%{!_Bb@3vvL9nh+?ZsZ<#PP-ayl=`c!G@S5A`kj zyzh>0_QM)MjuS42`-A^Bu(>j(KWcoHKR?kN{Gc31d3SA`!E(5GR6KhF;d<6f+{knz zZU4U?+a~H7hw}Wtx&Kq$9>zOR-BKG7R@;a$wGoXG!Zb#xZV6M}K8kt>WnnB6-D58B z7GNYHf1>c0!s+8#fe?-myfm#}R5@@mi-NRT`6NSnJy_s4Jj0j~=^G&7rjAt%oQS+s zo?LRrr7s6Ab%hbC!H)pH=`K$uFnzRbT8%XSUz;-achm#5Db>}7z|^K4QCDBOG3^Gb zZA~(1`b6PU>$YiIM`A1~A8KD}5BiY2S{cEF2WsTTgEZ^Y!H`}npJWz~_Ezyj8aZ%+ zM)o^QUbm|Kgtk+Tqs#{EiBO+81x$S=0QiC%cT$pcQ%vQD178XiSJsj$rv5YFvJ&Ty z`cFO5{D1w2F@ImGw{W?xl>QSg_aCLtgkz^l`B0xx>oXbSTK!Nz>E`}HbU-g~jHds@ zYWhrnO+Oic9R}q?`yJx|mHyBd8_sHf=%?uq;bI>|QXZ54I`DV4`#1Gj6;mIm{x5x? z2j2bvFMZ%ayi2aT4rsnU4E*2b0*boT9skef6q2D)I$9Z8G}bY*ke7koD>qxBDT6wv z`(Q3wC&#aL=jO?m0@O0Rj5wjJ2dDOW8#ocz5BHC{F}~O@ZcH?RKGY}G_DyC%L^kA4 zGV9HU2prB61&-5=6gY~jl05WVo-V>;_*{Ww`I7?o=gR~hz*h=9kQ)T<&vOMH%8LYk zke3Raz+V(Nk?#jH|3To#xI^HX{H(x_^9ur}@t+0G;1>m+&7A_z;lBx- z#a#kF$r}aM>pXiydYxxKC|IX*ugNS#*Tvlnz_;l10!Qm&1RkIpB5<58QQ*P4WP#&# z6E*lz4W6mN=>iYdJt^=5x`hG{)h!b^LAOHSL|vW+7in<02Cox1Nw-np1l@}QC+l_y zJW}_Hz@v0;3Oqu0K;VaU9|$~7cS3{zCGdFNNrA`eP76Fq_p=6H5_q!iHw|vo;1)Wi z@simTT?c_5)pZkis!lKPG@Yt-mCR=7`it;Mx-taiUnS*vk1IGS1s^L-E#u3(!C_`O5JM$ zuhzXO@Jij=0V^vZvTm3LkJR9?0>7dgC-AGfRDoa9%@laIZng&J2)swPOyJjb zs|DVx`v9F&r^^%g4PBAI2XyNMeoMDe;QhKy0{=s|Rp9q@ZwUN>?rniT)O{fE z`?`+={!I5zf&1`p1pZui0{E&tZ-#IRZq|n8)}9<<2o?ZrV4>VSWSJzlGGoK#IDK?j zTC)@x_tmv<-=jDxU3CBxO?XU>Gg+ry->Ec#;?Vfbl;h0O-G|@wk#MPF*#S)bJV%a` zuLEl?eoNnC$SgZ&ysG;4uOZWmjq5`FAF?^y&~{v_L{(B*dBq$veyNEn7twJIQAy+ zTbiMq*>5oZYV;Gyho5&j^1SKx=(djcmgN#I0wSm5F81A&v-M*@#vp9nmXeJ1cI z_D^8#di;W1PBa$P9j^bIWh{S1uA=3cwKA6GU|K`5)A%LoClELhH~{t0#f{aqQWU}{ z4t26(<7ISWx36LyOCUC$Mn$v$RLtSKvu3Lg2|PO5iChM&N0zzrZut0D)(+ zK>|O{1`C|Vh6tR_h6tGqIuR4we>!@R8#u>-a-{-UTIVU%WzR&l0-rx6+ z-}5_9a@JmZt-bczYuB^)I_I9FmiyszRf8YipjP_fU#dnwyjiXB!xyQwe)wW_h9BOl z*7@N})LDM`Qq|;#uTbm#@Re$VAHGU$^ut%HO@86?exR9s$G8gHg&xpzFpnuhwo6k z{qS$q9zT4yy2TIQqi*xV_o_Sm@IJNI58tQm^27J5d;IY4)ILA_dv(7beo#H&hyS1+ z^urIShy3tk>JdNuxO&VFKcSxR!%wNF{O}*uem}flJ>!R;R?qq2XVd{d{H%Jx4?m|~ z^1}zzD}MNS^{O9!LA~yWUsP}S;g{5#e)wheHp6`ymo@a6H*fjUNvqB{x@?tNvtsf5 zL5&rIE7a`SYZi#F`JmAis;sP!|2J=CV@02Zyq6shuDNydXD`MJ11ndqZfGQLpG7N{ zE$FkT?v%RaeO9fU*Ju8Mxqa%^tn9sX@!Wa6E6N6xl@sj)l(26_pJwS~>9eYFK4~lQ zwn5oEwQ%0N%GvW)ENfT{=k_uJ)IEGaLo=rMSufSTS_mHqn-sNubTjheTpZly3( z8ivXqHRUxGm7pwLfma*6YT0chLK4el)7`4{ zlA5;9R)vZ)pt)%-UOsQ>>iG-Y)>*bl^;x~jG-9++Y0%YW{n50u_~tLD2j43A($A)@ zm29*STirvQ#`3w5(4TqrQ1chBk*Esct0)CwRrRT>S2PY1dMTLt)vR2w%tb5u5l5vr zr$c#5@D?A^4e-)c^*}l{bdwHfRVDEn^j!8Ts8PS%&6cIEC`B9W34jJu@9MQ;Hv8fr z7oFF*cF-hJgt5G|Zx2QC?3IH?8~!W?p?LADM2avW%__W8AaY=i<#@$t(D6u(cy~Zr zwepO*x-l4#{9(r(8&={Cr9R6REStAzC59iDd*adaRxCW`=eUF+v&D^UOHdHJ+@u#@);zWyLE*dvw zLDlr16KoE187N zL|T9YKyyOB#1%9IM}@3}%|zOxqI7^sSf5=$V-v4{*`!Ki7Pow)_$8<`X7P&Gl4i`} zmX0J}|4L&OuW&7C#wc#tNbG~=FEw3aku5>v8eb!**LQQ5*8S@FIhj@Z0cpmqO< zfO?P@EltaxU0=7-YdTf#M9^HIERrz;%JVX{c->jY*c~39PRqklr+Vc0JZ(gQl2CZB<3}+|~7ifVi?MIqP6{TD^SX z0yBM8^Z;Hupr(Fl-NIFa&{)7yS&axzkM4|ynF(o@E?Dm3)dPq(tcC>4S=6$Ulbe}` zO8Y^%el;S$5)E3Ys4bT|z~n!_uCb1(QD1HuO9#61=Iq%Rhz1?ak|SB2EEK@z!mPy| z*BmuuL*-Hhn8dF{Z^4RTtpPJrWBu#~jBRdkk~j0!FKZms;ASLhAfHo!qwUu<&=_dx zdbJz@R+5ssVAVmSOIc|sM-<&G*@Qg7M`B)6?{oWP zZwTkIzG30ARSk9X7NEs7uX0e4XiYHTk;}HWaYY>({wj|CX#DdR*Vmhl#uRQkFJDhL z%r6V-mSwF(P_4#_vN-W79Cg-g=}E8wOnuto`HhQ=v5}-<<$`%WBFz}NV%U-vQHeo{ zwF20(MO2halVEy0k+_XUx(X2KHftpo+0Ct6wZL%nP;A`7jD%#>GFH zQyZ3{tX%Z~EQf&ElbY8L3;Lfv@PxTPO42gHPt3#h=vnj7oCJDioo6hHrgOM`Wtws| z?LTJt*pbVQkS*u;)k|5Oi{a_5#_R3X0|eOWUFi@ zKnHAeuf^dv4+i&RH+(K&X#^Y2;P?RWJKzVgW8R4=u!HR#q!Q&Onx!;+DU7@W;(P*! z3heYDsj3A`BKwtoxgZ4gpU92<7tCL#4G20j_k zyT&76sej`AeWS-3(7DOq1W3oOD*#JSMqUW2NAmCj2k_%(n9 z*!|oCxF2vG;Anj5AcyutqHMc2f@Z0w@V1F5Z$3&M1z&Li1$79X&j70dc~L)J z5UmOemGTZgXkT7G1-Z%VUB)i|TH)ne0y)oscnGk>Whw^jP^9E=WM)^TyhBK^_!o7s zROxz8&I{Nl&ZbjmOTBxpM?VBQ_5Id`6y)jeLB`eM-%`6bcHCK&6f?b=!7N?jq1> zkL7>`fET(DLAh8rmP%jd@!tk|4&wF#vK@MtvBTiYJ-#tel6II2NIPr*q#X_duJjTC z&cwf^W?b#1o6^U$i*DPjf`7{AC-@Sn7%IbiNTQGDQcm|ODrxvgnGUoI(^}GhK9`SDg z#sNP9d=T(PG~z{o$^IsN0ifsn!TRUr>6Juy28_;jv;(jaFh0<=mBZ2P$WchCcq+Ol>v~c?R6oj*1@nU-KT8Dt8;tzTD_#S)~i5OWk z02x3OS&adl40r_~{9ZhDv{aiXz4%XunQ{NXQD%IJk7#a3+45#ey3K#`(scqK z=_M|#bYU$Z^PU9AcCsGuCD?uHD5K|cz}<*%JsN!o@!oX-0+!04tFTt^($~?ZUiShH z2Yv{!5U@2Wr37#YAlt)uz@C6>0EYqI14#aV0uBHyAB)2>5IvQ^hnEZ!Mqw zLY8W5BY>WrIsktgIQ8)^ zmdR4x;L&L8dIG5=!y^2>6$~ zTr3wa>RpZ%6SDL#@}j@@@Y0{}uBa{qWceNgWPNzoNCYf3ywu~jW|{UzI%O3CXFh`f zp@LjvT!^X6zd9gfsiHDZ&ZXcVZcHLP#X|oQzI`V0)w!lez2QPn&>O<{QH96Hc$W8V z@UcII=ArKao(~uYycBQ<;7fo}z&8Oo9)1SM`u+|uAF%a&%t3%_0Ljtk5y#hLI&&x7E?xsKNgXgcw=PU4a0>xfr z#+#1-zXJaHVx=YkmMj4b!#<}PzU_b|h=0JvUk9v5MGQNmx&K8$=jB0$O}_s;$;)>o z_-T&~fF2*qcOh`f=ha|+GL^GXbZZW9nfm z;6~tW*PHdh9Kb=qz3Wp1EOo=Vo<3KAz7=t$=bCmi0dOYDvuA^u2bhlXzXyH~5nP_V zY7xHcmqwoqG9^90$M71rB~iU7;#1b^V=37sCC=0#zH-M*LaCO zZnwwZ^HP)VXut?)698uc-U3M3uL9-+eg)VG(7w#{F9hZ4fV-uZ+~&#a2D)kahQ3bd z&g~w(C+O5+4d8OX_W)lptkVDP-(l7P54rFOK(@<6fJ*`AT#hjru<#13K|>}X^}c_n zNynJ%_HY;K+EQB{^74NOe3bVYAm!ZgYg51WF4zh9gMi-x?z_&6@9FC?CIJ5qupeOM z4QAXJ=fb&w{5ZrtH=F*Pvj_PH(N=Fa`78xweO?MkJKh1<8t@4~_Rm)Vivf9&?>peM zd&wQmb|!rY@Jhf2z!E@Sqw&83cv7%t$bNn!;wgt$f!s}dd;#&<_*X8TzSE3*GXbdw zui*yx`~|=_x_k!!8(cc|8MfDyXEGp~iuwp}j!P%bYdZeN{MP8z2*|c`F(B*XK|s$A zK;7r(i{A6p zpm$}Ex23NA-jg@=L8ISJz(z1-{$T7s74R3P?F018xLtc+&Ly3te~%U_Ii~ zPhlf(H6PGY z|J@a~mYDPlro9gWv=K87Fby~pFb=o~koI~5un^mIKZKelZ}`xD;?0;46U4*Sl&Fu+(QWJvr;%G5dM>2QfawUWMgioQ{!Ky^y*US+R4e#0brS)GEq}BcsqrjUEdu6gwMjBQ#2jNs1z|bx_eqb5RgZmqBY8 z(k57@q~`qspeeag-_+;0fr%o6)=JRqg|ku8$kc}scDM-@nRXk9(9N0K9@un)S;~H+ zGtk`e{~#k1-od@C=1U7H*0{N$3#-&vqVhIF&^ig> z!1cIA$EU#>wA$is6slxWx%ufq=Zhrv`Zh3Nbn~MKi=m?zl8}kO!9va!s2|;WKsY1LEmUD!SfoUqM-Us`PVrVz-1!>aGQDF)Df@Lo8(v>OR9@meY~4Pcm4Jvx*AMG+4+v8F@udHdw@YjkMVYi#k&< zCPn8MEbj1Y7STF`C7tDzIoDvea}TA=Gg#U=hMe;amT}rb$>;)uwRV0*tlnU4oj=j4 z3k{ar-MH%PMEY&Xzt+g|oxu0dQw$3=p zJlkOT&a;%+WUvm-%anPJ!8$q5GTnNE6*zlHJJ(=^&OxTzV6b9`@A^i6X|Qe%zo-=5 zXs{CJuk5tv8LX!Yl(hr8gMBM#(TXm4|GnjeYzD=-*Q^6AMy;-oR^9{AR`!T`d&WBJWy6<(tlFs#U zV81go+j*R{2Sc!(Rg`v`nC{{3f@Pc^Xwk=p3)b3MdK|DP4Xv%ya6GX6hL-RAmb7Q* z3TFo=Oxl5S1?%Kg6MOM;!3vy-)cO@uhC-);?dLU9hGGX#k}CR!N!QI8LTkTupQI~s zmJmB=()DzzsP+4=39ZyQ26JolBZHMW<5`AJ{w}m~r!&)iX2zOIr;ho3X~v;yXDc}m z8CpN*hk?Mp`M0DS;EZk!>{~vkTSap)?63|}9D7iOtTr>ka7AH87=}RN@E5dB_8C|- z!$1m1X990rBRN=Sc!Ps z=k0<>Bb*^{Et7j3h$#>2(=d<%hTcAjm1{`#P(HQU(8u`nU-)!}kd$meYmv{u7T~G> zD?gU?YsB7!RG!#teL8E^&}qPwYvw;7wykCzr?#Wvr#R1fvfn~%fp@m%IkS0^OH;+?h8!JAq5irle zEkbnHyF_atR_E=527$aspm|Q-4`@8WytAQcD6bJQ;k*E{jO0DUjPnBEjOWcps$^bw zD4)uE5j=L@H5lVEdFLZ-o4hkYZJ&1u_&emik8qJ{r$0vJ>WeK+Ck#4Z@X{xti{~Ge z7Rn8XxC8(By&(^r#6KW@G@c!RbIs5Jr2N^C0DLTHlZk(73(l3qTHx*XlD^d%4m!O9 z+8;oh)Z3-G-2=SCa(qr-Um|o1GCTHzHnZ^0@0N60wrZi$yQO<{9*4+V5Lpmfv`sI@ zuSqp2)rFi{5e1?8ZF=E09SmF%XaZsWHoX9xkpW6|J|BvFl9gVUtIpRWE{0P3BGw^j zL|9u^sm@#i7G%?rXXh^v+4r!>!YCBkfn`pYo=4WmItvD9r;kGsbw+F2oDMHNiGQ7d z-Nf!0eFNC|y0Njl!4+(2?4HrIdq3i0_l&09ml7AdLo&i!@n7^8)gB9Tr(Q z8j&gYXI(E~)Kir!-l@wu|Q)X;~ld{j`0RM1Dm!5cxQCHJEP>%S5mK=eMM9~0#|r$jo@ zm#n;jiE`Bj)KGpWMeh?M$z3<1{H zfNYMRuCJHCJ};ZK+2+<^^~GnEwJljymk5fJrHH5f5$dZe1`gO`lV;s~fd35S>DCTx zEcLVL29T+}sUJZLm2KBbFhV(*(9PF59_TY=JGi&u%VjH{o0F^6kmuv$l+EW*Z@F z*MN-`^jbDsRt2#FvU42-lE;sn>Gm0z zO-#O%Ccgu5#^i$LfX$eECrv(xsC0>)GnD2L(n&{7G7uav(WnWO)Y9{H;LbZ*aJS5O5eO0C_i0S z(w#|v!_~oQL|G{#cyRRdu|J5PgTV`k$}d`MWga6+cYlK zLh>nFd=^qd@Asw`>EO^vdt9?RKU(f7ck~AH)bGW`h*~7KmOaVMf=cC%8ug| zNL<(fkt}Fo0RpE}{SpK=ATYdDvyp;Ll&v27IpT!akBt(#q46}miVteO(iq_&Fr1x7~IxKS0Va4VvoKveNA1eoR07NTh5tSq%E-UGhZz_;l~ ze5!CSXkUU>`k2dfm`+fXyO+O1QfZG`mCs_6c+h$dQCI^v1)EfYO{L;$46sq9-(kE? zToJ;_#wb*NqU1CV>bfccIrWOk{45kn9ARPHCbAWz5)?JwA8A0Y(Hmn zX9B5MOI4%TY_4%**cPfLQu0AJhAp7{PV%I+8^ww*znOwAlsyheVx^UzLS23@JH?2~ zK~%MV20GcdTCzyh?6j#J;F5>G6i4p9s-M1?dUGz)nj>_I!PHH>O@scbzkV=;uzCu2 z&D5F$x{*T>$fX2)_SJ4K9IcwEeboRx0Zh&>j1C;5Bxkv)fwHVmmuo#xe-^}MXoc2; z^l8W{Q97J?v9(Y}KC;L=8a*Cy>`Wo-csiKgi*^1<8RSniR!gRTF zwPqttaThyv8xs!J521c@S82_*Cj@w8Ucn0PDfzO6F<&m1a_=>|vt=39A-Wv;Bzg&J zU!}fA)|P65NcRBbLsT|ass8CL^BfMcdjR5|dIZd=hkMlFo^Mz=M>y2T;h9BX@KT6z z&n$wnw{K0o3Q-~M?OW68NG(z!?(JLC4Td8j9&Y3eWzsMYH$r_MLNJ2EjZi-(Mha++ z;sk4G(;Oad1Z!VGFxN828#s0u3d_myMzB`GNF>J_!C{);-}8<)f+O^4g39qmaHM84 z@{Tuxqon#Q_jtocb5+866?_Tn7^F?|pwm6FNogW*dr`LB9s-yBG;ZLfB||w;lr(Dc}w>PqFeEEuV|orae^;R$YjM0h}Q3*!gXyOm_9~)8~n_h(u0Y*kKSz{ zafoQRe4AdeO}G6RB2GZF!4vM$6uL!IAm6|cp$!n4PfX7PQ+roRFmSrngftxXDuWPA;!439qgKBVpXIATu**6jcS z+YsnZK0Y81Ln3|I?H<$bKr5M!xE|!}Nhz9HAd@KwOD4T!fY5hpQu&(8i_E7t#(_=? zV46E=8q0>+*r)WJbx1r0XwhD<-iOk(0%uk++q*jmClsOx}`k?#`;^O+v=i)4PrFkiq-UlV5V%O%Xa zJ?7WQe2C1w+0QABZzKs*nZAk1-~Vy)UYd&={0J_2`G!&lJP~OArhydt6AC>BQS3s0 zBXSOqw#&gNjjYdLrmiL-7&t0|mEsac^sR#$!N3Saly5{taGQ*$T35V4J^FJX#O%#( zUa7exip&?)bd~1!$bzq6eq;Z#rMp$@d9`Suv&`spG2?l|=*AJSukOYq%d{c0y-G6s zArNhj@R)X%VH6S58t7}^IT7W#fZ;{CqPC#0W#tVkP%OSjCcZM z#1kMRo&cHINE*(FCqPC#0W#tVkP%OSObbtdR%6kqnjpS4^U$hIS9Cc$I${^FwyOuI z=tvW)=!b*+y@*t;%5h^zQlykf;HkLaVHKc+=xE9eY|TS(EQylpBacfP{GT2k#>c3G z(ZA??jNJ)QJs6 zM~rTFnM3i$M)(hSXgKyL`e^i$5R1yySa)jTp>0*v0XY(F6)wQ^5PKa%NVIj>XLg}QSQ&BA$cT$ZCfh|LK57hD#YH223}?-t#i#PLz6E#l@Nxshr0Ae;Tr@}k zm+ztxAOCyA1g%GLH>YubA+OvdDQ}>^i&*2L5#PKVqnNm8#4jWtDnwi~;uleGRDif> z#9O#%#9O#%#J8R)oW?~XzKw@GR*`Yhh;OHO&qX8N!bKzA(nTYFEPw4NXq}CFT3>?u z;d%%DjV2wRxKr3}6gK|wP_t!}IB~=$KO!7Y;ckrZX$!8y?Pr`g;?rzAh|q~6ej-D( zLl2Dq@fij)P8{)*3}&1-;xi3qoH*hq8_YOy#Ah4KIB~@17|b|v#On-ZoH*ih4Q8A; z;`0n!)z!igi^!2NM?;)u6!;)u6!;)u6!;)u6!;)u6!;)u6!;)u6!;)tI< z1r3%?J#^xTw{YT!w{YT!w{YT!w{YT!w{YT!w{YT!w{YT!w{YT!w{YT!w{YT!w{YT! zw{YT!w{YT!w{+r&?_lo>TC}2Z;)q|@7Aqui;)u6!;)vfg4yESFGMzZ$dy2v4IdQ~q z<*76t_{51Le)}B3j1xzE?;6336G!~+ErJ;*j`%(<3u#e0am0UTXvT>n{@{y3Gfo`w zhYty6oH*i-ap`Im87GeTlZIxTIO6*a%{XzypY0=@#)%_-V3J_Qi6j0Z_us4{HuAVT68%eoR064d(%ST804djLr5ghYfD=q0$!PwtFo&pG3&*APmaomcaQTH>1jBtj)#YsJAz2-BpJ`DpYAaOU^q-EtA5@%7*+oBa> z4Sk$XX9!8j7PR{M3~T|O`cwT_)~^xE{SQy5S1st*0Bg%bz; z0}>qi6Rj|wcd`=m-a$;pI9UK)YM}#U__=14c^AtQo#}u%+{)A;98iI|T=AdEB;ai< zBkv6G>ddKF8CaP-@CGtH5R*fOb)S;qY(%QeEOgd~Rb~^ANAN~92#=}^&tM-@nI}Md zTxCiCnsjCgSkBRzEARxjUT4mOuyb|hACSL6XZ{83mpbzUI5+A{JvcAWnd3p*tTX#D z5niM-FM(yJ&a4OaYn}NcRNbXBUm~OHbmnU$xL#-SAo>Of19(Vh_**0o>&#SOkLXNk z2AaV=bQFXpu4M^PkX`iq$mj zPcq_qk`dRFjJTd;#PuX2t|u9BJ;@l?6J&QU59l)V2viw*0_qGs0Idu?{{k6${I$x^ z)30@g9)4{yJn?Ru;bhP*W1+_LGxXpq$y@F0UTKD&dA&3A$Scdx z6R%H(9(d&$dfruJ=y6w>p{HGy3iN?h63?;totGz`KOXjTcto6df$J?U2X3kW_EI@i z<&aG8uEfi1Lsn71c^+0zykcm<++~aBtHghsm1W2Y!p@1;C=hE>=PPvK#GmC{vMAx4 zb{w!bmWj-ib2KVD@t4hl!xS=w(*x|5vuDdnGr^JHfrY5y`}O=45pQ z^&xBVWM2l+=%gtn`x}v#!+pu*0D7l$9dI1XnH*>`k2_;J0;}P}h=qprMj^0Tldhw) z2wVBdAzV~jMV*}wkXv%-4N{;k&T1%-Jj!quIp1SDFgZLaxp&35y#gA`BVH#&iR$O7 zzzBqsBS^A;33J3#BhN%kE;iv)qn;MA%9&Y=@pv>3rPy2cBFog#RYy2+CBTPeD$)x7OUTYQn$lay<-&E-W1=oR!_}Wc*ro zPo&4*lI9dkc5eMjk}r{@h{XhzHn!glN;lo>-Qk&8lXkH zhe_hkfk)9~dOZLE*Mm?hJKtZ5P##S8rfI$caRZ3@Kl+1K7&bpbsy-I73I;|+u-TW8 z;N1+imEdm?EVq&Mix5#!g1FZis6wC<1XK(`;C=>ZpaQ5{c@=D8cfg=~3j&=HpbtQ` ze-c31s_GHYMu2w9k7(7tW8WFV`8GJ~!TEIyPAcnhT1`3C?w-6ZuMW-KrsvUTFj5_w zvrX3-_rbo^FnKXFZ&oB*L@+?LvJ+GtLW0YY@30n$jP^@lNz!H>fwtSFZTk_eI&M64 zjPnLnZPu@9KaxERk+=US8Ge@)wD&-3*4=39dVw@`#cAh-F#j!HrOZHJKI)=k0Rro! zQV_5(gbW~$#iF{tVe1eya!d<=sDof(8@ZCzx)R8CN?>!QgsN(gSgj|5?1^#HR!s+u zrC5Cg+9J?ciY-5;RkDe+hHzDtkLn(T(7i|CngH6#pjFbx=4=LJam2t&h`En}w_PQ%J$XA#FA)@WArT$El_z5&`n(5l`;;7bI$W-$e#t*cb!h0rMkHzbZuYvSlKxfZ&C zxn!u>h$KbQ%X4K@=m2pUO$;8wd2=aWkkV0$yrjd09C#~=4O%@=uY>e(4l+ZuW~b+u z!b*`$uR@?m+^vSlFg5~bxJI_Y7ZVpBw;`Hy&}QP|aWzC7MIR+DE>}ZjgXufqrCdqt zVR|z%uVqFKY^9G9{BOjc;V3y=a0l-rmmZHqdW7cMdm-^d`cvy;5*U}U4OIs=R! zBV|WawpYfM2_hw`>H=^@a6&TTr@7Xvepk7fA5l&)uoGtX^43Gyg*v07>F!#yiSt8u z(uMeCyINwp8*=ny1p}AJ5akV&^n2ihqf@Sf6dEwE1{7XTMoTJ^UY3$x)&-qerpS~y zNKFG;^dK8r%IbxVvWNKJ(D8tCHh-JAbhMPkB};4Ar)UGad&)Ww_;}#GBsbj5l$s~b zQn!InR*n&2$m3M4mFx%yu_#2$r|8PMwR!F~F&)`e+GO!ml2N8f1~{tSi7s@cnp=yS zBM&E>*M+Bf=+<)&n?}gULH7H@7(G|_v$`tDnPa6$<n8js01CVhgnAL`<)F%)W2iG>)Oj(P%IiGG?7>5#zn zN20%R`Ozb$FmmL#6la>%@WrgITFo6gL~%M8skzok4AL@m!ZTzZYAaETBTFt(%)SIy zZsNQnd-H0vein6{zyaiNil!9}Ujf>f+20tg6DV0?rOUF-XOaCG+2)rxcaw(YAFc0) zp%QTK5vlClM(Q#UTjc&L@~w0ESmB1Rd3R;BzLp9O)-s%H&fJED8LOl9nV=@eYRy?U z#T74pkn%-zlLTfW%?UWg-eL|SL|5tu1*5d?P;HFOX4@>)SZ0j=7FC}_4iKt2OB*4+ zIGnOR50YaBdj0E`c}X^7^e9wma-5ODwrXS_t#_lMl4G>yyzZ$@2dX$7s5qg^PLUd` zH&VbT&8dAHigp`obRc**qZ?sk^+75+US?zRSZuO9sOFrLV#`H&=~$7dcMZ+K+mu%} z0>|hkh)thq+8XB?<08h&Ln$ZVo_77mIN4KSHQ}cLw`R82TbQ1cQ(!) zDaJ#_6qGl;#bm%iKTF1F@si8)yyQ5rALb=D4*Fk?pm7kp6~T}=i2aIeMVMragIEnvdHX$B`zV58E5hg3C>+E}p>!_Y zt>7TWFdxe4dkzP&NDa`*A{7%c^cUlg=({lKomc#F~9Db+e@H;Js-)TAgPRrqUy2aslo*Z`Pj^GDIGC1tc z9ce;1?9LrE7m;QIf}z&b!aeL>>EZ5SckXDqF3Mqd?pP9I)-M>rliBEbmrDfeHg$0| zN*tTRA8fR_(-W&(Z;Te=yEC!52D9vKg`mwN8!dw$pir^-6hJS#n8o^u$#fmFt_6>K zI?2};VisQyZKLH)d8SD6rrKf)x;qGIvjq)wDbL2!vIU)%E$FmtL8r|YG#GZ>O9t7E zP0Ma z(`Gj|BH5Qgw2=_^GyP2{+iXIyZNM&ei%lroY(mlQ*o3lMY(m*)6Y3vA z>uj4%C>q8p>SDLpgtE;h)Ktm6E6hnN$R<=hqNEM@n@}XRld)Wn;WCk5MwW$RzRWUu zg6@PR2V?oIV1NGJuHbJ)=h*EJw{WH*xaDN>Bw2pp}Ex9N#^+37GrPaRIW6Su8{snO^nPnp$yi+1Bd5UcnjDx-!$?P2Lsg9(}>SXRECo# zR*F=FpOAiz%G{4pjmpfWGRJhmqW4pf`+-bXvEr{X;5mz9#jBuoJp>xxR4yn5!>_Y4 z6d#6eo5066a*Ad9>sM?9Um#hrJRG0TR?rqE?=%L9??&R|!Rl#jHGwbzgktEy{ePbT zb9P@2g7%6-H{4EdLX#IDgP%t6Sy^PWw_;t;RTXYvD$4U1j3M%6RiXDt6QLpa9qnOk z3keL{rp@e;HiI~}id$%#8-NsC56*vN72DJWTAr*S^!=2?uWr9aX=gzilRv=Zks>I4 zz)e086i+8tM5i}EOJcfQltrUe3qA#bO~y+=7fRKN1Ji|Im3|UXJ+5Iz9mOnzfgWg$ zt=Rr<&tmwUFkCAPy}{6fuWIO{IH;M{(xZV9!&ys4rylJjf-Wo}X>-@c`C*YBeD>9& z*d~I3u8`D|YkW8YGDhoOnmb;xRhoh{yGim3q=Hu@Hy@*0u()O%C7A)UR2&r}k7_M% z!*h-Ta{_rsw_+c-C37#`MCs?q#Hra7MY@rMZDXWz%Jh0>U8?C$8rh&V+geiO_R@7o zo*HMCL2N%sjs{8Awkm60__B_hDant0o?fy-i=J;v$NG|z;Fr(oX&-St?M-HCDYUWF znuNbZdKMAD)E6wHdnMyw`afPG{cnC($o-(uUMS=)slqF<$q)%1cMwq#t~i2|@$|__ zBEl6%@OXpem@f~7hB7J71*}M4eg`s&wO6Dc6C;ILdxe|7JQS8M55;8V6|T|v3Zsg1 zc@nObFp|W%@(K^r{D=vT72;fZg-7VS1kFhxqwq-mHxVC-bLAEGS6*?hynK{j9_oNp zLF*#ilh+_gO17E!0SQ}f)Yo=!0~19Ct?fXgYv*gOFJRKbWFD<#)tS^T64D)~! zpDe**BlZGojU`xYqzPdO78^xxI+cf^RWT$fQYw!UUhr^t2^JeonX&|njU`c1{nO*p z29E?>DPh${1!I5FJrU8C{)VwP-7qwGOY>J>Ro*h(7-~mN;cqA+`GeCE0e{1M`WwdH z))X5PKf~DO(3?OK^fQe4eui=S8OD4+!#Mp6W4@nZf?JERZ6R~ym=mX;Va#(Z3?=Ai z=%eBIqv)%#OF}Fn7WMJ&)WAdAs+jm0##)6-Fw(~9XBhMS4CC}OjQM_sarzm?d_TiD z{S0H-euiZbk)-W|)?bjDtY+iqjYO>RGYrdWHZkWS#6;xWvQD~d5kA3#)ofy}!K}!( zLRe(p4oG67<7zfB{|3R>>`V^hMC`9|Z{NX6*6v3jJpw#BEuM>M@mx%c=VChBb1^w; z7g)t}F?r0}BIE7+>5{aBy+W4!ajlW9T_^YIize;)vgq)+( z#$P3E{8iG%UnOn)Rno>^C2jmw(#BsUZTwZz#$P3E{8iG%UnOn)RnlKW^z}Mz{8iG% zUnOn)Rno>^CGGmFK>J<4q4xiG9*dCOy#r9`X>n3Xi<3%PoK(`{q>>gVm9#jiq{T@k zElw(FaZ*W(lS*2gRMO(4k`^bGv^c4x#YrVCPAX|}Qb~)GN?M#$(&D6&7AKW-mXk{A zITpXu^3?M?u*VYN8Bgj3b}jY*I;o^QCzS}DR8lXq;lN2HLMN4!=cE$l6Hv-?Qi;$> zCG{EwVnB<~NhS4X78{Ro5jv@)JSUY1om5hulS+h6DycV3uWA*clS;~SQi;$>CG|Fk ze>kZ`=%kW*XES=5Ra6k6lS=BKNmm%5lS;~SQi;$>CH0=6b&JqRCFMD(MChcF@|;v6 zbW%xuXgEtFmts^-c}^-3I;o`oYG~yVI;o^QCzZ%07~NBzlS+h6DydJ6o_!;9Qb~DE zDiJ!Vq&{nsG7O2(NhReusYK|clKR4=8xgsVG|x#TLMN4!=cE#$lS;~SQi;$>CFMD( zMChcF`uj4m%hU*+R8pRkN`y`-DbGnILMN4!=cFQoeadrEiO@+Use|h*WG9YGRtFbJ&EdImm4i1Ec*j?^|4$#a|vVj zWe|-{nv(4~sYJLxU=QFz1~W~B`vbP;q!QtCwq3)Sj17yA*|z7T65*qvJ%r;YoKzxw zGPFG>l?e9-Y|lw0!uL5zq!0tzZSB88`(oUE(0|#Fy_W7W(@P zH(5=fcrZr+suh9i}euNtWh)vE?2rMqWYsR8Oqa*5KHY$_@9W0R5U~KLDc2g7>q?-eT&J;Ie*)Tt8L?cCW$BJ1Vi?%aSgxso8O6t-~xu_CpqWDhvG zJK}MfI`H-4({`~OmgybRC}=MJSlb4aO1HwyX-u|*CTrizGuaNB>^PtWvJEQec|c90 zxPp!1_drdfxRO@-5@?rCA)KAz`7E`)M#1AlHt!#@Xg}E~N(#XJqq^^`W9;O6Gz%~e z5Bgn8f&LovKv(fI+0!9}=jPr(XA0j*P;(g3lTaMJ=LVqbfp&YGE$9}e+XvJX;#L;o zGg50wy{#O~g=Lr(UPXJ@1lDfi*>^9UpZX%c=T*?*I+Ul&ZUpus@EnZk+nuAAyPb&6 z+T{RvUINcQg~x3^P3o}vYy>Br3Al60S8lyJMYCxZ+(vcz3_Ptcqx8+@K}~o09)#W? zOgNli!&pawKv%3INyV9dNeA%E29HmN;;LjFM6yb~ShqS=@`LFz_x?= ziF0JrNakPr5-^$P)C$?8jAN6MwzZks5XxnfFzz1XvcCvXm1};c1xGpTdYVIveI*mg zZ8PG)!Oc?~{8LZO0Y>t}yVO}v2UR^+nyIJYID;pww>a!X=ZcNEOrT%z^jHfH_c)#H_c+l?f`4dx(4@*z60!!z|;q*x{}zmo1%Vp zEatuGYjfW$=Dq1_bN?*nz3FRnA1$`d$jsQ>Pm6hP`r6!Ai+OMQ+T34@d2jmK+-Hk< zZ~EHYZ;N?v`r6!gi+OMQ+T4GOd2jmKY+11lCck2v`*AVvO<$Y)aAKnc zBz)|xPT;`X#P$+m2Ti)3b``aLe~8dZ?PDqkVn6j0uzpMewp)-aL?kp3R-~7J1E5i1 zj2D|^2nqNd)|fQ~_xM2HX>w%GXyTS<(M_wXJEY=22wz3@=165Bnfd22mN=5 zjhjjDN}rXz-bi5xTuc$Op70siD7=z<=*PB!(M>W5xjA%1Z0nfyAD@l&ZP;kiq-%J- z^_|hI{Up0HV79$ZG=fo4|_|QggM?co*Xnhgl+scFMIZV@*)1^L#tprR@k?B0G zxjku^&J!liqWU~G9@Xwgag-wL@I+P%FYozWd?|VH>f!yEjGys`(9LHP^Q0CYQY)(!A?=g7L;iuaQ z_%*X%7I>R;_(u9%P?v+sC&B`MPjX(o2`M*%wh^>-Sv0(3g%7K{iFRZWf&r808PKjp zqC2x_-2dwG83^}+;N@bx$WhO)!?#{=ysFRWa`CU`p0^O)_WMDHXj zwR;6C?hw!-*Wm~E@EW5LZsj+lPw)*-SKk*~Lm z^ga+OpY(M%9M&S0>uukNR3niph%9_jXCdhB5A$ocZYpd$b)5`W?)3i8tlbuY)n`Lm z)p-_*!>XT^B_J56W7T(G0~+36IVX!`HGgT>+OkZQ>;ucwNZ$P!!+Yyb^LD%N@XUM2 z*D&!tG1l{E_!keqeo3gc9~fWO_XYTT|NM=xfe+qY1N*7X!J8~J^7Et?>Hg3Wag(&{mo(DS7u z&tgY@pDHm!@6z+yfI~7YXNK;!j6xs7*nupEfZS{)c1 zS6`qvGkdYfLRw@7;#y|EgkLjkF7L%)Fx%%8>g6lmYZc=5u9s^*nA0L9_?OzQ)E_hJ z)tddbt_+0vqHT~lFmlb za#p9CsGRldvu7Jy*e@iznA+?Hmb0=w_8$684*#25D)+3f+~#cM_;jW>bL8-n_syfe zgQ%}*>3tWGXV4cA5DKu(TpOqP`rgdw8pFpr?Ryau))+oUT-(oe(BqS|*8TYUOibx& z^e3(3@54m>_c6(neD=qyFzg@${BQ3KXC#M&B$JDyotYB{daiKHT60cF%09~=`6guq zAFbt(pX8%_ax+-)vD|DQIS%_m#H)||pkxGZyKv|*aRYTdRElqsv0t<6<82S`CbRk= zJrf+!U*WX`G;Nc0jl8PBT`=ilMq^nt)%xCt!f8sN`XHsH{*dQy7@g7{V+mBHe~@>z zCKH!J*6HlQ0pqJ@ncn~$Eiu`@0cbf$Ypt72g8LhQ=7;~RZzCYc5B~+sH*y2!hyMcR zhyQ|sz~>JkRcI+bz8d(FlCh`{&&S?v;46da@CQ&Z@U_7#WnD_*AzC+LJ&!w-qeE=2 z6|vq18kIQnBY_t8qjCnnPcHMrbl7X+5l1W%Jc>`Fad?CUhckp%L2xUfy}v;qtgImT zf+P6t{X`97Ml_Qm79&#nSllDlSP*RSG7F91mvkvJG}46NWfmHB9wLnlhD3bI{CL=9 z9**oNAvF2~#8_KVIiay6I`_0g7NMz6Aspr@W@uU!Ig0R4QfT_EL~kZ#A(!cz)Pc+!$lW z@;lyaO7dJffdsR+7MsZO(IYWpQLb|(s@aa$%wke9$7>m6QVNX^CKGp$8t}@JNg55+ ztN73c;fjYE8ds|LFj^4%K@gfkd|ORw8%82#KEmzfU6XE=d=ko+cTMu;U6Xuy*Cb!w zHOZHEP4eYklYDvCBwyY&$(MIc^5tEV{6+|f=F7V#`Q}{{X`OtWZ_kDcx4{nh%p-B< zO%yGYs9ld0e3;M4i6IlEj#T)%UcipJ1_Tr>+^!q2k#`A}6OMHScC?{|!u?VF#JE2R z4Sg17PfRdUqT%U1fE{PBc=&s%_DK$U4`!o9XoKWne!3Q|CVcKBV8aY8#F8aPn6gBqWXaK6 zgfSYPLM_H#Em#~nP(T}c;(1Mh8Jl7-iBT$Ior7>nzYk3!)@2AstebI%wT5DXcViDJ!c!`v5VMs4AN?kV`8@FQc+s1d@Qhe21|!k z8L;_AUSaqjm>lc{1}h44jIb9{L43Lg<*j7sZB&lEn88j@BJOs^Zq;begvpiUT}h;=>LiosT%zV=D74TAO3J53o(+0(x^rPbjjuwHuCi(&~U zd@WL?ue%S%vx?ei8dt|BJsoNF^iziBgt=pr{-eRt;r*1p z-(Y#+d#L}@M&k@>hUkG8m>1uYandjH-D8v2OD*zx+09E?pEJ!XL%`>3LeNRScBP-@ z^%iOV?5DY$O1#0JvFmgzYO=jfe^iYLD*OXw{ncy4>uBnajfk9ZWqV+s7+NsgpV+4c z%MH_CEB!ZvCBh#t-Df796Lye6`g4lMZ##zhHhTJtk-*T7bof-Ve#r$;py+O`5;QG| zGI2ro(rmplD?Gh8mS$EOEJr!~++n0ue||_?8f2>hUNU|#qt!s8i52dOtXd8F z5NsTfx%Jqp#?V6UfJ&MSsNSebnFaM|QFs?k^I_`{{@>(N-H9J zL{_KtwX$7!Ca|K#3O@qX1H~(>_d?epzW7qexC(<_@hx895jTL}j(P~qR9~Ul!kAYF zj3x5O^h@N|Z3*-szXLi%*?wmIHpfh@ zyWwX5-eK^!NUDklfoDI9Hw1x~5a=@ofj1F21}S@L{C-bQU9ZRX#4Ex5RG$eTeh1<# zkEn_#Bg)33OY!*#h@~z>0N-v^#aj_5Mxf6%2=JS9{LP)7?z10uC5m?;ek|h4Z$Tg& zXccZ!+pXd|fUw4j??K>rrhgEDg$Vpv(z{M6TUM&#S3qE%eGVaTHaPxsI7g(|<**Uh z29AP6vuOjdXMdym6oPUSC=(B(G;7+^+j>HteM-RoIN0Zs9R?bw`jjE+HAJm;qfoRZ zh!SfoM}UuZ6>AZwSkK!9xD{WF+c$_WzXk!TNtNGWVDS@xK|C82{{sOLVWFlakaPom z@)4jxKM|GvZJs{e-1q>RM6>#;xD4@mlsU+i0B4J%FiGjVwXDt9mR{(NZ7sH^KOu3| zJ`3Bi2vkQg!0NUZBekx+oLD>Sb%XuDhLvw|Ak>;&sDnHx6`|>yP~QU(({H8HeXRG9 zBxF2huz~UnGCY9)TM*k{{|>FXJ$@iY4WPFl6{(gsd$eU5Z4nyn7zty=$(fn?4^)ZE zF=12gKnzL@57PXuh+by--E0YZpyuyV)GVtY;b}B_PDVA$Dm_%y!Y+sw6RXdWT6m6{)IQn6T_rj9!^F`waa-n6<1BwUjw+zlq@zxAt6)a4VKU zVJNtvy2(7qa_7jMoNCLErtPr-^b2snflfu=0kyUR>+XVwOhP!Asj{Vb;Au75Xj=9O z3f``3HB;#*hxM{cpnHC)iAhWaf&XqM5sUG)O^~238_h()zRGVC-#>+i^is?EAVN)l2!T?OwM^cJB)%K4NG_nrRQLa6i68sCXpiqhx4k3E&6 zWP2r-+bbNJ+OXn9CnV(ea^e>=Q#zX!-~&G#mCSR=aGi&^!dWsKXpTi~xPt%{CPKmB zLajOav^f)%intRXsi=?E9Cu9NhU&#gU;N)%b8uzdJT`~qu{k7<%^`Vg4#{J4NFJL*Ek4l@E{Et(@gHFxVQeEY zA}Y0~PvTy=3_yo42z9GPBbJXNbb=}MNlY~tadC`vb!6NGBykX&T+k-s4fQSlWkC~^9|%JqVhlIi-PkmT zi80XITy89n0yPVr6|3^m+%2`Ixe)h(i-p*iRfuyywyND`m5VBgCSmR@B`ud=0A+0v_Q)2qyaKGgpZM5puH|&U=Vi?W6E7XX9I1G4!vkBkYJ!b-lW>p4gz(t ziCBb)wtUT?AEdXFW9L(-?ZZfyUx@g9n3UU(L4X^F9o$8`6=~|wywL5q4`lw3lSh_r z+esfq{fFzEtd=cZBW6Vr6=!vIE+BkgZp!5Lhh%@9OGL8AMp!2}j z3JJzALB}DObGTK)YdWAFSIhyO@m;xp*{ug|#{gJE27Z-a#ULJh(G& zA44L0(bl1O2tv81jYX<`MC3Dy)7f?30NN3dJEAbOdsut{BHFB@^zz{d1_KM?O{#Pv zBg)tsFhp;vMhurix{{p?G1RIzi?|J<%2Xd&<@DGDMC;xZ^BWT{Yn`4uCB9s5f{2{Q zwHC1za<-I%-*uv@QtBj!h@|vTjvZKn^CMh2ulzsky$6(DRk_D~_IZ1o_nmhplS!Kl z$%OP|GMQwO$t0OnNC-)Q5PC@=gb-TjMHo6lK)Of=QEAddR76muiHeBGMMXqF#fA+O z!HeJT|Lk*SCg8n#?{$4^eQSO1TIam`Df`*aes-^io`zI5axm4_gfi!OZ#9ave_=a* z`Zi@4TtQDR+Wq?)fvR?V18w7mN~kG>UhL{ppmwV1Cp!nf?}UFOzxospv>E6 z4U?7}l=&cI^-j7iM=Y{d?_{ms$y&XWwR$IO^-k96ovhV6S*v%lR_|o3-pN|MleKy$ z>+7AAO(di`RGFq#@1$n z{8=w?i4n`EtFg0A z40U3!e;&#&KNQG-z8aC>8eDxd{u`Wv>*09|*-oDx95^3HI_d_h59m2?S7;JF=0mht ze3)(K0|&5$6qY{kucvzmwekBZ=!LU!`j|JaodTjX-w=mmia{C(x!sOc_^E_^4Oadg zatVm@d4}p`MPevjm0T#|Agdv2PV#;<4jQ77h`xmwu@ADkqI{d@IGrkIn0*&6xxdc? zuR$p2g+wXWeKO23`O29=v@9)-_ubr)0f+d=NY`4`XgXz4W?fT+QmQc4G3(t=)j5 zL}At{J6yz3B5r_~{U|OEUJRIHR>5dL7C<9lz~98U7s0r3A3@5H1(e)}0nY$v<|*_x z$nOUEry|0PegwBL$Ug^O`F59n_>k*ii@%8ou@rs2x+MLMgR@4jq%5S2U^iA)+*qQJ z;IxLs)h>aPk9ue%n`9*G;h-7rFlcJ(O{PuwQ61jgFPUy46aIUX>BE-_ZZqaew*49v z{>@{q%tJ)Y-DA_N$_EefSk2Ood9rKPQCZ%jT-Hgl4#li>kvRHBtH}_>3E$yoe~5^`nH@#T@&O z2z~5V!&3RSLOsnXv`)f!Lm}!b$6i<4lRagj*Y$J-zZXC$4X1+tOTR#vJS{awcy(Rl zaC9=Vwk0C4?^oenW#&?N=kOecNcRc6_*h;o`#cbZd5yySmBL&di8!>MY=yZt!k^h6 zKQkyF9^w1+=ul3*N8vvrsqyc91;0Mw%EFCz45 zj+qA72d7=qGN}UGbz%^t7Nf?==+Z!bP8(?>s0OoG#!~t`!DccK-w0g$e5}LIqo5We zqc6B`1*JD5!U5Y59u8{XfnbKy0aJ4{x?j$fEjG{VT$@t zK@71va;Uo=k16i>9ir}L5FAJj2!oet>7u6WW#}ac8xa@(&Y=qZ@TR52HpBmDr;<`T zo+bF_69UoT+D}F$+g`!*zq?|z?rWlB6uHZ;Hc8BolP+{t-NwYsSq6n!bu|;6s|`wK z)oV=5^0aNcufoNB)bY4|_f`J3>Aubb;rpJed|o6$59hH=@KK1qE4xY=zm1$v(;wuK`qVgmV#0b#Wtp$;lM$JHWWTC+eL_yp`?=2E2lY1~+m$vQTm?ZYNIz zS--3Zm9lj`w;#BIUUZi%(~ZU*2Cc9}d2C;tCFmOH#lMe{1uc&yKD03|agq%553*b0 zzuFj=_^&s{MN?66&N~NH!dG14XM~WRY=E4Z8|8deeap;hIbSpE6>|RKFtAzIF83SG zgNFK z9**$y>%W1kIr97>9$%5?;lIT50C_$L!L>2o{5Ht%g`gYc_47E$2?{z*ylQydB=h+n z@)_g$eEvQ5IeMvla?!1#6AinM9?_dsK1a+;5N_<3Rc>m=^8e(L!+)VW{r?ZUS;{4W zx2d=OUmJES`>*A(!jU51+pv3ya)S-KMLR2|_YS*10^Nq)8z7y+!>~Jc`eFCsAh#WM zA6e`{C}K67mdICmEZE**_ty|>!|v2h$QR$$@I1xCuse448+Lyh%C^I91rm>oZA3;r z`BU;P!)^t)YBCG($o9kT2A~fQyG_r5+e7>Cu)Du_8+K2EZQEgYkWn5>|RcXC=3!Uy_LgnFt93zcluQh?}7VgmBasR*!^FR=LSLDfjDLj_jvi1pkj(Mr)CG3?k<@X?R#~jAu`=eITm!N)Hw}MUx?BvV@(BsPRp1kVwJ*Z?2te&Cks}&@3hUc{Hw0X=- zQ735<9Wa_VjeZNF{#ITuBWu9LP~MHm?z{EZ0Va3mMe!NiOsGlcp(Xh zFU*>V@e^Q%=Y&}+vCcKS&la%j%hod_&N`@lc4I7!{2aNFMhKVN@N{Q`|@!au%=XWNe#{z*=H;+aVb;VqLoGR)}oO8B-k*9C;S zrX@_7=B(xAvkpZzHzGHvL;xlj!9;ajG- zooXnUNPUB@C~Q$KI5yk+J>H%{*HFhatr3($dKOyCtg$KgWSi!n$~NU*wkh|rO}UqC z%Drq;?q!>DFWZ!R*{0mfHsxNnDfhBXxtDFqz3ivlEABld-Xhj3G?Q%KWdxE%suW~@ zJ#kRyZWGsMoln)D!zt=#ouX5Fv!_|C>fI^~>|S!ptnF=Vs+dofoZyufev0IPUlp({nslG(Q64z?T$m*>t@L-o~|DneRcj zVbFmRA3^Jb!7`nE|2dZM4I~Wt6xbi(b?Ch~+=gM|dL!Z@?oC1uj}cAc=GQDkNlx=r zVzmn%b!dCYcffW44bhbTi8!_sUkyBsJlJYd%=HzB!(&2|*hh#(fsf=!>sAFaBHM>? zvt@@SMTl?lh^n92;Y4H(GCOSXb;iaQw_6Ik3e2u5i~E1W7qGk__=Ufb7T9%(xy&>JmDk2o5B+eCwVSZQ=~Um&LS zG^&D8WQUt==gNVI94((VzluE9ia39su)+5FusPDn*lj!}U=0GimR~e2w<01K^BskC zt07W}lc>|iyeZ6WP6aKM_(s?hj8!JR7~kW9@n;bK@CtV}kaH8-WsM)nO4M_oX=n9t zp)kLWFrNYwyo#JK`0SY8D(rSxN+7T5SB32~3Z{QDV)&nR3R1R3%B^&Y|I*k7DcdgP z_H)9l?ZciYwGVN^Z0N&2CG0Uym=pT2R|~6tx&N7MgU``kgu(lLvHVhtkL4@z$db9&>LMjZp6-JBR@BxE%>cbljpq*8VWX3J4f7}z zxkH^IFfh!Y@m+YTW5xx+SBcM9ZE~vaKb~2Hp!(26ngUK;VDrb=Z36P~pgI`j6G3$o z26-~5zCq4>DyS~!?;An&ETlXQ3$$+r)uVyF6;$6t=C_0D&-i-=1-}U~f9U}P+OP*^ zFZeG^Him^2?nbg#^`it6R5ufftImQqtiBBz0!W4ihSrCRmlV6xTA zDHgfvC-If9YR^cadI;eat1scJR6P-DP4zJFaKhqL&ea-U{G{0ZZ5TwT_97Mvj``7x8e`R9c)lo@dx8RVopB^KFwRTKSNy>^4;3r^V4R0)vUV`e1C^{l80VoXefIez2c;aL{^F4Xan;!C94L@B zfEbbrck1Pkay1e0uwJaxsyPcEG3iVY1H;n(kMLhT44Vek&tr90ZNY|Nb$?PkL2(>{ zkI7HNlM0{ZJ=Fc2w-+SUYV=~IIu!~()csvli8K~Gy@}gvJ|G>lr@|EO!A?r1!XdZ^ z*$J3(tNNyPaZq`RbyJz`R)3+~wh022YgQ*<%2O2&>Q+3D2H#`{YEt2P39{2L<(a>c zAXUuePK{fXkY8v9n*9d)Ajp!g+%0txRMBae@`5lUC|x;|UR-&x=gca3%1eBLGB9+n90;}gAEUS~HBl{NaQ@Z<{XSj2#p;72 zw&zMCSACjX%U_W)e5I@2O}Q9U{UfC`T^#{~tDXztepkI5uPzuqkkq0rwsyjuMhML( zDix2j+BF!yE8gAHe%#^oO)O9TR$5hTu-(uRMC4$X_yUv>ng|FFULwNCi5>V`5;`~h zIt9?~*Q{J)md@TzRC8dI30uw}{c)dzpHW*F#IW;BIifj5{9H#;p)}tnwL6mXyZw{W z=UAnjNW=diwmY0t9d2L5X?YD(fH99J5>xuRrt0vN;(Jo0$9cVaoYYT`lltj#is|9Q zyC4~ien7H*=nbJxOHbT!8KY$~z6a%mxi7{xV)3q<@pTnHaNaGx8Ai*AV3(#{8_{4qe7=}pXISm(aTH( zUxni@I9A|jO%ULWGOy?HI#zP-#PJvp1!WOZ+G5x|UoJoL+~@IOcxNhvnF7|Ntq^PgCRWbESQQIqEEq&{8C|%mO$DxFtr2th*uENKEUG!!Kv-Xb|AN}tb zHGFPACJKa*$9zxKVtwdjq8i+0-mVgv@)a;iFiilnZQ^aTRdKhYaoe9Eh7jkl#6KZa z1^E?4B$$<#57`x86Bw*64(3X%Q|yB2myN}FhtIS^H}hDC>tSyn45Snax<`v|7hkuD zXYU!@TTK8iTSJ)Z)^U(=H>>b>UX5}SM?+a<@MhrcXO01WEZub$KCk9^0^##^Q#E{g zS_0h0pnVy5DOtcRNQvUiYA@t?1%_b-J zd&y~6-QF6^Iwj&9fwvEEx;bK;;u$9?fDh=k@B@0eDM7H<-7T$t7h0E4o{Dr@zD~^C zo)w?9{$P>)BdB?YiMKH!tGkW!zAGaQiXbbP*W&-v3iz$?UKF%~S=|F}qdo!U8Bt4# z@5IzGz0_Bs{9M$!guZ2Be&>kVemmIr8!?kuWTxS0)))B?w}9<`gi)zA>wO$KTEpf2 ze54Zp5%%D}_xNIaNR%zl?_kH3+!vBo+sP7D9!sYkowhf-N0LscE}m5==bl9H66T2> zu};agpxQ@3Q%Rd7rVk{+j@vYUoXMB~%QuqS=Cg)cFY_BF^DD@-NwK2|Dg}vhVL8fY zJ(U(;QpmPC%H^I*I)!`|k7<6a#2vZja8amngO?Gw(9Z3C&)~=q6JMb>=$=oCJ-H_( zdbCRP4@`&Sf$3c7Ytwd_V5e(TPDuNSXod7x9NHJ*8NU^1X0ZJ(96flR^*oLlgM#2FRFQ4l zgYmCKD1lR{9CuI`b6Uze$Wr}wo^POuTULjsX4?KuWru)Xk;UU;}gmVcY~b$qC!70A=7tnzppLX=UK1heh~brW76icr&o_6I@9y0adQXfO8Bo{|JawQo<5CbJEP>{TZA zarlY6)p=p=6>DOGS)DK`lo4X`&E`T-k~H0;xJ)o;e;u6ax%OY-P=|DU6ULQCc_QeJ zC1@{$zt3~$ewZ$3peo)6?2mxP={63xKk0Eajt(3%PQ&pE%wy&AbsT@@VLK&oq?#D8P!9iB#fm#U4NT_$b0`^06nFXLo2GleiC*&rbE4V0}I2 zCJNhG21ec?-aiK7E`RVuY1`C~cs8MDcdY^A+zK5mXX$K?Ab+yF zsA;*C4@&31s|E#qTYC@JFiPndbGtA%s|koPp9QmA6MMz38;PZJ%XMtLa@=JWPEl7W zuRMJ$gol=Rp);l-;?EKhWA2eq?W69+bc*Lm75SLw4)MII>h*`#PfR5`#4}SoG3Gw; zOi@@d=5Aq9;`wpp>n>qdOV00}^!ljTUttTu(V|-_(S_(0FQ_f6v&6y__v3FxN!hCx z^*K=WyOFwQQV=Zxsi?1!wd&o`pz!s1Sa#t9y>vH@!`dpb{@h?IVcXXy?G^0mzDLUC zj`iayr*`K9e8F!1dlY9$X{UaVpBJ;)In7)LtK8M7mpg)RcIms6Pwj1u77uE)WPma{ z<(1MYFEwRGA@pycVd0a}BI#-oOhLJV;!8;1-Cc?~3MV)Vf3@2Wbql*YKDM=v2p2x@ zoN7XU9C8;okTl5Ynm|<|HEMo+H1~9)#C?l%lIc7$_%_*wWgC=_c0Nv{4@0pFUP<$c zev|Onf7vGd2kYzqv&E@si8^&gVuO2vP}1tPCwkWr(rS(q8;!&|LPqNdiN1A&jMfnn zo7|7_Y3m4CS?mR#oL(PXN662kTqO>*^R)#_D0hofbsEeCe`#~*ik1b~lx;aq==zwn zD=AmHya|h?Z97Nl01SEz+5#(7x1r|5eh^bfM z$cdo!B^%WgjrJ*cD@{o1=Bc$#MvVz{>#8rPSomt~>#(svAg$`%zEX+{3Z%f*JQh!_ zl-C^UDRM_sR@HYUnCI{tm=nNvRAhZ&v_Uza{!RM*kczwmU-{JfdaSrV5xNoGw5mM!tpOhBYK6WfbV4oV`Kd<_6Z-bh3AH~@Wvy}FC-i-x z6Y4mgxgM<@bnZ)`6Y3(K!#!Gi?c7&GC)CY6+O$NF7YY4D=!ANZ=UYNITJ^pACaaq3 zuu_nf-A)6xjLL+sRar-bM;OZ>tK*Ke!JTu1tj4`NRL%ji+O`+6nl^?8`@TPyow(o~ zxI?=>J1WrcqFIShSJJGGKnyC$lrsOToM;k=WPm*UFHaK2oD zHSQPS$k;1h&CBXG&2Yg+2-)3vCBCnsmvaxxWL-|ydYZ>F=r5q;zdKI^IivhpIGXbA zx_&E+A0h_D@KT^+_$S^aIcwavByYa!0Fb;_c}(USEK(jiSwu;AkCZ8o=moc1M@D!K zUYWTzp2MZfQ`wh53G{pPm>;m0AnDT)B>QJV>q!s{UXhKp8fHBmX z)B<1(wI}bO)pYIN-;AUd0NpeXb+IxI)ZwA-q!s{UXd%Y}GGD!vXAu7WuAFl2>ZjnH3-8%9^+Zbo`CG3gE%($|rU ziPn3?%W3MfQ7bXUL!73zp;$H)V^kh<+2p+M0_G`?$@y{x1$9Dy%2U*<_he2&iEs%g7icJOP#>W0^5tgQYU)IrC&g))JYx+)87#1$sS6i9~12q4<*w(2|Cq7 zsq{^fa+-(I>B|K5c!&?H>w~?i)2;L-QfKL8Rr+0_&h{KZ`VK+oc*v#yvJB{453#{^ zZv}MT@%SoLQWv}--!sI&Rf1%$GX-5pNe4>Q9D2}+LFyv0g(EXTL1I)*npv_zA}7^8 z#$A6L=uBO4en@4qVcmuxb)`&$w3?$2Ix0wg+=re`FOlr4mYD2Z`e>>033&=f7Sb0; z)YYC=mzL2|*Ld21^dix&wfcGFu(a0JQrBH={wAi+m=AQl4`H&`P^2i~veqIb-ce9D zB*2%oAtCKIBvium3a9p?);1*6+J=N$+mKLe8xm@5Lqe@>NT{_93AMH%q1HAe)Y^uG zTHBCNJAz_VsI?6VwYDLl);1*6+J=N$+mKLe8xm@5Lqe@>NT{_93AMH%q1HAe)Y^uG zTHBCNYa0@3Z9_t>ZAhq{O9e2L9T`NIYio#kU>hpx?lXjpP-k;td&&g$%%txvo?w8= z06TaE{HB{Fuz7qQVI8R3l2nP>Rqvj-5g!~M9%z$MPm1$pI2vW1CfJXpB)jJd@DI8G z)ZiXo4eMD}KM%stD}ma9=;UN!{&N~f4UQzlrolMsam>T>@Th4BdvHd#OI)&3Fsuz8 zeS*B{A{@Kp&=IxajN^Cg^>N98LDN-GPlT$ofTGS1nr@Cz7e%PqLGuHV3~?;!^S>HH zsA^zdS<#abiVIk4Sr2MD8aLb`;)ZPuaj-bQ4acx7u4|=XBaYi~=yYnNLo=wagQ})H zYDq9`45*jHu2WfJpA^w%1x@oK)Vv7Q88j`6P^|sDr%p@OI8O>4@U&e5%m!c42C@lL1{MZX&g$$rsr{JB=o0k zSa%AVeh5M9UPZWiW%S_nRS23tX?_#O9yofbm+aJ=<}e1^*#%yFPC=>A#ADrob;ujh zsFc`Ql|iI7+aA?Na=Qu_|BSz3i|}2%n0k1>*b_ADtjs>gBmPr}O+qY`&s5^4A&7PI zveYA91JUvT^@ID_a|BJ3HYL*&j5-7E?bXFdZg~SIcRs3jkv#1W;&G#d8|}V;ob)X= zC~>20sF^;&afff<#)MSFqDQ3&CEIda}@1*Crc$()(3z z@i8CohJ#N}h@z(4;^REp?J6zK@pycG60n*{Eyt7UnhTIi;DUIzFk{xo=XcoTE4AdDNUM*+?RdV*OMoSj7?Fv|)=XEdnXXtfU9o1mV$F2Ln(2x)(-mu`E7nX` zteLJ@GhMM}x?;_A#hU4gHPaPqrYqJ=SFD+?STkL*X1Zd{bj6zKiZ#;}Yo;sKOjoR# zu2?f&@y&GJZurTp*3S2WR>L!U98bKJ!n%k*v!{pXlxfdxcCPF@P?M73 z@9=_2BGci?(DM2gK(?^#1>6N0qp-7*Q3jBzh29r ztT7k6H`C_jjLGn9~h90!jUxy)t4c&PSiN7Pr;qHJ$0ql zlW|dHo zv-_9kQg>XMwWqGMpb1Yz-O6@pvFD^X^DTfSzHH~MY?qe#vR$;YU0UJGHeXM063|zS zbBY2wN|(IdFkN%#KCxakoBQikb409{>Xn);9!duGJ=5~J8}OA573=)Pl;~{bzOt(4|2 z{=$z1?c;?EE=(Y3x37nW6uzYZB4}vgGUU7ceBi?hH^|?9GFZrsaOqIm4!cjt8=Sj< zfSXu+zCju^aj5SGGxqS8CE`Tq)QuU#V_lOw;b|7+g6&96HvU`9Dok6<^Q?FTiH8bY z2Snx*aiO|mCUq%BG*5%+Y$N_`J*&^6x|V*^E;RV6^xXx{s%p_!#u7S^(7aSWg6+4+ z6c;wl14J|o3~+mTh<-d4eerR9navn9*1t?k4>FQh^bfB zsj$5mu^qn++i&}`N$e}IeOY4P#PK~GpV@~0Ln^)#iG5}pwx9JEOH5`BC7Zk7ATCF0 z$69J{OspgB4RJ~^e;1u3X5Ujs3tnY}QT=?T5>h;vF+HNi5>p9nt(XQNvW>)W%6eo`#3~~H$RidZa5oz~re0IIXq_8_( z-JoFhp=qyxs*ht20l$*2eESJt9|mea9mo7lY;%xq4->?*3g({eij>P3oc=Xv55P3{ zDTqPPEtzlNe24PnZnz6x6ZkSLV=ENPd6L@kdpJg-?}5-`ox`p9pyOQ#O5bz)5k8y+ zJBy2vuIv?i_9pI^Y*ZCN$N7=8Crz54j1POrPnSdJApDM-aY)W@wh7Oy+Hq$@tHUaN z;e04>-Vd9VVnsVD#lGOB$VnsfasKfoInG0VPv7=8sY!mwDFyD_fzJ7%fbZ4B4Z}mK zV*d(mzFoWckXorjHv|4!$!g$l0o80gtopo;$y&7-kEk*}8(@LeW?xlh_G5vT`d?G( z4>%mqD)vX!A=qD_^$5PMFs}scx>+^hV+wP@_Z8mbay|paX9!e&p2xl0R-+6NftDfu z4Ab1Fz+mcA_>*}$&d0G6HeU{V3tP^qtu6(nx^<1AG~d#3BPdnRCkYi#p!6W;hY&U@ z$%bMl)s>&`&$0EtFtaMGg^Tgwj+5WzxRgU*+r}>e_2rGuQ^c)GAx=0|0@zla@IpBn zK)GPif668sl~{ZnjykeVy_O067#=o;pq4tiBzBWw0;aq;lq>B)n1Z9%b+gU zQu}IRne7m2Sz?P^R!{f-XdmhGh1UxoO0k{X8&jA|KhSB=#42Bpcu%*HqEmZmygtr5 zy1QX5Uv9lwr#jXLu+)_XfWOrFhET~68|h%Imz?6PW$8E8Q8nPFDVDm0uv9kl5shjT z7?Ie6{8K!Y&lCtJ6M{P%T^ZRBD~Ag!}{$>m;3 zKCQEQ$z42DOzW&(a+QZ_GMbdy!vmF!O-k+Up(;aFORrFR`ODRI##OMF)aO>Q-9Qv` z;f!7mDOZSyd-q~>k59o~MkfI~Pv?MBo${1O zOvAbKG1znA)4VJ0N4yL6l4#IBmkV`cNrf%&sH51Jc5uCh+oz!9cujNRyI`|U#?6Hl@HJt2 z=Oz4?ZKAMj6NP1)C@kAVVc8}M%YLFTWs@C)<{qknN%rbAkqS-IA!rQL~Q%OLdsS1h$){rhKTcplT(tYfXPLL?b|{ID9v*FQAZC} zYL&XojhDg7rKN7S4ifV+gEjM5THr1+Fgb*PN(-HC^2g4DHS<{Nop~Irna5r*N2LA? zUoJcZzXO#s^EPF99$>*<(zozyUNA{yE<7As%4QyGmVE zJ8Ka79r)R01~o1_Ex3njg1h3^p@)T)74BV-Wt-qG+XQ#nCb-Ks!Ckfq?y^mAmu-T( zY!lpNo8T_n1b5jcxXU)dUA77CvQ2Q8ZGyXO6WryAEd*M&3GT8@aF=a@yKEEOWt-qG z+XQ#nCb-Ks!Cig}RR@)Ag1c-J++{z(ZL@^6=cY(9?%O6)q->V3df-YhY0VN=*C=aY zyNqTDt7|UwW6C4)?n3kxRJvh%|<&e^)|3ncb(3PRnywNZ9f z`xQf+nC+%^uC1T(vKW=n^)uyE+8w_Js8iBNJFCU(XZcz@pWZ~JTt8R6G!87Me~OIy zZl7IB=%G+kOQ^Av^$SW28q?FLC+Zg}juNaW*DqRaP)LPWzoV9)%0ESBQ2q%-SH6=D z0cGu3aW0dHL7IrlvETLpfWh~5!!*Eo-Gae3N!8%II@zE}GlwkVxh9()Y{fPFNwjg3 z{Gm5@2{M{(a&S^|K7j_?y)W{Jh&)0EBOSdw_Y909*=V)Gnz`mTHTYiPWP}#x{dTdY zIT$fa?G(Km_e*9spbtjRrez(X?oTLpZ{NaBgV*is0il0V;T8N5 zEH~UH@|q)P4l^Ll>qT!4)tEFdmiT7NJI(tI#=Tvr`m(uR_z|I^({fB};95edIqCqR zM|t-ia&K=eqqdjZpCueMhmIx7ujbYEGI;l>G>PEG+IEmp-xvQl@4i>@9q-*XNj$;3 zb@0he^m6Rf_9P$HIr2N%^H@@~ntOC3aci;3$g@Jl6RRALh0+Pre3U}Zn7hTKWg~O> zFDH!%B()2xAB|TfQkPF88zXo1Cej?ANMm$R(sd=RrPWaVJ|3I78LKXVt4%s#-r}h_ z0+^4u2jgA^+LNxt&k13CG?+~#>S}s`{7wuvWqdTLluC?PF0KPFb89YhVGm35u#+OJYju;maKqjD zhU|7n!ijqskNLP5A5+ZKcO+D6%qEU)^Px&gFjc$J#Csf%_`d^t`&l5@!8b|NJ)vym zp$tun-P6UvuS4ZYULWB3jI7sI#G9~ZfVq>0vNc2hvSyz({#8p7#0?0O_;+|-P!Nw0 zMEhsKrjEq%1svmX%=|izNn(C<#~}D459QUU3&bY=6LCz7sm4D;d|tDEo~nxPGl-EQ ztxJO72E@5)iCN&6z&EHNAh!>#VBc3xs;mIg6!W1Zw;Cf(+Pe=Fm6YfBe%LE&#=f93R7-t{Ebp2}LK6j>X2M09ED74q0;OQbT@-0KBBIR?#@!sTPwQj9 zJz{UWABW1yxTkP56WG~e>Mfr#R~!r19+%WqLIol&tyIr#Kg73;Kkii=3lMYrhr|Tq z))OBk))U*%o=}{|ZHBf7{$BkDv}2$h3hn(5(jWXD_G*X~#IgZm{?%p3q+Xh}2 z0<|3(p@WWLIiE9z?#vlJ($zK6Q)t&kdds)qn1$mkId;JDq8z*7m~b>%?f@L~Ht`BN zkK?@-+`Kac&b)|s=heK96YkT(b>7GON`VgxoT&q7Ghg5}=T%-&)izU?Gt7LK*LAN?MX|bP9X?F&gPHFg{9MbJoIiz0kSRB%< zMGomSTMntUj~r6%Y&oRfSLBdxKa(SlY;O#E<7TQaXxWKXGM-l|Fc1*L^-eGeWdv)dS%i2vYo=DA*-z=K`fKXHT#888VenqZnH-k$*N37t%2M zZ2$JO`yqUHKg+A_MP4epZLi}v41weRh(pmnNRlyJXV4a4VA0xiX{#0Vt8l0=U$#x~ zzA)biO@;aHe?YqxnhNtb{{ii3Xo}^_QNT-r883o5o`B<|-8P1t#O#eAWMZk-#D|mcDUBN#B@9>hk zJ0}`E{RCij?cGTRp8~w2^{7s^9@XWdTleu4gTDpbwkx53ia0De4u|^^uAfu7;}~i6 zBhCbxUXN3+uRFvV+qg6E`Vv0>-p{8d^xL*Z!pB{ULpgI4QB!;RGQ9e7uVV+dXh3ZI!_D{;PmGO! zxEcQvU~kML&3JDEkNaDs`9M7P>L49^mnnJ;M%A(QGPmwB9R{1wNT_D(*wcsY95JKs z(yuFtkER2>Q*H*Xlbwz8rFrWv^cpdQ+cFSs=^CGGUE_;E`A*=;?24dG173EGVtuM{ zrV@pko?zKDNn_0szo|qX%(PZyjzH!PCy*TO3=1cJG98d+;AKxs!UgCr{vq)1tntTI z>w%{d!z9vf{k@y|72Fo|o)!~kZUoc5FR$}K&k*mP zgFcXE|4Nr|`8k9{hHSfjqg6%fG1qo?!V`{eSmrg6KYjSDWG|)?mS>apf`Z zGR5{}S^u3VZlh{?g0@#7zeR4I@h%Q^ZR6abvJ`X=MRMB&UJ^EA4vr7;a9UN?ThR*t zN~hac+|K^KXb|?ZLBcM7RoEwJ9GFTBC+JspDPV1OpKRyWeQ(EQ%8VA*o-XECT$;#vF*&_u)u{Wy+NxOunH zINp@h$7dKuGbbzqO6pY1cxUXV94z~S!sY8{=0}~`Wj89EnNg7`f!XaSGL4&;d<`C! z(ss-A1OqRnCSIi_wgJb#EwmeWAnLBtY3urTGq1!i*h};7 zeok$*`wP*i-_5zJ2)dvbGdB{p+WiVCb?cnFPZYhND9}A@rLMwO=;>(!RkLU3TOepF zbcL>Q~K|vh$A|Rd0%Q4ZSPJCfsLWl|5wKEmOGM>8S1x+Rv z&OnPo-<05LTc#?rOr=KKSddqliQ*?Xr^ebVzS`+do4UiDQw!^Hd%E9|4=Q)qt|ktJ zXiqwkT0#gwI{sWa!E&D4%Y6pl-tE*cGuzqJeLH`Vq*@zr0L)6dI``hd@)=pykCIwThWW*9-wSreQxsMIE$h7 zzLwqjyeslpQIgqTS)c-qx(@{hC$I)~xcalS87cZfSmsoJi(Grkq4DuPOCH=jULRUYe;a%u)_wQ8BM6^+G(Qp4XImp-9FhUf*wey|C#iZq%w)P4B8!qgJ(g!5mR~624;CiQmD> z?o}=u4}!e_EB2DUm4|r2B$35%F0`DjYL%B=joS_vly~+v^(j+cE`mxFOH(Vn)+$d2 z$*ZkuRc8H8UKOuOmz=V;gjQyYiCE#aGRJ$(mo@~Ixz1L*ik5#X-9G=;AoND~%T81) zfMDJRlY54QY;;rh1aBI;HZdv~oA#fo;uwys+=?cio1ZL=TW3&S;P#duNa}!Yv{??7vlxm%k@?9wz{|hO{54OzU=*v*sg! zwv~A2&43F5haJRZt^Az?&~z;xUn0zw+i|>wV<*^R1;W12*&iH?x*wj}LO=Re%LfPJ zWpJBihAncc;BD`Yk`jAiRsVaA(3}?Jymos@yCJ6ns<67fq}>sK(rzDVcLhL;yndhf z{uFAjQd|3*WP@iKi&k2ki;WfbusKk^&7f$bCYj@vveUD>vds_aZW8Ug*Ji!6Ip(xj zn}eiH8WAH^cesOofuIuvzNa|p_+#*AKf>AICT_UhWxrxB^sGMJ#} zqw2l=dA62ftrPj69JI8;r1(5-Owm{tOOIX&!Q#`hC$2TH{B~P8?E8msB7~;1a9o0; zQUgcoNPisgA+v zN3*GfYKQHjsRww1Q3~_FF5@;H9rZ4DS5AtBtK`ShH4UU%K*epmjV-vd#wnG?@O+j? zxHd}h1giqlmTE77Y^sM^E#er8V|yIU;&*bz!9)=aGOF?CBP8mTP5iV>*DbNB#BVA+ zK}J>3x_%5V8^dnK@D>accQb_AMK5%cMsC&PE``In!ShJv$xhwgTDrZe1uLp!!NvRE zWFe1hwat3j)2$hDs;Me!etp&6YWpKI=R0L1r`oIX7OtRmo0Flcu`0@>_JXLMbLMLA zNd?Udn`}G$GVJhE2{l16VMIF-;alDNh+r?}BU0gE3v68%y%TPGh+dFMNMf%%2xUs#L2dQGQ<8!rM?fm&9*3J*`nx`4E{vOVX$Iu@37&Q6ekTEW?<#` z_giq$u;G7x<&5t~C&QG^7>09?MQF4~Fs-gpa@rMOwBaW?eUoS-F|xWwiCLOoN$IFz zqKg(WNPP@760?QPS}!Rv%MByz<?0gpS zZs&dsz8?JD@>eg}cT4sF6MVM>H`r9P_7u>Wlo*wNeUYVl4kE6?u#KMsyBw(TAsqL~ z@dS>);25NRw}a(t20pTR1!}}$=SJ)cUcT`Ur$o0tq+DD37aVr^Qqoz+NSqIwRNvze2SCit9B<<&I6oA4%&{`pQ70JfEn>) z;}ZA);7Gc0rwaHDK+9+|sKEA*QX{{BB*m-_A#uoIPaq9*=f)ap4siP<;q`L(IONWZ zIaGBw?k`(*jh&gd^|j609+FCX=}f&`PW z8+mO0aICvU!90xw|1<0lBO5%eVD2Uue8Z)Ljl+>WY5Lsep%9*R68P0vXx&Q5{IheT zsWBRqf!?_S|KlwK{q;sUA0+R%cO|}o=)5Nf7h0Yvf0KOnl(h3#M`}KRpozantEa)9 z0M<=+cY>P~!;}9LVk)t3wI`UIfsjheIe# ztdqcp5xCu&EeFG;YVa*Um5qZ$>%4$GvpwFN?9o5ZSW!5g)o8oxP-`KQ-W`W9j}WF} zzN1a&sEh}ls^#LJX`()M<27Kn5K=H}nBqB8nJks~QY~9AW|>XBNxv+_!~GBsg6LX> z=Ub36Td(12E{3A&tS<2_x*S|8@sK>O5n`ur8{&QtbJRA>J*NP+Ls4ZO_w%6Vrl^nI z^a%3>FkF&AwHy3wes8lk0TwlTx8`|8zsI^@@~u`osOa0yN#ANwo3Nc$t=3pvYPI<2 z^EIdveMvg)FJ;5iqw@RTe65@>Cc!XkABpj;-OV^NVQ(W>AS!VqCwIR_uGYZbMs9(D zaU(~R;O%YXEP%d7&Vy>?Zh@~54#aP9D6i<_)g>ojHcyScs2PKrkMn|8k_%k!s1f+S zs%6@pvdR8DSCi-*=cB`+HDcE;=QqIBvO{nBTKxSEpt=&ypFpXLs(sa}h45-HMa8h} zh7p9*XS4h-LFi5%ywtgp+6GQiZ7b%U0QKVitNaYGB9d6mYM$U4$*hsB_^O^N)x@^#v|LrH<{@Lk?_{hZmJQ9t1*;}i&}0Eut~o+I3IGm%8PhR+uq=`?F~-b-r%(D4NlwM;I!=x zPTSt#wCxQ}+uq=`?F~-b-r%(D4Nf0Ii7BRSZ*bc72B&RraN70;r)_U=+V%#gZEtYe z_6DbIZ*bc72B&RraN70;r)_U=+V%#gZEtYe?+q^4QU!A-?)NBPWTd&X9DHL_2Ci{m zQ4X6fjQy8}{VxCS^=bURDX9O9A{6 zOx?#Me2%hvDzU!W6V#pF53vzMy;8yHy2@bqg?LahcyODK=ngoBaK28H*Ki6BUHJMi zVGWEbUz)ha$0B?$ZaUpKMM2t)356`-aW z72v)KFm(|Dil_i@io6oV7!^qxqGda0#e@o82{Y8`ru5V@N6U1LTsyeK@Z=x+78h?fYX1mXAnYKSd! zV2W0m86d?BSXw}! z_Q>N3dHfr^6`N#Tp%5aaBx)Cln*T8})i+5Ax2p_r93YaP6=I_kgQRYZB`XSw@kU9$ z9$qhbV?W8vf!p$=P@JtJ(d*=_ldL*{aqSprkp_5&-VE_}lpz`ma7DjqjH&;(gXZLz z3>KNa8BuZLU<+j7>T5ySftqlSHKMZrUkha6o*vTmlA6VE-A+;O;dz3{x|iV1vfH3r zj<><&Lc3jj8=ZJ= z-x09b_ray$g_3c-Jc(ujm+kxL$@S*R1sX<$!Fzp4SVk?C=^gte zVYwTo>npr;Dwqx+U59{~3{AR)ZYnjeKjh)sa&K@3*ew-IgTIYsVO9<$#0P_i~( zH&0#0xC5QD$t^Czl5jEqD)#V25VkPo^ntkGdE$fU<%GZtH*Wix=)d61+SR-3`-%2f z?|O`%v!puMQ{IoYz!Xq&??^kH{PKYvD-nMqu;ONR&nadtm-5Qld=~qJ%m{dEi@l!I z>-9_W+6A|~epz1E3gB>u0q1);`e20nfysfxein-__R9Hz2rdRMq z5yb@4Rzu2Pgo9x;fqkvw(Yj0pZeSy*MDBljxUl7obP6KOaon6(rS>$@D z@CuKaT!=c$lT{}@&LZG?0o;ramzP~z*})7>MTVT8o@3P zvil;#;HD+L74#VdsM4*wJL2Ekc`C&=X8S->{m(Db{y$XENsTCzb5*xT-#7j$PXB%5 zYjLR>Noq)#vI)?nhJ>lE7og?SI{a4a{T?9wm3aJ^@lR=woK*qamuP(oAh;xd^C~Ju=9w@XDw0`Vp}H=wo)4 zhUdnd?Xr(930~A3zI+G(+e_O)V-7jjF3u;;?EDv{q=lLet&GF-?oXLsmteG&YC{k*8q_ z?NB^ziyss_vY0b2GG z7%z#85j@8r!W-{U8E+Z1VU6HrpE#=6Cf0=tYJ)5Yhm3IzzGE(LsF+c+%fqFpyRV<5 zZFyAlG4OC-?1JrhC+^F6)}w>dMZAjI@rv4KrSU3AC-4l0;x#@=8vjWe9|``O{lZad z21CvOD=p{YOI^X?E^&&}qdfOX%cCPLFOil%1vBJ!NPi;CouTyCX1M%t z;Y%O(AEnrKZfzHA*ICC_dg(X%8c^EQAbVV=kXC~kNQS&Yz!v~Uh|guH2cGH|Zi-wm zGW6C_iH-G%3Ldk$3T%pUu1Af$&Jam>(^jHys8Q`Ua_1@VO;z=fN^GW}w`g`Wb(u99 z+#>wEe9cj9&rn+BYkTXB=FWE#?UdmwlEWpwIyjW!Sgs6FQ59ZU10I4pWI2{oRg#U_ zSGA+96RfY7gh6&$Z{J`!g9#hW<3Ij2EP&}B^$n8h zrGz?tr;*vC`ui6K_S&?V=-doBG84sh>-2?{og;uc#cP`ST#KN`(z;oSspad88##p2dR&(cdUG{KO!eHuHd ztv?vNy3~^u-0mhu2>q<~*Xls|cU>Y%Ogt2-xOat9RQ%7FUlFr~c|bqr+T+&HPd#7{ z7>j;&(Kif?Q|z;P8=RCrpXW4`aRW&0co#Uu`4CBb0wAa=RYt>Ar&l2!>(}eE zVQ!MVQ$nto))Q3ae`OzIy}ljhCU<*|?}FaV6MQEMO`HDAc3-oTP%xQ09a=|jKwm^y@2&gSgmzCDwzKO9Pr?N zoRA@ihNuMip2R?R=xo^bb5bMRKhk+Ne2ugm2S|~>5=Y#_;DzPA8SQ=O%4psFGTN>GhK#m_Y9br%atWeS+R`2F zx(p||CS@~LyLpJajNQSiP!>2vbp+4A>jA$DZ-(eDkYh2Jtj$<0kgrn!bM z52slEkcTUIx?o}A%X>OSp1vecEBidXEQPi@X&nE4Cr{T!p0>)3K&h%mT)MQ;KRn&T7rgd$#}-(ibj`ajkr zZ1g`Far%l>@}GZ2D!D+(lnXz}JAW&$sPGr;+eYE|2e3+!ZySXZe8ynfs1Hb%zDYeC zPV%H|N#8b#p<+qjHVP+uTBY>0v3*c|>5+a=V@cmOiaCdt^lhUUYA)&9MlsY<(zlI5 z9V#Zrjw!XY^g$C!>-#~iC4Ji{=4>zN+eUoc-u%rd%^w3a%|l%!ecLGP@KAT@^P~Ep zg+Wa+G4b1&prnpLB8m*TULAu(tBg~&jzOYrD(PFXTC!rbWW{R9iq(=8t0gN|OIECw ztXM5sv0AcXwPeL=$%@sI6<(Obe;0 z(;o|cZ>`}vkOS$F^A`p`SlOGK=SI2tydsq7xBp_8{*SqtT}5ay)+zcg@mND~8v&&D zCPX)uSO>#zMne&uYV=HBtxeX>+9iE#%oC${UWtW>Hz&yb0v8uZ%|u{$BumhO3jpMN zmmL6-jd^MuTySqz(Y|4q-e?~YMf=8n(SB3W-e%1yp_>ZAljb8Mn$u#sS|5jtKJiEv z|5rM!sdyzS9j!^fiocBIxs2txjODqE<++UIxs2txjODqE<++UIxs2txjODqE<++T{ zb11G|9a-HZ6Xddqd8(`R1+2t;x%~O3Dz2gh9@wX^5(|C@DQjB~N+Q-oE7jzWpsbH% zhRJSj5~75tf0&%_#^6>DyR2osY;vK~@ts<2l}|2aO4JjpTI1e6B#ySmov}6UjID8J zY>hi(Yup)I?u@N*XKal-V{6p0aCt9rqO64C-r$A9&0W z(0+-qV?Z^&5B*f~=%9XOU{JJcO4A%{w75{xwwg3aI-loiNz?3;N!u#b27ZzWg5}U8 ztrk)&kqwpo1vVZT@$}NS_R%G1h#m2B4>$#MC67hw03;68Nig@o5}4vHz%cvf4Oa~d zDdy*64?3RHWF8(8ZRby#=yl{Q_mmTtK1yYxAB1zbUGVgjEFOz)wj+=3J7#z>zZrXI zwj+t|`$iG=Z+#SfCEC4a>ImDgJ_=-r9cXliIAM;9v1^h+upPsfL#5(Pp9C;H4154^ z#9%nzOfdeRfy4Drs8r(CY7f3z=8>op*u!J-X;H%>==@&H3NZ1{c!t?oPxqeXG4b6T z^FE#of>GiZ_EH}ApX7nzQ*hjA(Guq?JkOw?`&%-$@|}u8{uXq82;#@VGY9b#S%aVW zn+^(sZs=|SwZ&*6oiK4nfNHEj)A8&$Pvo}-Q(F?hp4Ovjl_B=AT{eJ7!a^R4!A7Kv z5o9{BnQo1W!jC9M{&$&zx*aAygu=SjkCe4u0_Q(V_9LZq-KWr2+|r0h9xDm^nN|{f zGtW|3Ts4jMk8Aj`-vkVECpa%_Q;p_n&1Hxtl-DZq0qfS>yHqj^<0LB-*X2P~AArohOC?&PmMAV^P=k ziW=Y~YH_cqhHXSmv^^6X;@x(CjG7Hmtn{@uFK2s`b0Koz*Xdxs8E)Za*Kr)j zf{Ka_P!Y>uZ>TsnY~Sy<_Bkgv;LQ7e-}Aoz=lSP(?#W(zt-Z=_XYX}(LG6YI%`{$^ z5)4{y17l7tSMcHey@Uqujn%x-3M%jKk5<4a7~lNYUbcM(E#Vq!`oA=2k$uM2Os@8K z__DB$TufcD%aHqwtp*L5&YBY7W|0gYkr)@~ShJaxT%Z#-8xe}j;e83rrFaH$Qsz<& zVQVNJhar>}JM{P`G`JQqE(blfUY?gDgC2bMy9kI3o0>gHrllP8HYt0&~rBCDyHgx7F2hxWz`-2PXuXi+@w8mlT9OT($KhhIb!mo z>*_hf9#6uUyelW58ZwQu0T?y$BjI2=(vwd59*|YKTshK_PLAMBYL(uNQw+^3fRXFh zNg^e4Cax5RAkqlj!bq_wTKKSKM3WHFQ%yS*QCj$PPk3zpQTQG;gDsZ+v!iF@jdKvm zP+J^1NAh6w8Gw3dp~w47yBY=as5kmxnxrlOqD2E?<_b2zj^KO_hZL~W8iSv7T;GAJ zWq&}oIauBbpp`dh!MQS4BXC1J+|FjW_QbU&7sZ54iMkMh)ptB~9gBWMHp#Z*S8y}p za&3I!;Wl(Q;HcOUh%DZ~A{!{U#emza1odY8HidxPOyqbm>JA`Vt_9*B5PAZTO@c+E zme+f@KQzN>OYQ~k4WwJ2h2y8Cw$A{uC(8yC6HptU`ce>fkV^ENWR%g87#jFDV4BKl-=c2o zlQog-Ta*|${>=8dO`p%g1pJe_+!~_<7UDM1@6XUkEAg6EqND0tkCZ!=TEz~^`;(MM zc`0{F%D*F}9$f8|!Ho^Vog zv_>CjK3&vDwB^%%)-RTpT*Kmmh@T+ zw9|n7r;e|Y$-JG?aQ@4_C6(_4Fs8UzG} z)I1@`_D%@uA$|(`O)auUd=NHXYeLFeTg|s4G~>!%>uep*-b6IhT6B{I#nxG>k^I@{ znjtwqv-j$hZ1UCo1YA85w9ub3A^SGy&qkZ2e@~e`+EbOPky)&bX@}^<7F^8`%;H_K z_BmShUfE-2(M!wOMN*@G0bb+Ap6S8R_(HJYsQ9sz;N@}MXb??B(AP;>$4h^_W%lI>E zuIcUikp){Jd)mvuMflamp1uk}43r}L{$kJ25I&%bXE3jZ7il=+8Fa)m=!j>~5zn9_ zo6Zl73LS7{6!0A8R6C8 zLEr?{3NA^5{vr=l1%D=ZahMr^k!3!Iyx}!res{;vvS45W*tH&UIDg^77jB37>#Yt6&GFeBoa`IYz-$iv7(OTfpPV!$yR4gkrZJ z2vB)ov|uP0h0TbzAW`sT3xJjfCi54cFxv=+B3k8C!Tlt*BibOh;GueeVGo-rC?e;G z$2rf)dlYEgCKI`ZI`SP5PI!!sf{zAgfvVs|GERDoO(QP{)%G6{l*by;MEdybhM+nzXI8;?zFZOkq@+YqrI+$mF57PS?&7Q-kLL zY6PCe>p)mcYIzvpC1`Oer`P?!MYz-7>1`s&{^^0XfNJYZLS}@gR5=5l7F;O8bE%wq zjSIKIxm3>JJV8a<@LVcq*joa{B0QJM8TpAo3Ftru#qIc@B2bos+lu;3qLs=uUqHCE zVuzY*zK3u-9N|^O?oE#Ha^wgv=Mr?$rXxpqIdX)TqmS?k7Ysqgi5)T-2_jq~8#|Oi z+H?-;b?h+TrXHxdvBP<_9a9E=4*H+}xwl#p8^8i72Ilz*3Vs4BvRI!#R@K z%-G|gQ%NcE0C&d<3DbV;r@tBuOBa#*YC#@>^zEN=1!i0J=6LOor9*Z#R^uT`yH~;b zp9&MH=a6se7Ny8?$1(7QgM+#<3bw-L7DYBKZUxMo10`{%6Ml_KZ4|NB5f&L6MaJWR zD;}p>w+g=eHo#?sZxeV3;L2)9bMmmc91J^nvp!D0Dh~ysBM{>R5iEVJT<#@UoRuK5 z(pY8`mAV}~OU*{4eG-IfG&uNd;oUsir$D%Y8G9YL6f(~{#i>}4qV<)>dIj?}u${4f zu~-UX3HALD_@lt|U5dvzyvFEAa>Y2ps3~2307I2$DYeisj4B>U42Yds*M;-2i@d<1 z!0IwmdEt&t;cf>aQP%~tQ2sN8(CEhDPqk$HITl|EMz^C#Gn+IQX_}g9n=CeJ$mq_h zr}~5ybz5{Y7ED8Tb$tQ_P(?fY$$M(~?SO}(1*!q^LVTO>7c9^^f%EPFyoKz`IEt1rUcJ z?E&@Sl;8*kN)eckK;IE~<&zJZcmz+M8HimEMz!M*!&Czr5Fkf#8wr^+Q`lxo(m5c#AEZX* zCQs2Uoa~0BaLp`2=e6~N35gsxK>_)D3TX3Dj+|EVvqdg-ywenxF5jk`(`+*;5RQ6P30C)F>hn2b)F8d zBPs_U`^y;>!@+Xtpo_u5fjpmHq&>>7^9qIS>VWfI-XmKi11U5jq{WC#DNENrZ;0a-`Lt{sHHO{j#m(-7!^7^6;IBb7R$*i_cyC*AUPFdVQ9&_ED1 zsk;L)=#6)<-k+#@b0&GjPga-oyUi1&+iY`}?#&nI-h9BFAUw7i$Fi)P)18#=ow<2< zpd7;2)mG$B(V`mf*C>@;Z(Z#uUb+h)qw+~$SAy~RKuU%7OM^U(`t3m9LR66P^`{XE zy4C~9UTtKKblFSmzQo+{8>FZ@k=gU5q9omgeJvfh?!vsVbYVJd47z;?5=^m$id-q_ zmb(yFoCC$5XXTz^^F4Ib-KgwQQcts|K=74-2a90`*&HsR5m#`^sSdT-fxZfKPa1#H ze5}@4jQF+oS7@_C9!Fg7MuhroLFhA(_2FG2&OHcxh`_N3)Lw%`EY#YKexPolj;TBz zff3N>0kB}+^)M>$^`bThQMEOTH2HwF2#_44=2^%??_=dfsNY844M@=5#hU}?j@)Da z3@Z+}7sWFHlhS*Uxt-EYWneaj`~u)Rt8yb~SeM5)qX`NL=YSiv_k(6T_|!g(z^4dQ zZbg8#?zHSwAg$a1#1EiYlZ~L9cY#P?ZgA_qi1SX>3OpqUT{T3r)j&|{`&lWXr?WAl zDH^qFfu=6CHy}V=DmNlP*=gj2U*)L(fIESp?CeORHiaVL+3mF%1f-)YLx6A9DP({m z>Fehd3a7RQkZi=22YXZ}c~o`qnIek4%mvw!Q8cwXQDG>f@?!+pQttE;jr3WYAREeS z4{C8ig{Dm)KsDa{9W^R{g)JOOOBKq~~8HG$!*F6Gy;F%;X1O=LcP z^X>(_4$Wkke1$KzIr_c|k)?9=bFnm&#|ghxBPpi<|0CeaaY)?}=B+~FK*q{I8T10P zjp4IFl!b&w>Thh_?mo`I=fPye0>*Pd?sXX;K8%gAU?1WiJ>r69#3OGb?c*Gb+g4TE zMq^|HB|VE+M08=q8KihwN7OLlF-E+mBRVtUM<&@x8*QsQBi^h>#QW?FY-<1`5~TQy z9t7R%kNlcB`Y%l}kQ8Sy;(HxYEfGwzS4SL(h`|$wAi_`^gezZUgOBcsn55WaTWt{& z;~4z4j5l>fFV&lA2CJtLWm_dovzMw3m*Ko^^=6Do$)l9cf}V^yjxlpp8_b_=>!L`b zQAiiTsEx?M@GeCwlp0l*2WT%hx)GYw3ec(u2kN+@fgijhXL7Er)R?WU@o!1w1aQL_ z?lZ`a)0fdDnENCbH!@lkaxyuZhr=gNrRxVV8$dJmHfs9|J6R;}kngR>Kc-7}X%z?+@y~HM2%vnh>Un97TfQMN`*W+k=vOk+x)}msD zjKUgNIYE{+L~qgufGLhOgv6LAUfJjk;%~qTI-c7eU7|#dNwR4lM;{8?ZA`-lW)7?? zljIb}$YC1GAyF|87n6rES(WraA>&X*c1Dt{coh->!PDv^SV7Q{2)f59}s^q{#>ZLOqis$p!w%4)atNm zGLoM|b7#u>B2*-P^2){em+b9}`5uJn{7jd7lv3=6b=(wjH%H-ao~G8o)HF6a%cNe< z?2R_yZyJ{$8u*XT9EPe4W;5_A^8b<(L8QIK|MyEP{;N}p_P^sC|0=FT7=-hfb*JNQonuxt@ALQu={U8&_CP?JDGbcygcaiz)og{kw{K(#EOOi z0_wx9u#@>j0p)NjtY~1x^bfbf)@2ItPjC!C9&Ys#5OI?(-^2(qP+|5%N!$*OyT9;D z$%Bfgp1=dNT;0!thuP ztQD#R4$+(s*A{b?Tb|?Q8=%io#HJXDm@0(zmgn4>D-r%5-twIOZYXMHY~($_|VRX)Cn1qglX)uL1cd)ju;j>#E0!ASN8q!kwl8P2A@h9X>t3u zqJ?n#iw+<85pesrrrSUMu3C?{=uOC)&hZ@kU341GH2~rndpHnK$@vXEQ#{Y6r8v#p z$(;o--vcwwX~O{)+V4S%S(@j3fSixF^1wn_f)X$Ch>K$L7A!F02Y6ty^CUU9@xZpR z1xFh3b~cN~EG>yGSY*UYJ*YG`A8Uf+?LDx}si2s04{R@2I>akHu-xfM11deR!s$uk z&h`tUVxfITMNQeoP~h(Suyuif(dqcR_Qr0_b_BcDtRbUTBU1a#sOc#5bWXO$Hnwm;LMau zr28x4Q#lO?LITv`3Y56{HZ)0>fvh^cPGMT*)*|=P*J>NI?dj{ZwaTT7H+{XnZ6U{9 zhg9kHU!WMx(w6Q#rn^By?c7x`GkxQ7DUl9tUqUx&o}Jt~ph)^=4Rw}WN^j6m7xxxY zZlr2vX_aAZBI#{M15DRLT2cC`d4Z0bn(6qouOmC)^fMZl}Zze z%^=O?RAT3?pewo!CD~e~KR&^Mpx?;r6TcEKWmbQxS%lmg=EG+iXS=-4C;hpG9QP5l z!t@s!O1d91-EN&O$IXF&^p|9BmS$X+&{xX?M3uU>Sm?d zsr3vMnK+X>2AA3i4OrJxY%*NR28J)j><7w9UqU+7+bjTrVpv1t=Bq%pSCvF9kX0_6 zJ)eW0c*y8EEf~xXQwBd@UE`O)7oz+Knz@!U1Wz|KoU-JBL zRhV;kl@(Ifiu`rp%HF)Inj$%XZBs~0z3#_v7OYY{b-kKzNDLv_m0yg=>YXJ5BMXfO z35%HCBIa$t-SA1HudvFy9}pzgip2haYAyrk2Qg~M&K}=Af~=ZDZT>>FM`~?oBmWLZ zVpW7%sHKmTmFj;-q?SHXq<;&zyDUy0t)wZeR6QhH#)vwd9)JR5X2B|70r+Hm`DP!1wXH0MTj{X=T0CTw(Mw z_1FpQcF73eySJ3(%ZV8dY*I{YobHwHOJGp5CrF@=t+K7278F)1;sEw@|(AP6U#8)c1P304^O+VXP8J7ks29W&2$$etm`d)>{fGwc?7{B8{*#Bn4 z6g>hNBWP+R_>aR6qo=EY9axL-xyaCq0niWK&8QoLs4Ea<4EzB+Zb0ZkB7+YrL)$l^ zhK4~!TwMx*M-UiT;<0+mW7X5BD@T-c2xy|<^)%^k@B#zxMPNH(+99i&bN4H;8Lcs*w49m+U8Hgnke4;^u1UaPKntD(L~MM-r>7{A>|^$JNd6xb#c1 zvpSi@`k1L$inrq@UF~Dw+HE0TBafSW(H#q>qizLKvHLVeFQO(BIhnUD=FI2^4n)LB ze09QOi-nCakIcM{R>T{<8A`g>u*Vuki1Co4V{t< zpCE_n+oz&^v8PVa_7o*)*TqD266{ExtvKdU?7~wV3c=%eF5^#Egdk!&M5Mdu*Pmjy zuE{2<<INIr>uUHU%ML8`5Jq%m1Lez$-`DR!k|W9kl2rRWZTQ zyLQb{a%sGJga-D)26I#cd1!s(Cda80)J6!*nS@MaN31nw&S;`3a=bP}GyQJW&A*z9%O1a&bKiT`Tj%1cJF0^%CYf1)rl2P-&@ zJ42o513JIi)>HI*;hM`6z$zVwg45-;3;QW0ohZ(iy$R+=ajFzsu2AbtoT`RX(r!9| zuK;`Z6W-`qjscN9Pp|z^`&Jg?Jk%i5xc11vMfw-y9^S3SW9ZNPKe|)@KXj3Lo7`>j zVTA_&4Qj}}m_u|3KCIBt7pPl=dC5?8Egoqj!jgZ>hdm!wXxNpA5g%4)B$1BztU}XL z$mSSFl%eSia#AY{ivb8j&u0~y@eLW!XBC=Dq_}WxapA`4!j1Htf!G9GxRG95cTG;> z!VNdMaKrsi048as4lRS!a6k1Lz%=~?;rY_0@*Xm<1%H3)dN&k01$Ynlp|F=$?Qd zc04WS7QP&leD&3av3}1mDT!nK8DvtraAO0!rEo|ZtJ6ti30#IbaEDMOa5g8d=B#I~ z(uJF2o{IQ7`TRa~^d<$7|-9lDew~!UrEo8-Y3t4g9LRMV2 zI076ZEo8-Y3t4g9LRMV2pi?B?La(@%$}$Fg3t9W%hjhdP6`yzt;w0PRz6VOOEgpEF ztoKn-6FnP2mt&rXXTIXe?RkU1Cr?5F2!f9h>r6(9P@?ZkWX;@4)H2B2;^)RhKgvX% z0r|}cIpW+(Ol=K=V{~pMeCJk-&aH&++)B{7m6)M3F&d+DE79D!l{lDABuAWEiJ9k< zpNKz_L5inyE73q5AwI^rcVd=?u%n?0knh}z(YclIom(;1-^5%hNat3LS&oo6w-U!N z=yV%_L3-kZw-DA6Ph>EVc#Q zF0-UdWQ;DeWX^mo0qRUdD979lO&oEVrPk%3jmPLROZhG{$%#d;sl9r{-j_vMs9R3)X|@QuWAikg>DYf5Lf>$9V=hZwr{6`Cl?C7zJiWDCTu9 z{Dj%1QRGkopv#b)cYFJ$+15a-5x8RD?gnm1Gu%XGVR5;aZe}ywa7kC?rCZtzH=gO* zQ@SG4CSg)0ILzXX5kSpTTab!Wb@+*%jA&0t)`K;r6Gc$BR-tW`D+>)5b52$U|4&jU z96!rh;`^qqkdZTHr4&LLH{lomJ6Ju8bVcHPI+gWp1>(4o@N^PB3ZOE^EL}=4{20I` zlz#@hp;~~&Gr)({uMuqa5n8+qxJ|&_kcE@#=G8oGzb#n_n*FL7w?SlWS!uYhgs zt7CBk$RZic@SBmbQ3Sfel#a_lrf3VVp7q(O?ncQuKhWkDV zKlg0J3uYCd;uvTt>VamWr0Xay0*84J&bgeGm-Gi8%?tOJ=8UU3#3 z+%+XbfY{F>46D)0RH@z6egyVqBN6So7{5JGT)l>f&e8x!$iS}OQ`)vsLV7Zw;yIwD zZELaw+LpF$5pXQ!e`MjX4L{JB%Il_qQZ8u(^?oW=sXwuPVfIMns9520tOti=wGEyL ztz2A`8@35BS7v~Eo`E&*fLRbpN%|gleH^=<2|t zATf}Z&&03%X~fOLw3gP*5bI7vR9BN7%Rz!UpRn}v2TRgB02fyxEsLrSNt+vD6xRZG zD72rRg_E9b3=qvqg?iETOUNq%-AuiuVA`Pm58ye$w(LBoA;nBf@i{A_dLYTF)(hwE6%ftlxHXHQ4;fcIDFi)1P~Cw= zT%|>`c2+-47TvUH4mqmdl8Bbby08quwCHYfuy^_oa{is-m?4jufsNI7bVHxLRy%E& zseU}KPflN<>G=ZGbI}?(s5^~=y4hz5t&iYA;AtEL&T&^W#1L?DvC;fiBKSb{p#?Q^ zM0grUgtL$E<#PF6W}(*SW5zc=wtmgqiLjt*)fQd$R@J zRK~-z15ea(WAK&-vwD=H|99GS5OM0zY_qq2T%+E|ZJXmk5H_bc7&D%F2*S-bgHuEA zzR9dz;HKXG{Rbld!}jlu#G4Ur|Hi)}8!bcJRQBK@GaghO-d=_WH25!`dE37q0BEwnq{f7dMqXt&_s|i+z$kok2`hHN$=YgrT>i+MeMO zO*fT2mq@vVGdz$QC+Vh&_T=)q6x>wNUK5E2CzC4;BmI~qa*bxB{~v)#o36O2BK_3A z0OoMUAL%b)B+8+iDpIfZ3J)`feR5>5>I_bp?PVY;GDNPdgR>`x)BMO#d9h#-PY&Hw z0q9@{{VFiAO%%M5i+?OBt~AV31j_Ntmj@NkZ^Q$%hf0bBaB+H^Le8{95KeH#k28H8 z4Jm~~0`D_thK5WdE-MXVV^))piDF}U_#+8vT5KE<&^-lT(|B4;Hv@kwNAFhd9ZT zNQ4|n$RetfDG8pK1U)gy`3=Ij6)kZkFRNyV5I zWUCi1vB_}pQi7hCRD!ukPfS8DUOFBr#S_z7JTbOOu5oYi5|IhLcxk?t0CgrJWSczg zG43s1%0XLB=*3G~Yi(cpI&Ggy=*3IJ#M+z$Ju&I^+S-;0dScQyXsBI6FJ98MuR}sF zUeY`}CFqGs->jj|2{w=P1`Tyd=*3G^jh+}&FJ4*#F#h^z%nZ_Z{V~w-?q)jPHagNL~;{l;Fx|uLoE{Dps!6os3}_;=6WI@V(%9BmQ8&h zNZ!;;^3%R#vE&(FGFL>TpYlDzI&;f# zXg;w5n}$QvDt*|7@vWfno?{Uk{}u(Dlm3?9(R7A=*Ub3u1LL={Cj8JHbVaHK${M44 zMN*DFJD+VB2S0*0AorRjCHyNQ50Fz`lR{kfEa2*~piC*Y$DxE}nv+uOOim~K zE2@r43;kV$*FrMj1Hk(oz{S51&Jq5R%^22x2n}*kTiSYVIc(c&>wDdnKnOZ~XlO`Q5caK6s4Ie}JZo(7PIxt=ZxMBp79R?#xXCiPM z0^`A>$xdaoSph_8w(*TfTe<=!%|(XtOgf+3ws!Sy#FmgbsbB z&7%NySJca#03}a_WY9N`1^q}(j|lk_`fCIFkwX7x(if>~ScD+!6`M#?CxcqWcb{#x0nc2%%Zk((>hLWVZ9qlJ z&s%}j7!arS1Uh^xrS&l)58#jo)U5ecuL9<<1Tb65Nq|d-fCF>?VI*#<{r{l^;M>{1 z+bCTPHtYl6Ae&}=Aol{d*$p(av`NBo6^&4#gF1pGFvnE1q8LBP{dQ?Im(|pKj>(*D zYA#b)z$fVfAo;=gT?IQ7cU|ZLI7tfNbwswQ1Gah9`VR&0Z>m;1brMx9FcoFJgkNea z;14NJ{A2~DI0g|}`XI2>eJ6hVm|F1+a4aFLF5|Kme6=92jVPD}OHTr~S*Ya6AW~_qUxoGeYP2GHK48w;|6-&^*sy z^qO<`|9++C0I-8N=iHMPt-4?d9;|okCX( zIt(Pw8U_4%Q&HfSKjP~SqLq{D3tcZlUqNJv2-R@(H8j(E$@xa%RR@^kwwnYxhS*2= zM!Q)W#ah6nQ^1=!@+0i=D;Gyp{z#w^Beh1*)F*+LC8DTvHbu;})R|C~%2lt#igR#N z{h(mQ+lXn?0)h9v02wp@?hmg}+GCUi$UQ%;OEPeaFc@EUc<8g=Lzbr=SLr-9W3uwwOkt~o2C^l%`` z(A@VnN9@x#f+r+(GfE!@IXlQ)Xq=^zQM$)NblwM1Mk7^k*yWS!2J2_5>d&To7|VD* zvJstu|2OOn#O(yT;ycD5w9q0lv;*ac6Om4_Sd;nys`lxNclHL^sn$9~i~*vQhzSt< zRF+E7C5H7=??$6UcK}5DdYLQX2Qj)mN>vWwE6ldo`FHz}5r?zyw5`(_aTC=!g8e=A zy))tp7U@hja@(TNZuw&oaU@5CwsjUMRxwEf4ZsF|MjXQ=vnJ;=;!H%?=6gt5!*#Is z-q1oY!NHt76Tn^-;W!%y(Q^%|8pr7+R<4dkU)7xpQPn`YwGhKz(BaVT7BKZDsNJh5 zX5!_D0R@MO-Jho>gE*x}%usM~IGK9OPvaQfW1JX`e?h0=bff!PrkTnNN19_8^AP#U zLM6l;jhG&?E8SfvGbY8^T>ePV>qiHK;7RruTyh?fPgf7(I*@g(Qk+ucOX>HLi|jMA zWden7jQn($JWVmH6sIxy9FQU95Ts1yDaE&f&y7BAt^~c4aq>W)fjl&6Zx3;0Cl1mo z@?|9?MsNAZlRQJIp7Q-OiRHR{1?5wu(WhzkDc?FGz3Blx9s}zbR?xGZ=hHih{U-`3 zbF0)w09ZHAMI6aevgc~h7*>O_+6gT-|KP8$dV2sAKUhXTN^4~dMujttALj;6_8U;C z5NEVSJ@fxQKNLh$0X1{7H+P~VneRmZA3RajbE)fZ@ zi=9Z%#eNxh%SzB_&jpC(O3-L8?uCap(|55m!#o%J1;F?#LE&QG15j3i!o|)o63I$X zxY&OXP_G1qi@hT%0^HPG2?`hc!GhE)LE%#u0i{t{2^xT02}(C}j`=H|84C|*1H;9@Yk*tL~h3P!$qC1||gdrYcb>wm;uU^`zlq&`S5du`?69_1g*&4^bGgIX4$iDib7X7>XV#{EPJ-P`y9+?X*y6gO0`K$S|UR90^-DE4PnXbsBtKzhR#4q^U6<5(~Z%uLb{|84qJ)9WoMehHlKs!cpR@K zY5e%)L^jFoPl7nL3$n~4USU9srErgWJS9hyIB8QvD5EuLla?v~X^u(edZ}vagv${l z^*41QgS3Ie;M7T415*~_rcP#V`b$+)^EF#8Rh_~#{6Lagz@WFgI~`S+4G7z`6G4z{ z`GF)IV|7Bakfo~WI6FXoAd#i2=>*$Auv9gjtVGJJ-QC!PhzPw@HSH29OI6c3Rayen zNg|YE@=hncRMlPg0?GJ+#J$$b8?n#5PTQxKs=C(?k#?w;s=Dj7wR)+ldxM7bQdRfH zRg$G0WT~oqljhk;ma4ipYpAmWhJl)^Sra z9iR4fq(jzyM&oi~^ar@lYDh00b~kG%H%8xq`<&L;`%K}!^g3n9XA1Y#d4a60&188s zPU+7S?)D*|bL2CH`^I%a8Xf{Dg~>YNzUk>_nEXuP?py*oZ+Ex*acvYv@iT?{$viI+ zKU27$Y8IgwKU27$X`CJ7XA1Xo4LLD>rf|Q|P%_5P6z*=FE+@v%6z-Q~&kD)U6z*5N z1c{$1V*E_uetocj_)HOD))Fbr$3l+=m{_klMQGZwKJ0y_aQEDb*y1D6(&$UQ9OyPj z3m`#p$DBuPP}TUat(r&d8pZMb(u=U3aR&!z7~r%Mr{*Oj`X}N_c8mq0UNwNGq>yP^ zsz+C2czy~*WDwaOKWvY-khE+S;=V(o_RA44%J+iz#~4Ldl>7-a$ewBtRr(XMWo9Mk zK$WV2doL^cgQhEJ4i_4|I~NY{fV>ewZ!K0Iqx=R?&j59K5pplsg+ToS{ySth(A)i|`ezKHDf@_|B0copD|3+G}2tnv2%7Hi+W7`-&O zU`Yq}_KLM{09i(Bzd!&+fP~tlA*0fpk7H6l+bEw6Od}OO0USK_)-Y@T2=x%v@ls^x zPQd+L|?3$3+jfN6QhwO$Sl zLqLjS5dzHWXS1|4Q5=5BoR*W7)fHPoeFdm@WmBKl(x|AvL?eFM2T^`35D(GT(-3%> zfr}CNfPowQz+(vf!kCv3$WLPK{4WGlFNBP$5}Lb+RS=h2R5Th@FVMcltje}^E+V?h zF$Bv_L|)m}3Pj|X>@=%nnd6zVRnb~0(d$s6RpLNvyjrOLAkl1N)!f8r?@}BbV0WH3 zc{>DB0WF>h+;1W30LYulvBy=a8>e#a&uoIceu2C7Tr9nzGB`&IZ&}tNtRCVAF1Nr# zbnp>*5+dI`KA<_dc5ikp*hCUHJvwN*>4@!7BW`aOlN6exSd+B8o+^r5voDG&v7nbY zUfe^mtBr*xG@7t?u;cC?BILnQ0yJSC++C(@snZm5QL*&=WL#aE!t9C#nMW*WxjQf2 zMvG)|=J6GWcy2OG7fU~+Sh_mCkKSa+v7(ZqmSLl|)SF6imYK%3KAk`=?=g-1cQjfCp|HjQkzxw}ru$ZaWAes6K3R7P}VY5pjPp**(o8IAK=tT@{nd6cqZ|9tM z#uyP1%oT9P*b@jw<%}^JgfRrB0Vc|&X@i>G{~TZ(S@(kz#_Ew7GU~tyV+?cH!F4}4 zVN9=pFk@WzgA>M17Ho*~ADl3@QP_v&y&W7W7L9S;PXKb=58N<#jzQW4ZAvOWj{}&J z2ldt4S#6Unv0wu@|7fvm5%!K2I}b?c<{d4jp{Aq7wvmvtk?7dP2$GN!jOaKbFh0iV z($VqSJTCYlU;k(^&b7Rw#TaB#&PJR8B*L%@Nu4^KG#2I2V*Q0G5!FYFF*EgopEp6D zqlis05@I+p(npIWYOY53fB0xIIUnnG@XhDE6jO_|T)Y>X$qlnEzvst}lsZ#tM7e1u z#+N8fa(VGyY}R6dLQ!tpiOtrAgpC5dU?(0Og?>pgChkl?kQu}AXgo$!$b}1b;=$G_ zIc+GOU@iow4aJiuBc+T-TX+k0$W@;<6nBY~(}v9Ss*t?8y=@q+`-76B*&^@#hgGpwBPb6LpO0#*$Z8yZ z;>7*|$%?tQNVO#g-_71e_AsjoMZHLTD}HmqUM&n6Mq5cx!357Dt}PctsS4If^^Re* zTL{`0puq%??xRKP)xdoq+UdcBZPB_S{}VhFEfH52PG6zS*YO()rt0s3+`g2%5OJlC z0~tl*Y`q16-?O<)Izlx>@s2jK+Jm3i&4`xBw;^P<5zJU!@hp=r73YzT1VC!{&t8fH zpfyvBVv1Lo;sC`h*;uSVnsT3Rx<@yGbmi}2G}d&Zp!bG1^4JN?1z|aBt}-fa>x+Le zCbg{#D;kYFmj8+@f)9j%o7HS0jhxiqzAf_M0LJE9L$s zc-zjQP?my_V4&8n2O9jzN-;B2>;+OR%v4ib?x?1B2gx#}1Z^1Wfj5oQ<^?Z?N4yt9 zV-7IhUzY|DHM@ZvpKW+Ik)^L4H~;HvJH3wHdliIaH@WJinA;uw9KRCcY(k15BP>TI znQ#;;V=1&Tjdz;V{CT{7f340^^E|5g|N8#=uMWoaURX9O*X7iXkKp)1y{6V0{5T@H zrq&vwLvR3ELtjCpAqg3hglR(#w%g^y-qvqx*tLj}t>4y2A|+K6U6G{n9e~!fQbdUZ z(3;L5`ZP`2-6!?7f?G3~Shj*&bBXlcw9CO;9Dw1T^AJl1V7S*vgve?CH|^QL_zpn4 zYd;4l4nVwX8Ac*;0ODP%-Cf!Nh<7bLb)Ewd@7gIss~v#B%T+r71CS2Db3vD5(wCU| zg-P`IAy*M72FE;kQ1QGacz~9ibIcHM`LZxIU2`tN1<#{*FbW>#2(v&IrWVM;)B;(U zS|AHk3uIwxfh z>qH-c8JR)_n|BoI6w0yz4~AN@mcjcb z^&rQOz$>!V6L>9J?<$_Gn35wTtsFZBbJN#Aj+L>$Kth(wZ$khEM@Xh~X8{b3kW8P3 z7ok;XUm(PJ=?~BkTCF^=P&`RiaD=4GBP6Zh2+1^$khFp$B;5r^8dh+Gq`P1dUYDY^ zSz7Ay2uUkALNd)GB(2~GNf{(r!4Z<_o-`mhLNd*Bt*p-W12EJqtu#_R^rWRV+MX2{ zJEpm@!4Z<$*x(3BaVA>95t5qmB%7tlBP3IDgrs$(-AKkFwZS`I5?L$`PHR;-Y~xiz z2d5PrAt??{D>y<@9Gq5ggrv^IHQ^s5i?xH(^3RM6Yn^;hJ2{48hOBMjr2*~s=CrT*wCPfiTCaPcnVt+O z)*BvZ8L3>LP3zsRmKO(Q)u4e&Sr9M1G-cx%Chqw8rXz5PId$^)ZmUNMF*G1Zc5i8MVg zmgRv-msgBohlDPGRQi4r+j8;-&Qwi5R1YxhVKeC>a*lYM^E{Wb6_4CQ9mV#9$Jh{; zvgL!?rEDcV#wJdlOyXT&4w^-`gK?(wQfKhju0`k7e+07pgCoV&>TL65>4PJk?Uyl)xE7r^z75j& z2S@5OZw6`TT6A_k54zTR1+??=h3L!0wdj1(AjNIO=vs6>)v9XOqVt)?Y1g9T9~>#J zMdu5R)2>Blw@#;Bi_Vv1@4FVAudV?UxE7tSZx;}*MSP9M!H|HwL4Zy3i51v1Y?}6{ z4|@kkI(rPJp9-yGa*RNc8ijIJd!sT&RsRC^0N(747!F#oEsoQMu1e4x7A^7zN(&vh zB^U7cfUbf(^j!?zH`EI?apwSTBcoM~-w3!J9C6)*`Yk{uN0GWlZf&yvi6QvSRHeJX zo_i4Q)6>8!!wf2GH38_ES{17CK7L)0PF2Ba)s`P^fFoq*eks>h4) zt$^Eag{hmt;U)ak8R|2LDgOv@ZFYe}#e;}tX7GYh-Q{>B75t6$0H5sN_{Bl{~=^jzIN1 zO~B#%cE8HihsKLY6 z8pewtRFM?4$ft=HS=At`c^|*W3IAg6ScmZ4JrVvodKnVb#M>kMar9D#uV!A~Z9jSq z!e@|vvOR*~=NKMt_h9%n()`Q5m3+=(_`T>kNZaWKEZ zXjIezcO`JGlKbI0&ACd~-%iIP@Gyuf8m=~sClMI&JJinuM{%9TK&jstXh496^mV!z zfjtadhQKcjT!R4D^K`lafeZtWBOsN6=jXHPRr~>gBA_-m6Q*0Mzj!>T2ddua#GI@{ zf{Mdo{s;tq`L`);OU&gQRvZR_ud=tC#E+Q1<`))H+&srUIF z6+zv~Sp{NVtwRi5>*@g}LJSw}_n~`Tolm}q`5XCgE})+1mzJ1qNR?wA0H%F7Y*xRp z<$&^K#LH}97U<-q6*BsC91h&ClXc3sK+*RK#zYiH+DP;oRp>|tk9h*OFor&Tbz+@X za}$)RrC;CqneRWP`h3X@ZhTI2eGv(A#6Q#LRc63)kI|#l{0_!k;Ke+`nAwcE-OGU| zY44tKi1BmaO>pa{9)^JUH}VZfu^-o;1Ny7WkQj#tDt2AsVbqTXU9|kms z0Rz??s*%6yp6=} zbpb+w|02}%r6AP*31Ix&NJ9N^Ff|H{e)Uj)2_uo*MiQ#Wkcd3=Z6u+=_^?V)ZX*c| zQENp&*x@(%P;iu;!*2xv$lFMs0$tqfgR}{`-9-B@k|;=gm&Gq74=OIlV1kyMQ_%B@XU%2AGaK(S&ivPkD|Aj053s?Iua>RcT z9!a-F_#`7diunNBGqfi>nwb>%FTzu(fakT#WtWpOQD44Cq%!hl2YF;LzY7$=+Z7q2 zL-2M*hSnp}$Ym90NK&K?;V{96J#SZJ79NuNwuhnN?#Wd8EwCaIJp}mGREdY zPZk&*8!#x~*=RXX01%Ss5w+G0cFx>4( z^rYc#0`4ip5tCgM4xy z!!zz$piH<&AXUn(0E4vqDrj8y8nm=L_YX+h!aW_>*6t;sFLFOXxRm+!06ilvzXTiZ zDad%`9>__n+g?Po8s)n`;aTAJ5GKb1Tj)+kxTR~Nvv1|T3=x&?n_%0)Jp!pZx}!kT z$$bGdon77t(8c9Pkt%m1!d=~6h_80LBBq;rGoCf>Cs4S%VRc2WI9q6b%M+ZJF9zGp z@M(y8<$K6ytGl@ypsm$V6|F8q--5G^Rm3c{GA|?7o$VTDhvywL+i+eRDU{)ijeK_A zAVaKy%j}r~=uMh!mL@ZcCj#2pAe8A0&&77$3JK5L%n_t~TX%5znfF*q?`R1vGBuL` zy*o!VE6hAZ>HpN}+Gavbw@arh$$UYc?`d3FX3qpb?`vFnW)4mMK9L7B{CKws%}gEQ-i`&#GH=*+{kXpg2GpSjTm^o^E2 zA(O+L_?M=flsSNu-)d-D=25g0=R2M5;7kpz{a&X#B=Z5e{Gcfh%kUGX^P`52%=9If zz1sGpGVc-kN!va*Gmv`zta%=jSw0BRubStvnb9am=Qmw@j@NzV^=uF9li?6Pgz8|h zfSS;{2QnKsRa1uQjcQsXH*Rl41{p=G@l-m<`lvRNW6__Gv0hM4UfamDMXw1hd%^>- z+u&Bl6(4{dEO$aNqs{G1a~G4h8AigpCAbYHsC!6?+0;WMnI@z0$F4Pu-S{ft704{G4g#3djHS!@IZEvNJ-7@GS&pWS!(Lkuh z4j749yP2iWBTn<(O}^$w0J$hY3AU2p?L!ErfgK01l&5m2ubB26fF(!4cc{K5_&Tvk znz@Hyn~wqRWj239&f@`=O}Y*}RVgMlP@=uR2&fT3{fU&vER`P*nr@(J@6D4D8IVTH zeNuawu@Xn%85K`Z!gfXb-0KZvHN>c2z`jy8`D|zKL&UW^m07tR$NU?$p8(t{$(XYz z5u6|(^?Z_Ge>69>ou#@LVEJw^pDZfr`5G5m`HEoW7+-5&gHzljgVz6K&SSk9;#E21 z6^%WN5y%)6OAF@DBB^&&_fh;>e~KuskZN}xwOB;LGZ5E7ihB`xdRf&$%54#~_HwNB zLGoKdn(L6HWC^@QWc3?>jt&Bq5KxPsI_(ZXom$~h_8A0pCUOuEQv@l9*+jq!D$uqS zby*{dQppF`J$aJiyC2cxjmv4$lQR2fMhC^fGr%dRqRG!GXi57*oMH_47`iL zLkxU|z&i+3@s=3-OT3Q0LrmGbp4fL`%>JUiNqJViTna6}Lz+`co9OMOxMsd2P_)rk zluG`L-&jafdwfNY`pQ%EN(QKCyRSV(r!zoBA7X&|y@P;g+<6aPokj*5Fu|uP4jV2* zOjRBNk1@~&fgc#?h(OzKVA)bgW`^E|1VOV|hM>0y;WT3@{D0-ELDtL|i4PJi3KB^5 zF5d!j7QCNV+yjdfvu?**LSbtS&8@l7F#13PH5rjLa_3B*xYp)Utqic2BJ)N9=`&H) zzC4DserPq_%Ru`eXt5Ee5T>iP+C@hJqwo{|Lr*n}vT>*bqZ<6^w<(+F!T|FGI9v_c zy*O?F%z=Z~j(TzMfGBCAvwL&!0B9rU}-fyIK^r@e^#9LNDaqRNKU z&=0h`{8$h+lQuj{TKmLI*?s68MA1m`OOW6P{2mI#A0y&NfS-te7|5;osbka%U;I)a z2lxmPzgCO?3WUwXkN(f%%Svw2m3t3Z2X(XC{&f?1)!wTg)=Jc_vJqawwr*C!?%C49 z+E^22mL2O+kISa+(Tv*5l$C`>*$Pn8isjkVJ+rCz%gC|~UK$S20z-Obr7_B$@kpM@ zCh6Ub_#VLr7@$W*@>EzGs+i%Tn{_EMe1y<-PEfn7_}CcRskK_h;bL{z51G6imX0ft3Jb< zx809`r59c+9ouli8|oz`-^^zamH~#w-vhY(eQ?}_p4Yc0Yv`3d==xQYr zl^uR7zDGqd?m{OQScz;cJIO=5wlCsN55aD+S&BVC@D<7%-~G;l-Dz3LZCXZ&AexG< z`!pap{4TrOqZqOeMcI=c;;?-YLvGhR7wv;6f8Il6t7eoxj?&0}y_?I>bp*p2x?HQK zAiFNqd!Sfu$Kxk&*6Mt}>@GCX$r*Pc+iGM+aG|(#>|X%Ol;A>>bAr);b=j>p`MSIa zaQz%`lNpR(wNYi}1f3_hDL{o`Q$cjOR)OL#^;NhhP~mb>;RA{k6)qPQdjIOHaJi^( z24Jnim7>BEfa_QPcT^b2rgVc=f#UDS)UfhSuLdp;Snd**oj~9F$hk+6 zx_niUzgBndjt+i8Btl0h2vJPE%afl})OmLcm2WHiROMvbrx zS#+BoPME$aqz*yEIe@jwVT%oLBjECx;MS}Iz?cFVWHN(tv``AX3_mHx?*gGYBJ^D_ z(RSom``M8za!3L@E}^kSnx$7Uj4+NkQOCFRv!+N`jz^@nqe$#nLs;x65<4COtnDZk z{_g-TC&z3%WZ(ruy3&wJEtN*x!U+%o2yU;HHeJ}dlK)qi^^%g@&f{c2BMOLR-Qr%bZyAmk1HegvNEH@*vMp)KK zM&W~!Q9~ymQnSFz0qcya7ye@amp=n;*%@W7?8yQj&&ECSckK8m5IRzXE(ep|r_9H^ zVWh=wy;)Z9d^F4iomVdgGR%kD+K;fsZ3+c2~|SyS(qm!}HL5g=jXVO}oREXnRr z{7wQ&ogJ`TE-cp}vPM`g7cHL#tn0uz!Y>{X6<+{Kk#{!m|7T-|8!c&gI-(x!u~8@6qZMm zWnX2nMZd0DG813IZ#7V=sMxpqbz%8;L~5&F7pp%4tgYT5{5o;rL|^qj`Q5AekyriQ z7}^7+9t-&0EBx+9q%P=th2Q6ZHNX3XUug`mDk@sP9)YB1s+Fib*=zX}+Fe`DqsX~Ce9zaN28pSAS`7m46Qak_~%zbHg=ZU?O86@_U2 z9>QXNQHbXEO8e$(`qKbw`NbmtTELM1C_C)V&E@X_O3iNP%kM1m+u;CnZFuK@XLx5Z zd^iZTBAvzXM!;Hdl?c8GFe+39d!qqbFmrn$eo~aYDZ+Rd z8S~o}sP`K~OcRzQ0m}<5MQP1jVTbmFucoUp`Y7nRWTxG==UZbl9vqM76 zbgR)AqUK;o8CxN3L-Bh~iemu%pmbR~vrTLvK+4!HxNX}ov}93gu3&#tL@_0Q|Mf|p0*i6Hu4 zTm7S#(0Ch&*FvDTAIrJ|qv%jAW9*RKpT*{OzVgWfYtE(84+1qW7m`- z^P;l0CMs)dqO!IoDr;+^vbH8FYipviwk9fTYofBYCMs)dq6;l#RJ3OVnHlx=2C41H z6Wq$eO8d&axWWdt4H*u)DnL&m2aUK|HvlxJE8@fVd2Rbd&?FA(2*jD}Bh@jWdxUhG z6luzRx*I^3#3JrZSAy!WjPer68hv=I9JRd{5`CnY;KBQ`5CkM@E{pj7sYEc@`-n@c zC|;ytoWzw@A-pofWelxAPKDbu^bAAg3|+wxCTQ;6WU!|J3|i$XEMb`j@LMW-D8WaG z74SrYn*(q;!J7l{5`eK$_rb9UrDEqn#WxVhp|0vZgp3SJZ!to-e8gGAJkdSx3uKNx zfu<;xp&3^;(d6A*3FO2-YGgkkAIw6Y+Zo778w8nF$01ikIHNh+Mn4Dg)$9@!2oAX@ zxByJBViS^aJLTe_&L0A+(LSILANsG;$^V;mUT=}Nqt<~}K^)H&vj#DQ`!Dc-gU*QZ zfwR7JMp-t-!Pa2v??gk3d$aO&K{17vu&mG)Vh42tbgG6_YMrf3VRIHHDXbqXMGYO5+kQJ*TG*&|) z!&*sj9GA5v&t`Cvd=<35Kt$?pP^n2IHPR^}k5Fuj!yYh<4QQ&0BPth{-XFohYlz7? zd^oAHUgAc=JPxc9CUwrJ8f1jJT3(9evKqf+9yqP?I9*LnQxTIZoYpZFj?d3K9E4OU z-&+&`f9lcs-b>xQXbD+gL}l+4)?|D9LpZ&ktUKd1O(pLo>r?a5;WV5w2Ou-~1%L(h zXcOw*K`_!PP(}+Z!{!DsPlE?M4GQaM|AS1_7gQ}zIuSR#Kg6t=2rzH+KKhxBP}Ord zUvwf7En*27b)0KPb8UNhd9}&r+%gquMs>6>i$galmCakHvzM% zxYmYu?Q{Bc_c?v`*{Az-H!}?lG|8jT`ioN>T0QKQBw z#%M-0-b9TO=PAY*qvD8OV~iSy7&BhK_g$-M4-FVI-0%DU=eayjA8J*tTD5A`s#UdW z+C5k@j$jjW838J*`Gm^)3BX?99TOAed!#p>^~(JSwE+45gan-6{B;Gd_f9t9sqP79 z*@WMw5*krIn-G&}#K!M)qad@B0u*6PUyN#AKXW&ub~a`NBKyk^51yg@nOx@+7n2e+ zs`m(5%}y3Bhiqv$hb9c?xTAoilZ9?q$?Y}szkj0~uQ;~$29?oY0PURrCHz*K_4uth zgg=wq56j{6BelN2;C@8rZ|&gk?)WwNi}CB{pBRs7<-dt=HveO^WEF*aP-HqEa5-sj+LKEO4ML41~lEn?}gYo#2ZJ5e}R}#F2B?x#cz#sq>L(MM5T7FQ; zsuALsm+YJs;iaH)X-GMqbzCIJ$M*6>j*}}$wf|0!<(S#M78#D8iWDnS_m!zK^vOSA zArn&4{d-s5?QH8D&3Gv`mh3?DzaKh>KK<{9&i}O!oy%xVSEK17C>XA^yRVV=f-U^i zuaVm?jN4C!A4qihsP>-hHXJVh;ZKIQfQI{I_|Hj?mjmh!V373gM_2skKN(I2^^@VN z5VD^PXV85zoF|;M#KRekN?i4()JNZ8tUH3Ta_=xEKN-G>RQV2L-BAoS>$^9_n)4jl zV(rD2Y!?RbV*V8&^w~Zcemio?yEi@L-J7ycs_v8FOtha2zf()VrI*VQD*Ka(CLgK_ zuG$B~!aw}UaILNTWVk~A>L1kFXHie4*RYRf{oe+IM&X~$iWK- z0ndJB{CWiSGvk?O7Gad=;OsDSFM|^pto;N7pC2xIi==rcJ^Y*_{V0+4RtVRLCjs=s zWPTbK7o!lP9{+5GDv}w)7C2t&G#J6A@I)fy`8kiiGM+oL-QRGZI` z$YWOsRLDQUIz4f-K*!}@W!lfQyf3NLo>b_B{0)@T&lNhc?y$pGdErwEtz7UnzKs$*(8!vkHFM;3>=I}Qdf(|WGS zFCh53f>*+!@q3_YG6yox#nO1+VDJ*g);bBxD^!0f z62gs!B~+-Rl`h1}57IouHW)^;Oid?*q&||wHs@a@`a#m6pjh@N2?AwDo-{8ZBrQTj zqdAGu{6P#~5-9se0m%HB^|+50%<(!mBC1J_`cuQPn}Qq(TiUCpyzTvnX9 z_@zU{@&K18%Co+Yn6m!{e(RZ7_TR^E@62ToZ2iQ)NlXSO$r?>h{8nB;L_!2|5350+ zP*{idGWQwI(4WWOTbO8@95$2nTQB!9=aGGl*Y^Zez}!bM-UzTCEvter0qoE5-8}Fn zQsIrZnt0&d1ZD7fv(>Ropy+%oVa$7+Vc_t=)_ zYgQqqzkIE#%T{41?X;Q2_J0>|J@z<{yWO(R**gB+=0^00Xm~6C}9+d1VL)MpR# z;1m|HFM!tfkoj$}`FZ4v}1E7M^Lf4Y}RRkAFR%+x81fOLqU&qwP01iF! zKr95@!0Pw|QJuLU96(9=iIRu~>df9q7{Uanf~%v7;k4c$eiwy}B;S|#ogsg3<8KOR zn(vTDdH?ly4DO4#p(ylyD*gokRPjHE75_s9hdhh?2Z$t8pR3@}ay`B5bDGy~E}M;t zRO8zbz}xd~9N1x5y^vwVk*s2^u{t`e4v7oEdTRxNMF?aQ@~z6SOXCIw(pDwwxBf5~ z6NZBYJr^D2V%3uPtAP`H&3P!_~-HP{Yj7;`4#8&^+TAFxjA6=TL!Mc(Acla?t`k&el+I(rkK5TamikFMwxe0e5 z$cy2*i5#RbLGm_#*zO6WxQpR<*p5qWaxoka+cAtxaxoka+wr;-CcU-x5n1lq*o)zK z*zPJRKre|3%#f)tRoc7|rn=lGWF6v3*?>07dtD&LYV_|E~qY?!K#;}-l;2#W)iKYa%T3%(%h z21dQyD=*AC9tjPYL=eu0`jR%Bo2Uf_~< zeCwhYxC;LDM7Lj{rspqWEFP|l0A9$cMsXF9AjXhxK+!q&p?-my4Ee3SAQ`Soh+|(o zioue6G9b90<8H`zy#n{HmrxBJRH`QAb^gG;>lN~XP{7R{P_36T0@*Y4TN^@tG9Y+V zoooB9SMcO9ES4T^DfVbf;?b7Gqb)5OfXQA+zq8~#+K?V?De`FR#iK1PpAEz&dbFhj z`9N(0=UpZBXiMVJmKMwXaPnAk9<5S#9&JdEwse5Cu*)N1LNZTRND` zMILSGP_j@GkG8b3KkS&aN9k||(f&EkQcA1d6v!9dC>^bG%!c%6OJCrc3SK=6>Cu*) zM;p?kEjf=iq(@tdJlcZ)T^1@HZRs@94(ZXBPFKQSNRPI3h7t}#dbB0y(T4PBOU|PW z>Cu*)M;p?kEjf=iq(@tF9&JdEwshV+aRr-|_4Boao*}2OrS+G=w}3|*(xWY1pnbG& zNRPI3L8mBW|BxPS>B1R8WdKxgFqjvQwsgGINj%!pi9`rFp((9)b)qVloJXq-<2+hz z(37gGXC>m`cIcfk#_<P6+8p4LXcGC z(T4PBOOZz#(xWZCM!QOnHl#;edR;*nXABi+8u4gL7fa*Oqb*&+*phg(r5_K5ltOy6 zr8~!pz`T$iZRxHB0{J05+S1*J2$T)!(UyL4ra-xn9&PEK>jbI^>Cu+%y;Gokjvj4k z!#mPn>R|RsJ)rtikq|B$mJm=!^&CtWl90wLD@DU-mZ|B4khHrbvCa7xL_bKn8ro9u zR|*1UN1iksLeJSN z-1rG5oYIHG7p%TZWy2S>vZ3_1@Ff;ZBP**?FRQ*+M90EctoBQf4qsKMN&0@cNug%Z z+we7odWeY$UstGSxB;Am|D{l`a1fz46he=N0)@X;sE=r7_@+XAMVrFkaG3O4`-LxY z3F0l~vn4!;`F^X=!0$!FTz()fzTeZ*vy7G`kwj_DL$b(Cltl@qQ&p8IKlIl%V$zWQT8-D7_X;%KHiL?X&4ON#0MWNY1;s9p9AbUC}b0m9d&HK9^{Q69dj^}poY|i;rFu; zoSb7q{vOZUANftc0ELLgj1;2Jvyjnj9fiXo#v3V2jK&vOq5JF15OM9tNY*(>Zodo! zS*!BtMJd5!?i-3=Rzu_jXcpXf1qD za|f!)x#+~`I4u2W{7HBGDrgVp6b7j@J$Ix0kG#KA z#bmlz+m8*+?ahF-tA8xrYZG90^*;%z9>dX6Y=bNzmb=R-lwyafie<*t+> z?`M%<=xSl;FMwvq7oiny#Sxdb`z!-9|A0WMC3<|qVs6nfufE=mQn$!(L;uL!!r=x2 zTTD%wrGo@{S#>{VP9Sc6+Ta8>O9b{VBBz6&S;EhtQQ+rA=G{)<&jVJ0%@OX`5*C3e zd>QdMB{d3vpYT3pWP6{Sbd5%5r3fy&&+}fwpE=Qg0DO;vdd$ZVbhS=H9tq`i+pMQRY6RxSVQwTxJ>W@o6)VC+1}Q zeL%*BVkvX<9*CVf&Uj=01A!wLI2wU(A~1Ui0$y7a(8ab4L4Xo;g;0f1=dV&TU&S-1 zNM3=zdy&;#57JuaSH-sSxvBOYkxF%1fy5+{_Qgn`dYzX_7~uGa#tdB!6bdq#4~3t| zZuNjMEch+_4H=KZ_iJ+9@c|hN&P1ekxQB$9jfADcJuL8tfZM-<+!RPHGDn3#joNQU z0(EsnGGQHXVr9P_D6bB|sGLB_tUDLG4fog-M=`UG%Zszj?o^bGz9G-69>mnU1AOP2 z!FO)4q|o}TM&#h#IofR$#krNRD9%PvoIe9@8-d(Z&Gxwnd;}(bnP9?C%qXcry8-80 zzxat`5#$>^yzk4Wd@PX^qvV0Js)HvN;|1vMb*6r$onG)H@) z-Rw|TuwF9SXEPk_J0}>)n#*X`Ilp2ZZtEw|sK;&Sl z*3~l4cptE;>ot9Ort!O2jQj zT&WG)i>dnd^@grR0()&#wKZUEzWIQ?`%&Qou>3n4<(aoo32mB3S%<$MPMhXYHci`P z*A|bnE%pPbE%gLj>NbL05;U@a^*F$GQl_4q3%bgGq6s`Oti4n4s1{tq-U=Q~OeZru zO&sT2K_EjJnHnY#3B?`6I^q>9)kY#&9iQ9FwNyn~Y6vb*tK^$R^4kLzjwtyVKz3>+ z{IVoa??FAlm3^-9Q3t+_Kj}fIAj5PnC?S=LEQf;{dsIVap|CK^+{S(}AY+*2>PN6& z4GdH21E$0kACRG}mrQZf)&Ut#TW z6$Cg%h`6QpdR=73B(+)$8w}7oYR_Q3Ye=N*W9VX_Xuj9iaXmOo4fzcsIb9u`rAG9h z;ij8ySxz_iAUub(hGyAAZUH=w)6acD^B%OS8JXP<6lMDP5fWwkIejL^x%L}@LY5aJ zJ(4WgZvVbbIJSGjeMsOW{BlXyT*Z)i=o7$UFNg#|Zxat$?*m>w$r#piA^uJU3uZ(= z%)+FFjMO#dS-L3kEZHY~k-)9UxC2@-BlT??2wE}$nv4Kj+?87;UMh<&vgoxL!(#vX zIDBCi{mcHYqpp>X`n68iQP)aGeIKxP)Gv$jv~BA;>Z#IEX9Ava11T%K7t_JyX&E-t z;e^<6PnV8+DZutGqIh=P$5H7>+)(893y{Diu=gclbE%#HoNIu?&fNmGT@C#;Njg#I zCi-`Qz9fWaE9llpFyS5~a0YfrlFsol9g?(00_bfI0bPv5a>$KF;^Jh!MEOAOdFb$GB4d37ao9qnn)cWD{cv8!+;^IRe?IF)e{gmzrdjJQWk&8UCM^S*<& zGV=#H?O2!T1;EsfMWVuZtKAz% z1-$(UOb^*fkI0@l0G;$Nh#P^#(Z54rHwIoq;CKW&-UHg$YEOjl! zZz9hNp73)l%;C>$%8ng~LN7wx(I7Z_H3C<#P=_)8OvJR^1Y9mrL+^(|E}X&af_$8r zoQx`4-CKv`F-Yb#VR@A7wJk&(bGNgVxD>daiEhS{U~t_OukC2ahsYzYrl4r>ce;-u zP9q*oMmZt?br53rrg{IrAtLs()b_j}5RNdkPBg!>SNYy5(PjH?zPjK^6Gm+S*3 z1AE8$2#>eebc>bZVMq+d;K$p`@Z01?e4CsN6}*NDq8{hXL)@{3kfHX)xsdpsv8en- zx;{97iMH}wswp3(LZRy%EMb-RGG`$^zup-7A%d&tg7%Peq#^cKWC2MwdQpv@5Of$K zk{YF(yTa%mW*PJ#JTU6;4JZ-FS`M%M{_aVfrAZdwJ+us`7@27F;xjHlEZ=d%TxkN z)%!|c>~MG&o{Z_HzN7Hn#SkqhoPj>*{@r;ZkpB1F-2a}N+x*;|euKSvoVASdwh zv+je&H{t|dezt~i0x!Sa)9eOK?0^h4lZ%qq1nc0v?qGWYFF)rR#K;M}{5&Q~t~~6Q zb~fjlMm5EV0GPg_rE@$tQ`-EFQ;U?I5_61Qmn`n)V)}s_Tx%ZK0JFYRmc@wtF`SJ9)^|;u2X10cn;S5g6r3cw1Z&YYx z_)TKoMAj0wCr1KwM^eYZ{%r9`s^jq=J(8*%M@LeB&ax(=p5@>d2SsJc**w?Y!7puD zUgmcc!86l=S2_d1a_}5a7Ak-4cBdYh-5BNhDy#Uy5y0zn3tFk5WJ&MF?@sh-qn2Nu#5tN-;q2OG9>ig zEI_;(7al>>_j&Fu(|Q|>7DdZMF`OB%iPdMSz`obSsx5P{{nTvm!S#r>*Hn)~qMowe z@-Z?HPr`J?3MzAq)O;r!|hKsvuL5t=qOdaYC zm#7Gg9O{j(smh_==$fk7gy@>89O?}ZCUeoD-tbVepoe7m~6Xl-dd)Ej=`B%!B=dZTNqdg3m1s5ic*3QGa%dZ;%%jkNVZ;ORj3D&22{jeQq!zb1V zq=$N=YpN=>)S=$!nyMbSOdaZtuBpnQ-uRlT9O{j)sp`?mXILlci|K2sa;P`HrYeVe z<7=vNs5g9`trH#U4L2%i5B0{^ROL`_d`(pj^@iy~y&tA~2S zA8&w|U=M$n5o*e28?|MrhJ=7cCT_wWQL%rcoh6tpGdc%9R6-W>DhWCC>AU)I@ zZa7O+iHCYgJ)rtikq|B$mJm=!Q-^w=Mr_eAnq_J_A!K_`lGx__3!)z+@%y9&zkukX zq3p<$<|Txr5r`^0ThC1QU>G?5(j$Idzn{#Q7#%Awx!#w*|z zOCK)3VD()N^_E}M%Icxs@=Gk(9qKKo4)vB_vDz<(ddsgWq=$OTsYAWx*ECHJ^_E{( zNDuXvQ-^xXsYAWx)S=#T>QHYvb*Q)emh!2Gddt66NDuXv-`2jbhkDEJC?tn^%kR>Z zMu&RK@0|u|^{=VlmLCtL15n?^kk>R7KRm!ElEkE(_jv1PeFHHqe&f#O988HD&TI!# z!-|pcryHiWfo#J^h{-g30l(RXkB34P8YT{hIcRup2tATZ5mVD}(I8B98?HsJe8WJ* z6dDd4hG}5K3&>S$I1Z^n!(oUoHH<_!Y}gH$<%U!6Ti;L~fdU(@0Dh&RZ7?`)cpl|8 zHT)9s%?*=4p-02-QC81}0x0xq_%_158)gE(kDfQyYs3RaW8!IgVCnlc)MKE0tEN{* z!cW0NH@#(NexPi&_tEf3#`o2*y!+En!q7)bskCk_PxTrk^fA?X5)C>->qb~H1 zW$;794VK5Ij_pFWp4(&ksNb9%GMfdgHq1F6f3hjM8d=&T_iE<0YoSVDH3`fFfj0Rf z)oM;X>hzNkXMfj?OX6c8JTG zFFTIT*^HxenEQJXN9W8VG0V$vGoRGHXGrM<{Cx~Ob3CXGlJmpgqZ=~=OEc|K-5;-3GiH?ioDDzdKHB72d3@iTh5h$0aqAY; z%viWzV`KyDt722moQHF$e`OJ0HRRwYfX504my2qA1bCc?<_cNzD$WNi$11*NXvY4y zqw&T|1+KzN{pbPfOvl_`cpfF(Tu(mj_R^Y&WpFp)F`$e{CSzNwWBAjWZ|7t}BHvD4 z$ITYys4b)Tt8-q*28(m))^KXPju$M>kGF=C_d2qW8LRQ~)^Gx^V?J=&fs=t)w@_7o zb;avgZgJ@OZV{)4H}PrUuvzW3S@SF3u*oiX2K|2lnk`#Fv&mVXU&$i^GZ8sP&UXLG zXR{qim~$8890M|60j$mRoX=*uAMjXd_UC<$A|DZ!X5Q#i)3(_Odl|i{FfT~{H79AK zzvxq?cSY)C@?uo=v`MRY4?4RgMI7f8(XSZ=+HX_6mg|b?1XN^-=*x2QEg!aG5!2`| znS&XG47du)FJ7?BKEHyh>hR88L-&QbLyO#-z-5e#hvT;`@^)X^=y8urnwUk`BOB0oz=-%U1tC`ZY@u9lC^-ohnD>E@jXgFqo<{8n-_-L9PQYVUDrV2wh?; z#)%RRl+5Er0d>gf5ak;vBAOtNaO;pWQ5tlhDD)%^i*ioZFfU@7Z8R)3o1)>fSngB} zpUChui?aj5)0H2&j4;C&K1EhD1*c1FT&Jjemq=z?4MSXA5*o;rAe`Z)z`C%rI$M+w zLh8Z{YqWf&+-#dMY|bygh%FwptvL@}de%=Nw;K@qBpZ5OW(Js_?cnX6MB;WE@iXy0 zBy%{J_yhtim~0>`6^z;5d>&cnWR8T(KC_dWdk_+i+zpz01OjIvFy{mWV0=6IMElp6 zasdK;c1PfH1nx&*&J74;);;TWeh-1aA*N%@v$#=!qJ9XTBGa^fZ?9tt5_UquBTT?o z;^xBCA?ip(y_3cr#aA*$$vudUeSvZ{P>MZ}D|J;Olg9<+jxQsfBl;MoZ*gGgSo55s zEZj1Re+&%#1HkzWbp4B4!^wIbHIUd(z{(X#oa5tOeGJB%8NeYs_at%FBydpHP8R3& zt>IuWS!{7?&^%kHmVXQelcO!ph^^sZF!?rcSg&2ShEwB>d;>VYM!lkPj)z$|=t6Vw zg~mUAU+B#C?55P0MbHzoV`k?1$ zC<0e9@GAr!Vc;+X>i0t6I0V`em{{3}88g&E@uSId6Ui2w1XFyo9c(F*}%*D6Vp|mC;gGoE29_|8Dy*IgSwjkB%=Hr1{|1mF39eb+^~Ly7*CLZgt*57v^NmD z^Nw<;r`!Y8FlYd+Dnmfv_`8doh7RA8DYv0+DHFTMmU)xiGN(2wZ7F~rCUV+WP&i;2 z>X{S8_`M+a(K_N9HoGn>#8PI++f^D`2?}_9t$DF{|msjUVOwCsjV_#nN%aDqH0tk5-eR(xw-?jZS6vtl; zmG&~(>bv+~P1QuqxH2`>cL4H-RwF$9E1FSWUcE8|+0$=AOqKs#{N{X+?1RC!TDI(} zW^F`d4LtU$*&4!@UDbBKMWk0d6+aB+zmK1iSGy4Z{l&p}KAaS)=KLpO{0lJItD46| z|Ig5f+)VONSar1L*G!lI2J7&kO3lPFLRiZ4e1i&BPi4*h(;$}WX=JUq?;w;_J=J_4 zXaSdItEWjASpt6PuDa9QAr$<8?;!bc2AFk3=F)w4|>fpP(7!PVOtA>UdPoB*Lj zU@hdZ1MsT+yYU}kKng~FQa5@_w0!pRQT2J z+P%(UHCnyO(%yg;Ddc+%FZ73C^E>WDL}tn_cn|rB$g1UcVgh)t!*i%Rv&MK79c7Si z!{z7>VPWdE%u3|KGzOWKL<`f2guNtWEzHoY`MQI=!pz$wzOIhXsT4XXQ$D9sb-OE+1t&QQb?jU$uoPFGMRZoUcsPSZ zzdr=TuRpQE70zXgN04DGtyT2l6KW|RKB@AzV?19pEgr>SgMIkquLxK4;S>>WW3{GIM;gdZ9 zmln-|5vl0ICyoPs_(UP&RojP84h3QlefXp=f;IZ^2}yYkYhkLYON$>NE%I2}-_a7v zODwI5K768(U(tt86v|Ze;S+`QDbLcuWR80zKA-X|9ZD7&?87IsVJDGM zORMNJt)Vu|8ppRZ=*gCE&*xK~rBnKWMwQ=y-v;~eiS#u*u~2%L zO2O8_9!cqu4>(A)R#)`llN$x9t?0uie-x-t(T7iJI3%?mSK$g}>1SHrmsDy`Ds)0c zA3jk?pYkj{rO@h%K769kNtN44Nd_psvX~jnZ^x+d)Kt6m@ z(T7hIyb^Ed`bV?v_>^bqVre{m_=K?y_TiKHkXhw^EI^m;+*8EoRrKMLBL(s+`tZp) z0%a?_Wm@{lw*|^o^x>0-1*)m&!za3Su1|TEHq=Yo@hMMIuc!J`kq~Y)ETNt{TE76X z@`JQ}5nDElW|^8!2uWX*B(^#K>Z2bd-4AuH@-Gww%8oo~UP4H^6%mbQBcu6)m?tI6 z&j9#*%CmIeMv3?}B5FyF`XiGA3i5oI!Jcz4(DClzIHdHFckUlx$LTGL77q#8p0^NZ z4W2}ZaMr{)YXzsz6~x)ya1CJiOK|n!%b4eZuWx7UPNZ)juHWw`18)!ZqIU>hGXUV8 zZ2Luv@Ve#G$Ud)#g#gkpdm%KyI?OpPyPazWSf2-MIO2g^RB|5 zET!`$l2)l#7kNIPrHn%2@u1y*90I2@Fc*RI5g2p`0#_n10oh#9W{lTDdgcd6aFJD+ z&yQaNf`bE8lBwk9c2GBs1vr4c5&K_&+J+#o*XM8vl6YqT=M{_u=7E<$UyvR~+OR(& zZa6Vpu4Xx#)%!}++qq0@ViB;|vd{*tZ3ZOkrpXdz#se~z5q?`fCk4$Zd=)9=Ke zwE0N5Y5h+FB&x*dR7u)&jv2ouAyKN1lPI{vGnYJSid&f^@`|Is67*HCZ=+r>LFHRs zVkzt(X$D8g0ao*pVdfF9VD$jVrU|W~1YRP6ml4;m36(XkoP+xBx-UP52>ekH;ZIPO zBk8Y!aQ=#fIY@Z6TSEUVs7r+hB9N-EZRSr?oRN$7N2UohvnrmE(-|?9M!G6<2vmLK z`HYxB6JM1%9uYVoi{+K_DDxFW;StUO9hm7JVGMg#J*U6*tW148i5(+P+=gS}Esl|U zO5tz>N6GEl((epSpBXFrMPYyh_O^P?N3qO!$28F1%@}I7(DufeU+;jq98Lzmf;jo9 z9|m05HBKML#z%^&@M<>6JBaNy9>iATNH`P7D6qL}6qd*iBiSfg^mtQ3yX3Dmtc#)C z>*)sIoy`%z$^XzSV7$h8eSqqF@121zqQ`z81XXb7twGOl|DOCZkp3?o`&EDPDimMk zUyt9MZ;yaFfAUF0sz0eA@h4wFBtE8uABOVZzz_V%dHC-=2iqf{Rdc?L7&!u3HIIq% zKxb|y1!nz8JkDYLNjsN<2L~ZmPnG$C`jccW@+ZH649=fq7&9g3Pu?P6Zf{=EXO{fDM5O7LHw*`AkSK=cNZ*rm}POw9=K;MEA;My=vhnk z?tLPp}<1*^`lBBb73aI{KHy}RHG>X)l`7aXHy zsdpE+6L8|)1<|vXRsJGSSMM%3jkLwP3r<(U>fHrrC}H*Pf-{w{dUt_40Vm#FaJHtY zcNe&4EycSF&UFmYy9>^HUn-*BU2wjZpx#}uz6u1S2J!BK3oa5!y}RJT zH-rkkyT?%xIRO_OFLe^{E;x}0;@t(SU7dF9hw|OCmg3z7?gX5w%E`*9JpmV-@^#Rt z@-M-!dUwHtWRM?f2p*`MZvcNaWywm|CL1@2i( z@$Le50#3ZUz&&dzA8H8P2{`fY0{5(?cy~ectfhE&LG-Mpcy~c`0#3ZUAbQqPyt^QJ z)>6E?AbQqPyu09ewoc^T1sfH#-dzwqYboAcuxTwCDDv)t*JzI-?=E;Q6;NxY4kLdg^F>7h>fHX)hzTY#7ZlHJuQW{vt_i zbN9WWn%8Td(C~0Tb-C94`(^$m>n7*&J*}yn@*${$x7+ zE^zuBh3f(4V4_=x%w zN6*_FA;KWN^Bv7gK(jx#o{u2K6EQh%`3mm$4N98I3C)EW3)6t1h&z$*X{=^2NJkG6QNw;;ARXbt)yan%zWOw^l!_9Xty z`K?Ua6*z)?C=2#_4q1YvJL#ee8Q{P z(E`E%&6etkM8l||ljB@GInGU+j+BC5 zC)+K#spbZNMa~0q(cMQ*p`I?c^O!!MqK)g^qm?j-@U0gB4aHi1C7BA3r|+nK3g z4b$Tyw_75x)+_llfmiamPZ9o*S={uPz_a+Pmme}-KMp^@CFPQA(CGBIX3rulyiELR z_F60D==8W|kwR{IT)Sfz5jj1sUBF!&)J3K^wL38Z)8jmzpx>D_=5|ZTCtaN$=ciuE ztdv838iUNr>2ZEKkuV=Z*8B|3n$I8PRC3rdKU0#PWHmwhbRRiDe~%BHoAHi9DVeP z7_2Vx>RI;U9G236TvOx$ya?>!)g7@5;eGgoS7G-~&)47eO<=kmOeA;r(65`&I zdojYjH;ua?#%x+5rW=RU=k z<4XSS$YU?ZNsx;M#nW#^Y{_S>m-gq=U7g#W$%)PNdR#Q9TNg7c@2#1ts@r&PC{KlM$ir1PgZN%e7~ zsO0|*6|w%5)XDl&M6mvptJ6R1PyHNnDftiJ*ZEUqFfaZTm4dA!{?zrDgv9>TJ_0#^ z>RSRif9l5q{R93~o}UT$f8|fHbrSxRf}hc!;sBQLrxd&r*RTCHG>!GAr18|BVyyG0 z{su8yf2vjl=KQI_0y%%GQy}M09UzeNr%n*a`BQu@#&6B%`Knv6;eJsi`ctG{PxYrF zq0mOd66&d=34f~Omk?VvjAogdP6*jJ7cCpMIsfXTA0&Md6ifabL7?o&ljbFaq=OOB zXwGFce-LwuWLXQq`cvmh#AS%6COPVlowt?zE7?4IFrPeK-}~7mnAo0d%zHrU^Bs&? z=439G_dSF0r;I@m-_iaN#zZsAbOGR`zSkxkqsH{uEab#qGRxpajjC^ z&XOBJ*Ge4tX7E&j6|IIRt)#z|eDnH4$Y;PsXf6 z?Y#kAh$c$|{)_;R!lC|aw+F%JrT*mY_xSr8NSMW#!1R~%@XvFo-sS+*P`t($*wE(y zRCZtN0vXHhOAKF+q@kyQ%!$H)x?;K)G~B$t1f_X~GdTGt-s{yUs$J^q3m+q-fim3P z@$Le(kwi7D4|X)}Sb}hG>`wq9v-4kv?*kN#p?%P_-ENY_@n=poe89W)-Ut*@SCrP-+X)c&9A-`tW?!xwq1`hayZkL>0$^w z1Niwm{%ZJxgKK&MPA;QmX01kCt{@1+}7FP%Fv>wc>6g z(JV!|pjMO%YDKxAR+I~BMY*6>lnZJ_xu8~*3u?sz%IZ~=3u;BZpceR53+T5M<%9Lb z-8;}c#f$Ol7v+QXMfqTT@yBDqwpUtn0C>$!dmkC(Hgs+}gBTs zWHAlkdHXER+f$5&EvzH)2=f^0pXOQINr-AcIFi29JUa9t9aZ3Nm;UWbi1+;8Bpl zqo9LFovhTI3BpCYQm0{Ask;o(UiD%4VJNr=ftgsTW97c(BCt|dvMY6DFLWz)(|wGJ zcBPIPFwEB5l{y7YyAMD*RX_H2by|5D3vWrYl36DW>&T9u-9-&N7k??zoSlSA6M`?<|7hqQAKSe|5!EBD}=A_+aDoqI^r^pJM$VTJUNcJ2{{ z^pJM$QF4y&FX|!f+>^fm*dR{<<$iHURF+)aM4hy(U)r)fpHBhhp5bYshBFW>=bpPF z%JaOIWAki`^6)93+zUqmuSuT*%Dp)Oqe_KO0p)%}g<(N_3MluMlE_y06j1KBnpRce zQ$V@56{@Z9DWKdt3Kc7S3Mluk<||kD6j1JWB+unHJ_VF}Z#zJIex$-HUb*-85b!pr zCPm9c=|LH5jz`j?_svYQHoCE(I^MCLS#5R0?DcZLBK+fwcS0P+|kgW#>#N~8G z7Z{F5b-zZ@2VqRw1jHWK1JUe4R>vW(=kI|q6^5(lls8Z=16L!!6VW|4xxjxTunsXG z`;}dg`#M9C&qKDmkn9=^XuYU~<~ovn9C5vV9yst%1j(Jbj@%7Km+QF`vP)UtMu27Y zJ_N+b#$KS+$Ieo!GXII;#Ou8VX}pnh4Abg#24ipBp8z&*N3!K^SFAKp=(;<#o0jCjMi&_`~mjdkB1xg~JB?z#fzNBq#Mab)S z5i2$u{rxKN+ff5=9x?ZDyHev@4F*Q4(u=O=Y%5F2A(1+|p zS;ICE-Ul*-3C6XvVWF3zU~d6f@x9s$fvBG0%cxutNOKe8SLPfb{j;87MsG;5ZzS>Fe`_=~eOgh4B_-3CPJ4h%yzXW|Eg);#?8l!NV=wagrh$a-ciGmnY(qta^; zlx?}(ggVHO+j6;yY)Kdb-IlA0x8q9dI5D? zu4EdDnA(G5YUUO6KbV{kpjACHJ5|90a7$Axhz++~&DptjBZS;DY-n&DA#~Jp) zC-Enf;TBlKUYO^PW8ivp+TL`5&A1@|A7z)8+wSAKK+_zGnem;-Sc0}^knTJVK1ty9 z*?^QWNZ}s;N}AERUvEO}hiZ#JA%Ipvvys@eCuA`*wVrfYG<(agH9T*uj==P61&LyOz7} z=+~;v(YNCj0iDu1COaSjWemh=k$?vz4uKRX;J>(?FwbK}6 zR_?ynPA3wK39{DC(5(9H_(6i@z8z1g>bK*63jDHRYQRVo(*t3B12-6VD#8uoF8tfx zz}1i0=9fGI(z0rnKR}eke#|z%R3ZJCZGIWiC<=beHosi?rZCtbS?-h;PTvTWg3qK% zP2IM?2gEnE>be-x_h_@wyk`DHtC?9otyMRRi!}wm4^rxQxV7N3!gv}@!sGGVqcn6G zL{l8cbFm`u;&^*RR$kOCcIcs4KjbP`al#A~iS3tgDjK6WQK33e--wI!!09WubvClJeoE*i66)8xiAb*r zQCQnY5Jzj@@|Nda1M6q9nANq=ZvK{r@(l!XD=svLU1$ap^&QJJfl-xN zlSv?fh&PndBHN4bCxg}J$@(XVJpc@}M$zhcmO;O-fP* zXi?gUZjM4MmP(#ohVU-ZK!D|+ly(gW4JU{L9&uG{6}|p!C--k7*f1Aj_Sk~ABfJ?a zuwCMkm-GOEjS_zi;z#jWl0l<^^(>&#j=)^x9W)iOEr&t0jJ*hD4nnLGp_Us<5i%s& zEh*MgGF*pbnoEyj(~3Nj!e*Kyn8~m4heVggG(}%a)738SuW;c8Pq|D&Dy4cE{w9N6 zS@{{a{6KtOW+^rHWW?#CU(2b4KV*$o0GD4N{zIxpk3v}-1O6J!y^jVOg9-hpR-$6(V=Pn}$B@QOh?^kw{37dl4Z!izgO6i9A7QHW$>RwQJRBgN2l^6w?py$a z?*wTMwQnaXC$)YE2{{bzH7L%prv1Si{4CNaxY4OJ_OeKD>max{fW}=lzJ%*Y`0LQ3 zw$njYg9B8H!aY2JQA?{{H_K#UaalSBG=n4z064&j&T?k2^j zjEqZ3s@s^kOnE;lYbNNLX$6!eyG!pg$4bPhT7cD7q`5j&q2!qPts5m6ap7zdbUvLI zI}cBif$=Oy$u)5XvL8y3iABMibOaG5EI>?E=5gqM6UY43351U2L|7>Z&jDf5M9IM^ zhjz?KEyS3_2338X)RP#Keu^wP83eDYdlJ}_b|&6r#bZ~Sw3K+0e=B&5P`oM2j>hAB zoZ%_UQ{^ivg|kGR4TsWzUhGR^k z-06lF9&2&ok!CF56gXJHLgR_-baOH0(uH%3p%qLKzOaG{9i>dsz6oJ(y15%040Ssj z!}br_A_>fhzEdIvp*m$VIA|zjg5JR%xw6^KggH#(@Opk>1|l(3G&iJ|xwt?~T)`Ytd(K%+4+90U~vnWz8ZF*CHMvj8aS!uRZN?4=7 zMnW8;RUDXf#g&>_M~=oOBc`FD#>FhotYgIZWCXKx#Eh}rY0^3qdO!;&Y6@dJke9WX z6d@N*?+jx6$#Hxfxy>lgHa^74vZusYuAr$A4r)!DX%UV@u+ZsIl+a<+j5vyv!0g}c ze{q+~Cc9!)x*NbQNE_I0P@V3GHMVcr)LQMb|5$%?{XNi*S&BPms2vj*xRr&rx)$kt z^|2Dd^G5qwTY%meNe_~l*T8RDHpaPAde#)TJ2kmECPO9Y5qFfh%ev0sRJE6?>cw4k z>`=WE9j;GYXgAI68}rU$`&mV{U8H}43#7K-!zN-Q(S@Cg4~)BhtLrM%0DQiFY`T*S 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 literal 0 HcmV?d00001 diff --git a/examples/osd/climate/er-example-server.osd-merkur.eep b/examples/osd/climate/er-example-server.osd-merkur.eep new file mode 100644 index 000000000..1996e8fde --- /dev/null +++ b/examples/osd/climate/er-example-server.osd-merkur.eep @@ -0,0 +1 @@ +:00000001FF From 7001e8fa33cee31f772e9378459470a8bb8eca71 Mon Sep 17 00:00:00 2001 From: harald42 Date: Wed, 6 Nov 2013 16:31:25 +0100 Subject: [PATCH 089/345] bugfix new dresden module 32khz --- platform/osd-merkur/contiki-conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index a3ce61151..2867cbc61 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -75,7 +75,7 @@ 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 +#define AVR_CONF_USE32KCRYSTAL 0 /* Michael Hartman's protobyte board has LED on PORTE1, used for radio on indication */ /* However this results in disabling UART0. */ From 310234e0dc884718c273ee6ed3c87a4e6bec540b Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 7 Nov 2013 16:34:28 +0100 Subject: [PATCH 090/345] add dht22 and RHT03 support --- examples/osd/climate/er-example-server.c | 10 +++----- platform/osd-merkur/dev/dht11.c | 32 ++++++++++++++++-------- platform/osd-merkur/dev/dht11.h | 7 +----- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c index 9fb0ee36a..d4a3042f7 100644 --- a/examples/osd/climate/er-example-server.c +++ b/examples/osd/climate/er-example-server.c @@ -72,7 +72,7 @@ #endif #if REST_RES_DHT11 #include "dev/dht11.h" -uint8_t dht11_temp=0, dht11_hum=0; +uint16_t dht11_temp=0, dht11_hum=0; #endif #if defined (PLATFORM_HAS_BUTTON) @@ -141,7 +141,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format - index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n"); + index += sprintf(message + index,"{\n \"version\" : \"V0.4\",\n"); index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n"); index += sprintf(message + index,"}\n"); @@ -691,8 +691,7 @@ hw_init() ds1820_temp(); #endif #if REST_RES_DHT11 - dht11_temp=DHT_Read_Data(DHT_Temp); - dht11_hum=DHT_Read_Data(DHT_RH); + DHT_Read_Data(&dht11_temp, &dht11_hum); #endif } #define MESURE_INTERVAL (20 * CLOCK_SECOND) @@ -802,8 +801,7 @@ PROCESS_THREAD(rest_server_example, ev, data) PRINTF("Periodic\n"); etimer_reset(&ds_periodic_timer); #if REST_RES_DHT11 - dht11_temp=DHT_Read_Data(DHT_Temp); - dht11_hum=DHT_Read_Data(DHT_RH); + DHT_Read_Data(&dht11_temp, &dht11_hum); #endif #if REST_RES_DS1820 if(ds1820_convert()){ diff --git a/platform/osd-merkur/dev/dht11.c b/platform/osd-merkur/dev/dht11.c index 7fd96da8f..8ab1d28cd 100644 --- a/platform/osd-merkur/dev/dht11.c +++ b/platform/osd-merkur/dev/dht11.c @@ -29,7 +29,10 @@ #define udelay(u) clock_delay_usec(u) #define mdelay(u) clock_delay_msec(u) -uint8_t DHT_Read_Data(uint8_t select){ +// define for DHT11 else for DHT22, RHT03 +#define DHT11 1 + +uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){ //data[5] is 8byte table where data come from DHT are stored //laststate holds laststate value @@ -48,13 +51,17 @@ uint8_t DHT_Read_Data(uint8_t select){ //Set pin Output //Pin High DHT_DRIVE(); - mdelay(250); //Wait for 250mS +// mdelay(250); //Wait for 250mS + mdelay(100); //Wait for 100mS //Send Request Signal //Pin Low - OUTP_0(); - mdelay(20); //20ms Low - + OUTP_0(); //20ms Low +#if DHT11 + mdelay(20); +#else + udelay(500); +#endif //Pin High OUTP_1(); udelay(40); //40us High @@ -106,12 +113,17 @@ uint8_t DHT_Read_Data(uint8_t select){ //Check if data received are correct by checking the CheckSum if (data[0] + data[1] + data[2] + data[3] == data[4]) { - if (select==DHT_Temp) { //Return the value has been choosen - return(data[2]); - }else if(select==DHT_RH){ - return(data[0]); - } +#ifdef DHT11 + *humidity = data[0]; + *temperature = data[2]; +#else + *humidity = (uint16_t)data[0]<<8 | data[1]; + *temperature = (uint16_t)data[2]<<8 | data[3]; +#endif + return 0; }else{ + *humidity = 2; + *temperature = 2; // uart_puts("\r\nCheck Sum Error"); } diff --git a/platform/osd-merkur/dev/dht11.h b/platform/osd-merkur/dev/dht11.h index 7012b75c6..6cf757e5d 100644 --- a/platform/osd-merkur/dev/dht11.h +++ b/platform/osd-merkur/dev/dht11.h @@ -63,10 +63,5 @@ //and 2 transitions which indicates End Of Frame. In total 84 #define MAXTIMINGS 84 -//Select between Temp and Humidity Read -#define DHT_Temp 0 -#define DHT_RH 1 - //This is the main function which requests and reads the packet -uint8_t DHT_Read_Data(uint8_t select); - +uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity); From 7b46026b5200a943238bffa6875afb010047af0b Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 12 Nov 2013 13:27:13 +0100 Subject: [PATCH 091/345] bugfix RH03 sensor --- examples/osd/climate/er-example-server.c | 5 ++++- platform/osd-merkur/dev/dht11.c | 23 ++++++++--------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c index d4a3042f7..7ece0598b 100644 --- a/examples/osd/climate/er-example-server.c +++ b/examples/osd/climate/er-example-server.c @@ -141,7 +141,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format - index += sprintf(message + index,"{\n \"version\" : \"V0.4\",\n"); + index += sprintf(message + index,"{\n \"version\" : \"V0.4.1\",\n"); index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n"); index += sprintf(message + index,"}\n"); @@ -691,7 +691,9 @@ hw_init() ds1820_temp(); #endif #if REST_RES_DHT11 + //DHT_INIT(); DHT_Read_Data(&dht11_temp, &dht11_hum); +// DHT_Read_Data(&dht11_temp, &dht11_hum); #endif } #define MESURE_INTERVAL (20 * CLOCK_SECOND) @@ -801,6 +803,7 @@ PROCESS_THREAD(rest_server_example, ev, data) PRINTF("Periodic\n"); etimer_reset(&ds_periodic_timer); #if REST_RES_DHT11 + // DHT_Read_Data(&dht11_temp, &dht11_hum); DHT_Read_Data(&dht11_temp, &dht11_hum); #endif #if REST_RES_DS1820 diff --git a/platform/osd-merkur/dev/dht11.c b/platform/osd-merkur/dev/dht11.c index 8ab1d28cd..c163feb6b 100644 --- a/platform/osd-merkur/dev/dht11.c +++ b/platform/osd-merkur/dev/dht11.c @@ -46,22 +46,15 @@ uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){ sreg = SREG; /* Save status register before disabling interrupts. */ cli(); /* Disable interrupts. */ - //Prepare the bus - PIN_INIT(); //Set pin Output //Pin High DHT_DRIVE(); -// mdelay(250); //Wait for 250mS mdelay(100); //Wait for 100mS //Send Request Signal //Pin Low OUTP_0(); //20ms Low -#if DHT11 - mdelay(20); -#else - udelay(500); -#endif + mdelay(20); //Pin High OUTP_1(); udelay(40); //40us High @@ -74,7 +67,10 @@ uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){ //Repeat for each Transistions for (i=0; i254) break; @@ -90,17 +86,14 @@ uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){ //Shift data[] value 1 position left //Example. 01010100 if we shift it left one time it will be //10101000 - // led1_on(); - + data[j/8]<<=1; if (counter >= 15) { //If it was high for more than 40uS - // led1_off(); +// led1_on(); data[j/8]|=1; //it means it is bit '1' so make a logic - // led1_on(); +// led1_off(); } //OR with the value (save it) j++; //making an OR by 1 to this value 10101000 - // led1_off(); - } //we will have the resault 10101001 //1 in 8-bit binary is 00000001 //j/8 changes table record every 8 bits which means a byte has been saved From 0ef2ce8e5c22e432061ed7d14f1f92790d2ec819 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 12 Nov 2013 15:58:55 +0100 Subject: [PATCH 092/345] bugfix CS cast to uint8_t --- platform/osd-merkur/dev/dht11.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/platform/osd-merkur/dev/dht11.c b/platform/osd-merkur/dev/dht11.c index c163feb6b..07629bc74 100644 --- a/platform/osd-merkur/dev/dht11.c +++ b/platform/osd-merkur/dev/dht11.c @@ -67,8 +67,8 @@ uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){ //Repeat for each Transistions for (i=0; i= 15) { //If it was high for more than 40uS -// led1_on(); + //led1_on(); data[j/8]|=1; //it means it is bit '1' so make a logic -// led1_off(); + //led1_off(); } //OR with the value (save it) j++; //making an OR by 1 to this value 10101000 } //we will have the resault 10101001 @@ -103,9 +103,9 @@ uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){ } SREG = sreg; /* Enable interrupts. */ - + //printf("HUM %d %d %d %d %d %d",data[0],data[1],data[2],data[3],data[4],(uint8_t)(data[0] + data[1] + data[2] + data[3]) ); //Check if data received are correct by checking the CheckSum - if (data[0] + data[1] + data[2] + data[3] == data[4]) { + if ((uint8_t)(data[0] + data[1] + data[2] + data[3]) == data[4]) { #ifdef DHT11 *humidity = data[0]; *temperature = data[2]; From aea396e542267126485c97ea0e6d0a5be5fdec81 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 15 Nov 2013 13:47:15 +0100 Subject: [PATCH 093/345] bugfix blockmode, 8 Hz dutycyle as standard --- cpu/avr/radio/rf230bb/halbb.c | 2 ++ platform/osd-merkur/contiki-conf.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cpu/avr/radio/rf230bb/halbb.c b/cpu/avr/radio/rf230bb/halbb.c index 53deb1c8a..6aa991eb6 100644 --- a/cpu/avr/radio/rf230bb/halbb.c +++ b/cpu/avr/radio/rf230bb/halbb.c @@ -700,10 +700,12 @@ ISR(TRX24_TX_END_vect) rf230_txendwait=0; } +extern volatile uint8_t rf230_pending; /* Frame address has matched ours */ ISR(TRX24_XAH_AMI_vect) { // DEBUGFLOW('8'); + rf230_pending=1; } /* CCAED measurement has completed */ diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index 2867cbc61..95f61808a 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -238,7 +238,7 @@ typedef unsigned short uip_stats_t; #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 16 +#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 */ From afa20ee0ae2e3f15b5deabe155955950bef36f61 Mon Sep 17 00:00:00 2001 From: harald42 Date: Tue, 19 Nov 2013 15:23:52 +0100 Subject: [PATCH 094/345] cleanup plattform defines, disable energest, radiostatistics --- .../er-example-server.c | 2 +- platform/osd-merkur/contiki-conf.h | 7 ++---- platform/osd-merkur/contiki-main.c | 1 - platform/osd-merkur/params.c | 12 +++++----- platform/osd-merkur/params.h | 22 +++++++------------ 5 files changed, 17 insertions(+), 27 deletions(-) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c index dca42a593..14c203b12 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-server.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c @@ -48,7 +48,7 @@ #define REST_RES_DS1820 0 #define REST_RES_HELLO 0 #define REST_RES_MIRROR 0 /* causes largest code size */ -#define REST_RES_CHUNKS 0 +#define REST_RES_CHUNKS 1 #define REST_RES_SEPARATE 0 #define REST_RES_PUSHING 0 #define REST_RES_EVENT 1 diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index 95f61808a..489cdaf61 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -101,10 +101,10 @@ typedef unsigned long off_t; /* RADIOSTATS is used in rf230bb, clock.c and the webserver cgi to report radio usage */ /* It has less overhead than ENERGEST */ -#define RADIOSTATS 1 +//#define RADIOSTATS 1 /* More extensive stats, via main loop printfs or webserver status pages */ -#define ENERGEST_CONF_ON 1 +//#define ENERGEST_CONF_ON 1 /* Packet statistics */ typedef unsigned short uip_stats_t; @@ -190,7 +190,6 @@ typedef unsigned short uip_stats_t; #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. */ @@ -249,7 +248,6 @@ typedef unsigned short uip_stats_t; #define RIMESTATS_CONF_ENABLED 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 @@ -290,7 +288,6 @@ typedef unsigned short uip_stats_t; #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 diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index 8c5fe2de4..7fd111290 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -557,7 +557,6 @@ extern uip_ds6_netif_t uip_ds6_if; PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); { uip_ds6_route_t *r; - PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); j = 1; for(r = uip_ds6_route_list_head(); r != NULL; diff --git a/platform/osd-merkur/params.c b/platform/osd-merkur/params.c index a5a83932a..582dbe67f 100644 --- a/platform/osd-merkur/params.c +++ b/platform/osd-merkur/params.c @@ -119,8 +119,8 @@ 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; +uint8_t eemem_channel[2] EEMEM = {CHANNEL_802_15_4, ~CHANNEL_802_15_4}; +uint16_t eemem_panid EEMEM = IEEE802154_PANID; uint16_t eemem_panaddr EEMEM = PARAMS_PANADDR; uint8_t eemem_txpower EEMEM = PARAMS_TXPOWER; @@ -153,11 +153,11 @@ params_get_channel(void) { eeprom_write_block(&buffer, &eemem_server_name, sizeof(eemem_server_name)); for (i=0;iSet EEPROM RF channel to %d\n",x); } @@ -235,7 +235,7 @@ params_get_panid(void) { 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; + x=IEEE802154_PANID; if (settings_add_uint16(SETTINGS_KEY_PAN_ID,x)==SETTINGS_STATUS_OK) { PRINTD("->Set EEPROM PAN ID to %04x\n",x); } diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h index e602ca3e0..f91ce5759 100644 --- a/platform/osd-merkur/params.h +++ b/platform/osd-merkur/params.h @@ -12,6 +12,11 @@ * * Note the parameters in this file can be changed without forcing a complete rebuild. */ +// default settings +#define CHANNEL_802_15_4 26 // default frequency (11-26) +#define IEEE802154_PANID 0xABCD // default panid +// end default settings + #define CONTIKI_CONF_RANDOM_MAC 0 //adds 78 bytes #define CONTIKI_CONF_SETTINGS_MANAGER 0 //adds 1696 bytes #define BOOTLOADER_GET_MAC 1 // get mac form boolaoder, need bootlaoder bonsai, PARAMETER_STORAGE 0 @@ -38,7 +43,6 @@ 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 @@ -54,16 +58,6 @@ extern uint8_t eemem_domain_name[30]; #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 @@ -95,9 +89,9 @@ 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_nodeid(...) PARAMS_NODEID +#define params_get_channel(...) CHANNEL_802_15_4 +#define params_get_panid(...) IEEE802154_PANID #define params_get_panaddr(...) PARAMS_PANADDR #define params_get_txpower(...) PARAMS_TXPOWER #else From da39da39dcfe2f6a58b66cfdbcf40deec23d7e49 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 22 Nov 2013 16:34:13 +0100 Subject: [PATCH 095/345] initial upload --- examples/osd/powerbox/Makefile | 98 +++++ examples/osd/powerbox/README | 76 ++++ examples/osd/powerbox/er-example-server.c | 436 ++++++++++++++++++++++ examples/osd/powerbox/flash.sh | 2 + examples/osd/powerbox/project-conf.h | 97 +++++ examples/osd/powerbox/run.sh | 6 + examples/osd/powerbox/server-client.csc | 227 +++++++++++ examples/osd/powerbox/server-only.csc | 189 ++++++++++ examples/osd/powerbox/static-routing.c | 155 ++++++++ examples/osd/powerbox/static-routing.h | 20 + examples/osd/powerbox/todo | 3 + platform/osd-merkur/Makefile.osd-merkur | 2 + platform/osd-merkur/dev/relay-sensor.c | 134 +++++++ platform/osd-merkur/dev/relay-sensor.h | 52 +++ platform/osd-merkur/dev/relay.c | 136 +++++++ platform/osd-merkur/dev/relay.h | 58 +++ 16 files changed, 1691 insertions(+) create mode 100644 examples/osd/powerbox/Makefile create mode 100644 examples/osd/powerbox/README create mode 100644 examples/osd/powerbox/er-example-server.c create mode 100755 examples/osd/powerbox/flash.sh create mode 100644 examples/osd/powerbox/project-conf.h create mode 100755 examples/osd/powerbox/run.sh create mode 100644 examples/osd/powerbox/server-client.csc create mode 100644 examples/osd/powerbox/server-only.csc create mode 100644 examples/osd/powerbox/static-routing.c create mode 100644 examples/osd/powerbox/static-routing.h create mode 100644 examples/osd/powerbox/todo create mode 100644 platform/osd-merkur/dev/relay-sensor.c create mode 100644 platform/osd-merkur/dev/relay-sensor.h create mode 100644 platform/osd-merkur/dev/relay.c create mode 100644 platform/osd-merkur/dev/relay.h diff --git a/examples/osd/powerbox/Makefile b/examples/osd/powerbox/Makefile new file mode 100644 index 000000000..e12d01b5c --- /dev/null +++ b/examples/osd/powerbox/Makefile @@ -0,0 +1,98 @@ +all: er-example-server +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + + +# variable for Makefile.include +WITH_UIP6=1 +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6 +CFLAGS += -DUIP_CONF_IPV6_RPL + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/powerbox/README b/examples/osd/powerbox/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/powerbox/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/powerbox/er-example-server.c b/examples/osd/powerbox/er-example-server.c new file mode 100644 index 000000000..018a1be40 --- /dev/null +++ b/examples/osd/powerbox/er-example-server.c @@ -0,0 +1,436 @@ +/* + * 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) PIR REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + * Harald Pichler + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_RELAY 1 +#define REST_RES_LEDS 1 +#define REST_RES_TOGGLE 1 +#define REST_RES_BATTERY 1 + +#include "erbium.h" + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_RELAY) +#include "dev/relay-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre0\",\n"); + index += sprintf(message + index," \"name\" : \"Powerbox\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_RELAY) +/******************************************************************************/ +#if REST_RES_RELAY +/*A simple actuator example*/ +RESOURCE(relay, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/relay", "title=\"RELAY: ?type=1|2|3|4, POST/PUT, POST/PUT mode=on|off\";rt=\"Control\""); + +void +relay_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *type = NULL; + const char *mode = NULL; + static char name1[10]="R1"; + static char name2[10]="R2"; + static char name3[10]="R3"; + static char name4[10]="R4"; + + char temp[100]; + int index = 0; + size_t len = 0; + int relay = 0; + int success = 1; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"%s\" : ",name1); + if(relay_sensor.value(RELAY_SENSOR_1) == 0) + index += sprintf(temp + index,"\"off\",\n"); + if(relay_sensor.value(RELAY_SENSOR_1) == 1) + index += sprintf(temp + index,"\"on\",\n"); + index += sprintf(temp + index," \"%s\" : ",name2); + if(relay_sensor.value(RELAY_SENSOR_2) == 0) + index += sprintf(temp + index,"\"off\",\n"); + if(relay_sensor.value(RELAY_SENSOR_2) == 1) + index += sprintf(temp + index,"\"on\",\n"); + index += sprintf(temp + index," \"%s\" : ",name3); + if(relay_sensor.value(RELAY_SENSOR_3) == 0) + index += sprintf(temp + index,"\"off\",\n"); + if(relay_sensor.value(RELAY_SENSOR_3) == 1) + index += sprintf(temp + index,"\"on\",\n"); + index += sprintf(temp + index," \"%s\" : ",name4); + if(relay_sensor.value(RELAY_SENSOR_4) == 0) + index += sprintf(temp + index,"\"off\"\n"); + if(relay_sensor.value(RELAY_SENSOR_4) == 1) + index += sprintf(temp + index,"\"on\"\n"); + index += sprintf(temp + index,"}\n"); + + len = strlen(temp); + memcpy(buffer, temp,len ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + + case METHOD_POST: + success = 0; + break; + case METHOD_PUT: + if ((len=REST.get_query_variable(request, "type", &type))) { + PRINTF("type %.*s\n", len, type); + if (strncmp(type, "1", len)==0) { + relay = RELAY_SENSOR_1; + } else if(strncmp(type,"2", len)==0) { + relay = RELAY_SENSOR_2; + } else if(strncmp(type,"3", len)==0) { + relay = RELAY_SENSOR_3; + } else if(strncmp(type,"4", len)==0) { + relay = RELAY_SENSOR_4; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + relay_sensor.configure(relay,1); + } else if (strncmp(mode, "off", len)==0) { + relay_sensor.configure(relay,0); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif +/******************************************************************************/ +#endif /* PLATFORM_HAS_RELAY */ + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ +/******************************************************************************/ + +void +hw_init() +{ +#if defined (PLATFORM_HAS_LEDS) + leds_off(LEDS_RED); +#endif +} + +#define MESURE_INTERVAL (CLOCK_SECOND/2) + +PROCESS(rest_server_example, "Erbium Example Server"); + +AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + PRINTF("Starting Erbium Example 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); + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif + /* Activate the application-specific resources. */ +#if REST_RES_RELAY + SENSORS_ACTIVATE(relay_sensor); + rest_activate_resource(&resource_relay); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (REST_RES_EVENT) + if (ev == sensors_event ) { + PRINTF("EVENT\n"); + } +#endif /* REST_RES_EVENT */ + } /* while (1) */ + PROCESS_END(); +} diff --git a/examples/osd/powerbox/flash.sh b/examples/osd/powerbox/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/powerbox/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/powerbox/project-conf.h b/examples/osd/powerbox/project-conf.h new file mode 100644 index 000000000..a5c8cc57b --- /dev/null +++ b/examples/osd/powerbox/project-conf.h @@ -0,0 +1,97 @@ +/* + * 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_ERBIUM_CONF_H__ +#define __PROJECT_ERBIUM_CONF_H__ + +#define PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_RELAY 1 +#define PLATFORM_HAS_BATTERY 1 + +/* Some platforms have weird includes. */ +#undef IEEE802154_CONF_PANID + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 640 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ + +#undef UIP_CONF_DS6_NBR_NBU +#define UIP_CONF_DS6_NBR_NBU 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 + + +/* Reduce 802.15.4 frame queue to save RAM. */ + +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 + + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ +#endif /* __PROJECT_ERBIUM_CONF_H__ */ diff --git a/examples/osd/powerbox/run.sh b/examples/osd/powerbox/run.sh new file mode 100755 index 000000000..4f21e9b63 --- /dev/null +++ b/examples/osd/powerbox/run.sh @@ -0,0 +1,6 @@ +#!/bin/bash +make clean TARGET=osd-merkur +make TARGET=osd-merkur +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/powerbox/server-client.csc b/examples/osd/powerbox/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/powerbox/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/powerbox/server-only.csc b/examples/osd/powerbox/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/powerbox/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + diff --git a/examples/osd/powerbox/static-routing.c b/examples/osd/powerbox/static-routing.c new file mode 100644 index 000000000..628594892 --- /dev/null +++ b/examples/osd/powerbox/static-routing.c @@ -0,0 +1,155 @@ +/* + * static-routing.c + * + * Created on: Oct 12, 2010 + * Author: simonduq + */ + +#include +#include "static-routing.h" + +#define DEBUG 0 +#if DEBUG +#include +#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(inode_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); + } + } +} diff --git a/examples/osd/powerbox/static-routing.h b/examples/osd/powerbox/static-routing.h new file mode 100644 index 000000000..0dff0b7ba --- /dev/null +++ b/examples/osd/powerbox/static-routing.h @@ -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_ */ diff --git a/examples/osd/powerbox/todo b/examples/osd/powerbox/todo new file mode 100644 index 000000000..0a1f20ba2 --- /dev/null +++ b/examples/osd/powerbox/todo @@ -0,0 +1,3 @@ + +*) leds-sensor get +*) EmbedVM integration diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index cf862b1af..587f1f2ac 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -22,6 +22,8 @@ CONTIKIAVR=$(CONTIKI)/cpu/avr CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c #Needed for Timer4 Servo CONTIKI_TARGET_SOURCEFILES += t4-servo.c t4-servo-sensor.c +#Needed for Relay 1 to 4 +CONTIKI_TARGET_SOURCEFILES += relay.c relay-sensor.c CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 diff --git a/platform/osd-merkur/dev/relay-sensor.c b/platform/osd-merkur/dev/relay-sensor.c new file mode 100644 index 000000000..712e524ce --- /dev/null +++ b/platform/osd-merkur/dev/relay-sensor.c @@ -0,0 +1,134 @@ +/* +* Copyright (c) , 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: +* 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: relay-sensor.c,v 1.0 2013/11/22 19:34:06 nifi Exp $ +*/ + +/** +* \file +* relay sensor header file for Atmega128rfa1. +* \author +* Harald Pichler +*/ + +#include "contiki.h" +#include "dev/relay.h" +#include "dev/relay-sensor.h" + +#define PRINTF(...) printf(__VA_ARGS__) + +const struct sensors_sensor relay_sensor; +static int status(int type); +static int enabled = 0; +static int relay1=0; +static int relay2=0; +static int relay3=0; +static int relay4=0; + +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + switch(type) { + case RELAY_SENSOR_1: + return relay1; + case RELAY_SENSOR_2: + return relay2; + case RELAY_SENSOR_3: + return relay2; + case RELAY_SENSOR_4: + return relay2; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int c) +{ + switch(type) { + case SENSORS_ACTIVE: + if(c) { + if(!status(SENSORS_ACTIVE)) { + enabled = 1; + } + } else { + enabled = 1; + } + break; + case RELAY_SENSOR_1: + if(c==0){ + relay1_off(); + relay1=0; + }else{ + relay1_on(); + relay1=1; + }; + break; + case RELAY_SENSOR_2: + if(c==0){ + relay2_off(); + relay2=0; + }else{ + relay2_on(); + relay2=1; + }; + break; + case RELAY_SENSOR_3: + if(c==0){ + relay3_off(); + relay3=0; + }else{ + relay3_on(); + relay3=1; + }; + break; + case RELAY_SENSOR_4: + if(c==0){ + relay4_off(); + relay4=0; + }else{ + relay4_on(); + relay4=1; + }; + break; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static int +status(int type) +{ + switch(type) { + case SENSORS_ACTIVE: + case SENSORS_READY: + return enabled; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(relay_sensor, RELAY_SENSOR, value, configure, status); diff --git a/platform/osd-merkur/dev/relay-sensor.h b/platform/osd-merkur/dev/relay-sensor.h new file mode 100644 index 000000000..89b46a8f2 --- /dev/null +++ b/platform/osd-merkur/dev/relay-sensor.h @@ -0,0 +1,52 @@ +/* +* Copyright (c), 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: +* 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: relay-sensor.h,v 1.0 2013/11/22 19:34:06 nifi Exp $ +*/ + +/** +* \file +* Relay sensor header file for Atmega128rfa1. +* \author +* Harald Pichler +*/ + +#ifndef __RELAY_SENSOR_H__ +#define __RELAY_SENSOR_H__ + +#include "lib/sensors.h" + +extern const struct sensors_sensor relay_sensor; + +#define RELAY_SENSOR "RELAY" +#define RELAY_SENSOR_1 0 +#define RELAY_SENSOR_2 1 +#define RELAY_SENSOR_3 2 +#define RELAY_SENSOR_4 3 + +#endif /* __RELAY_SENSOR_H__ */ diff --git a/platform/osd-merkur/dev/relay.c b/platform/osd-merkur/dev/relay.c new file mode 100644 index 000000000..60490a68f --- /dev/null +++ b/platform/osd-merkur/dev/relay.c @@ -0,0 +1,136 @@ +/* + * 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 "relay.h" + +/** + * \addtogroup relay + * \{ +*/ +/*---------------------------------------------------------------------------*/ + +/** + * \brief Turns the RELAY1 on. +*/ +void +relay1_off(void) +{ + PORTB &= ~(1< + +/** @name RELAY Functions */ +/** @{ */ +void relay1_on(void); +void relay1_off(void); +void relay2_on(void); +void relay2_off(void); +void relay3_on(void); +void relay3_off(void); +void relay4_on(void); +void relay4_off(void); +/** @} */ + +#endif /* __RELAY_H__ */ From 337be76b26935b1c9049f2d4c64b20477eea7901 Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 28 Nov 2013 09:43:59 +0100 Subject: [PATCH 096/345] bugfix server client demo --- core/net/mac/contikimac/contikimac.c | 2 ++ platform/osd-merkur/contiki-conf.h | 6 ++--- platform/osd-merkur/contiki-main.c | 35 ++++++++++++++-------------- platform/osd-merkur/dev/led.c | 8 +++---- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/core/net/mac/contikimac/contikimac.c b/core/net/mac/contikimac/contikimac.c index 3c655314a..ba20efbb1 100644 --- a/core/net/mac/contikimac/contikimac.c +++ b/core/net/mac/contikimac/contikimac.c @@ -741,11 +741,13 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr, watchdog_periodic(); +#if WITH_PHASE_OPTIMIZATION if(!is_broadcast && (is_receiver_awake || is_known_receiver) && !RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + MAX_PHASE_STROBE_TIME)) { PRINTF("miss to %d\n", packetbuf_addr(PACKETBUF_ADDR_RECEIVER)->u8[0]); break; } +#endif /* WITH_PHASE_OPTIMIZATION */ len = 0; diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index 489cdaf61..2cafeac31 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -222,7 +222,7 @@ typedef unsigned short uip_stats_t; /* 25 bytes per UDP connection */ #define UIP_CONF_UDP_CONNS 10 /* See uip-ds6.h */ -#define UIP_CONF_DS6_NBR_NBU 20 +#define NBR_TABLE_CONF_MAX_NEIGHBORS 20 #define UIP_CONF_DS6_DEFRT_NBU 2 #define UIP_CONF_DS6_PREFIX_NBU 3 #define UIP_CONF_MAX_ROUTES 20 @@ -243,7 +243,7 @@ typedef unsigned short uip_stats_t; /* 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_WITH_PHASE_OPTIMIZATION 0 #define CONTIKIMAC_CONF_COMPOWER 1 #define RIMESTATS_CONF_ENABLED 1 #define NETSTACK_CONF_FRAMER framer_802154 @@ -266,7 +266,7 @@ typedef unsigned short uip_stats_t; #define UIP_CONF_MAX_CONNECTIONS 2 #define UIP_CONF_MAX_LISTENPORTS 4 #define UIP_CONF_UDP_CONNS 5 -#define UIP_CONF_DS6_NBR_NBU 20 +#define NBR_TABLE_CONF_MAX_NEIGHBORS 20 #define UIP_CONF_DS6_DEFRT_NBU 2 #define UIP_CONF_DS6_PREFIX_NBU 3 #define UIP_CONF_MAX_ROUTES 4 diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index 7fd111290..aa8772510 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -436,6 +436,9 @@ ipaddr_add(const uip_ipaddr_t *addr) int main(void) { +#if UIP_CONF_IPV6 + uip_ds6_nbr_t *nbr; +#endif /* UIP_CONF_IPV6 */ initialize(); while(1) { @@ -533,11 +536,9 @@ if ((clocktime%PINGS)==1) { #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; + uint8_t i,j=0; PRINTF("\nAddresses [%u max]\n",UIP_DS6_ADDR_NB); for (i=0;iipaddr); + PRINTF("\n"); + j=0; } + if (j) PRINTF(" "); PRINTF("\nRoutes [%u max]\n",UIP_DS6_ROUTE_NB); { uip_ds6_route_t *r; j = 1; - for(r = uip_ds6_route_list_head(); + for(r = uip_ds6_route_head(); r != NULL; - r = list_item_next(r)) { + r = uip_ds6_route_next(r)) { ipaddr_add(&r->ipaddr); PRINTF("/%u (via ", r->length); - ipaddr_add(&r->nexthop); - // if(uip_ds6_routing_table[i].state.lifetime < 600) { + ipaddr_add(uip_ds6_route_nexthop(r)); PRINTF(") %lus\n", r->state.lifetime); - // } else { - // PRINTF(")\n"); - // } j = 0; } } if (j) PRINTF(" "); PRINTF("\n---------\n"); + } #endif diff --git a/platform/osd-merkur/dev/led.c b/platform/osd-merkur/dev/led.c index 8f330e13a..0194ff1f6 100644 --- a/platform/osd-merkur/dev/led.c +++ b/platform/osd-merkur/dev/led.c @@ -52,8 +52,8 @@ void led1_on(void) { - DDRE |= (1< Date: Thu, 28 Nov 2013 10:19:17 +0100 Subject: [PATCH 097/345] update boarder router to new rpl tables --- examples/osd/rpl-border-router/Makefile | 3 +-- .../osd/rpl-border-router/border-router.c | 24 +++++++++---------- examples/osd/rpl-border-router/httpd-simple.h | 6 ++--- examples/osd/rpl-border-router/project-conf.h | 15 +++--------- platform/osd-merkur/params.h | 3 +-- 5 files changed, 20 insertions(+), 31 deletions(-) diff --git a/examples/osd/rpl-border-router/Makefile b/examples/osd/rpl-border-router/Makefile index 04007ff5b..f296b0bb3 100644 --- a/examples/osd/rpl-border-router/Makefile +++ b/examples/osd/rpl-border-router/Makefile @@ -3,9 +3,8 @@ all: $(CONTIKI_PROJECT) CONTIKI=../../.. -WITH_UIP6=1 UIP_CONF_IPV6=1 -CFLAGS+= -DUIP_CONF_IPV6_RPL -DUIP_CONF_IPV6 +CFLAGS+= -DUIP_CONF_IPV6_RPL #linker optimizations SMALL=1 diff --git a/examples/osd/rpl-border-router/border-router.c b/examples/osd/rpl-border-router/border-router.c index 9a40f84a1..4128cac38 100644 --- a/examples/osd/rpl-border-router/border-router.c +++ b/examples/osd/rpl-border-router/border-router.c @@ -56,8 +56,6 @@ uint16_t dag_id[] = {0x1111, 0x1100, 0, 0, 0, 0, 0, 0x0011}; -extern uip_ds6_nbr_t uip_ds6_nbr_cache[]; - static uip_ipaddr_t prefix; static uint8_t prefix_set; @@ -149,6 +147,7 @@ PT_THREAD(generate_routes(struct httpd_state *s)) { static int i; static uip_ds6_route_t *r; + static uip_ds6_nbr_t *nbr; #if BUF_USES_STACK char buf[256]; #endif @@ -166,15 +165,17 @@ PT_THREAD(generate_routes(struct httpd_state *s)) blen = 0; #endif ADD("Neighbors

");
-  for(i = 0; i < UIP_DS6_NBR_NB; i++) {
-    if(uip_ds6_nbr_cache[i].isused) {
+
+  for(nbr = nbr_table_head(ds6_neighbors);
+      nbr != NULL;
+      nbr = nbr_table_next(ds6_neighbors, nbr)) {
 
 #if WEBSERVER_CONF_NEIGHBOR_STATUS
 #if BUF_USES_STACK
 {char* j=bufptr+25;
-      ipaddr_add(&uip_ds6_nbr_cache[i].ipaddr);
+      ipaddr_add(&nbr->ipaddr);
       while (bufptr < j) ADD(" ");
-      switch (uip_ds6_nbr_cache[i].state) {
+      switch (nbr->state) {
       case NBR_INCOMPLETE: ADD(" INCOMPLETE");break;
       case NBR_REACHABLE: ADD(" REACHABLE");break;
       case NBR_STALE: ADD(" STALE");break;      
@@ -184,9 +185,9 @@ PT_THREAD(generate_routes(struct httpd_state *s))
 }
 #else
 {uint8_t j=blen+25;
-      ipaddr_add(&uip_ds6_nbr_cache[i].ipaddr);
+      ipaddr_add(&nbr->ipaddr);
       while (blen < j) ADD(" ");
-      switch (uip_ds6_nbr_cache[i].state) {
+      switch (nbr->state) {
       case NBR_INCOMPLETE: ADD(" INCOMPLETE");break;
       case NBR_REACHABLE: ADD(" REACHABLE");break;
       case NBR_STALE: ADD(" STALE");break;      
@@ -196,7 +197,7 @@ PT_THREAD(generate_routes(struct httpd_state *s))
 }
 #endif
 #else
-      ipaddr_add(&uip_ds6_nbr_cache[i].ipaddr);
+      ipaddr_add(&nbr->ipaddr);
 #endif
 
       ADD("\n");
@@ -211,7 +212,6 @@ PT_THREAD(generate_routes(struct httpd_state *s))
         blen = 0;
       }
 #endif
-    }
   }
   ADD("
Routes
");
   SEND_STRING(&s->sout, buf);
@@ -221,7 +221,7 @@ PT_THREAD(generate_routes(struct httpd_state *s))
   blen = 0;
 #endif
 
-  for(r = uip_ds6_route_list_head(); r != NULL; r = list_item_next(r)) {
+  for(r = uip_ds6_route_head(); r != NULL; r = uip_ds6_route_next(r)) {
 
 #if BUF_USES_STACK
 #if WEBSERVER_CONF_ROUTE_LINKS
@@ -247,7 +247,7 @@ PT_THREAD(generate_routes(struct httpd_state *s))
 #endif
 #endif
     ADD("/%u (via ", r->length);
-    ipaddr_add(&r->nexthop);
+    ipaddr_add(uip_ds6_route_nexthop(r));
     if(1 || (r->state.lifetime < 600)) {
       ADD(") %lus\n", r->state.lifetime);
     } else {
diff --git a/examples/osd/rpl-border-router/httpd-simple.h b/examples/osd/rpl-border-router/httpd-simple.h
index 4a2efa30f..a16dbd99e 100644
--- a/examples/osd/rpl-border-router/httpd-simple.h
+++ b/examples/osd/rpl-border-router/httpd-simple.h
@@ -37,8 +37,8 @@
  *         Joakim Eriksson 
  */
 
-#ifndef __HTTPD_SIMPLE_H__
-#define __HTTPD_SIMPLE_H__
+#ifndef HTTPD_SIMPLE_H_
+#define HTTPD_SIMPLE_H_
 
 #include "contiki-net.h"
 
@@ -71,4 +71,4 @@ 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__ */
+#endif /* HTTPD_SIMPLE_H_ */
diff --git a/examples/osd/rpl-border-router/project-conf.h b/examples/osd/rpl-border-router/project-conf.h
index 3cc05fe90..9d9116795 100644
--- a/examples/osd/rpl-border-router/project-conf.h
+++ b/examples/osd/rpl-border-router/project-conf.h
@@ -28,22 +28,13 @@
  *
  */
 
-#ifndef __PROJECT_ROUTER_CONF_H__
-#define __PROJECT_ROUTER_CONF_H__
+#ifndef PROJECT_ROUTER_CONF_H_
+#define PROJECT_ROUTER_CONF_H_
 
 #ifndef UIP_FALLBACK_INTERFACE
 #define UIP_FALLBACK_INTERFACE rpl_interface
 #endif
 
-/* Save some memory for the sky platform. */
-#undef UIP_CONF_DS6_NBR_NBU
-#define UIP_CONF_DS6_NBR_NBU     15
-#undef UIP_CONF_DS6_ROUTE_NBU
-#define UIP_CONF_DS6_ROUTE_NBU   50
-
-#undef UIP_CONF_TCP
-#define UIP_CONF_TCP              1
-
 #ifndef QUEUEBUF_CONF_NUM
 #define QUEUEBUF_CONF_NUM          4
 #endif
@@ -60,4 +51,4 @@
 #define WEBSERVER_CONF_CFS_CONNS 2
 #endif
 
-#endif /* __PROJECT_ROUTER_CONF_H__ */
+#endif /* PROJECT_ROUTER_CONF_H_ */
diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h
index f91ce5759..9bf2f433e 100644
--- a/platform/osd-merkur/params.h
+++ b/platform/osd-merkur/params.h
@@ -74,9 +74,8 @@ extern uint8_t eemem_domain_name[30];
 /* This form of of EUI64 mac allows full 6LoWPAN header compression from mac address */
 #if UIP_CONF_LL_802154
 //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN, 0xNN}
-//#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x01}
-#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x27, 0x0d}
 //#define PARAMS_EUI64ADDR {0x00, 0x21, 0x2e, 0xff, 0xff, 0x00, 0x1E, 0xFB}
+#define PARAMS_EUI64ADDR {0x02, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x01}
 #else
 //#define PARAMS_EUI64ADDR {0x02, 0xNN, 0xNN, 0xff, 0xfe, 0xNN, 0xNN, 0xNN}
 #define PARAMS_EUI64ADDR {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00, 0x00, 0x03}

From d3eb7da297d188ceddc6a6fb59fef20cf9d80a9e Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 28 Nov 2013 11:06:28 +0100
Subject: [PATCH 098/345] 20 neighbors with status and routes

---
 examples/osd/rpl-border-router/border-router.c | 2 +-
 examples/osd/rpl-border-router/project-conf.h  | 6 ++++++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/examples/osd/rpl-border-router/border-router.c b/examples/osd/rpl-border-router/border-router.c
index 4128cac38..3a13e61bb 100644
--- a/examples/osd/rpl-border-router/border-router.c
+++ b/examples/osd/rpl-border-router/border-router.c
@@ -79,7 +79,7 @@ AUTOSTART_PROCESSES(&border_router_process,&webserver_nogui_process);
  */
 #define WEBSERVER_CONF_LOADTIME 0
 #define WEBSERVER_CONF_FILESTATS 0
-#define WEBSERVER_CONF_NEIGHBOR_STATUS 0
+#define WEBSERVER_CONF_NEIGHBOR_STATUS 1
 /* Adding links requires a larger RAM buffer. To avoid static allocation
  * the stack can be used for formatting; however tcp retransmissions
  * and multiple connections can result in garbled segments.
diff --git a/examples/osd/rpl-border-router/project-conf.h b/examples/osd/rpl-border-router/project-conf.h
index 9d9116795..20c6652df 100644
--- a/examples/osd/rpl-border-router/project-conf.h
+++ b/examples/osd/rpl-border-router/project-conf.h
@@ -35,6 +35,12 @@
 #define UIP_FALLBACK_INTERFACE rpl_interface
 #endif
 
+/* Save some memory for the sky platform. */
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     20
+#undef UIP_CONF_MAX_ROUTES
+#define UIP_CONF_MAX_ROUTES      20
+
 #ifndef QUEUEBUF_CONF_NUM
 #define QUEUEBUF_CONF_NUM          4
 #endif

From 146429218879d02cc3c639b98fc484218d6a6ee2 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 28 Nov 2013 11:08:47 +0100
Subject: [PATCH 099/345] bugfix nbr name xmac

---
 platform/osd-merkur/contiki-conf.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h
index 2cafeac31..8764ddb97 100644
--- a/platform/osd-merkur/contiki-conf.h
+++ b/platform/osd-merkur/contiki-conf.h
@@ -301,7 +301,7 @@ typedef unsigned short uip_stats_t;
 #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 NBR_TABLE_CONF_MAX_NEIGHBORS      4
 #define UIP_CONF_DS6_DEFRT_NBU    2
 #define UIP_CONF_DS6_PREFIX_NBU   3
 #define UIP_CONF_MAX_ROUTES    4

From 3c0908f2daac0a427b1a7076dd4845cabcf48793 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 28 Nov 2013 13:40:22 +0100
Subject: [PATCH 100/345] cleanup code

---
 examples/osd/er-rest-example-merkurboard/Makefile    |  3 ---
 .../er-rest-example-merkurboard/er-example-client.c  |  2 +-
 .../er-rest-example-merkurboard/er-example-server.c  |  4 ----
 .../osd/er-rest-example-merkurboard/project-conf.h   | 12 ++++++------
 4 files changed, 7 insertions(+), 14 deletions(-)

diff --git a/examples/osd/er-rest-example-merkurboard/Makefile b/examples/osd/er-rest-example-merkurboard/Makefile
index 17792e430..60d971598 100644
--- a/examples/osd/er-rest-example-merkurboard/Makefile
+++ b/examples/osd/er-rest-example-merkurboard/Makefile
@@ -6,9 +6,6 @@ all: er-example-server er-example-client
 # configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
 WITH_COAP=13
 
-
-# variable for Makefile.include
-WITH_UIP6=1
 # for some platforms
 UIP_CONF_IPV6=1
 # IPv6 make config disappeared completely
diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.c b/examples/osd/er-rest-example-merkurboard/er-example-client.c
index 8a0e0d667..14b5a291a 100644
--- a/examples/osd/er-rest-example-merkurboard/er-example-client.c
+++ b/examples/osd/er-rest-example-merkurboard/er-example-client.c
@@ -73,7 +73,7 @@
 #endif
 
 /* TODO: This server address is hard-coded for Cooja. */
-#define SERVER_NODE(ipaddr)   uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x270d) /* cooja2 */
+#define SERVER_NODE(ipaddr)   uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x26e6) /* cooja2 */
 
 #define LOCAL_PORT      UIP_HTONS(COAP_DEFAULT_PORT+1)
 #define REMOTE_PORT     UIP_HTONS(COAP_DEFAULT_PORT)
diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.c b/examples/osd/er-rest-example-merkurboard/er-example-server.c
index 14c203b12..48b320f26 100644
--- a/examples/osd/er-rest-example-merkurboard/er-example-server.c
+++ b/examples/osd/er-rest-example-merkurboard/er-example-server.c
@@ -45,7 +45,6 @@
 
 /* Define which resources to include to meet memory constraints. */
 #define REST_RES_INFO 1
-#define REST_RES_DS1820 0
 #define REST_RES_HELLO 0
 #define REST_RES_MIRROR 0 /* causes largest code size */
 #define REST_RES_CHUNKS 1
@@ -790,9 +789,6 @@ hw_init()
 #if defined (PLATFORM_HAS_LEDS)
  leds_off(LEDS_RED);
 #endif
-#if REST_RES_DS1820
-  ds1820_temp();
-#endif
 }
 
 PROCESS(rest_server_example, "Erbium Example Server");
diff --git a/examples/osd/er-rest-example-merkurboard/project-conf.h b/examples/osd/er-rest-example-merkurboard/project-conf.h
index f02a4c5e3..d98699d4c 100644
--- a/examples/osd/er-rest-example-merkurboard/project-conf.h
+++ b/examples/osd/er-rest-example-merkurboard/project-conf.h
@@ -29,8 +29,8 @@
  *
  */
 
-#ifndef __PROJECT_ERBIUM_CONF_H__
-#define __PROJECT_ERBIUM_CONF_H__
+#ifndef PROJECT_ERBIUM_CONF_H_
+#define PROJECT_ERBIUM_CONF_H_
 
 #define PLATFORM_HAS_LEDS    1
 #define PLATFORM_HAS_BUTTON  1
@@ -58,7 +58,7 @@
 /* The IP buffer size must fit all other hops, in particular the border router. */
 
 #undef UIP_CONF_BUFFER_SIZE
-#define UIP_CONF_BUFFER_SIZE    1280
+#define UIP_CONF_BUFFER_SIZE    256
 
 
 /* Multiplies with chunk size, be aware of memory constraints. */
@@ -79,8 +79,8 @@
 
 /* Save some memory for the sky platform. */
 /*
-#undef UIP_CONF_DS6_NBR_NBU
-#define UIP_CONF_DS6_NBR_NBU     10
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
 #undef UIP_CONF_MAX_ROUTES
 #define UIP_CONF_MAX_ROUTES   10
 */
@@ -95,4 +95,4 @@
 #undef SICSLOWPAN_CONF_FRAG
 #define SICSLOWPAN_CONF_FRAG	1
 */
-#endif /* __PROJECT_ERBIUM_CONF_H__ */
+#endif /* PROJECT_ERBIUM_CONF_H_ */

From aac4fcc8e17cacbe4e70321998aabf09044f8e8f Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 28 Nov 2013 14:18:02 +0100
Subject: [PATCH 101/345] cleanup code

---
 examples/osd/climate/er-example-server.c | 392 +----------------------
 examples/osd/climate/project-conf.h      |  18 +-
 examples/osd/climate/static-routing.c    | 155 ---------
 examples/osd/climate/static-routing.h    |  20 --
 4 files changed, 14 insertions(+), 571 deletions(-)
 delete mode 100644 examples/osd/climate/static-routing.c
 delete mode 100644 examples/osd/climate/static-routing.h

diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c
index 7ece0598b..06a7c545e 100644
--- a/examples/osd/climate/er-example-server.c
+++ b/examples/osd/climate/er-example-server.c
@@ -47,26 +47,12 @@
 #define REST_RES_INFO 1
 #define REST_RES_DS1820 1
 #define REST_RES_DHT11 1
-#define REST_RES_TEMPERATURE 1
-#define REST_RES_CHUNKS 0
-#define REST_RES_SEPARATE 0
-#define REST_RES_PUSHING 0
-#define REST_RES_EVENT 0
-#define REST_RES_LEDS 0
+#define REST_RES_LEDS 1
 #define REST_RES_TOGGLE 0
 #define REST_RES_BATTERY 1
 
-
-#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"
 
-// todo OSD-Testboard move to platform/dev
-#include "dev/key.h"
-#include "dev/led.h"
 #if REST_RES_DS1820
 #include "dev/ds1820.h"
 #endif
@@ -141,7 +127,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 
   /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
        // jSON Format
-     index += sprintf(message + index,"{\n \"version\" : \"V0.4.1\",\n");
+     index += sprintf(message + index,"{\n \"version\" : \"V0.4.2\",\n");
      index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n");
      index += sprintf(message + index,"}\n");
 
@@ -153,74 +139,6 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 }
 #endif
 
-
-/*A simple actuator example, post variable mode, relay is activated or deactivated*/
-RESOURCE(led1, METHOD_GET | METHOD_PUT , "actors/led1",  "title=\"Led1\";rt=\"led\"");
-void
-led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  char mode[10];
-  static uint8_t led1 = 0;
-  static char name[17]="led1";
-  int success = 1;
-
-  char temp[100];
-  int index = 0;
-  size_t len = 0;
-
-  const char *pmode = NULL;
-  const char *pname = NULL;
-
-  switch(REST.get_method_type(request)){
-   case METHOD_GET:
-     // jSON Format
-     index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name);
-     if(led1 == 0)
-         index += sprintf(temp + index," \"mode\" : \"off\"\n");
-     if(led1 == 1)
-         index += sprintf(temp + index," \"mode\" : \"on\"\n");
-     index += sprintf(temp + index,"}\n");
-
-     len = strlen(temp);
-     memcpy(buffer, temp,len );
-
-     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-     REST.set_response_payload(response, buffer, len);
-     break;
-   case METHOD_POST:
-     success = 0;
-     break;
-   case METHOD_PUT:
-     if (success &&  (len=REST.get_post_variable(request, "mode", &pmode))) {
-       PRINTF("name %s\n", mode);
-       memcpy(mode, pmode,len);
-       mode[len]=0;
-       if (!strcmp(mode, "on")) {
-         led1_on();
-         led1 = 1;
-       } else if (!strcmp(mode, "off")) {
-         led1_off();
-         led1 = 0;
-       } else {
-         success = 0;
-       }
-    } else if (success &&  (len=REST.get_post_variable(request, "name", &pname))) {
-       PRINTF("name %s\n", name);
-       memcpy(name, pname,len);
-       name[len]=0;
-    } else {
-      success = 0;
-    }
-    break;
-  default:
-    success = 0;
-  }
-
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-
 #if REST_RES_DS1820
 /*A simple getter example. Returns the reading from ds1820 sensor*/
 RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\"");
@@ -309,245 +227,6 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred
 }
 #endif //REST_RES_DHT11
 
-/******************************************************************************/
-#if REST_RES_CHUNKS
-/*
- * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation
- * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer,
- * the byte offset where to continue is provided to the handler as int32_t pointer.
- * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached.
- * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.)
- */
-RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\"");
-
-#define CHUNKS_TOTAL    2050
-
-void
-chunks_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 = 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);
-
-  /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3
-/* Required to manually (=not by the engine) handle the response transaction. */
-#include "er-coap-07-separate.h"
-#include "er-coap-07-transactions.h"
-/*
- * CoAP-specific example for separate responses.
- * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process.
- * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests.
- * The resource handler must store all information that required to finalize the response later.
- */
-RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\"");
-
-/* 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[16];
-} 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)
-{
-  /*
-   * Example allows only one open separate response.
-   * For multiple, the application must manage the list of stores.
-   */
-  if (separate_active)
-  {
-    coap_separate_reject();
-  }
-  else
-  {
-    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. */
-
-    /*
-     * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2).
-     * Extend the store, if the application requires additional information from this handler.
-     * buffer is an example field for custom information.
-     */
-    snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo");
-  }
-}
-
-void
-separate_finalize_handler()
-{
-  if (separate_active)
-  {
-    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)) )
-    {
-      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);
-
-      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
-    {
-      /*
-       * Set timer for retry, send error message, ...
-       * The example simply waits for another button press.
-       */
-    }
-  } /* if (separate_active) */
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_PUSHING
-/*
- * Example for a periodic resource.
- * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler().
- * A default post_handler takes care of subscriptions by managing a list of subscribers to notify.
- */
-PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND);
-
-void
-pushing_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);
-
-  /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */
-  const char *msg = "It's periodic!";
-  REST.set_response_payload(response, msg, strlen(msg));
-
-  /* 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
-pushing_periodic_handler(resource_t *r)
-{
-  static uint16_t obs_counter = 0;
-  static char content[11];
-
-  ++obs_counter;
-
-  PRINTF("TICK %u for /%s\n", obs_counter, r->url);
-
-  /* Build notification. */
-  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 );
-  coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter));
-
-  /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r, obs_counter, notification);
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON)
-/*
- * Example for an event resource.
- * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler().
- * A default post_handler takes care of subscriptions and manages a list of subscribers to notify.
- */
-EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs");
-
-void
-event_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);
-  /* Usually, a CoAP server would response with the current resource representation. */
-  const char *msg = "It's eventful!";
-  REST.set_response_payload(response, (uint8_t *)msg, strlen(msg));
-
-  /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */
-}
-
-/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined.
- * It will be called by the REST manager process with the defined period. */
-void
-event_event_handler(resource_t *r)
-{
-  static uint16_t event_counter = 0;
-  static char content[12];
-
-  ++event_counter;
-
-  PRINTF("TICK %u for /%s\n", event_counter, r->url);
-
-  /* Build notification. */
-  coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
-  coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 );
-  coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter));
-
-  /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r, event_counter, notification);
-}
-#endif /* PLATFORM_HAS_BUTTON */
-
-
 /******************************************************************************/
 #if defined (PLATFORM_HAS_LEDS)
 /******************************************************************************/
@@ -612,42 +291,6 @@ toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
 #endif
 #endif /* PLATFORM_HAS_LEDS */
 
-
-/******************************************************************************/
-#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE)
-/* A simple getter example. Returns the reading from light sensor with a simple etag */
-RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\"");
-void
-temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  int temperature = temperature_sensor.value(0);
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature);
-
-    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
-    const char *msg = "Supporting content-types text/plain and application/json";
-    REST.set_response_payload(response, msg, strlen(msg));
-  }
-}
-#endif /* PLATFORM_HAS_TEMPERATURE */
-
 /******************************************************************************/
 #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY)
 /* A simple getter example. Returns the reading from light sensor with a simple etag */
@@ -686,14 +329,15 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr
 void 
 hw_init()
 {
-  led1_off();
+#if defined (PLATFORM_HAS_LEDS)
+ leds_off(LEDS_RED);
+#endif
 #if REST_RES_DS1820
   ds1820_temp();
 #endif
 #if REST_RES_DHT11
   //DHT_INIT();
   DHT_Read_Data(&dht11_temp, &dht11_hum);
-//  DHT_Read_Data(&dht11_temp, &dht11_hum);
 #endif
 }
 #define MESURE_INTERVAL		(20 * CLOCK_SECOND)
@@ -738,8 +382,6 @@ PROCESS_THREAD(rest_server_example, ev, data)
   rest_init_engine();
 
   /* Activate the application-specific resources. */
-  rest_activate_resource(&resource_led1);
-  /* Activate the application-specific resources. */
 #if REST_RES_DS1820
   rest_activate_resource(&resource_ds1820);
 #endif
@@ -749,22 +391,6 @@ PROCESS_THREAD(rest_server_example, ev, data)
 #if REST_RES_INFO
   rest_activate_resource(&resource_info);
 #endif
-#if REST_RES_CHUNKS
-  rest_activate_resource(&resource_chunks);
-#endif
-#if REST_RES_PUSHING
-  rest_activate_periodic_resource(&periodic_resource_pushing);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT
-  rest_activate_event_resource(&resource_event);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3
-  /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */
-  rest_activate_resource(&resource_separate);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3))
-  SENSORS_ACTIVATE(button_sensor);
-#endif
 #if defined (PLATFORM_HAS_LEDS)
 #if REST_RES_LEDS
   rest_activate_resource(&resource_leds);
@@ -789,14 +415,6 @@ PROCESS_THREAD(rest_server_example, ev, data)
 #if defined (PLATFORM_HAS_BUTTON)
     if (ev == sensors_event && data == &button_sensor) {
       PRINTF("BUTTON\n");
-#if REST_RES_EVENT
-      /* Call the event_handler for this application-specific event. */
-      event_event_handler(&resource_event);
-#endif
-#if REST_RES_SEPARATE && WITH_COAP>3
-      /* Also call the separate response example handler. */
-      separate_finalize_handler();
-#endif
     }
 #endif /* PLATFORM_HAS_BUTTON */
     if(etimer_expired(&ds_periodic_timer)) {
diff --git a/examples/osd/climate/project-conf.h b/examples/osd/climate/project-conf.h
index 53f695671..d503e1717 100644
--- a/examples/osd/climate/project-conf.h
+++ b/examples/osd/climate/project-conf.h
@@ -29,13 +29,13 @@
  *
  */
 
-#ifndef __PROJECT_ERBIUM_CONF_H__
-#define __PROJECT_ERBIUM_CONF_H__
+#ifndef PROJECT_ERBIUM_CONF_H_
+#define PROJECT_ERBIUM_CONF_H_
 
 #define PLATFORM_HAS_BATTERY 1
 #define PLATFORM_HAS_DS1820  1
 #define PLATFORM_HAS_DHT11   1
-
+#define PLATFORM_HAS_LEDS    1
 
 
 /* Some platforms have weird includes. */
@@ -59,7 +59,7 @@
 /* The IP buffer size must fit all other hops, in particular the border router. */
 
 #undef UIP_CONF_BUFFER_SIZE
-#define UIP_CONF_BUFFER_SIZE    1280
+#define UIP_CONF_BUFFER_SIZE    256
 
 
 /* Multiplies with chunk size, be aware of memory constraints. */
@@ -79,12 +79,12 @@
 */
 
 /* Save some memory for the sky platform. */
-
-#undef UIP_CONF_DS6_NBR_NBU
-#define UIP_CONF_DS6_NBR_NBU     10
+/*
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
 #undef UIP_CONF_MAX_ROUTES
 #define UIP_CONF_MAX_ROUTES   10
-
+*/
 
 /* Reduce 802.15.4 frame queue to save RAM. */
 /*
@@ -96,4 +96,4 @@
 #undef SICSLOWPAN_CONF_FRAG
 #define SICSLOWPAN_CONF_FRAG	1
 */
-#endif /* __PROJECT_ERBIUM_CONF_H__ */
+#endif /* PROJECT_ERBIUM_CONF_H_ */
diff --git a/examples/osd/climate/static-routing.c b/examples/osd/climate/static-routing.c
deleted file mode 100644
index 628594892..000000000
--- a/examples/osd/climate/static-routing.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * static-routing.c
- *
- *  Created on: Oct 12, 2010
- *      Author: simonduq
- */
-
-#include 
-#include "static-routing.h"
-
-#define DEBUG 0
-#if DEBUG
-#include 
-#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(inode_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);
-    }
-  }
-}
diff --git a/examples/osd/climate/static-routing.h b/examples/osd/climate/static-routing.h
deleted file mode 100644
index 0dff0b7ba..000000000
--- a/examples/osd/climate/static-routing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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_ */

From 1b56526fe0fd033288f97d0b60ae4f9cdbffc393 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 28 Nov 2013 14:20:38 +0100
Subject: [PATCH 102/345] delete old example

---
 .../Makefile                                  |   88 --
 .../er-rest-example-toggleboard-ds1820/README |   76 --
 .../er-example-client.c                       |  173 ---
 .../er-example-server.c                       | 1126 -----------------
 .../er-plugtest-server.c                      |  561 --------
 .../flash.sh                                  |    2 -
 .../project-conf.h                            |   67 -
 .../er-rest-example-toggleboard-ds1820/run.sh |    6 -
 .../server-client.csc                         |  227 ----
 .../server-only.csc                           |  189 ---
 .../static-routing.c                          |  155 ---
 .../static-routing.h                          |   20 -
 12 files changed, 2690 deletions(-)
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/Makefile
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/README
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c
 delete mode 100755 examples/osd/er-rest-example-toggleboard-ds1820/flash.sh
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h
 delete mode 100755 examples/osd/er-rest-example-toggleboard-ds1820/run.sh
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c
 delete mode 100644 examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h

diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/Makefile b/examples/osd/er-rest-example-toggleboard-ds1820/Makefile
deleted file mode 100644
index ea3722d59..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/Makefile
+++ /dev/null
@@ -1,88 +0,0 @@
-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
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/README b/examples/osd/er-rest-example-toggleboard-ds1820/README
deleted file mode 100644
index 84d7dd2f4..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/README
+++ /dev/null
@@ -1,76 +0,0 @@
-A Quick Introduction to the Erbium (Er) REST Engine
-===================================================
-Compile the Example
--------------------
-./run.sh
-
-OSD-Merkur Board
-----------------------
-write the images to the OSD-Merkur Board:
-
-./flash.sh
-
-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
-
-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)
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c
deleted file mode 100644
index d1d543cf0..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-client.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * 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 
- */
-
-#include 
-#include 
-#include 
-
-#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();
-}
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c
deleted file mode 100644
index e505f6165..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/er-example-server.c
+++ /dev/null
@@ -1,1126 +0,0 @@
-/*
- * 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) REST Engine example (with CoAP-specific code)
- * \author
- *      Matthias Kovatsch 
- */
-
-#include 
-#include 
-#include 
-#include "contiki.h"
-#include "contiki-net.h"
-
-
-/* Define which resources to include to meet memory constraints. */
-#define REST_RES_INFO 1
-#define REST_RES_DS1820 0
-#define REST_RES_HELLO 0
-#define REST_RES_MIRROR 0 /* causes largest code size */
-#define REST_RES_CHUNKS 0
-#define REST_RES_SEPARATE 0
-#define REST_RES_PUSHING 0
-#define REST_RES_EVENT 0
-#define REST_RES_SUB 0
-#define REST_RES_LEDS 0
-#define REST_RES_TOGGLE 0
-#define REST_RES_LIGHT 0
-#define REST_RES_BATTERY 0
-#define REST_RES_RADIO 0
-
-
-
-#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"
-
-// todo OSD-Testboard move to platform/dev
-#include "dev/key.h"
-#include "dev/led.h"
-#if REST_RES_DS1820
-#include "dev/ds1820.h"
-#endif
-
-#if defined (PLATFORM_HAS_BUTTON)
-#include "dev/button-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_LEDS)
-#include "dev/leds.h"
-#endif
-#if defined (PLATFORM_HAS_LIGHT)
-#include "dev/light-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_BATTERY)
-#include "dev/battery-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_SHT11)
-#include "dev/sht11-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_RADIO)
-#include "dev/radio-sensor.h"
-#endif
-
-
-/* For CoAP-specific example: not required for normal RESTful Web service. */
-#if WITH_COAP == 3
-#include "er-coap-03.h"
-#elif WITH_COAP == 7
-#include "er-coap-07.h"
-#else
-#warning "Erbium example without CoAP-specifc functionality"
-#endif /* CoAP-specific example */
-
-#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
-
-
-#include "dev/key.c"	// todo: move platform /dev 
-#include "dev/led.c"
-
-/******************************************************************************/
-
-#if REST_RES_INFO
-/*
- * Resources are defined by the RESOURCE macro.
- * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
- */
-RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"Text\"");
-
-/*
- * A handler function named [resource name]_handler must be implemented for each RESOURCE.
- * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
- * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
- * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
- */
-void
-info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  char message[100];
-  int index = 0;
-  int length = 0; /*           |<-------->| */
-
-  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
-       // jSON Format
-     index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n");
-     index += sprintf(message + index," \"name\" : \"Button,LED\"\n");
-     index += sprintf(message + index,"}\n");
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-  REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-  REST.set_response_payload(response, buffer, length);
-}
-#endif
-
-// mybutton
-/*A simple actuator example. read the key button status*/
-RESOURCE(button, METHOD_GET | METHOD_PUT , "button",  "title=\"Button\";rt=\"Text\"");
-void
-button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  static char bname[17]="button1";
-  int success = 1;
-
-  char temp[100];
-  int index = 0;
-  int length = 0; /*           |<-------->| */
-  const char *name = NULL;
-  size_t len = 0;
-
-  switch(REST.get_method_type(request)){
-   case METHOD_GET:
-     // jSON Format
-     index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname);
-     if(is_button())
-         index += sprintf(temp + index," \"state\" : \"on\"\n");
-     else
-         index += sprintf(temp + index," \"state\" : \"off\"\n");
-     index += sprintf(temp + index,"}\n");
-
-     length = strlen(temp);
-     memcpy(buffer, temp,length );
-
-     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-     REST.set_response_payload(response, buffer, length);
-
-     break;
-   case METHOD_PUT:
-
-     if (success &&  (len=REST.get_post_variable(request, "name", &name))) {
-       PRINTF("name %s\n", name);
-       memcpy(bname, name,len);
-       bname[len]=0;
-     } else {
-       success = 0;
-     }
-     break;
-  default:
-    success = 0;
-  }
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-
-/*A simple actuator example, post variable mode, relay is activated or deactivated*/
-RESOURCE(led1, METHOD_GET | METHOD_PUT , "led1",  "title=\"Led1\";rt=\"Text\"");
-void
-led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  char mode[10];
-  static uint8_t led1 = 0;
-  static char name[17]="led1";
-  int success = 1;
-
-  char temp[100];
-  int index = 0;
-  size_t len = 0;
-
-  const char *pmode = NULL;
-  const char *pname = NULL;
-
-  switch(REST.get_method_type(request)){
-   case METHOD_GET:
-     // jSON Format
-     index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name);
-     if(led1 == 0)
-         index += sprintf(temp + index," \"mode\" : \"off\"\n");
-     if(led1 == 1)
-         index += sprintf(temp + index," \"mode\" : \"on\"\n");
-     index += sprintf(temp + index,"}\n");
-
-     len = strlen(temp);
-     memcpy(buffer, temp,len );
-
-     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-     REST.set_response_payload(response, buffer, len);
-     break;
-   case METHOD_POST:
-     success = 0;
-     break;
-   case METHOD_PUT:
-     if (success &&  (len=REST.get_post_variable(request, "mode", &pmode))) {
-       PRINTF("name %s\n", mode);
-       memcpy(mode, pmode,len);
-       mode[len]=0;
-       if (!strcmp(mode, "on")) {
-         led1_on();
-         led1 = 1;
-       } else if (!strcmp(mode, "off")) {
-         led1_off();
-         led1 = 0;
-       } else {
-         success = 0;
-       }
-    } else if (success &&  (len=REST.get_post_variable(request, "name", &pname))) {
-       PRINTF("name %s\n", name);
-       memcpy(name, pname,len);
-       name[len]=0;
-    } else {
-      success = 0;
-    }
-    break;
-  default:
-    success = 0;
-  }
-
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-
-#if REST_RES_DS1820
-/*A simple getter example. Returns the reading from ds1820 sensor*/
-RESOURCE(ds1820, METHOD_GET, "DS1820", "title=\"Temperatur\";rt=\"Temperatur\"");
-void
-ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-
-  char message[100];
-  int length = 0; /*           |<-------->| */
-  int ret=0;
-  int grad=0;
-  int kgrad=0;
-//  ret=ds1820_temp();
-  if(ds1820_ok[0] & 0x01){
-	kgrad=5;
-  }
-  grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1;
-
-  uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d °C",grad,kgrad);
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-    REST.set_response_payload(response, buffer, length);
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d °C\"}",grad,kgrad);
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-    REST.set_response_payload(response, buffer, length);
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56);
-  }
-}
-#endif //REST_RES_DS1820
-
-#if REST_RES_HELLO
-/*
- * Resources are defined by the RESOURCE macro.
- * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
- */
-RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\"");
-
-/*
- * A handler function named [resource name]_handler must be implemented for each RESOURCE.
- * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
- * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
- * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
- */
-void
-helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  const char *len = NULL;
-  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
-  char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy";
-  int length = 12; /*           |<-------->| */
-
-  /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */
-  if (REST.get_query_variable(request, "len", &len)) {
-    length = atoi(len);
-    if (length<0) length = 0;
-    if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE;
-    memcpy(buffer, message, length);
-  } else {
-    memcpy(buffer, message, length);
-  }
-
-  REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */
-  REST.set_header_etag(response, (uint8_t *) &length, 1);
-  REST.set_response_payload(response, buffer, length);
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_MIRROR
-/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */
-RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\"");
-
-void
-mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  /* The ETag and Token is copied to the header. */
-  uint8_t opaque[] = {0x0A, 0xBC, 0xDE};
-
-  /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */
-  static char location[] = {'/','f','/','a','?','k','&','e', 0};
-
-  /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */
-  unsigned int content_type = REST.get_header_content_type(request);
-
-  /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */
-  uint32_t max_age = 0;
-  const char *str = NULL;
-  uint32_t observe = 0;
-  const uint8_t *bytes = NULL;
-  uint32_t block_num = 0;
-  uint8_t block_more = 0;
-  uint16_t block_size = 0;
-  const char *query = "";
-  int len = 0;
-
-  /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */
-
-  int strpos = 0;
-  /* snprintf() counts the terminating '\0' to the size parameter.
-   * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework.
-   * Add +1 to fill the complete buffer. */
-  strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type);
-
-  /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request.
-   * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */
-  if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age);
-  }
-
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str);
-  }
-
-/* CoAP-specific example: actions not required for normal RESTful Web service. */
-#if WITH_COAP > 1
-  if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe);
-  }
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x");
-    int index = 0;
-    for (index = 0; index 03 */
-#endif /* CoAP-specific example */
-
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query);
-  }
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes);
-  }
-
-  if (strpos >= REST_MAX_CHUNK_SIZE)
-  {
-      buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */
-  }
-
-  REST.set_response_payload(response, buffer, strpos);
-
-  PRINTF("/mirror options received: %s\n", buffer);
-
-  /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */
-  REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-  REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */
-  REST.set_header_etag(response, opaque, 2);
-  REST.set_header_location(response, location); /* Initial slash is omitted by framework */
-
-/* CoAP-specific example: actions not required for normal RESTful Web service. */
-#if WITH_COAP > 1
-  coap_set_header_uri_host(response, "tiki");
-  coap_set_header_observe(response, 10);
-#if WITH_COAP == 3
-  coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */
-#else
-  coap_set_header_proxy_uri(response, "ftp://x");
-  coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */
-  coap_set_header_block1(response, 23, 0, 16);
-  coap_set_header_accept(response, TEXT_PLAIN);
-  coap_set_header_if_none_match(response);
-#endif /* CoAP > 03 */
-#endif /* CoAP-specific example */
-}
-#endif /* REST_RES_MIRROR */
-
-/******************************************************************************/
-#if REST_RES_CHUNKS
-/*
- * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation
- * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer,
- * the byte offset where to continue is provided to the handler as int32_t pointer.
- * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached.
- * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.)
- */
-RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\"");
-
-#define CHUNKS_TOTAL    2050
-
-void
-chunks_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 = 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);
-
-  /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3
-/* Required to manually (=not by the engine) handle the response transaction. */
-#include "er-coap-07-separate.h"
-#include "er-coap-07-transactions.h"
-/*
- * CoAP-specific example for separate responses.
- * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process.
- * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests.
- * The resource handler must store all information that required to finalize the response later.
- */
-RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\"");
-
-/* 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[16];
-} 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)
-{
-  /*
-   * Example allows only one open separate response.
-   * For multiple, the application must manage the list of stores.
-   */
-  if (separate_active)
-  {
-    coap_separate_reject();
-  }
-  else
-  {
-    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. */
-
-    /*
-     * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2).
-     * Extend the store, if the application requires additional information from this handler.
-     * buffer is an example field for custom information.
-     */
-    snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo");
-  }
-}
-
-void
-separate_finalize_handler()
-{
-  if (separate_active)
-  {
-    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)) )
-    {
-      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);
-
-      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
-    {
-      /*
-       * Set timer for retry, send error message, ...
-       * The example simply waits for another button press.
-       */
-    }
-  } /* if (separate_active) */
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_PUSHING
-/*
- * Example for a periodic resource.
- * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler().
- * A default post_handler takes care of subscriptions by managing a list of subscribers to notify.
- */
-PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND);
-
-void
-pushing_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);
-
-  /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */
-  const char *msg = "It's periodic!";
-  REST.set_response_payload(response, msg, strlen(msg));
-
-  /* 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
-pushing_periodic_handler(resource_t *r)
-{
-  static uint16_t obs_counter = 0;
-  static char content[11];
-
-  ++obs_counter;
-
-  PRINTF("TICK %u for /%s\n", obs_counter, r->url);
-
-  /* Build notification. */
-  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 );
-  coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter));
-
-  /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r, obs_counter, notification);
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON)
-/*
- * Example for an event resource.
- * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler().
- * A default post_handler takes care of subscriptions and manages a list of subscribers to notify.
- */
-EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs");
-
-void
-event_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);
-  /* Usually, a CoAP server would response with the current resource representation. */
-  const char *msg = "It's eventful!";
-  REST.set_response_payload(response, (uint8_t *)msg, strlen(msg));
-
-  /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */
-}
-
-/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined.
- * It will be called by the REST manager process with the defined period. */
-void
-event_event_handler(resource_t *r)
-{
-  static uint16_t event_counter = 0;
-  static char content[12];
-
-  ++event_counter;
-
-  PRINTF("TICK %u for /%s\n", event_counter, r->url);
-
-  /* Build notification. */
-  coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
-  coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 );
-  coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter));
-
-  /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r, event_counter, notification);
-}
-#endif /* PLATFORM_HAS_BUTTON */
-
-/******************************************************************************/
-#if REST_RES_SUB
-/*
- * Example for a resource that also handles all its sub-resources.
- * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path.
- */
-RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\"");
-
-void
-sub_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);
-
-  const char *uri_path = NULL;
-  int len = REST.get_url(request, &uri_path);
-  int base_len = strlen(resource_sub.url);
-
-  if (len==base_len)
-  {
-	snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url);
-  }
-  else
-  {
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len);
-  }
-
-  REST.set_response_payload(response, buffer, strlen((char *)buffer));
-}
-#endif
-
-/******************************************************************************/
-#if defined (PLATFORM_HAS_LEDS)
-/******************************************************************************/
-#if REST_RES_LEDS
-/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/
-RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\"");
-
-void
-leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  size_t len = 0;
-  const char *color = NULL;
-  const char *mode = NULL;
-  uint8_t led = 0;
-  int success = 1;
-
-  if ((len=REST.get_query_variable(request, "color", &color))) {
-    PRINTF("color %.*s\n", len, color);
-
-    if (strncmp(color, "r", len)==0) {
-      led = LEDS_RED;
-    } else if(strncmp(color,"g", len)==0) {
-      led = LEDS_GREEN;
-    } else if (strncmp(color,"b", len)==0) {
-      led = LEDS_BLUE;
-    } else {
-      success = 0;
-    }
-  } else {
-    success = 0;
-  }
-
-  if (success && (len=REST.get_post_variable(request, "mode", &mode))) {
-    PRINTF("mode %s\n", mode);
-
-    if (strncmp(mode, "on", len)==0) {
-      leds_on(led);
-    } else if (strncmp(mode, "off", len)==0) {
-      leds_off(led);
-    } else {
-      success = 0;
-    }
-  } else {
-    success = 0;
-  }
-
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_TOGGLE
-/* A simple actuator example. Toggles the red led */
-RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\"");
-void
-toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  leds_toggle(LEDS_RED);
-}
-#endif
-#endif /* PLATFORM_HAS_LEDS */
-
-/******************************************************************************/
-#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT)
-/* A simple getter example. Returns the reading from light sensor with a simple etag */
-RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\"");
-void
-light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC);
-  uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR);
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar);
-
-    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_XML))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_XML);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    const char *msg = "Supporting content-types text/plain, application/xml, and application/json";
-    REST.set_response_payload(response, msg, strlen(msg));
-  }
-}
-#endif /* PLATFORM_HAS_LIGHT */
-
-/******************************************************************************/
-#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY)
-/* A simple getter example. Returns the reading from light sensor with a simple etag */
-RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"Battery\"");
-void
-battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  int battery = battery_sensor.value(0);
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery);
-
-    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    const char *msg = "Supporting content-types text/plain and application/json";
-    REST.set_response_payload(response, msg, strlen(msg));
-  }
-}
-#endif /* PLATFORM_HAS_BATTERY */
-
-
-#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO
-/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */
-RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\"");
-
-void
-radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  size_t len = 0;
-  const char *p = NULL;
-  uint8_t param = 0;
-  int success = 1;
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((len=REST.get_query_variable(request, "p", &p))) {
-    PRINTF("p %.*s\n", len, p);
-    if (strncmp(p, "lqi", len)==0) {
-      param = RADIO_SENSOR_LAST_VALUE;
-    } else if(strncmp(p,"rssi", len)==0) {
-      param = RADIO_SENSOR_LAST_PACKET;
-    } else {
-      success = 0;
-    }
-  } else {
-    success = 0;
-  }
-
-  if (success) {
-    if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-    {
-      REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-      snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param));
-
-      REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-    }
-    else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-    {
-      REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-
-      if (param == RADIO_SENSOR_LAST_VALUE) {
-        snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param));
-      } else if (param == RADIO_SENSOR_LAST_PACKET) {
-        snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param));
-      }
-
-      REST.set_response_payload(response, buffer, strlen((char *)buffer));
-    }
-    else
-    {
-      REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-      const char *msg = "Supporting content-types text/plain and application/json";
-      REST.set_response_payload(response, msg, strlen(msg));
-    }
-  } else {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-#endif
-
-void 
-hw_init()
-{
-  key_init();
-  led1_off();
-#if REST_RES_DS1820
-  ds1820_temp();
-#endif
-}
-#define MESURE_INTERVAL		(10 * CLOCK_SECOND)
-#define READ_TIME		( 2 * CLOCK_SECOND)
-
-PROCESS(rest_server_example, "Erbium Example Server");
-AUTOSTART_PROCESSES(&rest_server_example);
-
-PROCESS_THREAD(rest_server_example, ev, data)
-{
-#if REST_RES_DS1820
-  static struct etimer ds_periodic_timer;
-  static struct etimer ds_read_timer;
-#endif
-
-  PROCESS_BEGIN();
-
-
-
-  PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE)
-  set_global_address();
-  configure_routing();
-#endif
-
-  /* Initialize the OSD Hardware. */
-  hw_init();
-
-  /* Initialize the REST engine. */
-  rest_init_engine();
-
-  /* Activate the application-specific resources. */
-  rest_activate_resource(&resource_button);
-  rest_activate_resource(&resource_led1);
-  /* Activate the application-specific resources. */
-#if REST_RES_DS1820
-  rest_activate_resource(&resource_ds1820);
-#endif
-#if REST_RES_INFO
-  rest_activate_resource(&resource_info);
-#endif
-#if REST_RES_HELLO
-  rest_activate_resource(&resource_helloworld);
-#endif
-#if REST_RES_MIRROR
-  rest_activate_resource(&resource_mirror);
-#endif
-#if REST_RES_CHUNKS
-  rest_activate_resource(&resource_chunks);
-#endif
-#if REST_RES_PUSHING
-  rest_activate_periodic_resource(&periodic_resource_pushing);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT
-  rest_activate_event_resource(&resource_event);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3
-  /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */
-  rest_activate_resource(&resource_separate);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3))
-  SENSORS_ACTIVATE(button_sensor);
-#endif
-#if REST_RES_SUB
-  rest_activate_resource(&resource_sub);
-#endif
-#if defined (PLATFORM_HAS_LEDS)
-#if REST_RES_LEDS
-  rest_activate_resource(&resource_leds);
-#endif
-#if REST_RES_TOGGLE
-  rest_activate_resource(&resource_toggle);
-#endif
-#endif /* PLATFORM_HAS_LEDS */
-#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT
-  SENSORS_ACTIVATE(light_sensor);
-  rest_activate_resource(&resource_light);
-#endif
-#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY
-  SENSORS_ACTIVATE(battery_sensor);
-  rest_activate_resource(&resource_battery);
-#endif
-#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO
-  SENSORS_ACTIVATE(radio_sensor);
-  rest_activate_resource(&resource_radio);
-#endif
-
-  /* Define application-specific events here. */
-#if REST_RES_DS1820
-  etimer_set(&ds_periodic_timer, MESURE_INTERVAL);
-#endif
-  while(1) {
-    PROCESS_WAIT_EVENT();
-#if defined (PLATFORM_HAS_BUTTON)
-    if (ev == sensors_event && data == &button_sensor) {
-      PRINTF("BUTTON\n");
-#if REST_RES_EVENT
-      /* Call the event_handler for this application-specific event. */
-      event_event_handler(&resource_event);
-#endif
-#if REST_RES_SEPARATE && WITH_COAP>3
-      /* Also call the separate response example handler. */
-      separate_finalize_handler();
-#endif
-    }
-#endif /* PLATFORM_HAS_BUTTON */
-#if REST_RES_DS1820
-    if(etimer_expired(&ds_periodic_timer)) {
-        PRINTF("DS1820_Periodic\n");
-        etimer_reset(&ds_periodic_timer);
-        if(ds1820_convert()){
-          etimer_set(&ds_read_timer, READ_TIME);
-        }
-    }
-    if(etimer_expired(&ds_read_timer)) {
-        PRINTF("DS1820_Read\n");
-        ds1820_read();
-    }
-#endif
-  } /* while (1) */
-
-  PROCESS_END();
-}
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c b/examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c
deleted file mode 100644
index 051b44be0..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/er-plugtest-server.c
+++ /dev/null
@@ -1,561 +0,0 @@
-/*
- * 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 
- */
-
-#include 
-#include 
-#include 
-#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 = 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();
-}
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/flash.sh b/examples/osd/er-rest-example-toggleboard-ds1820/flash.sh
deleted file mode 100755
index e92d472f6..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/flash.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h b/examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h
deleted file mode 100644
index 1c3dd8933..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/project-conf.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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__ */
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/run.sh b/examples/osd/er-rest-example-toggleboard-ds1820/run.sh
deleted file mode 100755
index 4f21e9b63..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/run.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-make clean TARGET=osd-merkur
-make TARGET=osd-merkur
-avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur
-avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex
-avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc b/examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc
deleted file mode 100644
index 8c45fdf02..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/server-client.csc
+++ /dev/null
@@ -1,227 +0,0 @@
-
-
-  [CONTIKI_DIR]/tools/cooja/apps/mrm
-  [CONTIKI_DIR]/tools/cooja/apps/mspsim
-  [CONTIKI_DIR]/tools/cooja/apps/avrora
-  [CONTIKI_DIR]/tools/cooja/apps/serial_socket
-  [CONTIKI_DIR]/tools/cooja/apps/collect-view
-  
-    REST with RPL router
-    -2147483648
-    123456
-    1000000
-    
-      se.sics.cooja.radiomediums.UDGM
-      50.0
-      50.0
-      1.0
-      1.0
-    
-    
-      40000
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      rplroot
-      Sky RPL Root
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
-      make border-router.sky TARGET=sky
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      server
-      Erbium Server
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
-      make er-example-server.sky TARGET=sky
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      client
-      Erbium Client
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c
-      make er-example-client.sky TARGET=sky
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        33.260163187353555
-        30.643217359962595
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        1
-      
-      rplroot
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        46.57186415376375
-        40.35946215910942
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        2
-      
-      server
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        18.638049428485125
-        47.55034515769599
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        3
-      
-      client
-    
-  
-  
-    se.sics.cooja.plugins.SimControl
-    259
-    0
-    179
-    0
-    0
-  
-  
-    se.sics.cooja.plugins.Visualizer
-    
-      se.sics.cooja.plugins.skins.IDVisualizerSkin
-      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
-      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
-      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
-      se.sics.cooja.plugins.skins.LEDVisualizerSkin
-      se.sics.cooja.plugins.skins.AddressVisualizerSkin
-      3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351
-    
-    300
-    2
-    178
-    261
-    1
-  
-  
-    se.sics.cooja.plugins.LogListener
-    
-      
-      
-    
-    762
-    3
-    491
-    2
-    182
-  
-  
-    se.sics.cooja.plugins.RadioLogger
-    
-      150
-      
-    
-    451
-    -1
-    305
-    73
-    140
-    true
-  
-  
-    SerialSocketServer
-    0
-    422
-    4
-    74
-    578
-    18
-  
-  
-    se.sics.cooja.plugins.TimeLine
-    
-      0
-      1
-      2
-      
-      
-      
-      
-      125
-      25.49079397896416
-    
-    1624
-    5
-    252
-    6
-    712
-  
-  
-    se.sics.cooja.plugins.MoteInterfaceViewer
-    2
-    
-      Serial port
-      0,0
-    
-    853
-    1
-    491
-    765
-    182
-  
-
-
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc b/examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc
deleted file mode 100644
index d5eee34d6..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/server-only.csc
+++ /dev/null
@@ -1,189 +0,0 @@
-
-
-  [CONTIKI_DIR]/tools/cooja/apps/mrm
-  [CONTIKI_DIR]/tools/cooja/apps/mspsim
-  [CONTIKI_DIR]/tools/cooja/apps/avrora
-  [CONTIKI_DIR]/tools/cooja/apps/serial_socket
-  [CONTIKI_DIR]/tools/cooja/apps/collect-view
-  
-    REST with RPL router
-    -2147483648
-    123456
-    1000000
-    
-      se.sics.cooja.radiomediums.UDGM
-      50.0
-      50.0
-      1.0
-      1.0
-    
-    
-      40000
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      rplroot
-      Sky RPL Root
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
-      make border-router.sky TARGET=sky
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      server
-      Erbium Server
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
-      make er-example-server.sky TARGET=sky
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        33.260163187353555
-        30.643217359962595
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        1
-      
-      rplroot
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        35.100895239785295
-        39.70574552287428
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        2
-      
-      server
-    
-  
-  
-    se.sics.cooja.plugins.SimControl
-    259
-    5
-    179
-    0
-    0
-  
-  
-    se.sics.cooja.plugins.Visualizer
-    
-      se.sics.cooja.plugins.skins.IDVisualizerSkin
-      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
-      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
-      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
-      se.sics.cooja.plugins.skins.LEDVisualizerSkin
-      se.sics.cooja.plugins.skins.AddressVisualizerSkin
-      7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535
-    
-    300
-    4
-    175
-    263
-    3
-  
-  
-    se.sics.cooja.plugins.LogListener
-    
-      
-      
-    
-    560
-    1
-    326
-    1
-    293
-  
-  
-    se.sics.cooja.plugins.RadioLogger
-    
-      150
-      
-    
-    451
-    -1
-    305
-    73
-    140
-    true
-  
-  
-    SerialSocketServer
-    0
-    422
-    2
-    74
-    39
-    199
-  
-  
-    se.sics.cooja.plugins.TimeLine
-    
-      0
-      1
-      
-      
-      
-      
-      125
-      25.49079397896416
-    
-    1624
-    3
-    252
-    4
-    622
-  
-  
-    se.sics.cooja.plugins.MoteInterfaceViewer
-    1
-    
-      Serial port
-      0,0
-    
-    702
-    0
-    646
-    564
-    2
-  
-
-
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c b/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c
deleted file mode 100644
index 628594892..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * static-routing.c
- *
- *  Created on: Oct 12, 2010
- *      Author: simonduq
- */
-
-#include 
-#include "static-routing.h"
-
-#define DEBUG 0
-#if DEBUG
-#include 
-#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(inode_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);
-    }
-  }
-}
diff --git a/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h b/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h
deleted file mode 100644
index 0dff0b7ba..000000000
--- a/examples/osd/er-rest-example-toggleboard-ds1820/static-routing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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_ */

From 4f0555790531e865f9c5a7277d992e58adc4fe8c Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 28 Nov 2013 14:38:45 +0100
Subject: [PATCH 103/345] remove old project use climate instead

---
 examples/osd/er-rest-example-dht11/Makefile   |   88 --
 examples/osd/er-rest-example-dht11/README     |   76 -
 .../er-rest-example-dht11/er-example-server.c | 1225 -----------------
 examples/osd/er-rest-example-dht11/flash.sh   |    2 -
 .../osd/er-rest-example-dht11/project-conf.h  |   74 -
 examples/osd/er-rest-example-dht11/run.sh     |    6 -
 .../er-rest-example-dht11/server-client.csc   |  227 ---
 .../osd/er-rest-example-dht11/server-only.csc |  189 ---
 .../er-rest-example-dht11/static-routing.c    |  155 ---
 .../er-rest-example-dht11/static-routing.h    |   20 -
 10 files changed, 2062 deletions(-)
 delete mode 100644 examples/osd/er-rest-example-dht11/Makefile
 delete mode 100644 examples/osd/er-rest-example-dht11/README
 delete mode 100644 examples/osd/er-rest-example-dht11/er-example-server.c
 delete mode 100755 examples/osd/er-rest-example-dht11/flash.sh
 delete mode 100644 examples/osd/er-rest-example-dht11/project-conf.h
 delete mode 100755 examples/osd/er-rest-example-dht11/run.sh
 delete mode 100644 examples/osd/er-rest-example-dht11/server-client.csc
 delete mode 100644 examples/osd/er-rest-example-dht11/server-only.csc
 delete mode 100644 examples/osd/er-rest-example-dht11/static-routing.c
 delete mode 100644 examples/osd/er-rest-example-dht11/static-routing.h

diff --git a/examples/osd/er-rest-example-dht11/Makefile b/examples/osd/er-rest-example-dht11/Makefile
deleted file mode 100644
index ea3722d59..000000000
--- a/examples/osd/er-rest-example-dht11/Makefile
+++ /dev/null
@@ -1,88 +0,0 @@
-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
diff --git a/examples/osd/er-rest-example-dht11/README b/examples/osd/er-rest-example-dht11/README
deleted file mode 100644
index 84d7dd2f4..000000000
--- a/examples/osd/er-rest-example-dht11/README
+++ /dev/null
@@ -1,76 +0,0 @@
-A Quick Introduction to the Erbium (Er) REST Engine
-===================================================
-Compile the Example
--------------------
-./run.sh
-
-OSD-Merkur Board
-----------------------
-write the images to the OSD-Merkur Board:
-
-./flash.sh
-
-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
-
-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)
diff --git a/examples/osd/er-rest-example-dht11/er-example-server.c b/examples/osd/er-rest-example-dht11/er-example-server.c
deleted file mode 100644
index b6fb39451..000000000
--- a/examples/osd/er-rest-example-dht11/er-example-server.c
+++ /dev/null
@@ -1,1225 +0,0 @@
-/*
- * 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) REST Engine example (with CoAP-specific code)
- * \author
- *      Matthias Kovatsch 
- */
-
-#include 
-#include 
-#include 
-#include "contiki.h"
-#include "contiki-net.h"
-
-
-/* Define which resources to include to meet memory constraints. */
-#define REST_RES_INFO 1
-#define REST_RES_DS1820 1
-#define REST_RES_DHT11 1
-#define REST_RES_TEMPERATURE 1
-#define REST_RES_HELLO 0
-#define REST_RES_MIRROR 0 /* causes largest code size */
-#define REST_RES_CHUNKS 0
-#define REST_RES_SEPARATE 0
-#define REST_RES_PUSHING 0
-#define REST_RES_EVENT 0
-#define REST_RES_SUB 0
-#define REST_RES_LEDS 0
-#define REST_RES_TOGGLE 0
-#define REST_RES_LIGHT 0
-#define REST_RES_BATTERY 1
-#define REST_RES_RADIO 0
-
-
-
-#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"
-
-// todo OSD-Testboard move to platform/dev
-#include "dev/key.h"
-#include "dev/led.h"
-#if REST_RES_DS1820
-#include "dev/ds1820.h"
-#endif
-#if REST_RES_DHT11
-#include "dev/dht11.h"
-uint8_t dht11_temp=0, dht11_hum=0;
-#endif
-
-#if defined (PLATFORM_HAS_BUTTON)
-#include "dev/button-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_LEDS)
-#include "dev/leds.h"
-#endif
-#if defined (PLATFORM_HAS_LIGHT)
-#include "dev/light-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_TEMPERATURE)
-#include "dev/temperature-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_BATTERY)
-#include "dev/battery-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_SHT11)
-#include "dev/sht11-sensor.h"
-#endif
-#if defined (PLATFORM_HAS_RADIO)
-#include "dev/radio-sensor.h"
-#endif
-
-
-/* For CoAP-specific example: not required for normal RESTful Web service. */
-#if WITH_COAP == 3
-#include "er-coap-03.h"
-#elif WITH_COAP == 7
-#include "er-coap-07.h"
-#else
-#warning "Erbium example without CoAP-specifc functionality"
-#endif /* CoAP-specific example */
-
-#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
-
-
-#include "dev/key.c"	// todo: move platform /dev 
-#include "dev/led.c"
-
-/******************************************************************************/
-
-#if REST_RES_INFO
-/*
- * Resources are defined by the RESOURCE macro.
- * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
- */
-RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\"");
-
-/*
- * A handler function named [resource name]_handler must be implemented for each RESOURCE.
- * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
- * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
- * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
- */
-void
-info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  char message[100];
-  int index = 0;
-  int length = 0; /*           |<-------->| */
-
-  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
-       // jSON Format
-     index += sprintf(message + index,"{\n \"version\" : \"V0.3\",\n");
-     index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n");
-     index += sprintf(message + index,"}\n");
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-  REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-  REST.set_response_payload(response, buffer, length);
-}
-#endif
-
-// mybutton
-/*A simple actuator example. read the key button status*/
-//RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button",  "title=\"Button\";rt=\"button\"");
-RESOURCE(button, METHOD_GET | METHOD_PUT , "sensors/button",  "title=\"Button\";rt=\"button\"");
-void
-button_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  static char bname[17]="button1";
-  int success = 1;
-
-  char temp[100];
-  int index = 0;
-  int length = 0; /*           |<-------->| */
-  const char *name = NULL;
-  size_t len = 0;
-
-  switch(REST.get_method_type(request)){
-   case METHOD_GET:
-     // jSON Format
-     index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",bname);
-     if(is_button())
-         index += sprintf(temp + index," \"state\" : \"on\"\n");
-     else
-         index += sprintf(temp + index," \"state\" : \"off\"\n");
-     index += sprintf(temp + index,"}\n");
-
-     length = strlen(temp);
-     memcpy(buffer, temp,length );
-
-     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-     REST.set_response_payload(response, buffer, length);
-
-     break;
-   case METHOD_PUT:
-
-     if (success &&  (len=REST.get_post_variable(request, "name", &name))) {
-       PRINTF("name %s\n", name);
-       memcpy(bname, name,len);
-       bname[len]=0;
-     } else {
-       success = 0;
-     }
-     break;
-  default:
-    success = 0;
-  }
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-
-/*A simple actuator example, post variable mode, relay is activated or deactivated*/
-RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1",  "title=\"Led1\";rt=\"led\"");
-void
-led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  char mode[10];
-  static uint8_t led1 = 0;
-  static char name[17]="led1";
-  int success = 1;
-
-  char temp[100];
-  int index = 0;
-  size_t len = 0;
-
-  const char *pmode = NULL;
-  const char *pname = NULL;
-
-  switch(REST.get_method_type(request)){
-   case METHOD_GET:
-     // jSON Format
-     index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name);
-     if(led1 == 0)
-         index += sprintf(temp + index," \"mode\" : \"off\"\n");
-     if(led1 == 1)
-         index += sprintf(temp + index," \"mode\" : \"on\"\n");
-     index += sprintf(temp + index,"}\n");
-
-     len = strlen(temp);
-     memcpy(buffer, temp,len );
-
-     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-     REST.set_response_payload(response, buffer, len);
-     break;
-   case METHOD_POST:
-     success = 0;
-     break;
-   case METHOD_PUT:
-     if (success &&  (len=REST.get_post_variable(request, "mode", &pmode))) {
-       PRINTF("name %s\n", mode);
-       memcpy(mode, pmode,len);
-       mode[len]=0;
-       if (!strcmp(mode, "on")) {
-         led1_on();
-         led1 = 1;
-       } else if (!strcmp(mode, "off")) {
-         led1_off();
-         led1 = 0;
-       } else {
-         success = 0;
-       }
-    } else if (success &&  (len=REST.get_post_variable(request, "name", &pname))) {
-       PRINTF("name %s\n", name);
-       memcpy(name, pname,len);
-       name[len]=0;
-    } else {
-      success = 0;
-    }
-    break;
-  default:
-    success = 0;
-  }
-
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-
-#if REST_RES_DS1820
-/*A simple getter example. Returns the reading from ds1820 sensor*/
-RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\"");
-void
-ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-
-  char message[100];
-  int length = 0; /*           |<-------->| */
-  int grad=0;
-  int kgrad=0;
-
-  if(ds1820_ok[0] & 0x01){
-	kgrad=5;
-  }
-  grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1;
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad);
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-    REST.set_response_payload(response, buffer, length);
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad);
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-    REST.set_response_payload(response, buffer, length);
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56);
-  }
-}
-#endif //REST_RES_DS1820
-
-#if REST_RES_DHT11
-/*A simple getter example. Returns the reading from ds1820 sensor*/
-RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\"");
-void
-dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  char message[100];
-  int length = 0; /*           |<-------->| */
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",dht11_temp,dht11_hum);
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-    REST.set_response_payload(response, buffer, length);
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",dht11_temp,dht11_hum);
-
-    length = strlen(message);
-    memcpy(buffer, message,length );
-
-    REST.set_response_payload(response, buffer, length);
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56);
-  }
-}
-#endif //REST_RES_DHT11
-
-#if REST_RES_HELLO
-/*
- * Resources are defined by the RESOURCE macro.
- * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
- */
-RESOURCE(helloworld, METHOD_GET, "hello", "title=\"Hello world: ?len=0..\";rt=\"Text\"");
-
-/*
- * A handler function named [resource name]_handler must be implemented for each RESOURCE.
- * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
- * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
- * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
- */
-void
-helloworld_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  const char *len = NULL;
-  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
-  char const * const message = "Hello World! ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy";
-  int length = 12; /*           |<-------->| */
-
-  /* The query string can be retrieved by rest_get_query() or parsed for its key-value pairs. */
-  if (REST.get_query_variable(request, "len", &len)) {
-    length = atoi(len);
-    if (length<0) length = 0;
-    if (length>REST_MAX_CHUNK_SIZE) length = REST_MAX_CHUNK_SIZE;
-    memcpy(buffer, message, length);
-  } else {
-    memcpy(buffer, message, length);
-  }
-
-  REST.set_header_content_type(response, REST.type.TEXT_PLAIN); /* text/plain is the default, hence this option could be omitted. */
-  REST.set_header_etag(response, (uint8_t *) &length, 1);
-  REST.set_response_payload(response, buffer, length);
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_MIRROR
-/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */
-RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\"");
-
-void
-mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  /* The ETag and Token is copied to the header. */
-  uint8_t opaque[] = {0x0A, 0xBC, 0xDE};
-
-  /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */
-  static char location[] = {'/','f','/','a','?','k','&','e', 0};
-
-  /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */
-  unsigned int content_type = REST.get_header_content_type(request);
-
-  /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */
-  uint32_t max_age = 0;
-  const char *str = NULL;
-  uint32_t observe = 0;
-  const uint8_t *bytes = NULL;
-  uint32_t block_num = 0;
-  uint8_t block_more = 0;
-  uint16_t block_size = 0;
-  const char *query = "";
-  int len = 0;
-
-  /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */
-
-  int strpos = 0;
-  /* snprintf() counts the terminating '\0' to the size parameter.
-   * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework.
-   * Add +1 to fill the complete buffer. */
-  strpos += snprintf((char *)buffer, REST_MAX_CHUNK_SIZE+1, "CT %u\n", content_type);
-
-  /* Some getters such as for ETag or Location are omitted, as these options should not appear in a request.
-   * Max-Age might appear in HTTP requests or used for special purposes in CoAP. */
-  if (strpos<=REST_MAX_CHUNK_SIZE && REST.get_header_max_age(request, &max_age))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "MA %lu\n", max_age);
-  }
-
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_host(request, &str)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "UH %.*s\n", len, str);
-  }
-
-/* CoAP-specific example: actions not required for normal RESTful Web service. */
-#if WITH_COAP > 1
-  if (strpos<=REST_MAX_CHUNK_SIZE && coap_get_header_observe(request, &observe))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Ob %lu\n", observe);
-  }
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = coap_get_header_token(request, &bytes)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "To 0x");
-    int index = 0;
-    for (index = 0; index 03 */
-#endif /* CoAP-specific example */
-
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_query(request, &query)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "Qu %.*s\n", len, query);
-  }
-  if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_request_payload(request, &bytes)))
-  {
-    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "%.*s", len, bytes);
-  }
-
-  if (strpos >= REST_MAX_CHUNK_SIZE)
-  {
-      buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */
-  }
-
-  REST.set_response_payload(response, buffer, strpos);
-
-  PRINTF("/mirror options received: %s\n", buffer);
-
-  /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */
-  REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-  REST.set_header_max_age(response, 10); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */
-  REST.set_header_etag(response, opaque, 2);
-  REST.set_header_location(response, location); /* Initial slash is omitted by framework */
-
-/* CoAP-specific example: actions not required for normal RESTful Web service. */
-#if WITH_COAP > 1
-  coap_set_header_uri_host(response, "tiki");
-  coap_set_header_observe(response, 10);
-#if WITH_COAP == 3
-  coap_set_header_block(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */
-#else
-  coap_set_header_proxy_uri(response, "ftp://x");
-  coap_set_header_block2(response, 42, 0, 64); /* The block option might be overwritten by the framework when blockwise transfer is requested. */
-  coap_set_header_block1(response, 23, 0, 16);
-  coap_set_header_accept(response, TEXT_PLAIN);
-  coap_set_header_if_none_match(response);
-#endif /* CoAP > 03 */
-#endif /* CoAP-specific example */
-}
-#endif /* REST_RES_MIRROR */
-
-/******************************************************************************/
-#if REST_RES_CHUNKS
-/*
- * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation
- * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer,
- * the byte offset where to continue is provided to the handler as int32_t pointer.
- * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached.
- * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.)
- */
-RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\"");
-
-#define CHUNKS_TOTAL    2050
-
-void
-chunks_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 = 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);
-
-  /* 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_SEPARATE && defined (PLATFORM_HAS_BUTTON) && WITH_COAP > 3
-/* Required to manually (=not by the engine) handle the response transaction. */
-#include "er-coap-07-separate.h"
-#include "er-coap-07-transactions.h"
-/*
- * CoAP-specific example for separate responses.
- * Note the call "rest_set_pre_handler(&resource_separate, coap_separate_handler);" in the main process.
- * The pre-handler takes care of the empty ACK and updates the MID and message type for CON requests.
- * The resource handler must store all information that required to finalize the response later.
- */
-RESOURCE(separate, METHOD_GET, "test/separate", "title=\"Separate demo\"");
-
-/* 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[16];
-} 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)
-{
-  /*
-   * Example allows only one open separate response.
-   * For multiple, the application must manage the list of stores.
-   */
-  if (separate_active)
-  {
-    coap_separate_reject();
-  }
-  else
-  {
-    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. */
-
-    /*
-     * At the moment, only the minimal information is stored in the store (client address, port, token, MID, type, and Block2).
-     * Extend the store, if the application requires additional information from this handler.
-     * buffer is an example field for custom information.
-     */
-    snprintf(separate_store->buffer, sizeof(separate_store->buffer), "StoredInfo");
-  }
-}
-
-void
-separate_finalize_handler()
-{
-  if (separate_active)
-  {
-    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)) )
-    {
-      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);
-
-      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
-    {
-      /*
-       * Set timer for retry, send error message, ...
-       * The example simply waits for another button press.
-       */
-    }
-  } /* if (separate_active) */
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_PUSHING
-/*
- * Example for a periodic resource.
- * It takes an additional period parameter, which defines the interval to call [name]_periodic_handler().
- * A default post_handler takes care of subscriptions by managing a list of subscribers to notify.
- */
-PERIODIC_RESOURCE(pushing, METHOD_GET, "test/push", "title=\"Periodic demo\";obs", 5*CLOCK_SECOND);
-
-void
-pushing_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);
-
-  /* Usually, a CoAP server would response with the resource representation matching the periodic_handler. */
-  const char *msg = "It's periodic!";
-  REST.set_response_payload(response, msg, strlen(msg));
-
-  /* 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
-pushing_periodic_handler(resource_t *r)
-{
-  static uint16_t obs_counter = 0;
-  static char content[11];
-
-  ++obs_counter;
-
-  PRINTF("TICK %u for /%s\n", obs_counter, r->url);
-
-  /* Build notification. */
-  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 );
-  coap_set_payload(notification, content, snprintf(content, sizeof(content), "TICK %u", obs_counter));
-
-  /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r, obs_counter, notification);
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON)
-/*
- * Example for an event resource.
- * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler().
- * A default post_handler takes care of subscriptions and manages a list of subscribers to notify.
- */
-EVENT_RESOURCE(event, METHOD_GET, "sensors/button", "title=\"Event demo\";obs");
-
-void
-event_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);
-  /* Usually, a CoAP server would response with the current resource representation. */
-  const char *msg = "It's eventful!";
-  REST.set_response_payload(response, (uint8_t *)msg, strlen(msg));
-
-  /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */
-}
-
-/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined.
- * It will be called by the REST manager process with the defined period. */
-void
-event_event_handler(resource_t *r)
-{
-  static uint16_t event_counter = 0;
-  static char content[12];
-
-  ++event_counter;
-
-  PRINTF("TICK %u for /%s\n", event_counter, r->url);
-
-  /* Build notification. */
-  coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
-  coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 );
-  coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter));
-
-  /* Notify the registered observers with the given message type, observe option, and payload. */
-  REST.notify_subscribers(r, event_counter, notification);
-}
-#endif /* PLATFORM_HAS_BUTTON */
-
-/******************************************************************************/
-#if REST_RES_SUB
-/*
- * Example for a resource that also handles all its sub-resources.
- * Use REST.get_url() to multiplex the handling of the request depending on the Uri-Path.
- */
-RESOURCE(sub, METHOD_GET | HAS_SUB_RESOURCES, "test/path", "title=\"Sub-resource demo\"");
-
-void
-sub_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);
-
-  const char *uri_path = NULL;
-  int len = REST.get_url(request, &uri_path);
-  int base_len = strlen(resource_sub.url);
-
-  if (len==base_len)
-  {
-	snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "Request any sub-resource of /%s", resource_sub.url);
-  }
-  else
-  {
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, ".%s", uri_path+base_len);
-  }
-
-  REST.set_response_payload(response, buffer, strlen((char *)buffer));
-}
-#endif
-
-/******************************************************************************/
-#if defined (PLATFORM_HAS_LEDS)
-/******************************************************************************/
-#if REST_RES_LEDS
-/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/
-RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\"");
-
-void
-leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  size_t len = 0;
-  const char *color = NULL;
-  const char *mode = NULL;
-  uint8_t led = 0;
-  int success = 1;
-
-  if ((len=REST.get_query_variable(request, "color", &color))) {
-    PRINTF("color %.*s\n", len, color);
-
-    if (strncmp(color, "r", len)==0) {
-      led = LEDS_RED;
-    } else if(strncmp(color,"g", len)==0) {
-      led = LEDS_GREEN;
-    } else if (strncmp(color,"b", len)==0) {
-      led = LEDS_BLUE;
-    } else {
-      success = 0;
-    }
-  } else {
-    success = 0;
-  }
-
-  if (success && (len=REST.get_post_variable(request, "mode", &mode))) {
-    PRINTF("mode %s\n", mode);
-
-    if (strncmp(mode, "on", len)==0) {
-      leds_on(led);
-    } else if (strncmp(mode, "off", len)==0) {
-      leds_off(led);
-    } else {
-      success = 0;
-    }
-  } else {
-    success = 0;
-  }
-
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-#endif
-
-/******************************************************************************/
-#if REST_RES_TOGGLE
-/* A simple actuator example. Toggles the red led */
-RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\"");
-void
-toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  leds_toggle(LEDS_RED);
-}
-#endif
-#endif /* PLATFORM_HAS_LEDS */
-
-/******************************************************************************/
-#if REST_RES_LIGHT && defined (PLATFORM_HAS_LIGHT)
-/* A simple getter example. Returns the reading from light sensor with a simple etag */
-RESOURCE(light, METHOD_GET, "sensors/light", "title=\"Photosynthetic and solar light (supports JSON)\";rt=\"LightSensor\"");
-void
-light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  uint16_t light_photosynthetic = light_sensor.value(LIGHT_SENSOR_PHOTOSYNTHETIC);
-  uint16_t light_solar = light_sensor.value(LIGHT_SENSOR_TOTAL_SOLAR);
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", light_photosynthetic, light_solar);
-
-    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_XML))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_XML);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", light_photosynthetic, light_solar);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'light':{'photosynthetic':%u,'solar':%u}}", light_photosynthetic, light_solar);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    const char *msg = "Supporting content-types text/plain, application/xml, and application/json";
-    REST.set_response_payload(response, msg, strlen(msg));
-  }
-}
-#endif /* PLATFORM_HAS_LIGHT */
-
-/******************************************************************************/
-#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE)
-/* A simple getter example. Returns the reading from light sensor with a simple etag */
-RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\"");
-void
-temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  int temperature = temperature_sensor.value(0);
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature);
-
-    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    const char *msg = "Supporting content-types text/plain and application/json";
-    REST.set_response_payload(response, msg, strlen(msg));
-  }
-}
-#endif /* PLATFORM_HAS_TEMPERATURE */
-
-/******************************************************************************/
-#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY)
-/* A simple getter example. Returns the reading from light sensor with a simple etag */
-RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\"");
-void
-battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  int battery = battery_sensor.value(0);
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-  {
-    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery);
-
-    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-  }
-  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-  {
-    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery);
-
-    REST.set_response_payload(response, buffer, strlen((char *)buffer));
-  }
-  else
-  {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-    const char *msg = "Supporting content-types text/plain and application/json";
-    REST.set_response_payload(response, msg, strlen(msg));
-  }
-}
-#endif /* PLATFORM_HAS_BATTERY */
-
-
-#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO
-/* A simple getter example. Returns the reading of the rssi/lqi from radio sensor */
-RESOURCE(radio, METHOD_GET, "sensor/radio", "title=\"RADIO: ?p=lqi|rssi\";rt=\"RadioSensor\"");
-
-void
-radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  size_t len = 0;
-  const char *p = NULL;
-  uint8_t param = 0;
-  int success = 1;
-
-  const uint16_t *accept = NULL;
-  int num = REST.get_header_accept(request, &accept);
-
-  if ((len=REST.get_query_variable(request, "p", &p))) {
-    PRINTF("p %.*s\n", len, p);
-    if (strncmp(p, "lqi", len)==0) {
-      param = RADIO_SENSOR_LAST_VALUE;
-    } else if(strncmp(p,"rssi", len)==0) {
-      param = RADIO_SENSOR_LAST_PACKET;
-    } else {
-      success = 0;
-    }
-  } else {
-    success = 0;
-  }
-
-  if (success) {
-    if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
-    {
-      REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-      snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", radio_sensor.value(param));
-
-      REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
-    }
-    else if (num && (accept[0]==REST.type.APPLICATION_JSON))
-    {
-      REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-
-      if (param == RADIO_SENSOR_LAST_VALUE) {
-        snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lqi':%d}", radio_sensor.value(param));
-      } else if (param == RADIO_SENSOR_LAST_PACKET) {
-        snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'rssi':%d}", radio_sensor.value(param));
-      }
-
-      REST.set_response_payload(response, buffer, strlen((char *)buffer));
-    }
-    else
-    {
-      REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
-      const char *msg = "Supporting content-types text/plain and application/json";
-      REST.set_response_payload(response, msg, strlen(msg));
-    }
-  } else {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
-#endif
-
-void 
-hw_init()
-{
-  key_init();
-  led1_off();
-#if REST_RES_DS1820
-  ds1820_temp();
-#endif
-#if REST_RES_DHT11
-  dht11_temp=DHT_Read_Data(DHT_Temp);
-  dht11_hum=DHT_Read_Data(DHT_RH);
-#endif
-}
-#define MESURE_INTERVAL		(20 * CLOCK_SECOND)
-#define READ_TIME		( 2 * CLOCK_SECOND)
-
-PROCESS(rest_server_example, "Erbium Example Server");
-AUTOSTART_PROCESSES(&rest_server_example);
-
-PROCESS_THREAD(rest_server_example, ev, data)
-{
-  static struct etimer ds_periodic_timer;
-#if REST_RES_DS1820
-  static struct etimer ds_read_timer;
-#endif
-
-  PROCESS_BEGIN();
-
-
-
-  PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE)
-  set_global_address();
-  configure_routing();
-#endif
-
-  /* Initialize the OSD Hardware. */
-  hw_init();
-
-  /* Initialize the REST engine. */
-  rest_init_engine();
-
-  /* Activate the application-specific resources. */
-  rest_activate_resource(&resource_button);
-  rest_activate_resource(&resource_led1);
-  /* Activate the application-specific resources. */
-#if REST_RES_DS1820
-  rest_activate_resource(&resource_ds1820);
-#endif
-#if REST_RES_DHT11
-  rest_activate_resource(&resource_dht11);
-#endif
-#if REST_RES_INFO
-  rest_activate_resource(&resource_info);
-#endif
-#if REST_RES_HELLO
-  rest_activate_resource(&resource_helloworld);
-#endif
-#if REST_RES_MIRROR
-  rest_activate_resource(&resource_mirror);
-#endif
-#if REST_RES_CHUNKS
-  rest_activate_resource(&resource_chunks);
-#endif
-#if REST_RES_PUSHING
-  rest_activate_periodic_resource(&periodic_resource_pushing);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT
-  rest_activate_event_resource(&resource_event);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && REST_RES_SEPARATE && WITH_COAP > 3
-  /* No pre-handler anymore, user coap_separate_accept() and coap_separate_reject(). */
-  rest_activate_resource(&resource_separate);
-#endif
-#if defined (PLATFORM_HAS_BUTTON) && (REST_RES_EVENT || (REST_RES_SEPARATE && WITH_COAP > 3))
-  SENSORS_ACTIVATE(button_sensor);
-#endif
-#if REST_RES_SUB
-  rest_activate_resource(&resource_sub);
-#endif
-#if defined (PLATFORM_HAS_LEDS)
-#if REST_RES_LEDS
-  rest_activate_resource(&resource_leds);
-#endif
-#if REST_RES_TOGGLE
-  rest_activate_resource(&resource_toggle);
-#endif
-#endif /* PLATFORM_HAS_LEDS */
-#if defined (PLATFORM_HAS_LIGHT) && REST_RES_LIGHT
-  SENSORS_ACTIVATE(light_sensor);
-  rest_activate_resource(&resource_light);
-#endif
-#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE
-  SENSORS_ACTIVATE(temperature_sensor);
-  rest_activate_resource(&resource_temperature);
-#endif
-#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY
-  SENSORS_ACTIVATE(battery_sensor);
-  rest_activate_resource(&resource_battery);
-#endif
-#if defined (PLATFORM_HAS_RADIO) && REST_RES_RADIO
-  SENSORS_ACTIVATE(radio_sensor);
-  rest_activate_resource(&resource_radio);
-#endif
-
-  /* Define application-specific events here. */
-  etimer_set(&ds_periodic_timer, MESURE_INTERVAL);
-  while(1) {
-    PROCESS_WAIT_EVENT();
-#if defined (PLATFORM_HAS_BUTTON)
-    if (ev == sensors_event && data == &button_sensor) {
-      PRINTF("BUTTON\n");
-#if REST_RES_EVENT
-      /* Call the event_handler for this application-specific event. */
-      event_event_handler(&resource_event);
-#endif
-#if REST_RES_SEPARATE && WITH_COAP>3
-      /* Also call the separate response example handler. */
-      separate_finalize_handler();
-#endif
-    }
-#endif /* PLATFORM_HAS_BUTTON */
-    if(etimer_expired(&ds_periodic_timer)) {
-        PRINTF("Periodic\n");
-        etimer_reset(&ds_periodic_timer);
-#if REST_RES_DHT11
-        dht11_temp=DHT_Read_Data(DHT_Temp);
-        dht11_hum=DHT_Read_Data(DHT_RH);
-#endif
-#if REST_RES_DS1820
-        if(ds1820_convert()){
-          etimer_set(&ds_read_timer, READ_TIME);
-        }
-#endif
-    }
-#if REST_RES_DS1820
-    if(etimer_expired(&ds_read_timer)) {
-        PRINTF("DS1820_Read\n");
-        ds1820_read();
-    }
-#endif
-  } /* while (1) */
-
-  PROCESS_END();
-}
diff --git a/examples/osd/er-rest-example-dht11/flash.sh b/examples/osd/er-rest-example-dht11/flash.sh
deleted file mode 100755
index e92d472f6..000000000
--- a/examples/osd/er-rest-example-dht11/flash.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a
diff --git a/examples/osd/er-rest-example-dht11/project-conf.h b/examples/osd/er-rest-example-dht11/project-conf.h
deleted file mode 100644
index dcbd00805..000000000
--- a/examples/osd/er-rest-example-dht11/project-conf.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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 PLATFORM_HAS_LEDS    1
-//#define PLATFORM_HAS_BUTTON  1
-//#define PLATFORM_HAS_LIGHT   1
-#define PLATFORM_HAS_TEMPERATURE   1
-#define PLATFORM_HAS_BATTERY 1
-//#define PLATFORM_HAS_SHT11   1
-
-#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__ */
diff --git a/examples/osd/er-rest-example-dht11/run.sh b/examples/osd/er-rest-example-dht11/run.sh
deleted file mode 100755
index 4f21e9b63..000000000
--- a/examples/osd/er-rest-example-dht11/run.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-make clean TARGET=osd-merkur
-make TARGET=osd-merkur
-avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur
-avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex
-avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep
diff --git a/examples/osd/er-rest-example-dht11/server-client.csc b/examples/osd/er-rest-example-dht11/server-client.csc
deleted file mode 100644
index 8c45fdf02..000000000
--- a/examples/osd/er-rest-example-dht11/server-client.csc
+++ /dev/null
@@ -1,227 +0,0 @@
-
-
-  [CONTIKI_DIR]/tools/cooja/apps/mrm
-  [CONTIKI_DIR]/tools/cooja/apps/mspsim
-  [CONTIKI_DIR]/tools/cooja/apps/avrora
-  [CONTIKI_DIR]/tools/cooja/apps/serial_socket
-  [CONTIKI_DIR]/tools/cooja/apps/collect-view
-  
-    REST with RPL router
-    -2147483648
-    123456
-    1000000
-    
-      se.sics.cooja.radiomediums.UDGM
-      50.0
-      50.0
-      1.0
-      1.0
-    
-    
-      40000
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      rplroot
-      Sky RPL Root
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
-      make border-router.sky TARGET=sky
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      server
-      Erbium Server
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
-      make er-example-server.sky TARGET=sky
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      client
-      Erbium Client
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c
-      make er-example-client.sky TARGET=sky
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        33.260163187353555
-        30.643217359962595
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        1
-      
-      rplroot
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        46.57186415376375
-        40.35946215910942
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        2
-      
-      server
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        18.638049428485125
-        47.55034515769599
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        3
-      
-      client
-    
-  
-  
-    se.sics.cooja.plugins.SimControl
-    259
-    0
-    179
-    0
-    0
-  
-  
-    se.sics.cooja.plugins.Visualizer
-    
-      se.sics.cooja.plugins.skins.IDVisualizerSkin
-      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
-      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
-      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
-      se.sics.cooja.plugins.skins.LEDVisualizerSkin
-      se.sics.cooja.plugins.skins.AddressVisualizerSkin
-      3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351
-    
-    300
-    2
-    178
-    261
-    1
-  
-  
-    se.sics.cooja.plugins.LogListener
-    
-      
-      
-    
-    762
-    3
-    491
-    2
-    182
-  
-  
-    se.sics.cooja.plugins.RadioLogger
-    
-      150
-      
-    
-    451
-    -1
-    305
-    73
-    140
-    true
-  
-  
-    SerialSocketServer
-    0
-    422
-    4
-    74
-    578
-    18
-  
-  
-    se.sics.cooja.plugins.TimeLine
-    
-      0
-      1
-      2
-      
-      
-      
-      
-      125
-      25.49079397896416
-    
-    1624
-    5
-    252
-    6
-    712
-  
-  
-    se.sics.cooja.plugins.MoteInterfaceViewer
-    2
-    
-      Serial port
-      0,0
-    
-    853
-    1
-    491
-    765
-    182
-  
-
-
diff --git a/examples/osd/er-rest-example-dht11/server-only.csc b/examples/osd/er-rest-example-dht11/server-only.csc
deleted file mode 100644
index d5eee34d6..000000000
--- a/examples/osd/er-rest-example-dht11/server-only.csc
+++ /dev/null
@@ -1,189 +0,0 @@
-
-
-  [CONTIKI_DIR]/tools/cooja/apps/mrm
-  [CONTIKI_DIR]/tools/cooja/apps/mspsim
-  [CONTIKI_DIR]/tools/cooja/apps/avrora
-  [CONTIKI_DIR]/tools/cooja/apps/serial_socket
-  [CONTIKI_DIR]/tools/cooja/apps/collect-view
-  
-    REST with RPL router
-    -2147483648
-    123456
-    1000000
-    
-      se.sics.cooja.radiomediums.UDGM
-      50.0
-      50.0
-      1.0
-      1.0
-    
-    
-      40000
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      rplroot
-      Sky RPL Root
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
-      make border-router.sky TARGET=sky
-      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      se.sics.cooja.mspmote.SkyMoteType
-      server
-      Erbium Server
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
-      make er-example-server.sky TARGET=sky
-      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
-      se.sics.cooja.interfaces.Position
-      se.sics.cooja.interfaces.RimeAddress
-      se.sics.cooja.interfaces.IPAddress
-      se.sics.cooja.interfaces.Mote2MoteRelations
-      se.sics.cooja.interfaces.MoteAttributes
-      se.sics.cooja.mspmote.interfaces.MspClock
-      se.sics.cooja.mspmote.interfaces.MspMoteID
-      se.sics.cooja.mspmote.interfaces.SkyButton
-      se.sics.cooja.mspmote.interfaces.SkyFlash
-      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
-      se.sics.cooja.mspmote.interfaces.SkyByteRadio
-      se.sics.cooja.mspmote.interfaces.MspSerial
-      se.sics.cooja.mspmote.interfaces.SkyLED
-      se.sics.cooja.mspmote.interfaces.MspDebugOutput
-      se.sics.cooja.mspmote.interfaces.SkyTemperature
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        33.260163187353555
-        30.643217359962595
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        1
-      
-      rplroot
-    
-    
-      
-      
-        se.sics.cooja.interfaces.Position
-        35.100895239785295
-        39.70574552287428
-        0.0
-      
-      
-        se.sics.cooja.mspmote.interfaces.MspMoteID
-        2
-      
-      server
-    
-  
-  
-    se.sics.cooja.plugins.SimControl
-    259
-    5
-    179
-    0
-    0
-  
-  
-    se.sics.cooja.plugins.Visualizer
-    
-      se.sics.cooja.plugins.skins.IDVisualizerSkin
-      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
-      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
-      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
-      se.sics.cooja.plugins.skins.LEDVisualizerSkin
-      se.sics.cooja.plugins.skins.AddressVisualizerSkin
-      7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535
-    
-    300
-    4
-    175
-    263
-    3
-  
-  
-    se.sics.cooja.plugins.LogListener
-    
-      
-      
-    
-    560
-    1
-    326
-    1
-    293
-  
-  
-    se.sics.cooja.plugins.RadioLogger
-    
-      150
-      
-    
-    451
-    -1
-    305
-    73
-    140
-    true
-  
-  
-    SerialSocketServer
-    0
-    422
-    2
-    74
-    39
-    199
-  
-  
-    se.sics.cooja.plugins.TimeLine
-    
-      0
-      1
-      
-      
-      
-      
-      125
-      25.49079397896416
-    
-    1624
-    3
-    252
-    4
-    622
-  
-  
-    se.sics.cooja.plugins.MoteInterfaceViewer
-    1
-    
-      Serial port
-      0,0
-    
-    702
-    0
-    646
-    564
-    2
-  
-
-
diff --git a/examples/osd/er-rest-example-dht11/static-routing.c b/examples/osd/er-rest-example-dht11/static-routing.c
deleted file mode 100644
index 628594892..000000000
--- a/examples/osd/er-rest-example-dht11/static-routing.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * static-routing.c
- *
- *  Created on: Oct 12, 2010
- *      Author: simonduq
- */
-
-#include 
-#include "static-routing.h"
-
-#define DEBUG 0
-#if DEBUG
-#include 
-#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(inode_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);
-    }
-  }
-}
diff --git a/examples/osd/er-rest-example-dht11/static-routing.h b/examples/osd/er-rest-example-dht11/static-routing.h
deleted file mode 100644
index 0dff0b7ba..000000000
--- a/examples/osd/er-rest-example-dht11/static-routing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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_ */

From 184dee491ee3834b6d82d789ffd2d51c8de23d8d Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 28 Nov 2013 15:25:17 +0100
Subject: [PATCH 104/345] cleanup code

---
 examples/osd/embedd-vm-merkurboard/Makefile   |   3 -
 .../embedd-vm-merkurboard/embedd-vm-server.c  |  71 +-------
 .../osd/embedd-vm-merkurboard/project-conf.h  |  24 ++-
 .../embedd-vm-merkurboard/static-routing.c    | 155 ------------------
 .../embedd-vm-merkurboard/static-routing.h    |  20 ---
 5 files changed, 17 insertions(+), 256 deletions(-)
 delete mode 100644 examples/osd/embedd-vm-merkurboard/static-routing.c
 delete mode 100644 examples/osd/embedd-vm-merkurboard/static-routing.h

diff --git a/examples/osd/embedd-vm-merkurboard/Makefile b/examples/osd/embedd-vm-merkurboard/Makefile
index 11973023b..e11ebef28 100644
--- a/examples/osd/embedd-vm-merkurboard/Makefile
+++ b/examples/osd/embedd-vm-merkurboard/Makefile
@@ -5,9 +5,6 @@ all: embedd-vm-server
 # configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
 WITH_COAP=13
 
-
-# variable for Makefile.include
-WITH_UIP6=1
 # for some platforms
 UIP_CONF_IPV6=1
 # IPv6 make config disappeared completely
diff --git a/examples/osd/embedd-vm-merkurboard/embedd-vm-server.c b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.c
index 146d75eab..09ffe7927 100644
--- a/examples/osd/embedd-vm-merkurboard/embedd-vm-server.c
+++ b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.c
@@ -46,16 +46,10 @@
 /* Define which resources to include to meet memory constraints. */
 #define REST_RES_INFO 1
 #define REST_RES_EVM 1
-#define REST_RES_CHUNKS 0
 #define REST_RES_BATTERY 1
 #define REST_RES_LEDS 1
 #define REST_RES_TOGGLE 1
 
-#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"
 
 #if defined (PLATFORM_HAS_BUTTON)
@@ -120,7 +114,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 
   /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
        // jSON Format
-     index += sprintf(message + index,"{\n \"version\" : \"V0.1\",\n");
+     index += sprintf(message + index,"{\n \"version\" : \"V0.2\",\n");
      index += sprintf(message + index," \"name\" : \"embedd-vm demo\"\n");
      index += sprintf(message + index,"}\n");
 
@@ -132,66 +126,6 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 }
 #endif
 
-/******************************************************************************/
-#if REST_RES_CHUNKS
-/*
- * For data larger than REST_MAX_CHUNK_SIZE (e.g., stored in flash) resources must be aware of the buffer limitation
- * and split their responses by themselves. To transfer the complete resource through a TCP stream or CoAP's blockwise transfer,
- * the byte offset where to continue is provided to the handler as int32_t pointer.
- * These chunk-wise resources must set the offset value to its new position or -1 of the end is reached.
- * (The offset for CoAP's blockwise transfer can go up to 2'147'481'600 = ~2047 M for block size 2048 (reduced to 1024 in observe-03.)
- */
-RESOURCE(chunks, METHOD_GET, "test/chunks", "title=\"Blockwise demo\";rt=\"Data\"");
-
-#define CHUNKS_TOTAL    2050
-
-void
-chunks_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 = 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);
-
-  /* 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 defined (PLATFORM_HAS_LEDS)
 /******************************************************************************/
@@ -502,9 +436,6 @@ PROCESS_THREAD(rest_server_example, ev, data)
 #if REST_RES_INFO
   rest_activate_resource(&resource_info);
 #endif
-#if REST_RES_CHUNKS
-  rest_activate_resource(&resource_chunks);
-#endif
 #if defined (PLATFORM_HAS_LEDS)
 #if REST_RES_LEDS
   rest_activate_resource(&resource_leds);
diff --git a/examples/osd/embedd-vm-merkurboard/project-conf.h b/examples/osd/embedd-vm-merkurboard/project-conf.h
index 2b6d52421..7cfb06128 100644
--- a/examples/osd/embedd-vm-merkurboard/project-conf.h
+++ b/examples/osd/embedd-vm-merkurboard/project-conf.h
@@ -29,8 +29,8 @@
  *
  */
 
-#ifndef __PROJECT_RPL_WEB_CONF_H__
-#define __PROJECT_RPL_WEB_CONF_H__
+#ifndef PROJECT_RPL_WEB_CONF_H_
+#define PROJECT_RPL_WEB_CONF_H_
 
 #define SICSLOWPAN_CONF_FRAG	1
 
@@ -44,19 +44,23 @@
 //#define NETSTACK_CONF_RDC     nullrdc_driver
 
 /* Debugmode Dont allow MCU sleeping between channel checks */
+/*
 #undef RDC_CONF_MCU_SLEEP
 #define RDC_CONF_MCU_SLEEP       0
+*/
 
 /* The IP buffer size must fit all other hops, in particular the border router. */
 
 #undef UIP_CONF_BUFFER_SIZE
-#define UIP_CONF_BUFFER_SIZE    1280
+#define UIP_CONF_BUFFER_SIZE    256
 
 /* 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
+/*
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
+#undef UIP_CONF_MAX_ROUTES
+#define UIP_CONF_MAX_ROUTES   10
+*/
 
 /* Increase rpl-border-router IP-buffer when using 128. */
 #ifndef REST_MAX_CHUNK_SIZE
@@ -69,12 +73,16 @@
 #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__ */
+#endif /* _PROJECT_RPL_WEB_CONF_H_ */
diff --git a/examples/osd/embedd-vm-merkurboard/static-routing.c b/examples/osd/embedd-vm-merkurboard/static-routing.c
deleted file mode 100644
index 628594892..000000000
--- a/examples/osd/embedd-vm-merkurboard/static-routing.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * static-routing.c
- *
- *  Created on: Oct 12, 2010
- *      Author: simonduq
- */
-
-#include 
-#include "static-routing.h"
-
-#define DEBUG 0
-#if DEBUG
-#include 
-#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(inode_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);
-    }
-  }
-}
diff --git a/examples/osd/embedd-vm-merkurboard/static-routing.h b/examples/osd/embedd-vm-merkurboard/static-routing.h
deleted file mode 100644
index 0dff0b7ba..000000000
--- a/examples/osd/embedd-vm-merkurboard/static-routing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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_ */

From 116ce888c4f0c685addcdd09c99d0a2fcb563d04 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Fri, 29 Nov 2013 15:22:33 +0100
Subject: [PATCH 105/345] code cleanup

---
 examples/osd/powerbox/Makefile            |  4 ----
 examples/osd/powerbox/er-example-server.c |  8 +-------
 examples/osd/powerbox/project-conf.h      | 10 +++++-----
 3 files changed, 6 insertions(+), 16 deletions(-)

diff --git a/examples/osd/powerbox/Makefile b/examples/osd/powerbox/Makefile
index e12d01b5c..d99c2db03 100644
--- a/examples/osd/powerbox/Makefile
+++ b/examples/osd/powerbox/Makefile
@@ -6,14 +6,10 @@ all: er-example-server
 # configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
 WITH_COAP=13
 
-
-# variable for Makefile.include
-WITH_UIP6=1
 # for some platforms
 UIP_CONF_IPV6=1
 # IPv6 make config disappeared completely
 CFLAGS += -DUIP_CONF_IPV6
-CFLAGS += -DUIP_CONF_IPV6_RPL
 
 CONTIKI=../../..
 CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
diff --git a/examples/osd/powerbox/er-example-server.c b/examples/osd/powerbox/er-example-server.c
index 018a1be40..253705154 100644
--- a/examples/osd/powerbox/er-example-server.c
+++ b/examples/osd/powerbox/er-example-server.c
@@ -373,8 +373,6 @@ hw_init()
 #endif
 }
 
-#define MESURE_INTERVAL		(CLOCK_SECOND/2)
-
 PROCESS(rest_server_example, "Erbium Example Server");
 
 AUTOSTART_PROCESSES(&rest_server_example, &sensors_process);
@@ -426,11 +424,7 @@ PROCESS_THREAD(rest_server_example, ev, data)
   /* Define application-specific events here. */
   while(1) {
     PROCESS_WAIT_EVENT();
-#if defined (REST_RES_EVENT)
-    if (ev == sensors_event ) {
-      PRINTF("EVENT\n");
-    }
-#endif /* REST_RES_EVENT */
+
   } /* while (1) */
   PROCESS_END();
 }
diff --git a/examples/osd/powerbox/project-conf.h b/examples/osd/powerbox/project-conf.h
index a5c8cc57b..b1410c36c 100644
--- a/examples/osd/powerbox/project-conf.h
+++ b/examples/osd/powerbox/project-conf.h
@@ -29,8 +29,8 @@
  *
  */
 
-#ifndef __PROJECT_ERBIUM_CONF_H__
-#define __PROJECT_ERBIUM_CONF_H__
+#ifndef PROJECT_ERBIUM_CONF_H_
+#define PROJECT_ERBIUM_CONF_H_
 
 #define PLATFORM_HAS_LEDS    1
 #define PLATFORM_HAS_RELAY  1
@@ -77,9 +77,9 @@
 */
 
 /* Save some memory for the sky platform. */
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
 
-#undef UIP_CONF_DS6_NBR_NBU
-#define UIP_CONF_DS6_NBR_NBU     10
 #undef UIP_CONF_MAX_ROUTES
 #define UIP_CONF_MAX_ROUTES   10
 
@@ -94,4 +94,4 @@
 #undef SICSLOWPAN_CONF_FRAG
 #define SICSLOWPAN_CONF_FRAG	1
 */
-#endif /* __PROJECT_ERBIUM_CONF_H__ */
+#endif /* PROJECT_ERBIUM_CONF_H_ */

From 39a830d9a9b546d6927c50eeca90f9aa9cd433af Mon Sep 17 00:00:00 2001
From: harald42 
Date: Fri, 29 Nov 2013 15:30:34 +0100
Subject: [PATCH 106/345] del unused file

---
 examples/osd/powerbox/static-routing.c | 155 -------------------------
 examples/osd/powerbox/static-routing.h |  20 ----
 2 files changed, 175 deletions(-)
 delete mode 100644 examples/osd/powerbox/static-routing.c
 delete mode 100644 examples/osd/powerbox/static-routing.h

diff --git a/examples/osd/powerbox/static-routing.c b/examples/osd/powerbox/static-routing.c
deleted file mode 100644
index 628594892..000000000
--- a/examples/osd/powerbox/static-routing.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * static-routing.c
- *
- *  Created on: Oct 12, 2010
- *      Author: simonduq
- */
-
-#include 
-#include "static-routing.h"
-
-#define DEBUG 0
-#if DEBUG
-#include 
-#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(inode_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);
-    }
-  }
-}
diff --git a/examples/osd/powerbox/static-routing.h b/examples/osd/powerbox/static-routing.h
deleted file mode 100644
index 0dff0b7ba..000000000
--- a/examples/osd/powerbox/static-routing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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_ */

From 15167d541eeea5d12ce857f01370c2521aaec335 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Fri, 29 Nov 2013 15:34:20 +0100
Subject: [PATCH 107/345] del unused files

---
 examples/osd/light-actor/er-example-server.c |   5 -
 examples/osd/light-actor/static-routing.c    | 155 -------------------
 examples/osd/light-actor/static-routing.h    |  20 ---
 3 files changed, 180 deletions(-)
 delete mode 100644 examples/osd/light-actor/static-routing.c
 delete mode 100644 examples/osd/light-actor/static-routing.h

diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c
index b586d7b8f..9076a11cb 100644
--- a/examples/osd/light-actor/er-example-server.c
+++ b/examples/osd/light-actor/er-example-server.c
@@ -53,11 +53,6 @@
 #define REST_RES_TOGGLE 0
 #define REST_RES_BATTERY 1
 
-#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"
 #include "pcintkey.h"
 
diff --git a/examples/osd/light-actor/static-routing.c b/examples/osd/light-actor/static-routing.c
deleted file mode 100644
index 628594892..000000000
--- a/examples/osd/light-actor/static-routing.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * static-routing.c
- *
- *  Created on: Oct 12, 2010
- *      Author: simonduq
- */
-
-#include 
-#include "static-routing.h"
-
-#define DEBUG 0
-#if DEBUG
-#include 
-#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(inode_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);
-    }
-  }
-}
diff --git a/examples/osd/light-actor/static-routing.h b/examples/osd/light-actor/static-routing.h
deleted file mode 100644
index 0dff0b7ba..000000000
--- a/examples/osd/light-actor/static-routing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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_ */

From 806de3f204f090f4bebcd0af6bddbe1fe24f7444 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Mon, 2 Dec 2013 15:53:10 +0100
Subject: [PATCH 108/345] cleanup code, add coap13 support

---
 examples/osd/servo-sensor/Makefile            |  58 ++++---
 examples/osd/servo-sensor/er-example-server.c |  90 +---------
 examples/osd/servo-sensor/project-conf.h      |  68 +++++---
 examples/osd/servo-sensor/static-routing.c    | 155 ------------------
 examples/osd/servo-sensor/static-routing.h    |  20 ---
 5 files changed, 87 insertions(+), 304 deletions(-)
 delete mode 100644 examples/osd/servo-sensor/static-routing.c
 delete mode 100644 examples/osd/servo-sensor/static-routing.h

diff --git a/examples/osd/servo-sensor/Makefile b/examples/osd/servo-sensor/Makefile
index dbd2c1410..8a253c40d 100644
--- a/examples/osd/servo-sensor/Makefile
+++ b/examples/osd/servo-sensor/Makefile
@@ -1,44 +1,50 @@
 all: er-example-server
-# Use this target explicitly if requried: er-plugtest-server
+# use this target explicitly if requried: er-plugtest-server
+
+
+# variable for this Makefile
+# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
+WITH_COAP=13
+
+# for some platforms
+UIP_CONF_IPV6=1
+# IPv6 make config disappeared completely
+CFLAGS += -DUIP_CONF_IPV6=1
 
 CONTIKI=../../..
 CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
 
-# for static routing, if enabled
+# variable for Makefile.include
 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
+CFLAGS += -DUIP_CONF_IPV6_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 += -DUIP_CONF_IPV6_RPL=0
 CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\"
-CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280
+${info INFO: compiling with large buffers}
+CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048
+CFLAGS += -DREST_MAX_CHUNK_SIZE=1024
+CFLAGS += -DCOAP_MAX_HEADER_SIZE=640
 endif
 
 # linker optimizations
 SMALL=1
 
 # REST framework, requires WITH_COAP
-ifeq ($(WITH_COAP), 7)
+ifeq ($(WITH_COAP), 13)
+${info INFO: compiling with CoAP-13}
+CFLAGS += -DWITH_COAP=13
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-13
+else ifeq ($(WITH_COAP), 12)
+${info INFO: compiling with CoAP-12}
+CFLAGS += -DWITH_COAP=12
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-12
+else ifeq ($(WITH_COAP), 7)
 ${info INFO: compiling with CoAP-08}
 CFLAGS += -DWITH_COAP=7
 CFLAGS += -DREST=coap_rest_implementation
@@ -84,5 +90,5 @@ connect-router:	$(CONTIKI)/tools/tunslip6
 connect-router-cooja:	$(CONTIKI)/tools/tunslip6
 	sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64
 
-tap0up:
+connect-minimal:
 	sudo ip address add fdfd::1/64 dev tap0
diff --git a/examples/osd/servo-sensor/er-example-server.c b/examples/osd/servo-sensor/er-example-server.c
index be0a01ef0..8490cbb45 100644
--- a/examples/osd/servo-sensor/er-example-server.c
+++ b/examples/osd/servo-sensor/er-example-server.c
@@ -46,22 +46,13 @@
 
 /* Define which resources to include to meet memory constraints. */
 #define REST_RES_INFO 1
-#define REST_RES_SERVO 0
 #define REST_RES_T4_SERVO 1
-#define REST_RES_TEMPERATURE 0
-#define REST_RES_EVENT 0
 #define REST_RES_LEDS 0
 #define REST_RES_TOGGLE 0
 #define REST_RES_BATTERY 1
 
-#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"
 
-#include "dev/led.h"
 #if defined (PLATFORM_HAS_BUTTON)
 #include "dev/button-sensor.h"
 #endif
@@ -87,6 +78,10 @@
 #include "er-coap-03.h"
 #elif WITH_COAP == 7
 #include "er-coap-07.h"
+#elif WITH_COAP == 12
+#include "er-coap-12.h"
+#elif WITH_COAP == 13
+#include "er-coap-13.h"
 #else
 #warning "Erbium example without CoAP-specifc functionality"
 #endif /* CoAP-specific example */
@@ -272,72 +267,6 @@ t4_servo_handler(void* request, void* response, uint8_t *buffer, uint16_t prefer
 }
 #endif
 
-/*A simple actuator example, post variable mode, relay is activated or deactivated*/
-RESOURCE(led1, METHOD_GET | METHOD_PUT , "aktors/led1",  "title=\"Led1\";rt=\"led\"");
-void
-led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
-{
-  char mode[10];
-  static uint8_t led1 = 0;
-  static char name[17]="led1";
-  int success = 1;
-
-  char temp[100];
-  int index = 0;
-  size_t len = 0;
-
-  const char *pmode = NULL;
-  const char *pname = NULL;
-
-  switch(REST.get_method_type(request)){
-   case METHOD_GET:
-     // jSON Format
-     index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name);
-     if(led1 == 0)
-         index += sprintf(temp + index," \"mode\" : \"off\"\n");
-     if(led1 == 1)
-         index += sprintf(temp + index," \"mode\" : \"on\"\n");
-     index += sprintf(temp + index,"}\n");
-
-     len = strlen(temp);
-     memcpy(buffer, temp,len );
-
-     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-     REST.set_response_payload(response, buffer, len);
-     break;
-   case METHOD_POST:
-     success = 0;
-     break;
-   case METHOD_PUT:
-     if (success &&  (len=REST.get_post_variable(request, "mode", &pmode))) {
-       PRINTF("name %s\n", mode);
-       memcpy(mode, pmode,len);
-       mode[len]=0;
-       if (!strcmp(mode, "on")) {
-         led1_on();
-         led1 = 1;
-       } else if (!strcmp(mode, "off")) {
-         led1_off();
-         led1 = 0;
-       } else {
-         success = 0;
-       }
-    } else if (success &&  (len=REST.get_post_variable(request, "name", &pname))) {
-       PRINTF("name %s\n", name);
-       memcpy(name, pname,len);
-       name[len]=0;
-    } else {
-      success = 0;
-    }
-    break;
-  default:
-    success = 0;
-  }
-
-  if (!success) {
-    REST.set_response_status(response, REST.status.BAD_REQUEST);
-  }
-}
 
 /******************************************************************************/
 #if defined (PLATFORM_HAS_LEDS)
@@ -468,7 +397,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr
   }
   else
   {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
     const char *msg = "Supporting content-types text/plain and application/json";
     REST.set_response_payload(response, msg, strlen(msg));
   }
@@ -479,7 +408,9 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr
 void 
 hw_init()
 {
-  led1_off();
+#if defined (PLATFORM_HAS_LEDS)
+ leds_off(LEDS_RED);
+#endif
 }
 
 PROCESS(rest_server_example, "Erbium Example Server");
@@ -515,7 +446,6 @@ PROCESS_THREAD(rest_server_example, ev, data)
   rest_init_engine();
 
   /* Activate the application-specific resources. */
-  rest_activate_resource(&resource_led1);
 #if REST_RES_INFO
   rest_activate_resource(&resource_info);
 #endif
@@ -535,10 +465,6 @@ PROCESS_THREAD(rest_server_example, ev, data)
   SENSORS_ACTIVATE(battery_sensor);
   rest_activate_resource(&resource_battery);
 #endif
-#if defined (PLATFORM_HAS_SERVO) && REST_RES_SERVO
-  SENSORS_ACTIVATE(servo_sensor);
-  rest_activate_resource(&resource_servo);
-#endif
 #if defined (PLATFORM_HAS_T4_SERVO) && REST_RES_T4_SERVO
   SENSORS_ACTIVATE(t4_servo_sensor);
   rest_activate_resource(&resource_t4_servo);
diff --git a/examples/osd/servo-sensor/project-conf.h b/examples/osd/servo-sensor/project-conf.h
index c8f2cd92b..7f2b57d02 100644
--- a/examples/osd/servo-sensor/project-conf.h
+++ b/examples/osd/servo-sensor/project-conf.h
@@ -34,9 +34,7 @@
 
 //#define PLATFORM_HAS_LEDS    1
 //#define PLATFORM_HAS_BUTTON  1
-//#define PLATFORM_HAS_SERVO  1
 #define PLATFORM_HAS_T4_SERVO  1
-//#define PLATFORM_HAS_TEMPERATURE   1
 #define PLATFORM_HAS_BATTERY 1
 
 #define SICSLOWPAN_CONF_FRAG	1
@@ -45,34 +43,62 @@
 #undef RDC_CONF_MCU_SLEEP
 #define RDC_CONF_MCU_SLEEP       0
 
+/* Some platforms have weird includes. */
+#undef IEEE802154_CONF_PANID
+
 /* Disabling RDC for demo purposes. Core updates often require more memory. */
 /* For projects, optimize memory and enable RDC again. */
-//#undef NETSTACK_CONF_RDC
+// #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
+/* Increase rpl-border-router IP-buffer when using more than 64. */
+#undef REST_MAX_CHUNK_SIZE
 #define REST_MAX_CHUNK_SIZE    64
-#endif
+
+/* Estimate your header size, especially when using Proxy-Uri. */
+/*
+#undef COAP_MAX_HEADER_SIZE
+#define COAP_MAX_HEADER_SIZE    70
+*/
+
+/* The IP buffer size must fit all other hops, in particular the border router. */
+
+#undef UIP_CONF_BUFFER_SIZE
+#define UIP_CONF_BUFFER_SIZE    256
+
 
 /* Multiplies with chunk size, be aware of memory constraints. */
-#ifndef COAP_MAX_OPEN_TRANSACTIONS
-#define COAP_MAX_OPEN_TRANSACTIONS   2
-#endif
+#undef COAP_MAX_OPEN_TRANSACTIONS
+#define COAP_MAX_OPEN_TRANSACTIONS   4
 
-/* Must be <= open transaction number. */
-#ifndef COAP_MAX_OBSERVERS
-#define COAP_MAX_OBSERVERS      COAP_MAX_OPEN_TRANSACTIONS-1
-#endif
+/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */
+/*
+#undef COAP_MAX_OBSERVERS
+#define COAP_MAX_OBSERVERS      2
+*/
+
+/* Filtering .well-known/core per query can be disabled to save space. */
+/*
+#undef COAP_LINK_FORMAT_FILTERING
+#define COAP_LINK_FORMAT_FILTERING      0
+*/
+
+/* Save some memory for the sky platform. */
+/*
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
+#undef UIP_CONF_MAX_ROUTES
+#define UIP_CONF_MAX_ROUTES   10
+*/
 
 /* Reduce 802.15.4 frame queue to save RAM. */
+/*
 #undef QUEUEBUF_CONF_NUM
-#define QUEUEBUF_CONF_NUM               4
+#define QUEUEBUF_CONF_NUM       4
+*/
 
-#endif /* __PROJECT_RPL_WEB_CONF_H__ */
+/*
+#undef SICSLOWPAN_CONF_FRAG
+#define SICSLOWPAN_CONF_FRAG	1
+*/
+#endif /* PROJECT_ERBIUM_CONF_H_ */
diff --git a/examples/osd/servo-sensor/static-routing.c b/examples/osd/servo-sensor/static-routing.c
deleted file mode 100644
index 628594892..000000000
--- a/examples/osd/servo-sensor/static-routing.c
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * static-routing.c
- *
- *  Created on: Oct 12, 2010
- *      Author: simonduq
- */
-
-#include 
-#include "static-routing.h"
-
-#define DEBUG 0
-#if DEBUG
-#include 
-#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(inode_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);
-    }
-  }
-}
diff --git a/examples/osd/servo-sensor/static-routing.h b/examples/osd/servo-sensor/static-routing.h
deleted file mode 100644
index 0dff0b7ba..000000000
--- a/examples/osd/servo-sensor/static-routing.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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_ */

From b50f4e2119f6a16fb101d505db5e10b60f56eb76 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Thu, 5 Dec 2013 15:34:54 +0100
Subject: [PATCH 109/345] remove xmac config

---
 platform/osd-merkur/contiki-conf.h | 39 ------------------------------
 1 file changed, 39 deletions(-)

diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h
index 8764ddb97..6cfe45de1 100644
--- a/platform/osd-merkur/contiki-conf.h
+++ b/platform/osd-merkur/contiki-conf.h
@@ -274,45 +274,6 @@ typedef unsigned short uip_stats_t;
 #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) */
-/* These values are guesses */
-#define RF230_CONF_FRAME_RETRIES  10
-#define RF230_CONF_CSMA_RETRIES   2
-#if RF230_CONF_CSMA_RETRIES
-#define NETSTACK_CONF_MAC         nullmac_driver
-#else
-#define NETSTACK_CONF_MAC         csma_driver
-#endif
-#define NETSTACK_CONF_RDC         cxmac_driver
-#define NETSTACK_CONF_FRAMER      framer_802154
-#define NETSTACK_CONF_RADIO       rf230_driver
-#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 NBR_TABLE_CONF_MAX_NEIGHBORS      4
-#define UIP_CONF_DS6_DEFRT_NBU    2
-#define UIP_CONF_DS6_PREFIX_NBU   3
-#define UIP_CONF_MAX_ROUTES    4
-#define UIP_CONF_DS6_ADDR_NBU     3
-#define UIP_CONF_DS6_MADDR_NBU    0
-#define UIP_CONF_DS6_AADDR_NBU    0
-//Below gives 10% duty cycle, undef for default 5%
-//#define CXMAC_CONF_ON_TIME (RTIMER_ARCH_SECOND / 80)
-//Below gives 50% duty cycle
-//#define CXMAC_CONF_ON_TIME (RTIMER_ARCH_SECOND / 16)
-
 #else
 #error Network configuration not specified!
 #endif   /* Network setup */

From 2ddd2ba38a0523d4c476d175007f3f0a9e9b7c18 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Fri, 6 Dec 2013 15:17:13 +0100
Subject: [PATCH 110/345] cleanup code add coap13 support

---
 examples/osd/light-actor/Makefile            | 57 +++++++++-------
 examples/osd/light-actor/er-example-server.c | 10 ++-
 examples/osd/light-actor/project-conf.h      | 68 ++++++++++++++------
 3 files changed, 86 insertions(+), 49 deletions(-)

diff --git a/examples/osd/light-actor/Makefile b/examples/osd/light-actor/Makefile
index 9f5e50f5a..23ea7e7ac 100644
--- a/examples/osd/light-actor/Makefile
+++ b/examples/osd/light-actor/Makefile
@@ -1,46 +1,53 @@
 all: er-example-server
-# Use this target explicitly if requried: er-plugtest-server
+# use this target explicitly if requried: er-plugtest-server
+
+
+# variable for this Makefile
+# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
+WITH_COAP=13
+
+# for some platforms
+UIP_CONF_IPV6=1
+# IPv6 make config disappeared completely
+CFLAGS += -DUIP_CONF_IPV6=1
 
 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
 # pcintkey
 PROJECT_SOURCEFILES += pcintkey.c
 
-# 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
+# variable for Makefile.include
 ifneq ($(TARGET), minimal-net)
-UIP_CONF_RPL=1
+CFLAGS += -DUIP_CONF_IPV6_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 += -DUIP_CONF_IPV6_RPL=0
 CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\"
-CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280
+${info INFO: compiling with large buffers}
+CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048
+CFLAGS += -DREST_MAX_CHUNK_SIZE=1024
+CFLAGS += -DCOAP_MAX_HEADER_SIZE=640
 endif
 
 # linker optimizations
 SMALL=1
 
 # REST framework, requires WITH_COAP
-ifeq ($(WITH_COAP), 7)
+ifeq ($(WITH_COAP), 13)
+${info INFO: compiling with CoAP-13}
+CFLAGS += -DWITH_COAP=13
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-13
+else ifeq ($(WITH_COAP), 12)
+${info INFO: compiling with CoAP-12}
+CFLAGS += -DWITH_COAP=12
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-12
+else ifeq ($(WITH_COAP), 7)
 ${info INFO: compiling with CoAP-08}
 CFLAGS += -DWITH_COAP=7
 CFLAGS += -DREST=coap_rest_implementation
@@ -86,5 +93,5 @@ connect-router:	$(CONTIKI)/tools/tunslip6
 connect-router-cooja:	$(CONTIKI)/tools/tunslip6
 	sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64
 
-tap0up:
+connect-minimal:
 	sudo ip address add fdfd::1/64 dev tap0
diff --git a/examples/osd/light-actor/er-example-server.c b/examples/osd/light-actor/er-example-server.c
index 9076a11cb..431e54ceb 100644
--- a/examples/osd/light-actor/er-example-server.c
+++ b/examples/osd/light-actor/er-example-server.c
@@ -80,6 +80,10 @@
 #include "er-coap-03.h"
 #elif WITH_COAP == 7
 #include "er-coap-07.h"
+#elif WITH_COAP == 12
+#include "er-coap-12.h"
+#elif WITH_COAP == 13
+#include "er-coap-13.h"
 #else
 #warning "Erbium example without CoAP-specifc functionality"
 #endif /* CoAP-specific example */
@@ -119,7 +123,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 
   /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
        // jSON Format
-     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n");
+     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre2\",\n");
      index += sprintf(message + index," \"name\" : \"light-actor\"\n");
      index += sprintf(message + index,"}\n");
 
@@ -441,7 +445,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre
   }
   else
   {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
     const char *msg = "Supporting content-types text/plain and application/json";
     REST.set_response_payload(response, msg, strlen(msg));
   }
@@ -476,7 +480,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr
   }
   else
   {
-    REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE);
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
     const char *msg = "Supporting content-types text/plain and application/json";
     REST.set_response_payload(response, msg, strlen(msg));
   }
diff --git a/examples/osd/light-actor/project-conf.h b/examples/osd/light-actor/project-conf.h
index 8a38647da..f6305b633 100644
--- a/examples/osd/light-actor/project-conf.h
+++ b/examples/osd/light-actor/project-conf.h
@@ -29,8 +29,8 @@
  *
  */
 
-#ifndef __PROJECT_RPL_WEB_CONF_H__
-#define __PROJECT_RPL_WEB_CONF_H__
+#ifndef PROJECT_RPL_WEB_CONF_H_
+#define PROJECT_RPL_WEB_CONF_H_
 
 //#define PLATFORM_HAS_LEDS    1
 //#define PLATFORM_HAS_BUTTON  1
@@ -46,32 +46,58 @@
 
 /* Disabling RDC for demo purposes. Core updates often require more memory. */
 /* For projects, optimize memory and enable RDC again. */
-//#undef NETSTACK_CONF_RDC
+// #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
+/* Increase rpl-border-router IP-buffer when using more than 64. */
+#undef REST_MAX_CHUNK_SIZE
 #define REST_MAX_CHUNK_SIZE    64
-#endif
+
+/* Estimate your header size, especially when using Proxy-Uri. */
+/*
+#undef COAP_MAX_HEADER_SIZE
+#define COAP_MAX_HEADER_SIZE    70
+*/
+
+/* The IP buffer size must fit all other hops, in particular the border router. */
+
+#undef UIP_CONF_BUFFER_SIZE
+#define UIP_CONF_BUFFER_SIZE    256
+
 
 /* Multiplies with chunk size, be aware of memory constraints. */
-#ifndef COAP_MAX_OPEN_TRANSACTIONS
-#define COAP_MAX_OPEN_TRANSACTIONS   2
-#endif
+#undef COAP_MAX_OPEN_TRANSACTIONS
+#define COAP_MAX_OPEN_TRANSACTIONS   4
 
-/* Must be <= open transaction number. */
-#ifndef COAP_MAX_OBSERVERS
-#define COAP_MAX_OBSERVERS      COAP_MAX_OPEN_TRANSACTIONS-1
-#endif
+/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */
+/*
+#undef COAP_MAX_OBSERVERS
+#define COAP_MAX_OBSERVERS      2
+*/
+
+/* Filtering .well-known/core per query can be disabled to save space. */
+/*
+#undef COAP_LINK_FORMAT_FILTERING
+#define COAP_LINK_FORMAT_FILTERING      0
+*/
+
+/* Save some memory for the sky platform. */
+/*
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
+#undef UIP_CONF_MAX_ROUTES
+#define UIP_CONF_MAX_ROUTES   10
+*/
 
 /* Reduce 802.15.4 frame queue to save RAM. */
+/*
 #undef QUEUEBUF_CONF_NUM
-#define QUEUEBUF_CONF_NUM               4
+#define QUEUEBUF_CONF_NUM       4
+*/
 
-#endif /* __PROJECT_RPL_WEB_CONF_H__ */
+/*
+#undef SICSLOWPAN_CONF_FRAG
+#define SICSLOWPAN_CONF_FRAG	1
+*/
+
+#endif /* PROJECT_RPL_WEB_CONF_H_ */

From 7d354d8a374e09f4d3b77e607dfea6c8d87ba649 Mon Sep 17 00:00:00 2001
From: harald42 
Date: Wed, 15 Jan 2014 16:45:37 +0100
Subject: [PATCH 111/345] initial upload

---
 examples/osd/light-shutter-control/Makefile   |  98 +++
 examples/osd/light-shutter-control/README     |  76 +++
 .../light-shutter-control/er-example-server.c | 625 ++++++++++++++++++
 examples/osd/light-shutter-control/flash.sh   |   2 +
 examples/osd/light-shutter-control/pcintkey.c | 118 ++++
 examples/osd/light-shutter-control/pcintkey.h |  52 ++
 .../osd/light-shutter-control/project-conf.h  | 103 +++
 examples/osd/light-shutter-control/run.sh     |   6 +
 .../osd/light-shutter-control/server-only.csc | 189 ++++++
 .../osd/light-shutter-control/statusled.c     |  80 +++
 .../osd/light-shutter-control/statusled.h     |  52 ++
 11 files changed, 1401 insertions(+)
 create mode 100644 examples/osd/light-shutter-control/Makefile
 create mode 100644 examples/osd/light-shutter-control/README
 create mode 100644 examples/osd/light-shutter-control/er-example-server.c
 create mode 100755 examples/osd/light-shutter-control/flash.sh
 create mode 100644 examples/osd/light-shutter-control/pcintkey.c
 create mode 100644 examples/osd/light-shutter-control/pcintkey.h
 create mode 100644 examples/osd/light-shutter-control/project-conf.h
 create mode 100755 examples/osd/light-shutter-control/run.sh
 create mode 100644 examples/osd/light-shutter-control/server-only.csc
 create mode 100644 examples/osd/light-shutter-control/statusled.c
 create mode 100644 examples/osd/light-shutter-control/statusled.h

diff --git a/examples/osd/light-shutter-control/Makefile b/examples/osd/light-shutter-control/Makefile
new file mode 100644
index 000000000..7a3466655
--- /dev/null
+++ b/examples/osd/light-shutter-control/Makefile
@@ -0,0 +1,98 @@
+all: er-example-server
+# use this target explicitly if requried: er-plugtest-server
+
+
+# variable for this Makefile
+# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
+WITH_COAP=13
+
+# for some platforms
+UIP_CONF_IPV6=1
+# IPv6 make config disappeared completely
+CFLAGS += -DUIP_CONF_IPV6=1
+
+CONTIKI=../../..
+CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
+
+# pcintkey
+PROJECT_SOURCEFILES += pcintkey.c
+PROJECT_SOURCEFILES += statusled.c
+
+# variable for Makefile.include
+ifneq ($(TARGET), minimal-net)
+CFLAGS += -DUIP_CONF_IPV6_RPL=1
+else
+# minimal-net does not support RPL under Linux and is mostly used to test CoAP only
+${info INFO: compiling without RPL}
+CFLAGS += -DUIP_CONF_IPV6_RPL=0
+CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\"
+${info INFO: compiling with large buffers}
+CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048
+CFLAGS += -DREST_MAX_CHUNK_SIZE=1024
+CFLAGS += -DCOAP_MAX_HEADER_SIZE=640
+endif
+
+# linker optimizations
+SMALL=1
+
+# REST framework, requires WITH_COAP
+ifeq ($(WITH_COAP), 13)
+${info INFO: compiling with CoAP-13}
+CFLAGS += -DWITH_COAP=13
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-13
+else ifeq ($(WITH_COAP), 12)
+${info INFO: compiling with CoAP-12}
+CFLAGS += -DWITH_COAP=12
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-12
+else 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
+
+connect-minimal:
+	sudo ip address add fdfd::1/64 dev tap0
diff --git a/examples/osd/light-shutter-control/README b/examples/osd/light-shutter-control/README
new file mode 100644
index 000000000..84d7dd2f4
--- /dev/null
+++ b/examples/osd/light-shutter-control/README
@@ -0,0 +1,76 @@
+A Quick Introduction to the Erbium (Er) REST Engine
+===================================================
+Compile the Example
+-------------------
+./run.sh
+
+OSD-Merkur Board
+----------------------
+write the images to the OSD-Merkur Board:
+
+./flash.sh
+
+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
+
+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)
diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c
new file mode 100644
index 000000000..431e54ceb
--- /dev/null
+++ b/examples/osd/light-shutter-control/er-example-server.c
@@ -0,0 +1,625 @@
+/*
+ * 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) PIR REST Engine example (with CoAP-specific code)
+ * \author
+ *      Matthias Kovatsch 
+ *      Harald Pichler 
+ */
+
+#include 
+#include 
+#include 
+#include "contiki.h"
+#include "contiki-net.h"
+
+
+/* Define which resources to include to meet memory constraints. */
+#define REST_RES_INFO 1
+#define REST_RES_OPTRIAC 1
+#define REST_RES_TEMPERATURE 1
+#define REST_RES_EVENT 0
+#define REST_RES_LEDS 0
+#define REST_RES_TOGGLE 0
+#define REST_RES_BATTERY 1
+
+#include "erbium.h"
+#include "pcintkey.h"
+
+#include "dev/led.h"
+#if defined (PLATFORM_HAS_BUTTON)
+#include "dev/button-sensor.h"
+#endif
+#if defined (PLATFORM_HAS_LEDS)
+#include "dev/leds.h"
+#endif
+#if defined (PLATFORM_HAS_OPTRIAC)
+#include "dev/optriac-sensor.h"
+#endif
+#if defined (PLATFORM_HAS_TEMPERATURE)
+#include "dev/temperature-sensor.h"
+#endif
+#if defined (PLATFORM_HAS_BATTERY)
+#include "dev/battery-sensor.h"
+#endif
+
+#include "dev/optriac.h"
+
+/* For CoAP-specific example: not required for normal RESTful Web service. */
+#if WITH_COAP == 3
+#include "er-coap-03.h"
+#elif WITH_COAP == 7
+#include "er-coap-07.h"
+#elif WITH_COAP == 12
+#include "er-coap-12.h"
+#elif WITH_COAP == 13
+#include "er-coap-13.h"
+#else
+#warning "Erbium example without CoAP-specifc functionality"
+#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_INFO
+/*
+ * Resources are defined by the RESOURCE macro.
+ * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
+ */
+RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\"");
+
+/*
+ * A handler function named [resource name]_handler must be implemented for each RESOURCE.
+ * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
+ * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
+ * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
+ */
+void
+info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  char message[100];
+  int index = 0;
+  int length = 0; /*           |<-------->| */
+
+  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
+       // jSON Format
+     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre2\",\n");
+     index += sprintf(message + index," \"name\" : \"light-actor\"\n");
+     index += sprintf(message + index,"}\n");
+
+    length = strlen(message);
+    memcpy(buffer, message,length );
+
+  REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+  REST.set_response_payload(response, buffer, length);
+}
+#endif
+
+// pcintkey_ext
+/*A simple actuator example. read the key button status*/
+RESOURCE(extbutton, METHOD_GET | METHOD_PUT , "sensors/extbutton",  "title=\"ext.Button\";rt=\"Text\"");
+void
+extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  static char bname1[17]="button1";
+  static char bname2[17]="button2";
+  static char bname3[17]="button3";
+  int success = 1;
+
+  char temp[100];
+  int index = 0;
+  int length = 0; /*           |<-------->| */
+  const char *name = NULL;
+  size_t len = 0;
+
+  switch(REST.get_method_type(request)){
+   case METHOD_GET:
+     // jSON Format
+     index += sprintf(temp + index,"{\n \"%s\" : ",bname1);
+     if(is_button_ext4())
+         index += sprintf(temp + index,"\"on\",\n");
+     else
+         index += sprintf(temp + index,"\"off\",\n");
+     index += sprintf(temp + index,"{\n \"%s\" : ",bname2);
+     if(is_button_ext5())
+         index += sprintf(temp + index,"\"on\",\n");
+     else
+         index += sprintf(temp + index,"\"off\",\n");
+     index += sprintf(temp + index," \"%s\" : ",bname3);
+     if(is_button_ext6())
+         index += sprintf(temp + index,"\"on\"\n");
+     else
+         index += sprintf(temp + index,"\"off\"\n");
+     index += sprintf(temp + index,"}\n");
+
+     length = strlen(temp);
+     memcpy(buffer, temp,length );
+
+     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+     REST.set_response_payload(response, buffer, length);
+
+     break;
+   case METHOD_PUT:
+
+     if (success &&  (len=REST.get_post_variable(request, "name", &name))) {
+       PRINTF("name %s\n", name);
+       memcpy(bname1, name,len);
+       bname1[len]=0;
+     } else {
+       success = 0;
+     }
+     break;
+  default:
+    success = 0;
+  }
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+/*A simple actuator example, post variable mode, relay is activated or deactivated*/
+RESOURCE(led1, METHOD_GET | METHOD_PUT , "actuators/led1",  "title=\"Led1\";rt=\"led\"");
+void
+led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  char mode[10];
+  static uint8_t led1 = 0;
+  static char name[17]="led1";
+  int success = 1;
+
+  char temp[100];
+  int index = 0;
+  size_t len = 0;
+
+  const char *pmode = NULL;
+  const char *pname = NULL;
+
+  switch(REST.get_method_type(request)){
+   case METHOD_GET:
+     // jSON Format
+     index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name);
+     if(led1 == 0)
+         index += sprintf(temp + index," \"mode\" : \"off\"\n");
+     if(led1 == 1)
+         index += sprintf(temp + index," \"mode\" : \"on\"\n");
+     index += sprintf(temp + index,"}\n");
+
+     len = strlen(temp);
+     memcpy(buffer, temp,len );
+
+     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+     REST.set_response_payload(response, buffer, len);
+     break;
+   case METHOD_POST:
+     success = 0;
+     break;
+   case METHOD_PUT:
+     if (success &&  (len=REST.get_post_variable(request, "mode", &pmode))) {
+       PRINTF("name %s\n", mode);
+       memcpy(mode, pmode,len);
+       mode[len]=0;
+       if (!strcmp(mode, "on")) {
+         led1_on();
+         led1 = 1;
+       } else if (!strcmp(mode, "off")) {
+         led1_off();
+         led1 = 0;
+       } else {
+         success = 0;
+       }
+    } else if (success &&  (len=REST.get_post_variable(request, "name", &pname))) {
+       PRINTF("name %s\n", name);
+       memcpy(name, pname,len);
+       name[len]=0;
+    } else {
+      success = 0;
+    }
+    break;
+  default:
+    success = 0;
+  }
+
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+
+/******************************************************************************/
+#if defined (PLATFORM_HAS_OPTRIAC)
+/******************************************************************************/
+#if REST_RES_OPTRIAC
+/*A simple actuator example*/
+RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\"");
+
+void
+optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  const char *type = NULL;
+  const char *mode = NULL;
+  static char namea[17]="Triac-a";
+  static char nameb[17]="Triac-b";
+
+  char temp[100];
+  int index = 0;
+  size_t len = 0;
+
+  uint8_t triac = 0;
+  int success = 1;
+  switch(REST.get_method_type(request)){
+   case METHOD_GET:
+     // jSON Format
+     index += sprintf(temp + index,"{\n \"%s\" : ",namea);
+     if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0)
+         index += sprintf(temp + index,"\"off\",\n");
+     if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1)
+         index += sprintf(temp + index,"\"on\",\n");
+     index += sprintf(temp + index," \"%s\" : ",nameb);
+     if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0)
+         index += sprintf(temp + index,"\"off\"\n");
+     if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1)
+         index += sprintf(temp + index,"\"on\"\n");
+     index += sprintf(temp + index,"}\n");
+
+     len = strlen(temp);
+     memcpy(buffer, temp,len );
+
+     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+     REST.set_response_payload(response, buffer, len);
+     break;
+
+   case METHOD_POST:
+     success = 0;
+     break;
+   case METHOD_PUT:
+  if ((len=REST.get_query_variable(request, "type", &type))) {
+    PRINTF("type %.*s\n", len, type);
+
+    if (strncmp(type, "a", len)==0) {
+      triac = OPTRIAC_SENSOR_A;
+    } else if(strncmp(type,"b", len)==0) {
+      triac = OPTRIAC_SENSOR_B;
+    } else {
+      triac = OPTRIAC_SENSOR_A;
+    }
+  } else {
+    success = 0;
+  }
+
+  if (success && (len=REST.get_post_variable(request, "mode", &mode))) {
+    PRINTF("mode %s\n", mode);
+
+    if (strncmp(mode, "on", len)==0) {
+      led1_on();  // Debug
+      optriac_sensor.configure(triac,1);
+    } else if (strncmp(mode, "off", len)==0) {
+      optriac_sensor.configure(triac,0);
+      led1_off();  // Debug
+    } else {
+      success = 0;
+    }
+  } else {
+    success = 0;
+  }
+    break;
+  default:
+    success = 0;
+  }
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+#endif
+/******************************************************************************/
+#endif /* PLATFORM_HAS_OPTRIAC */
+
+/******************************************************************************/
+#if defined (PLATFORM_HAS_LEDS)
+/******************************************************************************/
+#if REST_RES_LEDS
+/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/
+RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\"");
+
+void
+leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  size_t len = 0;
+  const char *color = NULL;
+  const char *mode = NULL;
+  uint8_t led = 0;
+  int success = 1;
+
+  if ((len=REST.get_query_variable(request, "color", &color))) {
+    PRINTF("color %.*s\n", len, color);
+
+    if (strncmp(color, "r", len)==0) {
+      led = LEDS_RED;
+    } else if(strncmp(color,"g", len)==0) {
+      led = LEDS_GREEN;
+    } else if (strncmp(color,"b", len)==0) {
+      led = LEDS_BLUE;
+    } else {
+      success = 0;
+    }
+  } else {
+    success = 0;
+  }
+
+  if (success && (len=REST.get_post_variable(request, "mode", &mode))) {
+    PRINTF("mode %s\n", mode);
+
+    if (strncmp(mode, "on", len)==0) {
+      leds_on(led);
+    } else if (strncmp(mode, "off", len)==0) {
+      leds_off(led);
+    } else {
+      success = 0;
+    }
+  } else {
+    success = 0;
+  }
+
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+#endif
+
+/******************************************************************************/
+#if REST_RES_TOGGLE
+/* A simple actuator example. Toggles the red led */
+RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\"");
+void
+toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  leds_toggle(LEDS_RED);
+}
+#endif
+#endif /* PLATFORM_HAS_LEDS */
+
+/******************************************************************************/
+
+/******************************************************************************/
+#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE)
+/* A simple getter example. Returns the reading from light sensor with a simple etag */
+RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\"");
+void
+temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  int temperature = temperature_sensor.value(0);
+
+  const uint16_t *accept = NULL;
+  int num = REST.get_header_accept(request, &accept);
+
+  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
+  {
+    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature);
+
+    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
+  }
+  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
+  {
+    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature);
+
+    REST.set_response_payload(response, buffer, strlen((char *)buffer));
+  }
+  else
+  {
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
+    const char *msg = "Supporting content-types text/plain and application/json";
+    REST.set_response_payload(response, msg, strlen(msg));
+  }
+}
+#endif /* PLATFORM_HAS_TEMPERATURE */
+
+/******************************************************************************/
+#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY)
+/* A simple getter example. Returns the reading from light sensor with a simple etag */
+RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\"");
+void
+battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  int battery = battery_sensor.value(0);
+
+  const uint16_t *accept = NULL;
+  int num = REST.get_header_accept(request, &accept);
+
+  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
+  {
+    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery);
+
+    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
+  }
+  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
+  {
+    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery);
+
+    REST.set_response_payload(response, buffer, strlen((char *)buffer));
+  }
+  else
+  {
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
+    const char *msg = "Supporting content-types text/plain and application/json";
+    REST.set_response_payload(response, msg, strlen(msg));
+  }
+}
+#endif /* PLATFORM_HAS_BATTERY */
+/******************************************************************************/
+
+
+
+void 
+hw_init()
+{
+  led1_off();
+  key_init();
+}
+
+#define MESURE_INTERVAL		(CLOCK_SECOND/2)
+
+PROCESS(rest_server_example, "Erbium Example Server");
+
+AUTOSTART_PROCESSES(&rest_server_example, &sensors_process);
+
+PROCESS_THREAD(rest_server_example, ev, data)
+{
+  static struct etimer ds_periodic_timer;
+  static int ext4=0;
+  static int ext5=0;
+  static int ext6=0;
+//  ext4 = is_button_ext4();
+//  ext5 = is_button_ext5();
+//  ext6 = is_button_ext6();
+  
+	  
+  PROCESS_BEGIN();
+  PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE)
+  set_global_address();
+  configure_routing();
+#endif
+
+  /* Initialize the OSD Hardware. */
+  hw_init();
+  /* Initialize the REST engine. */
+  rest_init_engine();
+
+  /* Activate the application-specific resources. */
+  rest_activate_resource(&resource_led1);
+  rest_activate_resource(&resource_extbutton);
+#if REST_RES_INFO
+  rest_activate_resource(&resource_info);
+#endif
+  /* Activate the application-specific resources. */
+#if REST_RES_OPTRIAC
+  SENSORS_ACTIVATE(optriac_sensor);
+  rest_activate_resource(&resource_optriac);
+#endif
+#if defined (PLATFORM_HAS_PIR) && (REST_RES_EVENT)
+  SENSORS_ACTIVATE(pir_sensor);
+  rest_activate_event_resource(&resource_pir);
+  PRINTF("ACTIVATE PIR\n");
+#endif
+#if defined (PLATFORM_HAS_LEDS)
+#if REST_RES_LEDS
+  rest_activate_resource(&resource_leds);
+#endif
+#if REST_RES_TOGGLE
+  rest_activate_resource(&resource_toggle);
+#endif
+#endif /* PLATFORM_HAS_LEDS */
+#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE
+  SENSORS_ACTIVATE(temperature_sensor);
+  rest_activate_resource(&resource_temperature);
+#endif
+#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY
+  SENSORS_ACTIVATE(battery_sensor);
+  rest_activate_resource(&resource_battery);
+#endif
+
+  etimer_set(&ds_periodic_timer, MESURE_INTERVAL);
+  /* Define application-specific events here. */
+  while(1) {
+    PROCESS_WAIT_EVENT();
+#if defined (REST_RES_EVENT)
+    if (ev == sensors_event ) {
+      PRINTF("EVENT\n");
+#if (REST_RES_EVENT && defined (PLATFORM_HAS_PIR))
+    if (data == &pir_sensor) {
+      PRINTF("PIR EVENT\n");
+        /* Call the event_handler for this application-specific event. */
+        pir_event_handler(&resource_pir);
+        PRINTF("CALL EVENT HANDLER\n");
+      }
+#endif /* PLATFORM_HAS_PIR */
+    }
+#endif /* REST_RES_EVENT */
+    /* Button Tric Logic */
+    if(etimer_expired(&ds_periodic_timer)) {
+        PRINTF("Periodic %d %d\n",ext5,ext6);
+	if(ext5 != is_button_ext5()) {
+	  ext5 = is_button_ext5();
+          PRINTF("Toggle Triac A\n");
+          // Toggle Triac A
+          if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0){
+            optriac_sensor.configure(OPTRIAC_SENSOR_A,1);
+            led1_on();
+          }else{
+            optriac_sensor.configure(OPTRIAC_SENSOR_A,0);
+            led1_off();
+          }
+	}
+	if(ext6 != is_button_ext6()) {
+	  ext6 = is_button_ext6();
+          PRINTF("Toggle Triac B\n");
+          // Toggle Triac B
+          if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0){
+            optriac_sensor.configure(OPTRIAC_SENSOR_B,1);
+            led2_on();
+          }else{
+            optriac_sensor.configure(OPTRIAC_SENSOR_B,0);
+            led2_off();
+          }
+	}
+      etimer_reset(&ds_periodic_timer);
+    }
+  } /* while (1) */
+
+  PROCESS_END();
+}
diff --git a/examples/osd/light-shutter-control/flash.sh b/examples/osd/light-shutter-control/flash.sh
new file mode 100755
index 000000000..e92d472f6
--- /dev/null
+++ b/examples/osd/light-shutter-control/flash.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a
diff --git a/examples/osd/light-shutter-control/pcintkey.c b/examples/osd/light-shutter-control/pcintkey.c
new file mode 100644
index 000000000..3da35669d
--- /dev/null
+++ b/examples/osd/light-shutter-control/pcintkey.c
@@ -0,0 +1,118 @@
+/*
+ *  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 
+#include "dev/led.h"
+#include "pcintkey.h"
+
+/*---------------------------------------------------------------------------*/
+
+ISR(PCINT0_vect)
+{
+//  if(BUTTON_CHECK_IRQ()) {
+//    if(timer_expired(&debouncetimer)) {
+//    led1_on();
+//      timer_set(&debouncetimer, CLOCK_SECOND / 4);
+//      sensors_changed(&button_sensor);
+//    led1_off();
+//    }
+//  }
+}
+/**
+ *   \brief This will intialize the KEY for button readings.
+*/
+void
+key_init(void)
+{
+    // Pairing Button
+    PORTB |= (1<
+#include 
+
+void	key_init(void);
+uint8_t	is_button_ext4(void);
+uint8_t	is_button_ext5(void);
+uint8_t	is_button_ext6(void);
+
+#endif /* __KEY_H__ */
diff --git a/examples/osd/light-shutter-control/project-conf.h b/examples/osd/light-shutter-control/project-conf.h
new file mode 100644
index 000000000..f6305b633
--- /dev/null
+++ b/examples/osd/light-shutter-control/project-conf.h
@@ -0,0 +1,103 @@
+/*
+ * 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 PLATFORM_HAS_LEDS    1
+//#define PLATFORM_HAS_BUTTON  1
+#define PLATFORM_HAS_OPTRIAC  1
+#define PLATFORM_HAS_TEMPERATURE   1
+#define PLATFORM_HAS_BATTERY 1
+
+#define SICSLOWPAN_CONF_FRAG	1
+
+/* For Debug: Dont allow MCU sleeping between channel checks */
+#undef RDC_CONF_MCU_SLEEP
+#define RDC_CONF_MCU_SLEEP       0
+
+/* 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
+
+/* Increase rpl-border-router IP-buffer when using more than 64. */
+#undef REST_MAX_CHUNK_SIZE
+#define REST_MAX_CHUNK_SIZE    64
+
+/* Estimate your header size, especially when using Proxy-Uri. */
+/*
+#undef COAP_MAX_HEADER_SIZE
+#define COAP_MAX_HEADER_SIZE    70
+*/
+
+/* The IP buffer size must fit all other hops, in particular the border router. */
+
+#undef UIP_CONF_BUFFER_SIZE
+#define UIP_CONF_BUFFER_SIZE    256
+
+
+/* Multiplies with chunk size, be aware of memory constraints. */
+#undef COAP_MAX_OPEN_TRANSACTIONS
+#define COAP_MAX_OPEN_TRANSACTIONS   4
+
+/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */
+/*
+#undef COAP_MAX_OBSERVERS
+#define COAP_MAX_OBSERVERS      2
+*/
+
+/* Filtering .well-known/core per query can be disabled to save space. */
+/*
+#undef COAP_LINK_FORMAT_FILTERING
+#define COAP_LINK_FORMAT_FILTERING      0
+*/
+
+/* Save some memory for the sky platform. */
+/*
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
+#undef UIP_CONF_MAX_ROUTES
+#define UIP_CONF_MAX_ROUTES   10
+*/
+
+/* Reduce 802.15.4 frame queue to save RAM. */
+/*
+#undef QUEUEBUF_CONF_NUM
+#define QUEUEBUF_CONF_NUM       4
+*/
+
+/*
+#undef SICSLOWPAN_CONF_FRAG
+#define SICSLOWPAN_CONF_FRAG	1
+*/
+
+#endif /* PROJECT_RPL_WEB_CONF_H_ */
diff --git a/examples/osd/light-shutter-control/run.sh b/examples/osd/light-shutter-control/run.sh
new file mode 100755
index 000000000..4f21e9b63
--- /dev/null
+++ b/examples/osd/light-shutter-control/run.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+make clean TARGET=osd-merkur
+make TARGET=osd-merkur
+avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur
+avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex
+avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep
diff --git a/examples/osd/light-shutter-control/server-only.csc b/examples/osd/light-shutter-control/server-only.csc
new file mode 100644
index 000000000..d5eee34d6
--- /dev/null
+++ b/examples/osd/light-shutter-control/server-only.csc
@@ -0,0 +1,189 @@
+
+
+  [CONTIKI_DIR]/tools/cooja/apps/mrm
+  [CONTIKI_DIR]/tools/cooja/apps/mspsim
+  [CONTIKI_DIR]/tools/cooja/apps/avrora
+  [CONTIKI_DIR]/tools/cooja/apps/serial_socket
+  [CONTIKI_DIR]/tools/cooja/apps/collect-view
+  
+    REST with RPL router
+    -2147483648
+    123456
+    1000000
+    
+      se.sics.cooja.radiomediums.UDGM
+      50.0
+      50.0
+      1.0
+      1.0
+    
+    
+      40000
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      rplroot
+      Sky RPL Root
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
+      make border-router.sky TARGET=sky
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.SkyByteRadio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      server
+      Erbium Server
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
+      make er-example-server.sky TARGET=sky
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.SkyByteRadio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        33.260163187353555
+        30.643217359962595
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        1
+      
+      rplroot
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        35.100895239785295
+        39.70574552287428
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        2
+      
+      server
+    
+  
+  
+    se.sics.cooja.plugins.SimControl
+    259
+    5
+    179
+    0
+    0
+  
+  
+    se.sics.cooja.plugins.Visualizer
+    
+      se.sics.cooja.plugins.skins.IDVisualizerSkin
+      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
+      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
+      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
+      se.sics.cooja.plugins.skins.LEDVisualizerSkin
+      se.sics.cooja.plugins.skins.AddressVisualizerSkin
+      7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535
+    
+    300
+    4
+    175
+    263
+    3
+  
+  
+    se.sics.cooja.plugins.LogListener
+    
+      
+      
+    
+    560
+    1
+    326
+    1
+    293
+  
+  
+    se.sics.cooja.plugins.RadioLogger
+    
+      150
+      
+    
+    451
+    -1
+    305
+    73
+    140
+    true
+  
+  
+    SerialSocketServer
+    0
+    422
+    2
+    74
+    39
+    199
+  
+  
+    se.sics.cooja.plugins.TimeLine
+    
+      0
+      1
+      
+      
+      
+      
+      125
+      25.49079397896416
+    
+    1624
+    3
+    252
+    4
+    622
+  
+  
+    se.sics.cooja.plugins.MoteInterfaceViewer
+    1
+    
+      Serial port
+      0,0
+    
+    702
+    0
+    646
+    564
+    2
+  
+
+
diff --git a/examples/osd/light-shutter-control/statusled.c b/examples/osd/light-shutter-control/statusled.c
new file mode 100644
index 000000000..2c3f782a3
--- /dev/null
+++ b/examples/osd/light-shutter-control/statusled.c
@@ -0,0 +1,80 @@
+/*
+ *  Copyright (c) 2014  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 "statusled.h"
+
+/**
+ * \addtogroup statusled
+ * \{
+*/
+/*---------------------------------------------------------------------------*/
+/**
+ * \brief Initialisation Staus led
+*/
+void
+statusledinit(void)
+{
+ /* todo disable jtag interface */
+}
+
+/*---------------------------------------------------------------------------*/
+
+/**
+ * \brief Turns the Raven LED1 on.
+*/
+void
+statusled_on(void)
+{
+    PORTF &= ~(1<
+
+/** @name LED Functions */
+/** @{ */
+void statusled_on(void);
+void statusled_off(void);
+/** @} */
+
+#endif /* __STATUSLED_H__ */

From 1f586c7735a1ee5b31dda659eea0c11b900caf84 Mon Sep 17 00:00:00 2001
From: harald 
Date: Tue, 18 Feb 2014 09:32:01 +0100
Subject: [PATCH 112/345] define new tria pins, configurable type ligt or
 shutter or plug

---
 .../light-shutter-control/er-example-server.c | 88 ++++++++++++++++++-
 .../osd/light-shutter-control/project-conf.h  |  5 ++
 .../osd/light-shutter-control/statusled.c     |  8 +-
 platform/osd-merkur/dev/optriac.c             | 18 ++--
 4 files changed, 107 insertions(+), 12 deletions(-)

diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c
index 431e54ceb..aaca90171 100644
--- a/examples/osd/light-shutter-control/er-example-server.c
+++ b/examples/osd/light-shutter-control/er-example-server.c
@@ -123,10 +123,17 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 
   /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
        // jSON Format
-     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre2\",\n");
+     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre3\",\n");
+#ifdef OSDPLUG 
+     index += sprintf(message + index," \"name\" : \"PLUG\"\n");
+#endif
+#ifdef OSDLIGHT
      index += sprintf(message + index," \"name\" : \"light-actor\"\n");
+#endif
+#ifdef OSDSHUTTER
+     index += sprintf(message + index," \"name\" : \"shutter-actor\"\n");
+#endif
      index += sprintf(message + index,"}\n");
-
     length = strlen(message);
     memcpy(buffer, message,length );
 
@@ -262,9 +269,83 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
     REST.set_response_status(response, REST.status.BAD_REQUEST);
   }
 }
+/******************************************************************************/
+#if (defined (PLATFORM_HAS_OPTRIAC) && defined (OSDPLUG))
+/******************************************************************************/
+#if REST_RES_OPTRIAC
+/*A simple actuator example*/
+RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC, POST/PUT mode=on|off\";rt=\"Control\"");
+
+void
+optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  const char *mode = NULL;
+  static char namea[17]="Triac-a";
+  static char nameb[17]="Triac-b";
+
+  char temp[100];
+  int index = 0;
+  size_t len = 0;
+  int success = 1;
+
+  switch(REST.get_method_type(request)){
+   case METHOD_GET:
+     // jSON Format
+     index += sprintf(temp + index,"{\n \"%s\" : ",namea);
+     if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0)
+         index += sprintf(temp + index,"\"off\",\n");
+     if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1)
+         index += sprintf(temp + index,"\"on\",\n");
+     index += sprintf(temp + index," \"%s\" : ",nameb);
+     if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0)
+         index += sprintf(temp + index,"\"off\"\n");
+     if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1)
+         index += sprintf(temp + index,"\"on\"\n");
+     index += sprintf(temp + index,"}\n");
+
+     len = strlen(temp);
+     memcpy(buffer, temp,len );
+
+     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+     REST.set_response_payload(response, buffer, len);
+     break;
+
+   case METHOD_POST:
+     success = 0;
+     break;
+   case METHOD_PUT:
+     if (success && (len=REST.get_post_variable(request, "mode", &mode))) {
+     PRINTF("mode %s\n", mode);
+       if (strncmp(mode, "on", len)==0) {
+         optriac_sensor.configure(OPTRIAC_SENSOR_A,1);
+         optriac_sensor.configure(OPTRIAC_SENSOR_B,1);
+         statusled_on();
+//         led1_on();  // Debug
+       } else if (strncmp(mode, "off", len)==0) {
+         optriac_sensor.configure(OPTRIAC_SENSOR_A,0);
+         optriac_sensor.configure(OPTRIAC_SENSOR_B,0);
+		 statusled_off();
+//         led1_off();  // Debug
+       } else {
+         success = 0;
+       }
+    } else {
+      success = 0;
+    }
+    break;
+  default:
+    success = 0;
+  }
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+#endif
+/******************************************************************************/
+#endif /* PLATFORM_HAS_OPTRIAC */
 
 /******************************************************************************/
-#if defined (PLATFORM_HAS_OPTRIAC)
+#if (defined (PLATFORM_HAS_OPTRIAC) && defined (OSDLIGHT))
 /******************************************************************************/
 #if REST_RES_OPTRIAC
 /*A simple actuator example*/
@@ -494,6 +575,7 @@ void
 hw_init()
 {
   led1_off();
+  statusledinit();
   key_init();
 }
 
diff --git a/examples/osd/light-shutter-control/project-conf.h b/examples/osd/light-shutter-control/project-conf.h
index f6305b633..d4babccb5 100644
--- a/examples/osd/light-shutter-control/project-conf.h
+++ b/examples/osd/light-shutter-control/project-conf.h
@@ -32,6 +32,11 @@
 #ifndef PROJECT_RPL_WEB_CONF_H_
 #define PROJECT_RPL_WEB_CONF_H_
 
+#define OSDPLUG
+//#define OSDLIGHT
+//#define OSDSHUTTER
+
+
 //#define PLATFORM_HAS_LEDS    1
 //#define PLATFORM_HAS_BUTTON  1
 #define PLATFORM_HAS_OPTRIAC  1
diff --git a/examples/osd/light-shutter-control/statusled.c b/examples/osd/light-shutter-control/statusled.c
index 2c3f782a3..a5a02005d 100644
--- a/examples/osd/light-shutter-control/statusled.c
+++ b/examples/osd/light-shutter-control/statusled.c
@@ -51,7 +51,13 @@
 void
 statusledinit(void)
 {
- /* todo disable jtag interface */
+  uint8_t temp;
+
+  /* Get MCUCR */
+  temp = MCUCR;
+  /* disable jtag */
+  MCUCR = temp|(1<
Date: Fri, 21 Feb 2014 07:59:04 +0100
Subject: [PATCH 113/345] config panid over defines

---
 examples/osd/er-rest-example-merkurboard/project-conf.h | 3 ++-
 platform/osd-merkur/params.h                            | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/examples/osd/er-rest-example-merkurboard/project-conf.h b/examples/osd/er-rest-example-merkurboard/project-conf.h
index d98699d4c..2187b48c7 100644
--- a/examples/osd/er-rest-example-merkurboard/project-conf.h
+++ b/examples/osd/er-rest-example-merkurboard/project-conf.h
@@ -38,7 +38,8 @@
 #define PLATFORM_HAS_BATTERY 1
 
 /* Some platforms have weird includes. */
-#undef IEEE802154_CONF_PANID
+// #undef IEEE802154_CONF_PANID
+// #define IEEE802154_CONF_PANID 0xAAAA
 
 /* Disabling RDC for demo purposes. Core updates often require more memory. */
 /* For projects, optimize memory and enable RDC again. */
diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h
index 9bf2f433e..7666e8230 100644
--- a/platform/osd-merkur/params.h
+++ b/platform/osd-merkur/params.h
@@ -14,7 +14,8 @@
  */
 // default settings
 #define CHANNEL_802_15_4          26     // default frequency (11-26)
-#define IEEE802154_PANID          0xABCD // default panid
+#define IEEE802154_CONF_PANID     0xABCD // default panid
+
 // end default settings
 
 #define CONTIKI_CONF_RANDOM_MAC 0        //adds 78 bytes

From f8c298a4959daf8ff6ca8d4512c94cf24c02d15d Mon Sep 17 00:00:00 2001
From: harald 
Date: Fri, 28 Feb 2014 15:02:49 +0100
Subject: [PATCH 114/345] add dhtxx temp coap

---
 examples/osd/climate/er-example-server.c | 56 +++++++++++++++++++++---
 1 file changed, 50 insertions(+), 6 deletions(-)

diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c
index 06a7c545e..1b750eb30 100644
--- a/examples/osd/climate/er-example-server.c
+++ b/examples/osd/climate/er-example-server.c
@@ -45,8 +45,9 @@
 
 /* Define which resources to include to meet memory constraints. */
 #define REST_RES_INFO 1
-#define REST_RES_DS1820 1
+#define REST_RES_DS1820 0
 #define REST_RES_DHT11 1
+#define REST_RES_DHT11TEMP 1
 #define REST_RES_LEDS 1
 #define REST_RES_TOGGLE 0
 #define REST_RES_BATTERY 1
@@ -127,7 +128,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 
   /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
        // jSON Format
-     index += sprintf(message + index,"{\n \"version\" : \"V0.4.2\",\n");
+     index += sprintf(message + index,"{\n \"version\" : \"V0.4.3\",\n");
      index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n");
      index += sprintf(message + index,"}\n");
 
@@ -187,9 +188,49 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
 }
 #endif //REST_RES_DS1820
 
+#if REST_RES_DHT11TEMP
+/*A simple getter example. Returns the reading from dhtxx sensor*/
+RESOURCE(dht11temp, METHOD_GET, "sensors/temp", "title=\"Temperatur DHTxx\";rt=\"temperature-c\"");
+void
+dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  char message[100];
+  int length = 0; /*           |<-------->| */
+
+  const uint16_t *accept = NULL;
+  int num = REST.get_header_accept(request, &accept);
+
+  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
+  {
+    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d",dht11_temp);
+
+    length = strlen(message);
+    memcpy(buffer, message,length );
+
+    REST.set_response_payload(response, buffer, length);
+  }
+  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
+  {
+    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\"}",dht11_temp);
+
+    length = strlen(message);
+    memcpy(buffer, message,length );
+
+    REST.set_response_payload(response, buffer, length);
+  }
+  else
+  {
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
+    REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56);
+  }	
+}
+#endif //REST_RES_DHT11TEMP
+
 #if REST_RES_DHT11
-/*A simple getter example. Returns the reading from ds1820 sensor*/
-RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHT11\";rt=\"humidity-%\"");
+/*A simple getter example. Returns the reading from dhtxx sensor*/
+RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHTxx\";rt=\"humidity-%\"");
 void
 dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
 {
@@ -202,7 +243,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred
   if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
   {
     REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d %2d",dht11_temp,dht11_hum);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d",dht11_hum);
 
     length = strlen(message);
     memcpy(buffer, message,length );
@@ -212,7 +253,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred
   else if (num && (accept[0]==REST.type.APPLICATION_JSON))
   {
     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\",\"hum\":\"%d\"}",dht11_temp,dht11_hum);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"hum\":\"%d\"}",dht11_hum);
 
     length = strlen(message);
     memcpy(buffer, message,length );
@@ -388,6 +429,9 @@ PROCESS_THREAD(rest_server_example, ev, data)
 #if REST_RES_DHT11
   rest_activate_resource(&resource_dht11);
 #endif
+#if REST_RES_DHT11TEMP
+  rest_activate_resource(&resource_dht11temp);
+#endif
 #if REST_RES_INFO
   rest_activate_resource(&resource_info);
 #endif

From 87028c1f60d0c631649d69bf5ab875ee8171fefc Mon Sep 17 00:00:00 2001
From: harald 
Date: Mon, 3 Mar 2014 14:24:58 +0100
Subject: [PATCH 115/345] temp and hum sensors values xxxx -> xx.xx

---
 examples/osd/climate/er-example-server.c | 14 ++++++++------
 platform/osd-merkur/dev/dht11.c          | 10 +++++-----
 2 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c
index 1b750eb30..ffd0141e6 100644
--- a/examples/osd/climate/er-example-server.c
+++ b/examples/osd/climate/er-example-server.c
@@ -45,9 +45,9 @@
 
 /* Define which resources to include to meet memory constraints. */
 #define REST_RES_INFO 1
-#define REST_RES_DS1820 0
+#define REST_RES_DS1820 1
 #define REST_RES_DHT11 1
-#define REST_RES_DHT11TEMP 1
+#define REST_RES_DHT11TEMP 0
 #define REST_RES_LEDS 1
 #define REST_RES_TOGGLE 0
 #define REST_RES_BATTERY 1
@@ -163,7 +163,8 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
   if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
   {
     REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad);
+//    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "%4d",grad*100+kgrad*10);
 
     length = strlen(message);
     memcpy(buffer, message,length );
@@ -173,7 +174,8 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
   else if (num && (accept[0]==REST.type.APPLICATION_JSON))
   {
     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad);
+//    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%4d\"}",grad*100+kgrad*10);
 
     length = strlen(message);
     memcpy(buffer, message,length );
@@ -203,7 +205,7 @@ dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe
   if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
   {
     REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d",dht11_temp);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "%4d",dht11_temp);
 
     length = strlen(message);
     memcpy(buffer, message,length );
@@ -213,7 +215,7 @@ dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe
   else if (num && (accept[0]==REST.type.APPLICATION_JSON))
   {
     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d\"}",dht11_temp);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%4d\"}",dht11_temp);
 
     length = strlen(message);
     memcpy(buffer, message,length );
diff --git a/platform/osd-merkur/dev/dht11.c b/platform/osd-merkur/dev/dht11.c
index 07629bc74..c43db4456 100644
--- a/platform/osd-merkur/dev/dht11.c
+++ b/platform/osd-merkur/dev/dht11.c
@@ -30,7 +30,7 @@
 #define mdelay(u) clock_delay_msec(u)
 
 // define for DHT11 else for DHT22, RHT03 
-#define DHT11	1
+   #define DHT11	1
 
 uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){
 
@@ -107,11 +107,11 @@ uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){
     //Check if data received are correct by checking the CheckSum
     if ((uint8_t)(data[0] + data[1] + data[2] + data[3]) == data[4]) {
 #ifdef DHT11
-        *humidity = data[0];
-        *temperature = data[2];
+        *humidity = data[0]*100;
+        *temperature = data[2]*100;
 #else
-        *humidity = (uint16_t)data[0]<<8 | data[1];
-        *temperature = (uint16_t)data[2]<<8 | data[3];
+        *humidity = ((uint16_t)data[0]<<8 | data[1])*10;
+        *temperature = ((uint16_t)data[2]<<8 | data[3])*10;
 #endif
         return 0;
     }else{

From 11b7022ce6fd9722671332b0e1b5535c5783d852 Mon Sep 17 00:00:00 2001
From: harald 
Date: Tue, 4 Mar 2014 11:35:59 +0100
Subject: [PATCH 116/345] add patch milligrad ds1820 from Jan-Benedict Glaw

---
 examples/osd/climate/er-example-server.c | 36 ++++++++++++++++--------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c
index ffd0141e6..e924b8b8b 100644
--- a/examples/osd/climate/er-example-server.c
+++ b/examples/osd/climate/er-example-server.c
@@ -39,6 +39,7 @@
 #include 
 #include 
 #include 
+#include 
 #include "contiki.h"
 #include "contiki-net.h"
 
@@ -141,7 +142,11 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 #endif
 
 #if REST_RES_DS1820
-/*A simple getter example. Returns the reading from ds1820 sensor*/
+/* A simple getter example. Returns the reading from ds1820 sensor */
+#define DS1820_TEMP_LSB                0
+#define DS1820_TEMP_MSB                1
+#define DS1820_COUNT_REMAIN    6
+#define DS1820_COUNT_PER_C     7
 RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\"");
 void
 ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
@@ -149,22 +154,30 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
 
   char message[100];
   int length = 0; /*           |<-------->| */
-  int grad=0;
-  int kgrad=0;
-
-  if(ds1820_ok[0] & 0x01){
-	kgrad=5;
-  }
-  grad = (int)((ds1820_ok[1] << 8) | (ds1820_ok[0])) >> 1;
+  union temp_raw {
+         int16_t  s_int16;
+         uint16_t u_int16;
+  } temp_raw;
+  double temp_c;
+  int temp_integral;
+  int temp_centi;
 
   const uint16_t *accept = NULL;
   int num = REST.get_header_accept(request, &accept);
 
+  // temp = temp_read - 0.25°C + (count_per_c - count_remain) / count_per_c;
+  temp_raw.u_int16 = ds1820_ok[DS1820_TEMP_MSB] << 8 | ds1820_ok[DS1820_TEMP_LSB];
+  temp_c = temp_raw.s_int16 / 2.0
+          - 0.25
+          + ((double) ds1820_ok[DS1820_COUNT_PER_C] - (double) ds1820_ok[DS1820_COUNT_REMAIN])
+            / (double) ds1820_ok[DS1820_COUNT_PER_C];
+  temp_integral = (int) temp_c;
+  temp_centi = (int) (fabs (temp_c - (int) temp_c) * 100.0);
+
   if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
   {
     REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
-//    snprintf(message, REST_MAX_CHUNK_SIZE, "%2d.%d C",grad,kgrad);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "%4d",grad*100+kgrad*10);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "%d.%02d C", temp_integral, temp_centi);
 
     length = strlen(message);
     memcpy(buffer, message,length );
@@ -174,8 +187,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
   else if (num && (accept[0]==REST.type.APPLICATION_JSON))
   {
     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
-//    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%d\"}",grad,kgrad);
-    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%4d\"}",grad*100+kgrad*10);
+    snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%02d\"}", temp_integral, temp_centi);
 
     length = strlen(message);
     memcpy(buffer, message,length );

From d8d0a507e1a80ba73c09f033c9070b97bbd7f498 Mon Sep 17 00:00:00 2001
From: harald 
Date: Tue, 4 Mar 2014 14:42:36 +0100
Subject: [PATCH 117/345] remove link status and bugfix params.c

---
 examples/osd/rpl-border-router/border-router.c | 6 ++++--
 platform/osd-merkur/params.c                   | 4 ++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/examples/osd/rpl-border-router/border-router.c b/examples/osd/rpl-border-router/border-router.c
index 3a13e61bb..28bd23064 100644
--- a/examples/osd/rpl-border-router/border-router.c
+++ b/examples/osd/rpl-border-router/border-router.c
@@ -51,6 +51,8 @@
 #include 
 #include 
 
+#include "dev/leds.h"
+
 #define DEBUG DEBUG_NONE
 #include "net/uip-debug.h"
 
@@ -79,7 +81,7 @@ AUTOSTART_PROCESSES(&border_router_process,&webserver_nogui_process);
  */
 #define WEBSERVER_CONF_LOADTIME 0
 #define WEBSERVER_CONF_FILESTATS 0
-#define WEBSERVER_CONF_NEIGHBOR_STATUS 1
+#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.
@@ -334,7 +336,7 @@ PROCESS_THREAD(border_router_process, ev, data)
   rpl_dag_t *dag;
 
   PROCESS_BEGIN();
-
+  leds_off(LEDS_RED);
 /* 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.
diff --git a/platform/osd-merkur/params.c b/platform/osd-merkur/params.c
index 582dbe67f..9e22d412d 100644
--- a/platform/osd-merkur/params.c
+++ b/platform/osd-merkur/params.c
@@ -120,7 +120,7 @@ uint8_t eemem_domain_name[] EEMEM = PARAMS_DOMAINNAME;
 
 uint16_t eemem_nodeid EEMEM = PARAMS_NODEID;
 uint8_t eemem_channel[2] EEMEM = {CHANNEL_802_15_4, ~CHANNEL_802_15_4};
-uint16_t eemem_panid EEMEM = IEEE802154_PANID;
+uint16_t eemem_panid EEMEM = IEEE802154_CONF_PANID;
 uint16_t eemem_panaddr EEMEM = PARAMS_PANADDR;
 uint8_t eemem_txpower EEMEM = PARAMS_TXPOWER;
 
@@ -153,7 +153,7 @@ params_get_channel(void) {
     eeprom_write_block(&buffer,  &eemem_server_name, sizeof(eemem_server_name));
     for (i=0;i
Date: Wed, 5 Mar 2014 14:07:36 +0100
Subject: [PATCH 118/345] initial upload

---
 examples/osd/merkurboard/Makefile             |   94 ++
 examples/osd/merkurboard/README               |   76 +
 examples/osd/merkurboard/README.md            |  166 +++
 examples/osd/merkurboard/er-example-client.c  |  149 ++
 examples/osd/merkurboard/er-example-server.c  |  388 +++++
 examples/osd/merkurboard/er-plugtest-server.c | 1298 +++++++++++++++++
 examples/osd/merkurboard/flash.sh             |    2 +
 examples/osd/merkurboard/flashclient.sh       |    2 +
 examples/osd/merkurboard/in6addr.patch        |   10 +
 examples/osd/merkurboard/project-conf.h       |   99 ++
 examples/osd/merkurboard/run.sh               |    6 +
 examples/osd/merkurboard/runclient.sh         |    6 +
 examples/osd/merkurboard/server-client.csc    |  227 +++
 examples/osd/merkurboard/server-only.csc      |  189 +++
 14 files changed, 2712 insertions(+)
 create mode 100644 examples/osd/merkurboard/Makefile
 create mode 100644 examples/osd/merkurboard/README
 create mode 100644 examples/osd/merkurboard/README.md
 create mode 100644 examples/osd/merkurboard/er-example-client.c
 create mode 100644 examples/osd/merkurboard/er-example-server.c
 create mode 100644 examples/osd/merkurboard/er-plugtest-server.c
 create mode 100755 examples/osd/merkurboard/flash.sh
 create mode 100755 examples/osd/merkurboard/flashclient.sh
 create mode 100644 examples/osd/merkurboard/in6addr.patch
 create mode 100644 examples/osd/merkurboard/project-conf.h
 create mode 100755 examples/osd/merkurboard/run.sh
 create mode 100755 examples/osd/merkurboard/runclient.sh
 create mode 100644 examples/osd/merkurboard/server-client.csc
 create mode 100644 examples/osd/merkurboard/server-only.csc

diff --git a/examples/osd/merkurboard/Makefile b/examples/osd/merkurboard/Makefile
new file mode 100644
index 000000000..60d971598
--- /dev/null
+++ b/examples/osd/merkurboard/Makefile
@@ -0,0 +1,94 @@
+all: er-example-server er-example-client
+# use this target explicitly if requried: er-plugtest-server
+
+
+# variable for this Makefile
+# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
+WITH_COAP=13
+
+# for some platforms
+UIP_CONF_IPV6=1
+# IPv6 make config disappeared completely
+CFLAGS += -DUIP_CONF_IPV6=1
+
+CONTIKI=../../..
+CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
+
+# variable for Makefile.include
+ifneq ($(TARGET), minimal-net)
+CFLAGS += -DUIP_CONF_IPV6_RPL=1
+else
+# minimal-net does not support RPL under Linux and is mostly used to test CoAP only
+${info INFO: compiling without RPL}
+CFLAGS += -DUIP_CONF_IPV6_RPL=0
+CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\"
+${info INFO: compiling with large buffers}
+CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048
+CFLAGS += -DREST_MAX_CHUNK_SIZE=1024
+CFLAGS += -DCOAP_MAX_HEADER_SIZE=640
+endif
+
+# linker optimizations
+SMALL=1
+
+# REST framework, requires WITH_COAP
+ifeq ($(WITH_COAP), 13)
+${info INFO: compiling with CoAP-13}
+CFLAGS += -DWITH_COAP=13
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-13
+else ifeq ($(WITH_COAP), 12)
+${info INFO: compiling with CoAP-12}
+CFLAGS += -DWITH_COAP=12
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-12
+else 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
+
+connect-minimal:
+	sudo ip address add fdfd::1/64 dev tap0
diff --git a/examples/osd/merkurboard/README b/examples/osd/merkurboard/README
new file mode 100644
index 000000000..84d7dd2f4
--- /dev/null
+++ b/examples/osd/merkurboard/README
@@ -0,0 +1,76 @@
+A Quick Introduction to the Erbium (Er) REST Engine
+===================================================
+Compile the Example
+-------------------
+./run.sh
+
+OSD-Merkur Board
+----------------------
+write the images to the OSD-Merkur Board:
+
+./flash.sh
+
+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
+
+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)
diff --git a/examples/osd/merkurboard/README.md b/examples/osd/merkurboard/README.md
new file mode 100644
index 000000000..1aa35b091
--- /dev/null
+++ b/examples/osd/merkurboard/README.md
@@ -0,0 +1,166 @@
+A Quick Introduction to the Erbium (Er) REST Engine
+===================================================
+
+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 Plugtests. Erbium (Er) participated in Paris, France, March 2012 and
+  Sophia-Antipolis, France, November 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](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:
+
+    make TARGET=cooja server-only.csc
+
+Open new terminal
+
+    make connect-router-cooja
+
+- 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:
+
+    make TARGET=cooja server-client.csc
+
+Open new terminal
+
+    make connect-router-cooja
+
+- Wait until red LED toggles on mote 2 (server)
+- 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)
+
+        make TARGET=sky er-example-server.upload MOTE=2
+        make TARGET=sky login MOTE=2
+
+2. Press reset button, get address, abort with Ctrl+C:
+   Line: "Tentative link-local IPv6 address fe80:0000:0000:0000:____:____:____:____"
+
+        cd ../ipv6/rpl-border-router/
+        make TARGET=sky border-router.upload MOTE=1
+        make connect-router
+
+    For a BR tty other than USB0:
+
+        make connect-router-port PORT=X
+
+3. 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
+
+        make TARGET=sky er-example-client.upload MOTE=3
+
+MINIMAL-NET HOWTO
+-----------------
+
+With the target minimal-net you can test your CoAP applications without
+constraints, i.e., with large buffers, debug output, memory protection, etc.
+The er-plugtest-server is thought for the minimal-net platform, as it requires
+an 1280-byte IP buffer and 1024-byte blocks.
+
+        make TARGET=minimal-net er-plugtest-server
+        sudo ./er-plugtest-server.minimal-net
+
+Open new terminal
+
+        make connect-minimal
+
+- Start Copper and discover resources at coap://[fdfd::ff:fe00:10]:5683/
+- You can enable the ETSI Plugtest menu in Copper's preferences
+
+Under Windows/Cygwin, WPCAP might need a patch in
+\usr\include\w32api\in6addr.h:
+
+    21,23c21
+    < #ifdef __INSIDE_CYGWIN__
+    <     uint32_t __s6_addr32[4];
+    < #endif
+    ---
+    >     u_int __s6_addr32[4];
+    36d33
+    < #ifdef __INSIDE_CYGWIN__
+    39d35
+    < #endif
+
+DETAILS
+-------
+
+Erbium currently implements draft 13.  Central features are commented in
+er-example-server.c.  In general, apps/er-coap-13 supports:
+
+- All draft 13 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=13 uses Erbium CoAP 13 apps/er-coap-13/.  The default port for
+  coap-13 is 5683.
+- WITH_COAP=12 uses Erbium CoAP 12 apps/er-coap-12/.  The default port for
+  coap-12 is 5683.
+- 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
+-----
+
+- Dedicated Observe buffers
+- Optimize message struct variable access (directly access struct without copying)
+- Observe client
+- Multiple If-Match ETags
+- (Message deduplication)
diff --git a/examples/osd/merkurboard/er-example-client.c b/examples/osd/merkurboard/er-example-client.c
new file mode 100644
index 000000000..14b5a291a
--- /dev/null
+++ b/examples/osd/merkurboard/er-example-client.c
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2013, Matthias Kovatsch
+ * 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 
+ */
+
+#include 
+#include 
+#include 
+
+#include "contiki.h"
+#include "contiki-net.h"
+
+#include "dev/button-sensor.h"
+#include "dev/leds.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"
+#elif WITH_COAP == 12
+#include "er-coap-12-engine.h"
+#elif WITH_COAP == 13
+#include "er-coap-13-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, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x26e6) /* cooja2 */
+
+#define LOCAL_PORT      UIP_HTONS(COAP_DEFAULT_PORT+1)
+#define REMOTE_PORT     UIP_HTONS(COAP_DEFAULT_PORT)
+
+PROCESS(coap_client_example, "COAP Client Example");
+AUTOSTART_PROCESSES(&coap_client_example);
+
+
+uip_ipaddr_t server_ipaddr;
+
+/* 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"};
+
+/* This function is will be passed to COAP_BLOCKING_REQUEST() to handle responses. */
+void
+client_chunk_handler(void *response)
+{
+  const uint8_t *chunk;
+
+  int len = coap_get_payload(response, &chunk);
+  printf("|%.*s", len, (char *)chunk);
+}
+
+
+PROCESS_THREAD(coap_client_example, ev, data)
+{
+  PROCESS_BEGIN();
+
+  leds_off(LEDS_RED);
+
+  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();
+
+#if PLATFORM_HAS_BUTTON
+  SENSORS_ACTIVATE(button_sensor);
+  PRINTF("Press a button to request %s\n", service_urls[1]);
+#endif
+
+  while(1) {
+    PROCESS_YIELD();
+
+#if PLATFORM_HAS_BUTTON
+    if (ev == sensors_event && data == &button_sensor) {
+
+      /* send a request to notify the end of the process */
+
+      PRINTF("--Toggle --\n");
+      leds_toggle(LEDS_RED);
+      /* 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");
+    }
+#endif
+  }
+
+  PROCESS_END();
+}
diff --git a/examples/osd/merkurboard/er-example-server.c b/examples/osd/merkurboard/er-example-server.c
new file mode 100644
index 000000000..873024511
--- /dev/null
+++ b/examples/osd/merkurboard/er-example-server.c
@@ -0,0 +1,388 @@
+/*
+ * Copyright (c) 2013, Matthias Kovatsch
+ * 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.
+ */
+
+/*
+From:
+http://tools.ietf.org/id/draft-ietf-core-interfaces-01.txt
+
+Appendix A.  Profile example
+
+   The following is a short definition of simple profile.  This
+   simplistic profile is for use in the examples of this document.
+
+         +--------------------+-----------+------------+---------+
+         |       Function Set | Root Path | RT         | IF      |
+         +--------------------+-----------+------------+---------+
+         | Device Description | /d        | simple.dev | core.ll |
+         |            Sensors | /s        | simple.sen | core.b  |
+         |          Actuators | /a        | simple.act | core.b  |
+         +--------------------+-----------+------------+---------+
+
+                           List of Function Sets
+
+       +-------+----------+----------------+---------+------------+
+       |  Type | Path     | RT             | IF      | Data Type  |
+       +-------+----------+----------------+---------+------------+
+       |  Name | /d/name  | simple.dev.n   | core.p  | xsd:string |
+       | Model | /d/model | simple.dev.mdl | core.rp | xsd:string |
+       +-------+----------+----------------+---------+------------+
+
+                      Device Description Function Set
+
+   +-------------+-------------+----------------+--------+-------------+
+   |        Type | Path        | RT             | IF     | Data Type   |
+   +-------------+-------------+----------------+--------+-------------+
+   |       Light | /s/light    | simple.sen.lt  | core.s | xsd:decimal |
+   |             |             |                |        | (lux)       |
+   |    Humidity | /s/humidity | simple.sen.hum | core.s | xsd:decimal |
+   |             |             |                |        | (%RH)       |
+   | Temperature | /s/temp     | simple.sen.tmp | core.s | xsd:decimal |
+   |             |             |                |        | (degC)      |
+   +-------------+-------------+----------------+--------+-------------+
+
+                           Sensors Function Set
+
+       +------+------------+----------------+--------+-------------+
+       | Type | Path       | RT             | IF     | Data Type   |
+       +------+------------+----------------+--------+-------------+
+       |  LED | /a/{#}/led | simple.act.led | core.a | xsd:boolean |
+       +------+------------+----------------+--------+-------------+
+
+                          Actuators Function Set
+*/
+
+/**
+ * \file
+ *      Erbium (Er) REST Engine example (with CoAP-specific code)
+ * \author
+ *      Matthias Kovatsch 
+ */
+
+#include 
+#include 
+#include 
+#include "contiki.h"
+#include "contiki-net.h"
+
+
+/* Define which resources to include to meet memory constraints. */
+#define REST_RES_INFO 1
+#define REST_RES_EVENT 1
+#define REST_RES_LEDS 1
+#define REST_RES_TOGGLE 1
+#define REST_RES_BATTERY 1
+
+#include "erbium.h"
+
+#if defined (PLATFORM_HAS_BUTTON)
+#include "dev/button-sensor.h"
+#endif
+#if defined (PLATFORM_HAS_LEDS)
+#include "dev/leds.h"
+#endif
+#if defined (PLATFORM_HAS_BATTERY)
+#include "dev/battery-sensor.h"
+#endif
+
+
+/* For CoAP-specific example: not required for normal RESTful Web service. */
+#if WITH_COAP == 3
+#include "er-coap-03.h"
+#elif WITH_COAP == 7
+#include "er-coap-07.h"
+#elif WITH_COAP == 12
+#include "er-coap-12.h"
+#elif WITH_COAP == 13
+#include "er-coap-13.h"
+#else
+#warning "Erbium example without CoAP-specifc functionality"
+#endif /* CoAP-specific example */
+
+#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
+
+
+/******************************************************************************/
+#if REST_RES_INFO
+/*
+ * Resources are defined by the RESOURCE macro.
+ * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
+ */
+RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"simple.dev.n"");
+
+/*
+ * A handler function named [resource name]_handler must be implemented for each RESOURCE.
+ * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
+ * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
+ * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
+ */
+void
+info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  char message[100];
+  int index = 0;
+  int length = 0; /*           |<-------->| */
+
+  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
+       // jSON Format
+     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre0\",\n");
+     index += sprintf(message + index," \"name\" : \"Merkurboard\"\n");
+     index += sprintf(message + index,"}\n");
+
+    length = strlen(message);
+    memcpy(buffer, message,length );
+
+  REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+  REST.set_response_payload(response, buffer, length);
+}
+#endif
+
+/******************************************************************************/
+#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON)
+/*
+ * Example for an event resource.
+ * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler().
+ * A default post_handler takes care of subscriptions and manages a list of subscribers to notify.
+ */
+EVENT_RESOURCE(event, METHOD_GET, "s/button", "title=\"Event demo\";obs");
+
+void
+event_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);
+  /* Usually, a CoAP server would response with the current resource representation. */
+  const char *msg = "It's eventful!";
+  REST.set_response_payload(response, (uint8_t *)msg, strlen(msg));
+
+  /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */
+}
+
+/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined.
+ * It will be called by the REST manager process with the defined period. */
+void
+event_event_handler(resource_t *r)
+{
+  static uint16_t event_counter = 0;
+  static char content[12];
+
+  ++event_counter;
+
+  PRINTF("TICK %u for /%s\n", event_counter, r->url);
+
+  /* Build notification. */
+  coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
+  coap_init_message(notification, COAP_TYPE_CON, REST.status.OK, 0 );
+  coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter));
+
+  /* Notify the registered observers with the given message type, observe option, and payload. */
+  REST.notify_subscribers(r, event_counter, notification);
+}
+#endif /* PLATFORM_HAS_BUTTON */
+
+
+/******************************************************************************/
+#if defined (PLATFORM_HAS_LEDS)
+/******************************************************************************/
+#if REST_RES_LEDS
+/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/
+RESOURCE(leds, METHOD_POST | METHOD_PUT , "a/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\"");
+
+void
+leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  size_t len = 0;
+  const char *color = NULL;
+  const char *mode = NULL;
+  uint8_t led = 0;
+  int success = 1;
+
+  if ((len=REST.get_query_variable(request, "color", &color))) {
+    PRINTF("color %.*s\n", len, color);
+
+    if (strncmp(color, "r", len)==0) {
+      led = LEDS_RED;
+    } else if(strncmp(color,"g", len)==0) {
+      led = LEDS_GREEN;
+    } else if (strncmp(color,"b", len)==0) {
+      led = LEDS_BLUE;
+    } else {
+      success = 0;
+    }
+  } else {
+    success = 0;
+  }
+
+  if (success && (len=REST.get_post_variable(request, "mode", &mode))) {
+    PRINTF("mode %s\n", mode);
+
+    if (strncmp(mode, "on", len)==0) {
+      leds_on(led);
+    } else if (strncmp(mode, "off", len)==0) {
+      leds_off(led);
+    } else {
+      success = 0;
+    }
+  } else {
+    success = 0;
+  }
+
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+#endif
+
+/******************************************************************************/
+#if REST_RES_TOGGLE
+/* A simple actuator example. Toggles the red led */
+RESOURCE(toggle, METHOD_POST, "a/toggle", "title=\"Red LED\";rt=\"Control\"");
+void
+toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  leds_toggle(LEDS_RED);
+}
+#endif
+#endif /* PLATFORM_HAS_LEDS */
+
+/******************************************************************************/
+#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY)
+/* A simple getter example. Returns the reading from light sensor with a simple etag */
+RESOURCE(battery, METHOD_GET, "s/battery", "title=\"Battery status\";rt=\"Battery\"");
+void
+battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  int battery = battery_sensor.value(0);
+
+  const uint16_t *accept = NULL;
+  int num = REST.get_header_accept(request, &accept);
+
+  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
+  {
+    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", battery/1000, battery % 1000);
+
+    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
+  }
+  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
+  {
+    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{\"battery\":%d.%02d}", battery/1000, battery % 1000);
+
+    REST.set_response_payload(response, buffer, strlen((char *)buffer));
+  }
+  else
+  {
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
+    const char *msg = "Supporting content-types text/plain and application/json";
+    REST.set_response_payload(response, msg, strlen(msg));
+  }
+}
+#endif /* PLATFORM_HAS_BATTERY */
+
+void 
+hw_init()
+{
+#if defined (PLATFORM_HAS_LEDS)
+ leds_off(LEDS_RED);
+#endif
+}
+
+PROCESS(rest_server_example, "Erbium Example Server");
+AUTOSTART_PROCESSES(&rest_server_example);
+
+PROCESS_THREAD(rest_server_example, ev, data)
+{
+  PROCESS_BEGIN();
+
+  PRINTF("Starting Erbium Example 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);
+
+  /* Initialize the OSD Hardware. */
+  hw_init();
+  /* Initialize the REST engine. */
+  rest_init_engine();
+
+  /* Activate the application-specific resources. */
+#if REST_RES_INFO
+  rest_activate_resource(&resource_info);
+#endif
+#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT
+  rest_activate_event_resource(&resource_event);
+  SENSORS_ACTIVATE(button_sensor);
+#endif
+#if defined (PLATFORM_HAS_LEDS)
+#if REST_RES_LEDS
+  rest_activate_resource(&resource_leds);
+#endif
+#if REST_RES_TOGGLE
+  rest_activate_resource(&resource_toggle);
+#endif
+#endif /* PLATFORM_HAS_LEDS */
+#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY
+  SENSORS_ACTIVATE(battery_sensor);
+  rest_activate_resource(&resource_battery);
+#endif
+
+  /* Define application-specific events here. */
+  while(1) {
+    PROCESS_WAIT_EVENT();
+#if defined (PLATFORM_HAS_BUTTON)
+    if (ev == sensors_event && data == &button_sensor) {
+      PRINTF("BUTTON\n");
+#if REST_RES_EVENT
+      /* Call the event_handler for this application-specific event. */
+      event_event_handler(&resource_event);
+#endif
+    }
+#endif /* PLATFORM_HAS_BUTTON */
+  } /* while (1) */
+
+  PROCESS_END();
+}
diff --git a/examples/osd/merkurboard/er-plugtest-server.c b/examples/osd/merkurboard/er-plugtest-server.c
new file mode 100644
index 000000000..5a791a09c
--- /dev/null
+++ b/examples/osd/merkurboard/er-plugtest-server.c
@@ -0,0 +1,1298 @@
+/*
+ * Copyright (c) 2013, Matthias Kovatsch
+ * 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 
+ */
+
+#include 
+#include 
+#include 
+#include "contiki.h"
+#include "contiki-net.h"
+
+#define MAX_PLUGFEST_PAYLOAD 64+1 /* +1 for the terminating zero, which is not transmitted */
+#define MAX_PLUGFEST_BODY    2048
+#define CHUNKS_TOTAL         2012
+
+/* 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_LOC_QUERY 1
+#define REST_RES_MULTI 1
+#define REST_RES_LINKS 1
+#define REST_RES_PATH 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
+
+#define REST_RES_MIRROR 1
+
+
+
+#if !defined (CONTIKI_TARGET_MINIMAL_NET)
+#warning "Should only be compiled for minimal-net!"
+#endif
+
+
+
+#include "erbium.h"
+
+/* For CoAP-specific example: not required for normal RESTful Web service. */
+#if WITH_COAP==7
+#include "er-coap-07.h"
+#elif WITH_COAP == 12
+#include "er-coap-12.h"
+#elif WITH_COAP == 13
+#include "er-coap-13.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\"");
+
+static uint8_t test_etag[8] = {0};
+static uint8_t test_etag_len = 1;
+static uint8_t test_change = 1;
+static uint8_t test_none_match_okay = 1;
+
+static
+void
+test_update_etag()
+{
+    int i;
+    test_etag_len = (random_rand() % 8) + 1;
+    for (i=0; i0 && len==test_etag_len && memcmp(test_etag, bytes, len)==0)
+    {
+      PRINTF("validate ");
+      REST.set_response_status(response, REST.status.NOT_MODIFIED);
+      REST.set_header_etag(response, test_etag, test_etag_len);
+      
+      test_change = 1;
+      PRINTF("### SERVER ACTION ### Resouce will change\n");
+	}
+    else
+    {
+      /* Code 2.05 CONTENT is default. */
+      REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+      REST.set_header_etag(response, test_etag, test_etag_len);
+      REST.set_header_max_age(response, 30);
+      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, "/location1/location2/location3");
+  }
+  else if (method & METHOD_PUT)
+  {
+    PRINTF("PUT ");
+    
+    if (coap_get_header_if_none_match(request))
+    {
+      if (test_none_match_okay)
+      {
+        REST.set_response_status(response, REST.status.CREATED);
+        
+        test_none_match_okay = 0;
+        PRINTF("### SERVER ACTION ### If-None-Match will FAIL\n");
+      }
+      else
+      {
+        REST.set_response_status(response, PRECONDITION_FAILED_4_12);
+        
+	    test_none_match_okay = 1;
+        PRINTF("### SERVER ACTION ### If-None-Match will SUCCEED\n");
+	  }
+	}
+    else if (((len = coap_get_header_if_match(request, &bytes))>0 && (len==test_etag_len && memcmp(test_etag, bytes, len)==0)) || len==0)
+    {
+      test_update_etag();
+      REST.set_header_etag(response, test_etag, test_etag_len);
+	  
+      REST.set_response_status(response, REST.status.CHANGED);
+      
+      if (len>0)
+      {
+        test_change = 1;
+        PRINTF("### SERVER ACTION ### Resouce will change\n");
+	  }
+    }
+    else
+    {
+    
+      PRINTF("Check %u/%u\n  [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n  [0x%02X%02X%02X%02X%02X%02X%02X%02X] ", len, test_etag_len,
+            bytes[0],
+            bytes[1],
+            bytes[2],
+            bytes[3],
+            bytes[4],
+            bytes[5],
+            bytes[6],
+            bytes[7],
+            test_etag[0],
+            test_etag[1],
+            test_etag[2],
+            test_etag[3],
+            test_etag[4],
+            test_etag[5],
+            test_etag[6],
+            test_etag[7] );
+    
+	  REST.set_response_status(response, PRECONDITION_FAILED_4_12);
+	}
+  }
+  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);
+}
+
+
+RESOURCE(create1, METHOD_PUT|METHOD_DELETE, "create1", "title=\"Default test resource\"");
+
+static uint8_t create1_exists = 0;
+
+void
+create1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  uint8_t method = REST.get_method_type(request);
+
+  if (test_change)
+  {
+    test_update_etag();
+  }
+
+  PRINTF("/create1       ");
+
+  if (method & METHOD_PUT)
+  {
+    PRINTF("PUT ");
+
+    if (coap_get_header_if_none_match(request))
+    {
+      if (!create1_exists)
+      {
+        REST.set_response_status(response, REST.status.CREATED);
+
+        create1_exists = 1;
+      }
+      else
+      {
+        REST.set_response_status(response, PRECONDITION_FAILED_4_12);
+      }
+    }
+    else
+    {
+      REST.set_response_status(response, REST.status.CHANGED);
+    }
+  }
+  else if (method & METHOD_DELETE)
+  {
+    PRINTF("DELETE ");
+    REST.set_response_status(response, REST.status.DELETED);
+
+    create1_exists = 0;
+  }
+}
+
+RESOURCE(create2, METHOD_POST, "create2", "title=\"Creates on POST\"");
+
+void
+create2_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  if (test_change)
+  {
+    test_update_etag();
+  }
+
+  PRINTF("/create2       ");
+
+  REST.set_response_status(response, REST.status.CREATED);
+  REST.set_header_location(response, "/location1/location2/location3");
+}
+
+RESOURCE(create3, METHOD_PUT|METHOD_DELETE, "create3", "title=\"Default test resource\"");
+
+static uint8_t create3_exists = 0;
+
+void
+create3_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  uint8_t method = REST.get_method_type(request);
+
+  if (test_change)
+  {
+    test_update_etag();
+  }
+
+  PRINTF("/create3       ");
+
+  if (method & METHOD_PUT)
+  {
+    PRINTF("PUT ");
+
+    if (coap_get_header_if_none_match(request))
+    {
+      if (!create3_exists)
+      {
+        REST.set_response_status(response, REST.status.CREATED);
+
+        create3_exists = 1;
+      }
+      else
+      {
+        REST.set_response_status(response, PRECONDITION_FAILED_4_12);
+      }
+    }
+    else
+    {
+      REST.set_response_status(response, REST.status.CHANGED);
+    }
+  }
+  else if (method & METHOD_DELETE)
+  {
+    PRINTF("DELETE ");
+    REST.set_response_status(response, REST.status.DELETED);
+
+    create3_exists = 0;
+  }
+}
+
+
+
+
+
+RESOURCE(validate, METHOD_GET|METHOD_PUT, "validate", "title=\"Default test resource\"");
+
+static uint8_t validate_etag[8] = {0};
+static uint8_t validate_etag_len = 1;
+static uint8_t validate_change = 1;
+
+static
+void
+validate_update_etag()
+{
+    int i;
+    validate_etag_len = (random_rand() % 8) + 1;
+    for (i=0; i0 && len==validate_etag_len && memcmp(validate_etag, bytes, len)==0)
+    {
+      PRINTF("validate ");
+      REST.set_response_status(response, REST.status.NOT_MODIFIED);
+      REST.set_header_etag(response, validate_etag, validate_etag_len);
+
+      validate_change = 1;
+      PRINTF("### SERVER ACTION ### Resouce will change\n");
+        }
+    else
+    {
+      /* Code 2.05 CONTENT is default. */
+      REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+      REST.set_header_etag(response, validate_etag, validate_etag_len);
+      REST.set_header_max_age(response, 30);
+      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_PUT)
+  {
+    PRINTF("PUT ");
+
+    if (((len = coap_get_header_if_match(request, &bytes))>0 && (len==validate_etag_len && memcmp(validate_etag, bytes, len)==0)) || len==0)
+    {
+      validate_update_etag();
+      REST.set_header_etag(response, validate_etag, validate_etag_len);
+
+      REST.set_response_status(response, REST.status.CHANGED);
+
+      if (len>0)
+      {
+        validate_change = 1;
+        PRINTF("### SERVER ACTION ### Resouce will change\n");
+          }
+    }
+    else
+    {
+      PRINTF("Check %u/%u\n  [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n  [0x%02X%02X%02X%02X%02X%02X%02X%02X] ", len, validate_etag_len,
+          bytes[0],
+          bytes[1],
+          bytes[2],
+          bytes[3],
+          bytes[4],
+          bytes[5],
+          bytes[6],
+          bytes[7],
+          validate_etag[0],
+          validate_etag[1],
+          validate_etag[2],
+          validate_etag[3],
+          validate_etag[4],
+          validate_etag[5],
+          validate_etag[6],
+          validate_etag[7] );
+
+        REST.set_response_status(response, PRECONDITION_FAILED_4_12);
+      }
+  }
+
+  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_LOC_QUERY
+/*
+ * Resource accepting query parameters
+ */
+RESOURCE(locquery, METHOD_POST, "location-query", "title=\"Resource accepting query parameters\"");
+
+void
+locquery_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("/location-query POST (%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid);
+  
+  REST.set_response_status(response, REST.status.CREATED);
+  REST.set_header_location(response, "?first=1&second=2");
+}
+#endif
+
+#if REST_RES_MULTI
+/*
+ * Resource providing text/plain and application/xml
+ */
+RESOURCE(multi, METHOD_GET, "multi-format", "title=\"Resource providing text/plain and application/xml\";ct=\"0 41\"");
+void
+multi_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;
+
+  const uint16_t *accept = NULL;
+  int num = REST.get_header_accept(request, &accept);
+
+  PRINTF("/multi-format   GET (%s %u) %d\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid, num);
+
+  if (num==0 || (num && accept[0]==REST.type.TEXT_PLAIN))
+  {
+    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%s", coap_req->type, coap_req->code, coap_req->mid, num ? "\nAccept: 0" : ""));
+PRINTF("PLAIN\n");
+  }
+  else if (num && (accept[0]==REST.type.APPLICATION_XML))
+  {
+    REST.set_header_content_type(response, REST.type.APPLICATION_XML);
+    REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "", coap_req->type, coap_req->code, coap_req->mid, accept[0]));
+PRINTF("XML\n");
+  }
+  else
+  {
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
+    const char *msg = "Supporting content-types text/plain and application/xml";
+    REST.set_response_payload(response, msg, strlen(msg));
+    PRINTF("ERROR\n");
+  }
+}
+#endif
+
+#if REST_RES_LINKS
+/*
+ * Resources providing text/plain and application/xml
+ */
+RESOURCE(link1, METHOD_GET, "link1", "rt=\"Type1 Type2\";if=\"If1\"");
+SUB_RESOURCE(link2, METHOD_GET, "link2", "rt=\"Type2 Type3\";if=\"If2\"", link1);
+SUB_RESOURCE(link3, METHOD_GET, "link3", "rt=\"Type1 Type3\";if=\"foo\"", link1);
+
+void
+link1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  const char *msg = "Dummy link";
+  REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+  REST.set_response_payload(response, msg, strlen(msg));
+}
+#endif
+
+#if REST_RES_PATH
+/*
+ * Resources providing text/plain and application/xml
+ */
+RESOURCE(path, METHOD_GET | HAS_SUB_RESOURCES, "path", "ct=\"40\"");
+
+void
+path_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+
+  const char *uri_path = NULL;
+  int len = REST.get_url(request, &uri_path);
+  int base_len = strlen(resource_path.url);
+
+  if (len==base_len)
+  {
+    REST.set_header_content_type(response, REST.type.APPLICATION_LINK_FORMAT);
+	snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, ",,");
+  }
+  else
+  {
+    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+    snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "/%.*s", len, uri_path);
+  }
+
+  REST.set_response_payload(response, buffer, strlen((char *)buffer));
+}
+#endif
+
+#if REST_RES_SEPARATE
+/* Required to manually (=not by the engine) handle the response transaction. */
+#if WITH_COAP == 7
+#include "er-coap-07-separate.h"
+#include "er-coap-07-transactions.h"
+#elif WITH_COAP == 12
+#include "er-coap-12-separate.h"
+#include "er-coap-12-transactions.h"
+#elif WITH_COAP == 13
+#include "er-coap-13-separate.h"
+#include "er-coap-13-transactions.h"
+#endif
+/*
+ * 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
+
+/* double expansion */
+#define TO_STRING2(x)  #x
+#define TO_STRING(x)  TO_STRING2(x)
+
+/*
+ * Large resource
+ */
+RESOURCE(large, METHOD_GET, "large", "title=\"Large resource\";rt=\"block\";sz=\"" TO_STRING(CHUNKS_TOTAL) "\"");
+
+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 = 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\";sz=\"" TO_STRING(MAX_PLUGFEST_BODY) "\"");
+
+static int32_t large_update_size = 0;
+static uint8_t large_update_store[MAX_PLUGFEST_BODY] = {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, MIN(large_update_size - *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, (const uint8_t **) &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, (const uint8_t **) &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
+
+#if WITH_COAP == 12
+#include "er-coap-12-observing.h"
+#elif WITH_COAP == 13
+#include "er-coap-13-observing.h"
+#endif
+/*
+ * Observable resource which changes every 5 seconds
+ */
+PERIODIC_RESOURCE(obs, METHOD_GET|METHOD_PUT|METHOD_DELETE, "obs", "title=\"Observable resource which changes every 5 seconds\";obs", 5*CLOCK_SECOND);
+
+static uint16_t obs_counter = 0;
+static char obs_content[MAX_PLUGFEST_BODY];
+static size_t obs_content_len = 0;
+static unsigned int obs_format = 0;
+
+static char obs_status = 0;
+
+static
+void
+obs_purge_list()
+{
+  PRINTF("### SERVER ACTION ### Purging obs list");
+  coap_remove_observer_by_url(NULL, 0, resource_obs.url);
+}
+
+void
+obs_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  uint8_t method = request==NULL ? METHOD_GET : REST.get_method_type(request);
+
+  /* Keep server log clean from ticking events */
+  if (request!=NULL)
+  {
+    PRINTF("/obs            ");
+  }
+  
+  if (method & METHOD_GET)
+  {
+    /* Keep server log clean from ticking events */
+    if (request!=NULL)
+    {
+      PRINTF("GET ");
+    }
+    
+    REST.set_header_content_type(response, obs_format);
+    REST.set_header_max_age(response, 5);
+    
+    if (obs_content_len)
+    {
+      REST.set_header_content_type(response, obs_format);
+	  REST.set_response_payload(response, obs_content, obs_content_len);
+	}
+	else
+	{
+      REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+	  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. */
+  }
+  else if (method & METHOD_PUT)
+  {
+    uint8_t *incoming = NULL;
+    unsigned int ct = REST.get_header_content_type(request);
+    
+    PRINTF("PUT ");
+    
+    if (ct!=obs_format)
+    {
+        obs_status = 1;
+
+      obs_format = ct;
+    } else {
+    
+      obs_format = ct;
+      obs_content_len = REST.get_request_payload(request, (const uint8_t **) &incoming);
+      memcpy(obs_content, incoming, obs_content_len);
+      obs_periodic_handler(&resource_obs);
+    }
+    
+    REST.set_response_status(response, REST.status.CHANGED);
+  }
+  else if (method & METHOD_DELETE)
+  {
+    PRINTF("DELETE ");
+
+    obs_status = 2;
+    
+    REST.set_response_status(response, REST.status.DELETED);
+  }
+  
+  /* Keep server log clean from ticking events */
+  if (request!=NULL)
+  {
+    PRINTF("\n");
+  }
+}
+
+/*
+ * 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);
+
+  if (obs_status==1)
+    {
+      coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
+            coap_init_message(notification, COAP_TYPE_NON, INTERNAL_SERVER_ERROR_5_00, 0 );
+
+            /* Notify the registered observers with the given message type, observe option, and payload. */
+            REST.notify_subscribers(&resource_obs, -1, notification);
+
+            PRINTF("######### sending 5.00\n");
+
+            obs_purge_list();
+    }
+  else if (obs_status==2)
+    {
+
+      coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */
+      coap_init_message(notification, COAP_TYPE_NON, NOT_FOUND_4_04, 0 );
+
+
+      /* Notify the registered observers with the given message type, observe option, and payload. */
+      REST.notify_subscribers(&resource_obs, -1, notification);
+
+      obs_purge_list();
+
+      obs_counter = 0;
+      obs_content_len = 0;
+    }
+  else
+    {
+  /* 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);
+    }
+  obs_status = 0;
+}
+#endif
+
+#if REST_RES_MIRROR
+/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */
+RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\"");
+
+void
+mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  /* The ETag and Token is copied to the header. */
+  uint8_t opaque[] = {0x0A, 0xBC, 0xDE};
+
+  /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */
+  static char location[] = {'/','f','/','a','?','k','&','e', 0};
+
+  /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */
+  unsigned int content_type = REST.get_header_content_type(request);
+
+  /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */
+  uint32_t max_age_and_size = 0;
+  const char *str = NULL;
+  uint32_t observe = 0;
+  const uint8_t *bytes = NULL;
+  const uint16_t *words = NULL;
+  uint32_t block_num = 0;
+  uint8_t block_more = 0;
+  uint16_t block_size = 0;
+  const char *query = "";
+  int len = 0;
+
+  /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */
+
+  int strpos = 0;
+  /* snprintf() counts the terminating '\0' to the size parameter.
+   * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework.
+   * Add +1 to fill the complete buffer, as the payload does not need a terminating '\0'. */
+  
+  
+  if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_if_match(request, &bytes)))
+  {
+    strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "If-Match 0x");
+    int index = 0;
+    for (index = 0; index= REST_MAX_CHUNK_SIZE)
+  {
+      buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */
+  }
+
+  REST.set_response_payload(response, buffer, strpos);
+
+  PRINTF("/mirror options received: %s\n", buffer);
+
+  /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */
+  REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+  REST.set_header_max_age(response, 17); /* For HTTP, browsers will not re-request the page for 17 seconds. */
+  REST.set_header_etag(response, opaque, 2);
+  REST.set_header_location(response, location); /* Initial slash is omitted by framework */
+  REST.set_header_length(response, strpos); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */
+
+/* CoAP-specific example: actions not required for normal RESTful Web service. */
+  coap_set_header_uri_host(response, "Contiki");
+  coap_set_header_observe(response, 10);
+  coap_set_header_proxy_uri(response, "ftp://x");
+  //coap_set_header_block2(response, 42, 0, 64);
+  //coap_set_header_block1(response, 23, 0, 16);
+  coap_set_header_accept(response, APPLICATION_XML);
+  coap_set_header_accept(response, APPLICATION_ATOM_XML);
+  coap_set_header_if_none_match(response);
+}
+#endif /* REST_RES_MIRROR */
+
+
+
+
+
+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);
+
+  /* Initialize the REST engine. */
+  rest_init_engine();
+
+  /* Activate the application-specific resources. */
+#if REST_RES_TEST
+  rest_activate_resource(&resource_test);
+  rest_activate_resource(&resource_validate);
+  rest_activate_resource(&resource_create1);
+  rest_activate_resource(&resource_create2);
+  rest_activate_resource(&resource_create3);
+#endif
+#if REST_RES_LONG
+  rest_activate_resource(&resource_longpath);
+#endif
+#if REST_RES_QUERY
+  rest_activate_resource(&resource_query);
+#endif
+#if REST_RES_LOC_QUERY
+  rest_activate_resource(&resource_locquery);
+#endif
+#if REST_RES_MULTI
+  rest_activate_resource(&resource_multi);
+#endif
+#if REST_RES_LINKS
+  rest_activate_resource(&resource_link1);
+  rest_activate_resource(&resource_link2);
+  rest_activate_resource(&resource_link3);
+#endif
+#if REST_RES_PATH
+  rest_activate_resource(&resource_path);
+#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
+
+#if REST_RES_MIRROR
+  rest_activate_resource(&resource_mirror);
+#endif
+
+  /* Define application-specific events here. */
+  while(1) {
+    PROCESS_WAIT_EVENT();
+
+  } /* while (1) */
+
+  PROCESS_END();
+}
diff --git a/examples/osd/merkurboard/flash.sh b/examples/osd/merkurboard/flash.sh
new file mode 100755
index 000000000..e92d472f6
--- /dev/null
+++ b/examples/osd/merkurboard/flash.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a
diff --git a/examples/osd/merkurboard/flashclient.sh b/examples/osd/merkurboard/flashclient.sh
new file mode 100755
index 000000000..30979eed4
--- /dev/null
+++ b/examples/osd/merkurboard/flashclient.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-client.osd-merkur.hex:a -U eeprom:w:er-example-client.osd-merkur.eep:a
diff --git a/examples/osd/merkurboard/in6addr.patch b/examples/osd/merkurboard/in6addr.patch
new file mode 100644
index 000000000..92ca106cf
--- /dev/null
+++ b/examples/osd/merkurboard/in6addr.patch
@@ -0,0 +1,10 @@
+21,23c21
+< #ifdef __INSIDE_CYGWIN__
+<     uint32_t __s6_addr32[4];
+< #endif
+---
+>     u_int __s6_addr32[4];
+36d33
+< #ifdef __INSIDE_CYGWIN__
+39d35
+< #endif
diff --git a/examples/osd/merkurboard/project-conf.h b/examples/osd/merkurboard/project-conf.h
new file mode 100644
index 000000000..2187b48c7
--- /dev/null
+++ b/examples/osd/merkurboard/project-conf.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2013, Matthias Kovatsch
+ * 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_ERBIUM_CONF_H_
+#define PROJECT_ERBIUM_CONF_H_
+
+#define PLATFORM_HAS_LEDS    1
+#define PLATFORM_HAS_BUTTON  1
+#define PLATFORM_HAS_TEMPERATURE   1
+#define PLATFORM_HAS_BATTERY 1
+
+/* Some platforms have weird includes. */
+// #undef IEEE802154_CONF_PANID
+// #define IEEE802154_CONF_PANID 0xAAAA
+
+/* 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
+
+/* Increase rpl-border-router IP-buffer when using more than 64. */
+#undef REST_MAX_CHUNK_SIZE
+#define REST_MAX_CHUNK_SIZE    64
+
+/* Estimate your header size, especially when using Proxy-Uri. */
+/*
+#undef COAP_MAX_HEADER_SIZE
+#define COAP_MAX_HEADER_SIZE    70
+*/
+
+/* The IP buffer size must fit all other hops, in particular the border router. */
+
+#undef UIP_CONF_BUFFER_SIZE
+#define UIP_CONF_BUFFER_SIZE    256
+
+
+/* Multiplies with chunk size, be aware of memory constraints. */
+#undef COAP_MAX_OPEN_TRANSACTIONS
+#define COAP_MAX_OPEN_TRANSACTIONS   4
+
+/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */
+/*
+#undef COAP_MAX_OBSERVERS
+#define COAP_MAX_OBSERVERS      2
+*/
+
+/* Filtering .well-known/core per query can be disabled to save space. */
+/*
+#undef COAP_LINK_FORMAT_FILTERING
+#define COAP_LINK_FORMAT_FILTERING      0
+*/
+
+/* Save some memory for the sky platform. */
+/*
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
+#undef UIP_CONF_MAX_ROUTES
+#define UIP_CONF_MAX_ROUTES   10
+*/
+
+/* Reduce 802.15.4 frame queue to save RAM. */
+/*
+#undef QUEUEBUF_CONF_NUM
+#define QUEUEBUF_CONF_NUM       4
+*/
+
+/*
+#undef SICSLOWPAN_CONF_FRAG
+#define SICSLOWPAN_CONF_FRAG	1
+*/
+#endif /* PROJECT_ERBIUM_CONF_H_ */
diff --git a/examples/osd/merkurboard/run.sh b/examples/osd/merkurboard/run.sh
new file mode 100755
index 000000000..4f21e9b63
--- /dev/null
+++ b/examples/osd/merkurboard/run.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+make clean TARGET=osd-merkur
+make TARGET=osd-merkur
+avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur
+avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex
+avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep
diff --git a/examples/osd/merkurboard/runclient.sh b/examples/osd/merkurboard/runclient.sh
new file mode 100755
index 000000000..3503afa2b
--- /dev/null
+++ b/examples/osd/merkurboard/runclient.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+make clean TARGET=osd-merkur
+make TARGET=osd-merkur
+avr-size -C --mcu=MCU=atmega128rfa1 er-example-client.osd-merkur
+avr-objcopy -j .text -j .data -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.hex
+avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.eep
diff --git a/examples/osd/merkurboard/server-client.csc b/examples/osd/merkurboard/server-client.csc
new file mode 100644
index 000000000..0c09f41b5
--- /dev/null
+++ b/examples/osd/merkurboard/server-client.csc
@@ -0,0 +1,227 @@
+
+
+  [APPS_DIR]/mrm
+  [APPS_DIR]/mspsim
+  [APPS_DIR]/avrora
+  [APPS_DIR]/serial_socket
+  [APPS_DIR]/collect-view
+  [APPS_DIR]/powertracker
+  
+    REST with RPL router
+    123456
+    1000000
+    
+      se.sics.cooja.radiomediums.UDGM
+      50.0
+      50.0
+      1.0
+      1.0
+    
+    
+      40000
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      rplroot
+      Sky RPL Root
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
+      make border-router.sky TARGET=sky
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.Msp802154Radio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      server
+      Erbium Server
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
+      make er-example-server.sky TARGET=sky
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.Msp802154Radio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      client
+      Erbium Client
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c
+      make er-example-client.sky TARGET=sky
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.Msp802154Radio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        33.260163187353555
+        30.643217359962595
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        1
+      
+      rplroot
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        46.57186415376375
+        40.35946215910942
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        2
+      
+      server
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        18.638049428485125
+        47.55034515769599
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        3
+      
+      client
+    
+  
+  
+    se.sics.cooja.plugins.SimControl
+    259
+    0
+    179
+    0
+    0
+  
+  
+    se.sics.cooja.plugins.Visualizer
+    
+      se.sics.cooja.plugins.skins.IDVisualizerSkin
+      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
+      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
+      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
+      se.sics.cooja.plugins.skins.LEDVisualizerSkin
+      se.sics.cooja.plugins.skins.AddressVisualizerSkin
+      3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351
+    
+    300
+    2
+    178
+    261
+    1
+  
+  
+    se.sics.cooja.plugins.LogListener
+    
+      
+      
+    
+    762
+    3
+    491
+    2
+    182
+  
+  
+    se.sics.cooja.plugins.RadioLogger
+    
+      150
+      
+    
+    451
+    -1
+    305
+    73
+    140
+    true
+  
+  
+    SerialSocketServer
+    0
+    422
+    4
+    74
+    578
+    18
+  
+  
+    se.sics.cooja.plugins.TimeLine
+    
+      0
+      1
+      2
+      
+      
+      
+      
+      125
+      25.49079397896416
+    
+    1624
+    5
+    252
+    6
+    712
+  
+  
+    se.sics.cooja.plugins.MoteInterfaceViewer
+    2
+    
+      Serial port
+      0,0
+    
+    853
+    1
+    491
+    765
+    182
+  
+
+
diff --git a/examples/osd/merkurboard/server-only.csc b/examples/osd/merkurboard/server-only.csc
new file mode 100644
index 000000000..935bd6e79
--- /dev/null
+++ b/examples/osd/merkurboard/server-only.csc
@@ -0,0 +1,189 @@
+
+
+  [APPS_DIR]/mrm
+  [APPS_DIR]/mspsim
+  [APPS_DIR]/avrora
+  [APPS_DIR]/serial_socket
+  [APPS_DIR]/collect-view
+  [APPS_DIR]/powertracker
+  
+    REST with RPL router
+    123456
+    1000000
+    
+      se.sics.cooja.radiomediums.UDGM
+      50.0
+      50.0
+      1.0
+      1.0
+    
+    
+      40000
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      rplroot
+      Sky RPL Root
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
+      make border-router.sky TARGET=sky
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.Msp802154Radio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      server
+      Erbium Server
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
+      make er-example-server.sky TARGET=sky
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.Msp802154Radio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        33.260163187353555
+        30.643217359962595
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        1
+      
+      rplroot
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        35.100895239785295
+        39.70574552287428
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        2
+      
+      server
+    
+  
+  
+    se.sics.cooja.plugins.SimControl
+    259
+    0
+    179
+    0
+    0
+  
+  
+    se.sics.cooja.plugins.Visualizer
+    
+      se.sics.cooja.plugins.skins.IDVisualizerSkin
+      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
+      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
+      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
+      se.sics.cooja.plugins.skins.LEDVisualizerSkin
+      se.sics.cooja.plugins.skins.AddressVisualizerSkin
+      7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535
+    
+    300
+    5
+    175
+    263
+    3
+  
+  
+    se.sics.cooja.plugins.LogListener
+    
+      
+      
+    
+    560
+    2
+    326
+    1
+    293
+  
+  
+    se.sics.cooja.plugins.RadioLogger
+    
+      150
+      
+    
+    451
+    -1
+    305
+    73
+    140
+    true
+  
+  
+    SerialSocketServer
+    0
+    422
+    3
+    74
+    39
+    199
+  
+  
+    se.sics.cooja.plugins.TimeLine
+    
+      0
+      1
+      
+      
+      
+      
+      125
+      25.49079397896416
+    
+    1624
+    4
+    252
+    4
+    622
+  
+  
+    se.sics.cooja.plugins.MoteInterfaceViewer
+    1
+    
+      Serial port
+      0,0
+    
+    702
+    1
+    646
+    564
+    2
+  
+
+

From 251abdda29e2a89867d050d47cb4436b5bc80166 Mon Sep 17 00:00:00 2001
From: harald 
Date: Wed, 5 Mar 2014 14:34:58 +0100
Subject: [PATCH 119/345] simplified led resource to one led actuator

---
 examples/osd/merkurboard/er-example-server.c | 43 +++++++-------------
 examples/osd/merkurboard/project-conf.h      |  2 +-
 2 files changed, 15 insertions(+), 30 deletions(-)

diff --git a/examples/osd/merkurboard/er-example-server.c b/examples/osd/merkurboard/er-example-server.c
index 873024511..ed69c9a88 100644
--- a/examples/osd/merkurboard/er-example-server.c
+++ b/examples/osd/merkurboard/er-example-server.c
@@ -96,7 +96,7 @@ Appendix A.  Profile example
 /* Define which resources to include to meet memory constraints. */
 #define REST_RES_INFO 1
 #define REST_RES_EVENT 1
-#define REST_RES_LEDS 1
+#define REST_RES_LED 1
 #define REST_RES_TOGGLE 1
 #define REST_RES_BATTERY 1
 
@@ -105,7 +105,7 @@ Appendix A.  Profile example
 #if defined (PLATFORM_HAS_BUTTON)
 #include "dev/button-sensor.h"
 #endif
-#if defined (PLATFORM_HAS_LEDS)
+#if defined (PLATFORM_HAS_LED)
 #include "dev/leds.h"
 #endif
 #if defined (PLATFORM_HAS_BATTERY)
@@ -144,7 +144,7 @@ Appendix A.  Profile example
  * Resources are defined by the RESOURCE macro.
  * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
  */
-RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"simple.dev.n"");
+RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"simple.dev.n\"");
 
 /*
  * A handler function named [resource name]_handler must be implemented for each RESOURCE.
@@ -217,36 +217,21 @@ event_event_handler(resource_t *r)
 
 
 /******************************************************************************/
-#if defined (PLATFORM_HAS_LEDS)
+#if defined (PLATFORM_HAS_LED)
 /******************************************************************************/
-#if REST_RES_LEDS
+#if REST_RES_LED
 /*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/
-RESOURCE(leds, METHOD_POST | METHOD_PUT , "a/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\"");
+RESOURCE(led, METHOD_POST | METHOD_PUT , "a/led", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\"");
 
 void
-leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+led_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
 {
   size_t len = 0;
-  const char *color = NULL;
   const char *mode = NULL;
   uint8_t led = 0;
   int success = 1;
 
-  if ((len=REST.get_query_variable(request, "color", &color))) {
-    PRINTF("color %.*s\n", len, color);
-
-    if (strncmp(color, "r", len)==0) {
-      led = LEDS_RED;
-    } else if(strncmp(color,"g", len)==0) {
-      led = LEDS_GREEN;
-    } else if (strncmp(color,"b", len)==0) {
-      led = LEDS_BLUE;
-    } else {
-      success = 0;
-    }
-  } else {
-    success = 0;
-  }
+  led = LEDS_RED;
 
   if (success && (len=REST.get_post_variable(request, "mode", &mode))) {
     PRINTF("mode %s\n", mode);
@@ -278,7 +263,7 @@ toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre
   leds_toggle(LEDS_RED);
 }
 #endif
-#endif /* PLATFORM_HAS_LEDS */
+#endif /* PLATFORM_HAS_LED */
 
 /******************************************************************************/
 #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY)
@@ -318,7 +303,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr
 void 
 hw_init()
 {
-#if defined (PLATFORM_HAS_LEDS)
+#if defined (PLATFORM_HAS_LED)
  leds_off(LEDS_RED);
 #endif
 }
@@ -357,14 +342,14 @@ PROCESS_THREAD(rest_server_example, ev, data)
   rest_activate_event_resource(&resource_event);
   SENSORS_ACTIVATE(button_sensor);
 #endif
-#if defined (PLATFORM_HAS_LEDS)
-#if REST_RES_LEDS
-  rest_activate_resource(&resource_leds);
+#if defined (PLATFORM_HAS_LED)
+#if REST_RES_LED
+  rest_activate_resource(&resource_led);
 #endif
 #if REST_RES_TOGGLE
   rest_activate_resource(&resource_toggle);
 #endif
-#endif /* PLATFORM_HAS_LEDS */
+#endif /* PLATFORM_HAS_LED */
 #if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY
   SENSORS_ACTIVATE(battery_sensor);
   rest_activate_resource(&resource_battery);
diff --git a/examples/osd/merkurboard/project-conf.h b/examples/osd/merkurboard/project-conf.h
index 2187b48c7..577643dd6 100644
--- a/examples/osd/merkurboard/project-conf.h
+++ b/examples/osd/merkurboard/project-conf.h
@@ -32,7 +32,7 @@
 #ifndef PROJECT_ERBIUM_CONF_H_
 #define PROJECT_ERBIUM_CONF_H_
 
-#define PLATFORM_HAS_LEDS    1
+#define PLATFORM_HAS_LED     1
 #define PLATFORM_HAS_BUTTON  1
 #define PLATFORM_HAS_TEMPERATURE   1
 #define PLATFORM_HAS_BATTERY 1

From 67783600aa15031a239416a1bf300d19f288d659 Mon Sep 17 00:00:00 2001
From: harald 
Date: Tue, 11 Mar 2014 16:28:54 +0100
Subject: [PATCH 120/345] compile all osd-examples

---
 examples/osd/runall.sh | 57 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100755 examples/osd/runall.sh

diff --git a/examples/osd/runall.sh b/examples/osd/runall.sh
new file mode 100755
index 000000000..ab9e9ca92
--- /dev/null
+++ b/examples/osd/runall.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+
+# er-rest-example-merkurboard
+echo "merkurboard"
+cd ./merkurboard
+./run.sh
+cd ..
+echo "done (merkurboard)"
+
+# er-rest-example-merkurboard
+echo "er-rest-example-merkurboard"
+cd ./er-rest-example-merkurboard
+./run.sh
+cd ..
+echo "done (er-rest-example-merkurboard)"
+
+# Climate
+echo "Climate"
+cd ./climate
+./run.sh
+cd ..
+echo "done (Climate)"
+
+# Embeddvm
+echo "Embedded-VM"
+cd ./embedd-vm-merkurboard
+./run.sh
+cd ..
+echo "done (Emedded-VM)"
+
+# Powerbox-4
+echo "Powerbox-4"
+cd ./powerbox
+./run.sh
+cd ..
+echo "done (Powerbox-4)"
+
+# Pingtheplug
+echo "Pingtheplug"
+cd ./pingtheplug
+./run.sh
+cd ..
+echo "done (Pingtheplug)"
+
+# 6lowpan-tk
+#echo "6loWPAN-Tür/Fenster Kontakt"
+#cd ./6lowpan-tk
+#./run.sh
+#cd ..
+#echo "done (6loWPAN-Tür/Fenster Kontakt)"
+
+# PIR-Sensor
+#echo "PIR-Sensor"
+#cd ./pir-sensor
+#./run.sh
+#cd ..
+#echo "done (PIR-Sensor)"

From bf6f3886914b5e8bee9cf03ea1f567ea1c91ec98 Mon Sep 17 00:00:00 2001
From: Marcus Priesch 
Date: Wed, 12 Mar 2014 12:29:33 +0100
Subject: [PATCH 121/345] initial check in

---
 examples/osd/dual-rgbw-actor/Makefile         |  93 ++++++
 examples/osd/dual-rgbw-actor/README           |  76 +++++
 .../doc/ledStripe_board_btm.pdf               | Bin 0 -> 18271 bytes
 .../doc/ledStripe_schematics.pdf              | Bin 0 -> 42489 bytes
 .../osd/dual-rgbw-actor/er-example-server.c   | 265 ++++++++++++++++++
 examples/osd/dual-rgbw-actor/flash.sh         |   2 +
 examples/osd/dual-rgbw-actor/project-conf.h   |  99 +++++++
 examples/osd/dual-rgbw-actor/run.sh           |   6 +
 .../osd/dual-rgbw-actor/server-client.csc     | 227 +++++++++++++++
 examples/osd/dual-rgbw-actor/server-only.csc  | 189 +++++++++++++
 .../osd/dual-rgbw-actor/t4-servo-config.h     |  65 +++++
 .../osd/dual-rgbw-actor/t4-servo-hardware.h   |  48 ++++
 .../osd/dual-rgbw-actor/t4-servo-sensors.h    |  78 ++++++
 13 files changed, 1148 insertions(+)
 create mode 100644 examples/osd/dual-rgbw-actor/Makefile
 create mode 100644 examples/osd/dual-rgbw-actor/README
 create mode 100644 examples/osd/dual-rgbw-actor/doc/ledStripe_board_btm.pdf
 create mode 100644 examples/osd/dual-rgbw-actor/doc/ledStripe_schematics.pdf
 create mode 100644 examples/osd/dual-rgbw-actor/er-example-server.c
 create mode 100755 examples/osd/dual-rgbw-actor/flash.sh
 create mode 100644 examples/osd/dual-rgbw-actor/project-conf.h
 create mode 100755 examples/osd/dual-rgbw-actor/run.sh
 create mode 100644 examples/osd/dual-rgbw-actor/server-client.csc
 create mode 100644 examples/osd/dual-rgbw-actor/server-only.csc
 create mode 100644 examples/osd/dual-rgbw-actor/t4-servo-config.h
 create mode 100644 examples/osd/dual-rgbw-actor/t4-servo-hardware.h
 create mode 100644 examples/osd/dual-rgbw-actor/t4-servo-sensors.h

diff --git a/examples/osd/dual-rgbw-actor/Makefile b/examples/osd/dual-rgbw-actor/Makefile
new file mode 100644
index 000000000..87efba905
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/Makefile
@@ -0,0 +1,93 @@
+all: er-example-server
+# use this target explicitly if requried: er-plugtest-server
+
+# variable for this Makefile
+# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
+WITH_COAP=13
+
+# for some platforms
+UIP_CONF_IPV6=1
+# IPv6 make config disappeared completely
+CFLAGS += -DUIP_CONF_IPV6=1
+
+CONTIKI=../../..
+CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
+
+# variable for Makefile.include
+ifneq ($(TARGET), minimal-net)
+CFLAGS += -DUIP_CONF_IPV6_RPL=1
+else
+# minimal-net does not support RPL under Linux and is mostly used to test CoAP only
+${info INFO: compiling without RPL}
+CFLAGS += -DUIP_CONF_IPV6_RPL=0
+CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\"
+${info INFO: compiling with large buffers}
+CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048
+CFLAGS += -DREST_MAX_CHUNK_SIZE=1024
+CFLAGS += -DCOAP_MAX_HEADER_SIZE=640
+endif
+
+# linker optimizations
+SMALL=1
+
+# REST framework, requires WITH_COAP
+ifeq ($(WITH_COAP), 13)
+${info INFO: compiling with CoAP-13}
+CFLAGS += -DWITH_COAP=13
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-13
+else ifeq ($(WITH_COAP), 12)
+${info INFO: compiling with CoAP-12}
+CFLAGS += -DWITH_COAP=12
+CFLAGS += -DREST=coap_rest_implementation
+CFLAGS += -DUIP_CONF_TCP=0
+APPS += er-coap-12
+else 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
+
+connect-minimal:
+	sudo ip address add fdfd::1/64 dev tap0
diff --git a/examples/osd/dual-rgbw-actor/README b/examples/osd/dual-rgbw-actor/README
new file mode 100644
index 000000000..84d7dd2f4
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/README
@@ -0,0 +1,76 @@
+A Quick Introduction to the Erbium (Er) REST Engine
+===================================================
+Compile the Example
+-------------------
+./run.sh
+
+OSD-Merkur Board
+----------------------
+write the images to the OSD-Merkur Board:
+
+./flash.sh
+
+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
+
+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)
diff --git a/examples/osd/dual-rgbw-actor/doc/ledStripe_board_btm.pdf b/examples/osd/dual-rgbw-actor/doc/ledStripe_board_btm.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..a54f23313adef176b876b0e0cae51c7e45211fab
GIT binary patch
literal 18271
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

literal 0
HcmV?d00001

diff --git a/examples/osd/dual-rgbw-actor/doc/ledStripe_schematics.pdf b/examples/osd/dual-rgbw-actor/doc/ledStripe_schematics.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..12556862d0feb47880d8bea0d65a74f814ce85b4
GIT binary patch
literal 42489
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
z
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
Q8VMH@W8~*oJg>y~U*>v{5dZ)H

literal 0
HcmV?d00001

diff --git a/examples/osd/dual-rgbw-actor/er-example-server.c b/examples/osd/dual-rgbw-actor/er-example-server.c
new file mode 100644
index 000000000..9fb587974
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/er-example-server.c
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2011-2014, 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) Dual RGBW Led REST Engine example (with CoAP-specific code)
+ * \author
+ *      Matthias Kovatsch 
+ *      Harald Pichler 
+ *      Marcus Priesch 
+ */
+
+#include 
+#include 
+#include 
+#include "contiki.h"
+#include "contiki-net.h"
+#include "erbium.h"
+
+#include "dev/t4-servo-sensor.h"
+
+/* For CoAP-specific example: not required for normal RESTful Web service. */
+#if WITH_COAP == 3
+#include "er-coap-03.h"
+#elif WITH_COAP == 7
+#include "er-coap-07.h"
+#elif WITH_COAP == 12
+#include "er-coap-12.h"
+#elif WITH_COAP == 13
+#include "er-coap-13.h"
+#else
+#warning "Erbium example without CoAP-specifc functionality"
+#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
+
+/******************************************************************************/
+/*
+ * Resources are defined by the RESOURCE macro.
+ * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
+ */
+RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\"");
+
+/*
+ * A handler function named [resource name]_handler must be implemented for each RESOURCE.
+ * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
+ * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
+ * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
+ */
+void
+info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  char message[100];
+  int index = 0;
+  int length = 0; /*           |<-------->| */
+
+  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
+       // jSON Format
+     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n");
+     index += sprintf(message + index," \"name\" : \"Dual RGBW Led Actor\"\n");
+     index += sprintf(message + index,"}\n");
+
+    length = strlen(message);
+    memcpy(buffer, message,length );
+
+  REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+  REST.set_response_payload(response, buffer, length);
+}
+
+RESOURCE(t4_servo, METHOD_GET | METHOD_PUT , "a/dual_rgbw_led", "title=\"Dual RGBW Led Actor\";rt=\"dual_rgbw_led\"");
+void
+t4_servo_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  int success = 1;
+
+  char temp[100];
+  int index = 0;
+  int length = 0;
+  const char *value = NULL;
+  size_t len = 0;
+
+  int r1 = t4_servo_sensor.value(0);
+  int g1 = t4_servo_sensor.value(1);
+  int b1 = t4_servo_sensor.value(2);
+  int w1 = t4_servo_sensor.value(3);
+  int r2 = t4_servo_sensor.value(4);
+  int g2 = t4_servo_sensor.value(5);
+  int b2 = t4_servo_sensor.value(6);
+  int w2 = t4_servo_sensor.value(7);
+
+  switch(REST.get_method_type(request)){
+   case METHOD_GET:
+     // jSON Format
+     index += sprintf(temp + index,"{\"r1\":%d,", r1);
+     index += sprintf(temp + index, "\"g1\":%d,", g1);
+     index += sprintf(temp + index, "\"b1\":%d,", b1);
+     index += sprintf(temp + index, "\"w1\":%d,", w1);
+     index += sprintf(temp + index, "\"r2\":%d,", r2);
+     index += sprintf(temp + index, "\"g2\":%d,", g2);
+     index += sprintf(temp + index, "\"b2\":%d,", b2);
+     index += sprintf(temp + index, "\"w2\":%d,", w2);
+     index += sprintf(temp + index,"}\n");
+
+     length = strlen(temp);
+     memcpy(buffer, temp, length);
+
+     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+     REST.set_response_payload(response, buffer, length);
+
+     break;
+
+   case METHOD_POST:
+     success = 0;
+     break;
+
+   case METHOD_PUT:
+     // Note that we have to set all at once:
+     // red=255&green=255&blue=255&white=255
+     // otherwise we get "bad request"
+     if (success &&  (len=REST.get_post_variable(request, "r1", &value))) {
+       t4_servo_sensor.configure(0,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+
+     if (success &&  (len=REST.get_post_variable(request, "g1", &value))) {
+       t4_servo_sensor.configure(1,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+
+     if (success &&  (len=REST.get_post_variable(request, "b1", &value))) {
+       t4_servo_sensor.configure(2,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+
+     if (success &&  (len=REST.get_post_variable(request, "w1", &value))) {
+       t4_servo_sensor.configure(3,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+
+     if (success &&  (len=REST.get_post_variable(request, "r2", &value)))
+     {
+       t4_servo_sensor.configure(4,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+
+     if (success &&  (len=REST.get_post_variable(request, "g2", &value))) {
+       t4_servo_sensor.configure(5,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+
+     if (success &&  (len=REST.get_post_variable(request, "b2", &value))) {
+       t4_servo_sensor.configure(6,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+
+     if (success &&  (len=REST.get_post_variable(request, "w2", &value))) {
+       t4_servo_sensor.configure(7,(unsigned char) atoi(value));
+     } else {
+       success = 0;
+     }
+     break;
+
+  default:
+    success = 0;
+  }
+
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+
+void
+hw_init()
+{
+}
+
+PROCESS(rest_server_example, "Erbium Example Server");
+
+AUTOSTART_PROCESSES(&rest_server_example, &sensors_process);
+
+PROCESS_THREAD(rest_server_example, ev, data)
+{
+  PROCESS_BEGIN();
+  PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE)
+  set_global_address();
+  configure_routing();
+#endif
+
+  /* Initialize the OSD Hardware. */
+  hw_init();
+  /* Initialize the REST engine. */
+  rest_init_engine();
+
+  /* Activate the application-specific resources. */
+  rest_activate_resource(&resource_info);
+
+  SENSORS_ACTIVATE(t4_servo_sensor);
+  rest_activate_resource(&resource_t4_servo);
+
+  /* Define application-specific events here. */
+  while(1) {
+    PROCESS_WAIT_EVENT();
+  }
+
+  PROCESS_END();
+}
diff --git a/examples/osd/dual-rgbw-actor/flash.sh b/examples/osd/dual-rgbw-actor/flash.sh
new file mode 100755
index 000000000..060c0bb39
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/flash.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+avrdude -V -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a
diff --git a/examples/osd/dual-rgbw-actor/project-conf.h b/examples/osd/dual-rgbw-actor/project-conf.h
new file mode 100644
index 000000000..b5ef8c215
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/project-conf.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2010-2014, 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
+
+/* Dont allow MCU sleeping between channel checks */
+#undef RDC_CONF_MCU_SLEEP
+#define RDC_CONF_MCU_SLEEP       0
+
+/* Some platforms have weird includes. */
+#undef IEEE802154_CONF_PANID
+
+/* 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
+
+/* Increase rpl-border-router IP-buffer when using more than 64. */
+#undef REST_MAX_CHUNK_SIZE
+#define REST_MAX_CHUNK_SIZE    64
+
+/* Estimate your header size, especially when using Proxy-Uri. */
+/*
+#undef COAP_MAX_HEADER_SIZE
+#define COAP_MAX_HEADER_SIZE    70
+*/
+
+/* The IP buffer size must fit all other hops, in particular the border router. */
+
+#undef UIP_CONF_BUFFER_SIZE
+#define UIP_CONF_BUFFER_SIZE    512
+
+
+/* Multiplies with chunk size, be aware of memory constraints. */
+#undef COAP_MAX_OPEN_TRANSACTIONS
+#define COAP_MAX_OPEN_TRANSACTIONS   8
+
+/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */
+/*
+#undef COAP_MAX_OBSERVERS
+#define COAP_MAX_OBSERVERS      2
+*/
+
+/* Filtering .well-known/core per query can be disabled to save space. */
+/*
+#undef COAP_LINK_FORMAT_FILTERING
+#define COAP_LINK_FORMAT_FILTERING      0
+*/
+
+/* Save some memory for the sky platform. */
+/*
+#undef NBR_TABLE_CONF_MAX_NEIGHBORS
+#define NBR_TABLE_CONF_MAX_NEIGHBORS     10
+#undef UIP_CONF_MAX_ROUTES
+#define UIP_CONF_MAX_ROUTES   10
+*/
+
+/* Reduce 802.15.4 frame queue to save RAM. */
+/*
+#undef QUEUEBUF_CONF_NUM
+#define QUEUEBUF_CONF_NUM       4
+*/
+
+/*
+#undef SICSLOWPAN_CONF_FRAG
+#define SICSLOWPAN_CONF_FRAG	1
+*/
+#endif /* PROJECT_ERBIUM_CONF_H_ */
diff --git a/examples/osd/dual-rgbw-actor/run.sh b/examples/osd/dual-rgbw-actor/run.sh
new file mode 100755
index 000000000..b2cd87d5e
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/run.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+#make clean TARGET=osd-merkur
+make -j TARGET=osd-merkur
+#avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur
+avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex
+avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep
diff --git a/examples/osd/dual-rgbw-actor/server-client.csc b/examples/osd/dual-rgbw-actor/server-client.csc
new file mode 100644
index 000000000..8c45fdf02
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/server-client.csc
@@ -0,0 +1,227 @@
+
+
+  [CONTIKI_DIR]/tools/cooja/apps/mrm
+  [CONTIKI_DIR]/tools/cooja/apps/mspsim
+  [CONTIKI_DIR]/tools/cooja/apps/avrora
+  [CONTIKI_DIR]/tools/cooja/apps/serial_socket
+  [CONTIKI_DIR]/tools/cooja/apps/collect-view
+  
+    REST with RPL router
+    -2147483648
+    123456
+    1000000
+    
+      se.sics.cooja.radiomediums.UDGM
+      50.0
+      50.0
+      1.0
+      1.0
+    
+    
+      40000
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      rplroot
+      Sky RPL Root
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
+      make border-router.sky TARGET=sky
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.SkyByteRadio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      server
+      Erbium Server
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
+      make er-example-server.sky TARGET=sky
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.SkyByteRadio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      client
+      Erbium Client
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c
+      make er-example-client.sky TARGET=sky
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.SkyByteRadio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        33.260163187353555
+        30.643217359962595
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        1
+      
+      rplroot
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        46.57186415376375
+        40.35946215910942
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        2
+      
+      server
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        18.638049428485125
+        47.55034515769599
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        3
+      
+      client
+    
+  
+  
+    se.sics.cooja.plugins.SimControl
+    259
+    0
+    179
+    0
+    0
+  
+  
+    se.sics.cooja.plugins.Visualizer
+    
+      se.sics.cooja.plugins.skins.IDVisualizerSkin
+      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
+      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
+      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
+      se.sics.cooja.plugins.skins.LEDVisualizerSkin
+      se.sics.cooja.plugins.skins.AddressVisualizerSkin
+      3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351
+    
+    300
+    2
+    178
+    261
+    1
+  
+  
+    se.sics.cooja.plugins.LogListener
+    
+      
+      
+    
+    762
+    3
+    491
+    2
+    182
+  
+  
+    se.sics.cooja.plugins.RadioLogger
+    
+      150
+      
+    
+    451
+    -1
+    305
+    73
+    140
+    true
+  
+  
+    SerialSocketServer
+    0
+    422
+    4
+    74
+    578
+    18
+  
+  
+    se.sics.cooja.plugins.TimeLine
+    
+      0
+      1
+      2
+      
+      
+      
+      
+      125
+      25.49079397896416
+    
+    1624
+    5
+    252
+    6
+    712
+  
+  
+    se.sics.cooja.plugins.MoteInterfaceViewer
+    2
+    
+      Serial port
+      0,0
+    
+    853
+    1
+    491
+    765
+    182
+  
+
+
diff --git a/examples/osd/dual-rgbw-actor/server-only.csc b/examples/osd/dual-rgbw-actor/server-only.csc
new file mode 100644
index 000000000..d5eee34d6
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/server-only.csc
@@ -0,0 +1,189 @@
+
+
+  [CONTIKI_DIR]/tools/cooja/apps/mrm
+  [CONTIKI_DIR]/tools/cooja/apps/mspsim
+  [CONTIKI_DIR]/tools/cooja/apps/avrora
+  [CONTIKI_DIR]/tools/cooja/apps/serial_socket
+  [CONTIKI_DIR]/tools/cooja/apps/collect-view
+  
+    REST with RPL router
+    -2147483648
+    123456
+    1000000
+    
+      se.sics.cooja.radiomediums.UDGM
+      50.0
+      50.0
+      1.0
+      1.0
+    
+    
+      40000
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      rplroot
+      Sky RPL Root
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c
+      make border-router.sky TARGET=sky
+      [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.SkyByteRadio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      se.sics.cooja.mspmote.SkyMoteType
+      server
+      Erbium Server
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c
+      make er-example-server.sky TARGET=sky
+      [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky
+      se.sics.cooja.interfaces.Position
+      se.sics.cooja.interfaces.RimeAddress
+      se.sics.cooja.interfaces.IPAddress
+      se.sics.cooja.interfaces.Mote2MoteRelations
+      se.sics.cooja.interfaces.MoteAttributes
+      se.sics.cooja.mspmote.interfaces.MspClock
+      se.sics.cooja.mspmote.interfaces.MspMoteID
+      se.sics.cooja.mspmote.interfaces.SkyButton
+      se.sics.cooja.mspmote.interfaces.SkyFlash
+      se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem
+      se.sics.cooja.mspmote.interfaces.SkyByteRadio
+      se.sics.cooja.mspmote.interfaces.MspSerial
+      se.sics.cooja.mspmote.interfaces.SkyLED
+      se.sics.cooja.mspmote.interfaces.MspDebugOutput
+      se.sics.cooja.mspmote.interfaces.SkyTemperature
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        33.260163187353555
+        30.643217359962595
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        1
+      
+      rplroot
+    
+    
+      
+      
+        se.sics.cooja.interfaces.Position
+        35.100895239785295
+        39.70574552287428
+        0.0
+      
+      
+        se.sics.cooja.mspmote.interfaces.MspMoteID
+        2
+      
+      server
+    
+  
+  
+    se.sics.cooja.plugins.SimControl
+    259
+    5
+    179
+    0
+    0
+  
+  
+    se.sics.cooja.plugins.Visualizer
+    
+      se.sics.cooja.plugins.skins.IDVisualizerSkin
+      se.sics.cooja.plugins.skins.UDGMVisualizerSkin
+      se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin
+      se.sics.cooja.plugins.skins.AttributeVisualizerSkin
+      se.sics.cooja.plugins.skins.LEDVisualizerSkin
+      se.sics.cooja.plugins.skins.AddressVisualizerSkin
+      7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535
+    
+    300
+    4
+    175
+    263
+    3
+  
+  
+    se.sics.cooja.plugins.LogListener
+    
+      
+      
+    
+    560
+    1
+    326
+    1
+    293
+  
+  
+    se.sics.cooja.plugins.RadioLogger
+    
+      150
+      
+    
+    451
+    -1
+    305
+    73
+    140
+    true
+  
+  
+    SerialSocketServer
+    0
+    422
+    2
+    74
+    39
+    199
+  
+  
+    se.sics.cooja.plugins.TimeLine
+    
+      0
+      1
+      
+      
+      
+      
+      125
+      25.49079397896416
+    
+    1624
+    3
+    252
+    4
+    622
+  
+  
+    se.sics.cooja.plugins.MoteInterfaceViewer
+    1
+    
+      Serial port
+      0,0
+    
+    702
+    0
+    646
+    564
+    2
+  
+
+
diff --git a/examples/osd/dual-rgbw-actor/t4-servo-config.h b/examples/osd/dual-rgbw-actor/t4-servo-config.h
new file mode 100644
index 000000000..1c5ee8b26
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/t4-servo-config.h
@@ -0,0 +1,65 @@
+// Copyright (C) 2014 Marcus Priesch, All rights reserved
+// In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
+// ****************************************************************************
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// ****************************************************************************
+//
+//++
+// Name
+//    t4-servo-config
+//
+// Purpose
+//    configuration for t4-servo
+//
+// Revision Dates
+//    10-Mar-2014 (MPR) Creation
+//    ««revision-date»»···
+//--
+
+#include 
+
+#ifndef __T4_SERVO_CONFIG_H__
+#define __T4_SERVO_CONFIG_H__ 1
+
+// timing: (X:pwm, _:zero)
+//
+//  X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX
+//
+//  |<------------->|<--------->|<------------->|<--------->| ...
+//    SERVO_OFFSET    SERVO_MAX   SERVO_OFFSET    SERVO_MAX
+//
+//  within SERVO_MAX you get the PWM set with servo_set (id, pwm)
+//  if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle
+//
+//  the period of the smallest tick is derived from the timer4 prescaler
+//  plus the ISR overhead. however, the latter one should be constant
+//  regardless of the pwm signal generated
+
+#define SERVO_OFFSET 0
+#define SERVO_MIN 0
+#define SERVO_MAX 64
+
+// Counter value for timer 4 without any prescaler for a single tick
+#define PWMFREQ 200
+
+#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ
+
+#define SERVO_COUNT 8
+
+#define T4_SENSOR_NAME "Dual RGBW Led"
+
+#endif
+
+
diff --git a/examples/osd/dual-rgbw-actor/t4-servo-hardware.h b/examples/osd/dual-rgbw-actor/t4-servo-hardware.h
new file mode 100644
index 000000000..98d3c01d7
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/t4-servo-hardware.h
@@ -0,0 +1,48 @@
+// Copyright (C) 2014 Marcus Priesch, All rights reserved
+// In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
+// ****************************************************************************
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// ****************************************************************************
+//
+//++
+// Name
+//    t4-servo-hardware
+//
+// Purpose
+//    configuration for t4-servo
+//
+// Revision Dates
+//    10-Mar-2014 (MPR) Creation
+//    ««revision-date»»···
+//--
+
+#include 
+
+#ifndef __T4_SERVO_HARDWARE_H__
+#define __T4_SERVO_HARDWARE_H__ 1
+
+static servo_channel_type servo_channels [] =
+{ /* PORTx, DDRx, PINxn, PWM */
+  {0x05, 0x04, PINB7, 0} // r
+, {0x0E, 0x0D, PINE2, 0} // g
+, {0x05, 0x04, PINB6, 0} // b
+, {0x05, 0x04, PINB5, 0} // w
+, {0x05, 0x04, PINB1, 0} // r
+, {0x05, 0x04, PINB0, 0} // g
+, {0x05, 0x04, PINB2, 0} // b
+, {0x05, 0x04, PINB3, 0} // w
+};
+
+#endif
diff --git a/examples/osd/dual-rgbw-actor/t4-servo-sensors.h b/examples/osd/dual-rgbw-actor/t4-servo-sensors.h
new file mode 100644
index 000000000..b07b5a677
--- /dev/null
+++ b/examples/osd/dual-rgbw-actor/t4-servo-sensors.h
@@ -0,0 +1,78 @@
+//os_fname_map// t4-servo-config:h:h
+// Copyright (C) 2014 Marcus Priesch, All rights reserved
+// In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
+// ****************************************************************************
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// ****************************************************************************
+//
+//++
+// Name
+//    t4-servo-config
+//
+// Purpose
+//    configuration for t4-servo
+//
+// Revision Dates
+//    10-Mar-2014 (MPR) Creation
+//    ««revision-date»»···
+//--
+
+#include 
+
+#ifndef __T4_SERVO_CONFIG_H__
+#define __T4_SERVO_CONFIG_H__ 1
+
+// timing: (X:pwm, _:zero)
+//
+//  X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX
+//
+//  |<------------->|<--------->|<------------->|<--------->| ...
+//    SERVO_OFFSET    SERVO_MAX   SERVO_OFFSET    SERVO_MAX
+//
+//  within SERVO_MAX you get the PWM set with servo_set (id, pwm)
+//  if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle
+//
+//  the period of the smallest tick is derived from the timer4 prescaler
+//  plus the ISR overhead. however, the latter one should be constant
+//  regardless of the pwm signal generated
+
+#define SERVO_OFFSET 0
+#define SERVO_MIN 0
+#define SERVO_MAX 255
+
+// Counter value for timer 4 without any prescaler for a single tick
+#define PWMFREQ 500
+#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ
+
+#define SERVO_COUNT 8
+
+#define T4_SENSOR_NAME "Dual RGBW Led"
+
+#ifndef servo_channels_defined
+#define servo_channels_defined
+static servo_channel_type servo_channels [SERVO_COUNT] =
+{ {0x0E, 0x0D, PINE2, 0}
+, {0x0B, 0x0D, PINB7, 0}
+, {0x0B, 0x0D, PINB6, 0}
+, {0x0B, 0x0D, PINB5, 0}
+, {0x0B, 0x0D, PINB0, 0}
+, {0x0B, 0x0D, PINB1, 0}
+, {0x0B, 0x0D, PINB2, 0}
+, {0x0B, 0x0D, PINB3, 0}
+};
+#endif
+#endif
+
+

From 992e54fe25427a820e5ccc93e2c128bf9dcef6d8 Mon Sep 17 00:00:00 2001
From: Marcus Priesch 
Date: Wed, 12 Mar 2014 12:34:23 +0100
Subject: [PATCH 122/345] Factored to support configurable amount of pwm's,
 fixes

---
 examples/osd/dual-rgbw-actor/Makefile         |   2 +-
 examples/osd/dual-rgbw-actor/flash.sh         |   2 +-
 .../osd/dual-rgbw-actor/t4-servo-hardware.h   |  16 +-
 .../osd/dual-rgbw-actor/t4-servo-sensors.h    |  78 -----
 platform/osd-merkur/dev/t4-servo-sensor.c     | 214 ++++++-------
 platform/osd-merkur/dev/t4-servo-sensor.h     | 123 ++++----
 platform/osd-merkur/dev/t4-servo.c            | 289 +++++++++---------
 platform/osd-merkur/dev/t4-servo.h            | 157 ++++------
 8 files changed, 363 insertions(+), 518 deletions(-)
 delete mode 100644 examples/osd/dual-rgbw-actor/t4-servo-sensors.h

diff --git a/examples/osd/dual-rgbw-actor/Makefile b/examples/osd/dual-rgbw-actor/Makefile
index 87efba905..1305e71b9 100644
--- a/examples/osd/dual-rgbw-actor/Makefile
+++ b/examples/osd/dual-rgbw-actor/Makefile
@@ -3,7 +3,7 @@ all: er-example-server
 
 # variable for this Makefile
 # configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08)
-WITH_COAP=13
+WITH_COAP=7
 
 # for some platforms
 UIP_CONF_IPV6=1
diff --git a/examples/osd/dual-rgbw-actor/flash.sh b/examples/osd/dual-rgbw-actor/flash.sh
index 060c0bb39..b91668634 100755
--- a/examples/osd/dual-rgbw-actor/flash.sh
+++ b/examples/osd/dual-rgbw-actor/flash.sh
@@ -1,2 +1,2 @@
 #!/bin/bash
-avrdude -V -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a
+avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a
diff --git a/examples/osd/dual-rgbw-actor/t4-servo-hardware.h b/examples/osd/dual-rgbw-actor/t4-servo-hardware.h
index 98d3c01d7..65438f1af 100644
--- a/examples/osd/dual-rgbw-actor/t4-servo-hardware.h
+++ b/examples/osd/dual-rgbw-actor/t4-servo-hardware.h
@@ -35,14 +35,14 @@
 
 static servo_channel_type servo_channels [] =
 { /* PORTx, DDRx, PINxn, PWM */
-  {0x05, 0x04, PINB7, 0} // r
-, {0x0E, 0x0D, PINE2, 0} // g
-, {0x05, 0x04, PINB6, 0} // b
-, {0x05, 0x04, PINB5, 0} // w
-, {0x05, 0x04, PINB1, 0} // r
-, {0x05, 0x04, PINB0, 0} // g
-, {0x05, 0x04, PINB2, 0} // b
-, {0x05, 0x04, PINB3, 0} // w
+  {0x05, 0x04, 1 << PINB7, 0} // r1
+, {0x0E, 0x0D, 1 << PINE2, 0} // g1
+, {0x05, 0x04, 1 << PINB6, 0} // b1
+, {0x05, 0x04, 1 << PINB5, 0} // w1
+, {0x05, 0x04, 1 << PINB1, 0} // r2
+, {0x05, 0x04, 1 << PINB0, 0} // g2
+, {0x05, 0x04, 1 << PINB2, 0} // b2
+, {0x05, 0x04, 1 << PINB3, 0} // w2
 };
 
 #endif
diff --git a/examples/osd/dual-rgbw-actor/t4-servo-sensors.h b/examples/osd/dual-rgbw-actor/t4-servo-sensors.h
deleted file mode 100644
index b07b5a677..000000000
--- a/examples/osd/dual-rgbw-actor/t4-servo-sensors.h
+++ /dev/null
@@ -1,78 +0,0 @@
-//os_fname_map// t4-servo-config:h:h
-// Copyright (C) 2014 Marcus Priesch, All rights reserved
-// In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
-// ****************************************************************************
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-// ****************************************************************************
-//
-//++
-// Name
-//    t4-servo-config
-//
-// Purpose
-//    configuration for t4-servo
-//
-// Revision Dates
-//    10-Mar-2014 (MPR) Creation
-//    ««revision-date»»···
-//--
-
-#include 
-
-#ifndef __T4_SERVO_CONFIG_H__
-#define __T4_SERVO_CONFIG_H__ 1
-
-// timing: (X:pwm, _:zero)
-//
-//  X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX
-//
-//  |<------------->|<--------->|<------------->|<--------->| ...
-//    SERVO_OFFSET    SERVO_MAX   SERVO_OFFSET    SERVO_MAX
-//
-//  within SERVO_MAX you get the PWM set with servo_set (id, pwm)
-//  if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle
-//
-//  the period of the smallest tick is derived from the timer4 prescaler
-//  plus the ISR overhead. however, the latter one should be constant
-//  regardless of the pwm signal generated
-
-#define SERVO_OFFSET 0
-#define SERVO_MIN 0
-#define SERVO_MAX 255
-
-// Counter value for timer 4 without any prescaler for a single tick
-#define PWMFREQ 500
-#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ
-
-#define SERVO_COUNT 8
-
-#define T4_SENSOR_NAME "Dual RGBW Led"
-
-#ifndef servo_channels_defined
-#define servo_channels_defined
-static servo_channel_type servo_channels [SERVO_COUNT] =
-{ {0x0E, 0x0D, PINE2, 0}
-, {0x0B, 0x0D, PINB7, 0}
-, {0x0B, 0x0D, PINB6, 0}
-, {0x0B, 0x0D, PINB5, 0}
-, {0x0B, 0x0D, PINB0, 0}
-, {0x0B, 0x0D, PINB1, 0}
-, {0x0B, 0x0D, PINB2, 0}
-, {0x0B, 0x0D, PINB3, 0}
-};
-#endif
-#endif
-
-
diff --git a/platform/osd-merkur/dev/t4-servo-sensor.c b/platform/osd-merkur/dev/t4-servo-sensor.c
index cbf82306c..a35b2de02 100644
--- a/platform/osd-merkur/dev/t4-servo-sensor.c
+++ b/platform/osd-merkur/dev/t4-servo-sensor.c
@@ -1,113 +1,101 @@
-/*
-** Copyright (C) 2013 Marcus Priesch, All rights reserved
-** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
-**
-** 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.
-**
-**++
-** Name
-**    t4-servo-sensor
-**
-** Purpose
-**    Implements a sensor around t4servo.c
-**
-**
-** Revision Dates
-**    31-Mar-2013 (MPR) Creation
-**    ««revision-date»»···
-**--
-*/
-
-#include "contiki.h"
-#include "dev/t4-servo.h"
-#include "dev/t4-servo-sensor.h"
-
-const struct sensors_sensor t4_servo_sensor;
-static int status(int type);
-static int enabled = 0;
-
-static int value (int channel)
-  {
-    if (channel >= SERVO_COUNT)
-      return -1;
-    else if (channel < 0)
-      return -2;
-    else
-      return t4_servo_get (channel);
-  }
-
-static int configure (int type, int c) // type, c: SENSORS_ACTIVE, 1 -> act.
-                                       // type, c: SENSORS_ACTIVE, 0 -> deact.
-  {
-    switch (type)
-      {
-        case SENSORS_ACTIVE :
-          if (c == 0)
-            {
-              t4_servo_off ();
-            }
-          else if (c == 1)
-            {
-              t4_servo_init ();
-              t4_servo_set_io (0, T4_SENSOR_1_PORT, T4_SENSOR_1_DDR, T4_SENSOR_1_PIN);
-              t4_servo_set_io (1, T4_SENSOR_2_PORT, T4_SENSOR_2_DDR, T4_SENSOR_2_PIN);
-              t4_servo_set_io (2, T4_SENSOR_3_PORT, T4_SENSOR_3_DDR, T4_SENSOR_3_PIN);
-              t4_servo_set_io (3, T4_SENSOR_4_PORT, T4_SENSOR_4_DDR, T4_SENSOR_4_PIN);
-            }
-          break;
-
-        case 0 :
-          t4_servo_set (0, c);
-          break;
-
-        case 1 :
-          t4_servo_set (1, c);
-          break;
-
-        case 2 :
-          t4_servo_set (2, c);
-          break;
-
-        case 3 :
-          t4_servo_set (3, c);
-
-        default:
-          break;
-      }
-    return 0;
-  }
-
-static int status(int type)
-  {
-    switch (type)
-      {
-        case SENSORS_ACTIVE:
-        case SENSORS_READY:
-          return enabled;
-      }
-    return 0;
-  }
-
-SENSORS_SENSOR(t4_servo_sensor, T4_SENSOR_NAME, value, configure, status);
+/*
+** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved
+** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
+**
+** 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.
+**
+**++
+** Name
+**    t4-servo-sensor
+**
+** Purpose
+**    Implements a sensor around t4servo.c
+**
+**
+** Revision Dates
+**    31-Mar-2013 (MPR) Creation
+**    12-Mar-2014 (MPR) Factored to support configurable amount of pwm's
+**    ««revision-date»»···
+**--
+*/
+
+#include "contiki.h"
+#include "dev/t4-servo.h"
+#include "dev/t4-servo-sensor.h"
+
+const struct sensors_sensor t4_servo_sensor;
+
+static int status(int type);
+static int enabled = 0;
+
+static int value (int channel)
+  {
+    if (channel >= SERVO_COUNT)
+      return -1;
+    else if (channel < 0)
+      return -2;
+    else
+      return t4_servo_get (channel);
+  }
+
+static int configure (int type, int c) // type, c: SENSORS_ACTIVE, 1 -> act.
+                                       // type, c: SENSORS_ACTIVE, 0 -> deact.
+  {
+    switch (type)
+      {
+        case SENSORS_ACTIVE :
+          if (c == 0)
+            {
+              t4_servo_off ();
+            }
+          else if (c == 1)
+            {
+              t4_servo_init ();
+            }
+          break;
+
+        default :
+          if (type >= SERVO_COUNT)
+            return -1;
+          else
+            t4_servo_set (type, c);
+          break;
+
+      }
+    return 0;
+  }
+
+static int status(int type)
+  {
+    switch (type)
+      {
+        case SENSORS_ACTIVE:
+        case SENSORS_READY:
+          return enabled;
+      }
+    return 0;
+  }
+
+SENSORS_SENSOR(t4_servo_sensor, T4_SENSOR_NAME, value, configure, status);
diff --git a/platform/osd-merkur/dev/t4-servo-sensor.h b/platform/osd-merkur/dev/t4-servo-sensor.h
index bbbf22adf..099bb4c66 100644
--- a/platform/osd-merkur/dev/t4-servo-sensor.h
+++ b/platform/osd-merkur/dev/t4-servo-sensor.h
@@ -1,71 +1,52 @@
-/*
-** Copyright (C) 2013 Marcus Priesch, All rights reserved
-** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
-**
-** 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.
-**
-**++
-** Name
-**    t4-servo-sensor
-**
-** Purpose
-**    Implements a sensor around t4servo.c
-**
-**
-** Revision Dates
-**    31-Mar-2013 (MPR) Creation
-**    ««revision-date»»···
-**--
-*/
-
-#ifndef __T4_SERVO_SENSOR_H__
-#define __T4_SERVO_SENSOR_H__
-
-#include "lib/sensors.h"
-
-extern const struct sensors_sensor t4_servo_sensor;
-
-#define T4_SENSOR_NAME "T4-Sensor"
-
-#define T4_SENSOR_1_PORT 0x0E
-#define T4_SENSOR_1_DDR  0x0D
-#define T4_SENSOR_1_PIN  PINE4
-
-#define T4_SENSOR_2_PORT 0x0E
-#define T4_SENSOR_2_DDR  0x0D
-#define T4_SENSOR_2_PIN  PINE3
-
-#define T4_SENSOR_3_PORT 0x0E
-#define T4_SENSOR_3_DDR  0x0D
-#define T4_SENSOR_3_PIN  PINE5
-
-#define T4_SENSOR_4_PORT 0x0E
-#define T4_SENSOR_4_DDR  0x0D
-#define T4_SENSOR_4_PIN  PINE6
-
-#endif /* __T4_SERVO_SENSOR_H__ */
-
-
-
+/*
+** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved
+** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
+**
+** 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.
+**
+**++
+** Name
+**    t4-servo-sensor
+**
+** Purpose
+**    Implements a sensor around t4servo.c
+**
+**
+** Revision Dates
+**    31-Mar-2013 (MPR) Creation
+**    12-Mar-2014 (MPR) Factored to support configurable amount of pwm's
+      ««revision-date»»···
+**--
+*/
+
+#ifndef __T4_SERVO_SENSOR_H__
+#define __T4_SERVO_SENSOR_H__
+
+#include "lib/sensors.h"
+#include "t4-servo-config.h"
+
+extern const struct sensors_sensor t4_servo_sensor;
+
+#endif /* __T4_SERVO_SENSOR_H__ */
diff --git a/platform/osd-merkur/dev/t4-servo.c b/platform/osd-merkur/dev/t4-servo.c
index 60a6b7027..45f74ad9b 100644
--- a/platform/osd-merkur/dev/t4-servo.c
+++ b/platform/osd-merkur/dev/t4-servo.c
@@ -1,150 +1,139 @@
-/*
-** Copyright (C) 2013 Marcus Priesch, All rights reserved
-** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
-**
-** 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.
-**
-**++
-** Name
-**    t4-servo
-**
-** Purpose
-**    Implements software pwm on any portpins via timer 4
-**
-**
-** Revision Dates
-**    31-Mar-2013 (MPR) Creation
-**    ��revision-date�����
-**--
-*/
-
-#include "t4-servo.h"
-#include 
-#include 
-#include "led.h"
-
-static servo_channel_type servo_channels [SERVO_COUNT];
-
-// timer 4: CTC OCR4A
-#define WGM4 0x4
-
-void t4_servo_init (void)
-{
-  unsigned char channel;
-
-  for (channel = 0; channel < SERVO_COUNT;  channel ++)
-    {
-      servo_channels [channel].duty = SERVO_MAX/2;
-      t4_servo_set_io (channel, DEFAULT_PORT, DEFAULT_DDR, DEFAULT_PIN);
-    }
-
-  cli ();
-  TCCR4A               = 0x00;
-  TCCR4A_struct.wgm4   =  WGM4 & 0x3;
-  TCCR4B_struct.wgm4   = (WGM4 & 0xc) >> 2;
-  TCCR4B_struct.cs4    = 0x1; // No prescaler
-  TCCR4C               = 0x00;
-  OCR4A                = T4_VALUE;
-  TIMSK4_struct.ocie4a = 1;
-  sei();
-}
-
-void t4_servo_off (void)
-  {
-    TIMSK4_struct.ocie4a = 0;
-  }
-
-int t4_servo_set_io
-  ( unsigned char channel
-  , unsigned char port
-  , unsigned char ddr
-  , unsigned char pin
-  )
-  {
-    if (channel >= SERVO_COUNT)
-      return -1;
-
-    servo_channels [channel].port = port;
-    servo_channels [channel].ddr  = ddr;
-    servo_channels [channel].pin  = 1 << pin;
-
-    _SFR_IO8 (ddr) |= pin;
-
-    return 0;
-  }
-
-int t4_servo_get (unsigned int channel)
-  {
-    if (channel >= SERVO_COUNT)
-      return -1;
-
-    return servo_channels [channel].duty;
-  }
-
-int t4_servo_set (unsigned int channel, unsigned int duty)
-  {
-    if (channel >= SERVO_COUNT)
-      return -1;
-
-    if (duty > SERVO_MAX)
-      return -2;
-
-    if (duty < SERVO_MIN)
-      return -3;
-
-    servo_channels [channel].duty = duty;
-    return 0;
-  }
-
-ISR (TIMER4_COMPA_vect, ISR_NOBLOCK)
-  {
-    unsigned char channel;
-    static unsigned int tick_count = 0;
-
-  cli ();
-    for (channel = 0; channel < SERVO_COUNT;  channel ++)
-      {
-        if (tick_count < servo_channels [channel].duty)
-          {
-            // turn on
-            _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin;
-            _SFR_IO8 (servo_channels [channel].port) |= servo_channels [channel].pin;
-          }
-        else
-          {
-            // turn off
-            _SFR_IO8 (servo_channels [channel].port) &= ~(servo_channels [channel].pin);
-            _SFR_IO8 (servo_channels [channel].ddr ) |=   servo_channels [channel].pin;
-          }
-      }
-
-    tick_count ++;
-
-    if (tick_count >= (SERVO_MAX + SERVO_OFFSET))
-      {
-        tick_count = 0;
-      }
-  sei();
-  }
+/*
+** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved
+** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
+**
+** 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.
+**
+**++
+** Name
+**    t4-servo
+**
+** Purpose
+**    Implements software pwm on any portpins via timer 4
+**
+**
+** Revision Dates
+**    31-Mar-2013 (MPR) Creation
+**    12-Mar-2014 (MPR) Factored to support configurable amount of pwm's
+**    ««revision-date»»···
+**--
+*/
+
+#include "t4-servo.h"
+#include "t4-servo-config.h"
+#include "t4-servo-hardware.h"
+#include 
+#include 
+
+// static servo_channel_type servo_channels [SERVO_COUNT];
+
+// timer 4: CTC OCR4A
+#define WGM4 0x4
+
+void t4_servo_init (void)
+{
+  unsigned char channel;
+
+  for (channel = 0; channel < SERVO_COUNT;  channel ++)
+    {
+      _SFR_IO8 (servo_channels [channel].ddr ) |=   servo_channels [channel].pin;
+      _SFR_IO8 (servo_channels [channel].port) &= ~(servo_channels [channel].pin);
+    }
+
+  cli ();
+  TCCR4A               = 0x00;
+  TCCR4A_struct.wgm4   =  WGM4 & 0x3;
+  TCCR4B_struct.wgm4   = (WGM4 & 0xc) >> 2;
+  TCCR4B_struct.cs4    = 0x1; // No prescaler
+  TCCR4C               = 0x00;
+  OCR4A                = (T4_VALUE);
+  TIMSK4_struct.ocie4a = 1;
+  TIMSK4_struct.toie4  = 1;
+  sei();
+}
+
+void t4_servo_off (void)
+  {
+    TIMSK4_struct.toie4  = 0;
+    TIMSK4_struct.ocie4a = 0;
+  }
+
+int t4_servo_get (unsigned int channel)
+  {
+    if (channel >= SERVO_COUNT)
+      return -1;
+    //printf ("t4_servo_get: %d, %d\n", channel, servo_channels [channel].duty);
+    return servo_channels [channel].duty;
+  }
+
+int t4_servo_set (unsigned int channel, unsigned char duty)
+  {
+    //printf ("t4_servo_set: %d, %d\n", channel, duty);
+
+    if (channel >= SERVO_COUNT)
+      return -1;
+
+    if (duty > SERVO_MAX)
+      return -2;
+
+    if (duty < SERVO_MIN)
+      return -3;
+
+    servo_channels [channel].duty = duty;
+    return 0;
+  }
+
+ISR (TIMER4_COMPA_vect, ISR_NOBLOCK)
+  {
+    unsigned char channel;
+    static unsigned int tick_count = 0;
+
+  cli ();
+    for (channel = 0; channel < SERVO_COUNT;  channel ++)
+      {
+        if (tick_count < servo_channels [channel].duty)
+          {
+            // turn on
+//            _SFR_IO8 (servo_channels [channel].ddr ) |= servo_channels [channel].pin;
+            _SFR_IO8 (servo_channels [channel].port) |= servo_channels [channel].pin;
+          }
+        else
+          {
+            // turn off
+            _SFR_IO8 (servo_channels [channel].port) &= ~(servo_channels [channel].pin);
+//            _SFR_IO8 (servo_channels [channel].ddr ) |=   servo_channels [channel].pin;
+          }
+      }
+
+    tick_count ++;
+
+    if (tick_count >= (SERVO_MAX + SERVO_OFFSET))
+      {
+        tick_count = 0;
+      }
+  sei();
+
+  }
+
diff --git a/platform/osd-merkur/dev/t4-servo.h b/platform/osd-merkur/dev/t4-servo.h
index 72334a088..5acdc4013 100644
--- a/platform/osd-merkur/dev/t4-servo.h
+++ b/platform/osd-merkur/dev/t4-servo.h
@@ -1,96 +1,61 @@
-/*
-** Copyright (C) 2013 Marcus Priesch, All rights reserved
-** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
-**
-** 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.
-**
-**++
-** Name
-**    t4-servo
-**
-** Purpose
-**    Implements software pwm on any portpins via timer 4
-**
-**
-** Revision Dates
-**    31-Mar-2013 (MPR) Creation
-**    ��revision-date�����
-**--
-*/
-
-#ifndef __T4_SERVO_H__
-#define __T4_SERVO_H__
-
-// timing: (X:pwm, _:zero)
-//
-//  X_______________XXXXXXXXXXXXX_______________XXXXXXXXXXXXX
-//
-//  |<------------->|<--------->|<------------->|<--------->| ...
-//    SERVO_OFFSET    SERVO_MAX   SERVO_OFFSET    SERVO_MAX
-//
-//  within SERVO_MAX you get the PWM set with servo_set (id, pwm)
-//  if you set SERVO_OFFSET to zero, you get a pwm from 0 to 100% duty cycle
-//
-//  the period of the smallest tick is derived from the timer4 prescaler
-//  plus the ISR overhead. however, the latter one should be constant
-//  regardless of the pwm signal generated
-
-
-#define SERVO_OFFSET 256
-#define SERVO_MIN 16
-#define SERVO_MAX 32
-
-// Counter value for timer 4 without any prescaler for a single tick
-#define PWMFREQ 500
-#define T4_VALUE F_CPU/SERVO_MAX/PWMFREQ
-
-#define SERVO_COUNT 4
-
-#define DEFAULT_PORT 0x0E
-#define DEFAULT_PIN  1
-#define DEFAULT_DDR  0x0D
-
-typedef struct struct_servo_channel
-{
-  unsigned char port;
-  unsigned char pin;
-  unsigned char ddr;
-  unsigned char duty;
-} servo_channel_type;
-
-void t4_servo_init(void);
-void t4_servo_off(void);
-
-int t4_servo_get(unsigned int channel);
-int t4_servo_set(unsigned int channel, unsigned int duty);
-
-int t4_servo_set_io
-    ( unsigned char channel
-    , unsigned char port
-    , unsigned char ddr
-    , unsigned char pin
-    );
-
-#endif /* __T4_SERVO_H__ */
+/*
+** Copyright (C) 2013-2014 Marcus Priesch, All rights reserved
+** In Prandnern 31, A--2122 Riedenthal, Austria. office@priesch.co.at
+**
+** 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.
+**
+**++
+** Name
+**    t4-servo
+**
+** Purpose
+**    Implements software pwm on any portpins via timer 4
+**
+**
+** Revision Dates
+**    31-Mar-2013 (MPR) Creation
+**    12-Mar-2014 (MPR) Factored to support configurable amount of pwm's
+      ««revision-date»»···
+**--
+*/
+
+#ifndef __T4_SERVO_H__
+#define __T4_SERVO_H__
+
+typedef struct struct_servo_channel
+{
+  unsigned char port;
+  unsigned char ddr;
+  unsigned char pin;
+  unsigned char duty;
+} servo_channel_type;
+
+void t4_servo_init(void);
+void t4_servo_off(void);
+
+int t4_servo_get(unsigned int channel);
+int t4_servo_set(unsigned int channel, unsigned char duty);
+
+#endif /* __T4_SERVO_H__ */

From 86cd1ec02fa8a8c14777db654bb48464b80b0339 Mon Sep 17 00:00:00 2001
From: harald 
Date: Fri, 4 Apr 2014 11:03:53 +0200
Subject: [PATCH 123/345] remove t4 driver  at the moment, config problem

---
 platform/osd-merkur/Makefile.osd-merkur | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur
index 587f1f2ac..ffc1ca03b 100644
--- a/platform/osd-merkur/Makefile.osd-merkur
+++ b/platform/osd-merkur/Makefile.osd-merkur
@@ -21,7 +21,7 @@ CONTIKIAVR=$(CONTIKI)/cpu/avr
 #Needed for SERVO
 CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c
 #Needed for Timer4 Servo
-CONTIKI_TARGET_SOURCEFILES += t4-servo.c t4-servo-sensor.c
+#CONTIKI_TARGET_SOURCEFILES += t4-servo.c t4-servo-sensor.c
 #Needed for Relay 1 to 4
 CONTIKI_TARGET_SOURCEFILES += relay.c relay-sensor.c
 

From f9abb44d6e7390f008e12780de4cdbd583215654 Mon Sep 17 00:00:00 2001
From: harald 
Date: Wed, 9 Apr 2014 16:31:50 +0200
Subject: [PATCH 124/345] add /p/name and p/model resource, remove info

---
 examples/osd/merkurboard/er-example-server.c | 91 ++++++++++++++++++--
 1 file changed, 82 insertions(+), 9 deletions(-)

diff --git a/examples/osd/merkurboard/er-example-server.c b/examples/osd/merkurboard/er-example-server.c
index ed69c9a88..b0741ed77 100644
--- a/examples/osd/merkurboard/er-example-server.c
+++ b/examples/osd/merkurboard/er-example-server.c
@@ -91,10 +91,11 @@ Appendix A.  Profile example
 #include 
 #include "contiki.h"
 #include "contiki-net.h"
-
+#include 
 
 /* Define which resources to include to meet memory constraints. */
-#define REST_RES_INFO 1
+#define REST_RES_MODEL 1
+#define REST_RES_NAME 1
 #define REST_RES_EVENT 1
 #define REST_RES_LED 1
 #define REST_RES_TOGGLE 1
@@ -139,12 +140,12 @@ Appendix A.  Profile example
 
 
 /******************************************************************************/
-#if REST_RES_INFO
+#if REST_RES_MODEL
 /*
  * Resources are defined by the RESOURCE macro.
  * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
  */
-RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"simple.dev.n\"");
+RESOURCE(model, METHOD_GET, "p/model", "title=\"model\";rt=\"simple.dev.mdl\"");
 
 /*
  * A handler function named [resource name]_handler must be implemented for each RESOURCE.
@@ -153,7 +154,7 @@ RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"simple.dev.n\"");
  * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
  */
 void
-info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+model_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
 {
   char message[100];
   int index = 0;
@@ -161,8 +162,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 
   /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
        // jSON Format
-     index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre0\",\n");
-     index += sprintf(message + index," \"name\" : \"Merkurboard\"\n");
+     index += sprintf(message + index,"{\n \"model\" : \"Merkurboard\"\n");
      index += sprintf(message + index,"}\n");
 
     length = strlen(message);
@@ -173,6 +173,76 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_
 }
 #endif
 
+/******************************************************************************/
+#if REST_RES_NAME
+/*
+ * Resources are defined by the RESOURCE macro.
+ * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
+ */
+RESOURCE(name,  METHOD_POST | METHOD_GET, "p/name", "title=\"name\";rt=\"simple.dev.n\"");
+/* eeprom space */ 
+#define P_NAME "Testboard"
+#define P_NAME_MAX 17
+uint8_t eemem_p_name[P_NAME_MAX] EEMEM = P_NAME;
+
+/*
+ * A handler function named [resource name]_handler must be implemented for each RESOURCE.
+ * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
+ * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
+ * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
+ */
+void
+name_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  uint8_t eebuffer[32];
+  char message[100];
+  int index = 0;
+  int length = 0; /*           |<-------->| */
+  const char *name = NULL;
+  int success = 1;
+
+  switch(REST.get_method_type(request)){
+   case METHOD_GET:
+     cli();
+     eeprom_read_block (eebuffer, &eemem_p_name, sizeof(eemem_p_name));
+     sei();
+     /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
+     // jSON Format
+     index += sprintf(message + index,"{\n \"name\" : \"%s\"\n",eebuffer);
+     index += sprintf(message + index,"}\n");
+
+     length = strlen(message);
+     memcpy(buffer, message,length );
+
+     REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+     REST.set_response_payload(response, buffer, length);
+     break;
+     
+   case METHOD_POST:     
+     if (success &&  (length=REST.get_post_variable(request, "name", &name))) {
+       PRINTF("name %s\n", name);
+       if (length < P_NAME_MAX) {
+         memcpy(&eebuffer, name,length);
+         eebuffer[length]=0;
+         cli();
+         eeprom_write_block(&eebuffer,  &eemem_p_name, sizeof(eemem_p_name));
+         sei();
+       } else {
+         success = 0;
+       }		   
+     } else {
+       success = 0;
+     }
+     break;
+  default:
+    success = 0;
+  }
+  if (!success) {
+    REST.set_response_status(response, REST.status.BAD_REQUEST);
+  }
+}
+#endif
+
 /******************************************************************************/
 #if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON)
 /*
@@ -335,8 +405,11 @@ PROCESS_THREAD(rest_server_example, ev, data)
   rest_init_engine();
 
   /* Activate the application-specific resources. */
-#if REST_RES_INFO
-  rest_activate_resource(&resource_info);
+#if REST_RES_MODEL
+  rest_activate_resource(&resource_model);
+#endif
+#if REST_RES_NAME
+  rest_activate_resource(&resource_name);
 #endif
 #if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT
   rest_activate_event_resource(&resource_event);

From aa568a28a3d30d1acd26f30408a1fc84b81ba208 Mon Sep 17 00:00:00 2001
From: harald 
Date: Thu, 10 Apr 2014 14:37:22 +0200
Subject: [PATCH 125/345] add /s/cputemp resource

---
 examples/osd/merkurboard/er-example-server.c | 82 +++++++++++++++++++-
 examples/osd/merkurboard/project-conf.h      |  3 +
 2 files changed, 84 insertions(+), 1 deletion(-)

diff --git a/examples/osd/merkurboard/er-example-server.c b/examples/osd/merkurboard/er-example-server.c
index b0741ed77..df1c6e0c5 100644
--- a/examples/osd/merkurboard/er-example-server.c
+++ b/examples/osd/merkurboard/er-example-server.c
@@ -96,10 +96,12 @@ Appendix A.  Profile example
 /* Define which resources to include to meet memory constraints. */
 #define REST_RES_MODEL 1
 #define REST_RES_NAME 1
+#define REST_RES_SW   1
 #define REST_RES_EVENT 1
 #define REST_RES_LED 1
 #define REST_RES_TOGGLE 1
 #define REST_RES_BATTERY 1
+#define REST_RES_TEMPERATURE 1
 
 #include "erbium.h"
 
@@ -112,7 +114,9 @@ Appendix A.  Profile example
 #if defined (PLATFORM_HAS_BATTERY)
 #include "dev/battery-sensor.h"
 #endif
-
+#if defined (PLATFORM_HAS_TEMPERATURE)
+#include "dev/temperature-sensor.h"
+#endif
 
 /* For CoAP-specific example: not required for normal RESTful Web service. */
 #if WITH_COAP == 3
@@ -173,6 +177,40 @@ model_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred
 }
 #endif
 
+/******************************************************************************/
+#if REST_RES_SW
+/*
+ * Resources are defined by the RESOURCE macro.
+ * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash).
+ */
+RESOURCE(sw, METHOD_GET, "p/sw", "title=\"Software Version\";rt=\"simple.dev.sv\"");
+
+/*
+ * A handler function named [resource name]_handler must be implemented for each RESOURCE.
+ * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore
+ * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer.
+ * If a smaller block size is requested for CoAP, the REST framework automatically splits the data.
+ */
+void
+sw_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  char message[100];
+  int index = 0;
+  int length = 0; /*           |<-------->| */
+
+  /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */
+       // jSON Format
+     index += sprintf(message + index,"{\n \"sw\" : \"V0.8\"\n");
+     index += sprintf(message + index,"}\n");
+
+    length = strlen(message);
+    memcpy(buffer, message,length );
+
+  REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+  REST.set_response_payload(response, buffer, length);
+}
+#endif
+
 /******************************************************************************/
 #if REST_RES_NAME
 /*
@@ -370,6 +408,41 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr
 }
 #endif /* PLATFORM_HAS_BATTERY */
 
+/******************************************************************************/
+#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE)
+/* A simple getter example. Returns the reading from light sensor with a simple etag */
+RESOURCE(temperature, METHOD_GET, "s/cputemp", "title=\"CPU Temperature\";rt=\"simple.sen.tmp\"");
+void
+temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
+{
+  int temperature = temperature_sensor.value(0);
+
+  const uint16_t *accept = NULL;
+  int num = REST.get_header_accept(request, &accept);
+
+  if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN))
+  {
+    REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", temperature/100, temperature % 100);
+
+    REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
+  }
+  else if (num && (accept[0]==REST.type.APPLICATION_JSON))
+  {
+    REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
+    snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d.%02d}", temperature/100, temperature % 100);
+
+    REST.set_response_payload(response, buffer, strlen((char *)buffer));
+  }
+  else
+  {
+    REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
+    const char *msg = "Supporting content-types text/plain and application/json";
+    REST.set_response_payload(response, msg, strlen(msg));
+  }
+}
+#endif /* PLATFORM_HAS_TEMPERATURE */
+
 void 
 hw_init()
 {
@@ -408,6 +481,9 @@ PROCESS_THREAD(rest_server_example, ev, data)
 #if REST_RES_MODEL
   rest_activate_resource(&resource_model);
 #endif
+#if REST_RES_SW
+  rest_activate_resource(&resource_sw);
+#endif
 #if REST_RES_NAME
   rest_activate_resource(&resource_name);
 #endif
@@ -427,6 +503,10 @@ PROCESS_THREAD(rest_server_example, ev, data)
   SENSORS_ACTIVATE(battery_sensor);
   rest_activate_resource(&resource_battery);
 #endif
+#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE
+  SENSORS_ACTIVATE(temperature_sensor);
+  rest_activate_resource(&resource_temperature);
+#endif
 
   /* Define application-specific events here. */
   while(1) {
diff --git a/examples/osd/merkurboard/project-conf.h b/examples/osd/merkurboard/project-conf.h
index 577643dd6..c85939445 100644
--- a/examples/osd/merkurboard/project-conf.h
+++ b/examples/osd/merkurboard/project-conf.h
@@ -46,6 +46,9 @@
 // #undef NETSTACK_CONF_RDC
 //#define NETSTACK_CONF_RDC     nullrdc_driver
 
+// enabel LEAF-NODE mode
+//#define RPL_CONF_LEAF_ONLY	1
+
 /* Increase rpl-border-router IP-buffer when using more than 64. */
 #undef REST_MAX_CHUNK_SIZE
 #define REST_MAX_CHUNK_SIZE    64

From 67dba47c2370bfb8f7274538f90b068a02b5d1ec Mon Sep 17 00:00:00 2001
From: harald 
Date: Mon, 14 Apr 2014 13:11:45 +0200
Subject: [PATCH 126/345] remove not needed binary files

---
 .../osd/climate/er-example-server.osd-merkur   | Bin 509938 -> 0 bytes
 .../embedd-vm-server.osd-merkur                | Bin 455108 -> 0 bytes
 .../er-example-client.osd-merkur               | Bin 419560 -> 0 bytes
 .../er-example-server.osd-merkur               | Bin 425736 -> 0 bytes
 4 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100755 examples/osd/climate/er-example-server.osd-merkur
 delete mode 100755 examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur
 delete mode 100755 examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur
 delete mode 100755 examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur

diff --git a/examples/osd/climate/er-example-server.osd-merkur b/examples/osd/climate/er-example-server.osd-merkur
deleted file mode 100755
index 5c6b8a843c9bc355094ef53be41fc8a19743eb90..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 509938
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%0DQiFY`T*S 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 diff --git a/examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur b/examples/osd/embedd-vm-merkurboard/embedd-vm-server.osd-merkur deleted file mode 100755 index c4bbbeb36f131672577d7b73e05dfb5ff2dfeedc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455108 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%0A^k#fWqUI#w1g^r_~}V0 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

+(X|6lZGPs!_O4_|dX9EeSN&0i{W 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

gJNlKr}x_1X|cD{ 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 diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur deleted file mode 100755 index 7711d871a0bad8dfe8604e0523da3e159a0cdcc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419560 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�)Cpw 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

;h<YOc`C9yW&{yHkpB1a1o#%4WVsI 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 + +/** @name LED Functions */ +/** @{ */ +void statusledinit(void); +void statusled_on(void); +void statusled_off(void); +/** @} */ + +#endif /* __STATUSLED_H__ */ From 0c29b2b7dba80f01209b9cbb8795bf9a9da76252 Mon Sep 17 00:00:00 2001 From: harald Date: Tue, 27 May 2014 11:34:10 +0200 Subject: [PATCH 144/345] initial upload --- .../doc/rolladen-brd3.pdf | Bin 0 -> 41262 bytes .../doc/rolladen-verdrahtung.pdf | Bin 0 -> 259125 bytes .../osd/light-shutter-control/doc/rolladen.pdf | Bin 0 -> 24683 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/osd/light-shutter-control/doc/rolladen-brd3.pdf create mode 100644 examples/osd/light-shutter-control/doc/rolladen-verdrahtung.pdf create mode 100644 examples/osd/light-shutter-control/doc/rolladen.pdf diff --git a/examples/osd/light-shutter-control/doc/rolladen-brd3.pdf b/examples/osd/light-shutter-control/doc/rolladen-brd3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..66dcb840b818eec7d682ca702cffbb7f5921deae GIT binary patch literal 41262 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

;h<YOc`C9yW&{yHkpB1a1o#%4WVsI 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 Date: Thu, 29 May 2014 17:06:43 +0200 Subject: [PATCH 145/345] Add wallclock time handling New application and new example. We use the built-in timer routines and add an offset to get the wallclock time. The offset can be set by time-changing routines (currently only settimeofday). We also maintain an offset for timezone handling but this isn't currently fully implemented. --- apps/time/Makefile.time | 1 + apps/time/resource_gmtime.c | 126 ++++++++ apps/time/resource_timestamp.c | 158 ++++++++++ apps/time/time.c | 165 ++++++++++ apps/time/time.h | 65 ++++ apps/time/time_resource.h | 27 ++ examples/osd/wallclock-time/Makefile | 99 ++++++ .../osd/wallclock-time/er-example-server.c | 297 ++++++++++++++++++ examples/osd/wallclock-time/flash.sh | 2 + examples/osd/wallclock-time/project-conf.h | 101 ++++++ examples/osd/wallclock-time/run.sh | 5 + 11 files changed, 1046 insertions(+) create mode 100644 apps/time/Makefile.time create mode 100644 apps/time/resource_gmtime.c create mode 100644 apps/time/resource_timestamp.c create mode 100644 apps/time/time.c create mode 100644 apps/time/time.h create mode 100644 apps/time/time_resource.h create mode 100644 examples/osd/wallclock-time/Makefile create mode 100644 examples/osd/wallclock-time/er-example-server.c create mode 100755 examples/osd/wallclock-time/flash.sh create mode 100644 examples/osd/wallclock-time/project-conf.h create mode 100755 examples/osd/wallclock-time/run.sh diff --git a/apps/time/Makefile.time b/apps/time/Makefile.time new file mode 100644 index 000000000..1440c805d --- /dev/null +++ b/apps/time/Makefile.time @@ -0,0 +1 @@ +time_src = time.c resource_gmtime.c resource_timestamp.c diff --git a/apps/time/resource_gmtime.c b/apps/time/resource_gmtime.c new file mode 100644 index 000000000..732abd7ac --- /dev/null +++ b/apps/time/resource_gmtime.c @@ -0,0 +1,126 @@ +/** + * \file + * Resource for gmtime (utc) / localtime handling + * \author + * Ralf Schlatterbeck + * + * \brief get time as a string in utc or localtime + */ + +#include +#include +#include +#include "contiki.h" +#include "time.h" +#include "time_resource.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" + +RESOURCE \ + ( localtime + , METHOD_GET + , "clock/localtime" + , "title=\"Time\";rt=\"localtime\"" + ); + +RESOURCE \ + ( gmtime + , METHOD_GET + , "clock/utc" + , "title=\"Time\";rt=\"utc\"" + ); + +void +time_handler + ( void* request + , void* response + , uint8_t *buffer + , uint16_t preferred_size + , int32_t *offset + , struct tm *(*method)(const time_t *,struct tm *) + ) +{ + int success = 1; + + char temp[100]; + int index = 0; + int length = 0; /* |<-------->| */ + struct timeval tv; + struct tm tm; + int i = 0; + int n_acc = 0; + const uint16_t *accept = NULL; + uint16_t a_ctype = REST.type.APPLICATION_JSON; /* for now json is default */ + + /* Looks like accepted content-type isn't currently supported */ + n_acc = REST.get_header_accept (request, &accept); + for (i=0; i + * + * \brief get/put time in seconds since 1970 (UNIX time) + * Note: the internal format of the time in seconds is a 64bit number + * unfortunately javascript (json) will only support double for which + * the mantissa isn't long enough for representing that number. So we're + * back to 32 bit and have a year 2038 problem. + */ + +#include +#include +#include +#include "contiki.h" +#include "time.h" +#include "time_resource.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" + +/* Error-handling macro */ +# define BYE(_exp, _tag) \ + do { \ + PRINTF("Expect "_exp": %d\n",_tag); \ + success=0; \ + goto bye; \ + } while(0) + +#define DEBUG 1 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +RESOURCE \ + ( timestamp, METHOD_GET | METHOD_PUT + , "clock/timestamp" + , "title=\"Time\";rt=\"timestamp\"" + ); + +void +timestamp_handler + ( void* request + , void* response + , uint8_t *buffer + , uint16_t preferred_size + , int32_t *offset + ) +{ + int success = 1; + + int i; + char temp[100]; + int index = 0; + int length = 0; + int tag = 0; + const uint8_t *bytes = NULL; + size_t len = 0; + struct timeval tv; + int n_acc = 0; + const uint16_t *accept = NULL; + uint16_t a_ctype = REST.type.APPLICATION_JSON; + uint16_t c_ctype = REST.get_header_content_type (request); + + /* Seems like accepted type is currently unsupported? */ + n_acc = REST.get_header_accept (request, &accept); + for (i=0; i +#include "contiki.h" +#include "contiki-lib.h" +#include "time.h" + +/* Used for gmtime and localtime, according to manpage on linux the + * internal value may be overwritten "by subsequent calls to any of the + * date and time functions". + */ +static struct tm tm; + +/* + * Internal variables to manage offset of utc from the contiki clock + * and timezone offset from utc in minutes. + * For now we don't manage the sub-second offset -- time of setting the + * clock and the precisiont of the clock in use don't warrant this + * effort. + * The last_seconds is used to check if we had a seconds overflow, + * although this happens only every 136 years :-) + */ +time_t clock_offset; +uint32_t last_seconds; +int16_t minuteswest; + +# define LEAP_YEAR(_year) \ + ((_year % 4) == 0 && (_year % 100 != 0 || _year % 400 == 0)) +# define YDAYS(_year) (LEAP_YEAR(year) ? 366 : 365) + +struct tm * +gmtime_r (const time_t *timep, struct tm *ptm) +{ + unsigned int year; + int days, month, month_len; + time_t t = *timep; + ptm->tm_sec = t % 60; + t /= 60; + ptm->tm_min = t % 60; + t /= 60; + ptm->tm_hour = t % 24; + t /= 24; + ptm->tm_wday = (t+4) % 7; + year = 70; + days = 0; + while ((days += YDAYS (year)) <= t) + { + year++; + } + ptm->tm_year = year; + days -= YDAYS(year); + t -= days; + ptm->tm_yday = t; + for (month=0; month<12; month++) + { + if (month == 1) + { + month_len = LEAP_YEAR(year) ? 29 : 28; + } + else + { + int m = month; + if (m >= 7) + { + m -= 1; + } + m &= 1; + month_len = m ? 30 : 31; + } + if (t >= month_len) + { + t -= month_len; + } + else + { + break; + } + } + ptm->tm_mon = month; + ptm->tm_mday = t + 1; + ptm->tm_isdst = 0; + return ptm; +} + +struct tm * +gmtime (const time_t *timep) +{ + return gmtime_r (timep, &tm); +} + +struct tm * +localtime_r (const time_t *timep, struct tm *ptm) +{ + time_t t = *timep; + t += minuteswest * 60; + return gmtime_r (&t, ptm); +} + +struct tm * +localtime (const time_t *timep) +{ + return localtime_r (timep, &tm); +} + +/** + * \brief Get time in seconds and microseconds + * gettimeofday will return the clock time as the microseconds part + * while settimeofday will *ignore* the microseconds part (for now). + * Note that the contiki clock interface is broken anyway, we can't read + * seconds and sub-seconds atomically. We try to work around this by + * repeatedly reading seconds, sub-seconds, seconds until first and + * second read of seconds match. + */ +int +gettimeofday (struct timeval *tv, struct timezone *tz) +{ + uint32_t cs; + if (tz) { + tz->tz_minuteswest = minuteswest; + tz->tz_dsttime = 0; + } + if (tv) { + int i; + /* Limit tries to get the same second twice to two */ + for (i=0; i<2; i++) { + cs = clock_seconds (); + if (cs < last_seconds) { + clock_offset += 0xFFFFFFFFL; + clock_offset ++; + } + last_seconds = cs; + tv->tv_sec = cs + clock_offset; + tv->tv_usec = ((time_t)(clock_time () % CLOCK_SECOND)) + * 1000000L / CLOCK_SECOND; + if (cs == clock_seconds ()) { + break; + } + } + } + return 0; +} + +/** + * \brief Set time in seconds, microseconds ignored for now + */ +int +settimeofday (const struct timeval *tv, const struct timezone *tz) +{ + /* Don't allow setting timezone */ + if (tz) { + errno = ERANGE; + return -1; + } + if (tv) { + uint32_t cs; + cs = clock_seconds (); + clock_offset = tv->tv_sec - cs; + } + return 0; +} + +/** @} */ diff --git a/apps/time/time.h b/apps/time/time.h new file mode 100644 index 000000000..2ff4a383c --- /dev/null +++ b/apps/time/time.h @@ -0,0 +1,65 @@ +/** + * \defgroup Time related functions + * + * This rolls the necessary definition for getting/setting time and + * managing local time into one include file, on posix systems this + * lives in at least two include files, time.h and sys/time.h + * + * @{ + */ + +/** + * \file + * Definitions for the time module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef time_h +#define time_h + + +typedef signed long long time_t; +typedef signed long suseconds_t; + +#ifdef __cplusplus +extern "C" { +#endif + +struct tm { + uint32_t tm_year; /* year */ + uint16_t tm_yday; /* day in the year */ + uint8_t tm_sec; /* seconds */ + uint8_t tm_min; /* minutes */ + uint8_t tm_hour; /* hours */ + uint8_t tm_mday; /* day of the month */ + uint8_t tm_mon; /* month */ + uint8_t tm_wday; /* day of the week */ + uint8_t tm_isdst; /* daylight saving time */ +}; + +struct timeval { + time_t tv_sec; /* seconds */ + suseconds_t tv_usec; /* microseconds */ +}; + +struct timezone { + int16_t tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of DST correction, unused */ +}; + +struct tm *gmtime (const time_t *timep); +struct tm *gmtime_r (const time_t *timep, struct tm *result); +struct tm *localtime (const time_t *timep); +struct tm *localtime_r (const time_t *timep, struct tm *result); + +int gettimeofday (struct timeval *tv, struct timezone *tz); +int settimeofday (const struct timeval *tv, const struct timezone *tz); + +#ifdef __cplusplus +} +#endif + +#endif // time_h +/** @} */ diff --git a/apps/time/time_resource.h b/apps/time/time_resource.h new file mode 100644 index 000000000..1334ce99b --- /dev/null +++ b/apps/time/time_resource.h @@ -0,0 +1,27 @@ +/** + * \addgroup Time related functions + * + * Resource definitions for time module + * + * @{ + */ + +/** + * \file + * Resource definitions for the time module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef time_resource_h +#define time_resource_h +#include "contiki.h" +#include "erbium.h" + +extern resource_t resource_timestamp; +extern resource_t resource_localtime; +extern resource_t resource_gmtime; + +#endif // time_resource_h +/** @} */ diff --git a/examples/osd/wallclock-time/Makefile b/examples/osd/wallclock-time/Makefile new file mode 100644 index 000000000..b54d8eaa9 --- /dev/null +++ b/examples/osd/wallclock-time/Makefile @@ -0,0 +1,99 @@ +all: er-example-server \ + er-example-server.osd-merkur.hex er-example-server.osd-merkur.eep +# use this target explicitly if requried: er-plugtest-server + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 time json + +include $(CONTIKI)/Makefile.include + +er-example-server.osd-merkur.hex: er-example-server.osd-merkur + avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur \ + er-example-server.osd-merkur.hex + +er-example-server.osd-merkur.eep: er-example-server.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + er-example-server.osd-merkur er-example-server.osd-merkur.eep + +flash: er-example-server.osd-merkur.hex er-example-server.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U \ + flash:w:er-example-server.osd-merkur.hex:a -U \ + eeprom:w:er-example-server.osd-merkur.eep:a + +.PHONY: flash + +$(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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/wallclock-time/er-example-server.c b/examples/osd/wallclock-time/er-example-server.c new file mode 100644 index 000000000..875483e59 --- /dev/null +++ b/examples/osd/wallclock-time/er-example-server.c @@ -0,0 +1,297 @@ +/* + * 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) Wallclock REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + * Ralf Schlatterbeck + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" +#include "time.h" +#include "time_resource.h" +#include "jsonparse.h" + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_LEDS 1 +#define REST_RES_TOGGLE 0 +#define REST_RES_BATTERY 1 + +#include "erbium.h" + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#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_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); + index += sprintf(message + index," \"name\" : \"Wallclock-time\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ + +/******************************************************************************/ +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ +/******************************************************************************/ + +void +hw_init() +{ +#if defined (PLATFORM_HAS_LEDS) + leds_off(LEDS_RED); +#endif +} + +PROCESS(rest_server_example, "Erbium Example Server"); + +AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif + rest_activate_resource(&resource_timestamp); + rest_activate_resource(&resource_localtime); + rest_activate_resource(&resource_gmtime); + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/wallclock-time/flash.sh b/examples/osd/wallclock-time/flash.sh new file mode 100755 index 000000000..e9cb40bfc --- /dev/null +++ b/examples/osd/wallclock-time/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur flash diff --git a/examples/osd/wallclock-time/project-conf.h b/examples/osd/wallclock-time/project-conf.h new file mode 100644 index 000000000..574e15250 --- /dev/null +++ b/examples/osd/wallclock-time/project-conf.h @@ -0,0 +1,101 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_BATTERY 1 + +#define SICSLOWPAN_CONF_FRAG 1 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/wallclock-time/run.sh b/examples/osd/wallclock-time/run.sh new file mode 100755 index 000000000..295a9ab1d --- /dev/null +++ b/examples/osd/wallclock-time/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 From 478d91ac53a06645d4bf02c700ec2aada51ebe93 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Sat, 31 May 2014 15:52:33 +0200 Subject: [PATCH 146/345] Fix lots of compiler warnings --- core/lib/petsciiconv.c | 4 ++-- core/net/ip/resolv.c | 5 +---- core/net/ip/slipdev.c | 2 +- core/net/ip/tcpip.c | 2 ++ core/net/ipv4/uaodv-rt.c | 1 + core/net/ipv4/uaodv.c | 1 + core/net/mac/contikimac/contikimac.c | 8 ++------ core/net/mac/nullrdc.c | 2 ++ core/net/rime/collect-neighbor.c | 2 -- 9 files changed, 12 insertions(+), 15 deletions(-) diff --git a/core/lib/petsciiconv.c b/core/lib/petsciiconv.c index 873c7c2c7..348ee4f03 100644 --- a/core/lib/petsciiconv.c +++ b/core/lib/petsciiconv.c @@ -81,7 +81,7 @@ petsciiconv_toascii(char *buf, unsigned int len) { static char c; - ptr = buf; + ptr = (unsigned char*)buf; for(i = len; i > 0; --i) { c = *ptr; if(c == 0x0a) { @@ -108,7 +108,7 @@ petsciiconv_toascii(char *buf, unsigned int len) void petsciiconv_topetscii(char *buf, unsigned int len) { - ptr = buf; + ptr = (unsigned char *)buf; for(i = len; i > 0; --i) { *ptr = ascii2petscii[*ptr & 0x7f]; ++ptr; diff --git a/core/net/ip/resolv.c b/core/net/ip/resolv.c index b339b03d6..3480c561b 100644 --- a/core/net/ip/resolv.c +++ b/core/net/ip/resolv.c @@ -506,7 +506,6 @@ start_name_collision_check(clock_time_t after) static unsigned char * mdns_write_announce_records(unsigned char *queryptr, uint8_t *count) { - struct dns_answer *ans; #if UIP_CONF_IPV6 uint8_t i; @@ -524,7 +523,6 @@ mdns_write_announce_records(unsigned char *queryptr, uint8_t *count) *queryptr++ = 0xc0; *queryptr++ = sizeof(struct dns_hdr); } - ans = (struct dns_answer *)queryptr; *queryptr++ = (uint8_t) ((NATIVE_DNS_TYPE) >> 8); *queryptr++ = (uint8_t) ((NATIVE_DNS_TYPE)); @@ -546,6 +544,7 @@ mdns_write_announce_records(unsigned char *queryptr, uint8_t *count) } } #else /* UIP_CONF_IPV6 */ + struct dns_answer *ans; queryptr = encode_name(queryptr, resolv_hostname); ans = (struct dns_answer *)queryptr; ans->type = UIP_HTONS(NATIVE_DNS_TYPE); @@ -603,8 +602,6 @@ mdns_prep_host_announce_packet(void) uint8_t total_answers = 0; - struct dns_answer *ans; - /* Be aware that, unless `ARCH_DOESNT_NEED_ALIGNED_STRUCTS` is set, * writing directly to the uint16_t members of this struct is an error. */ struct dns_hdr *hdr = (struct dns_hdr *)uip_appdata; diff --git a/core/net/ip/slipdev.c b/core/net/ip/slipdev.c index a75f524bf..670126632 100644 --- a/core/net/ip/slipdev.c +++ b/core/net/ip/slipdev.c @@ -103,7 +103,7 @@ slipdev_send(void) ptr = &uip_buf[UIP_LLH_LEN]; for(i = 0; i < uip_len; ++i) { if(i == UIP_TCPIP_HLEN) { - ptr = (char *)uip_appdata; + ptr = uip_appdata; } c = *ptr++; switch(c) { diff --git a/core/net/ip/tcpip.c b/core/net/ip/tcpip.c index 7a889c84c..e6beae7fd 100644 --- a/core/net/ip/tcpip.c +++ b/core/net/ip/tcpip.c @@ -155,6 +155,7 @@ unsigned char tcpip_is_forwarding; /* Forwarding right now? */ PROCESS(tcpip_process, "TCP/IP stack"); /*---------------------------------------------------------------------------*/ +#if UIP_TCP static void start_periodic_tcp_timer(void) { @@ -162,6 +163,7 @@ start_periodic_tcp_timer(void) etimer_restart(&periodic); } } +#endif /*---------------------------------------------------------------------------*/ static void check_for_tcp_syn(void) diff --git a/core/net/ipv4/uaodv-rt.c b/core/net/ipv4/uaodv-rt.c index cad7db73f..b07d3d636 100644 --- a/core/net/ipv4/uaodv-rt.c +++ b/core/net/ipv4/uaodv-rt.c @@ -38,6 +38,7 @@ */ +#include #include "net/ipv4/uaodv-rt.h" #include "contiki-net.h" diff --git a/core/net/ipv4/uaodv.c b/core/net/ipv4/uaodv.c index 230709a61..a95b8cf28 100644 --- a/core/net/ipv4/uaodv.c +++ b/core/net/ipv4/uaodv.c @@ -39,6 +39,7 @@ #include #include +#include #include "contiki.h" #include "net/ipv4/uaodv-def.h" diff --git a/core/net/mac/contikimac/contikimac.c b/core/net/mac/contikimac/contikimac.c index ba20efbb1..7c27d7fb5 100644 --- a/core/net/mac/contikimac/contikimac.c +++ b/core/net/mac/contikimac/contikimac.c @@ -372,7 +372,6 @@ powercycle(struct rtimer *t, void *ptr) while(1) { static uint8_t packet_seen; - static rtimer_clock_t t0; static uint8_t count; #if SYNC_CYCLE_STARTS @@ -396,7 +395,6 @@ powercycle(struct rtimer *t, void *ptr) packet_seen = 0; for(count = 0; count < CCA_COUNT_MAX; ++count) { - t0 = RTIMER_NOW(); if(we_are_sending == 0 && we_are_receiving_burst == 0) { powercycle_turn_radio_on(); /* Check if a packet is seen in the air. If so, we keep the @@ -530,8 +528,9 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr, uint8_t got_strobe_ack = 0; int hdrlen, len; uint8_t is_broadcast = 0; - uint8_t is_reliable = 0; +#if WITH_PHASE_OPTIMIZATION uint8_t is_known_receiver = 0; +#endif uint8_t collisions; int transmit_len; int ret; @@ -580,9 +579,6 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr, packetbuf_addr(PACKETBUF_ADDR_RECEIVER)->u8[1]); #endif /* UIP_CONF_IPV6 */ } - is_reliable = packetbuf_attr(PACKETBUF_ATTR_RELIABLE) || - packetbuf_attr(PACKETBUF_ATTR_ERELIABLE); - packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1); #if WITH_CONTIKIMAC_HEADER diff --git a/core/net/mac/nullrdc.c b/core/net/mac/nullrdc.c index 7e7be6004..c30b1ba1f 100644 --- a/core/net/mac/nullrdc.c +++ b/core/net/mac/nullrdc.c @@ -270,11 +270,13 @@ send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) static void packet_input(void) { +#if NULLRDC_SEND_802154_ACK int original_datalen; uint8_t *original_dataptr; original_datalen = packetbuf_datalen(); original_dataptr = packetbuf_dataptr(); +#endif #ifdef NETSTACK_DECRYPT NETSTACK_DECRYPT(); #endif /* NETSTACK_DECRYPT */ diff --git a/core/net/rime/collect-neighbor.c b/core/net/rime/collect-neighbor.c index 2e105fca8..ecd5e2967 100644 --- a/core/net/rime/collect-neighbor.c +++ b/core/net/rime/collect-neighbor.c @@ -254,13 +254,11 @@ collect_neighbor_list_remove(struct collect_neighbor_list *neighbors_list, struct collect_neighbor * collect_neighbor_list_best(struct collect_neighbor_list *neighbors_list) { - int found; struct collect_neighbor *n, *best; uint16_t rtmetric; rtmetric = RTMETRIC_MAX; best = NULL; - found = 0; if(neighbors_list == NULL) { return NULL; From e88f60feee8b3ab6c24ce7027916826d4924c088 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Sat, 31 May 2014 16:17:07 +0200 Subject: [PATCH 147/345] Make HW timer for contiki rtimer configurable ... and configure osd platform to use timer 5. With the new configuration we can use timer 3 for generating hardware PWM. --- cpu/avr/rtimer-arch.c | 142 +++++++++--------------- cpu/avr/rtimer-arch.h | 39 ++++++- platform/osd-merkur/Makefile.osd-merkur | 2 +- 3 files changed, 86 insertions(+), 97 deletions(-) diff --git a/cpu/avr/rtimer-arch.c b/cpu/avr/rtimer-arch.c index d1d97af7e..fe978a24c 100644 --- a/cpu/avr/rtimer-arch.c +++ b/cpu/avr/rtimer-arch.c @@ -51,29 +51,24 @@ #include "rtimer-arch.h" #if defined(__AVR_ATmega1284P__) -#define ETIMSK TIMSK3 -#define ETIFR TIFR3 -#define TICIE3 ICIE3 - //Has no 'C', so we just set it to B. The code doesn't really use C so this //is safe to do but lets it compile. Probably should enable the warning if //it is ever used on other platforms. //#warning no OCIE3C in timer3 architecture, hopefully it won't be needed! - #define OCIE3C OCIE3B #define OCF3C OCF3B +#define PLAT_TCCRC PLAT_TCCRB #endif #if defined(__AVR_ATmega1281__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega128RFA1__) -#define ETIMSK TIMSK3 -#define ETIFR TIFR3 -#define TICIE3 ICIE3 #endif #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega644__) -#define TIMSK TIMSK1 -#define TICIE1 ICIE1 -#define TIFR TIFR1 +//Has no 'C', so we just set it to B. The code doesn't really use C so this +//is safe to do but lets it compile. +#define OCIE1C OCIE1B +#define OCF1C OCF1B +#define PLAT_TCCRC PLAT_TCCRB #endif /* Track flow through rtimer interrupts*/ @@ -85,14 +80,19 @@ extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; #endif /*---------------------------------------------------------------------------*/ -#if defined(TCNT3) && RTIMER_ARCH_PRESCALER -ISR (TIMER3_COMPA_vect) { +#if RTIMER_ARCH_PRESCALER +ISR (PLAT_VECT) { DEBUGFLOW('/'); ENERGEST_ON(ENERGEST_TYPE_IRQ); /* Disable rtimer interrupts */ - ETIMSK &= ~((1 << OCIE3A) | (1 << OCIE3B) | (1 << TOIE3) | - (1 << TICIE3) | (1 << OCIE3C)); + PLAT_TIMSK &= + ~( (1 << PLAT_OCIEA) + | (1 << PLAT_OCIEB) + | (1 << PLAT_OCIEC) + | (1 << PLAT_TOIE) + | (1 << PLAT_ICIE) + ); #if RTIMER_CONF_NESTED_INTERRUPTS /* Enable nested interrupts. Allows radio interrupt during rtimer interrupt. */ @@ -106,17 +106,6 @@ ISR (TIMER3_COMPA_vect) { ENERGEST_OFF(ENERGEST_TYPE_IRQ); DEBUGFLOW('\\'); } - -#elif RTIMER_ARCH_PRESCALER -#warning "No Timer3 in rtimer-arch.c - using Timer1 instead" -ISR (TIMER1_COMPA_vect) { - DEBUGFLOW('/'); - TIMSK &= ~((1< Date: Mon, 2 Jun 2014 13:44:54 +0200 Subject: [PATCH 148/345] set 0xABCD default panid --- platform/osd-merkur/contiki-conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index d01424b8f..4583498b2 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -50,7 +50,7 @@ #include -#define IEEE802154_CONF_PANID 0xAAAA // default panid +#define IEEE802154_CONF_PANID 0xABCD // default panid /* 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 From 45dee77092eb097b852ac20b4f13326be1420996 Mon Sep 17 00:00:00 2001 From: harald Date: Mon, 2 Jun 2014 13:46:54 +0200 Subject: [PATCH 149/345] bugfix read analog --- platform/osd-merkur/dev/wiring_analog.c | 55 +------------------------ 1 file changed, 2 insertions(+), 53 deletions(-) diff --git a/platform/osd-merkur/dev/wiring_analog.c b/platform/osd-merkur/dev/wiring_analog.c index 80478c03f..6c3dcc484 100644 --- a/platform/osd-merkur/dev/wiring_analog.c +++ b/platform/osd-merkur/dev/wiring_analog.c @@ -26,6 +26,7 @@ #include "wiring_private.h" #include "pins_arduino.h" +#include "adc.h" uint8_t analog_reference = DEFAULT; @@ -39,59 +40,7 @@ void analogReference(uint8_t mode) int analogRead(uint8_t pin) { - uint8_t low, high; - -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) - if (pin >= 54) pin -= 54; // allow for channel or pin numbers -#elif defined(__AVR_ATmega32U4__) - if (pin >= 18) pin -= 18; // allow for channel or pin numbers -#elif defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644P__) - if (pin >= 24) pin -= 24; // allow for channel or pin numbers -#elif defined(__AVR_ATmega128RFA1__) - if (pin >= 26) pin -= 26; // allow for channel or pin numbers -#else - if (pin >= 14) pin -= 14; // allow for channel or pin numbers -#endif - -#if defined(__AVR_ATmega32U4__) - pin = analogPinToChannel(pin); - ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); -#elif defined(ADCSRB) && defined(MUX5) - // the MUX5 bit of ADCSRB selects whether we're reading from channels - // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). - ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); -#endif - // set the analog reference (high two bits of ADMUX) and select the - // channel (low 4 bits). this also sets ADLAR (left-adjust result) - // to 0 (the default). -#if defined(ADMUX) - ADMUX = (analog_reference << 6) | (pin & 0x07); -#endif - - // without a delay, we seem to read from the wrong channel - //delay(1); - -#if defined(ADCSRA) && defined(ADCL) - // start the conversion - sbi(ADCSRA, ADSC); - - // ADSC is cleared when the conversion finishes - while (bit_is_set(ADCSRA, ADSC)); - - // we have to read ADCL first; doing so locks both ADCL - // and ADCH until ADCH is read. reading ADCL second would - // cause the results of each conversion to be discarded, - // as ADCL and ADCH would be locked when it completed. - low = ADCL; - high = ADCH; -#else - // we dont have an ADC, return 0 - low = 0; - high = 0; -#endif - - // combine the two bytes - return (high << 8) | low; + return readADC(pin); } // Right now, PWM output only works on the pins with From a952a96b6e9620ee0b317dfcfbdaead5097e1d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20L=C3=A9one?= Date: Fri, 30 May 2014 11:01:20 +0200 Subject: [PATCH 150/345] Closing doxygen groups (cherry picked from commit 25c8b0835dca6bdfe939678193b8b8bf049396cd) --- core/dev/leds.h | 3 + core/lib/ringbuf.h | 5 +- core/net/ipv4/uip.c | 157 +++++++++--------- core/net/ipv6/uip-ds6-nbr.c | 1 + core/net/ipv6/uip-ds6-nbr.h | 1 + core/net/ipv6/uip-ds6.c | 3 +- core/net/mac/frame802154.h | 1 + core/net/rpl/rpl-dag.c | 7 +- core/net/rpl/rpl-ext-header.c | 2 + core/net/rpl/rpl-icmp6.c | 16 +- core/net/rpl/rpl-mrhof.c | 4 +- core/net/rpl/rpl-of0.c | 4 +- core/net/rpl/rpl-timers.c | 2 + core/net/rpl/rpl.c | 2 + core/sys/rtimer.c | 2 + core/sys/subprocess.h | 3 + cpu/avr/dev/lanc111.c | 73 ++++---- .../apps/raven-lcd-interface/raven-lcd.c | 41 ++--- .../apps/raven-lcd-interface/raven-lcd.c | 41 ++--- 19 files changed, 200 insertions(+), 168 deletions(-) diff --git a/core/dev/leds.h b/core/dev/leds.h index 82132e9a9..b3f2adf70 100644 --- a/core/dev/leds.h +++ b/core/dev/leds.h @@ -93,3 +93,6 @@ unsigned char leds_arch_get(void); void leds_arch_set(unsigned char leds); #endif /* LEDS_H_ */ + +/** @} */ +/** @} */ diff --git a/core/lib/ringbuf.h b/core/lib/ringbuf.h index 390000524..d1445519a 100644 --- a/core/lib/ringbuf.h +++ b/core/lib/ringbuf.h @@ -67,7 +67,7 @@ struct ringbuf { uint8_t *data; uint8_t mask; - + /* XXX these must be 8-bit quantities to avoid race conditions. */ uint8_t put_ptr, get_ptr; }; @@ -129,3 +129,6 @@ int ringbuf_size(struct ringbuf *r); int ringbuf_elements(struct ringbuf *r); #endif /* RINGBUF_H_ */ + +/** @}*/ +/** @}*/ diff --git a/core/net/ipv4/uip.c b/core/net/ipv4/uip.c index 7b381461e..aaff1c20f 100644 --- a/core/net/ipv4/uip.c +++ b/core/net/ipv4/uip.c @@ -243,15 +243,15 @@ uip_add32(uint8_t *op32, uint16_t op16) uip_acc32[2] = op32[2] + (op16 >> 8); uip_acc32[1] = op32[1]; uip_acc32[0] = op32[0]; - + if(uip_acc32[2] < (op16 >> 8)) { ++uip_acc32[1]; if(uip_acc32[1] == 0) { ++uip_acc32[0]; } } - - + + if(uip_acc32[3] < (op16 & 0xff)) { ++uip_acc32[2]; if(uip_acc32[2] == 0) { @@ -276,7 +276,7 @@ chksum(uint16_t sum, const uint8_t *data, uint16_t len) dataptr = data; last_byte = data + len - 1; - + while(dataptr < last_byte) { /* At least two more bytes */ t = (dataptr[0] << 8) + dataptr[1]; sum += t; @@ -285,7 +285,7 @@ chksum(uint16_t sum, const uint8_t *data, uint16_t len) } dataptr += 2; } - + if(dataptr == last_byte) { t = (dataptr[0] << 8) + 0; sum += t; @@ -321,15 +321,15 @@ upper_layer_chksum(uint8_t proto) { uint16_t upper_layer_len; uint16_t sum; - + #if UIP_CONF_IPV6 upper_layer_len = (((uint16_t)(BUF->len[0]) << 8) + BUF->len[1]); #else /* UIP_CONF_IPV6 */ upper_layer_len = (((uint16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN; #endif /* UIP_CONF_IPV6 */ - + /* First sum pseudoheader. */ - + /* IP protocol and length fields. This addition cannot carry. */ sum = upper_layer_len + proto; /* Sum IP source and destination addresses. */ @@ -338,7 +338,7 @@ upper_layer_chksum(uint8_t proto) /* Sum TCP header and data. */ sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_len); - + return (sum == 0) ? 0xffff : uip_htons(sum); } /*---------------------------------------------------------------------------*/ @@ -347,7 +347,7 @@ uint16_t uip_icmp6chksum(void) { return upper_layer_chksum(UIP_PROTO_ICMP6); - + } #endif /* UIP_CONF_IPV6 */ /*---------------------------------------------------------------------------*/ @@ -384,7 +384,7 @@ uip_init(void) uip_udp_conns[c].lport = 0; } #endif /* UIP_UDP */ - + /* IPv4 initialization. */ #if UIP_FIXEDADDR == 0 @@ -398,7 +398,7 @@ struct uip_conn * uip_connect(uip_ipaddr_t *ripaddr, uint16_t rport) { register struct uip_conn *conn, *cconn; - + /* Find an unused local port. */ again: ++lastport; @@ -435,7 +435,7 @@ uip_connect(uip_ipaddr_t *ripaddr, uint16_t rport) if(conn == 0) { return 0; } - + conn->tcpstateflags = UIP_SYN_SENT; conn->snd_nxt[0] = iss[0]; @@ -444,7 +444,7 @@ uip_connect(uip_ipaddr_t *ripaddr, uint16_t rport) conn->snd_nxt[3] = iss[3]; conn->initialmss = conn->mss = UIP_TCP_MSS; - + conn->len = 1; /* TCP length of the SYN is one. */ conn->nrtx = 0; conn->timer = 1; /* Send the SYN next time around. */ @@ -454,7 +454,7 @@ uip_connect(uip_ipaddr_t *ripaddr, uint16_t rport) conn->lport = uip_htons(lastport); conn->rport = rport; uip_ipaddr_copy(&conn->ripaddr, ripaddr); - + return conn; } #endif /* UIP_ACTIVE_OPEN */ @@ -464,7 +464,7 @@ struct uip_udp_conn * uip_udp_new(const uip_ipaddr_t *ripaddr, uint16_t rport) { register struct uip_udp_conn *conn; - + /* Find an unused local port. */ again: ++lastport; @@ -472,7 +472,7 @@ uip_udp_new(const uip_ipaddr_t *ripaddr, uint16_t rport) if(lastport >= 32000) { lastport = 4096; } - + for(c = 0; c < UIP_UDP_CONNS; ++c) { if(uip_udp_conns[c].lport == uip_htons(lastport)) { goto again; @@ -491,7 +491,7 @@ uip_udp_new(const uip_ipaddr_t *ripaddr, uint16_t rport) if(conn == 0) { return 0; } - + conn->lport = UIP_HTONS(lastport); conn->rport = rport; if(ripaddr == NULL) { @@ -500,7 +500,7 @@ uip_udp_new(const uip_ipaddr_t *ripaddr, uint16_t rport) uip_ipaddr_copy(&conn->ripaddr, ripaddr); } conn->ttl = UIP_TTL; - + return conn; } #endif /* UIP_UDP */ @@ -585,12 +585,12 @@ uip_reass(void) memcpy(&uip_reassbuf[UIP_IPH_LEN + offset], (char *)BUF + (int)((BUF->vhl & 0x0f) * 4), len); - + /* Update the bitmap. */ if(offset / (8 * 8) == (offset + len) / (8 * 8)) { /* If the two endpoints are in the same byte, we only update that byte. */ - + uip_reassbitmap[offset / (8 * 8)] |= bitmap_bits[(offset / 8 ) & 7] & ~bitmap_bits[((offset + len) / 8 ) & 7]; @@ -606,7 +606,7 @@ uip_reass(void) uip_reassbitmap[(offset + len) / (8 * 8)] |= ~bitmap_bits[((offset + len) / 8 ) & 7]; } - + /* If this fragment has the More Fragments flag set to zero, we know that this is the last fragment, so we can calculate the size of the entire packet. We also set the @@ -617,7 +617,7 @@ uip_reass(void) uip_reassflags |= UIP_REASS_FLAG_LASTFRAG; uip_reasslen = offset + len; } - + /* Finally, we check if we have a full packet in the buffer. We do this by checking if we have the last fragment and if all bits in the bitmap are set. */ @@ -679,7 +679,7 @@ uip_process(uint8_t flag) goto udp_send; } #endif /* UIP_UDP */ - + uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN]; /* Check if we were invoked because of a poll request for a @@ -698,7 +698,7 @@ uip_process(uint8_t flag) #endif /* UIP_ACTIVE_OPEN */ } goto drop; - + /* Check if we were invoked because of the perodic timer fireing. */ } else if(flag == UIP_TIMER) { #if UIP_REASSEMBLY @@ -759,7 +759,7 @@ uip_process(uint8_t flag) 4: uip_connr->nrtx); ++(uip_connr->nrtx); - + /* Ok, so we need to retransmit. We do this differently depending on which state we are in. In ESTABLISHED, we call upon the application so that it may prepare the @@ -772,14 +772,14 @@ uip_process(uint8_t flag) /* In the SYN_RCVD state, we should retransmit our SYNACK. */ goto tcp_send_synack; - + #if UIP_ACTIVE_OPEN case UIP_SYN_SENT: /* In the SYN_SENT state, we retransmit out SYN. */ BUF->flags = 0; goto tcp_send_syn; #endif /* UIP_ACTIVE_OPEN */ - + case UIP_ESTABLISHED: /* In the ESTABLISHED state, we call upon the application to do the actual retransmit after which we jump into @@ -788,13 +788,13 @@ uip_process(uint8_t flag) uip_flags = UIP_REXMIT; UIP_APPCALL(); goto apprexmit; - + case UIP_FIN_WAIT_1: case UIP_CLOSING: case UIP_LAST_ACK: /* In all these states we should retransmit a FINACK. */ goto tcp_send_finack; - + } } } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) { @@ -827,7 +827,7 @@ uip_process(uint8_t flag) UIP_STAT(++uip_stat.ip.recv); /* Start of IP input header processing code. */ - + #if UIP_CONF_IPV6 /* Check validity of the IP header. */ if((BUF->vtc & 0xf0) != 0x60) { /* IP version and header length. */ @@ -845,7 +845,7 @@ uip_process(uint8_t flag) goto drop; } #endif /* UIP_CONF_IPV6 */ - + /* Check the size of the packet. If the size reported to us in uip_len is smaller the size reported in the IP header, we assume that the packet has been corrupted in transit. If the size of @@ -922,7 +922,7 @@ uip_process(uint8_t flag) goto udp_input; } #endif /* UIP_BROADCAST */ - + /* Check if the packet is destined for our IP address. */ #if !UIP_CONF_IPV6 if(!uip_ipaddr_cmp(&BUF->destipaddr, &uip_hostaddr)) { @@ -1042,14 +1042,14 @@ uip_process(uint8_t flag) /* Save the sender's address in our neighbor list. */ uip_neighbor_add(&ICMPBUF->srcipaddr, &(ICMPBUF->options[2])); } - + /* We should now send a neighbor advertisement back to where the neighbor solicication came from. */ ICMPBUF->type = ICMP6_NEIGHBOR_ADVERTISEMENT; ICMPBUF->flags = ICMP6_FLAG_S; /* Solicited flag. */ - + ICMPBUF->reserved1 = ICMPBUF->reserved2 = ICMPBUF->reserved3 = 0; - + uip_ipaddr_copy(&ICMPBUF->destipaddr, &ICMPBUF->srcipaddr); uip_ipaddr_copy(&ICMPBUF->srcipaddr, &uip_hostaddr); ICMPBUF->options[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS; @@ -1057,9 +1057,9 @@ uip_process(uint8_t flag) memcpy(&(ICMPBUF->options[2]), &uip_lladdr, sizeof(uip_lladdr)); ICMPBUF->icmpchksum = 0; ICMPBUF->icmpchksum = ~uip_icmp6chksum(); - + goto send; - + } goto drop; } else if(ICMPBUF->type == ICMP6_ECHO) { @@ -1068,12 +1068,12 @@ uip_process(uint8_t flag) ICMP checksum before we return the packet. */ ICMPBUF->type = ICMP6_ECHO_REPLY; - + uip_ipaddr_copy(&BUF->destipaddr, &BUF->srcipaddr); uip_ipaddr_copy(&BUF->srcipaddr, &uip_hostaddr); ICMPBUF->icmpchksum = 0; ICMPBUF->icmpchksum = ~uip_icmp6chksum(); - + UIP_STAT(++uip_stat.icmp.sent); goto send; } else { @@ -1085,7 +1085,7 @@ uip_process(uint8_t flag) } /* End of IPv6 ICMP processing. */ - + #endif /* !UIP_CONF_IPV6 */ #if UIP_UDP @@ -1168,7 +1168,7 @@ uip_process(uint8_t flag) #else /* UIP_CONF_ICMP_DEST_UNREACH */ goto drop; #endif /* UIP_CONF_ICMP_DEST_UNREACH */ - + udp_found: UIP_STAT(++uip_stat.udp.recv); uip_conn = NULL; @@ -1204,7 +1204,7 @@ uip_process(uint8_t flag) uip_ipaddr_copy(&BUF->srcipaddr, &uip_hostaddr); uip_ipaddr_copy(&BUF->destipaddr, &uip_udp_conn->ripaddr); - + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN]; #if UIP_UDP_CHECKSUMS @@ -1214,18 +1214,18 @@ uip_process(uint8_t flag) UDPBUF->udpchksum = 0xffff; } #endif /* UIP_UDP_CHECKSUMS */ - + UIP_STAT(++uip_stat.udp.sent); goto ip_send_nolen; #endif /* UIP_UDP */ - + /* TCP input processing. */ #if UIP_TCP tcp_input: UIP_STAT(++uip_stat.tcp.recv); /* Start of TCP input header processing code. */ - + if(uip_tcpchksum() != 0xffff) { /* Compute and check the TCP checksum. */ UIP_STAT(++uip_stat.tcp.drop); @@ -1239,7 +1239,7 @@ uip_process(uint8_t flag) UIP_LOG("tcp: zero port."); goto drop; } - + /* Demultiplex this segment. */ /* First check any active connections. */ for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1]; @@ -1259,7 +1259,7 @@ uip_process(uint8_t flag) if((BUF->flags & TCP_CTL) != TCP_SYN) { goto reset; } - + tmp16 = BUF->destport; /* Next, check listening connections. */ for(c = 0; c < UIP_LISTENPORTS; ++c) { @@ -1267,7 +1267,7 @@ uip_process(uint8_t flag) goto found_listen; } } - + /* No matching connection found, so we send a RST packet. */ UIP_STAT(++uip_stat.tcp.synrst); @@ -1278,7 +1278,7 @@ uip_process(uint8_t flag) } UIP_STAT(++uip_stat.tcp.rst); - + BUF->flags = TCP_RST | TCP_ACK; uip_len = UIP_IPTCPH_LEN; BUF->tcpoffset = 5 << 4; @@ -1287,15 +1287,15 @@ uip_process(uint8_t flag) c = BUF->seqno[3]; BUF->seqno[3] = BUF->ackno[3]; BUF->ackno[3] = c; - + c = BUF->seqno[2]; BUF->seqno[2] = BUF->ackno[2]; BUF->ackno[2] = c; - + c = BUF->seqno[1]; BUF->seqno[1] = BUF->ackno[1]; BUF->ackno[1] = c; - + c = BUF->seqno[0]; BUF->seqno[0] = BUF->ackno[0]; BUF->ackno[0] = c; @@ -1310,16 +1310,16 @@ uip_process(uint8_t flag) } } } - + /* Swap port numbers. */ tmp16 = BUF->srcport; BUF->srcport = BUF->destport; BUF->destport = tmp16; - + /* Swap IP addresses. */ uip_ipaddr_copy(&BUF->destipaddr, &BUF->srcipaddr); uip_ipaddr_copy(&BUF->srcipaddr, &uip_hostaddr); - + /* And send out the RST packet! */ goto tcp_send_noconn; @@ -1356,7 +1356,7 @@ uip_process(uint8_t flag) goto drop; } uip_conn = uip_connr; - + /* Fill in the necessary fields for the new connection. */ uip_connr->rto = uip_connr->timer = UIP_RTO; uip_connr->sa = 0; @@ -1397,7 +1397,7 @@ uip_process(uint8_t flag) (uint16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c]; uip_connr->initialmss = uip_connr->mss = tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16; - + /* And we are done processing options. */ break; } else { @@ -1412,19 +1412,19 @@ uip_process(uint8_t flag) } } } - + /* Our response will be a SYNACK. */ #if UIP_ACTIVE_OPEN tcp_send_synack: BUF->flags = TCP_ACK; - + tcp_send_syn: BUF->flags |= TCP_SYN; #else /* UIP_ACTIVE_OPEN */ tcp_send_synack: BUF->flags = TCP_SYN | TCP_ACK; #endif /* UIP_ACTIVE_OPEN */ - + /* We send out the TCP Maximum Segment Size option with our SYNACK. */ BUF->optdata[0] = TCP_OPT_MSS; @@ -1492,7 +1492,7 @@ uip_process(uint8_t flag) uip_connr->snd_nxt[1] = uip_acc32[1]; uip_connr->snd_nxt[2] = uip_acc32[2]; uip_connr->snd_nxt[3] = uip_acc32[3]; - + /* Do RTT estimation, unless we have done retransmissions. */ if(uip_connr->nrtx == 0) { signed char m; @@ -1516,7 +1516,7 @@ uip_process(uint8_t flag) /* Reset length of outstanding data. */ uip_connr->len = 0; } - + } /* Do different things depending on in what state the connection is. */ @@ -1608,7 +1608,7 @@ uip_process(uint8_t flag) uip_conn->tcpstateflags = UIP_CLOSED; goto reset; #endif /* UIP_ACTIVE_OPEN */ - + case UIP_ESTABLISHED: /* In the ESTABLISHED state, we call upon the application to feed data into the uip_buf. If the UIP_ACKDATA flag is set, the @@ -1710,7 +1710,7 @@ uip_process(uint8_t flag) UIP_APPCALL(); appsend: - + if(uip_flags & UIP_ABORT) { uip_slen = 0; uip_connr->tcpstateflags = UIP_CLOSED; @@ -1762,7 +1762,7 @@ uip_process(uint8_t flag) uip_connr->nrtx = 0; apprexmit: uip_appdata = uip_sappdata; - + /* If the application has data to be sent, or if the incoming packet had new data in it, we must send out a packet. */ if(uip_slen > 0 && uip_connr->len > 0) { @@ -1791,7 +1791,7 @@ uip_process(uint8_t flag) UIP_APPCALL(); } break; - + case UIP_FIN_WAIT_1: /* The application has closed the connection, but the remote host hasn't closed its end yet. Thus we do nothing but wait for a @@ -1820,7 +1820,7 @@ uip_process(uint8_t flag) goto tcp_send_ack; } goto drop; - + case UIP_FIN_WAIT_2: if(uip_len > 0) { uip_add_rcv_nxt(uip_len); @@ -1840,7 +1840,7 @@ uip_process(uint8_t flag) case UIP_TIME_WAIT: goto tcp_send_ack; - + case UIP_CLOSING: if(uip_flags & UIP_ACKDATA) { uip_connr->tcpstateflags = UIP_TIME_WAIT; @@ -1848,12 +1848,12 @@ uip_process(uint8_t flag) } } goto drop; - + /* We jump here when we are ready to send the packet, and just want to set the appropriate TCP sequence numbers in the TCP header. */ tcp_send_ack: BUF->flags = TCP_ACK; - + tcp_send_nodata: uip_len = UIP_IPTCPH_LEN; @@ -1869,14 +1869,14 @@ uip_process(uint8_t flag) BUF->ackno[1] = uip_connr->rcv_nxt[1]; BUF->ackno[2] = uip_connr->rcv_nxt[2]; BUF->ackno[3] = uip_connr->rcv_nxt[3]; - + BUF->seqno[0] = uip_connr->snd_nxt[0]; BUF->seqno[1] = uip_connr->snd_nxt[1]; BUF->seqno[2] = uip_connr->snd_nxt[2]; BUF->seqno[3] = uip_connr->snd_nxt[3]; BUF->proto = UIP_PROTO_TCP; - + BUF->srcport = uip_connr->lport; BUF->destport = uip_connr->rport; @@ -1891,7 +1891,7 @@ uip_process(uint8_t flag) BUF->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8); BUF->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff); } - + tcp_send_noconn: BUF->ttl = UIP_TTL; #if UIP_CONF_IPV6 @@ -1905,7 +1905,7 @@ uip_process(uint8_t flag) #endif /* UIP_CONF_IPV6 */ BUF->urgp[0] = BUF->urgp[1] = 0; - + /* Calculate TCP checksum. */ BUF->tcpchksum = 0; BUF->tcpchksum = ~(uip_tcpchksum()); @@ -1927,14 +1927,14 @@ uip_process(uint8_t flag) BUF->ipchksum = 0; BUF->ipchksum = ~(uip_ipchksum()); DEBUG_PRINTF("uip ip_send_nolen: chkecum 0x%04x\n", uip_ipchksum()); -#endif /* UIP_CONF_IPV6 */ +#endif /* UIP_CONF_IPV6 */ UIP_STAT(++uip_stat.tcp.sent); #if UIP_CONF_IPV6 send: #endif /* UIP_CONF_IPV6 */ DEBUG_PRINTF("Sending packet with length %d (%d)\n", uip_len, (BUF->len[0] << 8) | BUF->len[1]); - + UIP_STAT(++uip_stat.ip.sent); /* Return and let the caller do the actual transmission. */ uip_flags = 0; @@ -1973,5 +1973,6 @@ uip_send(const void *data, int len) } } /*---------------------------------------------------------------------------*/ -/** @} */ #endif /* UIP_CONF_IPV6 */ + +/** @}*/ diff --git a/core/net/ipv6/uip-ds6-nbr.c b/core/net/ipv6/uip-ds6-nbr.c index 626fc7dbf..a4f42b3b9 100644 --- a/core/net/ipv6/uip-ds6-nbr.c +++ b/core/net/ipv6/uip-ds6-nbr.c @@ -296,3 +296,4 @@ uip_ds6_get_least_lifetime_neighbor(void) return nbr_expiring; } /*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/core/net/ipv6/uip-ds6-nbr.h b/core/net/ipv6/uip-ds6-nbr.h index 150ba117a..cd9bb7545 100644 --- a/core/net/ipv6/uip-ds6-nbr.h +++ b/core/net/ipv6/uip-ds6-nbr.h @@ -108,3 +108,4 @@ int uip_ds6_nbr_num(void); uip_ds6_nbr_t *uip_ds6_get_least_lifetime_neighbor(void); #endif /* UIP_DS6_NEIGHBOR_H_ */ +/** @} */ diff --git a/core/net/ipv6/uip-ds6.c b/core/net/ipv6/uip-ds6.c index c5c169afe..4a191caf9 100644 --- a/core/net/ipv6/uip-ds6.c +++ b/core/net/ipv6/uip-ds6.c @@ -702,5 +702,6 @@ uip_ds6_compute_reachable_time(void) UIP_ND6_MIN_RANDOM_FACTOR(uip_ds6_if.base_reachable_time)); } /*---------------------------------------------------------------------------*/ -/** @} */ #endif /* UIP_CONF_IPV6 */ + +/** @}*/ diff --git a/core/net/mac/frame802154.h b/core/net/mac/frame802154.h index fbb344ff0..87358f6d9 100644 --- a/core/net/mac/frame802154.h +++ b/core/net/mac/frame802154.h @@ -166,3 +166,4 @@ int frame802154_parse(uint8_t *data, int length, frame802154_t *pf); /** @} */ #endif /* FRAME_802154_H */ +/** @} */ diff --git a/core/net/rpl/rpl-dag.c b/core/net/rpl/rpl-dag.c index 08178d5ad..bf8424afb 100644 --- a/core/net/rpl/rpl-dag.c +++ b/core/net/rpl/rpl-dag.c @@ -364,7 +364,7 @@ check_prefix(rpl_prefix_t *last_prefix, rpl_prefix_t *new_prefix) uip_ds6_addr_rm(rep); } } - + if(new_prefix != NULL) { set_ip_from_prefix(&ipaddr, new_prefix); if(uip_ds6_addr_lookup(&ipaddr) == NULL) { @@ -381,7 +381,7 @@ rpl_set_prefix(rpl_dag_t *dag, uip_ipaddr_t *prefix, unsigned len) { rpl_prefix_t last_prefix; uint8_t last_len = dag->prefix_info.length; - + if(len > 128) { return 0; } @@ -398,7 +398,7 @@ rpl_set_prefix(rpl_dag_t *dag, uip_ipaddr_t *prefix, unsigned len) if(last_len == 0) { PRINTF("rpl_set_prefix - prefix NULL\n"); check_prefix(NULL, &dag->prefix_info); - } else { + } else { PRINTF("rpl_set_prefix - prefix NON-NULL\n"); check_prefix(&last_prefix, &dag->prefix_info); } @@ -1310,3 +1310,4 @@ rpl_lock_parent(rpl_parent_t *p) } /*---------------------------------------------------------------------------*/ #endif /* UIP_CONF_IPV6 */ +/** @} */ diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index 72289e0a4..4913e2aee 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -357,3 +357,5 @@ rpl_insert_header(void) } /*---------------------------------------------------------------------------*/ #endif /* UIP_CONF_IPV6 */ + +/** @}*/ diff --git a/core/net/rpl/rpl-icmp6.c b/core/net/rpl/rpl-icmp6.c index b744f4dc8..170c2cd11 100644 --- a/core/net/rpl/rpl-icmp6.c +++ b/core/net/rpl/rpl-icmp6.c @@ -274,7 +274,7 @@ dio_input(void) PRINTF("RPL: Incoming DIO (id, ver, rank) = (%u,%u,%u)\n", (unsigned)dio.instance_id, - (unsigned)dio.version, + (unsigned)dio.version, (unsigned)dio.rank); dio.grounded = buffer[i] & RPL_DIO_GROUNDED; @@ -330,11 +330,11 @@ dio_input(void) dio.mc.obj.etx = get16(buffer, i + 6); PRINTF("RPL: DAG MC: type %u, flags %u, aggr %u, prec %u, length %u, ETX %u\n", - (unsigned)dio.mc.type, - (unsigned)dio.mc.flags, - (unsigned)dio.mc.aggr, - (unsigned)dio.mc.prec, - (unsigned)dio.mc.length, + (unsigned)dio.mc.type, + (unsigned)dio.mc.flags, + (unsigned)dio.mc.aggr, + (unsigned)dio.mc.prec, + (unsigned)dio.mc.length, (unsigned)dio.mc.obj.etx); } else if(dio.mc.type == RPL_DAG_MC_ENERGY) { dio.mc.obj.energy.flags = buffer[i + 6]; @@ -431,7 +431,7 @@ dio_output(rpl_instance_t *instance, uip_ipaddr_t *uc_addr) #endif /* !RPL_LEAF_ONLY */ #if RPL_LEAF_ONLY - /* In leaf mode, we only send DIO messages as unicasts in response to + /* In leaf mode, we only send DIO messages as unicasts in response to unicast DIS messages. */ if(uc_addr == NULL) { PRINTF("RPL: LEAF ONLY have multicast addr: skip dio_output\n"); @@ -957,3 +957,5 @@ rpl_icmp6_register_handlers() } /*---------------------------------------------------------------------------*/ #endif /* UIP_CONF_IPV6 */ + +/** @}*/ diff --git a/core/net/rpl/rpl-mrhof.c b/core/net/rpl/rpl-mrhof.c index 634bec763..547955278 100644 --- a/core/net/rpl/rpl-mrhof.c +++ b/core/net/rpl/rpl-mrhof.c @@ -37,7 +37,7 @@ * \file * The Minimum Rank with Hysteresis Objective Function (MRHOF) * - * This implementation uses the estimated number of + * This implementation uses the estimated number of * transmissions (ETX) as the additive routing metric, * and also provides stubs for the energy metric. * @@ -264,3 +264,5 @@ update_metric_container(rpl_instance_t *instance) #endif /* RPL_DAG_MC == RPL_DAG_MC_ETX */ } #endif /* RPL_DAG_MC == RPL_DAG_MC_NONE */ + +/** @}*/ diff --git a/core/net/rpl/rpl-of0.c b/core/net/rpl/rpl-of0.c index 94d1ebae6..dc0bae47f 100644 --- a/core/net/rpl/rpl-of0.c +++ b/core/net/rpl/rpl-of0.c @@ -125,7 +125,7 @@ best_parent(rpl_parent_t *p1, rpl_parent_t *p2) { rpl_rank_t r1, r2; rpl_dag_t *dag; - + PRINTF("RPL: Comparing parent "); PRINT6ADDR(rpl_get_parent_ipaddr(p1)); PRINTF(" (confidence %d, rank %d) with parent ", @@ -159,3 +159,5 @@ update_metric_container(rpl_instance_t *instance) { instance->mc.type = RPL_DAG_MC_NONE; } + +/** @}*/ diff --git a/core/net/rpl/rpl-timers.c b/core/net/rpl/rpl-timers.c index d2ff5c97f..d8dc68c3f 100644 --- a/core/net/rpl/rpl-timers.c +++ b/core/net/rpl/rpl-timers.c @@ -324,3 +324,5 @@ rpl_cancel_dao(rpl_instance_t *instance) } /*---------------------------------------------------------------------------*/ #endif /* UIP_CONF_IPV6 */ + +/** @}*/ diff --git a/core/net/rpl/rpl.c b/core/net/rpl/rpl.c index fd532c4c6..bf1c3bb42 100644 --- a/core/net/rpl/rpl.c +++ b/core/net/rpl/rpl.c @@ -315,3 +315,5 @@ rpl_init(void) } /*---------------------------------------------------------------------------*/ #endif /* UIP_CONF_IPV6 */ + +/** @}*/ diff --git a/core/sys/rtimer.c b/core/sys/rtimer.c index 60b8b37c1..282c8d86b 100644 --- a/core/sys/rtimer.c +++ b/core/sys/rtimer.c @@ -105,3 +105,5 @@ rtimer_run_next(void) return; } /*---------------------------------------------------------------------------*/ + +/** @}*/ diff --git a/core/sys/subprocess.h b/core/sys/subprocess.h index d7b3760a4..ebb95501e 100644 --- a/core/sys/subprocess.h +++ b/core/sys/subprocess.h @@ -67,3 +67,6 @@ } #endif /* SUBPROCESS_H_ */ + +/** @}*/ +/** @}*/ diff --git a/cpu/avr/dev/lanc111.c b/cpu/avr/dev/lanc111.c index a19798605..cfd20abdf 100644 --- a/cpu/avr/dev/lanc111.c +++ b/cpu/avr/dev/lanc111.c @@ -171,13 +171,13 @@ */ /*@{*/ -/*! - * \brief Bank select register. +/*! + * \brief Bank select register. */ #define NIC_BSR (LANC111_BASE_ADDR + 0x0E) -/*! - * \brief Bank 0 - Transmit control register. +/*! + * \brief Bank 0 - Transmit control register. */ #define NIC_TCR (LANC111_BASE_ADDR + 0x00) @@ -193,13 +193,13 @@ #define TCR_TXENA 0x0001 /*!< \ref NIC_TCR bit mask, enables transmitter. */ -/*! - * \brief Bank 0 - EPH status register. +/*! + * \brief Bank 0 - EPH status register. */ #define NIC_EPHSR (LANC111_BASE_ADDR + 0x02) -/*! - * \brief Bank 0 - Receive control register. +/*! + * \brief Bank 0 - Receive control register. */ #define NIC_RCR (LANC111_BASE_ADDR + 0x04) @@ -212,17 +212,17 @@ #define RCR_PRMS 0x0002 /*!< \ref NIC_RCR bit mask, enables promiscuous mode. */ #define RCR_RX_ABORT 0x0001 /*!< \ref NIC_RCR bit mask, set when receive was aborted. */ -/*! +/*! * \brief Bank 0 - Counter register. */ #define NIC_ECR (LANC111_BASE_ADDR + 0x06) -/*! +/*! * \brief Bank 0 - Memory information register. */ #define NIC_MIR (LANC111_BASE_ADDR + 0x08) -/*! +/*! * \brief Bank 0 - Receive / PHY control register. */ #define NIC_RPCR (LANC111_BASE_ADDR + 0x0A) @@ -233,29 +233,29 @@ #define RPCR_LEDA_PAT 0x0000 /*!< \ref NIC_RPCR bit mask for LEDA mode. */ #define RPCR_LEDB_PAT 0x0010 /*!< \ref NIC_RPCR bit mask for LEDB mode. */ -/*! +/*! * \brief Bank 1 - Configuration register. */ #define NIC_CR (LANC111_BASE_ADDR + 0x00) #define CR_EPH_EN 0x8000 /*!< \ref NIC_CR bit mask, . */ -/*! +/*! * \brief Bank 1 - Base address register. */ #define NIC_BAR (LANC111_BASE_ADDR + 0x02) -/*! +/*! * \brief Bank 1 - Individual address register. */ #define NIC_IAR (LANC111_BASE_ADDR + 0x04) -/*! +/*! * \brief Bank 1 - General purpose register. */ #define NIC_GPR (LANC111_BASE_ADDR + 0x0A) -/*! +/*! * \brief Bank 1 - Control register. */ #define NIC_CTR (LANC111_BASE_ADDR + 0x0C) @@ -654,10 +654,10 @@ static int NicPhyConfig(void) uint16_t phy_to; uint16_t mode; - /* + /* * Reset the PHY and wait until this self clearing bit * becomes zero. We sleep 63 ms before each poll and - * give up after 3 retries. + * give up after 3 retries. */ //printf("Reset PHY.."); NicPhyWrite(NIC_PHYCR, PHYCR_RST); @@ -860,8 +860,8 @@ static void NicInterrupt(void *arg) isr &= imr; /* - * If this is a transmit interrupt, then a packet has been sent. - * So we can clear the transmitter busy flag and wake up the + * If this is a transmit interrupt, then a packet has been sent. + * So we can clear the transmitter busy flag and wake up the * transmitter thread. */ if (isr & INT_TX_EMPTY) { @@ -884,7 +884,7 @@ static void NicInterrupt(void *arg) /* - * If this is a receive interrupt, then wake up the receiver + * If this is a receive interrupt, then wake up the receiver * thread. */ if (isr & INT_RX_OVRN) { @@ -964,7 +964,7 @@ static NETBUF *NicGetPacket(void) uint16_t fsw; uint16_t fbc; - /* Check the fifo empty bit. If it is set, then there is + /* Check the fifo empty bit. If it is set, then there is nothing in the receiver fifo. */ nic_bs(2); if (nic_inw(NIC_FIFO) & 0x8000) { @@ -993,8 +993,8 @@ static NETBUF *NicGetPacket(void) } else { - /* - * Allocate a NETBUF. + /* + * Allocate a NETBUF. * Hack alert: Rev A chips never set the odd frame indicator. */ fbc -= 3; @@ -1022,7 +1022,7 @@ static NETBUF *NicGetPacket(void) * release the buffer in case of an error. * * \return 0 on success, -1 in case of any errors. Errors - * will automatically release the network buffer + * will automatically release the network buffer * structure. */ #if 0 @@ -1034,7 +1034,7 @@ static int NicPutPacket(NETBUF * nb) //printf("[P]"); /* - * Calculate the number of bytes to be send. Do not send packets + * Calculate the number of bytes to be send. Do not send packets * larger than the Ethernet maximum transfer unit. The MTU * consist of 1500 data bytes plus the 14 byte Ethernet header * plus 4 bytes CRC. We check the data bytes only. @@ -1132,7 +1132,7 @@ PROCESS_THREAD(lanc111_process, ev, data) NETBUF *nb;*/ uint8_t imsk; static struct etimer et; - + /* dev = arg; ifn = (IFNET *) dev->dev_icb; ni = (NICINFO *) dev->dev_dcb;*/ @@ -1144,7 +1144,7 @@ PROCESS_THREAD(lanc111_process, ev, data) */ PROCESS_BEGIN(); - + /* while(*((u_long *) (ifn->if_mac)) && *((u_long *) (ifn->if_mac)) != 0xFFFFFFFFUL) {*/ while(0) { @@ -1191,7 +1191,7 @@ PROCESS_THREAD(lanc111_process, ev, data) /* while ((nb = NicGetPacket()) != 0) { if (nb != (NETBUF *) 0xFFFF) { ni->ni_rx_packets++; - (*ifn->if_recv) (dev, nb); + (*ifn->if_recv) (dev, nb); } }*/ nic_outlb(NIC_MSK, imsk | INT_RCV | INT_ERCV); @@ -1247,12 +1247,12 @@ int LancOutput(NUTDEVICE * dev, NETBUF * nb) /*! * \brief Initialize Ethernet hardware. * - * Resets the LAN91C111 Ethernet controller, initializes all required - * hardware registers and starts a background thread for incoming + * Resets the LAN91C111 Ethernet controller, initializes all required + * hardware registers and starts a background thread for incoming * Ethernet traffic. * - * Applications should do not directly call this function. It is - * automatically executed during during device registration by + * Applications should do not directly call this function. It is + * automatically executed during during device registration by * NutRegisterDevice(). * * If the network configuration hasn't been set by the application @@ -1312,11 +1312,11 @@ static IFNET ifn_eth0 = { /*! * \brief Device information structure. * - * A pointer to this structure must be passed to NutRegisterDevice() + * A pointer to this structure must be passed to NutRegisterDevice() * to bind this Ethernet device driver to the Nut/OS kernel. - * An application may then call NutNetIfConfig() with the name \em eth0 + * An application may then call NutNetIfConfig() with the name \em eth0 * of this driver to initialize the network interface. - * + * */ NUTDEVICE devSmsc111 = { 0, /* Pointer to next device. */ @@ -1360,3 +1360,4 @@ lanc111_init(void) return 0; } +/** @} */ diff --git a/platform/avr-atmega128rfa1/apps/raven-lcd-interface/raven-lcd.c b/platform/avr-atmega128rfa1/apps/raven-lcd-interface/raven-lcd.c index c9364f0be..26743f86b 100644 --- a/platform/avr-atmega128rfa1/apps/raven-lcd-interface/raven-lcd.c +++ b/platform/avr-atmega128rfa1/apps/raven-lcd-interface/raven-lcd.c @@ -34,13 +34,13 @@ * \brief This module contains code to interface a Contiki-based * project on the AVR Raven platform's ATMega1284P chip to the LCD * driver chip (ATMega3290P) on the Raven. - * + * * \author Blake Leverett * */ /** \addtogroup raven - * @{ + * @{ */ /** @@ -121,7 +121,7 @@ seqno++; } else { // uip_ip6addr(&UIP_IP_BUF->destipaddr,0x2001,0x0420,0x5FFF,0x007D,0x02D0,0xB7FF,0xFE23,0xE6DB); //?.cisco.com uip_ip6addr(&UIP_IP_BUF->destipaddr,0x2001,0x0420,0x0000,0x0010,0x0250,0x8bff,0xfee8,0xf800); //six.cisco.com - } + } #else uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, uip_ds6_defrt_choose()); //the default router #endif @@ -134,16 +134,16 @@ seqno++; /* put one byte of data */ memset((void *)UIP_ICMP_BUF + UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN, count, PING6_DATALEN); - - + + uip_len = UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN + UIP_IPH_LEN + PING6_DATALEN; UIP_IP_BUF->len[0] = (uint8_t)((uip_len - 40) >> 8); UIP_IP_BUF->len[1] = (uint8_t)((uip_len - 40) & 0x00FF); - + UIP_ICMP_BUF->icmpchksum = 0; UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum(); - - + + tcpip_ipv6_output(); } #if defined(__AVR_ATmega128RFA1__) @@ -178,7 +178,7 @@ char serial_char_received; * * Until someone figures out how to get UART to wake from powerdown, * a three second powersave cycle is used with exit based on any character received. - + * The system clock is adjusted to reflect the sleep time. */ @@ -205,7 +205,7 @@ void micro_sleep(uint8_t howlong) SREG = saved_sreg; // Restore interrupt state. // UCSR(USART,B)&= ~(1< * */ /** \addtogroup raven - * @{ + * @{ */ /** @@ -121,7 +121,7 @@ raven_ping6(void) } else { // uip_ip6addr(&UIP_IP_BUF->destipaddr,0x2001,0x0420,0x5FFF,0x007D,0x02D0,0xB7FF,0xFE23,0xE6DB); //?.cisco.com uip_ip6addr(&UIP_IP_BUF->destipaddr,0x2001,0x0420,0x0000,0x0010,0x0250,0x8bff,0xfee8,0xf800); //six.cisco.com - } + } #else uip_ipaddr_copy(&UIP_IP_BUF->destipaddr, uip_ds6_defrt_choose()); //the default router #endif @@ -134,16 +134,16 @@ raven_ping6(void) /* put one byte of data */ memset((void *)UIP_ICMP_BUF + UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN, count, PING6_DATALEN); - - + + uip_len = UIP_ICMPH_LEN + UIP_ICMP6_ECHO_REQUEST_LEN + UIP_IPH_LEN + PING6_DATALEN; UIP_IP_BUF->len[0] = (uint8_t)((uip_len - 40) >> 8); UIP_IP_BUF->len[1] = (uint8_t)((uip_len - 40) & 0x00FF); - + UIP_ICMP_BUF->icmpchksum = 0; UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum(); - - + + tcpip_ipv6_output(); } @@ -170,7 +170,7 @@ char serial_char_received; * * Until someone figures out how to get UART to wake from powerdown, * a three second powersave cycle is used with exit based on any character received. - + * The system clock is adjusted to reflect the sleep time. */ @@ -197,7 +197,7 @@ void micro_sleep(uint8_t howlong) SREG = saved_sreg; // Restore interrupt state. // UCSR(USART,B)&= ~(1< Date: Tue, 10 Jun 2014 21:32:29 +0200 Subject: [PATCH 151/345] Do not copy more bytes than the filename string contains. --- core/cfs/cfs-coffee.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/cfs/cfs-coffee.c b/core/cfs/cfs-coffee.c index d760199a7..f4e7a26c1 100644 --- a/core/cfs/cfs-coffee.c +++ b/core/cfs/cfs-coffee.c @@ -651,7 +651,7 @@ reserve(const char *name, coffee_page_t pages, } memset(&hdr, 0, sizeof(hdr)); - memcpy(hdr.name, name, sizeof(hdr.name) - 1); + strncpy(hdr.name, name, sizeof(hdr.name) - 1); hdr.max_pages = pages; hdr.flags = HDR_FLAG_ALLOCATED | flags; write_header(&hdr, page); From db60afb2fb26953364aa26193ec37802f136e91e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Th=C3=A9baudeau?= Date: Mon, 6 Jan 2014 21:53:10 +0100 Subject: [PATCH 152/345] leds: Add the leds_set() function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The leds_set() function is added on top of leds_arch_set() in order to have a means of displaying a pattern on a set of LEDs, while keeping the ENERGEST information up to date, which would be missing with a direct call to leds_arch_set(). Signed-off-by: Benoît Thébaudeau --- core/dev/leds.c | 6 ++++++ core/dev/leds.h | 1 + 2 files changed, 7 insertions(+) diff --git a/core/dev/leds.c b/core/dev/leds.c index 1f8dcfa34..9e9c181e4 100644 --- a/core/dev/leds.c +++ b/core/dev/leds.c @@ -90,6 +90,12 @@ leds_get(void) { } /*---------------------------------------------------------------------------*/ void +leds_set(unsigned char ledv) +{ + show_leds(ledv); +} +/*---------------------------------------------------------------------------*/ +void leds_on(unsigned char ledv) { unsigned char changed; diff --git a/core/dev/leds.h b/core/dev/leds.h index b3f2adf70..7264a8dfe 100644 --- a/core/dev/leds.h +++ b/core/dev/leds.h @@ -80,6 +80,7 @@ void leds_blink(void); * Returns the current status of all leds (respects invert) */ unsigned char leds_get(void); +void leds_set(unsigned char leds); void leds_on(unsigned char leds); void leds_off(unsigned char leds); void leds_toggle(unsigned char leds); From d192553309157eb9f1170db081345d72d882949d Mon Sep 17 00:00:00 2001 From: harald Date: Sat, 21 Jun 2014 21:30:48 +0200 Subject: [PATCH 153/345] add i2c driver from Ingo --- platform/osd-merkur/Makefile.osd-merkur | 2 + platform/osd-merkur/dev/i2c.c | 391 ++++++++++++++++++++++++ platform/osd-merkur/dev/i2c.h | 131 ++++++++ 3 files changed, 524 insertions(+) create mode 100644 platform/osd-merkur/dev/i2c.c create mode 100644 platform/osd-merkur/dev/i2c.h diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 31e3afb92..3fb160bdd 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -7,6 +7,8 @@ CONTIKI_TARGET_SOURCEFILES += contiki-main.c params.c node-id.c CONTIKI_TARGET_SOURCEFILES += temperature-sensor.c adc.c led.c sensors.c slip_uart0.c slip.c leds-arch.c #Needed for Button CONTIKI_TARGET_SOURCEFILES += button-sensor.c +# i2c Master +CONTIKI_TARGET_SOURCEFILES += i2c.c #Needed for DHT11 humidity sensor CONTIKI_TARGET_SOURCEFILES += dht11.c #Needed for DS18S20 temperature sensor diff --git a/platform/osd-merkur/dev/i2c.c b/platform/osd-merkur/dev/i2c.c new file mode 100644 index 000000000..d5fe8d34a --- /dev/null +++ b/platform/osd-merkur/dev/i2c.c @@ -0,0 +1,391 @@ +/* + * Copyright (c) 2014, Ingo Gulyas Intembsys + * 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 + * I2C driver for ATMEGA128rfa1 + * + * \author + * Ingo Gulyas Intembsys + * office@intembsys.at + * www.intembsys.at + */ + + +#include "i2c.h" +#include "contiki-conf.h" +#include +#include +#include +#include + +#if I2C_TD != 0 +#include +#include +#include "system_mgmt.h" +#define PRINTD(FORMAT,args...) {sleep_acquire_lock(); printf_P(PSTR(FORMAT),##args); sleep_release_lock();} +#else +#define PRINTD(...) +#endif + +#if WITH_RTDEBUG == 1 +#include "rtdebug.h" +#define RTDEBUG_PUSH(x) rtdebug_push(x) +#else +#warning "I2C Driver compiling without RTDEBUG!" +#define RTDEBUG_PUSH(x) +#endif + +#ifndef TIMEOUT_TIMER +#warning "I2C Driver compiling without TIMEOUT!" +#endif + + +static int8_t wait_job(); +static int8_t wait_stop(); + +static int8_t i2c_ioctl(const i2c_driver* const me, uint8_t cmd, uint8_t arg); +static int8_t i2c_read(const i2c_driver* const me, uint8_t cmd_flags, uint8_t* buffer, uint8_t len); +static int8_t i2c_write(const i2c_driver* const me, uint8_t cmd_flags, const uint8_t* data, uint8_t len); + + +// static linkage of member functions +i2c_driver i2c_drv = {i2c_ioctl, i2c_read, i2c_write}; +// lock spi if driver opened to prevent further opening access +static volatile bool i2c_lock = false; + + +/////////////////////////////////////////////////////////////// +// global functions +/////////////////////////////////////////////////////////////// + +i2c_driver* i2c_open(void) +{ + if(i2c_lock == true) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_OPEN__DEVICE_BUSY); + return NULL; + } + + i2c_lock = true; + power_twi_enable(); + I2C_INIT(); + + TWBR = I2C_FREQ_STANDARD; + TWSR &= ~((1< 0) && (buffer == NULL)) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__ERROR_NULLPOINTER); + return I2C_ERROR_DRIVER; + } + + do + { + if(cmd_flags & I2C_CMD_FLAG_START) + { + I2C_START(); + if(wait_job() != I2C_OK) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__START_TIMEOUT); + status = I2C_ERROR_TIMEOUT; + break; + } + if((I2C_STATUS() != I2C_STATUS_START) && (I2C_STATUS() != I2C_STATUS_START_REP)) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__START_ERROR); + status = I2C_ERROR_START; + break; + } + PRINTD("I2C-RD-START\n"); + } + + if(len == 0) break; + + for(i=0; i<(len-1); i++) + { + I2C_READ_BYTE_ACK(); + if(wait_job() != I2C_OK) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__READ_BYTE_ACK_TIMEOUT); + status = I2C_ERROR_TIMEOUT; + break; + } + if(I2C_STATUS() != I2C_STATUS_DATAR_ACK) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__READ_BYTE_ACK_ERROR); + status = I2C_ERROR_READ; + break; + } + buffer[i] = I2C_RX_REG; + PRINTD("I2C-RD-RACK: 0x%02X\n", buffer[i]); + } + + I2C_READ_BYTE_NACK(); + if(wait_job() != I2C_OK) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__READ_BYTE_NACK_TIMEOUT); + status = I2C_ERROR_TIMEOUT; + break; + } + if(I2C_STATUS() != I2C_STATUS_DATAR_NACK) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__READ_BYTE_NACK_ERROR); + status = I2C_ERROR_READ; + break; + } + buffer[i] = I2C_RX_REG; + PRINTD("I2C-RD-RNACK: 0x%02X\n", buffer[i]); + + } while (0); + + if(cmd_flags & I2C_CMD_FLAG_STOP) + { + I2C_STOP(); + if(wait_stop() != I2C_OK) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_READ__STOP_TIMEOUT); + status = I2C_ERROR_TIMEOUT; + } + PRINTD("I2C-RD_STOP\n"); + } + + return status; +} + +static int8_t i2c_write(const i2c_driver* const me, uint8_t cmd_flags, const uint8_t* data, uint8_t len) +{ + uint8_t i = 0; + int8_t status = I2C_OK; + + + if(me == NULL || i2c_lock == false) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_WRITE__DEVICE_CLOSED); + return I2C_ERROR_DRIVER; + } + + if((len > 0) && (data == NULL)) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_WRITE__ERROR_NULLPOINTER); + return I2C_ERROR_DRIVER; + } + + do + { + if(cmd_flags & I2C_CMD_FLAG_START) + { + I2C_START(); + if(wait_job() != I2C_OK) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_WRITE__START_TIMEOUT); + status = I2C_ERROR_TIMEOUT; + break; + } + if((I2C_STATUS() != I2C_STATUS_START) && (I2C_STATUS() != I2C_STATUS_START_REP)) + { + RTDEBUG_PUSH(RTDEBUG_CODE__I2C_WRITE__START_ERROR); + status = I2C_ERROR_START; + break; + } + PRINTD("I2C-WR-START\n"); + } + + + + for(i=0; i + +//////////////////////////////////////////////////////////////////////////////////////////// +// CONFIGURATION SECTION: + +#define I2C_TD 0 // compiler switch: i2c testdriver code + +#define I2C_PORT PORTD +#define I2C_DDR DDRD +#define I2C_SCL_PIN 0 +#define I2C_SDA_PIN 1 + +// END OF CONFIGURATION SECTION +//////////////////////////////////////////////////////////////////////////////////////////// + +#define I2C_INIT() ({I2C_DDR &= ~((1< CHECK F_CPU SETTINGS!" +#endif + + +#define I2C_STATUS_REG TWSR +#define I2C_TX_REG TWDR +#define I2C_RX_REG TWDR + +#define I2C_START() (TWCR = (1< Date: Sat, 21 Jun 2014 13:13:48 +0200 Subject: [PATCH 154/345] Initial implementation of avr hardware timer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mainly for PWM use for now. With example to set the LED to different brightness via COAP. We switch the LED with 50 kHz (20µs) in this example. --- cpu/avr/Makefile.avr | 4 +- cpu/avr/hw_pwm_timer.c | 142 +++++++ cpu/avr/hw_timer.c | 103 ++++++ cpu/avr/hw_timer.h | 370 +++++++++++++++++++ examples/osd/pwm-example/.gitignore | 1 + examples/osd/pwm-example/Makefile | 99 +++++ examples/osd/pwm-example/er-example-server.c | 149 ++++++++ examples/osd/pwm-example/flash.sh | 2 + examples/osd/pwm-example/led_pwm.h | 26 ++ examples/osd/pwm-example/project-conf.h | 97 +++++ examples/osd/pwm-example/resource_led_pwm.c | 174 +++++++++ examples/osd/pwm-example/run.sh | 5 + 12 files changed, 1171 insertions(+), 1 deletion(-) create mode 100644 cpu/avr/hw_pwm_timer.c create mode 100644 cpu/avr/hw_timer.c create mode 100644 cpu/avr/hw_timer.h create mode 100644 examples/osd/pwm-example/.gitignore create mode 100644 examples/osd/pwm-example/Makefile create mode 100644 examples/osd/pwm-example/er-example-server.c create mode 100755 examples/osd/pwm-example/flash.sh create mode 100644 examples/osd/pwm-example/led_pwm.h create mode 100644 examples/osd/pwm-example/project-conf.h create mode 100644 examples/osd/pwm-example/resource_led_pwm.c create mode 100755 examples/osd/pwm-example/run.sh diff --git a/cpu/avr/Makefile.avr b/cpu/avr/Makefile.avr index f1b09e82f..2656054a3 100644 --- a/cpu/avr/Makefile.avr +++ b/cpu/avr/Makefile.avr @@ -13,7 +13,9 @@ CONTIKI_CPU=$(CONTIKI)/cpu/avr ### These directories will be searched for the specified source files ### TARGETLIBS are platform-specific routines in the contiki library path CONTIKI_CPU_DIRS = . dev -AVR = clock.c mtarch.c eeprom.c flash.c rs232.c leds-arch.c watchdog.c rtimer-arch.c bootloader.c +AVR = clock.c mtarch.c eeprom.c flash.c rs232.c leds-arch.c \ + watchdog.c rtimer-arch.c bootloader.c hw_timer.c \ + hw_pwm_timer.c ELFLOADER = elfloader.c elfloader-avr.c symtab-avr.c TARGETLIBS = random.c leds.c diff --git a/cpu/avr/hw_pwm_timer.c b/cpu/avr/hw_pwm_timer.c new file mode 100644 index 000000000..2c45ce729 --- /dev/null +++ b/cpu/avr/hw_pwm_timer.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \addgroup hardware timer + * + * @{ + */ + +/** + * \file + * Alternative initialisation with period in microseconds + * \author + * Ralf Schlatterbeck + */ + +#include +#include "contiki.h" +#include "rtimer-arch.h" +#include "hw_timer.h" + +/* one for each possible timer */ +uint16_t hwt_max_ticks [6]; + +#define PERIOD_MAX (0xFFFFFFFF / (F_CPU / 1000000)) +/* for 16-bit timer: */ +#define TICKS_MAX 0xFFFF +#define TICKS_MIN 0xFF + +int8_t +hwtimer_pwm_ini (uint8_t timer, uint32_t period_us, uint8_t pwm_type, uint8_t ocra) +{ + uint32_t ticks = 0; + uint8_t clock = HWT_CLOCK_PRESCALER_1024; + uint8_t wgm = HWT_WGM_NORMAL; + HWT_CHECK_TIMER (timer); + if (period_us > PERIOD_MAX) { + period_us = PERIOD_MAX; + } + ticks = (F_CPU / 1000000) * period_us; + /* Non-fast PWM modes have half the frequency */ + if (pwm_type != HWT_PWM_FAST) { + ticks >>= 1; + } + + /* + * Divisors are 1, 8, 64, 256, 1024, shifts between these are + * 3, 3, 2, 2, respectively. We modify `ticks` in place, the AVR can + * shift only one bit in one instruction, so shifting isn't cheap. + * We try to get the *maximum* prescaler that still permits a tick + * resolution of at least 8 bit. + */ + if (ticks <= (TICKS_MIN << 3)) { + clock = HWT_CLOCK_PRESCALER_1; + } + else if ((ticks >>= 3) <= (TICKS_MIN << 3)) { + clock = HWT_CLOCK_PRESCALER_8; + } + else if ((ticks >>= 3) <= (TICKS_MIN << 2)) { + clock = HWT_CLOCK_PRESCALER_64; + } + else if ((ticks >>= 2) <= (TICKS_MIN << 2)) { + clock = HWT_CLOCK_PRESCALER_256; + } + else if ((ticks >>= 2) > TICKS_MAX) { + ticks = TICKS_MAX; + } + hwt_max_ticks [timer] = ticks; + switch (pwm_type) { + case HWT_PWM_FAST: + wgm = ocra ? HWT_WGM_PWM_FAST_OCRA : HWT_WGM_PWM_FAST_ICR; + break; + case HWT_PWM_PHASE_CORRECT: + wgm = ocra ? HWT_WGM_PWM_PHASE_OCRA : HWT_WGM_PWM_PHASE_ICR; + break; + case HWT_PWM_PHASE_FRQ_CORRECT: + default: + wgm = ocra ? HWT_WGM_PWM_PHASE_FRQ_OCRA : HWT_WGM_PWM_PHASE_FRQ_ICR; + break; + } + /* Special 8- 9- 10-bit modes */ + if (pwm_type == HWT_PWM_FAST || pwm_type == HWT_PWM_PHASE_CORRECT) { + if (ticks == 0xFF) { + wgm = (pwm_type == HWT_PWM_FAST) + ? HWT_WGM_PWM_FAST_8_BIT + : HWT_WGM_PWM_PHASE_8_BIT; + } + else if (ticks == 0x1FF) { + wgm = (pwm_type == HWT_PWM_FAST) + ? HWT_WGM_PWM_FAST_9_BIT + : HWT_WGM_PWM_PHASE_9_BIT; + } + else if (ticks == 0x3FF) { + wgm = (pwm_type == HWT_PWM_FAST) + ? HWT_WGM_PWM_FAST_10_BIT + : HWT_WGM_PWM_PHASE_10_BIT; + } + } + return hwtimer_ini (timer, wgm, clock, ticks); +} + +uint32_t hwtimer_pwm_max_ticks (uint8_t timer) +{ + if (timer > 5) { + return 0; + } + return hwt_max_ticks [timer]; +} + +/* + * ex:ts=8:et:sw=2 + */ + +/** @} */ diff --git a/cpu/avr/hw_timer.c b/cpu/avr/hw_timer.c new file mode 100644 index 000000000..f3ec11930 --- /dev/null +++ b/cpu/avr/hw_timer.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \addgroup hardware timer + * + * @{ + */ + +/** + * \file + * Header file for hardware timer of AVR microcontrollers + * \author + * Ralf Schlatterbeck + */ + +#include +#include "contiki.h" +#include "rtimer-arch.h" +#include "hw_timer.h" + +#ifndef PLAT_TIMER +#define PLAT_TIMER 0xFF /* invalid timer for comparison */ +#endif + +int8_t hwtimer_ini (uint8_t timer, uint8_t wgm, uint8_t clock, uint16_t maxt) +{ + int8_t i; + HWT_CHECK_TIMER (timer); + if (wgm > HWT_WGM_MASK || wgm == HWT_WGM_RESERVED) { + return HWT_ERR_INVALID_WGM; + } + if (clock > HWT_CLOCK_MASK) { + return HWT_ERR_INVALID_CLOCK; + } + /* Turn off clock, no need to disable interrupt */ + *HWT_TCCRB (timer) &= ~HWT_CLOCK_MASK; + + *HWT_TCCRA (timer) &= ~(HWT_WGM_MASK_LOW << HWT_WGM_SHIFT_LOW); + *HWT_TCCRA (timer) |= ((wgm & HWT_WGM_MASK_LOW) << HWT_WGM_SHIFT_LOW); + *HWT_TCCRB (timer) &= ~(HWT_WGM_MASK_HIGH << HWT_WGM_SHIFT_HIGH); + *HWT_TCCRB (timer) |= ((wgm & HWT_WGM_MASK_HIGH) << HWT_WGM_SHIFT_HIGH); + + for (i=0; i<3; i++) { + HWT_SET_COM (timer, i, HWT_COM_NORMAL); + } + + if ( wgm == HWT_WGM_PWM_PHASE_FRQ_ICR + || wgm == HWT_WGM_PWM_PHASE_ICR + || wgm == HWT_WGM_CTC_ICR + || wgm == HWT_WGM_PWM_FAST_ICR + ) + { + *HWT_ICR (timer) = maxt; + } + + if ( wgm == HWT_WGM_CTC_OCRA + || wgm == HWT_WGM_PWM_PHASE_FRQ_OCRA + || wgm == HWT_WGM_PWM_PHASE_OCRA + || wgm == HWT_WGM_PWM_FAST_OCRA + ) + { + *HWT_OCRA (timer) = maxt; + } + + /* Set clock, finally */ + *HWT_TCCRB (timer) |= clock; + return 0; +} + +/* + * ex:ts=8:et:sw=2 + */ + +/** @} */ diff --git a/cpu/avr/hw_timer.h b/cpu/avr/hw_timer.h new file mode 100644 index 000000000..3b98566ce --- /dev/null +++ b/cpu/avr/hw_timer.h @@ -0,0 +1,370 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \defgroup hardware timer + * + * This module wraps hardware timers of AVR microcontrollers. + * Currently we only support 16-bit timers. The main focus is currently + * on PWM generation. But input capture and interrupt routines are on + * the TODO list, see below. We currently support the AVR ATmega128RFA1 + * so this should be generalized to supported timers of other AVR + * microcontrollers. + * + * Datasheet references in the following refer to ATmega128RFA1 data sheet + * + * TODO: Allow input capture. + * TODO: Allow definition of interrupt routine; check if merkur board + * supports necessary pins. + * TODO: Generalize for 8-bit timers. + * TODO: Check other AVR microcontrollers and the supported timers. + * + * @{ + */ + +/** + * \file + * Header file for hardware timer of AVR microcontrollers + * \author + * Ralf Schlatterbeck + * + */ + +#ifndef hw_timer_h +#define hw_timer_h + +#include "contiki.h" +#include "rtimer-arch.h" + +#ifndef PLAT_TIMER +#define PLAT_TIMER -1 +#endif + +/* + * All routines return a negative number for error and 0 for success. + * The negative return value indicates the error. + */ +#define HWT_ERR_INVALID_TIMER (-1) +#define HWT_ERR_INVALID_WGM (-2) +#define HWT_ERR_INVALID_COM (-3) +#define HWT_ERR_INVALID_CLOCK (-4) +#define HWT_ERR_INVALID_CHANNEL (-5) + +/* + * Timer waveform generation modes (WGM), see data sheet + * chapter 18 "16-bit Timer/Counter (Timer/Counter 1,3,4, and 5) + * 18.9 "Modes of Operation", in particular Table 18-5 + */ +#define HWT_WGM_NORMAL 0 +#define HWT_WGM_PWM_PHASE_8_BIT 1 +#define HWT_WGM_PWM_PHASE_9_BIT 2 +#define HWT_WGM_PWM_PHASE_10_BIT 3 +#define HWT_WGM_CTC_OCRA 4 +#define HWT_WGM_PWM_FAST_8_BIT 5 +#define HWT_WGM_PWM_FAST_9_BIT 6 +#define HWT_WGM_PWM_FAST_10_BIT 7 +#define HWT_WGM_PWM_PHASE_FRQ_ICR 8 +#define HWT_WGM_PWM_PHASE_FRQ_OCRA 9 +#define HWT_WGM_PWM_PHASE_ICR 10 +#define HWT_WGM_PWM_PHASE_OCRA 11 +#define HWT_WGM_CTC_ICR 12 +#define HWT_WGM_RESERVED 13 +#define HWT_WGM_PWM_FAST_ICR 14 +#define HWT_WGM_PWM_FAST_OCRA 15 +#define HWT_WGM_MASK 15 +#define HWT_WGM_MASK_LOW 3 +#define HWT_WGM_MASK_HIGH (HWT_WGM_MASK - HWT_WGM_MASK_LOW) +#define HWT_WGM_SHIFT_LOW 0 +#define HWT_WGM_SHIFT_HIGH 1 + +/* + * Timer compare output modes (COM), + * chapter 18 "16-bit Timer/Counter (Timer/Counter 1,3,4, and 5) + * 18.8 "Compare Match Output Unit", in particular Tables 18-2,3,4 + */ +#define HWT_COM_NORMAL 0 +#define HWT_COM_TOGGLE 1 +#define HWT_COM_CLEAR 2 +#define HWT_COM_SET 3 +#define HWT_COM_MASK 3 + +/* + * Clock select, clock can be off, use prescaler or external clock + * source on Tn pin. See Table 18-11 (for Timer 1 but this is the same + * for all the timers). + */ +#define HWT_CLOCK_OFF 0 +#define HWT_CLOCK_PRESCALER_1 1 +#define HWT_CLOCK_PRESCALER_8 2 +#define HWT_CLOCK_PRESCALER_64 3 +#define HWT_CLOCK_PRESCALER_256 4 +#define HWT_CLOCK_PRESCALER_1024 5 +#define HWT_CLOCK_EXTERN_FALLING 6 +#define HWT_CLOCK_EXTERN_RISING 7 +#define HWT_CLOCK_MASK 7 + +/* + * Timer channels A B C + */ +#define HWT_CHANNEL_A 0 +#define HWT_CHANNEL_B 1 +#define HWT_CHANNEL_C 2 + +/* The following macros are defined for timer values 1,3,4,5 */ +#define HWT_ICR(t) \ + ((t)<4?((t)==1?(&ICR1) :(&ICR3)) :((t)==4?(&ICR4) :(&ICR5))) +#define HWT_OCRA(t) \ + ((t)<4?((t)==1?(&OCR1A):(&OCR3A)):((t)==4?(&OCR4A):(&OCR5A))) +#define HWT_OCRB(t) \ + ((t)<4?((t)==1?(&OCR1B):(&OCR3B)):((t)==4?(&OCR4B):(&OCR5B))) +#define HWT_OCRC(t) \ + ((t)<4?((t)==1?(&OCR1C):(&OCR3C)):((t)==4?(&OCR4C):(&OCR5C))) + +#define HWT_OCR(t,c) \ + ( (c)==HWT_CHANNEL_A \ + ? (HWT_OCRA(t)) \ + : ((c)==HWT_CHANNEL_B?HWT_OCRB(t):HWT_OCRC(t)) \ + ) + +#define HWT_TCCRA(t) \ + ( (t)<4 \ + ? ((t)==1?(&TCCR1A):(&TCCR3A)) \ + : ((t)==4?(&TCCR4A):(&TCCR5A)) \ + ) +#define HWT_TCCRB(t) \ + ( (t)<4 \ + ? ((t)==1?(&TCCR1B):(&TCCR3B)) \ + : ((t)==4?(&TCCR4B):(&TCCR5B)) \ + ) +#define HWT_TCCRC(t) \ + ( (t)<4 \ + ? ((t)==1?(&TCCR1C):(&TCCR3C)) \ + : ((t)==4?(&TCCR4C):(&TCCR5C)) \ + ) +#define HWT_TCNT(t) \ + ( (t)<4 \ + ? ((t)==1?(&TCNT1) :(&TCNT3)) \ + : ((t)==4?(&TCNT4) :(&TCNT5)) \ + ) + +#define HWT_SET_COM(timer, channel, com) \ + ((*HWT_TCCRA (timer) &= ~(HWT_COM_MASK << (6 - 2 * (channel)))) \ + ,(*HWT_TCCRA (timer) |= ((com) << (6 - 2 * (channel)))) \ + ) + +#define HWT_CHECK_TIMER(timer) \ + do { \ + if ((timer) == 0 || (timer) == 2 || (timer) == PLAT_TIMER || (timer) > 5) {\ + return HWT_ERR_INVALID_TIMER; \ + } \ + } while (0) + +#define HWT_CHECK_CHANNEL(chan) \ + do { \ + if ((chan) > HWT_CHANNEL_C) { \ + return HWT_ERR_INVALID_CHANNEL; \ + } \ + } while (0) + +#define HWT_PWM_FAST 0 +#define HWT_PWM_PHASE_CORRECT 1 +#define HWT_PWM_PHASE_FRQ_CORRECT 2 + +/** + * \brief Initialize the hardware timer with the given settings + * \param timer: Timer to use + * \param wgm: waveform generation mode to use, see definitions + * \param clock: Prescaler or external clock settings + * \param maxt: Maximum counter value, not used for fixed modes, this + * sets ICRn for the ICR modes and OCRnA for the OCR modes + * \return see HWT_ERR definitions for return codes, returns 0 if ok + * + * The initial compare output mode is set to HWT_COM_NORMAL (off) for + * all outputs (pwm disabled). + * + * Note that this sets the compare output mode COM registers to 0, + * turning off PWM on outputs. + */ +int8_t hwtimer_ini (uint8_t timer, uint8_t wgm, uint8_t clock, uint16_t maxt); + +/** + * \brief Convenience function to initialize hardware timer for PWM + * \param timer: Timer to use + * \param pwm_type: See HWT_PWM* macros + * \param period_us: Period of the timer in µs + * \param ocra: Use OCRnA register if set, ICRn otherwise + * \return see HWT_ERR definitions for return codes, returns 0 if ok + * + * This function can be called instead of hwtimer_ini and sets up the + * timer for one of the PWM modes. There are fast, phase-correct and + * phase- and frequency correct modes, refer to the datasheet for + * semantics. + * + * The function tries to initialize the timer to a mode that doesn't use + * one of the internal registers OCRnA or ICRn for specifying the upper + * bound of the counter. For fast PWM and phase-correct PWM there are + * fixed 8-, 9-, and 10-bit modes that can be used if the computed value + * fits one of these setups. + * + * We try to get the *maximum* prescaler that still permits a tick + * resolution of at least 8 bit. This will not work for very high + * frequencies. + * + * If the specified period is too large to fit into a 16-bit timer we + * take the maximum period that is still possible, this may be + * substatially higher than specified. + * + * Note that when using OCRnA for the upper bound of the counter, the + * pin associated with this register can not be used for PWM. Instead it + * can be used to change the period. + */ +int8_t +hwtimer_pwm_ini (uint8_t timer, uint32_t period_us, uint8_t pwm_type, uint8_t ocra); + +/* + * Simple init macro for sane default values + */ +#define hwtimer_pwm_ini_simple (timer, period_us) \ + hwtimer_pwm_ini ((timer), HWT_PWM_PHASE_CORRECT, (period_us), 0) + +/** + * \brief Maximum timer value usable in hwtimer_set_pwm + * \param timer: Timer to use + * \return + * + * + */ +uint32_t hwtimer_pwm_max_ticks (uint8_t timer); + +/* + * The following functions are defined inline to allow for compiler + * optimizations if some of the parameters are constant. + */ + +/** + * \brief Set PWM duty cycle + * \param timer: Timer to use + * \param channel: Channel to use, see HWT_CHANNEL definitions + * \param pwm: Duty cycle + * \return see HWT_ERR definitions for return codes, returns 0 if ok + * + * Note that the available range for the duty cycle depends on the timer + * setup and the chosen mode. + */ +static inline int8_t +hwtimer_set_pwm (uint8_t timer, uint8_t channel, uint16_t pwm) +{ + uint8_t sreg = 0; + HWT_CHECK_TIMER (timer); + HWT_CHECK_CHANNEL (channel); + sreg = SREG; + cli (); + *HWT_OCR (timer, channel) = pwm; + SREG = sreg; + return 0; +} + +/** + * \brief Set compare output mode + * \param timer: Timer to use + * \param channel: Channel to use, see HWT_CHANNEL definitions + * \param com: compare output mode for given channel + * \return see HWT_ERR definitions for return codes, returns 0 if ok + */ +static inline int8_t +hwtimer_set_com (uint8_t timer, uint8_t channel, uint8_t com) +{ + HWT_CHECK_TIMER (timer); + HWT_CHECK_CHANNEL (channel); + if (com > HWT_COM_MASK) { + return HWT_ERR_INVALID_COM; + } + HWT_SET_COM (timer, channel, com); + return 0; +} + +/** + * \brief Convenience function for setting compare output mode for PWM + * \param timer: Timer to use + * \param channel: Channel to use, see HWT_CHANNEL definitions + * \return see HWT_ERR definitions for return codes, returns 0 if ok + */ +static inline int8_t +hwtimer_pwm_enable (uint8_t timer, uint8_t channel) +{ + return hwtimer_set_com (timer, channel, HWT_COM_CLEAR); +} + +/** + * \brief Convenience function for inverse compare output mode for PWM + * \param timer: Timer to use + * \param channel: Channel to use, see HWT_CHANNEL definitions + * \return see HWT_ERR definitions for return codes, returns 0 if ok + */ +static inline int8_t +hwtimer_pwm_inverse (uint8_t timer, uint8_t channel) +{ + return hwtimer_set_com (timer, channel, HWT_COM_SET); +} + +/** + * \brief Convenience function for setting compare output mode to off + * \param timer: Timer to use + * \param channel: Channel to use, see HWT_CHANNEL definitions + * \return see HWT_ERR definitions for return codes, returns 0 if ok + */ +static inline int8_t +hwtimer_pwm_disable (uint8_t timer, uint8_t channel) +{ + return hwtimer_set_com (timer, channel, HWT_COM_NORMAL); +} + +/** + * \brief Turn off the clock + * \param timer: Timer to use + * \return see HWT_ERR definitions for return codes, returns 0 if ok + */ +static inline int8_t +hwtimer_fin (uint8_t timer) +{ + HWT_CHECK_TIMER (timer); + *HWT_TCCRB (timer) &= ~HWT_CLOCK_MASK; + *HWT_TCCRB (timer) |= HWT_CLOCK_OFF; /* technically not necessary this is 0 */ + return 0; +} + +#endif /* hw_timer_h */ + +/* + * ex:ts=8:et:sw=2 + */ + +/** @} */ diff --git a/examples/osd/pwm-example/.gitignore b/examples/osd/pwm-example/.gitignore new file mode 100644 index 000000000..5761abcfd --- /dev/null +++ b/examples/osd/pwm-example/.gitignore @@ -0,0 +1 @@ +*.o diff --git a/examples/osd/pwm-example/Makefile b/examples/osd/pwm-example/Makefile new file mode 100644 index 000000000..480983734 --- /dev/null +++ b/examples/osd/pwm-example/Makefile @@ -0,0 +1,99 @@ +all: er-example-server \ + er-example-server.osd-merkur.hex er-example-server.osd-merkur.eep +# use this target explicitly if requried: er-plugtest-server + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += resource_led_pwm.c + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 json + +include $(CONTIKI)/Makefile.include + +er-example-server.osd-merkur.hex: er-example-server.osd-merkur + avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur \ + er-example-server.osd-merkur.hex + +er-example-server.osd-merkur.eep: er-example-server.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + er-example-server.osd-merkur er-example-server.osd-merkur.eep + +flash: er-example-server.osd-merkur.hex er-example-server.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U \ + flash:w:er-example-server.osd-merkur.hex:a -U \ + eeprom:w:er-example-server.osd-merkur.eep:a + +.PHONY: flash + +$(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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/pwm-example/er-example-server.c b/examples/osd/pwm-example/er-example-server.c new file mode 100644 index 000000000..6f6fddbbb --- /dev/null +++ b/examples/osd/pwm-example/er-example-server.c @@ -0,0 +1,149 @@ +/* + * 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) PWM REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + * Ralf Schlatterbeck + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" +#include "jsonparse.h" + +#include "erbium.h" +#include "er-coap-13.h" + +#include "led_pwm.h" + +#define DEBUG 1 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +/******************************************************************************/ + +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI + * path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented + * for each RESOURCE. A buffer for the response payload is provided + * through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE + * limit for the buffer. If a smaller block size is requested for CoAP, + * the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* + * Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, + * see the chunk resource. + */ + // jSON Format + index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); + index += sprintf(message + index," \"name\" : \"PWM\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} + +void +hw_init() +{ + led_pwm_init (); +} + +PROCESS(rest_server_example, "Erbium Example Server"); + +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + PRINTF("Starting Erbium Example 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) \ + && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ + rest_activate_resource(&resource_info); + rest_activate_resource(&resource_led_pwm); + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/pwm-example/flash.sh b/examples/osd/pwm-example/flash.sh new file mode 100755 index 000000000..e9cb40bfc --- /dev/null +++ b/examples/osd/pwm-example/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur flash diff --git a/examples/osd/pwm-example/led_pwm.h b/examples/osd/pwm-example/led_pwm.h new file mode 100644 index 000000000..b93008136 --- /dev/null +++ b/examples/osd/pwm-example/led_pwm.h @@ -0,0 +1,26 @@ +/** + * \defgroup LED PWM example + * + * Resource definition for LED PWM module + * + * @{ + */ + +/** + * \file + * Resource definitions for the LED PWM module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef led_pwm_h +#define led_pwm_h +#include "contiki.h" +#include "erbium.h" + +extern resource_t resource_led_pwm; +extern void led_pwm_init (void); + +#endif // led_pwm_h +/** @} */ diff --git a/examples/osd/pwm-example/project-conf.h b/examples/osd/pwm-example/project-conf.h new file mode 100644 index 000000000..0b651669e --- /dev/null +++ b/examples/osd/pwm-example/project-conf.h @@ -0,0 +1,97 @@ +/* + * 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 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/pwm-example/resource_led_pwm.c b/examples/osd/pwm-example/resource_led_pwm.c new file mode 100644 index 000000000..a9b276e08 --- /dev/null +++ b/examples/osd/pwm-example/resource_led_pwm.c @@ -0,0 +1,174 @@ +/** + * \file + * Resource for hardware timer handling + * \author + * Ralf Schlatterbeck + * + * \brief get/put pwm for LED pin + */ + +#include +#include +#include +#include "contiki.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" +#include "hw_timer.h" + +/* Error-handling macro */ +# define BYE(_exp, _tag) \ + do { \ + PRINTF("Expect "_exp": %d\n",_tag); \ + success=0; \ + goto bye; \ + } while(0) + +#define DEBUG 1 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +static uint16_t max_ticks = 0, pwm = 0; + +void led_pwm_init (void) +{ + int8_t result = hwtimer_pwm_ini (3, 20, HWT_PWM_PHASE_CORRECT, 0); + PRINTF ("HWTIMER init: %d\n", result); + max_ticks = hwtimer_pwm_max_ticks (3); + pwm = max_ticks / 2; + hwtimer_set_pwm (3, HWT_CHANNEL_C, pwm); + hwtimer_pwm_inverse (3, HWT_CHANNEL_C); + DDRE |= (1< max_ticks) { + pwm = max_ticks; + } + PRINTF ("Setting: %d (max=%d)\n", pwm, max_ticks); + hwtimer_pwm_inverse (3, HWT_CHANNEL_C); + DDRE |= (1< Date: Thu, 26 Jun 2014 08:37:19 +0200 Subject: [PATCH 155/345] Allow compilation of c++ files (extension .cpp) --- Makefile.include | 42 ++++++++++++++++++++++++++++++------------ cpu/avr/Makefile.avr | 7 +++++++ 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Makefile.include b/Makefile.include index 014dbed41..ad20b23bd 100644 --- a/Makefile.include +++ b/Makefile.include @@ -65,7 +65,7 @@ CONTIKI_SOURCEFILES += $(CONTIKIFILES) CONTIKIDIRS += ${addprefix $(CONTIKI)/core/,dev lib net net/mac net/rime \ net/rpl sys cfs ctk lib/ctk loader . } -oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}} +oname = ${patsubst %.cpp,%.o,${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}}} CONTIKI_OBJECTFILES = ${addprefix $(OBJECTDIR)/,${call oname, $(CONTIKI_SOURCEFILES)}} @@ -117,16 +117,18 @@ endif ### Verbosity control. Use make V=1 to get verbose builds. ifeq ($(V),1) - TRACE_CC = - TRACE_LD = - TRACE_AR = - TRACE_AS = + TRACE_CC = + TRACE_CXX = + TRACE_LD = + TRACE_AR = + TRACE_AS = Q= else - TRACE_CC = @echo " CC " $< - TRACE_LD = @echo " LD " $@ - TRACE_AR = @echo " AR " $@ - TRACE_AS = @echo " AS " $< + TRACE_CC = @echo " CC " $< + TRACE_CXX = @echo " CXX " $< + TRACE_LD = @echo " LD " $@ + TRACE_AR = @echo " AR " $@ + TRACE_AS = @echo " AS " $< Q=@ endif @@ -145,8 +147,9 @@ CONTIKI_CPU_DIRS_CONCAT = ${addprefix $(CONTIKI_CPU)/, \ SOURCEDIRS = . $(PROJECTDIRS) $(CONTIKI_TARGET_DIRS_CONCAT) \ $(CONTIKI_CPU_DIRS_CONCAT) $(CONTIKIDIRS) $(APPDS) ${dir $(target_makefile)} -vpath %.c $(SOURCEDIRS) -vpath %.S $(SOURCEDIRS) +vpath %.c $(SOURCEDIRS) +vpath %.cpp $(SOURCEDIRS) +vpath %.S $(SOURCEDIRS) CFLAGS += ${addprefix -I,$(SOURCEDIRS) $(CONTIKI)} @@ -162,7 +165,7 @@ endif ifneq ($(MAKECMDGOALS),clean) -include ${addprefix $(OBJECTDIR)/,$(CONTIKI_SOURCEFILES:.c=.d) \ - $(PROJECT_SOURCEFILES:.c=.d)} + $(PROJECT_OBJECTFILES:.o=.d)} endif ### See http://make.paulandlesley.org/autodep.html#advanced @@ -201,6 +204,13 @@ $(OBJECTDIR)/%.o: %.c | $(OBJECTDIR) @$(FINALIZE_DEPENDENCY) endif +ifndef CUSTOM_RULE_CPP_TO_OBJECTDIR_O +$(OBJECTDIR)/%.o: %.cpp | $(OBJECTDIR) + $(TRACE_CXX) + $(Q)$(CXX) $(CFLAGS) -MMD -c $< -o $@ + @$(FINALIZE_DEPENDENCY) +endif + ifndef CUSTOM_RULE_S_TO_OBJECTDIR_O $(OBJECTDIR)/%.o: %.S | $(OBJECTDIR) $(TRACE_AS) @@ -213,6 +223,12 @@ ifndef CUSTOM_RULE_C_TO_O $(Q)$(CC) $(CFLAGS) -c $< -o $@ endif +ifndef CUSTOM_RULE_CPP_TO_O +%.o: %.cpp + $(TRACE_CXX) + $(Q)$(CXX) $(CFLAGS) -c $< -o $@ +endif + ifndef CUSTOM_RULE_C_TO_CO %.co: %.c @@ -256,6 +272,8 @@ endif # the match-anything rule below instead. %: %.c +%: %.cpp + # Match-anything pattern rule to allow the project makefiles to # abstract from the actual binary name. It needs to contain some # command in order to be a rule, not just a prerequisite. diff --git a/cpu/avr/Makefile.avr b/cpu/avr/Makefile.avr index 2656054a3..ee88407d6 100644 --- a/cpu/avr/Makefile.avr +++ b/cpu/avr/Makefile.avr @@ -90,6 +90,7 @@ CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) ### Compiler definitions CC = avr-gcc +CXX = avr-g++ LD = avr-gcc AS = avr-as AR = avr-ar @@ -130,6 +131,12 @@ $(OBJECTDIR)/%.o: %.c | $(OBJECTDIR) %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ +$(OBJECTDIR)/%.o: %.cpp | $(OBJECTDIR) + $(CXX) $(CFLAGS) -c $< -o $@ + +%.o: %.cpp + $(CXX) $(CFLAGS) -c $< -o $@ + %.ko: %.o $(STRIP) -K _init -K _fini --strip-unneeded -g -x $< -o $@ From e65dabb119f74aab8a37d6e6e165d07f11d2a7ca Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Thu, 26 Jun 2014 11:00:01 +0200 Subject: [PATCH 156/345] Add Arduino compatibility layer We can now directly compile arduino sketches (.pde) files. Arduino compatible analogWrite works now. But there is still a long way to go, serial I/O and timer stuff (delay, millis etc) currently don't work (not tested but I don't expect this to work). It can be used in an arduino sketch or in a normal contiki program. We get a PWM frequency of 490.2 Hz (a period of 2.040 ms), that's Arduino compatible. If you need different frequencies see native timer usage in examples/osd/pwm-example In a contiki program you have to call arduino_pwm_timer_init to initialize the timer before pwm works. The arduino sketch wrapper already does this. For running a sketch, see examples/osd/arduino-sketch --- apps/arduino/Makefile.arduino | 2 + apps/arduino/Makefile.include | 4 + apps/arduino/README.md | 13 + apps/arduino/arduino-process.c | 77 +++++ apps/arduino/arduino-process.h | 65 +++++ cpu/avr/hw_timer.h | 2 + dev/arduino/arduino-compat.h | 157 ++++++++++ examples/osd/arduino-sketch/Makefile | 102 +++++++ examples/osd/arduino-sketch/README.md | 11 + examples/osd/arduino-sketch/arduino-example.c | 2 + examples/osd/arduino-sketch/flash.sh | 2 + examples/osd/arduino-sketch/led_pwm.h | 30 ++ examples/osd/arduino-sketch/project-conf.h | 101 +++++++ .../osd/arduino-sketch/resource_led_pwm.c | 273 ++++++++++++++++++ examples/osd/arduino-sketch/run.sh | 5 + examples/osd/arduino-sketch/sketch.pde | 47 +++ platform/osd-merkur/Makefile.osd-merkur | 2 +- platform/osd-merkur/dev/Arduino.h | 43 +-- platform/osd-merkur/dev/hw-arduino.h | 73 +++++ platform/osd-merkur/dev/pins_arduino.h | 42 --- platform/osd-merkur/dev/wiring.c | 109 +------ platform/osd-merkur/dev/wiring_analog.c | 198 +------------ 22 files changed, 999 insertions(+), 361 deletions(-) create mode 100644 apps/arduino/Makefile.arduino create mode 100644 apps/arduino/Makefile.include create mode 100644 apps/arduino/README.md create mode 100644 apps/arduino/arduino-process.c create mode 100644 apps/arduino/arduino-process.h create mode 100644 dev/arduino/arduino-compat.h create mode 100644 examples/osd/arduino-sketch/Makefile create mode 100644 examples/osd/arduino-sketch/README.md create mode 100644 examples/osd/arduino-sketch/arduino-example.c create mode 100755 examples/osd/arduino-sketch/flash.sh create mode 100644 examples/osd/arduino-sketch/led_pwm.h create mode 100644 examples/osd/arduino-sketch/project-conf.h create mode 100644 examples/osd/arduino-sketch/resource_led_pwm.c create mode 100755 examples/osd/arduino-sketch/run.sh create mode 100644 examples/osd/arduino-sketch/sketch.pde create mode 100644 platform/osd-merkur/dev/hw-arduino.h diff --git a/apps/arduino/Makefile.arduino b/apps/arduino/Makefile.arduino new file mode 100644 index 000000000..da7491b82 --- /dev/null +++ b/apps/arduino/Makefile.arduino @@ -0,0 +1,2 @@ +arduino_src = arduino-process.c + diff --git a/apps/arduino/Makefile.include b/apps/arduino/Makefile.include new file mode 100644 index 000000000..2a3b47d6b --- /dev/null +++ b/apps/arduino/Makefile.include @@ -0,0 +1,4 @@ +%.cpp: %.pde + echo '#include "Arduino.h"' > $@ + echo '#include "$<"' >> $@ + diff --git a/apps/arduino/README.md b/apps/arduino/README.md new file mode 100644 index 000000000..abf6924f7 --- /dev/null +++ b/apps/arduino/README.md @@ -0,0 +1,13 @@ +Arduino Compatibility +===================== + +This application contains hardware-independent implementations of +arduino compatibilty libraries and include files to be used with +contiki. + +The whole arduino compatibility library is work in progress. Note that +features having to do with timers like `millis` and `delay` are +currently untested. In Arduino they use timer 0 of the AVR +microcontroller. It should be investigated to use the hardware timer +already in use by contiki (on the OSD-merkur platform this is currently +timer 5). diff --git a/apps/arduino/arduino-process.c b/apps/arduino/arduino-process.c new file mode 100644 index 000000000..5a42ae32e --- /dev/null +++ b/apps/arduino/arduino-process.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \addgroup Arduino Process + * + * This wraps the Arduino-API entry points `loop` and `setup` in a + * contiki process. + * + * If the normal contiki includes are used and resources initialized in + * `setup`, Contiki resources can be used in an arduino sketch. + * + * @{ + */ + +/** + * \file + * Wrapper for Arduino sketches + * \author + * Ralf Schlatterbeck + * + */ + +#include "arduino-process.h" + +PROCESS(arduino_sketch, "Arduino Sketch Wrapper"); + +PROCESS_THREAD(arduino_sketch, ev, data) +{ + PROCESS_BEGIN(); + + arduino_init (); + setup (); + while (1) { + loop (); + /* Give other processes a chance to run */ + process_post (&arduino_sketch, PROCESS_EVENT_CONTINUE, NULL); + PROCESS_WAIT_EVENT(); + } + PROCESS_END(); +} + + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ + +/** @} */ diff --git a/apps/arduino/arduino-process.h b/apps/arduino/arduino-process.h new file mode 100644 index 000000000..23b00ede4 --- /dev/null +++ b/apps/arduino/arduino-process.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \devgroup Arduino Process + * + * This wraps the Arduino-API entry points `loop` and `setup` in a + * contiki process. + * + * If the normal contiki includes are used and resources initialized in + * `setup`, Contiki resources can be used in an arduino sketch. + * + * @{ + */ + +/** + * \file + * Wrapper for Arduino sketches + * \author + * Ralf Schlatterbeck + * + */ + +#include "contiki.h" + +extern void loop (void); +extern void setup (void); +extern void arduino_init (void); + +extern struct process arduino_sketch; + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ + +/** @} */ diff --git a/cpu/avr/hw_timer.h b/cpu/avr/hw_timer.h index 3b98566ce..06ac73699 100644 --- a/cpu/avr/hw_timer.h +++ b/cpu/avr/hw_timer.h @@ -137,6 +137,8 @@ #define HWT_CHANNEL_A 0 #define HWT_CHANNEL_B 1 #define HWT_CHANNEL_C 2 +#define HWT_CHANNEL_D 3 +#define HWT_CHANNEL_MASK 3 /* The following macros are defined for timer values 1,3,4,5 */ #define HWT_ICR(t) \ diff --git a/dev/arduino/arduino-compat.h b/dev/arduino/arduino-compat.h new file mode 100644 index 000000000..23e417623 --- /dev/null +++ b/dev/arduino/arduino-compat.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \defgroup Hardware independent Arduino compatibility + * + * This file is meant to be included into a compatible Arduino.h + * + * Arduino calls the combination of an AVR timer and the corresponding + * channel a timer. So Arduinos definition of timer is different from + * that of AVR documentation. Arduino defines arbitrary TIMERXX macros + * that are later parsed in a big switch statement. + * + * We use a better representation of timer values than arduino here: + * The AVRs have max. 6 (numbered 0-5) timers. For representing these we + * need 3 bits. In addition each timer can have channels A-D (or just + * one channel in which case there is no alphabetic suffix). We can + * represent this in 2 bits. We add one bit to each for future + * compatibility and come up with 7 bits, still easily represented in 8 + * bit with room for a 'NOT_ON_TIMER' value. From these we can easily + * compute the channel and timer by shifting. No need for a big switch + * statement, and -- which is the common case -- when initializing with + * a constant for the pin, the compiler can compute everything at + * compile-time (that's why the analogWrite below is implemented as a + * static inline function). + * + * Note that Arduino also defines some TIMERX without an alphabetic + * suffix (e.g. TIMER2). I suspect this is for microcontrollers that + * only have one channel for a certain timer. So this is currently + * defined the same as TIMER2A because they are never used together. + * This may be wrong and may be a bug. + * + * Note that the hardware definition still has to define a + * digitalPinToTimer macro. We suggest to not implement this with a + * static table in program memory (as currently done by arduino) but + * instead as an if-cascade (as a C-macro). This allows the compiler to + * completely compute the if-cascade at compile-time if the used pin is + * a constant, resulting in *much* smaller code-footprint in the most + * common use-case. + * + * @{ + */ + +/** + * \file + * Header file for arduino compatibility + * \author + * Ralf Schlatterbeck + * + */ + +/* To be included by a compatible Arduino.h */ +#ifdef __cplusplus +extern "C" { +#endif + +#include "contiki.h" +#include "hw_timer.h" + +#ifdef __cplusplus +} // extern "C" +#endif + +#define HW_TIMER_SHIFT 3 + +#define NOT_ON_TIMER 0xFF + +#define TIMER0A ((0 << HW_TIMER_SHIFT) | HWT_CHANNEL_A) +#define TIMER0B ((0 << HW_TIMER_SHIFT) | HWT_CHANNEL_B) + +#define TIMER1A ((1 << HW_TIMER_SHIFT) | HWT_CHANNEL_A) +#define TIMER1B ((1 << HW_TIMER_SHIFT) | HWT_CHANNEL_B) +#define TIMER1C ((1 << HW_TIMER_SHIFT) | HWT_CHANNEL_C) + +#define TIMER2 ((2 << HW_TIMER_SHIFT) | HWT_CHANNEL_A) +#define TIMER2A ((2 << HW_TIMER_SHIFT) | HWT_CHANNEL_A) +#define TIMER2B ((2 << HW_TIMER_SHIFT) | HWT_CHANNEL_B) + +#define TIMER3A ((3 << HW_TIMER_SHIFT) | HWT_CHANNEL_A) +#define TIMER3B ((3 << HW_TIMER_SHIFT) | HWT_CHANNEL_B) +#define TIMER3C ((3 << HW_TIMER_SHIFT) | HWT_CHANNEL_C) + +#define TIMER4A ((4 << HW_TIMER_SHIFT) | HWT_CHANNEL_A) +#define TIMER4B ((4 << HW_TIMER_SHIFT) | HWT_CHANNEL_B) +#define TIMER4C ((4 << HW_TIMER_SHIFT) | HWT_CHANNEL_C) +#define TIMER4D ((4 << HW_TIMER_SHIFT) | HWT_CHANNEL_D) + +#define TIMER5A ((5 << HW_TIMER_SHIFT) | HWT_CHANNEL_A) +#define TIMER5B ((5 << HW_TIMER_SHIFT) | HWT_CHANNEL_B) +#define TIMER5C ((5 << HW_TIMER_SHIFT) | HWT_CHANNEL_C) + +#ifdef __cplusplus +extern "C" { +#endif + +static inline void analogWrite(uint8_t pin, int val) +{ + /* + * Note on the timer usage: Arduino has code here that + * explicitly checks if the given val is 0 or 0xFF. + * The 16-bit timers on Arduino use the phase correct PWM + * waveform generation mode which already sets the output to + * continuous low for 0 or continuous high for 0xFF. When using + * an 8-bit timer, Arduino uses fast PWM which creates a tiny + * spike for 0, so to be Arduino-compatible in this mode we use + * digitalWrite in this case. + */ + uint8_t arduino_timer = digitalPinToTimer(pin); + pinMode(pin, OUTPUT); + if (val == 0 || arduino_timer == NOT_ON_TIMER) { + digitalWrite(pin, (val < 128) ? LOW : HIGH); + } else { + uint8_t t = arduino_timer >> HW_TIMER_SHIFT; + uint8_t c = arduino_timer & HWT_CHANNEL_MASK; + hwtimer_pwm_enable (t, c); + hwtimer_set_pwm (t, c, val); + } +} + +#ifdef __cplusplus +} // extern "C" +#endif + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ + +/** @} */ diff --git a/examples/osd/arduino-sketch/Makefile b/examples/osd/arduino-sketch/Makefile new file mode 100644 index 000000000..315e10db8 --- /dev/null +++ b/examples/osd/arduino-sketch/Makefile @@ -0,0 +1,102 @@ +# Set this to the name of your sketch (without extension .pde) +SKETCH=sketch + +all: arduino-example \ + arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += resource_led_pwm.c ${SKETCH}.cpp + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 time json arduino + +include $(CONTIKI)/Makefile.include +include $(CONTIKI)/apps/arduino/Makefile.include + +arduino-example.osd-merkur.hex: arduino-example.osd-merkur + avr-objcopy -j .text -j .data -O ihex arduino-example.osd-merkur \ + arduino-example.osd-merkur.hex + +arduino-example.osd-merkur.eep: arduino-example.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + arduino-example.osd-merkur arduino-example.osd-merkur.eep + +flash: arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U \ + flash:w:arduino-example.osd-merkur.hex:a -U \ + eeprom:w:arduino-example.osd-merkur.eep:a + +.PHONY: flash + +$(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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/arduino-sketch/README.md b/examples/osd/arduino-sketch/README.md new file mode 100644 index 000000000..e1490ed05 --- /dev/null +++ b/examples/osd/arduino-sketch/README.md @@ -0,0 +1,11 @@ +Arduino compatibility example +============================= + +This example shows that it is now possible to re-use arduino sketches in +Contiki. This example documents the necessary magic. Arduino specifies +two routines, `setup` and `loop`. Before `setup` is called, the +framework initializes hardware. In original Arduino, all this is done in +a `main` function (in C). For contiki we define a process that does the +same. + +See the documentation file in apps/contiki-compat/README.md diff --git a/examples/osd/arduino-sketch/arduino-example.c b/examples/osd/arduino-sketch/arduino-example.c new file mode 100644 index 000000000..ea74dd8b8 --- /dev/null +++ b/examples/osd/arduino-sketch/arduino-example.c @@ -0,0 +1,2 @@ +#include +AUTOSTART_PROCESSES(&arduino_sketch); diff --git a/examples/osd/arduino-sketch/flash.sh b/examples/osd/arduino-sketch/flash.sh new file mode 100755 index 000000000..e9cb40bfc --- /dev/null +++ b/examples/osd/arduino-sketch/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur flash diff --git a/examples/osd/arduino-sketch/led_pwm.h b/examples/osd/arduino-sketch/led_pwm.h new file mode 100644 index 000000000..6ace57f8d --- /dev/null +++ b/examples/osd/arduino-sketch/led_pwm.h @@ -0,0 +1,30 @@ +/** + * \defgroup Arduino LED PWM example + * + * Resource definition for Arduino LED PWM module + * + * @{ + */ + +/** + * \file + * Resource definitions for the Arduino LED PWM module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef led_pwm_h +#define led_pwm_h +#include "contiki.h" +#include "contiki-net.h" +#include "erbium.h" +#include "er-coap-13.h" + +extern uint8_t pwm; +extern uint8_t period_100ms; +extern resource_t resource_led_pwm; +extern resource_t resource_led_period; + +#endif // led_pwm_h +/** @} */ diff --git a/examples/osd/arduino-sketch/project-conf.h b/examples/osd/arduino-sketch/project-conf.h new file mode 100644 index 000000000..574e15250 --- /dev/null +++ b/examples/osd/arduino-sketch/project-conf.h @@ -0,0 +1,101 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_BATTERY 1 + +#define SICSLOWPAN_CONF_FRAG 1 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/arduino-sketch/resource_led_pwm.c b/examples/osd/arduino-sketch/resource_led_pwm.c new file mode 100644 index 000000000..c547a6426 --- /dev/null +++ b/examples/osd/arduino-sketch/resource_led_pwm.c @@ -0,0 +1,273 @@ +/** + * \file + * Resource for Arduino PWM + * \author + * Ralf Schlatterbeck + * + * \brief get/put pwm and period for LED pin + * + * quick&dirty implementation, this should factor json parsing. + * But json format will probably change, there is a draft rfc. + */ + +#include +#include +#include +#include "contiki.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" +#include "led_pwm.h" + +/* Error-handling macro */ +# define BYE(_exp, _tag) \ + do { \ + PRINTF("Expect "_exp": %d\n",_tag); \ + success=0; \ + goto bye; \ + } while(0) + +#define DEBUG 1 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +RESOURCE \ + ( led_pwm, METHOD_GET | METHOD_PUT + , "led/pwm" + , "title=\"LED PWM\";rt=\"led pwm\"" + ); + +void +led_pwm_handler + ( void* request + , void* response + , uint8_t *buffer + , uint16_t preferred_size + , int32_t *offset + ) +{ + int success = 1; + + int i; + char temp[100]; + int index = 0; + int length = 0; + int tag = 0; + const uint8_t *bytes = NULL; + size_t len = 0; + int n_acc = 0; + const uint16_t *accept = NULL; + uint16_t a_ctype = REST.type.APPLICATION_JSON; + uint16_t c_ctype = REST.get_header_content_type (request); + + /* Seems like accepted type is currently unsupported? */ + n_acc = REST.get_header_accept (request, &accept); + for (i=0; i +#include "led_pwm.h" +#define LED_PIN 5 + +uint8_t pwm = 128; +uint8_t period_100ms = 10; /* one second */ +} + +void setup (void) +{ + rest_init_engine (); + rest_activate_resource (&resource_led_pwm); + rest_activate_resource (&resource_led_period); +} + +void loop (void) +{ + static uint8_t last_pwm = 0; + if (last_pwm != pwm) { + last_pwm = pwm; + analogWrite (LED_PIN, pwm); + printf + ( "TCNT3: %04X TCCR3A: %04X TCCR3B: %04X TCCR3C: %04X OCR3C: %04X\n" + , TCNT3, TCCR3A, TCCR3B, TCCR3C, OCR3C + ); + } + + // Originally I wanted to sleep here to make the LED blink. + // Sleeping currently doesn't work, something turns off the chip. + // Maybe a mechanism to guard agains proto-threads taking too long? + //clock_wait (CLOCK_SECOND * period_100ms / 10); + //analogWrite (LED_PIN, 0); + //printf ("After write\n"); +} diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 3fb160bdd..6dacd0fca 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -27,7 +27,7 @@ CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c #Needed for Relay 1 to 4 CONTIKI_TARGET_SOURCEFILES += relay.c relay-sensor.c # Arduino -CONTIKI_TARGET_SOURCEFILES += wiring_digital.c +CONTIKI_TARGET_SOURCEFILES += wiring_digital.c wiring.c wiring_analog.c CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 diff --git a/platform/osd-merkur/dev/Arduino.h b/platform/osd-merkur/dev/Arduino.h index 2a5dcccba..3a0ae046b 100644 --- a/platform/osd-merkur/dev/Arduino.h +++ b/platform/osd-merkur/dev/Arduino.h @@ -1,6 +1,7 @@ #ifndef Arduino_h #define Arduino_h +#include #include #include #include @@ -88,14 +89,18 @@ typedef unsigned int word; typedef uint8_t boolean; typedef uint8_t byte; -void init(void); +/* + * This has been renamed from init to arduino_init, the original + * function name is way too generic. The arduino compatibility framework + * makes sure the correct function is called. + */ +void arduino_init(void); void pinMode(uint8_t, uint8_t); void digitalWrite(uint8_t, uint8_t); int digitalRead(uint8_t); int analogRead(uint8_t); void analogReference(uint8_t mode); -void analogWrite(uint8_t, int); unsigned long millis(void); unsigned long micros(void); @@ -126,7 +131,6 @@ extern const uint16_t PROGMEM port_to_output_PGM[]; extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; // extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; -extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. @@ -135,7 +139,6 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; // #define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) #define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) -#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) #define analogInPinToBit(P) (P) #define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) #define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) @@ -158,35 +161,15 @@ extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; #define PL 12 #endif -#define NOT_ON_TIMER 0 -#define TIMER0A 1 -#define TIMER0B 2 -#define TIMER1A 3 -#define TIMER1B 4 -#define TIMER1C 5 -#define TIMER2 6 -#define TIMER2A 7 -#define TIMER2B 8 - -#define TIMER3A 9 -#define TIMER3B 10 -#define TIMER3C 11 -#define TIMER4A 12 -#define TIMER4B 13 -#define TIMER4C 14 -#define TIMER4D 15 -#define TIMER5A 16 -#define TIMER5B 17 -#define TIMER5C 18 - #ifdef __cplusplus } // extern "C" #endif #ifdef __cplusplus -#include "WCharacter.h" -#include "WString.h" -#include "HardwareSerial.h" +// look at this again when considering implementing serial +//#include "WCharacter.h" +//#include "WString.h" +//#include "HardwareSerial.h" uint16_t makeWord(uint16_t w); uint16_t makeWord(byte h, byte l); @@ -208,4 +191,6 @@ long map(long, long, long, long, long); #include "pins_arduino.h" -#endif \ No newline at end of file +#include "dev/arduino/arduino-compat.h" + +#endif diff --git a/platform/osd-merkur/dev/hw-arduino.h b/platform/osd-merkur/dev/hw-arduino.h new file mode 100644 index 000000000..7aa54d3d8 --- /dev/null +++ b/platform/osd-merkur/dev/hw-arduino.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \defgroup compatibility Arduino - Contiki + * + * This defines contiki-compatible hardware definitions for running + * arduino sketches (or just to call arduino-compatible function). + * For now only for osd hardware, a similar file should exist for each + * arduino-compatible hardware. + * + * @{ + */ + +/** + * \file + * Header file for arduino compatibility + * \author + * Ralf Schlatterbeck + * + */ + +/* + * The OSD hardware only supports timer 3 for PWM, timer 2 is used by + * contiki for sleep/wakeup timing and is not usable for PWM. + */ +#define digitalPinToTimer(pin) \ + ( (pin) == 3 \ + ? TIMER3A \ + : ( (pin) == 4 \ + ? TIMER3B \ + : ((pin == 5) ? TIMER3C : NOT_ON_TIMER) \ + ) \ + ) + +/* Only init timer 3 with phase correct pwm 8-bit and prescaler 64 */ +#define arduino_pwm_timer_init() \ + (hwtimer_ini (3, HWT_WGM_PWM_PHASE_8_BIT, HWT_CLOCK_PRESCALER_64, 0)) + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ + +/** @} */ diff --git a/platform/osd-merkur/dev/pins_arduino.h b/platform/osd-merkur/dev/pins_arduino.h index 8f6749eab..1441439aa 100644 --- a/platform/osd-merkur/dev/pins_arduino.h +++ b/platform/osd-merkur/dev/pins_arduino.h @@ -215,48 +215,6 @@ const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { // _BV( 7 ) , // PB 7 ** 35 ** D35 / LED2 / PWM }; -// !!! -const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { - // TIMERS - // ------------------------------------------- - NOT_ON_TIMER , // PE 1 ** 0 ** USART0_TX - NOT_ON_TIMER , // PE 0 ** 1 ** USART0_RX - TIMER3A , // PE 3 ** 2 ** D3 / PWM - TIMER3B , // PE 4 ** 3 ** D4 / PWM - TIMER3C , // PE 5 ** 4 ** D5 / PWM - NOT_ON_TIMER , // PE 6 ** 5 ** D6 - NOT_ON_TIMER , // PD 3 ** 6 ** D21 / USART1_TX - NOT_ON_TIMER , // PD 2 ** 7 ** D20 / USART1_RX - NOT_ON_TIMER , // PD 0 ** 8 ** D15 / I2C_SCL - NOT_ON_TIMER , // PD 1 ** 9 ** D14 / I2C_SDA - NOT_ON_TIMER , // PB 0 ** 10 ** D10 / SPI_SSN - NOT_ON_TIMER , // PB 2 ** 11 ** D11 / SPI_MOSI - NOT_ON_TIMER , // PB 1 ** 12 ** D13 / SPI_SCK - NOT_ON_TIMER , // PB 3 ** 13 ** D12 / SPI_MISO - TIMER2A , // PB 4 ** 14 ** D9 / PWM - NOT_ON_TIMER , // PF 7 ** 15 ** A0 / D33 - NOT_ON_TIMER , // PF 6 ** 16 ** A1 / D32 - NOT_ON_TIMER , // PF 5 ** 17 ** A2 / D31 - NOT_ON_TIMER , // PF 4 ** 18 ** A3 / D30 - NOT_ON_TIMER , // PF 0 ** 19 ** A4 / D26 - NOT_ON_TIMER , // PF 1 ** 20 ** A5 / D27 -// NOT_ON_TIMER , // PF 2 ** 28 ** A6 / D28 -// NOT_ON_TIMER , // PF 3 ** 29 ** A7 / D29 -// NOT_ON_TIMER , // PE 2 ** 2 ** D2 -// NOT_ON_TIMER , // PE 7 ** 7 ** D7 -// TIMER1A , // PB 5 ** 8 ** D8 / PWM -// NOT_ON_TIMER , // PG 0 ** 16 ** D16 -// NOT_ON_TIMER , // PG 1 ** 17 ** D17 -// NOT_ON_TIMER , // PG 2 ** 18 ** D18 -// TIMER0B , // PG 5 ** 19 ** D19 / PWM -// NOT_ON_TIMER , // PD 4 ** 22 ** D22 -// NOT_ON_TIMER , // PD 5 ** 23 ** D23 -// NOT_ON_TIMER , // PD 6 ** 24 ** D24 -// NOT_ON_TIMER , // PD 7 ** 25 ** D25 -// TIMER1B , // PB 6 ** 34 ** D34/ PWM -// TIMER1C , // PB 7 ** 35 ** D35 / PWM -}; - #endif #endif diff --git a/platform/osd-merkur/dev/wiring.c b/platform/osd-merkur/dev/wiring.c index ac8bb6f9b..1c6abc44d 100644 --- a/platform/osd-merkur/dev/wiring.c +++ b/platform/osd-merkur/dev/wiring.c @@ -23,6 +23,7 @@ */ #include "wiring_private.h" +#include "hw-arduino.h" // the prescaler is set so that timer0 ticks every 64 clock cycles, and the // the overflow handler is called every 256 ticks. @@ -186,20 +187,23 @@ void delayMicroseconds(unsigned int us) ); } -void init() +void arduino_init() { // this needs to be called before setup() or some functions won't // work there - sei(); // on the ATmega168, timer 0 is also used for fast hardware pwm // (using phase-correct PWM would mean that timer 0 overflowed half as often // resulting in different millis() behavior on the ATmega8 and ATmega168) + /* + * RSC: Keep timer0 for now, until we decide how to implement + * millis() etc in a contiki-compatible way + */ + #if defined(TCCR0A) && defined(WGM01) sbi(TCCR0A, WGM01); sbi(TCCR0A, WGM00); #endif - // set timer 0 prescale factor to 64 #if defined(__AVR_ATmega128__) // CPU specific: different values for the ATmega128 @@ -229,96 +233,13 @@ void init() #error Timer 0 overflow interrupt not set correctly #endif - // timers 1 and 2 are used for phase-correct hardware pwm - // this is better for motors as it ensures an even waveform - // note, however, that fast pwm mode can achieve a frequency of up - // 8 MHz (with a 16 MHz clock) at 50% duty cycle + /* + * All other PCM timers are initialized here in a + * platform-specific way + */ + arduino_pwm_timer_init (); -#if defined(TCCR1B) && defined(CS11) && defined(CS10) - TCCR1B = 0; - - // set timer 1 prescale factor to 64 - sbi(TCCR1B, CS11); -#if F_CPU >= 8000000L - sbi(TCCR1B, CS10); -#endif -#elif defined(TCCR1) && defined(CS11) && defined(CS10) - sbi(TCCR1, CS11); -#if F_CPU >= 8000000L - sbi(TCCR1, CS10); -#endif -#endif - // put timer 1 in 8-bit phase correct pwm mode -#if defined(TCCR1A) && defined(WGM10) - sbi(TCCR1A, WGM10); -#elif defined(TCCR1) - #warning this needs to be finished -#endif - - // set timer 2 prescale factor to 64 -#if defined(TCCR2) && defined(CS22) - sbi(TCCR2, CS22); -#elif defined(TCCR2B) && defined(CS22) - sbi(TCCR2B, CS22); -#else - #warning Timer 2 not finished (may not be present on this CPU) -#endif - - // configure timer 2 for phase correct pwm (8-bit) -#if defined(TCCR2) && defined(WGM20) - sbi(TCCR2, WGM20); -#elif defined(TCCR2A) && defined(WGM20) - sbi(TCCR2A, WGM20); -#else - #warning Timer 2 not finished (may not be present on this CPU) -#endif - -#if defined(TCCR3B) && defined(CS31) && defined(WGM30) - sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64 - sbi(TCCR3B, CS30); - sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode -#endif - -#if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */ - sbi(TCCR4B, CS42); // set timer4 prescale factor to 64 - sbi(TCCR4B, CS41); - sbi(TCCR4B, CS40); - sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode - sbi(TCCR4A, PWM4A); // enable PWM mode for comparator OCR4A - sbi(TCCR4C, PWM4D); // enable PWM mode for comparator OCR4D -#else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */ -#if defined(TCCR4B) && defined(CS41) && defined(WGM40) - sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 - sbi(TCCR4B, CS40); - sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode -#endif -#endif /* end timer4 block for ATMEGA1280/2560 and similar */ - -#if defined(TCCR5B) && defined(CS51) && defined(WGM50) - sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 - sbi(TCCR5B, CS50); - sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode -#endif - -#if defined(ADCSRA) - // set a2d prescale factor to 128 - // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. - // XXX: this will not work properly for other clock speeds, and - // this code should use F_CPU to determine the prescale factor. - sbi(ADCSRA, ADPS2); - sbi(ADCSRA, ADPS1); - sbi(ADCSRA, ADPS0); - - // enable a2d conversions - sbi(ADCSRA, ADEN); -#endif - - // the bootloader connects pins 0 and 1 to the USART; disconnect them - // here so they can be used as normal digital i/o; they will be - // reconnected in Serial.begin() -#if defined(UCSRB) - UCSRB = 0; -#elif defined(UCSR0B) - UCSR0B = 0; -#endif + /* + * Removed the rest which manipulates the serial pins + */ } diff --git a/platform/osd-merkur/dev/wiring_analog.c b/platform/osd-merkur/dev/wiring_analog.c index 6c3dcc484..630e95721 100644 --- a/platform/osd-merkur/dev/wiring_analog.c +++ b/platform/osd-merkur/dev/wiring_analog.c @@ -43,198 +43,6 @@ int analogRead(uint8_t pin) return readADC(pin); } -// Right now, PWM output only works on the pins with -// hardware support. These are defined in the appropriate -// pins_*.c file. For the rest of the pins, we default -// to digital output. -void analogWrite(uint8_t pin, int val) -{ - // We need to make sure the PWM output is enabled for those pins - // that support it, as we turn it off when digitally reading or - // writing with them. Also, make sure the pin is in output mode - // for consistenty with Wiring, which doesn't require a pinMode - // call for the analog output pins. - pinMode(pin, OUTPUT); - if (val == 0) - { - digitalWrite(pin, LOW); - } - else if (val == 255) - { - digitalWrite(pin, HIGH); - } - else - { - switch(digitalPinToTimer(pin)) - { - // XXX fix needed for atmega8 - #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__) - case TIMER0A: - // connect pwm to pin on timer 0 - sbi(TCCR0, COM00); - OCR0 = val; // set pwm duty - break; - #endif - - #if defined(TCCR0A) && defined(COM0A1) - case TIMER0A: - // connect pwm to pin on timer 0, channel A - sbi(TCCR0A, COM0A1); - OCR0A = val; // set pwm duty - break; - #endif - - #if defined(TCCR0A) && defined(COM0B1) - case TIMER0B: - // connect pwm to pin on timer 0, channel B - sbi(TCCR0A, COM0B1); - OCR0B = val; // set pwm duty - break; - #endif - - #if defined(TCCR1A) && defined(COM1A1) - case TIMER1A: - // connect pwm to pin on timer 1, channel A - sbi(TCCR1A, COM1A1); - OCR1A = val; // set pwm duty - break; - #endif - - #if defined(TCCR1A) && defined(COM1B1) - case TIMER1B: - // connect pwm to pin on timer 1, channel B - sbi(TCCR1A, COM1B1); - OCR1B = val; // set pwm duty - break; - #endif - - #if defined(TCCR1A) && defined(COM1C1) - case TIMER1C: - // connect pwm to pin on timer 1, channel C - sbi(TCCR1A, COM1C1); - OCR1C = val; // set pwm duty - break; - #endif - - #if defined(TCCR2) && defined(COM21) - case TIMER2: - // connect pwm to pin on timer 2 - sbi(TCCR2, COM21); - OCR2 = val; // set pwm duty - break; - #endif - - #if defined(TCCR2A) && defined(COM2A1) - case TIMER2A: - // connect pwm to pin on timer 2, channel A - sbi(TCCR2A, COM2A1); - OCR2A = val; // set pwm duty - break; - #endif - - #if defined(TCCR2A) && defined(COM2B1) - case TIMER2B: - // connect pwm to pin on timer 2, channel B - sbi(TCCR2A, COM2B1); - OCR2B = val; // set pwm duty - break; - #endif - - #if defined(TCCR3A) && defined(COM3A1) - case TIMER3A: - // connect pwm to pin on timer 3, channel A - sbi(TCCR3A, COM3A1); - OCR3A = val; // set pwm duty - break; - #endif - - #if defined(TCCR3A) && defined(COM3B1) - case TIMER3B: - // connect pwm to pin on timer 3, channel B - sbi(TCCR3A, COM3B1); - OCR3B = val; // set pwm duty - break; - #endif - - #if defined(TCCR3A) && defined(COM3C1) - case TIMER3C: - // connect pwm to pin on timer 3, channel C - sbi(TCCR3A, COM3C1); - OCR3C = val; // set pwm duty - break; - #endif - - #if defined(TCCR4A) - case TIMER4A: - //connect pwm to pin on timer 4, channel A - sbi(TCCR4A, COM4A1); - #if defined(COM4A0) // only used on 32U4 - cbi(TCCR4A, COM4A0); - #endif - OCR4A = val; // set pwm duty - break; - #endif - - #if defined(TCCR4A) && defined(COM4B1) - case TIMER4B: - // connect pwm to pin on timer 4, channel B - sbi(TCCR4A, COM4B1); - OCR4B = val; // set pwm duty - break; - #endif - - #if defined(TCCR4A) && defined(COM4C1) - case TIMER4C: - // connect pwm to pin on timer 4, channel C - sbi(TCCR4A, COM4C1); - OCR4C = val; // set pwm duty - break; - #endif - - #if defined(TCCR4C) && defined(COM4D1) - case TIMER4D: - // connect pwm to pin on timer 4, channel D - sbi(TCCR4C, COM4D1); - #if defined(COM4D0) // only used on 32U4 - cbi(TCCR4C, COM4D0); - #endif - OCR4D = val; // set pwm duty - break; - #endif - - - #if defined(TCCR5A) && defined(COM5A1) - case TIMER5A: - // connect pwm to pin on timer 5, channel A - sbi(TCCR5A, COM5A1); - OCR5A = val; // set pwm duty - break; - #endif - - #if defined(TCCR5A) && defined(COM5B1) - case TIMER5B: - // connect pwm to pin on timer 5, channel B - sbi(TCCR5A, COM5B1); - OCR5B = val; // set pwm duty - break; - #endif - - #if defined(TCCR5A) && defined(COM5C1) - case TIMER5C: - // connect pwm to pin on timer 5, channel C - sbi(TCCR5A, COM5C1); - OCR5C = val; // set pwm duty - break; - #endif - - case NOT_ON_TIMER: - default: - if (val < 128) { - digitalWrite(pin, LOW); - } else { - digitalWrite(pin, HIGH); - } - } - } -} - +/* + * analogWrite is now implemented in dev/arduino/arduino-compat.h + */ From b6e20bf6c0645af838c081f5630fdceda66c8433 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Thu, 26 Jun 2014 18:00:30 +0200 Subject: [PATCH 157/345] Fixes for platform timer code Some platforms are missing timer channels, this is now left to the (missing) preprocessor definitions on those platforms, no platform-specific defines needed anymore. Also fix usage of timer counter register 3 (hardcoded) in cpu/avr/dev/clock.c -- this code isn't used on many platforms as it requires a very special quartz clock frequency but this now also uses the platform timer specification. --- cpu/avr/dev/clock.c | 4 ++-- cpu/avr/rtimer-arch.c | 21 --------------------- cpu/avr/rtimer-arch.h | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/cpu/avr/dev/clock.c b/cpu/avr/dev/clock.c index cc50364ec..ea646562c 100644 --- a/cpu/avr/dev/clock.c +++ b/cpu/avr/dev/clock.c @@ -371,13 +371,13 @@ volatile static uint8_t osccalhigh,osccallow; if (seconds < 60) { //give a minute to stabilize if(++lockcount >= 8192UL*128/RTIMER_ARCH_SECOND) { lockcount=0; - rtimer_phase = TCNT3 & 0x0fff; + rtimer_phase = PLAT_TCNT & 0x0fff; if (seconds < 2) OSCCAL=100; if (last_phase > rtimer_phase) osccalhigh=++OSCCAL; else osccallow=--OSCCAL; last_phase = rtimer_phase; } } else { - uint8_t error = (TCNT3 - last_phase) & 0x3f; + uint8_t error = (PLAT_TCNT - last_phase) & 0x3f; if (error == 0) { } else if (error<32) { OSCCAL=osccallow-1; diff --git a/cpu/avr/rtimer-arch.c b/cpu/avr/rtimer-arch.c index fe978a24c..d580fdea8 100644 --- a/cpu/avr/rtimer-arch.c +++ b/cpu/avr/rtimer-arch.c @@ -50,27 +50,6 @@ #include "sys/rtimer.h" #include "rtimer-arch.h" -#if defined(__AVR_ATmega1284P__) -//Has no 'C', so we just set it to B. The code doesn't really use C so this -//is safe to do but lets it compile. Probably should enable the warning if -//it is ever used on other platforms. -//#warning no OCIE3C in timer3 architecture, hopefully it won't be needed! -#define OCIE3C OCIE3B -#define OCF3C OCF3B -#define PLAT_TCCRC PLAT_TCCRB -#endif - -#if defined(__AVR_ATmega1281__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega128RFA1__) -#endif - -#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega644__) -//Has no 'C', so we just set it to B. The code doesn't really use C so this -//is safe to do but lets it compile. -#define OCIE1C OCIE1B -#define OCF1C OCF1B -#define PLAT_TCCRC PLAT_TCCRB -#endif - /* Track flow through rtimer interrupts*/ #if DEBUGFLOWSIZE&&0 extern uint8_t debugflowsize,debugflow[DEBUGFLOWSIZE]; diff --git a/cpu/avr/rtimer-arch.h b/cpu/avr/rtimer-arch.h index 5039c8873..78342bd8f 100644 --- a/cpu/avr/rtimer-arch.h +++ b/cpu/avr/rtimer-arch.h @@ -88,6 +88,40 @@ #define PLAT_TOIE _C_R_CONC_(TOIE,PLAT_TIMER,) #define PLAT_TOV _C_R_CONC_(TOV,PLAT_TIMER,) #define PLAT_VECT _C_R_CONC_(TIMER,PLAT_TIMER,_COMPA_vect) + +/* + * Unavailable timer channels on some platforms + * A hack originally found for some architectures. + * Since OCIEnC isn't used we simple define it to OCIEnB which allows + * the code to compile. Same for OCFnC and TCCRnC. Note that the TCCRnX + * registers are only (all) set to 0 in the code. The OCIEnC and OCFnC + * are shifts which are always set to the same value as OCIEnB and + * OCFnB, respectively. + */ +#if PLAT_TIMER == 3 +#ifndef OCIE3C +#define PLAT_OCIEC PLAT_OCIEB +#endif +#ifndef OCF3C +#define PLAT_OCFC PLAT_OCFB +#endif +#ifndef TCCR3C +#define PLAT_TCCRC PLAT_TCCRB +#endif +#endif /* PLAT_TIMER == 3 */ + +#if PLAT_TIMER == 1 +#ifndef OCIE1C +#define PLAT_OCIEC PLAT_OCIEB +#endif +#ifndef OCF1C +#define PLAT_OCFC PLAT_OCFB +#endif +#ifndef TCCR1C +#define PLAT_TCCRC PLAT_TCCRB +#endif +#endif /* PLAT_TIMER == 3 */ + #if RTIMER_ARCH_PRESCALER #define rtimer_arch_now() (PLAT_TCNT) #else From f0f53914093a12ef9a8ec9f453d0579fb1ea5506 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Thu, 26 Jun 2014 18:37:13 +0200 Subject: [PATCH 158/345] Make Arduino timer stuff work on Contiki New discovery: Contiki also uses timer 0. With almost the same interface as Arduino. So we now completely get rid of wiring.c (only the main file, the other wiring_xxx stay) and implement Arduino timer, delay, etc in terms of the corresponding Contiki routines. Verified that now delay works as expected. The LED in examples/osd/arduino-sketch blinks! Before this, the arduino_init routine in wiring.c destroyed the timer-0 initialization of contiki, making both, contiki timer implementation *and* contiki timer implementation fail if the arduino_init routine was called. Now both work. --- apps/arduino/arduino-process.c | 4 +- .../osd/arduino-sketch/resource_led_pwm.c | 16 +- examples/osd/arduino-sketch/sketch.pde | 22 +- platform/osd-merkur/Makefile.osd-merkur | 2 +- platform/osd-merkur/dev/Arduino.h | 8 - platform/osd-merkur/dev/hw-arduino.h | 36 +++ platform/osd-merkur/dev/wiring.c | 245 ------------------ 7 files changed, 60 insertions(+), 273 deletions(-) delete mode 100644 platform/osd-merkur/dev/wiring.c diff --git a/apps/arduino/arduino-process.c b/apps/arduino/arduino-process.c index 5a42ae32e..b7a87c0b3 100644 --- a/apps/arduino/arduino-process.c +++ b/apps/arduino/arduino-process.c @@ -50,6 +50,8 @@ */ #include "arduino-process.h" +#include "hw_timer.h" +#include "hw-arduino.h" PROCESS(arduino_sketch, "Arduino Sketch Wrapper"); @@ -57,7 +59,7 @@ PROCESS_THREAD(arduino_sketch, ev, data) { PROCESS_BEGIN(); - arduino_init (); + arduino_pwm_timer_init (); setup (); while (1) { loop (); diff --git a/examples/osd/arduino-sketch/resource_led_pwm.c b/examples/osd/arduino-sketch/resource_led_pwm.c index c547a6426..729e92358 100644 --- a/examples/osd/arduino-sketch/resource_led_pwm.c +++ b/examples/osd/arduino-sketch/resource_led_pwm.c @@ -62,6 +62,7 @@ led_pwm_handler const uint16_t *accept = NULL; uint16_t a_ctype = REST.type.APPLICATION_JSON; uint16_t c_ctype = REST.get_header_content_type (request); + uint32_t tmp = 0; /* Seems like accepted type is currently unsupported? */ n_acc = REST.get_header_accept (request, &accept); @@ -136,7 +137,10 @@ led_pwm_handler temp [sizeof (temp) - 1] = 0; } PRINTF ("GOT: %s\n", temp); - pwm = atoi (temp); + tmp = strtoul (temp, NULL, 10); + if (tmp > 255) { + pwm = 255; + } PRINTF ("Setting: %d\n", pwm); REST.set_response_status(response, REST.status.CHANGED); } else { @@ -181,6 +185,7 @@ led_period_handler const uint16_t *accept = NULL; uint16_t a_ctype = REST.type.APPLICATION_JSON; uint16_t c_ctype = REST.get_header_content_type (request); + uint32_t tmp = 0; /* Seems like accepted type is currently unsupported? */ n_acc = REST.get_header_accept (request, &accept); @@ -255,7 +260,14 @@ led_period_handler temp [sizeof (temp) - 1] = 0; } PRINTF ("GOT: %s\n", temp); - period_100ms = (atoi (temp) + 50) / 100; + tmp = (strtoul (temp, NULL, 10) + 50) / 100; + if (tmp > 10) { + tmp = 10; + } + if (tmp == 0) { + tmp = 1; + } + period_100ms = tmp; PRINTF ("Setting: %dms\n", period_100ms * 100); REST.set_response_status(response, REST.status.CHANGED); } else { diff --git a/examples/osd/arduino-sketch/sketch.pde b/examples/osd/arduino-sketch/sketch.pde index e000a89c0..d64140278 100644 --- a/examples/osd/arduino-sketch/sketch.pde +++ b/examples/osd/arduino-sketch/sketch.pde @@ -28,20 +28,10 @@ void setup (void) void loop (void) { - static uint8_t last_pwm = 0; - if (last_pwm != pwm) { - last_pwm = pwm; - analogWrite (LED_PIN, pwm); - printf - ( "TCNT3: %04X TCCR3A: %04X TCCR3B: %04X TCCR3C: %04X OCR3C: %04X\n" - , TCNT3, TCCR3A, TCCR3B, TCCR3C, OCR3C - ); - } - - // Originally I wanted to sleep here to make the LED blink. - // Sleeping currently doesn't work, something turns off the chip. - // Maybe a mechanism to guard agains proto-threads taking too long? - //clock_wait (CLOCK_SECOND * period_100ms / 10); - //analogWrite (LED_PIN, 0); - //printf ("After write\n"); + /* Use 255 - pwm, LED on merkur-board is wired to +3.3V */ + analogWrite (LED_PIN, 255 - pwm); /* + printf ("clock : %u\nmillis: %lu\n", clock_time (), millis ()); + delay (period_100ms * 100); + analogWrite (LED_PIN, 255); /* OFF: LED on merkur-board is wired to +3.3V */ + delay (period_100ms * 100); } diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 6dacd0fca..9650a201b 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -27,7 +27,7 @@ CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c #Needed for Relay 1 to 4 CONTIKI_TARGET_SOURCEFILES += relay.c relay-sensor.c # Arduino -CONTIKI_TARGET_SOURCEFILES += wiring_digital.c wiring.c wiring_analog.c +CONTIKI_TARGET_SOURCEFILES += wiring_digital.c wiring_analog.c CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 diff --git a/platform/osd-merkur/dev/Arduino.h b/platform/osd-merkur/dev/Arduino.h index 3a0ae046b..4d9208864 100644 --- a/platform/osd-merkur/dev/Arduino.h +++ b/platform/osd-merkur/dev/Arduino.h @@ -69,10 +69,6 @@ extern "C"{ #define interrupts() sei() #define noInterrupts() cli() -#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) -#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) -#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) - #define lowByte(w) ((uint8_t) ((w) & 0xff)) #define highByte(w) ((uint8_t) ((w) >> 8)) @@ -102,10 +98,6 @@ int digitalRead(uint8_t); int analogRead(uint8_t); void analogReference(uint8_t mode); -unsigned long millis(void); -unsigned long micros(void); -void delay(unsigned long); -void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); diff --git a/platform/osd-merkur/dev/hw-arduino.h b/platform/osd-merkur/dev/hw-arduino.h index 7aa54d3d8..f59f8daf2 100644 --- a/platform/osd-merkur/dev/hw-arduino.h +++ b/platform/osd-merkur/dev/hw-arduino.h @@ -48,6 +48,12 @@ * */ +#ifdef __cplusplus +extern "C"{ +#endif + +#include "contiki.h" + /* * The OSD hardware only supports timer 3 for PWM, timer 2 is used by * contiki for sleep/wakeup timing and is not usable for PWM. @@ -65,9 +71,39 @@ #define arduino_pwm_timer_init() \ (hwtimer_ini (3, HWT_WGM_PWM_PHASE_8_BIT, HWT_CLOCK_PRESCALER_64, 0)) +/* + * micros on arduino takes timer overflows into account. + * We put in the seconds counter. To get a consistent seconds / ticks + * value we have to disable interrupts. + */ +static inline uint32_t micros (void) +{ + uint32_t ticks; + uint8_t sreg = SREG; + cli (); + ticks = clock_seconds () * 1000000L + + clock_time () * 1000L / CLOCK_SECOND; + SREG = sreg; + return ticks; +} +/* + * millis counts only internal timer ticks since start, not trying to do + * something about overflows. Note that we don't try to emulate overflow + * behaviour of arduino implementation. + */ +#define millis() (((uint32_t)clock_time())*1000L/CLOCK_SECOND) +#define micros() (clock_seconds()*1000L+ +#define delay(ms) clock_delay_msec(ms) +#define delayMicroseconds(us) clock_delay_usec(us) + + /* * VI settings, see coding style * ex:ts=8:et:sw=2 */ +#ifdef __cplusplus +} // extern "C" +#endif + /** @} */ diff --git a/platform/osd-merkur/dev/wiring.c b/platform/osd-merkur/dev/wiring.c deleted file mode 100644 index 1c6abc44d..000000000 --- a/platform/osd-merkur/dev/wiring.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - wiring.c - Partial implementation of the Wiring API for the ATmega8. - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2005-2006 David A. Mellis - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - $Id$ -*/ - -#include "wiring_private.h" -#include "hw-arduino.h" - -// the prescaler is set so that timer0 ticks every 64 clock cycles, and the -// the overflow handler is called every 256 ticks. -#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) - -// the whole number of milliseconds per timer0 overflow -#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) - -// the fractional number of milliseconds per timer0 overflow. we shift right -// by three to fit these numbers into a byte. (for the clock speeds we care -// about - 8 and 16 MHz - this doesn't lose precision.) -#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) -#define FRACT_MAX (1000 >> 3) - -volatile unsigned long timer0_overflow_count = 0; -volatile unsigned long timer0_millis = 0; -static unsigned char timer0_fract = 0; - -#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) -SIGNAL(TIM0_OVF_vect) -#else -SIGNAL(TIMER0_OVF_vect) -#endif -{ - // copy these to local variables so they can be stored in registers - // (volatile variables must be read from memory on every access) - unsigned long m = timer0_millis; - unsigned char f = timer0_fract; - - m += MILLIS_INC; - f += FRACT_INC; - if (f >= FRACT_MAX) { - f -= FRACT_MAX; - m += 1; - } - - timer0_fract = f; - timer0_millis = m; - timer0_overflow_count++; -} - -unsigned long millis() -{ - unsigned long m; - uint8_t oldSREG = SREG; - - // disable interrupts while we read timer0_millis or we might get an - // inconsistent value (e.g. in the middle of a write to timer0_millis) - cli(); - m = timer0_millis; - SREG = oldSREG; - - return m; -} - -unsigned long micros() { - unsigned long m; - uint8_t oldSREG = SREG, t; - - cli(); - m = timer0_overflow_count; -#if defined(TCNT0) - t = TCNT0; -#elif defined(TCNT0L) - t = TCNT0L; -#else - #error TIMER 0 not defined -#endif - - -#ifdef TIFR0 - if ((TIFR0 & _BV(TOV0)) && (t < 255)) - m++; -#else - if ((TIFR & _BV(TOV0)) && (t < 255)) - m++; -#endif - - SREG = oldSREG; - - return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); -} - -void delay(unsigned long ms) -{ - uint16_t start = (uint16_t)micros(); - - while (ms > 0) { - if (((uint16_t)micros() - start) >= 1000) { - ms--; - start += 1000; - } - } -} - -/* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock. */ -void delayMicroseconds(unsigned int us) -{ - // calling avrlib's delay_us() function with low values (e.g. 1 or - // 2 microseconds) gives delays longer than desired. - //delay_us(us); -#if F_CPU >= 20000000L - // for the 20 MHz clock on rare Arduino boards - - // for a one-microsecond delay, simply wait 2 cycle and return. The overhead - // of the function call yields a delay of exactly a one microsecond. - __asm__ __volatile__ ( - "nop" "\n\t" - "nop"); //just waiting 2 cycle - if (--us == 0) - return; - - // the following loop takes a 1/5 of a microsecond (4 cycles) - // per iteration, so execute it five times for each microsecond of - // delay requested. - us = (us<<2) + us; // x5 us - - // account for the time taken in the preceeding commands. - us -= 2; - -#elif F_CPU >= 16000000L - // for the 16 MHz clock on most Arduino boards - - // for a one-microsecond delay, simply return. the overhead - // of the function call yields a delay of approximately 1 1/8 us. - if (--us == 0) - return; - - // the following loop takes a quarter of a microsecond (4 cycles) - // per iteration, so execute it four times for each microsecond of - // delay requested. - us <<= 2; - - // account for the time taken in the preceeding commands. - us -= 2; -#else - // for the 8 MHz internal clock on the ATmega168 - - // for a one- or two-microsecond delay, simply return. the overhead of - // the function calls takes more than two microseconds. can't just - // subtract two, since us is unsigned; we'd overflow. - if (--us == 0) - return; - if (--us == 0) - return; - - // the following loop takes half of a microsecond (4 cycles) - // per iteration, so execute it twice for each microsecond of - // delay requested. - us <<= 1; - - // partially compensate for the time taken by the preceeding commands. - // we can't subtract any more than this or we'd overflow w/ small delays. - us--; -#endif - - // busy wait - __asm__ __volatile__ ( - "1: sbiw %0,1" "\n\t" // 2 cycles - "brne 1b" : "=w" (us) : "0" (us) // 2 cycles - ); -} - -void arduino_init() -{ - // this needs to be called before setup() or some functions won't - // work there - - // on the ATmega168, timer 0 is also used for fast hardware pwm - // (using phase-correct PWM would mean that timer 0 overflowed half as often - // resulting in different millis() behavior on the ATmega8 and ATmega168) - /* - * RSC: Keep timer0 for now, until we decide how to implement - * millis() etc in a contiki-compatible way - */ - -#if defined(TCCR0A) && defined(WGM01) - sbi(TCCR0A, WGM01); - sbi(TCCR0A, WGM00); -#endif - // set timer 0 prescale factor to 64 -#if defined(__AVR_ATmega128__) - // CPU specific: different values for the ATmega128 - sbi(TCCR0, CS02); -#elif defined(TCCR0) && defined(CS01) && defined(CS00) - // this combination is for the standard atmega8 - sbi(TCCR0, CS01); - sbi(TCCR0, CS00); -#elif defined(TCCR0B) && defined(CS01) && defined(CS00) - // this combination is for the standard 168/328/1280/2560 - sbi(TCCR0B, CS01); - sbi(TCCR0B, CS00); -#elif defined(TCCR0A) && defined(CS01) && defined(CS00) - // this combination is for the __AVR_ATmega645__ series - sbi(TCCR0A, CS01); - sbi(TCCR0A, CS00); -#else - #error Timer 0 prescale factor 64 not set correctly -#endif - - // enable timer 0 overflow interrupt -#if defined(TIMSK) && defined(TOIE0) - sbi(TIMSK, TOIE0); -#elif defined(TIMSK0) && defined(TOIE0) - sbi(TIMSK0, TOIE0); -#else - #error Timer 0 overflow interrupt not set correctly -#endif - - /* - * All other PCM timers are initialized here in a - * platform-specific way - */ - arduino_pwm_timer_init (); - - /* - * Removed the rest which manipulates the serial pins - */ -} From c5d25f5bfee6cd47dd447e61ebe16b4ebd8d4b31 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Thu, 26 Jun 2014 19:07:48 +0200 Subject: [PATCH 159/345] Last minute bug-fix of arduino-sketch ... happens when not completing testing before pushing commit :-) --- examples/osd/arduino-sketch/resource_led_pwm.c | 3 ++- examples/osd/arduino-sketch/sketch.pde | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/osd/arduino-sketch/resource_led_pwm.c b/examples/osd/arduino-sketch/resource_led_pwm.c index 729e92358..d3363a891 100644 --- a/examples/osd/arduino-sketch/resource_led_pwm.c +++ b/examples/osd/arduino-sketch/resource_led_pwm.c @@ -139,8 +139,9 @@ led_pwm_handler PRINTF ("GOT: %s\n", temp); tmp = strtoul (temp, NULL, 10); if (tmp > 255) { - pwm = 255; + tmp = 255; } + pwm = tmp; PRINTF ("Setting: %d\n", pwm); REST.set_response_status(response, REST.status.CHANGED); } else { diff --git a/examples/osd/arduino-sketch/sketch.pde b/examples/osd/arduino-sketch/sketch.pde index d64140278..4a1250796 100644 --- a/examples/osd/arduino-sketch/sketch.pde +++ b/examples/osd/arduino-sketch/sketch.pde @@ -29,7 +29,7 @@ void setup (void) void loop (void) { /* Use 255 - pwm, LED on merkur-board is wired to +3.3V */ - analogWrite (LED_PIN, 255 - pwm); /* + analogWrite (LED_PIN, 255 - pwm); printf ("clock : %u\nmillis: %lu\n", clock_time (), millis ()); delay (period_100ms * 100); analogWrite (LED_PIN, 255); /* OFF: LED on merkur-board is wired to +3.3V */ From 72da6659edb9bb60b79c76a2db3387c60104e2de Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Thu, 26 Jun 2014 20:37:34 +0200 Subject: [PATCH 160/345] Inline timer init functions, no static storage Hardware init function profit a great deal from being inlined if the given parameters are constant -- which is the common use-case, we could probably call this for all timers and still have less overhead. The hwtimer_pwm_ini (which calls hwtimer_ini) gets completely computed at compile-time resulting only in the register settings of hwtimer_ini. This is now possible because we get rid of static storage for the max_ticks and instead compute this in hwtimer_pwm_max_ticks from the timer register settings. --- cpu/avr/Makefile.avr | 3 +- cpu/avr/hw_pwm_timer.c | 142 ----------------------------------- cpu/avr/hw_timer.c | 103 -------------------------- cpu/avr/hw_timer.h | 163 +++++++++++++++++++++++++++++++++++++++-- 4 files changed, 157 insertions(+), 254 deletions(-) delete mode 100644 cpu/avr/hw_pwm_timer.c delete mode 100644 cpu/avr/hw_timer.c diff --git a/cpu/avr/Makefile.avr b/cpu/avr/Makefile.avr index ee88407d6..d3ef8235f 100644 --- a/cpu/avr/Makefile.avr +++ b/cpu/avr/Makefile.avr @@ -14,8 +14,7 @@ CONTIKI_CPU=$(CONTIKI)/cpu/avr ### TARGETLIBS are platform-specific routines in the contiki library path CONTIKI_CPU_DIRS = . dev AVR = clock.c mtarch.c eeprom.c flash.c rs232.c leds-arch.c \ - watchdog.c rtimer-arch.c bootloader.c hw_timer.c \ - hw_pwm_timer.c + watchdog.c rtimer-arch.c bootloader.c ELFLOADER = elfloader.c elfloader-avr.c symtab-avr.c TARGETLIBS = random.c leds.c diff --git a/cpu/avr/hw_pwm_timer.c b/cpu/avr/hw_pwm_timer.c deleted file mode 100644 index 2c45ce729..000000000 --- a/cpu/avr/hw_pwm_timer.c +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting - * 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. - */ - -/** - * \addgroup hardware timer - * - * @{ - */ - -/** - * \file - * Alternative initialisation with period in microseconds - * \author - * Ralf Schlatterbeck - */ - -#include -#include "contiki.h" -#include "rtimer-arch.h" -#include "hw_timer.h" - -/* one for each possible timer */ -uint16_t hwt_max_ticks [6]; - -#define PERIOD_MAX (0xFFFFFFFF / (F_CPU / 1000000)) -/* for 16-bit timer: */ -#define TICKS_MAX 0xFFFF -#define TICKS_MIN 0xFF - -int8_t -hwtimer_pwm_ini (uint8_t timer, uint32_t period_us, uint8_t pwm_type, uint8_t ocra) -{ - uint32_t ticks = 0; - uint8_t clock = HWT_CLOCK_PRESCALER_1024; - uint8_t wgm = HWT_WGM_NORMAL; - HWT_CHECK_TIMER (timer); - if (period_us > PERIOD_MAX) { - period_us = PERIOD_MAX; - } - ticks = (F_CPU / 1000000) * period_us; - /* Non-fast PWM modes have half the frequency */ - if (pwm_type != HWT_PWM_FAST) { - ticks >>= 1; - } - - /* - * Divisors are 1, 8, 64, 256, 1024, shifts between these are - * 3, 3, 2, 2, respectively. We modify `ticks` in place, the AVR can - * shift only one bit in one instruction, so shifting isn't cheap. - * We try to get the *maximum* prescaler that still permits a tick - * resolution of at least 8 bit. - */ - if (ticks <= (TICKS_MIN << 3)) { - clock = HWT_CLOCK_PRESCALER_1; - } - else if ((ticks >>= 3) <= (TICKS_MIN << 3)) { - clock = HWT_CLOCK_PRESCALER_8; - } - else if ((ticks >>= 3) <= (TICKS_MIN << 2)) { - clock = HWT_CLOCK_PRESCALER_64; - } - else if ((ticks >>= 2) <= (TICKS_MIN << 2)) { - clock = HWT_CLOCK_PRESCALER_256; - } - else if ((ticks >>= 2) > TICKS_MAX) { - ticks = TICKS_MAX; - } - hwt_max_ticks [timer] = ticks; - switch (pwm_type) { - case HWT_PWM_FAST: - wgm = ocra ? HWT_WGM_PWM_FAST_OCRA : HWT_WGM_PWM_FAST_ICR; - break; - case HWT_PWM_PHASE_CORRECT: - wgm = ocra ? HWT_WGM_PWM_PHASE_OCRA : HWT_WGM_PWM_PHASE_ICR; - break; - case HWT_PWM_PHASE_FRQ_CORRECT: - default: - wgm = ocra ? HWT_WGM_PWM_PHASE_FRQ_OCRA : HWT_WGM_PWM_PHASE_FRQ_ICR; - break; - } - /* Special 8- 9- 10-bit modes */ - if (pwm_type == HWT_PWM_FAST || pwm_type == HWT_PWM_PHASE_CORRECT) { - if (ticks == 0xFF) { - wgm = (pwm_type == HWT_PWM_FAST) - ? HWT_WGM_PWM_FAST_8_BIT - : HWT_WGM_PWM_PHASE_8_BIT; - } - else if (ticks == 0x1FF) { - wgm = (pwm_type == HWT_PWM_FAST) - ? HWT_WGM_PWM_FAST_9_BIT - : HWT_WGM_PWM_PHASE_9_BIT; - } - else if (ticks == 0x3FF) { - wgm = (pwm_type == HWT_PWM_FAST) - ? HWT_WGM_PWM_FAST_10_BIT - : HWT_WGM_PWM_PHASE_10_BIT; - } - } - return hwtimer_ini (timer, wgm, clock, ticks); -} - -uint32_t hwtimer_pwm_max_ticks (uint8_t timer) -{ - if (timer > 5) { - return 0; - } - return hwt_max_ticks [timer]; -} - -/* - * ex:ts=8:et:sw=2 - */ - -/** @} */ diff --git a/cpu/avr/hw_timer.c b/cpu/avr/hw_timer.c deleted file mode 100644 index f3ec11930..000000000 --- a/cpu/avr/hw_timer.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting - * 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. - */ - -/** - * \addgroup hardware timer - * - * @{ - */ - -/** - * \file - * Header file for hardware timer of AVR microcontrollers - * \author - * Ralf Schlatterbeck - */ - -#include -#include "contiki.h" -#include "rtimer-arch.h" -#include "hw_timer.h" - -#ifndef PLAT_TIMER -#define PLAT_TIMER 0xFF /* invalid timer for comparison */ -#endif - -int8_t hwtimer_ini (uint8_t timer, uint8_t wgm, uint8_t clock, uint16_t maxt) -{ - int8_t i; - HWT_CHECK_TIMER (timer); - if (wgm > HWT_WGM_MASK || wgm == HWT_WGM_RESERVED) { - return HWT_ERR_INVALID_WGM; - } - if (clock > HWT_CLOCK_MASK) { - return HWT_ERR_INVALID_CLOCK; - } - /* Turn off clock, no need to disable interrupt */ - *HWT_TCCRB (timer) &= ~HWT_CLOCK_MASK; - - *HWT_TCCRA (timer) &= ~(HWT_WGM_MASK_LOW << HWT_WGM_SHIFT_LOW); - *HWT_TCCRA (timer) |= ((wgm & HWT_WGM_MASK_LOW) << HWT_WGM_SHIFT_LOW); - *HWT_TCCRB (timer) &= ~(HWT_WGM_MASK_HIGH << HWT_WGM_SHIFT_HIGH); - *HWT_TCCRB (timer) |= ((wgm & HWT_WGM_MASK_HIGH) << HWT_WGM_SHIFT_HIGH); - - for (i=0; i<3; i++) { - HWT_SET_COM (timer, i, HWT_COM_NORMAL); - } - - if ( wgm == HWT_WGM_PWM_PHASE_FRQ_ICR - || wgm == HWT_WGM_PWM_PHASE_ICR - || wgm == HWT_WGM_CTC_ICR - || wgm == HWT_WGM_PWM_FAST_ICR - ) - { - *HWT_ICR (timer) = maxt; - } - - if ( wgm == HWT_WGM_CTC_OCRA - || wgm == HWT_WGM_PWM_PHASE_FRQ_OCRA - || wgm == HWT_WGM_PWM_PHASE_OCRA - || wgm == HWT_WGM_PWM_FAST_OCRA - ) - { - *HWT_OCRA (timer) = maxt; - } - - /* Set clock, finally */ - *HWT_TCCRB (timer) |= clock; - return 0; -} - -/* - * ex:ts=8:et:sw=2 - */ - -/** @} */ diff --git a/cpu/avr/hw_timer.h b/cpu/avr/hw_timer.h index 06ac73699..f417b0d69 100644 --- a/cpu/avr/hw_timer.h +++ b/cpu/avr/hw_timer.h @@ -215,7 +215,57 @@ * Note that this sets the compare output mode COM registers to 0, * turning off PWM on outputs. */ -int8_t hwtimer_ini (uint8_t timer, uint8_t wgm, uint8_t clock, uint16_t maxt); +static inline int8_t +hwtimer_ini (uint8_t timer, uint8_t wgm, uint8_t clock, uint16_t maxt) +{ + int8_t i; + HWT_CHECK_TIMER (timer); + if (wgm > HWT_WGM_MASK || wgm == HWT_WGM_RESERVED) { + return HWT_ERR_INVALID_WGM; + } + if (clock > HWT_CLOCK_MASK) { + return HWT_ERR_INVALID_CLOCK; + } + /* Turn off clock, no need to disable interrupt */ + *HWT_TCCRB (timer) &= ~HWT_CLOCK_MASK; + + *HWT_TCCRA (timer) &= ~(HWT_WGM_MASK_LOW << HWT_WGM_SHIFT_LOW); + *HWT_TCCRA (timer) |= ((wgm & HWT_WGM_MASK_LOW) << HWT_WGM_SHIFT_LOW); + *HWT_TCCRB (timer) &= ~(HWT_WGM_MASK_HIGH << HWT_WGM_SHIFT_HIGH); + *HWT_TCCRB (timer) |= ((wgm & HWT_WGM_MASK_HIGH) << HWT_WGM_SHIFT_HIGH); + + for (i=0; i<3; i++) { + HWT_SET_COM (timer, i, HWT_COM_NORMAL); + } + + if ( wgm == HWT_WGM_PWM_PHASE_FRQ_ICR + || wgm == HWT_WGM_PWM_PHASE_ICR + || wgm == HWT_WGM_CTC_ICR + || wgm == HWT_WGM_PWM_FAST_ICR + ) + { + *HWT_ICR (timer) = maxt; + } + + if ( wgm == HWT_WGM_CTC_OCRA + || wgm == HWT_WGM_PWM_PHASE_FRQ_OCRA + || wgm == HWT_WGM_PWM_PHASE_OCRA + || wgm == HWT_WGM_PWM_FAST_OCRA + ) + { + *HWT_OCRA (timer) = maxt; + } + + /* Set clock, finally */ + *HWT_TCCRB (timer) |= clock; + return 0; +} + +/* Needed for implementation */ +#define HWT_PERIOD_MAX_ (0xFFFFFFFF / (F_CPU / 1000000)) +/* for 16-bit timer: */ +#define HWT_TICKS_MAX_ 0xFFFF +#define HWT_TICKS_MIN_ 0xFF /** * \brief Convenience function to initialize hardware timer for PWM @@ -248,8 +298,76 @@ int8_t hwtimer_ini (uint8_t timer, uint8_t wgm, uint8_t clock, uint16_t maxt); * pin associated with this register can not be used for PWM. Instead it * can be used to change the period. */ -int8_t -hwtimer_pwm_ini (uint8_t timer, uint32_t period_us, uint8_t pwm_type, uint8_t ocra); +static inline int8_t +hwtimer_pwm_ini (uint8_t timer, uint32_t period_us, uint8_t pwm_type, uint8_t ocra) +{ + uint32_t ticks = 0; + uint8_t clock = HWT_CLOCK_PRESCALER_1024; + uint8_t wgm = HWT_WGM_NORMAL; + HWT_CHECK_TIMER (timer); + if (period_us > HWT_PERIOD_MAX_) { + period_us = HWT_PERIOD_MAX_; + } + ticks = (F_CPU / 1000000) * period_us; + /* Non-fast PWM modes have half the frequency */ + if (pwm_type != HWT_PWM_FAST) { + ticks >>= 1; + } + + /* + * Divisors are 1, 8, 64, 256, 1024, shifts between these are + * 3, 3, 2, 2, respectively. We modify `ticks` in place, the AVR can + * shift only one bit in one instruction, so shifting isn't cheap. + * We try to get the *maximum* prescaler that still permits a tick + * resolution of at least 8 bit. + */ + if (ticks <= (HWT_TICKS_MIN_ << 3)) { + clock = HWT_CLOCK_PRESCALER_1; + } + else if ((ticks >>= 3) <= (HWT_TICKS_MIN_ << 3)) { + clock = HWT_CLOCK_PRESCALER_8; + } + else if ((ticks >>= 3) <= (HWT_TICKS_MIN_ << 2)) { + clock = HWT_CLOCK_PRESCALER_64; + } + else if ((ticks >>= 2) <= (HWT_TICKS_MIN_ << 2)) { + clock = HWT_CLOCK_PRESCALER_256; + } + else if ((ticks >>= 2) > HWT_TICKS_MAX_) { + ticks = HWT_TICKS_MAX_; + } + switch (pwm_type) { + case HWT_PWM_FAST: + wgm = ocra ? HWT_WGM_PWM_FAST_OCRA : HWT_WGM_PWM_FAST_ICR; + break; + case HWT_PWM_PHASE_CORRECT: + wgm = ocra ? HWT_WGM_PWM_PHASE_OCRA : HWT_WGM_PWM_PHASE_ICR; + break; + case HWT_PWM_PHASE_FRQ_CORRECT: + default: + wgm = ocra ? HWT_WGM_PWM_PHASE_FRQ_OCRA : HWT_WGM_PWM_PHASE_FRQ_ICR; + break; + } + /* Special 8- 9- 10-bit modes */ + if (pwm_type == HWT_PWM_FAST || pwm_type == HWT_PWM_PHASE_CORRECT) { + if (ticks == 0xFF) { + wgm = (pwm_type == HWT_PWM_FAST) + ? HWT_WGM_PWM_FAST_8_BIT + : HWT_WGM_PWM_PHASE_8_BIT; + } + else if (ticks == 0x1FF) { + wgm = (pwm_type == HWT_PWM_FAST) + ? HWT_WGM_PWM_FAST_9_BIT + : HWT_WGM_PWM_PHASE_9_BIT; + } + else if (ticks == 0x3FF) { + wgm = (pwm_type == HWT_PWM_FAST) + ? HWT_WGM_PWM_FAST_10_BIT + : HWT_WGM_PWM_PHASE_10_BIT; + } + } + return hwtimer_ini (timer, wgm, clock, ticks); +} /* * Simple init macro for sane default values @@ -260,11 +378,42 @@ hwtimer_pwm_ini (uint8_t timer, uint32_t period_us, uint8_t pwm_type, uint8_t oc /** * \brief Maximum timer value usable in hwtimer_set_pwm * \param timer: Timer to use - * \return - * - * + * \return max. timer value according to current timer setup + * negative value if wrong timer given + * a positive value is guaranteed to fit into 16 bit unsigned. */ -uint32_t hwtimer_pwm_max_ticks (uint8_t timer); +static inline int32_t hwtimer_pwm_max_ticks (uint8_t timer) +{ + uint8_t wgm = 0; + HWT_CHECK_TIMER (timer); + wgm = ((*HWT_TCCRA (timer) >> HWT_WGM_SHIFT_LOW) & HWT_WGM_MASK_LOW) + | ((*HWT_TCCRB (timer) >> HWT_WGM_SHIFT_HIGH) & HWT_WGM_MASK_HIGH) + ; + switch (wgm) { + case HWT_WGM_PWM_PHASE_8_BIT: + case HWT_WGM_PWM_FAST_8_BIT: + return 0xFF; + case HWT_WGM_PWM_PHASE_9_BIT: + case HWT_WGM_PWM_FAST_9_BIT: + return 0x1FF; + case HWT_WGM_PWM_PHASE_10_BIT: + case HWT_WGM_PWM_FAST_10_BIT: + return 0x3FF; + case HWT_WGM_CTC_OCRA: + case HWT_WGM_PWM_PHASE_FRQ_OCRA: + case HWT_WGM_PWM_PHASE_OCRA: + case HWT_WGM_PWM_FAST_OCRA: + return *HWT_OCRA (timer); + case HWT_WGM_PWM_PHASE_FRQ_ICR: + case HWT_WGM_PWM_PHASE_ICR: + case HWT_WGM_CTC_ICR: + case HWT_WGM_PWM_FAST_ICR: + return *HWT_ICR (timer); + case HWT_WGM_NORMAL: + return 0xFFFF; + } + return HWT_ERR_INVALID_WGM; +} /* * The following functions are defined inline to allow for compiler From 9df7ab38753c7d926be0db1747230b6023a448d0 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Fri, 27 Jun 2014 22:10:19 +0200 Subject: [PATCH 161/345] Fix leap year computation --- apps/time/time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/time/time.c b/apps/time/time.c index 0b60c90f9..d2f7719c8 100644 --- a/apps/time/time.c +++ b/apps/time/time.c @@ -44,13 +44,13 @@ gmtime_r (const time_t *timep, struct tm *ptm) ptm->tm_hour = t % 24; t /= 24; ptm->tm_wday = (t+4) % 7; - year = 70; + year = 1970; days = 0; while ((days += YDAYS (year)) <= t) { year++; } - ptm->tm_year = year; + ptm->tm_year = year - 1900; days -= YDAYS(year); t -= days; ptm->tm_yday = t; From 4643c5d02de225441d7272c125cd985de78f3d66 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Fri, 27 Jun 2014 22:25:51 +0200 Subject: [PATCH 162/345] Factor resources, fix time Now there is a generic resource that can generate and parse application/json as well as text/plain. It can be re-used, only the from_string and to_string routines have to be written and the resource properly set up. A new resource format is specified, see GENERIC_RESOURCE in, e.g., examples/osd/pwm-example. This is now used in all my examples, namely pwm-example, arduino-sketch, wallclock-time. There was an off by one error for the month in time formatting (in gmtime and localtime). And the leap-year computation was broken. Both fixed now, so we get a correct date. For localtime we are still 2 hours off because daylight saving isn't implemented yet. Also renamed gmtime to utc. --- apps/json-resource/Makefile.json-resource | 1 + apps/json-resource/generic_resource.c | 209 +++++++++++++ apps/json-resource/generic_resource.h | 132 ++++++++ apps/time/resource_gmtime.c | 134 +++----- apps/time/resource_timestamp.c | 167 +++------- apps/time/time_resource.h | 2 +- examples/osd/arduino-sketch/Makefile | 2 +- .../osd/arduino-sketch/resource_led_pwm.c | 295 +++--------------- examples/osd/pwm-example/Makefile | 2 +- examples/osd/pwm-example/resource_led_pwm.c | 152 ++------- examples/osd/wallclock-time/Makefile | 2 +- .../osd/wallclock-time/er-example-server.c | 2 +- 12 files changed, 488 insertions(+), 612 deletions(-) create mode 100644 apps/json-resource/Makefile.json-resource create mode 100644 apps/json-resource/generic_resource.c create mode 100644 apps/json-resource/generic_resource.h diff --git a/apps/json-resource/Makefile.json-resource b/apps/json-resource/Makefile.json-resource new file mode 100644 index 000000000..70f2a7ff7 --- /dev/null +++ b/apps/json-resource/Makefile.json-resource @@ -0,0 +1 @@ +json-resource_src = generic_resource.c diff --git a/apps/json-resource/generic_resource.c b/apps/json-resource/generic_resource.c new file mode 100644 index 000000000..528ffa368 --- /dev/null +++ b/apps/json-resource/generic_resource.c @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \addtogroup Generic CoAP Resource Handler + * + * @{ + */ + + +/** + * \file + * Generic CoAP Resource Handler + * \author + * Ralf Schlatterbeck + */ + +#include +#include +#include +#include "contiki.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" +#include "generic_resource.h" + +/* Error-handling macro */ +# define BYE(_exp, _tag) \ + do { \ + PRINTF("Expect "_exp": %d\n",_tag); \ + return -1; \ + } while(0) + +#define DEBUG 1 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif + +int8_t +json_parse_variable + (const uint8_t *bytes, size_t len, char *name, char *buf, size_t buflen) +{ + int tag = 0; + struct jsonparse_state state; + struct jsonparse_state *parser = &state; + PRINTF ("PUT: len: %d, %s\n", len, (const char *)bytes); + jsonparse_setup (parser, (const char *)bytes, len); + if ((tag = jsonparse_next (parser)) != JSON_TYPE_OBJECT) { + BYE ("OBJECT", tag); + } + if ((tag = jsonparse_next (parser)) != JSON_TYPE_PAIR_NAME) { + BYE ("PAIR_NAME", tag); + } + while (jsonparse_strcmp_value (parser, name) != 0) { + tag = jsonparse_next (parser); + if (tag != JSON_TYPE_PAIR) { + BYE ("PAIR", tag); + } + tag = jsonparse_next (parser); + tag = jsonparse_next (parser); + if (tag != ',') { + BYE (",", tag); + } + tag = jsonparse_next (parser); + if (tag != JSON_TYPE_PAIR_NAME) { + BYE ("PAIR_NAME", tag); + } + } + tag = jsonparse_next (parser); + if (tag != JSON_TYPE_PAIR) { + BYE ("PAIR", tag); + } + tag = jsonparse_next (parser); + if (tag != JSON_TYPE_STRING) { + BYE ("STRING", tag); + } + jsonparse_copy_value (parser, buf, buflen); + return 0; +} + +void generic_handler + ( void *request + , void *response + , uint8_t *buffer + , uint16_t preferred_size + , int32_t *offset + , char *name + , void (*from_str)(const char *name, const char *s) + , size_t (*to_str)(const char *name, uint8_t is_json, char *buf, size_t bsize) + ) +{ + int success = 1; + char temp [100]; + int i = 0; + size_t len = 0; + int n_acc = 0; + const uint8_t *bytes = NULL; + const uint16_t *accept = NULL; + uint16_t a_ctype = REST.type.APPLICATION_JSON; + uint16_t c_ctype = REST.get_header_content_type (request); + + /* Seems like accepted type is currently unsupported? */ + n_acc = REST.get_header_accept (request, &accept); + for (i=0; i sizeof (temp)) { + success = 0; + break; + } + len += snprintf (temp + len, sizeof (temp) - len, "\n"); + if (len > sizeof (temp)) { + success = 0; + break; + } + } else { // jSON Format + len += snprintf + (temp + len, sizeof (temp) - len, "{\n \"%s\" : ", name); + if (len > sizeof (temp)) { + success = 0; + break; + } + len += to_str (name, 1, temp + len, sizeof (temp) - len); + if (len > sizeof (temp)) { + success = 0; + break; + } + len += snprintf (temp + len, sizeof (temp) - len, "\n}\n"); + if (len > sizeof (temp)) { + success = 0; + break; + } + } + memcpy (buffer, temp, len); + REST.set_header_content_type (response, a_ctype); + REST.set_response_payload (response, buffer, len); + break; + case METHOD_PUT: + if (from_str && (len = coap_get_payload(request, &bytes))) { + if (c_ctype == REST.type.TEXT_PLAIN) { + temp [sizeof (temp) - 1] = 0; + strncpy (temp, (const char *)bytes, MIN (len, sizeof (temp) - 1)); + } else { // jSON Format + if (json_parse_variable (bytes, len, name, temp, sizeof (temp)) < 0) { + success = 0; + break; + } + } + from_str (name, temp); + REST.set_response_status(response, REST.status.CHANGED); + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ + +/** @} */ + diff --git a/apps/json-resource/generic_resource.h b/apps/json-resource/generic_resource.h new file mode 100644 index 000000000..850c575e8 --- /dev/null +++ b/apps/json-resource/generic_resource.h @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2014, Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \defgroup Generic CoAP Resource Handler + * + * This factors the boilerplate code necessary for defining a resource + * together with the necessary handler. Currently this supports + * text/plain and application/json and outputs the resource with its + * name in json format. This may change in the future as more CoRE + * standards (e.g. see RFC 6690) get defined. + * + * @{ + */ + + +/** + * \file + * Generic CoAP Resource Handler + * \author + * Ralf Schlatterbeck + */ + +#define STR__(s) #s +#define STR_(s) STR__(s) + +/* + * A macro that extends the resource definition and also sets up the + * necessary handler function that calls format/parse routines that + * convert from/to string (fs and ts). The ts function needs to return + * the length written, similar to sprintf. + * The content type definitions ct="0 5" are text/plain and + * application/json, respectively, see rfc7252 Table 9 p. 91. + * Yes, this *is* a hack. But I hate boilerplate code. + */ + +#define GENERIC_RESOURCE(name, methods, path, title, unit, fs, ts) \ + void name##_handler \ + ( void *request \ + , void *response \ + , uint8_t *buffer \ + , uint16_t ps \ + , int32_t *offset \ + ) \ + { \ + generic_handler \ + (request, response, buffer, ps, offset, STR_(name), fs, ts); \ + } \ + \ + RESOURCE ( name, methods, path \ + , "title=\"" STR_(title) "\"" \ + ";rt=UCUM:\"" STR_(unit) "\"" \ + ";ct=\"0 5\"" \ + ) + +/** + * \brief Parse a resource in json format + * \param bytes: Input string received via coap + * \param len: Length of input string + * \param name: Name to search in json input + * \param buf: Output buffer + * \param buflen: Output buffer length + * \return 0 for success, -1 for error + * + * If compiled with DEBUG also prints the error encountered + */ +extern int8_t json_parse_variable + (const uint8_t *bytes, size_t len, char *name, char *buf, size_t buflen); + +/** + * \brief Generic coap resource handler + * \param name: The name of the variable in json + * \param from_str: Application method to parse value from string + * and act on it, may be NULL in which case the resource only + * supports GET not PUT + * \param to_str: Application method to format value for output; + * the function may chose to format differently for coap or text + * The other parameters are the same as a normal resource handler + * This helps avoid boilerplate code for request handlers + * + * The callback functions get the name of the parameter as a first + * argument, this allows to re-use the same function for different + * parameters. The from_str in addition gets the string to parse. + * For the to_str function the is_json flag allows to generate a + * different string depending on the content-type. In addition it gets a + * buffer and the size of the buffer. It needs to return the number of + * bytes output, similar to sprintf. + */ +extern void generic_handler + ( void *request + , void *response + , uint8_t *buffer + , uint16_t preferred_size + , int32_t *offset + , char *name + , void (*from_str)(const char *name, const char *s) + , size_t (*to_str)(const char *name, uint8_t is_json, char *buf, size_t bsize) + ); + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ + +/** @} */ + diff --git a/apps/time/resource_gmtime.c b/apps/time/resource_gmtime.c index 732abd7ac..b16be9794 100644 --- a/apps/time/resource_gmtime.c +++ b/apps/time/resource_gmtime.c @@ -16,111 +16,51 @@ #include "jsonparse.h" /* Only coap 13 for now */ #include "er-coap-13.h" +#include "generic_resource.h" -RESOURCE \ +size_t time_to_string (const char *name, uint8_t is_json, char *buf, size_t bs) +{ + struct timeval tv; + struct tm tm; + struct tm *(*method)(const time_t *, struct tm *) = gmtime_r; + if (0 == strcmp (name, "localtime")) { + method = localtime_r; + } + gettimeofday (&tv, NULL); + method (&tv.tv_sec, &tm); + return snprintf + ( buf + , bs + , "%s%lu-%02u-%02u %02u:%02u:%02u%s" + , is_json ? "\"" : "" + , 1900 + tm.tm_year + , tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec + , is_json ? "\"" : "" + ); +} + +GENERIC_RESOURCE \ ( localtime , METHOD_GET , "clock/localtime" - , "title=\"Time\";rt=\"localtime\"" + , Local time + , formatted time + , NULL + , time_to_string ); -RESOURCE \ - ( gmtime +GENERIC_RESOURCE \ + ( utc , METHOD_GET , "clock/utc" - , "title=\"Time\";rt=\"utc\"" + , UTC + , formatted time + , NULL + , time_to_string ); -void -time_handler - ( void* request - , void* response - , uint8_t *buffer - , uint16_t preferred_size - , int32_t *offset - , struct tm *(*method)(const time_t *,struct tm *) - ) -{ - int success = 1; +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ - char temp[100]; - int index = 0; - int length = 0; /* |<-------->| */ - struct timeval tv; - struct tm tm; - int i = 0; - int n_acc = 0; - const uint16_t *accept = NULL; - uint16_t a_ctype = REST.type.APPLICATION_JSON; /* for now json is default */ - - /* Looks like accepted content-type isn't currently supported */ - n_acc = REST.get_header_accept (request, &accept); - for (i=0; i @@ -17,270 +15,61 @@ #include "jsonparse.h" /* Only coap 13 for now */ #include "er-coap-13.h" +#include "generic_resource.h" #include "led_pwm.h" -/* Error-handling macro */ -# define BYE(_exp, _tag) \ - do { \ - PRINTF("Expect "_exp": %d\n",_tag); \ - success=0; \ - goto bye; \ - } while(0) +void pwm_from_string (const char *name, const char *s) +{ + uint32_t tmp = strtoul (s, NULL, 10); + if (tmp > 255) { + tmp = 255; + } + pwm = tmp; +} -#define DEBUG 1 -#if DEBUG -#define PRINTF(...) printf(__VA_ARGS__) -#else -#define PRINTF(...) -#endif +size_t +pwm_to_string (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + return snprintf (buf, bufsize, "%d", pwm); +} -RESOURCE \ +GENERIC_RESOURCE \ ( led_pwm, METHOD_GET | METHOD_PUT , "led/pwm" - , "title=\"LED PWM\";rt=\"led pwm\"" + , LED PWM + , duty-cycle + , pwm_from_string + , pwm_to_string ); -void -led_pwm_handler - ( void* request - , void* response - , uint8_t *buffer - , uint16_t preferred_size - , int32_t *offset - ) +void period_from_string (const char *name, const char *s) { - int success = 1; - - int i; - char temp[100]; - int index = 0; - int length = 0; - int tag = 0; - const uint8_t *bytes = NULL; - size_t len = 0; - int n_acc = 0; - const uint16_t *accept = NULL; - uint16_t a_ctype = REST.type.APPLICATION_JSON; - uint16_t c_ctype = REST.get_header_content_type (request); - uint32_t tmp = 0; - - /* Seems like accepted type is currently unsupported? */ - n_acc = REST.get_header_accept (request, &accept); - for (i=0; i 10) { + tmp = 10; } - } - - switch(REST.get_method_type(request)) { - case METHOD_GET: - // TEXT format - if (a_ctype == REST.type.TEXT_PLAIN) { - index += sprintf (temp + index, "%d\n", pwm); - } else { // jSON Format - index += sprintf - ( temp + index - ,"{\n \"pwm\" : \"%d\"\n}\n" - , pwm - ); - } - length = strlen(temp); - memcpy (buffer, temp, length); - REST.set_header_content_type (response, a_ctype); - REST.set_response_payload (response, buffer, length); - - break; - case METHOD_PUT: - if ((len = coap_get_payload(request, &bytes))) { - PRINTF ("PUT: len: %d, %s\n", len, (char *)bytes); - if (c_ctype == REST.type.TEXT_PLAIN) { - temp [sizeof (temp) - 1] = 0; - strncpy (temp, (char *)bytes, MIN (len + 1, sizeof (temp) - 1)); - } else { // jSON Format - struct jsonparse_state state; - struct jsonparse_state *parser = &state; - jsonparse_setup (parser, (char *)bytes, len); - if ((tag = jsonparse_next (parser)) != JSON_TYPE_OBJECT) { - BYE ("OBJECT", tag); - } - if ((tag = jsonparse_next (parser)) != JSON_TYPE_PAIR_NAME) { - BYE ("PAIR_NAME", tag); - } - while (jsonparse_strcmp_value (parser, "pwm") != 0) { - tag = jsonparse_next (parser); - if (tag != JSON_TYPE_PAIR) { - BYE ("PAIR", tag); - } - tag = jsonparse_next (parser); - tag = jsonparse_next (parser); - if (tag != ',') { - BYE (",", tag); - } - tag = jsonparse_next (parser); - if (tag != JSON_TYPE_PAIR_NAME) { - BYE ("PAIR_NAME", tag); - } - } - tag = jsonparse_next (parser); - if (tag != JSON_TYPE_PAIR) { - BYE ("PAIR", tag); - } - tag = jsonparse_next (parser); - if (tag != JSON_TYPE_STRING) { - BYE ("STRING", tag); - } - jsonparse_copy_value (parser, temp, sizeof (temp)); - temp [sizeof (temp) - 1] = 0; - } - PRINTF ("GOT: %s\n", temp); - tmp = strtoul (temp, NULL, 10); - if (tmp > 255) { - tmp = 255; - } - pwm = tmp; - PRINTF ("Setting: %d\n", pwm); - REST.set_response_status(response, REST.status.CHANGED); - } else { - PRINTF ("PUT: len: %d\n", len); - success = 0; - } - bye : - break; - default: - success = 0; - } - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } + if (tmp == 0) { + tmp = 1; + } + period_100ms = tmp; } -RESOURCE \ +size_t +period_to_string (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + return snprintf (buf, bufsize, "%d", period_100ms * 100); +} + +GENERIC_RESOURCE \ ( led_period, METHOD_GET | METHOD_PUT , "led/period" - , "title=\"LED Period\";rt=\"led period\"" + , LED Period + , ms + , period_from_string + , period_to_string ); -void -led_period_handler - ( void* request - , void* response - , uint8_t *buffer - , uint16_t preferred_size - , int32_t *offset - ) -{ - int success = 1; - - int i; - char temp[100]; - int index = 0; - int length = 0; - int tag = 0; - const uint8_t *bytes = NULL; - size_t len = 0; - int n_acc = 0; - const uint16_t *accept = NULL; - uint16_t a_ctype = REST.type.APPLICATION_JSON; - uint16_t c_ctype = REST.get_header_content_type (request); - uint32_t tmp = 0; - - /* Seems like accepted type is currently unsupported? */ - n_acc = REST.get_header_accept (request, &accept); - for (i=0; i 10) { - tmp = 10; - } - if (tmp == 0) { - tmp = 1; - } - period_100ms = tmp; - PRINTF ("Setting: %dms\n", period_100ms * 100); - REST.set_response_status(response, REST.status.CHANGED); - } else { - PRINTF ("PUT: len: %d\n", len); - success = 0; - } - bye : - break; - default: - success = 0; - } - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ diff --git a/examples/osd/pwm-example/Makefile b/examples/osd/pwm-example/Makefile index 480983734..8d5ffbb3e 100644 --- a/examples/osd/pwm-example/Makefile +++ b/examples/osd/pwm-example/Makefile @@ -66,7 +66,7 @@ CFLAGS += -DUIP_CONF_TCP=1 APPS += er-http-engine endif -APPS += erbium json +APPS += erbium json json-resource include $(CONTIKI)/Makefile.include diff --git a/examples/osd/pwm-example/resource_led_pwm.c b/examples/osd/pwm-example/resource_led_pwm.c index a9b276e08..d10a730ec 100644 --- a/examples/osd/pwm-example/resource_led_pwm.c +++ b/examples/osd/pwm-example/resource_led_pwm.c @@ -15,6 +15,7 @@ /* Only coap 13 for now */ #include "er-coap-13.h" #include "hw_timer.h" +#include "generic_resource.h" /* Error-handling macro */ # define BYE(_exp, _tag) \ @@ -44,131 +45,32 @@ void led_pwm_init (void) DDRE |= (1< max_ticks) { + pwm = max_ticks; + } + PRINTF ("Setting: %d (max=%d)\n", pwm, max_ticks); + hwtimer_pwm_inverse (3, HWT_CHANNEL_C); + DDRE |= (1< max_ticks) { - pwm = max_ticks; - } - PRINTF ("Setting: %d (max=%d)\n", pwm, max_ticks); - hwtimer_pwm_inverse (3, HWT_CHANNEL_C); - DDRE |= (1< Date: Sun, 29 Jun 2014 17:12:13 +0200 Subject: [PATCH 163/345] Minor optimisations of timer init --- cpu/avr/hw_timer.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/cpu/avr/hw_timer.h b/cpu/avr/hw_timer.h index f417b0d69..afdf8ece4 100644 --- a/cpu/avr/hw_timer.h +++ b/cpu/avr/hw_timer.h @@ -177,9 +177,12 @@ : ((t)==4?(&TCNT4) :(&TCNT5)) \ ) -#define HWT_SET_COM(timer, channel, com) \ - ((*HWT_TCCRA (timer) &= ~(HWT_COM_MASK << (6 - 2 * (channel)))) \ - ,(*HWT_TCCRA (timer) |= ((com) << (6 - 2 * (channel)))) \ +#define HWT_CLR_COM(timer, channel) \ + (*HWT_TCCRA (timer) &= ~(HWT_COM_MASK << (6 - 2 * (channel)))) + +#define HWT_SET_COM(timer, channel, com) \ + ( HWT_CLR_COM (timer, channel) \ + , (*HWT_TCCRA (timer) |= ((com) << (6 - 2 * (channel)))) \ ) #define HWT_CHECK_TIMER(timer) \ @@ -235,7 +238,7 @@ hwtimer_ini (uint8_t timer, uint8_t wgm, uint8_t clock, uint16_t maxt) *HWT_TCCRB (timer) |= ((wgm & HWT_WGM_MASK_HIGH) << HWT_WGM_SHIFT_HIGH); for (i=0; i<3; i++) { - HWT_SET_COM (timer, i, HWT_COM_NORMAL); + HWT_CLR_COM (timer, i); } if ( wgm == HWT_WGM_PWM_PHASE_FRQ_ICR @@ -458,7 +461,11 @@ hwtimer_set_com (uint8_t timer, uint8_t channel, uint8_t com) if (com > HWT_COM_MASK) { return HWT_ERR_INVALID_COM; } - HWT_SET_COM (timer, channel, com); + if (com) { + HWT_SET_COM (timer, channel, com); + } else { + HWT_CLR_COM (timer, channel); + } return 0; } From 77c02d58f81309431132852f434be3d85222c38c Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Sun, 29 Jun 2014 17:26:15 +0200 Subject: [PATCH 164/345] Refactor A/D conversion in adc.c Now the necessary settings are in adc.h. Refactored to allow repeated ADC reads without reinitialization. Arduino allows setting analogReference, this is now also implemented. ADC is now initialized to sane values in apps/arduino/arduino-process.c dev/arduino/arduino-compat.h now has all hardware independent settings for arduino (some moved from platform/osd-merkur/dev/hw-arduino.h). turnOffPWM re-implemented with hw_timer, removed from wiring_digital.c ADC-specific arduino stuff moved to arduino-compat.h Arduinos wiring_analog no longer necessary. arduino-sketch example now reads analog inputs 1 and 5 using analogRead. --- apps/arduino/arduino-process.c | 2 + dev/arduino/arduino-compat.h | 38 +++++++++ examples/osd/arduino-sketch/led_pwm.h | 9 ++- .../osd/arduino-sketch/resource_led_pwm.c | 32 ++++++++ examples/osd/arduino-sketch/sketch.pde | 10 ++- platform/osd-merkur/Makefile.osd-merkur | 2 +- platform/osd-merkur/dev/Arduino.h | 20 +---- platform/osd-merkur/dev/adc.c | 43 +++++------ platform/osd-merkur/dev/adc.h | 46 ++++++++++- platform/osd-merkur/dev/hw-arduino.h | 26 ------- platform/osd-merkur/dev/wiring_analog.c | 48 ------------ platform/osd-merkur/dev/wiring_digital.c | 77 ------------------- 12 files changed, 154 insertions(+), 199 deletions(-) delete mode 100644 platform/osd-merkur/dev/wiring_analog.c diff --git a/apps/arduino/arduino-process.c b/apps/arduino/arduino-process.c index b7a87c0b3..f6945a9bc 100644 --- a/apps/arduino/arduino-process.c +++ b/apps/arduino/arduino-process.c @@ -51,6 +51,7 @@ #include "arduino-process.h" #include "hw_timer.h" +#include "adc.h" #include "hw-arduino.h" PROCESS(arduino_sketch, "Arduino Sketch Wrapper"); @@ -60,6 +61,7 @@ PROCESS_THREAD(arduino_sketch, ev, data) PROCESS_BEGIN(); arduino_pwm_timer_init (); + adc_init (); setup (); while (1) { loop (); diff --git a/dev/arduino/arduino-compat.h b/dev/arduino/arduino-compat.h index 23e417623..d3f9b58ac 100644 --- a/dev/arduino/arduino-compat.h +++ b/dev/arduino/arduino-compat.h @@ -84,6 +84,7 @@ extern "C" { #include "contiki.h" #include "hw_timer.h" +#include "adc.h" #ifdef __cplusplus } // extern "C" @@ -145,6 +146,43 @@ static inline void analogWrite(uint8_t pin, int val) } } +/* + * turnOffPWM of arduino is implemented by hw_timer + */ +#define turnOffPWM(atimer) \ + ( (atimer) == NOT_ON_TIMER \ + ? (void)0 \ + : (void)hwtimer_pwm_disable \ + (atimer >> HW_TIMER_SHIFT, atimer & HWT_CHANNEL_MASK) \ + ) + +/* + * micros on arduino takes timer overflows into account. + * We put in the seconds counter. To get a consistent seconds / ticks + * value we have to disable interrupts. + */ +static inline uint32_t micros (void) +{ + uint32_t ticks; + uint8_t sreg = SREG; + cli (); + ticks = clock_seconds () * 1000000L + + clock_time () * 1000L / CLOCK_SECOND; + SREG = sreg; + return ticks; +} +/* + * millis counts only internal timer ticks since start, not trying to do + * something about overflows. Note that we don't try to emulate overflow + * behaviour of arduino implementation. + */ +#define millis() (((uint32_t)clock_time())*1000L/CLOCK_SECOND) +#define micros() (clock_seconds()*1000L+ +#define delay(ms) clock_delay_msec(ms) +#define delayMicroseconds(us) clock_delay_usec(us) + +#define analogRead(analogpin) readADC(analogpin) + #ifdef __cplusplus } // extern "C" #endif diff --git a/examples/osd/arduino-sketch/led_pwm.h b/examples/osd/arduino-sketch/led_pwm.h index 6ace57f8d..31356fd78 100644 --- a/examples/osd/arduino-sketch/led_pwm.h +++ b/examples/osd/arduino-sketch/led_pwm.h @@ -21,10 +21,15 @@ #include "erbium.h" #include "er-coap-13.h" -extern uint8_t pwm; -extern uint8_t period_100ms; +extern uint8_t pwm; +extern uint8_t period_100ms; +extern uint16_t analog1_voltage; +extern uint16_t analog5_voltage; + extern resource_t resource_led_pwm; extern resource_t resource_led_period; +extern resource_t resource_analog1_voltage; +extern resource_t resource_analog5_voltage; #endif // led_pwm_h /** @} */ diff --git a/examples/osd/arduino-sketch/resource_led_pwm.c b/examples/osd/arduino-sketch/resource_led_pwm.c index 1cca70bf1..2ed1cdd78 100644 --- a/examples/osd/arduino-sketch/resource_led_pwm.c +++ b/examples/osd/arduino-sketch/resource_led_pwm.c @@ -69,6 +69,38 @@ GENERIC_RESOURCE \ , period_to_string ); +size_t +analog1_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + return snprintf + (buf, bufsize, "%d.%03d", analog1_voltage / 1000, analog1_voltage % 1000); +} + +GENERIC_RESOURCE \ + ( analog1_voltage, METHOD_GET + , "analog/1" + , Analog 1 voltage + , V + , NULL + , analog1_v + ); + +size_t +analog5_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + return snprintf + (buf, bufsize, "%d.%03d", analog5_voltage / 1000, analog5_voltage % 1000); +} + +GENERIC_RESOURCE \ + ( analog5_voltage, METHOD_GET + , "analog/5" + , Analog 5 voltage + , V + , NULL + , analog5_v + ); + /* * VI settings, see coding style * ex:ts=8:et:sw=2 diff --git a/examples/osd/arduino-sketch/sketch.pde b/examples/osd/arduino-sketch/sketch.pde index 4a1250796..13da7e6bb 100644 --- a/examples/osd/arduino-sketch/sketch.pde +++ b/examples/osd/arduino-sketch/sketch.pde @@ -15,8 +15,10 @@ extern "C" { #include "led_pwm.h" #define LED_PIN 5 -uint8_t pwm = 128; -uint8_t period_100ms = 10; /* one second */ +uint8_t pwm = 128; +uint8_t period_100ms = 10; /* one second */ +uint16_t analog1_voltage = 0; +uint16_t analog5_voltage = 0; } void setup (void) @@ -24,12 +26,16 @@ void setup (void) rest_init_engine (); rest_activate_resource (&resource_led_pwm); rest_activate_resource (&resource_led_period); + rest_activate_resource (&resource_analog1_voltage); + rest_activate_resource (&resource_analog5_voltage); } void loop (void) { /* Use 255 - pwm, LED on merkur-board is wired to +3.3V */ analogWrite (LED_PIN, 255 - pwm); + analog1_voltage = analogRead (1) * 1600L / 1023L; + analog5_voltage = analogRead (5) * 1600L / 1023L; printf ("clock : %u\nmillis: %lu\n", clock_time (), millis ()); delay (period_100ms * 100); analogWrite (LED_PIN, 255); /* OFF: LED on merkur-board is wired to +3.3V */ diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 9650a201b..3fb160bdd 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -27,7 +27,7 @@ CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c #Needed for Relay 1 to 4 CONTIKI_TARGET_SOURCEFILES += relay.c relay-sensor.c # Arduino -CONTIKI_TARGET_SOURCEFILES += wiring_digital.c wiring_analog.c +CONTIKI_TARGET_SOURCEFILES += wiring_digital.c CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 diff --git a/platform/osd-merkur/dev/Arduino.h b/platform/osd-merkur/dev/Arduino.h index 4d9208864..e0ea47b10 100644 --- a/platform/osd-merkur/dev/Arduino.h +++ b/platform/osd-merkur/dev/Arduino.h @@ -42,15 +42,8 @@ extern "C"{ #define FALLING 2 #define RISING 3 -#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) -#define INTERNAL1V1 2 -#define INTERNAL2V56 3 -#elif defined(__AVR_ATmega128RFA1__) -#else -#define INTERNAL 3 -#endif -#define DEFAULT 1 -#define EXTERNAL 0 +#define DEFAULT ADC_DEFAULT +#define EXTERNAL ADC_EXTERNAL // undefine stdlib's abs if encountered #ifdef abs @@ -85,18 +78,9 @@ typedef unsigned int word; typedef uint8_t boolean; typedef uint8_t byte; -/* - * This has been renamed from init to arduino_init, the original - * function name is way too generic. The arduino compatibility framework - * makes sure the correct function is called. - */ -void arduino_init(void); - void pinMode(uint8_t, uint8_t); void digitalWrite(uint8_t, uint8_t); int digitalRead(uint8_t); -int analogRead(uint8_t); -void analogReference(uint8_t mode); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); diff --git a/platform/osd-merkur/dev/adc.c b/platform/osd-merkur/dev/adc.c index 82c66411f..7efde72e1 100644 --- a/platform/osd-merkur/dev/adc.c +++ b/platform/osd-merkur/dev/adc.c @@ -36,33 +36,28 @@ * Paulo Louro */ -#include +#include "adc.h" -#ifndef cbi -#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) -#endif -#ifndef sbi -#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) -#endif +static uint8_t analog_reference = ADC_DEFAULT; + +/* + * For arduino interface for setting external reference voltage + * Note that applying an external voltage *and* then setting the analog + * reference to something internal will short the internal and the + * external reference voltage and most likely destroy the processor. + */ +void analogReference(uint8_t mode) +{ + analog_reference = mode; +} int readADC(uint8_t pin) { int result = 0; - if ( pin >= 14 ) - pin -= 14; - - ADMUX = _BV(REFS1) | _BV(REFS0) | ( pin & 7 ) ; - ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - sbi(ADCSRA,ADSC); - loop_until_bit_is_clear(ADCSRA,ADSC); - - - result = ADC; - - ADCSRA=0; //disable ADC - ADMUX=0; //turn off internal vref - + adc_setup (analog_reference, pin); + result = adc_read (); + adc_fin (); return result; } @@ -77,13 +72,13 @@ int readInternalTemp(void) ADMUX = _BV(REFS1) | _BV(REFS0) | 0b1001 ; ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2) ; - sbi(ADCSRA,ADSC); + ADCSRA |= 1 << ADSC; loop_until_bit_is_clear(ADCSRA,ADSC); reading = ADC; + ADCSRB=0; //disable ADC, need to write B first for MUX5 bit ADCSRA=0; //disable ADC - ADCSRB=0; //disable ADC ADMUX=0; //turn off internal vref return reading * 113 - 27280; -} \ No newline at end of file +} diff --git a/platform/osd-merkur/dev/adc.h b/platform/osd-merkur/dev/adc.h index ea851f237..6ea4cf0ab 100644 --- a/platform/osd-merkur/dev/adc.h +++ b/platform/osd-merkur/dev/adc.h @@ -1,8 +1,52 @@ #ifndef __ADC_ARCH_H__ #define __ADC_ARCH_H__ +#include + +/* + * Reference voltage + * The default is 1.6V reference voltage + * The selected reference voltage is the maximum voltage that can be + * measured. + * Directly provide shifted variants so we don't need to shift. + */ +#define ADC_1_5 (2<<6) +#define ADC_1_6 (3<<6) +#define ADC_1_8 (1<<6) +#define ADC_EXTERNAL (0<<6) +#define ADC_DEFAULT ADC_1_6 + +/* sometimes it's desirable to decouple setup / finish from sampling */ + +static inline void adc_setup (uint8_t ref_volt, uint8_t pin) +{ + ADMUX = ref_volt | (pin & 0x7); + ADCSRA = _BV(ADEN) | _BV(ADPS0) | _BV(ADPS2); +} + +static inline int adc_read (void) +{ + ADCSRA |= (1 << ADSC); + loop_until_bit_is_clear (ADCSRA, ADSC); + return ADC; +} + +static inline void adc_fin (void) +{ + ADCSRA = 0; + ADMUX = 0; +} + +static inline void adc_init (void) +{ + ADCSRC = 0; + ADCSRB = 0; + adc_fin (); +} + int readADC(uint8_t pin); long readVcc(); int readInternalTemp(void); +void analogReference(uint8_t mode); -#endif /* __ADC_ARCH_H__ */ \ No newline at end of file +#endif /* __ADC_ARCH_H__ */ diff --git a/platform/osd-merkur/dev/hw-arduino.h b/platform/osd-merkur/dev/hw-arduino.h index f59f8daf2..1894d23cc 100644 --- a/platform/osd-merkur/dev/hw-arduino.h +++ b/platform/osd-merkur/dev/hw-arduino.h @@ -71,32 +71,6 @@ extern "C"{ #define arduino_pwm_timer_init() \ (hwtimer_ini (3, HWT_WGM_PWM_PHASE_8_BIT, HWT_CLOCK_PRESCALER_64, 0)) -/* - * micros on arduino takes timer overflows into account. - * We put in the seconds counter. To get a consistent seconds / ticks - * value we have to disable interrupts. - */ -static inline uint32_t micros (void) -{ - uint32_t ticks; - uint8_t sreg = SREG; - cli (); - ticks = clock_seconds () * 1000000L - + clock_time () * 1000L / CLOCK_SECOND; - SREG = sreg; - return ticks; -} -/* - * millis counts only internal timer ticks since start, not trying to do - * something about overflows. Note that we don't try to emulate overflow - * behaviour of arduino implementation. - */ -#define millis() (((uint32_t)clock_time())*1000L/CLOCK_SECOND) -#define micros() (clock_seconds()*1000L+ -#define delay(ms) clock_delay_msec(ms) -#define delayMicroseconds(us) clock_delay_usec(us) - - /* * VI settings, see coding style * ex:ts=8:et:sw=2 diff --git a/platform/osd-merkur/dev/wiring_analog.c b/platform/osd-merkur/dev/wiring_analog.c deleted file mode 100644 index 630e95721..000000000 --- a/platform/osd-merkur/dev/wiring_analog.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - wiring_analog.c - analog input and output - Part of Arduino - http://www.arduino.cc/ - - Copyright (c) 2005-2006 David A. Mellis - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General - Public License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, - Boston, MA 02111-1307 USA - - Modified 28 September 2010 by Mark Sproul - - $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ -*/ - -#include "wiring_private.h" -#include "pins_arduino.h" -#include "adc.h" - -uint8_t analog_reference = DEFAULT; - -void analogReference(uint8_t mode) -{ - // can't actually set the register here because the default setting - // will connect AVCC and the AREF pin, which would cause a short if - // there's something connected to AREF. - analog_reference = mode; -} - -int analogRead(uint8_t pin) -{ - return readADC(pin); -} - -/* - * analogWrite is now implemented in dev/arduino/arduino-compat.h - */ diff --git a/platform/osd-merkur/dev/wiring_digital.c b/platform/osd-merkur/dev/wiring_digital.c index cac0a7b12..75b6745d6 100644 --- a/platform/osd-merkur/dev/wiring_digital.c +++ b/platform/osd-merkur/dev/wiring_digital.c @@ -60,83 +60,6 @@ void pinMode(uint8_t pin, uint8_t mode) } } -// Forcing this inline keeps the callers from having to push their own stuff -// on the stack. It is a good performance win and only takes 1 more byte per -// user than calling. (It will take more bytes on the 168.) -// -// But shouldn't this be moved into pinMode? Seems silly to check and do on -// each digitalread or write. -// -// Mark Sproul: -// - Removed inline. Save 170 bytes on atmega1280 -// - changed to a switch statment; added 32 bytes but much easier to read and maintain. -// - Added more #ifdefs, now compiles for atmega645 -// -//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); -//static inline void turnOffPWM(uint8_t timer) -static void turnOffPWM(uint8_t timer) -{ - switch (timer) - { - #if defined(TCCR1A) && defined(COM1A1) - case TIMER1A: cbi(TCCR1A, COM1A1); break; - #endif - #if defined(TCCR1A) && defined(COM1B1) - case TIMER1B: cbi(TCCR1A, COM1B1); break; - #endif - #if defined(TCCR1A) && defined(COM1B1) - case TIMER1C: cbi(TCCR1A, COM1C1); break; - #endif - - #if defined(TCCR2) && defined(COM21) - case TIMER2: cbi(TCCR2, COM21); break; - #endif - - #if defined(TCCR0A) && defined(COM0A1) - case TIMER0A: cbi(TCCR0A, COM0A1); break; - #endif - - #if defined(TIMER0B) && defined(COM0B1) - case TIMER0B: cbi(TCCR0A, COM0B1); break; - #endif - #if defined(TCCR2A) && defined(COM2A1) - case TIMER2A: cbi(TCCR2A, COM2A1); break; - #endif - #if defined(TCCR2A) && defined(COM2B1) - case TIMER2B: cbi(TCCR2A, COM2B1); break; - #endif - - #if defined(TCCR3A) && defined(COM3A1) - case TIMER3A: cbi(TCCR3A, COM3A1); break; - #endif - #if defined(TCCR3A) && defined(COM3B1) - case TIMER3B: cbi(TCCR3A, COM3B1); break; - #endif - #if defined(TCCR3A) && defined(COM3C1) - case TIMER3C: cbi(TCCR3A, COM3C1); break; - #endif - - #if defined(TCCR4A) && defined(COM4A1) - case TIMER4A: cbi(TCCR4A, COM4A1); break; - #endif - #if defined(TCCR4A) && defined(COM4B1) - case TIMER4B: cbi(TCCR4A, COM4B1); break; - #endif - #if defined(TCCR4A) && defined(COM4C1) - case TIMER4C: cbi(TCCR4A, COM4C1); break; - #endif - #if defined(TCCR4C) && defined(COM4D1) - case TIMER4D: cbi(TCCR4C, COM4D1); break; - #endif - - #if defined(TCCR5A) - case TIMER5A: cbi(TCCR5A, COM5A1); break; - case TIMER5B: cbi(TCCR5A, COM5B1); break; - case TIMER5C: cbi(TCCR5A, COM5C1); break; - #endif - } -} - void digitalWrite(uint8_t pin, uint8_t val) { uint8_t timer = digitalPinToTimer(pin); From d8bc9f761cbdf8732666f53cdfef13dda7af26c0 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Sun, 29 Jun 2014 17:32:00 +0200 Subject: [PATCH 165/345] Remove obsolet macro in example --- examples/osd/pwm-example/resource_led_pwm.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/examples/osd/pwm-example/resource_led_pwm.c b/examples/osd/pwm-example/resource_led_pwm.c index d10a730ec..deee9e3b4 100644 --- a/examples/osd/pwm-example/resource_led_pwm.c +++ b/examples/osd/pwm-example/resource_led_pwm.c @@ -17,14 +17,6 @@ #include "hw_timer.h" #include "generic_resource.h" -/* Error-handling macro */ -# define BYE(_exp, _tag) \ - do { \ - PRINTF("Expect "_exp": %d\n",_tag); \ - success=0; \ - goto bye; \ - } while(0) - #define DEBUG 1 #if DEBUG #define PRINTF(...) printf(__VA_ARGS__) From 60156d1c48b821a176c1b9a1936dfe4f2fb11346 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Sun, 29 Jun 2014 18:06:48 +0200 Subject: [PATCH 166/345] Fix off-by-one error in digitalPinToTimer --- examples/osd/arduino-sketch/sketch.pde | 2 +- platform/osd-merkur/dev/hw-arduino.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/osd/arduino-sketch/sketch.pde b/examples/osd/arduino-sketch/sketch.pde index 13da7e6bb..ef47d4271 100644 --- a/examples/osd/arduino-sketch/sketch.pde +++ b/examples/osd/arduino-sketch/sketch.pde @@ -13,7 +13,7 @@ extern "C" { #include #include "led_pwm.h" -#define LED_PIN 5 +#define LED_PIN 4 uint8_t pwm = 128; uint8_t period_100ms = 10; /* one second */ diff --git a/platform/osd-merkur/dev/hw-arduino.h b/platform/osd-merkur/dev/hw-arduino.h index 1894d23cc..bcd626ec6 100644 --- a/platform/osd-merkur/dev/hw-arduino.h +++ b/platform/osd-merkur/dev/hw-arduino.h @@ -59,11 +59,11 @@ extern "C"{ * contiki for sleep/wakeup timing and is not usable for PWM. */ #define digitalPinToTimer(pin) \ - ( (pin) == 3 \ + ( (pin) == 2 \ ? TIMER3A \ - : ( (pin) == 4 \ + : ( (pin) == 3 \ ? TIMER3B \ - : ((pin == 5) ? TIMER3C : NOT_ON_TIMER) \ + : ((pin == 4) ? TIMER3C : NOT_ON_TIMER) \ ) \ ) From 4b984153ab976f9ae09fff8670d983737f0fb791 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Mon, 30 Jun 2014 10:24:49 +0200 Subject: [PATCH 167/345] Fix A0-A5 ADC constants, use in example sketch --- examples/osd/arduino-sketch/led_pwm.h | 4 ++-- examples/osd/arduino-sketch/resource_led_pwm.c | 12 ++++++------ examples/osd/arduino-sketch/sketch.pde | 10 +++++----- platform/osd-merkur/dev/pins_arduino.h | 14 ++++++-------- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/examples/osd/arduino-sketch/led_pwm.h b/examples/osd/arduino-sketch/led_pwm.h index 31356fd78..5931bdc50 100644 --- a/examples/osd/arduino-sketch/led_pwm.h +++ b/examples/osd/arduino-sketch/led_pwm.h @@ -23,12 +23,12 @@ extern uint8_t pwm; extern uint8_t period_100ms; -extern uint16_t analog1_voltage; +extern uint16_t analog2_voltage; extern uint16_t analog5_voltage; extern resource_t resource_led_pwm; extern resource_t resource_led_period; -extern resource_t resource_analog1_voltage; +extern resource_t resource_analog2_voltage; extern resource_t resource_analog5_voltage; #endif // led_pwm_h diff --git a/examples/osd/arduino-sketch/resource_led_pwm.c b/examples/osd/arduino-sketch/resource_led_pwm.c index 2ed1cdd78..a7c1e1182 100644 --- a/examples/osd/arduino-sketch/resource_led_pwm.c +++ b/examples/osd/arduino-sketch/resource_led_pwm.c @@ -70,19 +70,19 @@ GENERIC_RESOURCE \ ); size_t -analog1_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) +analog2_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) { return snprintf - (buf, bufsize, "%d.%03d", analog1_voltage / 1000, analog1_voltage % 1000); + (buf, bufsize, "%d.%03d", analog2_voltage / 1000, analog2_voltage % 1000); } GENERIC_RESOURCE \ - ( analog1_voltage, METHOD_GET - , "analog/1" - , Analog 1 voltage + ( analog2_voltage, METHOD_GET + , "analog/2" + , Analog 2 voltage , V , NULL - , analog1_v + , analog2_v ); size_t diff --git a/examples/osd/arduino-sketch/sketch.pde b/examples/osd/arduino-sketch/sketch.pde index ef47d4271..8874c056a 100644 --- a/examples/osd/arduino-sketch/sketch.pde +++ b/examples/osd/arduino-sketch/sketch.pde @@ -16,8 +16,8 @@ extern "C" { #define LED_PIN 4 uint8_t pwm = 128; -uint8_t period_100ms = 10; /* one second */ -uint16_t analog1_voltage = 0; +uint8_t period_100ms = 1; /* 1/10 second (period_100ms * 100ms) */ +uint16_t analog2_voltage = 0; uint16_t analog5_voltage = 0; } @@ -26,7 +26,7 @@ void setup (void) rest_init_engine (); rest_activate_resource (&resource_led_pwm); rest_activate_resource (&resource_led_period); - rest_activate_resource (&resource_analog1_voltage); + rest_activate_resource (&resource_analog2_voltage); rest_activate_resource (&resource_analog5_voltage); } @@ -34,8 +34,8 @@ void loop (void) { /* Use 255 - pwm, LED on merkur-board is wired to +3.3V */ analogWrite (LED_PIN, 255 - pwm); - analog1_voltage = analogRead (1) * 1600L / 1023L; - analog5_voltage = analogRead (5) * 1600L / 1023L; + analog2_voltage = analogRead (A2) * 1600L / 1023L; + analog5_voltage = analogRead (A5) * 1600L / 1023L; printf ("clock : %u\nmillis: %lu\n", clock_time (), millis ()); delay (period_100ms * 100); analogWrite (LED_PIN, 255); /* OFF: LED on merkur-board is wired to +3.3V */ diff --git a/platform/osd-merkur/dev/pins_arduino.h b/platform/osd-merkur/dev/pins_arduino.h index 1441439aa..738444bd1 100644 --- a/platform/osd-merkur/dev/pins_arduino.h +++ b/platform/osd-merkur/dev/pins_arduino.h @@ -57,14 +57,12 @@ const static uint8_t LED = 4; const static uint8_t LED1 = 4; const static uint8_t LED2 = 5; -const static uint8_t A0 = 15; -const static uint8_t A1 = 16; -const static uint8_t A2 = 17; -const static uint8_t A3 = 18; -const static uint8_t A4 = 19; -const static uint8_t A5 = 20; -//const static uint8_t A6 = 21; -//const static uint8_t A7 = 22; +const static uint8_t A0 = 7; +const static uint8_t A1 = 6; +const static uint8_t A2 = 5; +const static uint8_t A3 = 4; +const static uint8_t A4 = 0; +const static uint8_t A5 = 1; // A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) // Only pins available for RECEIVE (TRANSMIT can be on any pin): From f61d0b2e1ee658b68b76c32e7c9aac605b1f5e14 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Mon, 30 Jun 2014 10:25:47 +0200 Subject: [PATCH 168/345] Use PROCESS_PAUSE macro --- apps/arduino/arduino-process.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/arduino/arduino-process.c b/apps/arduino/arduino-process.c index f6945a9bc..d5d83482a 100644 --- a/apps/arduino/arduino-process.c +++ b/apps/arduino/arduino-process.c @@ -66,8 +66,7 @@ PROCESS_THREAD(arduino_sketch, ev, data) while (1) { loop (); /* Give other processes a chance to run */ - process_post (&arduino_sketch, PROCESS_EVENT_CONTINUE, NULL); - PROCESS_WAIT_EVENT(); + PROCESS_PAUSE(); } PROCESS_END(); } From 1aa694bba2833db6f1c5b05b7bcd29f8d57736f3 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Mon, 30 Jun 2014 14:25:33 +0200 Subject: [PATCH 169/345] Turn off JTAG in adc_init --- platform/osd-merkur/dev/adc.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/platform/osd-merkur/dev/adc.h b/platform/osd-merkur/dev/adc.h index 6ea4cf0ab..e3ff516b1 100644 --- a/platform/osd-merkur/dev/adc.h +++ b/platform/osd-merkur/dev/adc.h @@ -39,9 +39,22 @@ static inline void adc_fin (void) static inline void adc_init (void) { + uint8_t temp; ADCSRC = 0; ADCSRB = 0; adc_fin (); + /* + * Disable JTAG interface + * Hardware manual about JTD bit: + * "In order to avoid unintentional disabling or enabling of the + * JTAG interface, a timed sequence must be followed when changing + * this bit: The application software must write this bit to the + * desired value twice within four cycles to change its value." + * 15.4.1 "MCUCR - MCU Control Register", p. 219 + */ + temp = MCUCR | (1 << JTD); + MCUCR = temp; + MCUCR = temp; } int readADC(uint8_t pin); From ff8b6d933be7a228e5cd8ef7cdb948a09d892088 Mon Sep 17 00:00:00 2001 From: harald Date: Fri, 11 Jul 2014 11:25:22 +0200 Subject: [PATCH 170/345] change port manipulation to ardino commands and lets change the pin at runtime possible --- platform/osd-merkur/dev/relay-sensor.c | 63 ++++++----------- platform/osd-merkur/dev/relay-sensor.h | 14 ++++ platform/osd-merkur/dev/relay.c | 94 +++++--------------------- platform/osd-merkur/dev/relay.h | 12 ++-- 4 files changed, 54 insertions(+), 129 deletions(-) diff --git a/platform/osd-merkur/dev/relay-sensor.c b/platform/osd-merkur/dev/relay-sensor.c index 712e524ce..6415926c9 100644 --- a/platform/osd-merkur/dev/relay-sensor.c +++ b/platform/osd-merkur/dev/relay-sensor.c @@ -45,26 +45,13 @@ const struct sensors_sensor relay_sensor; static int status(int type); static int enabled = 0; -static int relay1=0; -static int relay2=0; -static int relay3=0; -static int relay4=0; - +static int relay[8]={0,0,0,0,0,0,0,0}; +static int relaypin[8]={RELAY_PIN_1,RELAY_PIN_2,RELAY_PIN_3,RELAY_PIN_4,RELAY_PIN_5,RELAY_PIN_6,RELAY_PIN_7,RELAY_PIN_8}; /*---------------------------------------------------------------------------*/ static int value(int type) { - switch(type) { - case RELAY_SENSOR_1: - return relay1; - case RELAY_SENSOR_2: - return relay2; - case RELAY_SENSOR_3: - return relay2; - case RELAY_SENSOR_4: - return relay2; - } - return 0; + return relay[type]; } /*---------------------------------------------------------------------------*/ static int @@ -74,6 +61,14 @@ configure(int type, int c) case SENSORS_ACTIVE: if(c) { if(!status(SENSORS_ACTIVE)) { + relay_init(relaypin[RELAY_SENSOR_1]); + relay_init(relaypin[RELAY_SENSOR_2]); + relay_init(relaypin[RELAY_SENSOR_3]); + relay_init(relaypin[RELAY_SENSOR_4]); + relay_init(relaypin[RELAY_SENSOR_5]); + relay_init(relaypin[RELAY_SENSOR_6]); + relay_init(relaypin[RELAY_SENSOR_7]); + relay_init(relaypin[RELAY_SENSOR_8]); enabled = 1; } } else { @@ -81,39 +76,19 @@ configure(int type, int c) } break; case RELAY_SENSOR_1: - if(c==0){ - relay1_off(); - relay1=0; - }else{ - relay1_on(); - relay1=1; - }; - break; case RELAY_SENSOR_2: - if(c==0){ - relay2_off(); - relay2=0; - }else{ - relay2_on(); - relay2=1; - }; - break; case RELAY_SENSOR_3: - if(c==0){ - relay3_off(); - relay3=0; - }else{ - relay3_on(); - relay3=1; - }; - break; case RELAY_SENSOR_4: + case RELAY_SENSOR_5: + case RELAY_SENSOR_6: + case RELAY_SENSOR_7: + case RELAY_SENSOR_8: if(c==0){ - relay4_off(); - relay4=0; + relay_off(relaypin[type]); + relay[type]=0; }else{ - relay4_on(); - relay4=1; + relay_on(relaypin[type]); + relay[type]=1; }; break; } diff --git a/platform/osd-merkur/dev/relay-sensor.h b/platform/osd-merkur/dev/relay-sensor.h index 89b46a8f2..88b9dd0f5 100644 --- a/platform/osd-merkur/dev/relay-sensor.h +++ b/platform/osd-merkur/dev/relay-sensor.h @@ -48,5 +48,19 @@ extern const struct sensors_sensor relay_sensor; #define RELAY_SENSOR_2 1 #define RELAY_SENSOR_3 2 #define RELAY_SENSOR_4 3 +#define RELAY_SENSOR_5 4 +#define RELAY_SENSOR_6 5 +#define RELAY_SENSOR_7 6 +#define RELAY_SENSOR_8 7 + +/* default pins Arduino-Merkurboard */ +#define RELAY_PIN_1 10 +#define RELAY_PIN_2 11 +#define RELAY_PIN_3 12 +#define RELAY_PIN_4 13 +#define RELAY_PIN_5 15 +#define RELAY_PIN_6 16 +#define RELAY_PIN_7 17 +#define RELAY_PIN_8 18 #endif /* __RELAY_SENSOR_H__ */ diff --git a/platform/osd-merkur/dev/relay.c b/platform/osd-merkur/dev/relay.c index 60490a68f..67d9c7f5b 100644 --- a/platform/osd-merkur/dev/relay.c +++ b/platform/osd-merkur/dev/relay.c @@ -37,7 +37,7 @@ * Harald Pichler harald@the-develop.net * */ - +#include "Arduino.h" #include "relay.h" /** @@ -45,92 +45,32 @@ * \{ */ /*---------------------------------------------------------------------------*/ - /** - * \brief Turns the RELAY1 on. + * \brief init RELAY PINS. */ void -relay1_off(void) +relay_init(uint8_t pin) { - PORTB &= ~(1< Date: Mon, 14 Jul 2014 20:31:04 +0200 Subject: [PATCH 171/345] optriac sensors use Arduino API --- platform/osd-merkur/Makefile.osd-merkur | 2 +- platform/osd-merkur/dev/optriac-sensor.c | 44 +++++------ platform/osd-merkur/dev/optriac-sensor.h | 8 +- platform/osd-merkur/dev/optriac.c | 95 ------------------------ platform/osd-merkur/dev/optriac.h | 54 -------------- 5 files changed, 24 insertions(+), 179 deletions(-) delete mode 100644 platform/osd-merkur/dev/optriac.c delete mode 100644 platform/osd-merkur/dev/optriac.h diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 3fb160bdd..a083ba965 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -18,7 +18,7 @@ CONTIKI_TARGET_SOURCEFILES += battery-sensor.c batmon.c #Needed for PIR CONTIKI_TARGET_SOURCEFILES += pir-sensor.c #Needed for OPTRIAC -CONTIKI_TARGET_SOURCEFILES += optriac.c optriac-sensor.c +CONTIKI_TARGET_SOURCEFILES += optriac-sensor.c CONTIKIAVR=$(CONTIKI)/cpu/avr #Needed for SERVO CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c diff --git a/platform/osd-merkur/dev/optriac-sensor.c b/platform/osd-merkur/dev/optriac-sensor.c index 5045c8944..2f0566bc4 100644 --- a/platform/osd-merkur/dev/optriac-sensor.c +++ b/platform/osd-merkur/dev/optriac-sensor.c @@ -37,7 +37,7 @@ */ #include "contiki.h" -#include "dev/optriac.h" +#include "Arduino.h" #include "dev/optriac-sensor.h" #define PRINTF(...) printf(__VA_ARGS__) @@ -45,22 +45,14 @@ const struct sensors_sensor optriac_sensor; static int status(int type); static int enabled = 0; -static int optriac1=0; -static int optriac2=0; +static int optriac[2]={0,0}; +static int optriacpin[8]={OPTRIAC_PIN_1,OPTRIAC_PIN_2}; /*---------------------------------------------------------------------------*/ static int value(int type) { - switch(type) { - case OPTRIAC_SENSOR_A: - return optriac1; - - /* Total Solar Radiation. */ - case OPTRIAC_SENSOR_B: - return optriac2; - } - return 0; + return optriac[type]; } /*---------------------------------------------------------------------------*/ static int @@ -70,32 +62,30 @@ configure(int type, int c) case SENSORS_ACTIVE: if(c) { if(!status(SENSORS_ACTIVE)) { + pinMode(optriacpin[OPTRIAC_SENSOR_1], OUTPUT); + digitalWrite(optriacpin[OPTRIAC_SENSOR_1], LOW); + pinMode(optriacpin[OPTRIAC_SENSOR_2], OUTPUT); + digitalWrite(optriacpin[OPTRIAC_SENSOR_2], LOW); + enabled = 1; } } else { enabled = 1; } break; - case OPTRIAC_SENSOR_A: + case OPTRIAC_SENSOR_1: + case OPTRIAC_SENSOR_2: + if(c==0){ - optriac1_off(); - optriac1=0; + digitalWrite(optriacpin[type], LOW); + optriac[type]=0; }else{ - optriac1_on(); - optriac1=1; - }; - break; - case OPTRIAC_SENSOR_B: - if(c==0){ - optriac2_off(); - optriac2=0; - }else{ - optriac2_on(); - optriac2=1; + digitalWrite(optriacpin[type], HIGH); + optriac[type]=1; }; break; } - return 0; + return 0; } /*---------------------------------------------------------------------------*/ static int diff --git a/platform/osd-merkur/dev/optriac-sensor.h b/platform/osd-merkur/dev/optriac-sensor.h index 3c411253c..8cec46c14 100644 --- a/platform/osd-merkur/dev/optriac-sensor.h +++ b/platform/osd-merkur/dev/optriac-sensor.h @@ -44,7 +44,11 @@ extern const struct sensors_sensor optriac_sensor; #define OPTRIAC_SENSOR "TRIAC" -#define OPTRIAC_SENSOR_A 0 -#define OPTRIAC_SENSOR_B 1 +#define OPTRIAC_SENSOR_1 0 +#define OPTRIAC_SENSOR_2 1 + +/* default pins Arduino-Merkurboard */ +#define OPTRIAC_PIN_1 2 +#define OPTRIAC_PIN_2 3 #endif /* __OPTRIAC_SENSOR_H__ */ diff --git a/platform/osd-merkur/dev/optriac.c b/platform/osd-merkur/dev/optriac.c deleted file mode 100644 index 7bb1dfb0b..000000000 --- a/platform/osd-merkur/dev/optriac.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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 "optriac.h" - -/** - * \addtogroup relay - * \{ -*/ -/*---------------------------------------------------------------------------*/ - -/** - * \brief Turns the TRIAC 1 off. - * old D6 D7 - * new E3 E4 -*/ -void -optriac1_off(void) -{ - DDRE |= (1< - -/** @name TRIAC Functions */ -/** @{ */ -void optriac1_on(void); -void optriac1_off(void); -void optriac2_on(void); -void optriac2_off(void); -/** @} */ - -#endif /* __TRIAC_H__ */ From ccaae9cd5c3fc646162ac8cd60e151fa69e7452d Mon Sep 17 00:00:00 2001 From: harald Date: Tue, 15 Jul 2014 08:20:46 +0200 Subject: [PATCH 172/345] set all colors to the same pin PE5 --- platform/osd-merkur/dev/leds-arch.c | 4 ++-- platform/osd-merkur/dev/leds-arch.h | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/platform/osd-merkur/dev/leds-arch.c b/platform/osd-merkur/dev/leds-arch.c index 3db79ec17..c53dd2d47 100644 --- a/platform/osd-merkur/dev/leds-arch.c +++ b/platform/osd-merkur/dev/leds-arch.c @@ -50,7 +50,7 @@ void leds_arch_init(void) { -DDRE|=(1< Date: Tue, 15 Jul 2014 08:23:33 +0200 Subject: [PATCH 173/345] simplify code, bugfixes PE3 --- .../light-shutter-control/er-example-server.c | 268 +++--------------- examples/osd/light-shutter-control/pcintkey.c | 13 +- 2 files changed, 41 insertions(+), 240 deletions(-) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index 298954ecc..b58c1676b 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -92,7 +92,6 @@ #include "dev/battery-sensor.h" #endif -#include "dev/optriac.h" /* For CoAP-specific example: not required for normal RESTful Web service. */ #if WITH_COAP == 3 @@ -546,80 +545,7 @@ led2_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ #endif /******************************************************************************/ -#if (defined (PLATFORM_HAS_OPTRIAC) && defined (OSDPLUG)) -/******************************************************************************/ -#if REST_RES_OPTRIAC -/*A simple actuator example*/ -RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "a/optriac", "title=\"TRIAC, POST/PUT mode=on|off\";rt=\"Control\""); - -void -optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - const char *mode = NULL; - static char namea[17]="Triac-a"; - static char nameb[17]="Triac-b"; - - char temp[100]; - int index = 0; - size_t len = 0; - int success = 1; - - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"%s\" : ",namea); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0) - index += sprintf(temp + index,"\"off\",\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1) - index += sprintf(temp + index,"\"on\",\n"); - index += sprintf(temp + index," \"%s\" : ",nameb); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0) - index += sprintf(temp + index,"\"off\"\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1) - index += sprintf(temp + index,"\"on\"\n"); - index += sprintf(temp + index,"}\n"); - - len = strlen(temp); - memcpy(buffer, temp,len ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, len); - break; - - case METHOD_PUT: - success = 0; - break; - case METHOD_POST: - if (success && (len=REST.get_post_variable(request, "mode", &mode))) { - PRINTF("mode %s\n", mode); - if (strncmp(mode, "on", len)==0) { - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); - optriac_sensor.configure(OPTRIAC_SENSOR_B,1); - statusled_on(); - } else if (strncmp(mode, "off", len)==0) { - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); - statusled_off(); - } else { - success = 0; - } - } else { - success = 0; - } - break; - default: - success = 0; - } - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} -#endif -/******************************************************************************/ -#endif /* PLATFORM_HAS_OPTRIAC */ - -/******************************************************************************/ -#if (defined (PLATFORM_HAS_OPTRIAC) && defined (OSDLIGHT)) +#if (defined PLATFORM_HAS_OPTRIAC) /******************************************************************************/ #if REST_RES_OPTRIAC /*A simple actuator example*/ @@ -643,14 +569,14 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr case METHOD_GET: // jSON Format index += sprintf(temp + index,"{\n \"%s\" : ",namea); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0) + if(optriac_sensor.value(OPTRIAC_SENSOR_1) == 0) index += sprintf(temp + index,"\"off\",\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1) + if(optriac_sensor.value(OPTRIAC_SENSOR_1) == 1) index += sprintf(temp + index,"\"on\",\n"); index += sprintf(temp + index," \"%s\" : ",nameb); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0) + if(optriac_sensor.value(OPTRIAC_SENSOR_2) == 0) index += sprintf(temp + index,"\"off\"\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1) + if(optriac_sensor.value(OPTRIAC_SENSOR_2) == 1) index += sprintf(temp + index,"\"on\"\n"); index += sprintf(temp + index,"}\n"); @@ -669,11 +595,11 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr PRINTF("type %.*s\n", len, type); if (strncmp(type, "a", len)==0) { - triac = OPTRIAC_SENSOR_A; + triac = OPTRIAC_SENSOR_1; } else if(strncmp(type,"b", len)==0) { - triac = OPTRIAC_SENSOR_B; + triac = OPTRIAC_SENSOR_2; } else { - triac = OPTRIAC_SENSOR_A; + triac = OPTRIAC_SENSOR_1; } } else { success = 0; @@ -683,108 +609,18 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr PRINTF("mode %s\n", mode); if (strncmp(mode, "on", len)==0) { - optriac_sensor.configure(triac,1); - } else if (strncmp(mode, "off", len)==0) { - optriac_sensor.configure(triac,0); - } else { - success = 0; - } - } else { - success = 0; - } - break; - default: - success = 0; - } - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} -#endif -/******************************************************************************/ -#endif /* PLATFORM_HAS_OPTRIAC */ - - -/******************************************************************************/ -#if (defined (PLATFORM_HAS_OPTRIAC) && defined (OSDSHUTTER)) -/******************************************************************************/ -#if REST_RES_OPTRIAC -/*A simple actuator example*/ -RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "a/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\""); - -void -optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - const char *type = NULL; - const char *mode = NULL; - static char namea[17]="Triac-a"; - static char nameb[17]="Triac-b"; - - char temp[100]; - int index = 0; - size_t len = 0; - - uint8_t triac = 0; - int success = 1; - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"%s\" : ",namea); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0) - index += sprintf(temp + index,"\"off\",\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1) - index += sprintf(temp + index,"\"on\",\n"); - index += sprintf(temp + index," \"%s\" : ",nameb); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0) - index += sprintf(temp + index,"\"off\"\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1) - index += sprintf(temp + index,"\"on\"\n"); - index += sprintf(temp + index,"}\n"); - - len = strlen(temp); - memcpy(buffer, temp,len ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, len); - break; - - case METHOD_PUT: - success = 0; - break; - case METHOD_POST: - if ((len=REST.get_query_variable(request, "type", &type))) { - PRINTF("type %.*s\n", len, type); - - if (strncmp(type, "a", len)==0) { - triac = OPTRIAC_SENSOR_A; - } else if(strncmp(type,"b", len)==0) { - triac = OPTRIAC_SENSOR_B; - } else { - triac = OPTRIAC_SENSOR_A; - } - } else { - success = 0; - } - - if (success && (len=REST.get_post_variable(request, "mode", &mode))) { - PRINTF("mode %s\n", mode); - - if (strncmp(mode, "on", len)==0) { - if (triac == OPTRIAC_SENSOR_A){ -// statusled_off(); -// optriac_sensor.configure(OPTRIAC_SENSOR_B,0); -// leds_on(LEDS_RED); -// optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + if (triac == OPTRIAC_SENSOR_1){ g_triac_a = 1; } else { -// leds_off(LEDS_RED); -// optriac_sensor.configure(OPTRIAC_SENSOR_A,0); -// statusled_on(); -// optriac_sensor.configure(OPTRIAC_SENSOR_B,1); g_triac_b = 1; } } else if (strncmp(mode, "off", len)==0) { - optriac_sensor.configure(triac,0); + if (triac == OPTRIAC_SENSOR_1){ + g_triac_a = 0; + } else { + // Triac B off + g_triac_b = 0; + } } else { success = 0; } @@ -954,11 +790,7 @@ PROCESS_THREAD(rest_server_example, ev, data) SENSORS_ACTIVATE(optriac_sensor); rest_activate_resource(&resource_optriac); #endif -#if defined (PLATFORM_HAS_PIR) && (REST_RES_EVENT) - SENSORS_ACTIVATE(pir_sensor); - rest_activate_event_resource(&resource_pir); - PRINTF("ACTIVATE PIR\n"); -#endif + #if defined (PLATFORM_HAS_LED) #if REST_RES_LED rest_activate_resource(&resource_led1); @@ -976,59 +808,25 @@ PROCESS_THREAD(rest_server_example, ev, data) etimer_set(&ds_periodic_timer, MESURE_INTERVAL); /* Define application-specific events here. */ + while(1) { PROCESS_WAIT_EVENT(); -#if defined (REST_RES_EVENT) - if (ev == sensors_event ) { - PRINTF("EVENT\n"); -#if (REST_RES_EVENT && defined (PLATFORM_HAS_PIR)) - if (data == &pir_sensor) { - PRINTF("PIR EVENT\n"); - /* Call the event_handler for this application-specific event. */ - pir_event_handler(&resource_pir); - PRINTF("CALL EVENT HANDLER\n"); - } -#endif /* PLATFORM_HAS_PIR */ - } -#endif /* REST_RES_EVENT */ - /* Button Tric Logic */ + if(etimer_expired(&ds_periodic_timer)) { - PRINTF("Periodic %d %d\n",ext5,ext6); -#if (defined (OSDLIGHT)) - if(ext5 != is_button_ext5()) { - ext5 = is_button_ext5(); - PRINTF("Toggle Triac A\n"); - // Toggle Triac A - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0){ - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); - leds_on(LEDS_RED); - }else{ - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); - leds_off(LEDS_RED); - } - } - if(ext6 != is_button_ext6()) { - ext6 = is_button_ext6(); - PRINTF("Toggle Triac B\n"); - // Toggle Triac B - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0){ - optriac_sensor.configure(OPTRIAC_SENSOR_B,1); - statusled_on(); - }else{ - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); - statusled_off(); - } - } -#endif -#if (defined (OSDSHUTTER)) + PRINTF("Periodic \n"); + PRINTF("extb %d %d\n",ext5,ext6); + PRINTF("g_triac %d %d\n",g_triac_a,g_triac_b); + if( is_button_ext5()) { g_triac_a = 1; } if( is_button_ext6()) { g_triac_b = 1; } - + + +#if (defined (OSDSHUTTER)) PRINTF("State: %d\n",state); switch(state) { @@ -1037,7 +835,7 @@ PROCESS_THREAD(rest_server_example, ev, data) PRINTF("Triac A\n"); g_triac_a = 0; // Triac B off - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + optriac_sensor.configure(OPTRIAC_SENSOR_2,0); statusled_off(); state = 1; } @@ -1045,26 +843,26 @@ PROCESS_THREAD(rest_server_example, ev, data) PRINTF("Triac B\n"); g_triac_b = 0; // Triac A off - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + optriac_sensor.configure(OPTRIAC_SENSOR_1,0); leds_off(LEDS_RED); state = 2; } break; case 1: // Triac A on - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + optriac_sensor.configure(OPTRIAC_SENSOR_1,1); leds_on(LEDS_RED); etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); state=0; break; case 2: // Triac B on - optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + optriac_sensor.configure(OPTRIAC_SENSOR_2,1); statusled_on(); etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); state=0; break; - default : state = 0; + default: state = 0; } // switch #endif etimer_reset(&ds_periodic_timer); @@ -1073,11 +871,13 @@ PROCESS_THREAD(rest_server_example, ev, data) if(etimer_expired(&triac_off_timer)) { PRINTF("Triac off timer\n"); // Triac A off - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + optriac_sensor.configure(OPTRIAC_SENSOR_1,0); leds_off(LEDS_RED); + g_triac_a = 0; // Triac B off - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + optriac_sensor.configure(OPTRIAC_SENSOR_2,0); statusled_off(); + g_triac_b = 0; } } /* while (1) */ diff --git a/examples/osd/light-shutter-control/pcintkey.c b/examples/osd/light-shutter-control/pcintkey.c index 5fc065e24..a6e90afa5 100644 --- a/examples/osd/light-shutter-control/pcintkey.c +++ b/examples/osd/light-shutter-control/pcintkey.c @@ -87,12 +87,13 @@ uint8_t is_button_ext4(void) { /* Return true if button has been pressed. */ - if ( PINE & (1< Date: Tue, 15 Jul 2014 13:35:31 +0200 Subject: [PATCH 174/345] use Arduino like optotriac driver --- examples/osd/pingtheplug/er-example-server.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/examples/osd/pingtheplug/er-example-server.c b/examples/osd/pingtheplug/er-example-server.c index 451b102ce..72b75e859 100644 --- a/examples/osd/pingtheplug/er-example-server.c +++ b/examples/osd/pingtheplug/er-example-server.c @@ -83,7 +83,6 @@ #include "dev/battery-sensor.h" #endif -#include "dev/optriac.h" /* For CoAP-specific example: not required for normal RESTful Web service. */ #if WITH_COAP == 3 @@ -548,14 +547,14 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr case METHOD_GET: // jSON Format index += sprintf(temp + index,"{\n \"%s\" : ",namea); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0) + if(optriac_sensor.value(OPTRIAC_SENSOR_1) == 0) index += sprintf(temp + index,"\"off\",\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1) + if(optriac_sensor.value(OPTRIAC_SENSOR_1) == 1) index += sprintf(temp + index,"\"on\",\n"); index += sprintf(temp + index," \"%s\" : ",nameb); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0) + if(optriac_sensor.value(OPTRIAC_SENSOR_2) == 0) index += sprintf(temp + index,"\"off\"\n"); - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1) + if(optriac_sensor.value(OPTRIAC_SENSOR_2) == 1) index += sprintf(temp + index,"\"on\"\n"); index += sprintf(temp + index,"}\n"); @@ -573,12 +572,12 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if (success && (len=REST.get_post_variable(request, "mode", &mode))) { PRINTF("mode %s\n", mode); if (strncmp(mode, "on", len)==0) { - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); - optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + optriac_sensor.configure(OPTRIAC_SENSOR_1,1); + optriac_sensor.configure(OPTRIAC_SENSOR_2,1); statusled_on(); } else if (strncmp(mode, "off", len)==0) { - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + optriac_sensor.configure(OPTRIAC_SENSOR_1,0); + optriac_sensor.configure(OPTRIAC_SENSOR_2,0); statusled_off(); } else { success = 0; @@ -687,7 +686,6 @@ AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); PROCESS_THREAD(rest_server_example, ev, data) { static struct etimer ds_periodic_timer; - static uint8_t state=0; static int ext4=0; static int ext5=0; static int ext6=0; From e09abcaa9698763c1323c490b9dcecbc4202484a Mon Sep 17 00:00:00 2001 From: Jim Paris Date: Fri, 27 Jun 2014 19:48:41 -0400 Subject: [PATCH 175/345] Increase fixed filename sizes in SLIP tunnels Long serial port names like /dev/serial/by-id/usb-FTDI_FT230X_Basic_UART_DN0038W8-if00-port0 cause crashes. This is the simplest fix to avoid the problem. --- tools/tapslip6.c | 4 ++-- tools/tunslip.c | 4 ++-- tools/tunslip6.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/tapslip6.c b/tools/tapslip6.c index baf0b3e63..86fa37dae 100644 --- a/tools/tapslip6.c +++ b/tools/tapslip6.c @@ -65,7 +65,7 @@ void write_to_serial(int outfd, void *inbuf, int len); #define USAGE_STRING "usage: tapslip6 [-B baudrate] [-s siodev] [-t tundev] ipaddress netmask" -char tundev[32] = { "tap0" }; +char tundev[1024] = { "tap0" }; int ssystem(const char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2))); @@ -360,7 +360,7 @@ stty_telos(int fd) int devopen(const char *dev, int flags) { - char t[32]; + char t[1024]; strcpy(t, "/dev/"); strcat(t, dev); return open(t, flags); diff --git a/tools/tunslip.c b/tools/tunslip.c index f08cc45fe..371418f53 100644 --- a/tools/tunslip.c +++ b/tools/tunslip.c @@ -152,7 +152,7 @@ in_addr_t giaddr; in_addr_t netaddr; in_addr_t circuit_addr; -char tundev[32] = { "tun0" }; +char tundev[1024] = { "tun0" }; struct sockaddr_in dhaddr; int dhsock = -1; @@ -747,7 +747,7 @@ stty_telos(int fd) int devopen(const char *dev, int flags) { - char t[32]; + char t[1024]; strcpy(t, "/dev/"); strcat(t, dev); return open(t, flags); diff --git a/tools/tunslip6.c b/tools/tunslip6.c index 0a5337ffc..65e440800 100644 --- a/tools/tunslip6.c +++ b/tools/tunslip6.c @@ -74,7 +74,7 @@ void slip_send_char(int fd, unsigned char c); //#define PROGRESS(s) fprintf(stderr, s) #define PROGRESS(s) do { } while (0) -char tundev[32] = { "" }; +char tundev[1024] = { "" }; int ssystem(const char *fmt, ...) __attribute__((__format__ (__printf__, 1, 2))); @@ -497,7 +497,7 @@ stty_telos(int fd) int devopen(const char *dev, int flags) { - char t[32]; + char t[1024]; strcpy(t, "/dev/"); strncat(t, dev, sizeof(t) - 5); return open(t, flags); From d7a6d8560a7b3dbc54f149c9270a1f3ff9f019d9 Mon Sep 17 00:00:00 2001 From: powermik Date: Mon, 4 Aug 2014 20:14:40 +0200 Subject: [PATCH 176/345] UNSUPPORTED_MADIA_TYPE is a typo --- examples/osd/6lowpan-tk/er-example-server.c | 4 ++-- examples/osd/pir-sensor/er-example-server.c | 4 ++-- examples/osd/servo-sensor/er-example-server.c | 2 +- examples/osd/wirelessplug/er-example-server.c | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/osd/6lowpan-tk/er-example-server.c b/examples/osd/6lowpan-tk/er-example-server.c index 26dd0e096..f850940b1 100644 --- a/examples/osd/6lowpan-tk/er-example-server.c +++ b/examples/osd/6lowpan-tk/er-example-server.c @@ -329,7 +329,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -364,7 +364,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } diff --git a/examples/osd/pir-sensor/er-example-server.c b/examples/osd/pir-sensor/er-example-server.c index eff92b12a..88f3b31c5 100644 --- a/examples/osd/pir-sensor/er-example-server.c +++ b/examples/osd/pir-sensor/er-example-server.c @@ -337,7 +337,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -372,7 +372,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } diff --git a/examples/osd/servo-sensor/er-example-server.c b/examples/osd/servo-sensor/er-example-server.c index 8490cbb45..8522e256d 100644 --- a/examples/osd/servo-sensor/er-example-server.c +++ b/examples/osd/servo-sensor/er-example-server.c @@ -362,7 +362,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } diff --git a/examples/osd/wirelessplug/er-example-server.c b/examples/osd/wirelessplug/er-example-server.c index 987c341f0..0e2466255 100644 --- a/examples/osd/wirelessplug/er-example-server.c +++ b/examples/osd/wirelessplug/er-example-server.c @@ -276,7 +276,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); } } @@ -838,7 +838,7 @@ light_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -873,7 +873,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } @@ -931,7 +931,7 @@ radio_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred } else { - REST.set_response_status(response, REST.status.UNSUPPORTED_MADIA_TYPE); + REST.set_response_status(response, REST.status.UNSUPPORTED_MEDIA_TYPE); const char *msg = "Supporting content-types text/plain and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } From 9f4f828976ae1cbb8e82642f46d96a54ff11db52 Mon Sep 17 00:00:00 2001 From: Billy Everyteen Date: Thu, 18 Sep 2014 15:08:55 +0200 Subject: [PATCH 177/345] initial upload --- examples/osd/arduino-plantobserving/Makefile | 102 ++++++++++++++++++ examples/osd/arduino-plantobserving/README.md | 11 ++ .../arduino-plantobserving/arduino-example.c | 2 + examples/osd/arduino-plantobserving/flash.sh | 2 + .../osd/arduino-plantobserving/moisture.h | 30 ++++++ .../osd/arduino-plantobserving/project-conf.h | 101 +++++++++++++++++ .../resource_moisture.c | 42 ++++++++ examples/osd/arduino-plantobserving/run.sh | 5 + .../osd/arduino-plantobserving/sketch.pde | 34 ++++++ 9 files changed, 329 insertions(+) create mode 100644 examples/osd/arduino-plantobserving/Makefile create mode 100644 examples/osd/arduino-plantobserving/README.md create mode 100644 examples/osd/arduino-plantobserving/arduino-example.c create mode 100755 examples/osd/arduino-plantobserving/flash.sh create mode 100644 examples/osd/arduino-plantobserving/moisture.h create mode 100644 examples/osd/arduino-plantobserving/project-conf.h create mode 100644 examples/osd/arduino-plantobserving/resource_moisture.c create mode 100755 examples/osd/arduino-plantobserving/run.sh create mode 100644 examples/osd/arduino-plantobserving/sketch.pde diff --git a/examples/osd/arduino-plantobserving/Makefile b/examples/osd/arduino-plantobserving/Makefile new file mode 100644 index 000000000..6ac0fc001 --- /dev/null +++ b/examples/osd/arduino-plantobserving/Makefile @@ -0,0 +1,102 @@ +# Set this to the name of your sketch (without extension .pde) +SKETCH=sketch + +all: arduino-example \ + arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += resource_moisture.c ${SKETCH}.cpp + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 time json arduino json-resource + +include $(CONTIKI)/Makefile.include +include $(CONTIKI)/apps/arduino/Makefile.include + +arduino-example.osd-merkur.hex: arduino-example.osd-merkur + avr-objcopy -j .text -j .data -O ihex arduino-example.osd-merkur \ + arduino-example.osd-merkur.hex + +arduino-example.osd-merkur.eep: arduino-example.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + arduino-example.osd-merkur arduino-example.osd-merkur.eep + +flash: arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U \ + flash:w:arduino-example.osd-merkur.hex:a -U \ + eeprom:w:arduino-example.osd-merkur.eep:a + +.PHONY: flash + +$(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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/arduino-plantobserving/README.md b/examples/osd/arduino-plantobserving/README.md new file mode 100644 index 000000000..e1490ed05 --- /dev/null +++ b/examples/osd/arduino-plantobserving/README.md @@ -0,0 +1,11 @@ +Arduino compatibility example +============================= + +This example shows that it is now possible to re-use arduino sketches in +Contiki. This example documents the necessary magic. Arduino specifies +two routines, `setup` and `loop`. Before `setup` is called, the +framework initializes hardware. In original Arduino, all this is done in +a `main` function (in C). For contiki we define a process that does the +same. + +See the documentation file in apps/contiki-compat/README.md diff --git a/examples/osd/arduino-plantobserving/arduino-example.c b/examples/osd/arduino-plantobserving/arduino-example.c new file mode 100644 index 000000000..ea74dd8b8 --- /dev/null +++ b/examples/osd/arduino-plantobserving/arduino-example.c @@ -0,0 +1,2 @@ +#include +AUTOSTART_PROCESSES(&arduino_sketch); diff --git a/examples/osd/arduino-plantobserving/flash.sh b/examples/osd/arduino-plantobserving/flash.sh new file mode 100755 index 000000000..e9cb40bfc --- /dev/null +++ b/examples/osd/arduino-plantobserving/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur flash diff --git a/examples/osd/arduino-plantobserving/moisture.h b/examples/osd/arduino-plantobserving/moisture.h new file mode 100644 index 000000000..4542f5d53 --- /dev/null +++ b/examples/osd/arduino-plantobserving/moisture.h @@ -0,0 +1,30 @@ +/** + * \defgroup Arduino LED PWM example + * + * Resource definition for Arduino LED PWM module + * + * @{ + */ + +/** + * \file + * Resource definitions for the Arduino LED PWM module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef moisture_h +#define moisture_h +#include "contiki.h" +#include "contiki-net.h" +#include "erbium.h" +#include "er-coap-13.h" + +extern uint8_t moisture_pin; +extern uint16_t moisture_voltage; + +extern resource_t resource_moisture; + +#endif // moisture_h +/** @} */ diff --git a/examples/osd/arduino-plantobserving/project-conf.h b/examples/osd/arduino-plantobserving/project-conf.h new file mode 100644 index 000000000..e9408e312 --- /dev/null +++ b/examples/osd/arduino-plantobserving/project-conf.h @@ -0,0 +1,101 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_BATTERY 1 + +#define SICSLOWPAN_CONF_FRAG 1 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +//#undef RDC_CONF_MCU_SLEEP +//#define RDC_CONF_MCU_SLEEP 0 + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/arduino-plantobserving/resource_moisture.c b/examples/osd/arduino-plantobserving/resource_moisture.c new file mode 100644 index 000000000..764021073 --- /dev/null +++ b/examples/osd/arduino-plantobserving/resource_moisture.c @@ -0,0 +1,42 @@ +/** + * \file + * Resource for Arduino PWM + * \author + * Ralf Schlatterbeck + * + * \brief get/put pwm and period for LED pin + * + */ + +#include +#include +#include +#include "contiki.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" +#include "generic_resource.h" +#include "moisture.h" +#include "Arduino.h" + +size_t +moisture_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + moisture_voltage = analogRead(moisture_pin); + return snprintf + (buf, bufsize, "%d", moisture_voltage); +} + +GENERIC_RESOURCE \ + ( moisture, METHOD_GET + , "moisture/v" + , Moisture voltage + , V + , NULL + , moisture_v + ); + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ diff --git a/examples/osd/arduino-plantobserving/run.sh b/examples/osd/arduino-plantobserving/run.sh new file mode 100755 index 000000000..295a9ab1d --- /dev/null +++ b/examples/osd/arduino-plantobserving/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 diff --git a/examples/osd/arduino-plantobserving/sketch.pde b/examples/osd/arduino-plantobserving/sketch.pde new file mode 100644 index 000000000..439c62061 --- /dev/null +++ b/examples/osd/arduino-plantobserving/sketch.pde @@ -0,0 +1,34 @@ +/* + * Sample arduino sketch using contiki features. + * We turn the LED off + * We allow read the moisture sensor + * Unfortunately sleeping for long times in loop() isn't currently + * possible, something turns off the CPU (including PWM outputs) if a + * Proto-Thread is taking too long. We need to find out how to sleep in + * a Contiki-compatible way. + * Note that for a normal arduino sketch you won't have to include any + * of the contiki-specific files here, the sketch should just work. + */ + +extern "C" { +#include +#include "moisture.h" + +#define LED_PIN 4 + +uint8_t moisture_pin = A5; +uint16_t moisture_voltage = 0; +} + +void setup (void) +{ + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, HIGH); + rest_init_engine (); + rest_activate_resource (&resource_moisture); +} + +void loop (void) +{ + +} From 8ed94bf819af4a351948284795ba703ae864568c Mon Sep 17 00:00:00 2001 From: harald42 Date: Sat, 11 Oct 2014 22:53:08 +0200 Subject: [PATCH 178/345] initial upload --- examples/osd/climate2/Makefile | 98 +++++ examples/osd/climate2/README | 76 ++++ examples/osd/climate2/er-example-server.c | 500 ++++++++++++++++++++++ examples/osd/climate2/flash.sh | 2 + examples/osd/climate2/lall.txt | 132 ++++++ examples/osd/climate2/project-conf.h | 99 +++++ examples/osd/climate2/run.sh | 8 + examples/osd/climate2/server-client.csc | 227 ++++++++++ examples/osd/climate2/server-only.csc | 189 ++++++++ 9 files changed, 1331 insertions(+) create mode 100644 examples/osd/climate2/Makefile create mode 100644 examples/osd/climate2/README create mode 100644 examples/osd/climate2/er-example-server.c create mode 100755 examples/osd/climate2/flash.sh create mode 100644 examples/osd/climate2/lall.txt create mode 100644 examples/osd/climate2/project-conf.h create mode 100755 examples/osd/climate2/run.sh create mode 100644 examples/osd/climate2/server-client.csc create mode 100644 examples/osd/climate2/server-only.csc diff --git a/examples/osd/climate2/Makefile b/examples/osd/climate2/Makefile new file mode 100644 index 000000000..e12d01b5c --- /dev/null +++ b/examples/osd/climate2/Makefile @@ -0,0 +1,98 @@ +all: er-example-server +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + + +# variable for Makefile.include +WITH_UIP6=1 +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6 +CFLAGS += -DUIP_CONF_IPV6_RPL + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/climate2/README b/examples/osd/climate2/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/climate2/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/climate2/er-example-server.c b/examples/osd/climate2/er-example-server.c new file mode 100644 index 000000000..ee744ce68 --- /dev/null +++ b/examples/osd/climate2/er-example-server.c @@ -0,0 +1,500 @@ +/* + * 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) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_INFO 1 +#define REST_RES_DS1820 0 +#define REST_RES_DHT11 1 +#define REST_RES_DHT11TEMP 1 +#define REST_RES_LEDS 1 +#define REST_RES_TOGGLE 0 +#define REST_RES_BATTERY 1 + +#include "erbium.h" + +#if REST_RES_DS1820 +#include "dev/ds1820.h" +#endif +#if REST_RES_DHT11 +#include "dev/dht11.h" +uint16_t dht11_temp=0, dht11_hum=0; +#endif + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LEDS) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_SHT11) +#include "dev/sht11-sensor.h" +#endif + + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + + +/******************************************************************************/ + +#if REST_RES_INFO +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"version\" : \"V0.4.3\",\n"); + index += sprintf(message + index," \"name\" : \"6lowpan-climate\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +#if REST_RES_DS1820 +/* A simple getter example. Returns the reading from ds1820 sensor */ +#define DS1820_TEMP_LSB 0 +#define DS1820_TEMP_MSB 1 +#define DS1820_COUNT_REMAIN 6 +#define DS1820_COUNT_PER_C 7 +RESOURCE(ds1820, METHOD_GET, "s/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); +void +ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + char message[100]; + int length = 0; /* |<-------->| */ + union temp_raw { + int16_t s_int16; + uint16_t u_int16; + } temp_raw; + double temp_c; + int temp_integral; + int temp_centi; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + // temp = temp_read - 0.25°C + (count_per_c - count_remain) / count_per_c; + temp_raw.u_int16 = ds1820_ok[DS1820_TEMP_MSB] << 8 | ds1820_ok[DS1820_TEMP_LSB]; + temp_c = temp_raw.s_int16 / 2.0 + - 0.25 + + ((double) ds1820_ok[DS1820_COUNT_PER_C] - (double) ds1820_ok[DS1820_COUNT_REMAIN]) + / (double) ds1820_ok[DS1820_COUNT_PER_C]; + temp_integral = (int) temp_c; + temp_centi = (int) (fabs (temp_c - (int) temp_c) * 100.0); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%d.%02d C", temp_integral, temp_centi); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%02d\"}", temp_integral, temp_centi); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DS1820 + +#if REST_RES_DHT11TEMP +/*A simple getter example. Returns the reading from dhtxx sensor*/ +RESOURCE(dht11temp, METHOD_GET, "s/temp", "title=\"Temperatur DHTxx\";rt=\"temperature-c\""); +void +dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int length = 0; /* |<-------->| */ + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%d.%02d",dht11_temp/100, dht11_temp % 100); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%02d\"}",dht11_temp/100, dht11_temp % 100); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DHT11TEMP + +#if REST_RES_DHT11 +/*A simple getter example. Returns the reading from dhtxx sensor*/ +RESOURCE(dht11, METHOD_GET, "s/hum", "title=\"Humidity DHTxx\";rt=\"humidity-%\""); +void +dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int length = 0; /* |<-------->| */ + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf(message, REST_MAX_CHUNK_SIZE, "%d.%02d",dht11_hum/100, dht11_hum % 100); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"hum\":\"%d.%02d\"}",dht11_hum/100, dht11_hum % 100); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_response_payload(response, buffer, length); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + REST.set_response_payload(response, (uint8_t *)"Supporting content-types text/plain and application/json", 56); + } +} +#endif //REST_RES_DHT11 + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LEDS) +/******************************************************************************/ +#if REST_RES_LEDS +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(leds, METHOD_POST | METHOD_PUT , "a/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); + +void +leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *color = NULL; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + if ((len=REST.get_query_variable(request, "color", &color))) { + PRINTF("color %.*s\n", len, color); + + if (strncmp(color, "r", len)==0) { + led = LEDS_RED; + } else if(strncmp(color,"g", len)==0) { + led = LEDS_GREEN; + } else if (strncmp(color,"b", len)==0) { + led = LEDS_BLUE; + } else { + success = 0; + } + } else { + success = 0; + } + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "a/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LEDS */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "s/battery", "title=\"Battery status\";rt=\"battery-mV\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", battery/1000, battery % 1000); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d.%02d}", battery/1000, battery % 1000); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + +void +hw_init() +{ +#if defined (PLATFORM_HAS_LEDS) + leds_off(LEDS_RED); +#endif +#if REST_RES_DS1820 + ds1820_temp(); +#endif +#if REST_RES_DHT11 + //DHT_INIT(); + DHT_Read_Data(&dht11_temp, &dht11_hum); +#endif +} +#define MESURE_INTERVAL (20 * CLOCK_SECOND) +#define READ_TIME ( 2 * CLOCK_SECOND) + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + static struct etimer ds_periodic_timer; +#if REST_RES_DS1820 + static struct etimer ds_read_timer; +#endif + + PROCESS_BEGIN(); + + PRINTF("Starting Erbium Example 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + + /* Initialize the OSD Hardware. */ + hw_init(); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ +#if REST_RES_DS1820 + rest_activate_resource(&resource_ds1820); +#endif +#if REST_RES_DHT11 + rest_activate_resource(&resource_dht11); +#endif +#if REST_RES_DHT11TEMP + rest_activate_resource(&resource_dht11temp); +#endif +#if REST_RES_INFO + rest_activate_resource(&resource_info); +#endif +#if defined (PLATFORM_HAS_LEDS) +#if REST_RES_LEDS + rest_activate_resource(&resource_leds); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LEDS */ +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif + + /* Define application-specific events here. */ + etimer_set(&ds_periodic_timer, MESURE_INTERVAL); + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); + } +#endif /* PLATFORM_HAS_BUTTON */ + if(etimer_expired(&ds_periodic_timer)) { + PRINTF("Periodic\n"); + etimer_reset(&ds_periodic_timer); +#if REST_RES_DHT11 + // DHT_Read_Data(&dht11_temp, &dht11_hum); + DHT_Read_Data(&dht11_temp, &dht11_hum); +#endif +#if REST_RES_DS1820 + if(ds1820_convert()){ + etimer_set(&ds_read_timer, READ_TIME); + } +#endif + } +#if REST_RES_DS1820 + if(etimer_expired(&ds_read_timer)) { + PRINTF("DS1820_Read\n"); + ds1820_read(); + } +#endif + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/climate2/flash.sh b/examples/osd/climate2/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/climate2/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/climate2/lall.txt b/examples/osd/climate2/lall.txt new file mode 100644 index 000000000..af5ccaf63 --- /dev/null +++ b/examples/osd/climate2/lall.txt @@ -0,0 +1,132 @@ +INFO: compiling with CoAP-08 +rm -f *~ *core core *.srec \ + *.lst *.map \ + *.cprg *.bin *.data contiki*.a *.firmware core-labels.S *.ihex *.ini \ + *.ce *.co +rm -rf obj_osd-merkur +INFO: compiling with CoAP-08 +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rime/rimeaddr.c -o obj_osd-merkur/rimeaddr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rime/timesynch.c -o obj_osd-merkur/timesynch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rime/rimestats.c -o obj_osd-merkur/rimestats.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/cxmac.c -o obj_osd-merkur/cxmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/xmac.c -o obj_osd-merkur/xmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/nullmac.c -o obj_osd-merkur/nullmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/lpp.c -o obj_osd-merkur/lpp.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/frame802154.c -o obj_osd-merkur/frame802154.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/sicslowmac.c -o obj_osd-merkur/sicslowmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/nullrdc.c -o obj_osd-merkur/nullrdc.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/nullrdc-noframer.c -o obj_osd-merkur/nullrdc-noframer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/mac.c -o obj_osd-merkur/mac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/framer-nullmac.c -o obj_osd-merkur/framer-nullmac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/framer-802154.c -o obj_osd-merkur/framer-802154.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/csma.c -o obj_osd-merkur/csma.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/contikimac.c -o obj_osd-merkur/contikimac.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/mac/phase.c -o obj_osd-merkur/phase.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl.c -o obj_osd-merkur/rpl.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-dag.c -o obj_osd-merkur/rpl-dag.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-icmp6.c -o obj_osd-merkur/rpl-icmp6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-timers.c -o obj_osd-merkur/rpl-timers.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-of-etx.c -o obj_osd-merkur/rpl-of-etx.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/rpl/rpl-ext-header.c -o obj_osd-merkur/rpl-ext-header.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/process.c -o obj_osd-merkur/process.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/procinit.c -o obj_osd-merkur/procinit.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/autostart.c -o obj_osd-merkur/autostart.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/loader/elfloader.c -o obj_osd-merkur/elfloader.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/profile.c -o obj_osd-merkur/profile.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/timetable.c -o obj_osd-merkur/timetable.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/timetable-aggregate.c -o obj_osd-merkur/timetable-aggregate.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/compower.c -o obj_osd-merkur/compower.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/serial-line.c -o obj_osd-merkur/serial-line.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/memb.c -o obj_osd-merkur/memb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/mmem.c -o obj_osd-merkur/mmem.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/timer.c -o obj_osd-merkur/timer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/list.c -o obj_osd-merkur/list.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/etimer.c -o obj_osd-merkur/etimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/ctimer.c -o obj_osd-merkur/ctimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/energest.c -o obj_osd-merkur/energest.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/rtimer.c -o obj_osd-merkur/rtimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/stimer.c -o obj_osd-merkur/stimer.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/print-stats.c -o obj_osd-merkur/print-stats.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/ifft.c -o obj_osd-merkur/ifft.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/crc16.c -o obj_osd-merkur/crc16.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/random.c -o obj_osd-merkur/random.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/checkpoint.c -o obj_osd-merkur/checkpoint.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/ringbuf.c -o obj_osd-merkur/ringbuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/netstack.c -o obj_osd-merkur/netstack.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-debug.c -o obj_osd-merkur/uip-debug.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/packetbuf.c -o obj_osd-merkur/packetbuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/queuebuf.c -o obj_osd-merkur/queuebuf.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/packetqueue.c -o obj_osd-merkur/packetqueue.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip6.c -o obj_osd-merkur/uip6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/tcpip.c -o obj_osd-merkur/tcpip.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/psock.c -o obj_osd-merkur/psock.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-udp-packet.c -o obj_osd-merkur/uip-udp-packet.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-split.c -o obj_osd-merkur/uip-split.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/resolv.c -o obj_osd-merkur/resolv.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/tcpdump.c -o obj_osd-merkur/tcpdump.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uiplib.c -o obj_osd-merkur/uiplib.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/simple-udp.c -o obj_osd-merkur/simple-udp.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-icmp6.c -o obj_osd-merkur/uip-icmp6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-nd6.c -o obj_osd-merkur/uip-nd6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-packetqueue.c -o obj_osd-merkur/uip-packetqueue.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/sicslowpan.c -o obj_osd-merkur/sicslowpan.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/neighbor-attr.c -o obj_osd-merkur/neighbor-attr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/neighbor-info.c -o obj_osd-merkur/neighbor-info.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-ds6.c -o obj_osd-merkur/uip-ds6.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/net/uip-ds6-route.c -o obj_osd-merkur/uip-ds6-route.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/sys/mt.c -o obj_osd-merkur/mt.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/nullradio.c -o obj_osd-merkur/nullradio.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-engine.c -o obj_osd-merkur/er-coap-07-engine.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07.c -o obj_osd-merkur/er-coap-07.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-transactions.c -o obj_osd-merkur/er-coap-07-transactions.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-observing.c -o obj_osd-merkur/er-coap-07-observing.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/er-coap-07/er-coap-07-separate.c -o obj_osd-merkur/er-coap-07-separate.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../apps/erbium/erbium.c -o obj_osd-merkur/erbium.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./contiki-main.c -o obj_osd-merkur/contiki-main.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./params.c -o obj_osd-merkur/params.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./node-id.c -o obj_osd-merkur/node-id.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/temperature-sensor.c -o obj_osd-merkur/temperature-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/adc.c -o obj_osd-merkur/adc.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/led.c -o obj_osd-merkur/led.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/lib/sensors.c -o obj_osd-merkur/sensors.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/./slip_uart0.c -o obj_osd-merkur/slip_uart0.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/slip.c -o obj_osd-merkur/slip.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/button-sensor.c -o obj_osd-merkur/button-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/dht11.c -o obj_osd-merkur/dht11.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/ds1820.c -o obj_osd-merkur/ds1820.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/battery-sensor.c -o obj_osd-merkur/battery-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/pir-sensor.c -o obj_osd-merkur/pir-sensor.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/clock.c -o obj_osd-merkur/clock.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./mtarch.c -o obj_osd-merkur/mtarch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/eeprom.c -o obj_osd-merkur/eeprom.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/flash.c -o obj_osd-merkur/flash.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/dev/rs232.c -o obj_osd-merkur/rs232.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../platform/osd-merkur/dev/leds-arch.c -o obj_osd-merkur/leds-arch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./watchdog.c -o obj_osd-merkur/watchdog.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./rtimer-arch.c -o obj_osd-merkur/rtimer-arch.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./bootloader.c -o obj_osd-merkur/bootloader.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/./settings.c -o obj_osd-merkur/settings.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/loader/elfloader-avr.c -o obj_osd-merkur/elfloader-avr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/loader/symtab-avr.c -o obj_osd-merkur/symtab-avr.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../core/dev/leds.c -o obj_osd-merkur/leds.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/radio/rf230bb/rf230bb.c -o obj_osd-merkur/rf230bb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c ../../../cpu/avr/radio/rf230bb/halbb.c -o obj_osd-merkur/halbb.o +avr-ar rcf contiki-osd-merkur.a obj_osd-merkur/rimeaddr.o obj_osd-merkur/timesynch.o obj_osd-merkur/rimestats.o obj_osd-merkur/cxmac.o obj_osd-merkur/xmac.o obj_osd-merkur/nullmac.o obj_osd-merkur/lpp.o obj_osd-merkur/frame802154.o obj_osd-merkur/sicslowmac.o obj_osd-merkur/nullrdc.o obj_osd-merkur/nullrdc-noframer.o obj_osd-merkur/mac.o obj_osd-merkur/framer-nullmac.o obj_osd-merkur/framer-802154.o obj_osd-merkur/csma.o obj_osd-merkur/contikimac.o obj_osd-merkur/phase.o obj_osd-merkur/rpl.o obj_osd-merkur/rpl-dag.o obj_osd-merkur/rpl-icmp6.o obj_osd-merkur/rpl-timers.o obj_osd-merkur/rpl-of-etx.o obj_osd-merkur/rpl-ext-header.o obj_osd-merkur/process.o obj_osd-merkur/procinit.o obj_osd-merkur/autostart.o obj_osd-merkur/elfloader.o obj_osd-merkur/profile.o obj_osd-merkur/timetable.o obj_osd-merkur/timetable-aggregate.o obj_osd-merkur/compower.o obj_osd-merkur/serial-line.o obj_osd-merkur/memb.o obj_osd-merkur/mmem.o obj_osd-merkur/timer.o obj_osd-merkur/list.o obj_osd-merkur/etimer.o obj_osd-merkur/ctimer.o obj_osd-merkur/energest.o obj_osd-merkur/rtimer.o obj_osd-merkur/stimer.o obj_osd-merkur/print-stats.o obj_osd-merkur/ifft.o obj_osd-merkur/crc16.o obj_osd-merkur/random.o obj_osd-merkur/checkpoint.o obj_osd-merkur/ringbuf.o obj_osd-merkur/netstack.o obj_osd-merkur/uip-debug.o obj_osd-merkur/packetbuf.o obj_osd-merkur/queuebuf.o obj_osd-merkur/packetqueue.o obj_osd-merkur/uip6.o obj_osd-merkur/tcpip.o obj_osd-merkur/psock.o obj_osd-merkur/uip-udp-packet.o obj_osd-merkur/uip-split.o obj_osd-merkur/resolv.o obj_osd-merkur/tcpdump.o obj_osd-merkur/uiplib.o obj_osd-merkur/simple-udp.o obj_osd-merkur/uip-icmp6.o obj_osd-merkur/uip-nd6.o obj_osd-merkur/uip-packetqueue.o obj_osd-merkur/sicslowpan.o obj_osd-merkur/neighbor-attr.o obj_osd-merkur/neighbor-info.o obj_osd-merkur/uip-ds6.o obj_osd-merkur/uip-ds6-route.o obj_osd-merkur/mt.o obj_osd-merkur/nullradio.o obj_osd-merkur/er-coap-07-engine.o obj_osd-merkur/er-coap-07.o obj_osd-merkur/er-coap-07-transactions.o obj_osd-merkur/er-coap-07-observing.o obj_osd-merkur/er-coap-07-separate.o obj_osd-merkur/erbium.o obj_osd-merkur/contiki-main.o obj_osd-merkur/params.o obj_osd-merkur/node-id.o obj_osd-merkur/temperature-sensor.o obj_osd-merkur/adc.o obj_osd-merkur/led.o obj_osd-merkur/sensors.o obj_osd-merkur/slip_uart0.o obj_osd-merkur/slip.o obj_osd-merkur/button-sensor.o obj_osd-merkur/dht11.o obj_osd-merkur/ds1820.o obj_osd-merkur/battery-sensor.o obj_osd-merkur/pir-sensor.o obj_osd-merkur/clock.o obj_osd-merkur/mtarch.o obj_osd-merkur/eeprom.o obj_osd-merkur/flash.o obj_osd-merkur/rs232.o obj_osd-merkur/leds-arch.o obj_osd-merkur/watchdog.o obj_osd-merkur/rtimer-arch.o obj_osd-merkur/bootloader.o obj_osd-merkur/settings.o obj_osd-merkur/elfloader-avr.o obj_osd-merkur/symtab-avr.o obj_osd-merkur/leds.o obj_osd-merkur/rf230bb.o obj_osd-merkur/halbb.o +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -DAUTOSTART_ENABLE -c er-example-server.c -o er-example-server.co +avr-gcc -DPROJECT_CONF_H=\"project-conf.h\" -DWITH_COAP=7 -DREST=coap_rest_implementation -DUIP_CONF_TCP=0 -DCONTIKI=1 -DCONTIKI_TARGET_OSD_MERKUR=1 -DUIP_CONF_IPV6=1 -DUIP_CONF_IPV6_RPL=1 -Wall -mmcu=atmega128rfa1 -gdwarf-2 -fno-strict-aliasing -I../../../platform/osd-merkur -I. -I../../../core -I../../../cpu/avr -DF_CPU=16000000UL -DAUTO_CRC_PADDING=2 -Os -DRF230BB -I. -I../../../platform/osd-merkur/. -I../../../platform/osd-merkur/dev -I../../../platform/osd-merkur/apps -I../../../platform/osd-merkur/net -I../../../platform/osd-merkur/loader -I../../../cpu/avr/. -I../../../cpu/avr/dev -I../../../cpu/avr/radio/rf230bb -I../../../core/dev -I../../../core/lib -I../../../core/net -I../../../core/net/mac -I../../../core/net/rime -I../../../core/net/rpl -I../../../core/sys -I../../../core/cfs -I../../../core/ctk -I../../../core/lib/ctk -I../../../core/loader -I../../../core/. -I../../../apps/er-coap-07 -I../../../apps/erbium -I../../../platform/osd-merkur/ -DCONTIKI_VERSION_STRING=\"Contiki-2.6-335-gbbd7649\" -MMD -c static-routing.c -o obj_osd-merkur/static-routing.o +avr-gcc -mmcu=atmega128rfa1 -Wl,-Map=contiki-osd-merkur.map -Wl,--section-start=.bootloader=0x1F000 er-example-server.co obj_osd-merkur/static-routing.o contiki-osd-merkur.a -o er-example-server.osd-merkur +rm obj_osd-merkur/static-routing.o er-example-server.co +AVR Memory Usage +---------------- +Device: Unknown + +Program: 73000 bytes +(.text + .data + .bootloader) + +Data: 12592 bytes +(.data + .bss + .noinit) + +EEPROM: 41 bytes +(.eeprom) + + diff --git a/examples/osd/climate2/project-conf.h b/examples/osd/climate2/project-conf.h new file mode 100644 index 000000000..ba521f078 --- /dev/null +++ b/examples/osd/climate2/project-conf.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2013, Matthias Kovatsch + * 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_ERBIUM_CONF_H_ +#define PROJECT_ERBIUM_CONF_H_ + +#define PLATFORM_HAS_BATTERY 1 +//#define PLATFORM_HAS_DS1820 1 +#define PLATFORM_HAS_DHT11 1 +#define PLATFORM_HAS_LEDS 1 + + +/* Some platforms have weird includes. */ +#undef IEEE802154_CONF_PANID + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ +#endif /* PROJECT_ERBIUM_CONF_H_ */ diff --git a/examples/osd/climate2/run.sh b/examples/osd/climate2/run.sh new file mode 100755 index 000000000..2efd2cf48 --- /dev/null +++ b/examples/osd/climate2/run.sh @@ -0,0 +1,8 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/climate2/server-client.csc b/examples/osd/climate2/server-client.csc new file mode 100644 index 000000000..8c45fdf02 --- /dev/null +++ b/examples/osd/climate2/server-client.csc @@ -0,0 +1,227 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/climate2/server-only.csc b/examples/osd/climate2/server-only.csc new file mode 100644 index 000000000..d5eee34d6 --- /dev/null +++ b/examples/osd/climate2/server-only.csc @@ -0,0 +1,189 @@ + + + [CONTIKI_DIR]/tools/cooja/apps/mrm + [CONTIKI_DIR]/tools/cooja/apps/mspsim + [CONTIKI_DIR]/tools/cooja/apps/avrora + [CONTIKI_DIR]/tools/cooja/apps/serial_socket + [CONTIKI_DIR]/tools/cooja/apps/collect-view + + REST with RPL router + -2147483648 + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.SkyByteRadio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 5 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 4 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 1 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 2 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 3 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 0 + 646 + 564 + 2 + + + From 408d1cabfe6e3edf91c29948323efe00968df1ec Mon Sep 17 00:00:00 2001 From: harald42 Date: Thu, 23 Oct 2014 11:06:25 +0200 Subject: [PATCH 179/345] initial upload --- examples/osd/arduino-wateralert/Makefile | 102 ++++++++++++++++++ examples/osd/arduino-wateralert/README.md | 11 ++ .../osd/arduino-wateralert/arduino-example.c | 2 + examples/osd/arduino-wateralert/flash.sh | 2 + .../osd/arduino-wateralert/project-conf.h | 101 +++++++++++++++++ .../osd/arduino-wateralert/resource_water.c | 42 ++++++++ .../osd/arduino-wateralert/resource_water.h | 30 ++++++ examples/osd/arduino-wateralert/run.sh | 5 + examples/osd/arduino-wateralert/sketch.pde | 34 ++++++ 9 files changed, 329 insertions(+) create mode 100644 examples/osd/arduino-wateralert/Makefile create mode 100644 examples/osd/arduino-wateralert/README.md create mode 100644 examples/osd/arduino-wateralert/arduino-example.c create mode 100755 examples/osd/arduino-wateralert/flash.sh create mode 100644 examples/osd/arduino-wateralert/project-conf.h create mode 100644 examples/osd/arduino-wateralert/resource_water.c create mode 100644 examples/osd/arduino-wateralert/resource_water.h create mode 100755 examples/osd/arduino-wateralert/run.sh create mode 100644 examples/osd/arduino-wateralert/sketch.pde diff --git a/examples/osd/arduino-wateralert/Makefile b/examples/osd/arduino-wateralert/Makefile new file mode 100644 index 000000000..96ed4e242 --- /dev/null +++ b/examples/osd/arduino-wateralert/Makefile @@ -0,0 +1,102 @@ +# Set this to the name of your sketch (without extension .pde) +SKETCH=sketch + +all: arduino-example \ + arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += resource_water.c ${SKETCH}.cpp + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 time json arduino json-resource + +include $(CONTIKI)/Makefile.include +include $(CONTIKI)/apps/arduino/Makefile.include + +arduino-example.osd-merkur.hex: arduino-example.osd-merkur + avr-objcopy -j .text -j .data -O ihex arduino-example.osd-merkur \ + arduino-example.osd-merkur.hex + +arduino-example.osd-merkur.eep: arduino-example.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + arduino-example.osd-merkur arduino-example.osd-merkur.eep + +flash: arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U \ + flash:w:arduino-example.osd-merkur.hex:a -U \ + eeprom:w:arduino-example.osd-merkur.eep:a + +.PHONY: flash + +$(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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/arduino-wateralert/README.md b/examples/osd/arduino-wateralert/README.md new file mode 100644 index 000000000..e1490ed05 --- /dev/null +++ b/examples/osd/arduino-wateralert/README.md @@ -0,0 +1,11 @@ +Arduino compatibility example +============================= + +This example shows that it is now possible to re-use arduino sketches in +Contiki. This example documents the necessary magic. Arduino specifies +two routines, `setup` and `loop`. Before `setup` is called, the +framework initializes hardware. In original Arduino, all this is done in +a `main` function (in C). For contiki we define a process that does the +same. + +See the documentation file in apps/contiki-compat/README.md diff --git a/examples/osd/arduino-wateralert/arduino-example.c b/examples/osd/arduino-wateralert/arduino-example.c new file mode 100644 index 000000000..ea74dd8b8 --- /dev/null +++ b/examples/osd/arduino-wateralert/arduino-example.c @@ -0,0 +1,2 @@ +#include +AUTOSTART_PROCESSES(&arduino_sketch); diff --git a/examples/osd/arduino-wateralert/flash.sh b/examples/osd/arduino-wateralert/flash.sh new file mode 100755 index 000000000..e9cb40bfc --- /dev/null +++ b/examples/osd/arduino-wateralert/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur flash diff --git a/examples/osd/arduino-wateralert/project-conf.h b/examples/osd/arduino-wateralert/project-conf.h new file mode 100644 index 000000000..e9408e312 --- /dev/null +++ b/examples/osd/arduino-wateralert/project-conf.h @@ -0,0 +1,101 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_BATTERY 1 + +#define SICSLOWPAN_CONF_FRAG 1 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +//#undef RDC_CONF_MCU_SLEEP +//#define RDC_CONF_MCU_SLEEP 0 + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/arduino-wateralert/resource_water.c b/examples/osd/arduino-wateralert/resource_water.c new file mode 100644 index 000000000..9e7cf1ee5 --- /dev/null +++ b/examples/osd/arduino-wateralert/resource_water.c @@ -0,0 +1,42 @@ +/** + * \file + * Resource for Arduino analog read + * \author + * Harald Pichler + * + * \brief get/put pwm and period for LED pin + * + */ + +#include +#include +#include +#include "contiki.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" +#include "generic_resource.h" +#include "resource_water.h" +#include "Arduino.h" + +size_t +water_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + water_voltage = analogRead(water_pin); + return snprintf + (buf, bufsize, "%d", water_voltage); +} + +GENERIC_RESOURCE \ + ( water, METHOD_GET + , "water/v" + , Moisture voltage + , V + , NULL + , water_v + ); + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ diff --git a/examples/osd/arduino-wateralert/resource_water.h b/examples/osd/arduino-wateralert/resource_water.h new file mode 100644 index 000000000..d5836b187 --- /dev/null +++ b/examples/osd/arduino-wateralert/resource_water.h @@ -0,0 +1,30 @@ +/** + * \defgroup Arduino LED PWM example + * + * Resource definition for Arduino LED PWM module + * + * @{ + */ + +/** + * \file + * Resource definitions for the Arduino LED PWM module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef water_h +#define water_h +#include "contiki.h" +#include "contiki-net.h" +#include "erbium.h" +#include "er-coap-13.h" + +extern uint8_t water_pin; +extern uint16_t water_voltage; + +extern resource_t resource_water; + +#endif // water_h +/** @} */ diff --git a/examples/osd/arduino-wateralert/run.sh b/examples/osd/arduino-wateralert/run.sh new file mode 100755 index 000000000..295a9ab1d --- /dev/null +++ b/examples/osd/arduino-wateralert/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 diff --git a/examples/osd/arduino-wateralert/sketch.pde b/examples/osd/arduino-wateralert/sketch.pde new file mode 100644 index 000000000..d55c95d74 --- /dev/null +++ b/examples/osd/arduino-wateralert/sketch.pde @@ -0,0 +1,34 @@ +/* + * Sample arduino sketch using contiki features. + * We turn the LED off + * We allow read the water sensor + * Unfortunately sleeping for long times in loop() isn't currently + * possible, something turns off the CPU (including PWM outputs) if a + * Proto-Thread is taking too long. We need to find out how to sleep in + * a Contiki-compatible way. + * Note that for a normal arduino sketch you won't have to include any + * of the contiki-specific files here, the sketch should just work. + */ + +extern "C" { +#include +#include "resource_water.h" + +#define LED_PIN 4 + +uint8_t water_pin = A5; +uint16_t water_voltage = 0; +} + +void setup (void) +{ + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, HIGH); + rest_init_engine (); + rest_activate_resource (&resource_water); +} + +void loop (void) +{ + +} From ee1759ba4a062cf92bc078b7b8f1dc8685808c6a Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 14 Nov 2014 10:46:30 +0100 Subject: [PATCH 180/345] initial upload --- examples/osd/arduino-roomalert/Makefile | 102 ++++++++++++++++++ examples/osd/arduino-roomalert/README.md | 11 ++ .../osd/arduino-roomalert/arduino-example.c | 2 + examples/osd/arduino-roomalert/flash.sh | 2 + examples/osd/arduino-roomalert/project-conf.h | 101 +++++++++++++++++ examples/osd/arduino-roomalert/resource_pir.c | 42 ++++++++ examples/osd/arduino-roomalert/resource_pir.h | 30 ++++++ examples/osd/arduino-roomalert/run.sh | 5 + examples/osd/arduino-roomalert/sketch.pde | 34 ++++++ 9 files changed, 329 insertions(+) create mode 100644 examples/osd/arduino-roomalert/Makefile create mode 100644 examples/osd/arduino-roomalert/README.md create mode 100644 examples/osd/arduino-roomalert/arduino-example.c create mode 100755 examples/osd/arduino-roomalert/flash.sh create mode 100644 examples/osd/arduino-roomalert/project-conf.h create mode 100644 examples/osd/arduino-roomalert/resource_pir.c create mode 100644 examples/osd/arduino-roomalert/resource_pir.h create mode 100755 examples/osd/arduino-roomalert/run.sh create mode 100644 examples/osd/arduino-roomalert/sketch.pde diff --git a/examples/osd/arduino-roomalert/Makefile b/examples/osd/arduino-roomalert/Makefile new file mode 100644 index 000000000..3df5d4a2a --- /dev/null +++ b/examples/osd/arduino-roomalert/Makefile @@ -0,0 +1,102 @@ +# Set this to the name of your sketch (without extension .pde) +SKETCH=sketch + +all: arduino-example \ + arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += resource_pir.c ${SKETCH}.cpp + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 time json arduino json-resource + +include $(CONTIKI)/Makefile.include +include $(CONTIKI)/apps/arduino/Makefile.include + +arduino-example.osd-merkur.hex: arduino-example.osd-merkur + avr-objcopy -j .text -j .data -O ihex arduino-example.osd-merkur \ + arduino-example.osd-merkur.hex + +arduino-example.osd-merkur.eep: arduino-example.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + arduino-example.osd-merkur arduino-example.osd-merkur.eep + +flash: arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U \ + flash:w:arduino-example.osd-merkur.hex:a -U \ + eeprom:w:arduino-example.osd-merkur.eep:a + +.PHONY: flash + +$(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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/arduino-roomalert/README.md b/examples/osd/arduino-roomalert/README.md new file mode 100644 index 000000000..e1490ed05 --- /dev/null +++ b/examples/osd/arduino-roomalert/README.md @@ -0,0 +1,11 @@ +Arduino compatibility example +============================= + +This example shows that it is now possible to re-use arduino sketches in +Contiki. This example documents the necessary magic. Arduino specifies +two routines, `setup` and `loop`. Before `setup` is called, the +framework initializes hardware. In original Arduino, all this is done in +a `main` function (in C). For contiki we define a process that does the +same. + +See the documentation file in apps/contiki-compat/README.md diff --git a/examples/osd/arduino-roomalert/arduino-example.c b/examples/osd/arduino-roomalert/arduino-example.c new file mode 100644 index 000000000..ea74dd8b8 --- /dev/null +++ b/examples/osd/arduino-roomalert/arduino-example.c @@ -0,0 +1,2 @@ +#include +AUTOSTART_PROCESSES(&arduino_sketch); diff --git a/examples/osd/arduino-roomalert/flash.sh b/examples/osd/arduino-roomalert/flash.sh new file mode 100755 index 000000000..e9cb40bfc --- /dev/null +++ b/examples/osd/arduino-roomalert/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur flash diff --git a/examples/osd/arduino-roomalert/project-conf.h b/examples/osd/arduino-roomalert/project-conf.h new file mode 100644 index 000000000..e9408e312 --- /dev/null +++ b/examples/osd/arduino-roomalert/project-conf.h @@ -0,0 +1,101 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_BATTERY 1 + +#define SICSLOWPAN_CONF_FRAG 1 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +//#undef RDC_CONF_MCU_SLEEP +//#define RDC_CONF_MCU_SLEEP 0 + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/arduino-roomalert/resource_pir.c b/examples/osd/arduino-roomalert/resource_pir.c new file mode 100644 index 000000000..e109e2254 --- /dev/null +++ b/examples/osd/arduino-roomalert/resource_pir.c @@ -0,0 +1,42 @@ +/** + * \file + * Resource for Arduino analog read + * \author + * Harald Pichler + * + * \brief get/put pwm and period for LED pin + * + */ + +#include +#include +#include +#include "contiki.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" +#include "generic_resource.h" +#include "resource_pir.h" +#include "Arduino.h" + +size_t +pir_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + pir_value = digitalRead(pir_pin); + return snprintf + (buf, bufsize, "%d", pir_value); +} + +GENERIC_RESOURCE \ + ( pir, METHOD_GET + , "pir/v" + , Moisture value + , V + , NULL + , pir_v + ); + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ diff --git a/examples/osd/arduino-roomalert/resource_pir.h b/examples/osd/arduino-roomalert/resource_pir.h new file mode 100644 index 000000000..8bac1b61e --- /dev/null +++ b/examples/osd/arduino-roomalert/resource_pir.h @@ -0,0 +1,30 @@ +/** + * \defgroup Arduino LED PWM example + * + * Resource definition for Arduino LED PWM module + * + * @{ + */ + +/** + * \file + * Resource definitions for the Arduino LED PWM module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef pir_h +#define pir_h +#include "contiki.h" +#include "contiki-net.h" +#include "erbium.h" +#include "er-coap-13.h" + +extern uint8_t pir_pin; +extern uint16_t pir_value; + +extern resource_t resource_pir; + +#endif // pir_h +/** @} */ diff --git a/examples/osd/arduino-roomalert/run.sh b/examples/osd/arduino-roomalert/run.sh new file mode 100755 index 000000000..295a9ab1d --- /dev/null +++ b/examples/osd/arduino-roomalert/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 diff --git a/examples/osd/arduino-roomalert/sketch.pde b/examples/osd/arduino-roomalert/sketch.pde new file mode 100644 index 000000000..4d11f6085 --- /dev/null +++ b/examples/osd/arduino-roomalert/sketch.pde @@ -0,0 +1,34 @@ +/* + * Sample arduino sketch using contiki features. + * We turn the LED off + * We allow read the water sensor + * Unfortunately sleeping for long times in loop() isn't currently + * possible, something turns off the CPU (including PWM outputs) if a + * Proto-Thread is taking too long. We need to find out how to sleep in + * a Contiki-compatible way. + * Note that for a normal arduino sketch you won't have to include any + * of the contiki-specific files here, the sketch should just work. + */ + +extern "C" { +#include +#include "resource_pir.h" + +#define LED_PIN 4 + +uint8_t pir_pin = A5; +uint16_t pir_value = 0; +} + +void setup (void) +{ + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, HIGH); + rest_init_engine (); + rest_activate_resource (&resource_pir); +} + +void loop (void) +{ + +} From dfa4da2e98142ea93254cc308d97fcafd2c7d3c3 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 14 Nov 2014 11:02:45 +0100 Subject: [PATCH 181/345] initial upload --- examples/osd/arduino-dooralert/Makefile | 102 ++++++++++++++++++ examples/osd/arduino-dooralert/README.md | 11 ++ .../osd/arduino-dooralert/arduino-example.c | 2 + examples/osd/arduino-dooralert/flash.sh | 2 + examples/osd/arduino-dooralert/project-conf.h | 101 +++++++++++++++++ .../osd/arduino-dooralert/resource_door.c | 42 ++++++++ .../osd/arduino-dooralert/resource_door.h | 30 ++++++ examples/osd/arduino-dooralert/run.sh | 5 + examples/osd/arduino-dooralert/sketch.pde | 34 ++++++ 9 files changed, 329 insertions(+) create mode 100644 examples/osd/arduino-dooralert/Makefile create mode 100644 examples/osd/arduino-dooralert/README.md create mode 100644 examples/osd/arduino-dooralert/arduino-example.c create mode 100755 examples/osd/arduino-dooralert/flash.sh create mode 100644 examples/osd/arduino-dooralert/project-conf.h create mode 100644 examples/osd/arduino-dooralert/resource_door.c create mode 100644 examples/osd/arduino-dooralert/resource_door.h create mode 100755 examples/osd/arduino-dooralert/run.sh create mode 100644 examples/osd/arduino-dooralert/sketch.pde diff --git a/examples/osd/arduino-dooralert/Makefile b/examples/osd/arduino-dooralert/Makefile new file mode 100644 index 000000000..b8584f8f2 --- /dev/null +++ b/examples/osd/arduino-dooralert/Makefile @@ -0,0 +1,102 @@ +# Set this to the name of your sketch (without extension .pde) +SKETCH=sketch + +all: arduino-example \ + arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +PROJECT_SOURCEFILES += resource_door.c ${SKETCH}.cpp + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 time json arduino json-resource + +include $(CONTIKI)/Makefile.include +include $(CONTIKI)/apps/arduino/Makefile.include + +arduino-example.osd-merkur.hex: arduino-example.osd-merkur + avr-objcopy -j .text -j .data -O ihex arduino-example.osd-merkur \ + arduino-example.osd-merkur.hex + +arduino-example.osd-merkur.eep: arduino-example.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + arduino-example.osd-merkur arduino-example.osd-merkur.eep + +flash: arduino-example.osd-merkur.hex arduino-example.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U \ + flash:w:arduino-example.osd-merkur.hex:a -U \ + eeprom:w:arduino-example.osd-merkur.eep:a + +.PHONY: flash + +$(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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/arduino-dooralert/README.md b/examples/osd/arduino-dooralert/README.md new file mode 100644 index 000000000..e1490ed05 --- /dev/null +++ b/examples/osd/arduino-dooralert/README.md @@ -0,0 +1,11 @@ +Arduino compatibility example +============================= + +This example shows that it is now possible to re-use arduino sketches in +Contiki. This example documents the necessary magic. Arduino specifies +two routines, `setup` and `loop`. Before `setup` is called, the +framework initializes hardware. In original Arduino, all this is done in +a `main` function (in C). For contiki we define a process that does the +same. + +See the documentation file in apps/contiki-compat/README.md diff --git a/examples/osd/arduino-dooralert/arduino-example.c b/examples/osd/arduino-dooralert/arduino-example.c new file mode 100644 index 000000000..ea74dd8b8 --- /dev/null +++ b/examples/osd/arduino-dooralert/arduino-example.c @@ -0,0 +1,2 @@ +#include +AUTOSTART_PROCESSES(&arduino_sketch); diff --git a/examples/osd/arduino-dooralert/flash.sh b/examples/osd/arduino-dooralert/flash.sh new file mode 100755 index 000000000..e9cb40bfc --- /dev/null +++ b/examples/osd/arduino-dooralert/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +make TARGET=osd-merkur flash diff --git a/examples/osd/arduino-dooralert/project-conf.h b/examples/osd/arduino-dooralert/project-conf.h new file mode 100644 index 000000000..e9408e312 --- /dev/null +++ b/examples/osd/arduino-dooralert/project-conf.h @@ -0,0 +1,101 @@ +/* + * 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 PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_BATTERY 1 + +#define SICSLOWPAN_CONF_FRAG 1 + +/* For Debug: Dont allow MCU sleeping between channel checks */ +//#undef RDC_CONF_MCU_SLEEP +//#define RDC_CONF_MCU_SLEEP 0 + +/* 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 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ + +#endif /* PROJECT_RPL_WEB_CONF_H_ */ diff --git a/examples/osd/arduino-dooralert/resource_door.c b/examples/osd/arduino-dooralert/resource_door.c new file mode 100644 index 000000000..bda4a0afa --- /dev/null +++ b/examples/osd/arduino-dooralert/resource_door.c @@ -0,0 +1,42 @@ +/** + * \file + * Resource for Arduino analog read + * \author + * Harald Pichler + * + * \brief get/put pwm and period for LED pin + * + */ + +#include +#include +#include +#include "contiki.h" +#include "jsonparse.h" +/* Only coap 13 for now */ +#include "er-coap-13.h" +#include "generic_resource.h" +#include "resource_door.h" +#include "Arduino.h" + +size_t +door_v (const char *name, uint8_t is_json, char *buf, size_t bufsize) +{ + door_value = digitalRead(door_pin); + return snprintf + (buf, bufsize, "%d", door_value); +} + +GENERIC_RESOURCE \ + ( door, METHOD_GET + , "door/v" + , Moisture value + , V + , NULL + , door_v + ); + +/* + * VI settings, see coding style + * ex:ts=8:et:sw=2 + */ diff --git a/examples/osd/arduino-dooralert/resource_door.h b/examples/osd/arduino-dooralert/resource_door.h new file mode 100644 index 000000000..951b75959 --- /dev/null +++ b/examples/osd/arduino-dooralert/resource_door.h @@ -0,0 +1,30 @@ +/** + * \defgroup Arduino LED PWM example + * + * Resource definition for Arduino LED PWM module + * + * @{ + */ + +/** + * \file + * Resource definitions for the Arduino LED PWM module + * + * \author + * Ralf Schlatterbeck + */ + +#ifndef door_h +#define door_h +#include "contiki.h" +#include "contiki-net.h" +#include "erbium.h" +#include "er-coap-13.h" + +extern uint8_t door_pin; +extern uint16_t door_value; + +extern resource_t resource_door; + +#endif // door_h +/** @} */ diff --git a/examples/osd/arduino-dooralert/run.sh b/examples/osd/arduino-dooralert/run.sh new file mode 100755 index 000000000..295a9ab1d --- /dev/null +++ b/examples/osd/arduino-dooralert/run.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 diff --git a/examples/osd/arduino-dooralert/sketch.pde b/examples/osd/arduino-dooralert/sketch.pde new file mode 100644 index 000000000..a2f439ce8 --- /dev/null +++ b/examples/osd/arduino-dooralert/sketch.pde @@ -0,0 +1,34 @@ +/* + * Sample arduino sketch using contiki features. + * We turn the LED off + * We allow read the water sensor + * Unfortunately sleeping for long times in loop() isn't currently + * possible, something turns off the CPU (including PWM outputs) if a + * Proto-Thread is taking too long. We need to find out how to sleep in + * a Contiki-compatible way. + * Note that for a normal arduino sketch you won't have to include any + * of the contiki-specific files here, the sketch should just work. + */ + +extern "C" { +#include +#include "resource_door.h" + +#define LED_PIN 4 + +uint8_t door_pin = A5; +uint16_t door_value = 0; +} + +void setup (void) +{ + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, HIGH); + rest_init_engine (); + rest_activate_resource (&resource_door); +} + +void loop (void) +{ + +} From 19561efacb37d6abf06a684fc1f3e018d47dad1b Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 14 Nov 2014 15:59:22 +0100 Subject: [PATCH 182/345] update project to coap 13 --- examples/osd/pir-sensor/Makefile | 58 ++++++++------- examples/osd/pir-sensor/er-example-server.c | 13 ++-- examples/osd/pir-sensor/project-conf.h | 78 +++++++++++++++------ 3 files changed, 97 insertions(+), 52 deletions(-) diff --git a/examples/osd/pir-sensor/Makefile b/examples/osd/pir-sensor/Makefile index dbd2c1410..8a253c40d 100644 --- a/examples/osd/pir-sensor/Makefile +++ b/examples/osd/pir-sensor/Makefile @@ -1,44 +1,50 @@ all: er-example-server -# Use this target explicitly if requried: er-plugtest-server +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 CONTIKI=../../.. CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" -# for static routing, if enabled +# variable for Makefile.include 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 +CFLAGS += -DUIP_CONF_IPV6_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 += -DUIP_CONF_IPV6_RPL=0 CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" -CFLAGS += -DUIP_CONF_BUFFER_SIZE=1280 +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 endif # linker optimizations SMALL=1 # REST framework, requires WITH_COAP -ifeq ($(WITH_COAP), 7) +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else ifeq ($(WITH_COAP), 7) ${info INFO: compiling with CoAP-08} CFLAGS += -DWITH_COAP=7 CFLAGS += -DREST=coap_rest_implementation @@ -84,5 +90,5 @@ connect-router: $(CONTIKI)/tools/tunslip6 connect-router-cooja: $(CONTIKI)/tools/tunslip6 sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64 -tap0up: +connect-minimal: sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/pir-sensor/er-example-server.c b/examples/osd/pir-sensor/er-example-server.c index 88f3b31c5..7ae248eef 100644 --- a/examples/osd/pir-sensor/er-example-server.c +++ b/examples/osd/pir-sensor/er-example-server.c @@ -82,11 +82,15 @@ #include "er-coap-03.h" #elif WITH_COAP == 7 #include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" #else #warning "Erbium example without CoAP-specifc functionality" #endif /* CoAP-specific example */ -#define DEBUG 0 +#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]) @@ -232,10 +236,11 @@ pir_event_handler(resource_t *r) ++event_counter; PRINTF("PIR TICK %u for /%s\n", event_counter, r->url); - - /* Build notification. */ + + /* Build notification. */ coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ - coap_init_message(notification, COAP_TYPE_CON, CONTENT_2_05, 0 ); + coap_init_message(notification, COAP_TYPE_CON, REST.status.OK, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); /* Notify the registered observers with the given message type, observe option, and payload. */ diff --git a/examples/osd/pir-sensor/project-conf.h b/examples/osd/pir-sensor/project-conf.h index dfb9c756f..677f03352 100644 --- a/examples/osd/pir-sensor/project-conf.h +++ b/examples/osd/pir-sensor/project-conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Swedish Institute of Computer Science. + * Copyright (c) 2013, Matthias Kovatsch * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,8 +29,8 @@ * */ -#ifndef __PROJECT_RPL_WEB_CONF_H__ -#define __PROJECT_RPL_WEB_CONF_H__ +#ifndef PROJECT_ERBIUM_CONF_H_ +#define PROJECT_ERBIUM_CONF_H_ //#define PLATFORM_HAS_LEDS 1 //#define PLATFORM_HAS_BUTTON 1 @@ -38,36 +38,70 @@ //#define PLATFORM_HAS_TEMPERATURE 1 #define PLATFORM_HAS_BATTERY 1 -#define SICSLOWPAN_CONF_FRAG 1 +/* Some platforms have weird includes. */ +// #undef IEEE802154_CONF_PANID +// #define IEEE802154_CONF_PANID 0xAAAA + +/* For Debug: Dont allow MCU sleeping between channel checks */ +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 /* Disabling RDC for demo purposes. Core updates often require more memory. */ /* For projects, optimize memory and enable RDC again. */ -//#undef NETSTACK_CONF_RDC +// #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 +// enabel LEAF-NODE mode +//#define RPL_CONF_LEAF_ONLY 1 -/* Increase rpl-border-router IP-buffer when using 128. */ -#ifndef REST_MAX_CHUNK_SIZE +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE #define REST_MAX_CHUNK_SIZE 64 -#endif + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + /* Multiplies with chunk size, be aware of memory constraints. */ -#ifndef COAP_MAX_OPEN_TRANSACTIONS -#define COAP_MAX_OPEN_TRANSACTIONS 2 -#endif +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 -/* Must be <= open transaction number. */ -#ifndef COAP_MAX_OBSERVERS -#define COAP_MAX_OBSERVERS COAP_MAX_OPEN_TRANSACTIONS-1 -#endif +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ /* Reduce 802.15.4 frame queue to save RAM. */ +/* #undef QUEUEBUF_CONF_NUM -#define QUEUEBUF_CONF_NUM 4 +#define QUEUEBUF_CONF_NUM 4 +*/ -#endif /* __PROJECT_RPL_WEB_CONF_H__ */ +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ +#endif /* PROJECT_ERBIUM_CONF_H_ */ From b6139aabe30d5c9c9e11c9ed525042de2391564c Mon Sep 17 00:00:00 2001 From: Laurent Deru Date: Fri, 31 Jan 2014 09:32:44 +0100 Subject: [PATCH 183/345] Support more than one pending slip message --- core/dev/slip.c | 210 +++++++++++++++++++++++++++++++----------------- 1 file changed, 137 insertions(+), 73 deletions(-) diff --git a/core/dev/slip.c b/core/dev/slip.c index 6b8a24ceb..a2a4f6e72 100644 --- a/core/dev/slip.c +++ b/core/dev/slip.c @@ -81,7 +81,7 @@ enum { */ static uint8_t state = STATE_TWOPACKETS; -static uint16_t begin, end; +static uint16_t begin, next_free; static uint8_t rxbuf[RX_BUFSIZE]; static uint16_t pkt_end; /* SLIP_END tracker. */ @@ -153,7 +153,7 @@ slip_write(const void *_ptr, int len) static void rxbuf_init(void) { - begin = end = pkt_end = 0; + begin = next_free = pkt_end = 0; state = STATE_OK; } /*---------------------------------------------------------------------------*/ @@ -164,7 +164,7 @@ slip_poll_handler(uint8_t *outbuf, uint16_t blen) /* This is a hack and won't work across buffer edge! */ if(rxbuf[begin] == 'C') { int i; - if(begin < end && (end - begin) >= 6 + if(begin < next_free && (next_free - begin) >= 6 && memcmp(&rxbuf[begin], "CLIENT", 6) == 0) { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ memset(&rxbuf[begin], 0x0, 6); @@ -182,7 +182,7 @@ slip_poll_handler(uint8_t *outbuf, uint16_t blen) /* Used by tapslip6 to request mac for auto configure */ int i, j; char* hexchar = "0123456789abcdef"; - if(begin < end && (end - begin) >= 2 + if(begin < next_free && (next_free - begin) >= 2 && rxbuf[begin + 1] == 'M') { state = STATE_TWOPACKETS; /* Interrupts do nothing. */ rxbuf[begin] = 0; @@ -210,37 +210,109 @@ slip_poll_handler(uint8_t *outbuf, uint16_t blen) */ if(begin != pkt_end) { uint16_t len; + uint16_t cur_next_free; + uint16_t cur_ptr; + int esc = 0; if(begin < pkt_end) { - len = pkt_end - begin; - if(len > blen) { - len = 0; - } else { - memcpy(outbuf, &rxbuf[begin], len); + uint16_t i; + len = 0; + for(i = begin; i < pkt_end; ++i) { + if(len > blen) { + len = 0; + break; + } + if (esc) { + if(rxbuf[i] == SLIP_ESC_ESC) { + outbuf[len] = SLIP_ESC; + len++; + } else if(rxbuf[i] == SLIP_ESC_END) { + outbuf[len] = SLIP_END; + len++; + } + esc = 0; + } else if(rxbuf[i] == SLIP_ESC) { + esc = 1; + } else { + outbuf[len] = rxbuf[i]; + len++; + } } } else { - len = (RX_BUFSIZE - begin) + (pkt_end - 0); - if(len > blen) { - len = 0; - } else { - unsigned i; - for(i = begin; i < RX_BUFSIZE; i++) { - *outbuf++ = rxbuf[i]; - } - for(i = 0; i < pkt_end; i++) { - *outbuf++ = rxbuf[i]; - } + uint16_t i; + len = 0; + for(i = begin; i < RX_BUFSIZE; ++i) { + if(len > blen) { + len = 0; + break; + } + if (esc) { + if(rxbuf[i] == SLIP_ESC_ESC) { + outbuf[len] = SLIP_ESC; + len++; + } else if(rxbuf[i] == SLIP_ESC_END) { + outbuf[len] = SLIP_END; + len++; + } + esc = 0; + } else if(rxbuf[i] == SLIP_ESC) { + esc = 1; + } else { + outbuf[len] = rxbuf[i]; + len++; + } + } + for(i = 0; i < pkt_end; ++i) { + if(len > blen) { + len = 0; + break; + } + if (esc) { + if(rxbuf[i] == SLIP_ESC_ESC) { + outbuf[len] = SLIP_ESC; + len++; + } else if(rxbuf[i] == SLIP_ESC_END) { + outbuf[len] = SLIP_END; + len++; + } + esc = 0; + } else if(rxbuf[i] == SLIP_ESC) { + esc = 1; + } else { + outbuf[len] = rxbuf[i]; + len++; + } } } /* Remove data from buffer together with the copied packet. */ - begin = pkt_end; - if(state == STATE_TWOPACKETS) { - pkt_end = end; - state = STATE_OK; /* Assume no bytes where lost! */ - - /* One more packet is buffered, need to be polled again! */ - process_poll(&slip_process); + pkt_end = pkt_end + 1; + if(pkt_end == RX_BUFSIZE) { + pkt_end = 0; + } + if(pkt_end != next_free) { + cur_next_free = next_free; + cur_ptr = pkt_end; + while(cur_ptr != cur_next_free) { + if(rxbuf[cur_ptr] == SLIP_END) { + uint16_t tmp_begin = pkt_end; + pkt_end = cur_ptr; + begin = tmp_begin; + /* One more packet is buffered, need to be polled again! */ + process_poll(&slip_process); + break; + } + cur_ptr++; + if(cur_ptr == RX_BUFSIZE) { + cur_ptr = 0; + } + } + if(cur_ptr == cur_next_free) { + /* no more pending full packet found */ + begin = pkt_end; + } + } else { + begin = pkt_end; } return len; } @@ -316,71 +388,42 @@ PROCESS_THREAD(slip_process, ev, data) int slip_input_byte(unsigned char c) { + uint16_t cur_end; switch(state) { case STATE_RUBBISH: if(c == SLIP_END) { state = STATE_OK; } return 0; - - case STATE_TWOPACKETS: /* Two packets are already buffered! */ - return 0; case STATE_ESC: - if(c == SLIP_ESC_END) { - c = SLIP_END; - } else if(c == SLIP_ESC_ESC) { - c = SLIP_ESC; - } else { + if(c != SLIP_ESC_END && c != SLIP_ESC_ESC) { state = STATE_RUBBISH; SLIP_STATISTICS(slip_rubbish++); - end = pkt_end; /* remove rubbish */ + next_free = pkt_end; /* remove rubbish */ return 0; } state = STATE_OK; break; + } - case STATE_OK: - if(c == SLIP_ESC) { - state = STATE_ESC; - return 0; - } else if(c == SLIP_END) { - /* - * We have a new packet, possibly of zero length. - * - * There may already be one packet buffered. - */ - if(end != pkt_end) { /* Non zero length. */ - if(begin == pkt_end) { /* None buffered. */ - pkt_end = end; - } else { - state = STATE_TWOPACKETS; - SLIP_STATISTICS(slip_twopackets++); - } - process_poll(&slip_process); - return 1; - } - return 0; - } - break; + if(c == SLIP_ESC) { + state = STATE_ESC; } /* add_char: */ - { - unsigned next; - next = end + 1; - if(next == RX_BUFSIZE) { - next = 0; - } - if(next == begin) { /* rxbuf is full */ - state = STATE_RUBBISH; - SLIP_STATISTICS(slip_overflow++); - end = pkt_end; /* remove rubbish */ - return 0; - } - rxbuf[end] = c; - end = next; + cur_end = next_free; + next_free = next_free + 1; + if(next_free == RX_BUFSIZE) { + next_free = 0; } + if(next_free == begin) { /* rxbuf is full */ + state = STATE_RUBBISH; + SLIP_STATISTICS(slip_overflow++); + next_free = pkt_end; /* remove rubbish */ + return 0; + } + rxbuf[cur_end] = c; /* There could be a separate poll routine for this. */ if(c == 'T' && rxbuf[begin] == 'C') { @@ -388,6 +431,27 @@ slip_input_byte(unsigned char c) return 1; } + if(c == SLIP_END) { + /* + * We have a new packet, possibly of zero length. + * + * There may already be one packet buffered. + */ + if(cur_end != pkt_end) { /* Non zero length. */ + if(begin == pkt_end) { /* None buffered. */ + pkt_end = cur_end; + } else { + SLIP_STATISTICS(slip_twopackets++); + } + process_poll(&slip_process); + return 1; + } else { + /* Empty packet, reset the pointer */ + next_free = cur_end; + } + return 0; + } + return 0; } /*---------------------------------------------------------------------------*/ From 7d60fdc8b5b94f8d32a03304ef78c8167e0223fd Mon Sep 17 00:00:00 2001 From: Wojciech Bober Date: Sat, 24 Oct 2015 18:21:05 +0200 Subject: [PATCH 184/345] Allow for using a fixed frame header length. When SICSLOWPAN_FRAMER_HDRLEN is defined its value is used as a frame header length. This allows for using sicslowpan without calling a framer. This is usefull if framer is not used on a given platform or when header length is always the same. In addition this commit also fixes an inline define. --- core/net/ipv6/sicslowpan.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/net/ipv6/sicslowpan.c b/core/net/ipv6/sicslowpan.c index d0bf14799..7fbdbefc7 100644 --- a/core/net/ipv6/sicslowpan.c +++ b/core/net/ipv6/sicslowpan.c @@ -169,6 +169,14 @@ void uip_log(char *msg); #define COMPRESSION_THRESHOLD 0 #endif +/** \brief Fixed size of a frame header. This value is + * used in case framer returns an error or if SICSLOWPAN_USE_FIXED_HDRLEN + * is defined. + */ +#ifndef SICSLOWPAN_FIXED_HDRLEN +#define SICSLOWPAN_FIXED_HDRLEN 21 +#endif + /** \name General variables * @{ */ @@ -1345,16 +1353,15 @@ output(const uip_lladdr_t *localdest) /* Calculate NETSTACK_FRAMER's header length, that will be added in the NETSTACK_RDC. * We calculate it here only to make a better decision of whether the outgoing packet * needs to be fragmented or not. */ -#define USE_FRAMER_HDRLEN 1 -#if USE_FRAMER_HDRLEN +#ifndef SICSLOWPAN_USE_FIXED_HDRLEN packetbuf_set_addr(PACKETBUF_ADDR_RECEIVER, &dest); framer_hdrlen = NETSTACK_FRAMER.length(); if(framer_hdrlen < 0) { /* Framing failed, we assume the maximum header length */ - framer_hdrlen = 21; + framer_hdrlen = SICSLOWPAN_FIXED_HDRLEN; } #else /* USE_FRAMER_HDRLEN */ - framer_hdrlen = 21; + framer_hdrlen = SICSLOWPAN_FIXED_HDRLEN; #endif /* USE_FRAMER_HDRLEN */ max_payload = MAC_MAX_PAYLOAD - framer_hdrlen; From c946c1ccbb7f8afafbacb2e17d77ee910fe23d23 Mon Sep 17 00:00:00 2001 From: Wojciech Bober Date: Wed, 23 Dec 2015 21:21:51 +0100 Subject: [PATCH 185/345] Fixed unsused variable warning when SICSLOWPAN_CONF_FRAG is undefined --- core/net/ipv6/sicslowpan.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/net/ipv6/sicslowpan.c b/core/net/ipv6/sicslowpan.c index 7fbdbefc7..5453d9e21 100644 --- a/core/net/ipv6/sicslowpan.c +++ b/core/net/ipv6/sicslowpan.c @@ -1285,11 +1285,6 @@ output(const uip_lladdr_t *localdest) /* The MAC address of the destination of the packet */ linkaddr_t dest; -#if SICSLOWPAN_CONF_FRAG - /* Number of bytes processed. */ - uint16_t processed_ip_out_len; -#endif /* SICSLOWPAN_CONF_FRAG */ - /* init */ uncomp_hdr_len = 0; packetbuf_hdr_len = 0; @@ -1367,6 +1362,9 @@ output(const uip_lladdr_t *localdest) max_payload = MAC_MAX_PAYLOAD - framer_hdrlen; if((int)uip_len - (int)uncomp_hdr_len > max_payload - (int)packetbuf_hdr_len) { #if SICSLOWPAN_CONF_FRAG + /* Number of bytes processed. */ + uint16_t processed_ip_out_len; + struct queuebuf *q; uint16_t frag_tag; From 84cd7a4e9211c091f532f58c7a3877a83de49861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Tue, 24 May 2016 19:16:33 +0200 Subject: [PATCH 186/345] oma-lwm2m: Add functionality to send object instance list as core link format --- apps/oma-lwm2m/lwm2m-engine.c | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/apps/oma-lwm2m/lwm2m-engine.c b/apps/oma-lwm2m/lwm2m-engine.c index e2f6bba7c..ffdacb0e1 100644 --- a/apps/oma-lwm2m/lwm2m-engine.c +++ b/apps/oma-lwm2m/lwm2m-engine.c @@ -585,6 +585,37 @@ get_resource(const lwm2m_instance_t *instance, lwm2m_context_t *context) return NULL; } /*---------------------------------------------------------------------------*/ +/** + * @brief Write a list of object instances as a CoRE Link-format list + */ +static int +write_object_instances_link(const lwm2m_object_t *object, + char *buffer, size_t size) +{ + const lwm2m_instance_t *instance; + int len, rdlen, i; + + PRINTF("", object->id); + rdlen = snprintf(buffer, size, "", + object->id); + if(rdlen < 0 || rdlen >= size) { + return -1; + } + + for(i = 0; i < object->count; i++) { + instance = &object->instances[i]; + PRINTF(",", object->id, instance->id); + + len = snprintf(&buffer[rdlen], size - rdlen, + ",<%d/%d>", object->id, instance->id); + rdlen += len; + if(len < 0 || rdlen >= size) { + return -1; + } + } + return rdlen; +} +/*---------------------------------------------------------------------------*/ static int write_rd_link_data(const lwm2m_object_t *object, const lwm2m_instance_t *instance, @@ -992,6 +1023,23 @@ lwm2m_engine_handler(const lwm2m_object_t *object, REST.set_header_content_type(response, REST.type.APPLICATION_JSON); } } + } else if(depth == 1) { + /* produce a list of instances */ + if(method != METHOD_GET) { + REST.set_response_status(response, METHOD_NOT_ALLOWED_4_05); + } else { + int rdlen; + PRINTF("Sending instance list for object %u\n", object->id); + /* TODO: if(accept == APPLICATION_LINK_FORMAT) { */ + rdlen = write_object_instances_link(object, (char *)buffer, preferred_size); + if(rdlen < 0) { + PRINTF("Failed to generate object response\n"); + REST.set_response_status(response, SERVICE_UNAVAILABLE_5_03); + return; + } + REST.set_header_content_type(response, REST.type.APPLICATION_LINK_FORMAT); + REST.set_response_payload(response, buffer, rdlen); + } } } /*---------------------------------------------------------------------------*/ From 14cdb3088682cca6dccaa70c4f46da0c6f606291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Tue, 24 May 2016 19:28:17 +0200 Subject: [PATCH 187/345] oma-lwm2m: Only send active instances --- apps/oma-lwm2m/lwm2m-engine.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/oma-lwm2m/lwm2m-engine.c b/apps/oma-lwm2m/lwm2m-engine.c index ffdacb0e1..d12f712f3 100644 --- a/apps/oma-lwm2m/lwm2m-engine.c +++ b/apps/oma-lwm2m/lwm2m-engine.c @@ -603,6 +603,9 @@ write_object_instances_link(const lwm2m_object_t *object, } for(i = 0; i < object->count; i++) { + if((object->instances[i].flag & LWM2M_INSTANCE_FLAG_USED) == 0) { + continue; + } instance = &object->instances[i]; PRINTF(",", object->id, instance->id); From ac6a1c52553b68ab0edb472ac98bf5ac22b856c6 Mon Sep 17 00:00:00 2001 From: Billy Kozak Date: Fri, 10 Jul 2015 15:44:46 -0600 Subject: [PATCH 188/345] Fixed wrong first cycle_start The first time that powercycle() runs, cycle_start is incremented by CHECK_TIME twice which causes the second cycle to be late. This commit fixes this. --- core/net/mac/contikimac/contikimac.c | 96 ++++++++++++++++------------ 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/core/net/mac/contikimac/contikimac.c b/core/net/mac/contikimac/contikimac.c index 104478282..290273fa1 100644 --- a/core/net/mac/contikimac/contikimac.c +++ b/core/net/mac/contikimac/contikimac.c @@ -289,9 +289,15 @@ off(void) } } /*---------------------------------------------------------------------------*/ -static volatile rtimer_clock_t cycle_start; static void powercycle_wrapper(struct rtimer *t, void *ptr); static char powercycle(struct rtimer *t, void *ptr); +/*---------------------------------------------------------------------------*/ +static volatile rtimer_clock_t cycle_start; +#if SYNC_CYCLE_STARTS +static volatile rtimer_clock_t sync_cycle_start; +static volatile uint8_t sync_cycle_phase; +#endif +/*---------------------------------------------------------------------------*/ static void schedule_powercycle(struct rtimer *t, rtimer_clock_t time) { @@ -340,7 +346,7 @@ powercycle_turn_radio_off(void) #if CONTIKIMAC_CONF_COMPOWER uint8_t was_on = radio_is_on; #endif /* CONTIKIMAC_CONF_COMPOWER */ - + if(we_are_sending == 0 && we_are_receiving_burst == 0) { off(); #if CONTIKIMAC_CONF_COMPOWER @@ -365,13 +371,34 @@ powercycle_wrapper(struct rtimer *t, void *ptr) powercycle(t, ptr); } /*---------------------------------------------------------------------------*/ +static void +advance_cycle_start(void) +{ + #if SYNC_CYCLE_STARTS + + /* Compute cycle start when RTIMER_ARCH_SECOND is not a multiple + of CHANNEL_CHECK_RATE */ + if(sync_cycle_phase++ == NETSTACK_RDC_CHANNEL_CHECK_RATE) { + sync_cycle_phase = 0; + sync_cycle_start += RTIMER_ARCH_SECOND; + cycle_start = sync_cycle_start; + } else if( (RTIMER_ARCH_SECOND * NETSTACK_RDC_CHANNEL_CHECK_RATE) > 65535) { + uint32_t phase_time = sync_cycle_phase*RTIMER_ARCH_SECOND; + + cycle_start = sync_cycle_start + phase_time/NETSTACK_RDC_CHANNEL_CHECK_RATE; + } else { + unsigned phase_time = sync_cycle_phase*RTIMER_ARCH_SECOND; + + cycle_start = sync_cycle_start + phase_time/NETSTACK_RDC_CHANNEL_CHECK_RATE; + } + #endif + + cycle_start += CYCLE_TIME; +} +/*---------------------------------------------------------------------------*/ static char powercycle(struct rtimer *t, void *ptr) { -#if SYNC_CYCLE_STARTS - static volatile rtimer_clock_t sync_cycle_start; - static volatile uint8_t sync_cycle_phase; -#endif PT_BEGIN(&pt); @@ -385,24 +412,6 @@ powercycle(struct rtimer *t, void *ptr) static uint8_t packet_seen; static uint8_t count; -#if SYNC_CYCLE_STARTS - /* Compute cycle start when RTIMER_ARCH_SECOND is not a multiple - of CHANNEL_CHECK_RATE */ - if(sync_cycle_phase++ == NETSTACK_RDC_CHANNEL_CHECK_RATE) { - sync_cycle_phase = 0; - sync_cycle_start += RTIMER_ARCH_SECOND; - cycle_start = sync_cycle_start; - } else { -#if (RTIMER_ARCH_SECOND * NETSTACK_RDC_CHANNEL_CHECK_RATE) > 65535 - cycle_start = sync_cycle_start + ((unsigned long)(sync_cycle_phase*RTIMER_ARCH_SECOND))/NETSTACK_RDC_CHANNEL_CHECK_RATE; -#else - cycle_start = sync_cycle_start + (sync_cycle_phase*RTIMER_ARCH_SECOND)/NETSTACK_RDC_CHANNEL_CHECK_RATE; -#endif - } -#else - cycle_start += CYCLE_TIME; -#endif - packet_seen = 0; for(count = 0; count < CCA_COUNT_MAX; ++count) { @@ -483,22 +492,25 @@ powercycle(struct rtimer *t, void *ptr) } } - if(RTIMER_CLOCK_LT(RTIMER_NOW() - cycle_start, CYCLE_TIME - CHECK_TIME * 4)) { + advance_cycle_start(); + + if(RTIMER_CLOCK_LT(RTIMER_NOW() , cycle_start - CHECK_TIME * 4)) { /* Schedule the next powercycle interrupt, or sleep the mcu - until then. Sleeping will not exit from this interrupt, so - ensure an occasional wake cycle or foreground processing will - be blocked until a packet is detected */ + until then. Sleeping will not exit from this interrupt, so + ensure an occasional wake cycle or foreground processing will + be blocked until a packet is detected */ #if RDC_CONF_MCU_SLEEP + static uint8_t sleepcycle; if((sleepcycle++ < 16) && !we_are_sending && !radio_is_on) { - rtimer_arch_sleep(CYCLE_TIME - (RTIMER_NOW() - cycle_start)); + rtimer_arch_sleep(RTIMER_NOW() - cycle_start); } else { sleepcycle = 0; - schedule_powercycle_fixed(t, CYCLE_TIME + cycle_start); + schedule_powercycle_fixed(t, cycle_start); PT_YIELD(&pt); } #else - schedule_powercycle_fixed(t, CYCLE_TIME + cycle_start); + schedule_powercycle_fixed(t, cycle_start); PT_YIELD(&pt); #endif } @@ -549,13 +561,13 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr, int len; uint8_t seqno; #endif - + /* Exit if RDC and radio were explicitly turned off */ if(!contikimac_is_on && !contikimac_keep_radio_on) { PRINTF("contikimac: radio is turned off\n"); return MAC_TX_ERR_FATAL; } - + if(packetbuf_totlen() == 0) { PRINTF("contikimac: send_packet data len 0\n"); return MAC_TX_ERR_FATAL; @@ -597,10 +609,10 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr, return MAC_TX_ERR_FATAL; } } - + transmit_len = packetbuf_totlen(); NETSTACK_RADIO.prepare(packetbuf_hdrptr(), transmit_len); - + if(!is_broadcast && !is_receiver_awake) { #if WITH_PHASE_OPTIMIZATION ret = phase_wait(packetbuf_addr(PACKETBUF_ADDR_RECEIVER), @@ -612,9 +624,9 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr, if(ret != PHASE_UNKNOWN) { is_known_receiver = 1; } -#endif /* WITH_PHASE_OPTIMIZATION */ +#endif /* WITH_PHASE_OPTIMIZATION */ } - + /* By setting we_are_sending to one, we ensure that the rtimer @@ -632,7 +644,7 @@ send_packet(mac_callback_t mac_callback, void *mac_callback_ptr, NETSTACK_RADIO.receiving_packet(), NETSTACK_RADIO.pending_packet()); return MAC_TX_COLLISION; } - + /* Switch off the radio to ensure that we didn't start sending while the radio was doing a channel check. */ off(); @@ -838,7 +850,7 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) int ret; int is_receiver_awake; int pending; - + if(buf_list == NULL) { return; } @@ -850,7 +862,7 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) mac_call_sent_callback(sent, ptr, MAC_TX_COLLISION, 1); return; } - + /* Create and secure frames in advance */ curr = buf_list; do { @@ -867,13 +879,13 @@ qsend_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *buf_list) mac_call_sent_callback(sent, ptr, MAC_TX_ERR_FATAL, 1); return; } - + packetbuf_set_attr(PACKETBUF_ATTR_IS_CREATED_AND_SECURED, 1); queuebuf_update_from_packetbuf(curr->buf); } curr = next; } while(next != NULL); - + /* The receiver needs to be awoken before we send */ is_receiver_awake = 0; curr = buf_list; From ac16fb9e2bae6d05ceebdfc87cb9eaa21b79ce9b Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Wed, 20 Apr 2016 11:46:52 +0200 Subject: [PATCH 189/345] TSCH fixes for the short-address case --- core/net/mac/tsch/tsch-packet.c | 6 +++--- core/net/mac/tsch/tsch.c | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/net/mac/tsch/tsch-packet.c b/core/net/mac/tsch/tsch-packet.c index 17601d054..52c7b4cc8 100644 --- a/core/net/mac/tsch/tsch-packet.c +++ b/core/net/mac/tsch/tsch-packet.c @@ -85,12 +85,12 @@ tsch_packet_create_eack(uint8_t *buf, int buf_size, p.seq = seqno; #if TSCH_PACKET_EACK_WITH_DEST_ADDR if(dest_addr != NULL) { - p.fcf.dest_addr_mode = FRAME802154_LONGADDRMODE; + p.fcf.dest_addr_mode = LINKADDR_SIZE > 2 ? FRAME802154_LONGADDRMODE : FRAME802154_SHORTADDRMODE;; linkaddr_copy((linkaddr_t *)&p.dest_addr, dest_addr); } #endif #if TSCH_PACKET_EACK_WITH_SRC_ADDR - p.fcf.src_addr_mode = FRAME802154_LONGADDRMODE; + p.fcf.src_addr_mode = LINKADDR_SIZE > 2 ? FRAME802154_LONGADDRMODE : FRAME802154_SHORTADDRMODE;; p.src_pid = IEEE802154_PANID; linkaddr_copy((linkaddr_t *)&p.src_addr, &linkaddr_node_addr); #endif @@ -208,7 +208,7 @@ tsch_packet_create_eb(uint8_t *buf, int buf_size, uint8_t seqno, p.fcf.frame_type = FRAME802154_BEACONFRAME; p.fcf.ie_list_present = 1; p.fcf.frame_version = FRAME802154_IEEE802154E_2012; - p.fcf.src_addr_mode = FRAME802154_LONGADDRMODE; + p.fcf.src_addr_mode = LINKADDR_SIZE > 2 ? FRAME802154_LONGADDRMODE : FRAME802154_SHORTADDRMODE; p.fcf.dest_addr_mode = FRAME802154_SHORTADDRMODE; p.seq = seqno; p.fcf.sequence_number_suppression = FRAME802154_SUPPR_SEQNO; diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index 2085f39ff..32942686e 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -69,8 +69,10 @@ /* Use to collect link statistics even on Keep-Alive, even though they were * not sent from an upper layer and don't have a valid packet_sent callback */ #ifndef TSCH_LINK_NEIGHBOR_CALLBACK +#if NETSTACK_CONF_WITH_IPV6 void uip_ds6_link_neighbor_callback(int status, int numtx); #define TSCH_LINK_NEIGHBOR_CALLBACK(dest, status, num) uip_ds6_link_neighbor_callback(status, num) +#endif /* NETSTACK_CONF_WITH_IPV6 */ #endif /* TSCH_LINK_NEIGHBOR_CALLBACK */ /* 802.15.4 duplicate frame detection */ From 78f04fda8351e43ec2b372823267e1a5279fb9c7 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Wed, 20 Apr 2016 11:51:06 +0200 Subject: [PATCH 190/345] Added example of TSCH used with Rime --- examples/rime-tsch/Makefile | 10 +++ examples/rime-tsch/node.c | 100 ++++++++++++++++++++++++++++++ examples/rime-tsch/project-conf.h | 88 ++++++++++++++++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 examples/rime-tsch/Makefile create mode 100644 examples/rime-tsch/node.c create mode 100644 examples/rime-tsch/project-conf.h diff --git a/examples/rime-tsch/Makefile b/examples/rime-tsch/Makefile new file mode 100644 index 000000000..8d9ac3116 --- /dev/null +++ b/examples/rime-tsch/Makefile @@ -0,0 +1,10 @@ +CONTIKI=../.. +CONTIKI_PROJECT = node +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + +CONTIKI_WITH_RIME = 1 +MODULES += core/net/mac/tsch + +all: $(CONTIKI_PROJECT) + +include $(CONTIKI)/Makefile.include diff --git a/examples/rime-tsch/node.c b/examples/rime-tsch/node.c new file mode 100644 index 000000000..91899c4b4 --- /dev/null +++ b/examples/rime-tsch/node.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2016, Inria. + * 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 + * An example of Rime/TSCH + * \author + * Simon Duquennoy + * + */ + +#include +#include "contiki-conf.h" +#include "net/netstack.h" +#include "net/rime/rime.h" +#include "net/mac/tsch/tsch.h" + +const linkaddr_t coordinator_addr = { { 1, 0 } }; +const linkaddr_t sender_addr = { { 2, 0 } }; +const linkaddr_t destination_addr = { { 1, 0 } }; + +/*---------------------------------------------------------------------------*/ +PROCESS(unicast_test_process, "Rime Node"); +AUTOSTART_PROCESSES(&unicast_test_process); + +/*---------------------------------------------------------------------------*/ +static void +recv_uc(struct unicast_conn *c, const linkaddr_t *from) +{ + printf("App: unicast message received from %u.%u\n", + from->u8[0], from->u8[1]); +} +/*---------------------------------------------------------------------------*/ +static void +sent_uc(struct unicast_conn *ptr, int status, int num_tx) +{ + printf("App: unicast message sent, status %u, num_tx %u\n", + status, num_tx); +} + +static const struct unicast_callbacks unicast_callbacks = { recv_uc, sent_uc }; +static struct unicast_conn uc; + +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(unicast_test_process, ev, data) +{ + PROCESS_BEGIN(); + + tsch_set_coordinator(linkaddr_cmp(&coordinator_addr, &linkaddr_node_addr)); + NETSTACK_MAC.on(); + + unicast_open(&uc, 146, &unicast_callbacks); + + while(1) { + static struct etimer et; + + etimer_set(&et, CLOCK_SECOND); + + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + + packetbuf_copyfrom("Hello", 5); + + if(linkaddr_cmp(&sender_addr, &linkaddr_node_addr)) { + printf("App: sending unicast message to %u.%u\n", destination_addr.u8[0], destination_addr.u8[1]); + unicast_send(&uc, &destination_addr); + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/rime-tsch/project-conf.h b/examples/rime-tsch/project-conf.h new file mode 100644 index 000000000..8a48917db --- /dev/null +++ b/examples/rime-tsch/project-conf.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2016, Inria. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ + +/** + * \file + * Project config file + * \author + * Simon Duquennoy + * + */ + +#ifndef __PROJECT_CONF_H__ +#define __PROJECT_CONF_H__ + +/* Netstack layers */ +#undef NETSTACK_CONF_MAC +#define NETSTACK_CONF_MAC tschmac_driver +#undef NETSTACK_CONF_RDC +#define NETSTACK_CONF_RDC nordc_driver +#undef NETSTACK_CONF_FRAMER +#define NETSTACK_CONF_FRAMER framer_802154 + +/* IEEE802.15.4 frame version */ +#undef FRAME802154_CONF_VERSION +#define FRAME802154_CONF_VERSION FRAME802154_IEEE802154E_2012 + +#undef TSCH_CONF_AUTOSELECT_TIME_SOURCE +#define TSCH_CONF_AUTOSELECT_TIME_SOURCE 1 + +/* Needed for cc2420 platforms only */ +/* Disable DCO calibration (uses timerB) */ +#undef DCOSYNCH_CONF_ENABLED +#define DCOSYNCH_CONF_ENABLED 0 +/* Enable SFD timestamps (uses timerB) */ +#undef CC2420_CONF_SFD_TIMESTAMPS +#define CC2420_CONF_SFD_TIMESTAMPS 1 + +/* TSCH logging. 0: disabled. 1: basic log. 2: with delayed + * log messages from interrupt */ +#undef TSCH_LOG_CONF_LEVEL +#define TSCH_LOG_CONF_LEVEL 2 + +/* IEEE802.15.4 PANID */ +#undef IEEE802154_CONF_PANID +#define IEEE802154_CONF_PANID 0xabcd + +/* Do not start TSCH at init, wait for NETSTACK_MAC.on() */ +#undef TSCH_CONF_AUTOSTART +#define TSCH_CONF_AUTOSTART 0 + +/* 6TiSCH minimal schedule length. + * Larger values result in less frequent active slots: reduces capacity and saves energy. */ +#undef TSCH_SCHEDULE_CONF_DEFAULT_LENGTH +#define TSCH_SCHEDULE_CONF_DEFAULT_LENGTH 3 + +#undef TSCH_LOG_CONF_ID_FROM_LINKADDR +#define TSCH_LOG_CONF_ID_FROM_LINKADDR(addr) ((addr) ? (addr)->u8[LINKADDR_SIZE - 2] : 0) + +#endif /* __PROJECT_CONF_H__ */ From 809883e632f02527c74ca538a2f74f301137771e Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Fri, 3 Jun 2016 15:53:16 +0200 Subject: [PATCH 191/345] Making example tsch-rime more flexible --- examples/rime-tsch/node.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/rime-tsch/node.c b/examples/rime-tsch/node.c index 91899c4b4..b8c017779 100644 --- a/examples/rime-tsch/node.c +++ b/examples/rime-tsch/node.c @@ -45,7 +45,6 @@ #include "net/mac/tsch/tsch.h" const linkaddr_t coordinator_addr = { { 1, 0 } }; -const linkaddr_t sender_addr = { { 2, 0 } }; const linkaddr_t destination_addr = { { 1, 0 } }; /*---------------------------------------------------------------------------*/ @@ -89,7 +88,7 @@ PROCESS_THREAD(unicast_test_process, ev, data) packetbuf_copyfrom("Hello", 5); - if(linkaddr_cmp(&sender_addr, &linkaddr_node_addr)) { + if(!linkaddr_cmp(&destination_addr, &linkaddr_node_addr)) { printf("App: sending unicast message to %u.%u\n", destination_addr.u8[0], destination_addr.u8[1]); unicast_send(&uc, &destination_addr); } From 63565b109d7c2e5aab5eb812d54924017f500247 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Fri, 10 Jun 2016 20:57:58 +0200 Subject: [PATCH 192/345] Fix TSCH_AUTOSELECT_TIME_SOURCE to work with 2-byte addresses and with the new nbr_table_add_lladdr interface --- core/net/mac/tsch/tsch.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index 32942686e..af8600400 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -45,6 +45,7 @@ #include "net/netstack.h" #include "net/packetbuf.h" #include "net/queuebuf.h" +#include "net/nbr-table.h" #include "net/mac/framer-802154.h" #include "net/mac/tsch/tsch.h" #include "net/mac/tsch/tsch-slot-operation.h" @@ -282,13 +283,13 @@ eb_input(struct input_packet *current_input) #if TSCH_AUTOSELECT_TIME_SOURCE if(!tsch_is_coordinator) { /* Maintain EB received counter for every neighbor */ - struct eb_stat *stat = (struct eb_stat *)nbr_table_get_from_lladdr(eb_stats, &frame.src_addr); + struct eb_stat *stat = (struct eb_stat *)nbr_table_get_from_lladdr(eb_stats, (linkaddr_t *)&frame.src_addr); if(stat == NULL) { - stat = (struct eb_stat *)nbr_table_add_lladdr(eb_stats, &frame.src_addr); + stat = (struct eb_stat *)nbr_table_add_lladdr(eb_stats, (linkaddr_t *)&frame.src_addr, NBR_TABLE_REASON_MAC, NULL); } if(stat != NULL) { stat->rx_count++; - stat->jp = eb_ies.join_priority; + stat->jp = eb_ies.ie_join_priority; best_neighbor_eb_count = MAX(best_neighbor_eb_count, stat->rx_count); } /* Select best time source */ From d52cf767e594d4defa2d57de8c8deceee0663828 Mon Sep 17 00:00:00 2001 From: jcook Date: Sun, 12 Jun 2016 06:45:04 +0200 Subject: [PATCH 193/345] Remove useless `else' block as def_route will be removed before if existed. --- core/net/rpl/rpl-dag.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/net/rpl/rpl-dag.c b/core/net/rpl/rpl-dag.c index 2077c4eb4..9bf5b45c1 100644 --- a/core/net/rpl/rpl-dag.c +++ b/core/net/rpl/rpl-dag.c @@ -554,13 +554,6 @@ rpl_set_default_route(rpl_instance_t *instance, uip_ipaddr_t *from) if(instance->def_route == NULL) { return 0; } - } else { - PRINTF("RPL: Removing default route\n"); - if(instance->def_route != NULL) { - uip_ds6_defrt_rm(instance->def_route); - } else { - PRINTF("RPL: Not actually removing default route, since instance had no default route\n"); - } } return 1; } From c2a0f739f77efdfaefd60364848f976c7791b500 Mon Sep 17 00:00:00 2001 From: Tiago Koji Castro Shibata Date: Thu, 17 Sep 2015 22:38:11 -0300 Subject: [PATCH 194/345] Compilation targeting c64 Adds some casts required by cc65 compiler and small fixes --- apps/webserver/httpd-cgi.c | 5 ++++- core/net/ipv6/uip-nd6.c | 3 ++- core/net/ipv6/uip6.c | 3 +++ cpu/6502/net/ethernet-drv.c | 8 +++++++- cpu/6502/net/ethernet-drv.h | 4 ++++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/webserver/httpd-cgi.c b/apps/webserver/httpd-cgi.c index d0e7e9532..506d024d2 100644 --- a/apps/webserver/httpd-cgi.c +++ b/apps/webserver/httpd-cgi.c @@ -155,10 +155,13 @@ make_tcp_stats(void *arg) { struct uip_conn *conn; struct httpd_state *s = (struct httpd_state *)arg; +#if NETSTACK_CONF_WITH_IPV6 + char buf[48]; +#endif + conn = &uip_conns[s->u.count]; #if NETSTACK_CONF_WITH_IPV6 - char buf[48]; httpd_sprint_ip6(conn->ripaddr, buf); return snprintf((char *)uip_appdata, uip_mss(), "%d%s:%u%s%u%u%c %c\r\n", diff --git a/core/net/ipv6/uip-nd6.c b/core/net/ipv6/uip-nd6.c index 218507228..d938ac2a0 100644 --- a/core/net/ipv6/uip-nd6.c +++ b/core/net/ipv6/uip-nd6.c @@ -662,7 +662,8 @@ rs_input(void) } if(memcmp(&nd6_opt_llao[UIP_ND6_OPT_DATA_OFFSET], lladdr, UIP_LLADDR_LEN) != 0) { - uip_ds6_nbr_t nbr_data = *nbr; + uip_ds6_nbr_t nbr_data; + nbr_data = *nbr; uip_ds6_nbr_rm(nbr); nbr = uip_ds6_nbr_add(&UIP_IP_BUF->srcipaddr, &lladdr_aligned, 0, NBR_STALE, NBR_TABLE_REASON_IPV6_ND, NULL); diff --git a/core/net/ipv6/uip6.c b/core/net/ipv6/uip6.c index a54754371..f783076d1 100644 --- a/core/net/ipv6/uip6.c +++ b/core/net/ipv6/uip6.c @@ -73,6 +73,7 @@ #include "sys/cc.h" #include "net/ip/uip.h" +#include "net/ip/uip_arch.h" #include "net/ip/uipopt.h" #include "net/ipv6/uip-icmp6.h" #include "net/ipv6/uip-nd6.h" @@ -1854,8 +1855,10 @@ uip_process(uint8_t flag) if((UIP_TCP_BUF->flags & TCP_SYN)) { if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_RCVD) { goto tcp_send_synack; +#if UIP_ACTIVE_OPEN } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) { goto tcp_send_syn; +#endif } } goto tcp_send_ack; diff --git a/cpu/6502/net/ethernet-drv.c b/cpu/6502/net/ethernet-drv.c index d5e2b80fa..d5348e644 100644 --- a/cpu/6502/net/ethernet-drv.c +++ b/cpu/6502/net/ethernet-drv.c @@ -34,17 +34,23 @@ #include "contiki-net.h" #include "net/ethernet.h" +#include "net/ip/tcpip.h" #include "net/ipv4/uip-neighbor.h" #include "net/ethernet-drv.h" #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) +#define IPBUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) PROCESS(ethernet_process, "Ethernet driver"); /*---------------------------------------------------------------------------*/ uint8_t +#if NETSTACK_CONF_WITH_IPV6 +ethernet_output(const uip_lladdr_t *) +#else ethernet_output(void) +#endif { uip_arp_out(); ethernet_send(); @@ -61,7 +67,7 @@ pollhandler(void) if(uip_len > 0) { #if NETSTACK_CONF_WITH_IPV6 if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) { - uip_neighbor_add(&IPBUF->srcipaddr, &BUF->src); + uip_neighbor_add(&IPBUF->srcipaddr, (struct uip_neighbor_addr *)&BUF->src); tcpip_input(); } else #endif /* NETSTACK_CONF_WITH_IPV6 */ diff --git a/cpu/6502/net/ethernet-drv.h b/cpu/6502/net/ethernet-drv.h index 6a238a9dc..4602e9fab 100644 --- a/cpu/6502/net/ethernet-drv.h +++ b/cpu/6502/net/ethernet-drv.h @@ -42,6 +42,10 @@ struct ethernet_config { PROCESS_NAME(ethernet_process); +#if NETSTACK_CONF_WITH_IPV6 +uint8_t ethernet_output(const uip_lladdr_t *); +#else uint8_t ethernet_output(void); +#endif #endif /* ETHERNET_DRV_H_ */ From 678f4344d2573c1221555b074bef9359323bc356 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Mon, 13 Jun 2016 12:04:47 +0100 Subject: [PATCH 195/345] Add missing include --- cpu/cc26xx-cc13xx/dev/aux-ctrl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/cpu/cc26xx-cc13xx/dev/aux-ctrl.c b/cpu/cc26xx-cc13xx/dev/aux-ctrl.c index eb316d3df..48d2da460 100644 --- a/cpu/cc26xx-cc13xx/dev/aux-ctrl.c +++ b/cpu/cc26xx-cc13xx/dev/aux-ctrl.c @@ -36,6 +36,7 @@ #include #include +#include /*---------------------------------------------------------------------------*/ LIST(consumers_list); /*---------------------------------------------------------------------------*/ From f8864c67fd692e7f120ed29c923b3488ab727f99 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Mon, 13 Jun 2016 12:14:48 +0100 Subject: [PATCH 196/345] Add TRNG CCxxware macros --- cpu/cc26xx-cc13xx/ti-lib.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cpu/cc26xx-cc13xx/ti-lib.h b/cpu/cc26xx-cc13xx/ti-lib.h index c08d05ce3..7396fb40f 100644 --- a/cpu/cc26xx-cc13xx/ti-lib.h +++ b/cpu/cc26xx-cc13xx/ti-lib.h @@ -639,6 +639,22 @@ #define ti_lib_timer_match_update_mode(...) TimerMatchUpdateMode(__VA_ARGS__) #define ti_lib_timer_interval_load_mode(...) TimerIntervalLoadMode(__VA_ARGS__) /*---------------------------------------------------------------------------*/ +/* trng.h */ +#include "driverlib/trng.h" + +#define ti_lib_trng_configure(...) TRNGConfigure(__VA_ARGS__) +#define ti_lib_trng_enable(...) TRNGEnable(__VA_ARGS__) +#define ti_lib_trng_disable(...) TRNGDisable(__VA_ARGS__) +#define ti_lib_trng_number_get(...) TRNGNumberGet(__VA_ARGS__) +#define ti_lib_trng_status_get(...) TRNGStatusGet(__VA_ARGS__) +#define ti_lib_trng_reset(...) TRNGReset(__VA_ARGS__) +#define ti_lib_trng_int_enable(...) TRNGIntEnable(__VA_ARGS__) +#define ti_lib_trng_int_disable(...) TRNGIntDisable(__VA_ARGS__) +#define ti_lib_trng_int_status(...) TRNGIntStatus(__VA_ARGS__) +#define ti_lib_trng_int_clear(...) TRNGIntClear(__VA_ARGS__) +#define ti_lib_trng_int_register(...) TRNGIntRegister(__VA_ARGS__) +#define ti_lib_trng_int_unregister(...) TRNGIntUnregister(__VA_ARGS__) +/*---------------------------------------------------------------------------*/ /* uart.h */ #include "driverlib/uart.h" From adfeaa55004856cd371a6017d81c559dccb0827b Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Wed, 15 Jun 2016 10:31:55 +0100 Subject: [PATCH 197/345] Add missing include --- platform/srf06-cc26xx/contiki-main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/srf06-cc26xx/contiki-main.c b/platform/srf06-cc26xx/contiki-main.c index b3f5c37f7..cc7a6562a 100644 --- a/platform/srf06-cc26xx/contiki-main.c +++ b/platform/srf06-cc26xx/contiki-main.c @@ -60,6 +60,7 @@ #include "sys/clock.h" #include "sys/rtimer.h" #include "sys/node-id.h" +#include "lib/random.h" #include "lib/sensors.h" #include "button-sensor.h" #include "dev/serial-line.h" From bb4056903c7bcf1c722eff75849ace745fd001dc Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Tue, 14 Jun 2016 20:01:48 +0100 Subject: [PATCH 198/345] Add CC13xx/CC26xx TRNG driver --- cpu/cc26xx-cc13xx/dev/soc-trng.c | 315 +++++++++++++++++++++++++++++++ cpu/cc26xx-cc13xx/dev/soc-trng.h | 135 +++++++++++++ 2 files changed, 450 insertions(+) create mode 100644 cpu/cc26xx-cc13xx/dev/soc-trng.c create mode 100644 cpu/cc26xx-cc13xx/dev/soc-trng.h diff --git a/cpu/cc26xx-cc13xx/dev/soc-trng.c b/cpu/cc26xx-cc13xx/dev/soc-trng.c new file mode 100644 index 000000000..5c54093e8 --- /dev/null +++ b/cpu/cc26xx-cc13xx/dev/soc-trng.c @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2016, University of Bristol - http://www.bristol.ac.uk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx-trng + * @{ + * + * \file + * + * Implementation of the CC13xx/CC26xx RNG driver + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "lpm.h" +#include "sys/process.h" +#include "dev/soc-trng.h" +#include "ti-lib.h" + +#include +#include +#include +/*---------------------------------------------------------------------------*/ +#ifdef SOC_TRNG_CONF_CACHE_LEN +#define SOC_TRNG_CACHE_LEN SOC_TRNG_CONF_CACHE_LEN +#else +/** Size of the random number cache. Each slot holds 4 16-bit numbers */ +#define SOC_TRNG_CACHE_LEN 4 +#endif +/*---------------------------------------------------------------------------*/ +#define MIN_REFILL_CYCLES_MAX 0x00000000 +/*---------------------------------------------------------------------------*/ +PROCESS(soc_trng_process, "CC13xx/CC26xx TRNG process"); +/*---------------------------------------------------------------------------*/ +static process_event_t rng_ready_event = PROCESS_EVENT_NONE; +/*---------------------------------------------------------------------------*/ +static soc_trng_callback_t notify_cb = NULL; +/*---------------------------------------------------------------------------*/ +#define soc_trng_isr TRNGIntHandler +/*---------------------------------------------------------------------------*/ +static uint64_t rands_cache[SOC_TRNG_CACHE_LEN]; +static bool rands_mask[SOC_TRNG_CACHE_LEN]; +/*---------------------------------------------------------------------------*/ +static void +disable_number_ready_interrupt(void) +{ + ti_lib_trng_int_disable(TRNG_NUMBER_READY); + ti_lib_rom_int_disable(INT_TRNG); +} +/*---------------------------------------------------------------------------*/ +static void +enable_number_ready_interrupt(void) +{ + ti_lib_trng_int_clear(TRNG_NUMBER_READY); + ti_lib_trng_int_enable(TRNG_NUMBER_READY); + ti_lib_rom_int_enable(INT_TRNG); +} +/*---------------------------------------------------------------------------*/ +static bool +accessible(void) +{ + /* First, check the PD */ + if(ti_lib_rom_prcm_power_domain_status(PRCM_DOMAIN_PERIPH) + != PRCM_DOMAIN_POWER_ON) { + return false; + } + + /* Then check the 'run mode' clock gate */ + if(!(HWREG(PRCM_BASE + PRCM_O_SECDMACLKGR) & + PRCM_SECDMACLKGDS_TRNG_CLK_EN_M)) { + return false; + } + + return true; +} +/*---------------------------------------------------------------------------*/ +static void +power_up(void) +{ + /* First, make sure the PERIPH PD is on */ + ti_lib_rom_prcm_power_domain_on(PRCM_DOMAIN_PERIPH); + while((ti_lib_rom_prcm_power_domain_status(PRCM_DOMAIN_PERIPH) + != PRCM_DOMAIN_POWER_ON)); + + /* Enable clock in active mode */ + ti_lib_rom_prcm_peripheral_run_enable(PRCM_PERIPH_TRNG); + ti_lib_prcm_load_set(); + while(!ti_lib_prcm_load_get()); +} +/*---------------------------------------------------------------------------*/ +static void +reset_synchronous(void) +{ + ti_lib_trng_reset(); + while(HWREG(TRNG_BASE + TRNG_O_SWRESET)); +} +/*---------------------------------------------------------------------------*/ +static uint8_t +request(void) +{ + if(notify_cb) { + return LPM_MODE_SLEEP; + } + return LPM_MODE_MAX_SUPPORTED; +} +/*---------------------------------------------------------------------------*/ +LPM_MODULE(rng_module, request, NULL, NULL, LPM_DOMAIN_NONE); +/*---------------------------------------------------------------------------*/ +static uint64_t +read_number(void) +{ + uint64_t ran = (uint64_t)HWREG(TRNG_BASE + TRNG_O_OUT1) << 32; + ran += ti_lib_rom_trng_number_get(TRNG_LOW_WORD); + + return ran; +} +/*---------------------------------------------------------------------------*/ +uint64_t +soc_trng_rand_synchronous() +{ + uint64_t ran; + bool interrupts_disabled; + int i; + + /* If the TRNG is gathering entropy, return a cached value */ + if(notify_cb) { + for(i = 0; i < SOC_TRNG_CACHE_LEN; i++) { + if(rands_mask[i]) { + rands_mask[i] = false; + return rands_cache[i]; + } + } + return 0; + } + + if(!accessible()) { + power_up(); + } + + /* + * If we were previously enabled, we either have a number already available, + * or we need clock, which means we are calculating. If neither is true then + * we need setup from scratch. + */ + if((ti_lib_trng_status_get() & (TRNG_NEED_CLOCK | TRNG_NUMBER_READY)) == 0) { + reset_synchronous(); + ti_lib_trng_configure(MIN_REFILL_CYCLES_MAX, SOC_TRNG_REFILL_CYCLES_MIN, 0); + ti_lib_trng_enable(); + } + + interrupts_disabled = ti_lib_int_master_disable(); + + while((ti_lib_trng_status_get() & TRNG_NUMBER_READY) == 0); + + ran = read_number(); + + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + + return ran; +} +/*---------------------------------------------------------------------------*/ +uint8_t +soc_trng_rand_asynchronous(uint32_t samples, soc_trng_callback_t cb) +{ + int i; + bool interrupts_disabled; + + if(notify_cb != NULL) { + return SOC_TRNG_RAND_ASYNC_REQUEST_ERROR; + } + + if(!accessible()) { + power_up(); + } + + /* + * First we need to cache some random numbers for general use in case the + * application requests them while we are calculating. + * + * If we were previously enabled, we either have a number already available, + * or we need clock, which means we are calculating. If neither is true then + * we need setup from scratch. + */ + if((ti_lib_trng_status_get() & (TRNG_NEED_CLOCK | TRNG_NUMBER_READY)) == 0) { + reset_synchronous(); + } + + interrupts_disabled = ti_lib_int_master_disable(); + + ti_lib_trng_disable(); + ti_lib_trng_configure(MIN_REFILL_CYCLES_MAX, SOC_TRNG_REFILL_CYCLES_MIN, 0); + ti_lib_trng_enable(); + + /* Cache SOC_TRNG_CACHE_LEN min-entropy rands */ + for(i = 0; i < SOC_TRNG_CACHE_LEN; i++) { + while((ti_lib_trng_status_get() & TRNG_NUMBER_READY) == 0); + rands_mask[i] = true; + rands_cache[i] = read_number(); + } + + /* Configure the RNG to the required entropy */ + ti_lib_trng_disable(); + ti_lib_trng_configure(MIN_REFILL_CYCLES_MAX, samples, 0); + + /* + * Clear the TRNG_NUMBER_READY flag. This will trigger a new calculation + * as soon as the module gets enabled. + */ + ti_lib_trng_int_clear(TRNG_NUMBER_READY); + + /* Enable clock in sleep mode and register with LPM */ + ti_lib_rom_prcm_peripheral_sleep_enable(PRCM_PERIPH_TRNG); + ti_lib_prcm_load_set(); + while(!ti_lib_prcm_load_get()); + + lpm_register_module(&rng_module); + + notify_cb = cb; + + /* Enable the number ready interrupt and fire-up the module */ + enable_number_ready_interrupt(); + ti_lib_trng_enable(); + + if(!interrupts_disabled) { + ti_lib_int_master_enable(); + } + + return SOC_TRNG_RAND_ASYNC_REQUEST_OK; +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(soc_trng_process, ev, data) +{ + PROCESS_BEGIN(); + + while(1) { + PROCESS_YIELD_UNTIL(ev == rng_ready_event); + + if(notify_cb) { + uint64_t ran = read_number(); + + notify_cb(ran); + notify_cb = NULL; + } + + /* Disable clock in sleep mode */ + ti_lib_rom_prcm_peripheral_sleep_disable(PRCM_PERIPH_TRNG); + ti_lib_prcm_load_set(); + while(!ti_lib_prcm_load_get()); + + lpm_unregister_module(&rng_module); + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +void +soc_trng_isr(void) +{ + ENERGEST_ON(ENERGEST_TYPE_IRQ); + + ti_lib_trng_disable(); + + disable_number_ready_interrupt(); + + ti_lib_trng_configure(MIN_REFILL_CYCLES_MAX, SOC_TRNG_REFILL_CYCLES_MIN, 0); + ti_lib_trng_enable(); + + process_post(&soc_trng_process, rng_ready_event, NULL); + + ENERGEST_OFF(ENERGEST_TYPE_IRQ); +} +/*---------------------------------------------------------------------------*/ +void +soc_trng_init() +{ + if(rng_ready_event != PROCESS_EVENT_NONE) { + return; + } + + /* Register the RNG ready event */ + rng_ready_event = process_alloc_event(); + process_start(&soc_trng_process, NULL); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + */ diff --git a/cpu/cc26xx-cc13xx/dev/soc-trng.h b/cpu/cc26xx-cc13xx/dev/soc-trng.h new file mode 100644 index 000000000..f84370168 --- /dev/null +++ b/cpu/cc26xx-cc13xx/dev/soc-trng.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2016, University of Bristol - http://www.bristol.ac.uk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx + * @{ + * + * \defgroup cc26xx-trng CC13xx/CC26xx Random Number Generator + * + * Driver for the CC13xx/CC26xx Random Number Generator + * + * @{ + * + * \file + * + * Header file for the CC13xx/CC26xx TRNG driver + */ +/*---------------------------------------------------------------------------*/ +#ifndef SOC_TRNG_H_ +#define SOC_TRNG_H_ +/*---------------------------------------------------------------------------*/ +#include +/*---------------------------------------------------------------------------*/ +#define SOC_TRNG_RAND_ASYNC_REQUEST_ERROR 0 /**< Async request rejected */ +#define SOC_TRNG_RAND_ASYNC_REQUEST_OK 1 /**< Async request accepted */ +/*---------------------------------------------------------------------------*/ +#define SOC_TRNG_REFILL_CYCLES_MIN 0x00000100 +#define SOC_TRNG_REFILL_CYCLES_MAX 0x00000000 +/*---------------------------------------------------------------------------*/ +/** + * \brief Pointer to a callback to be provided as an argument to + * soc_trng_rand_asynchronous() + */ +typedef void (*soc_trng_callback_t)(uint64_t rand); +/*---------------------------------------------------------------------------*/ +/** + * \name TRNG functions + * @{ + */ + +/** + * \brief Returns a minimum entropy random number + * \return The random number + * + * This function is synchronous. This function will make sure the PERIPH PD is + * powered and the TRNG is clocked. The function will then configure the TRNG + * to generate a random number of minimum entropy. These numbers are not + * suitable for cryptographic usage, but their generation is very fast. + * + * If a high-entropy random number is currently being generated, this function + * will return a cached random number. The cache is of configurable size and + * can hold a maximum SOC_TRNG_CONF_CACHE_LEN numbers. If the cache gets + * emptied while high-entropy generation is in progress (e.g. because a + * function requested many random numbers in a row), this function will return + * 0. Care must therefore be taken when the return value is 0, which can also + * be a valid random number. + * + * This function can be safely called from within an interrupt context. + */ +uint64_t soc_trng_rand_synchronous(); + +/** + * \brief Initialise the CC13xx/CC26xx TRNG driver + */ +void soc_trng_init(void); + +/** + * \brief Request a 64-bit, configurable-entropy random number + * \param samples Controls the entropy generated for the random number + * \param cb A callback function to be called when the generation is complete + * \retval SOC_TRNG_RAND_ASYNC_REQUEST_ERROR There was an error adding request. + * \retval SOC_TRNG_RAND_ASYNC_REQUEST_OK Request successfully registered + * + * This function is asynchronous, it will start generation of a random number + * and will return. The caller must provide a callback that will be called when + * the generation is complete. This callback must either use the random number + * immediately or store it, since it will not be possible to retrieve it again + * later form the soc-trng module. + * + * Only one generation can be active at any given point in time. If this + * function gets called when a generation is already in progress, it will + * return SOC_TRNG_RAND_ASYNC_REQUEST_ERROR. + * + * The function will configure the TRNG to generate entropy by sampling the + * FROs for a number clock cycles controlled by the samples argument. The 8 LS + * bits of this argument will be truncated by CC13xxware/CC26xxware and the + * resulting number of clock cycles will be (samples >> 8) * 2^8. Increasing + * the value of this argument increases entropy, but it also increases latency. + * Maximum entropy can be generated by passing SOC_TRNG_REFILL_CYCLES_MAX, but + * this will take approximately 350ms. Consult the chip's technical reference + * manual for advice on what would constitute sufficient entropy for random + * numbers meant to be used for crypto. + * + * While this function is executing, calls to soc_trng_rand_synchronous() will + * return cached random numbers. + * + * This function is not re-entrant and must not be called from an interrupt + * context. + */ +uint8_t soc_trng_rand_asynchronous(uint32_t samples, soc_trng_callback_t cb); +/** @} */ +/*---------------------------------------------------------------------------*/ +#endif /* SOC_TRNG_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ From fd9d878e1d2efba82cbc8163af0d9e36a9aadd0a Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Tue, 14 Jun 2016 20:02:07 +0100 Subject: [PATCH 199/345] Implement random.h API for the CC13xx/CC26xx --- cpu/cc26xx-cc13xx/random.c | 65 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 cpu/cc26xx-cc13xx/random.c diff --git a/cpu/cc26xx-cc13xx/random.c b/cpu/cc26xx-cc13xx/random.c new file mode 100644 index 000000000..3b13a82de --- /dev/null +++ b/cpu/cc26xx-cc13xx/random.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2016, University of Bristol - http://www.bristol.ac.uk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx-trng + * @{ + * + * \file + * + * This file overrides core/lib/random.c and calls SoC-specific RNG functions + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dev/soc-trng.h" +/*---------------------------------------------------------------------------*/ +/** + * \brief Generates a new random number using the hardware TRNG. + * \return The random number. + */ +unsigned short +random_rand(void) +{ + return (unsigned short)soc_trng_rand_synchronous() & 0xFFFF; +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Function required by the API + * \param seed Ignored. + */ +void +random_init(unsigned short seed) +{ + soc_trng_init(); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + */ From de18c16c9fca8c9b1a82837289c966e9f3b0ddfe Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Tue, 14 Jun 2016 20:02:35 +0100 Subject: [PATCH 200/345] Add CC13xx/CC26xx RNG support to the build --- cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx | 1 + 1 file changed, 1 insertion(+) diff --git a/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx b/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx index 6922b45fc..2a8dd114e 100644 --- a/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx +++ b/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx @@ -73,6 +73,7 @@ CONTIKI_CPU_SOURCEFILES += putchar.c ieee-addr.c batmon-sensor.c adc-sensor.c CONTIKI_CPU_SOURCEFILES += slip-arch.c slip.c cc26xx-uart.c lpm.c CONTIKI_CPU_SOURCEFILES += gpio-interrupt.c oscillators.c CONTIKI_CPU_SOURCEFILES += rf-core.c rf-ble.c ieee-mode.c +CONTIKI_CPU_SOURCEFILES += random.c soc-trng.c DEBUG_IO_SOURCEFILES += dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c From c26085ec8c6314342fbd0091c2d2e4e39bbc8bbd Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Fri, 17 Jun 2016 16:42:50 +0200 Subject: [PATCH 201/345] Some 6502 target changes - platform/atarixl/Makefile.atarixl: put two more objects into high memory - platform/atarixl/contiki-conf.h: define WWW_CONF_WGET_EXEC - tools/6502/Makefile: add 'clean' target; remove unused CONTIKI define --- platform/atarixl/Makefile.atarixl | 2 +- platform/atarixl/contiki-conf.h | 1 + tools/6502/Makefile | 41 ++++++++++++++++++++----------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/platform/atarixl/Makefile.atarixl b/platform/atarixl/Makefile.atarixl index 64ade5a13..b45482db9 100644 --- a/platform/atarixl/Makefile.atarixl +++ b/platform/atarixl/Makefile.atarixl @@ -35,7 +35,7 @@ CONTIKI_CPU = $(CONTIKI)/cpu/6502 include $(CONTIKI_CPU)/Makefile.6502 SHADOW_RAM_SOURCEFILES = ethernet.c ethernet-drv.c timer.c uip.c uiplib.c -SHADOW_RAM2_SOURCEFILES = clock.c uip_arch.c uip_arp.c +SHADOW_RAM2_SOURCEFILES = clock.c uip_arch.c uip_arp.c unload.c random.c # Set target-specific variable values ${addprefix $(OBJECTDIR)/,${call oname, $(SHADOW_RAM_SOURCEFILES)}}: CFLAGS += --code-name SHADOW_RAM diff --git a/platform/atarixl/contiki-conf.h b/platform/atarixl/contiki-conf.h index 9adcdd93f..1ebdcc9c5 100644 --- a/platform/atarixl/contiki-conf.h +++ b/platform/atarixl/contiki-conf.h @@ -60,5 +60,6 @@ #define WWW_CONF_WEBPAGE_WIDTH 40 #define WWW_CONF_WEBPAGE_HEIGHT 19 #define WWW_CONF_HISTORY_SIZE 4 +#define WWW_CONF_WGET_EXEC(url) exec("wget.com", url) #endif /* CONTIKI_CONF_H_ */ diff --git a/tools/6502/Makefile b/tools/6502/Makefile index d88a4790f..46b0d4095 100644 --- a/tools/6502/Makefile +++ b/tools/6502/Makefile @@ -31,10 +31,6 @@ # Author: Oliver Schmidt # -ifndef CONTIKI - ${error CONTIKI not defined! You must specify where Contiki resides} -endif - ifndef AC ${error AC not defined! You must specify where the AppleCommander jar resides} endif @@ -48,6 +44,7 @@ ifndef DIR2ATR endif all: apple2 atari c64 c128 +clean: apple2-clean atari-clean c64-clean c128-clean ifeq ($(shell echo),) NULLDEV = /dev/null @@ -65,19 +62,20 @@ endif CC65 := $(shell cl65 --print-target-path) define makes -$1-makes: - $(MAKE) -C ../../cpu/6502/ethconfig TARGET=$1 - $(MAKE) -C ../../cpu/6502/ipconfig TARGET=$1 - $(MAKE) -C ../../examples/webbrowser TARGET=$1 - $(MAKE) -C ../../examples/webbrowser-80col TARGET=$1 - $(MAKE) -C ../../examples/wget TARGET=$1 - $(MAKE) -C ../../examples/irc TARGET=$1 - $(MAKE) -C ../../examples/irc-80col TARGET=$1 - $(MAKE) -C ../../examples/webserver TARGET=$1 HTTPD-CFS=1 - $(MAKE) -C ../../examples/telnet-server TARGET=$1 +$1-$2makes: + $(MAKE) -C ../../cpu/6502/ethconfig TARGET=$1 $2 + $(MAKE) -C ../../cpu/6502/ipconfig TARGET=$1 $2 + $(MAKE) -C ../../examples/webbrowser TARGET=$1 $2 + $(MAKE) -C ../../examples/webbrowser-80col TARGET=$1 $2 + $(MAKE) -C ../../examples/wget TARGET=$1 $2 + $(MAKE) -C ../../examples/irc TARGET=$1 $2 + $(MAKE) -C ../../examples/irc-80col TARGET=$1 $2 + $(MAKE) -C ../../examples/webserver TARGET=$1 HTTPD-CFS=1 $2 + $(MAKE) -C ../../examples/telnet-server TARGET=$1 $2 endef $(eval $(call makes,apple2enh)) +$(eval $(call makes,apple2enh,clean)) %.zip: zip $@ $^ @@ -85,6 +83,9 @@ $(eval $(call makes,apple2enh)) apple2: contiki-apple2.zip +apple2-clean: apple2enh-cleanmakes + rm -f contiki-apple2.zip contiki-apple2-1.dsk contiki-apple2-2.dsk contiki-apple2-3.dsk contiki-apple2.po + contiki-apple2.zip: contiki-apple2-1.dsk contiki-apple2-2.dsk contiki-apple2-3.dsk contiki-apple2.po contiki-apple2-1.dsk: apple2enh-makes @@ -168,9 +169,13 @@ contiki-apple2.po: apple2enh-makes java -jar $(AC) -p $@ notfound.htm bin 0 < ../../examples/webserver/httpd-cfs/notfound.htm $(eval $(call makes,atarixl)) +$(eval $(call makes,atarixl,clean)) atari: contiki-atari.zip +atari-clean: atarixl-cleanmakes + rm -f contiki-atari.zip contiki-atari-1.atr contiki-atari-2.atr contiki-atari-3.atr contiki-atari.atr + contiki-atari.zip: contiki-atari-1.atr contiki-atari-2.atr contiki-atari-3.atr contiki-atari.atr contiki-atari-1.atr: atarixl-makes @@ -252,9 +257,13 @@ contiki-atari.atr: atarixl-makes rm -r atr $(eval $(call makes,c64)) +$(eval $(call makes,c64,clean)) c64: contiki-c64.zip +c64-clean: c64-cleanmakes + rm -f contiki-c64.zip contiki-c64-1.d64 contiki-c64-2.d64 contiki-c64-3.d64 contiki-c64.d71 contiki-c64.d81 + contiki-c64.zip: contiki-c64-1.d64 contiki-c64-2.d64 contiki-c64-3.d64 contiki-c64.d71 contiki-c64.d81 contiki-c64-1.d64: c64-makes @@ -351,9 +360,13 @@ contiki-c64.d81: c64-makes $(C1541) -attach $@ -write ../../examples/webserver/httpd-cfs/notfound.htm notfound.htm,s >$(NULLDEV) $(eval $(call makes,c128)) +$(eval $(call makes,c128,clean)) c128: contiki-c128.zip +c128-clean: c128-cleanmakes + rm -f contiki-c128.zip contiki-c128-1.d64 contiki-c128-2.d64 contiki-c128.d71 contiki-c128.d81 + contiki-c128.zip: contiki-c128-1.d64 contiki-c128-2.d64 contiki-c128.d71 contiki-c128.d81 contiki-c128-1.d64: c128-makes From f1922c13b6238166ec5ec2b34dec1984c2d02cf1 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 23 Jun 2016 18:21:05 +0200 Subject: [PATCH 202/345] TSCH: use standard-compliant mac-squence module rather than custom duplicate detection --- core/net/mac/tsch/tsch.c | 51 ++++++++++------------------------------ 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index 292744ecc..1db8c96e5 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -53,6 +53,7 @@ #include "net/mac/tsch/tsch-log.h" #include "net/mac/tsch/tsch-packet.h" #include "net/mac/tsch/tsch-security.h" +#include "net/mac/mac-sequence.h" #include "lib/random.h" #if FRAME802154_VERSION < FRAME802154_IEEE802154E_2012 @@ -69,26 +70,12 @@ /* Use to collect link statistics even on Keep-Alive, even though they were * not sent from an upper layer and don't have a valid packet_sent callback */ #ifndef TSCH_LINK_NEIGHBOR_CALLBACK +#if NETSTACK_CONF_WITH_IPV6 void uip_ds6_link_neighbor_callback(int status, int numtx); #define TSCH_LINK_NEIGHBOR_CALLBACK(dest, status, num) uip_ds6_link_neighbor_callback(status, num) +#endif /* NETSTACK_CONF_WITH_IPV6 */ #endif /* TSCH_LINK_NEIGHBOR_CALLBACK */ -/* 802.15.4 duplicate frame detection */ -struct seqno { - linkaddr_t sender; - uint8_t seqno; -}; - -/* Size of the sequence number history */ -#ifdef NETSTACK_CONF_MAC_SEQNO_HISTORY -#define MAX_SEQNOS NETSTACK_CONF_MAC_SEQNO_HISTORY -#else /* NETSTACK_CONF_MAC_SEQNO_HISTORY */ -#define MAX_SEQNOS 8 -#endif /* NETSTACK_CONF_MAC_SEQNO_HISTORY */ - -/* Seqno history */ -static struct seqno received_seqnos[MAX_SEQNOS]; - /* Let TSCH select a time source with no help of an upper layer. * We do so using statistics from incoming EBs */ #if TSCH_AUTOSELECT_TIME_SOURCE @@ -959,28 +946,16 @@ packet_input(void) /* Seqno of 0xffff means no seqno */ if(packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO) != 0xffff) { - /* Check for duplicate packet by comparing the sequence number - of the incoming packet with the last few ones we saw. */ - int i; - for(i = 0; i < MAX_SEQNOS; ++i) { - if(packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO) == received_seqnos[i].seqno && - linkaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_SENDER), - &received_seqnos[i].sender)) { - /* Drop the packet. */ - PRINTF("TSCH:! drop dup ll from %u seqno %u\n", - TSCH_LOG_ID_FROM_LINKADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER)), - packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO)); - duplicate = 1; - } - } - if(!duplicate) { - for(i = MAX_SEQNOS - 1; i > 0; --i) { - memcpy(&received_seqnos[i], &received_seqnos[i - 1], - sizeof(struct seqno)); - } - received_seqnos[0].seqno = packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO); - linkaddr_copy(&received_seqnos[0].sender, - packetbuf_addr(PACKETBUF_ADDR_SENDER)); + /* Check for duplicates */ + duplicate = mac_sequence_is_duplicate(); + if(duplicate) { + extern clock_time_t duplicate_age; + /* Drop the packet. */ + PRINTF("TSCH:! drop dup ll from %u seqno %u\n", + TSCH_LOG_ID_FROM_LINKADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER)), + packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO)); + } else { + mac_sequence_register_seqno(); } } From 1acb69e280b826fc338ac242cd16ef65ddc4373d Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 23 Jun 2016 18:35:16 +0200 Subject: [PATCH 203/345] TSCH: keep track of Rx channel as packetbuf attribute --- core/net/mac/tsch/tsch-slot-operation.c | 5 ++++- core/net/mac/tsch/tsch-slot-operation.h | 3 ++- core/net/mac/tsch/tsch.c | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/net/mac/tsch/tsch-slot-operation.c b/core/net/mac/tsch/tsch-slot-operation.c index be83da4ab..721a5c3db 100644 --- a/core/net/mac/tsch/tsch-slot-operation.c +++ b/core/net/mac/tsch/tsch-slot-operation.c @@ -154,6 +154,9 @@ static rtimer_clock_t volatile current_slot_start; /* Are we currently inside a slot? */ static volatile int tsch_in_slot_operation = 0; +/* If we are inside a slot, this tells the current channel */ +static uint8_t current_channel; + /* Info about the link, packet and neighbor of * the current (or next) slot */ struct tsch_link *current_link = NULL; @@ -780,6 +783,7 @@ PT_THREAD(tsch_rx_slot(struct pt *pt, struct rtimer *t)) NETSTACK_RADIO.get_value(RADIO_PARAM_LAST_RSSI, &radio_last_rssi); current_input->rx_asn = current_asn; current_input->rssi = (signed)radio_last_rssi; + current_input->channel = current_channel; header_len = frame802154_parse((uint8_t *)current_input->payload, current_input->len, &frame); frame_valid = header_len > 0 && frame802154_check_dest_panid(&frame) && @@ -937,7 +941,6 @@ PT_THREAD(tsch_slot_operation(struct rtimer *t, void *ptr)) ); } else { - uint8_t current_channel; int is_active_slot; TSCH_DEBUG_SLOT_START(); tsch_in_slot_operation = 1; diff --git a/core/net/mac/tsch/tsch-slot-operation.h b/core/net/mac/tsch/tsch-slot-operation.h index f74778c00..ec05d8736 100644 --- a/core/net/mac/tsch/tsch-slot-operation.h +++ b/core/net/mac/tsch/tsch-slot-operation.h @@ -89,7 +89,8 @@ struct input_packet { uint8_t payload[TSCH_PACKET_MAX_LEN]; /* Packet payload */ struct asn_t rx_asn; /* ASN when the packet was received */ int len; /* Packet len */ - uint16_t rssi; /* RSSI for this packet */ + int16_t rssi; /* RSSI for this packet */ + uint8_t channel; /* Channel we received the packet on */ }; /***** External Variables *****/ diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index 292744ecc..41aa56125 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -361,6 +361,7 @@ tsch_rx_process_pending() /* Copy to packetbuf for processing */ packetbuf_copyfrom(current_input->payload, current_input->len); packetbuf_set_attr(PACKETBUF_ATTR_RSSI, current_input->rssi); + packetbuf_set_attr(PACKETBUF_ATTR_CHANNEL, current_input->channel); } /* Remove input from ringbuf */ From 5a1a8e84d8738928f1b50614073f6126da38f8ad Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 23 Jun 2016 18:36:04 +0200 Subject: [PATCH 204/345] TSCH: start scheduling keep-alives only after tsch_is_associated is set --- core/net/mac/tsch/tsch.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index 41aa56125..b97e1d634 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -562,10 +562,6 @@ tsch_associate(const struct input_packet *input_eb, rtimer_clock_t timestamp) if(n != NULL) { tsch_queue_update_time_source((linkaddr_t *)&frame.src_addr); -#ifdef TSCH_CALLBACK_JOINING_NETWORK - TSCH_CALLBACK_JOINING_NETWORK(); -#endif - /* Set PANID */ frame802154_set_pan_id(frame.src_pid); @@ -576,9 +572,13 @@ tsch_associate(const struct input_packet *input_eb, rtimer_clock_t timestamp) tsch_is_associated = 1; tsch_is_pan_secured = frame.fcf.security_enabled; - /* Association done, schedule keepalive messages */ + /* Start sending keep-alives now that tsch_is_associated is set */ tsch_schedule_keepalive(); +#ifdef TSCH_CALLBACK_JOINING_NETWORK + TSCH_CALLBACK_JOINING_NETWORK(); +#endif + PRINTF("TSCH: association done, sec %u, PAN ID %x, asn-%x.%lx, jp %u, timeslot id %u, hopping id %u, slotframe len %u with %u links, from ", tsch_is_pan_secured, frame.src_pid, From b1dc8205f0f9a57ef28903a1ad130fecd2add3d2 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 23 Jun 2016 18:37:42 +0200 Subject: [PATCH 205/345] TSCH: minor logging enhancement --- core/net/mac/tsch/tsch.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index b97e1d634..e03d34a50 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -928,7 +928,10 @@ send_packet(mac_callback_t sent, void *ptr) /* Enqueue packet */ p = tsch_queue_add_packet(addr, sent, ptr); if(p == NULL) { - PRINTF("TSCH:! can't send packet !tsch_queue_add_packet\n"); + PRINTF("TSCH:! can't send packet to %u with seqno %u, queue %u %u\n", + TSCH_LOG_ID_FROM_LINKADDR(addr), tsch_packet_seqno, + packet_count_before, + tsch_queue_packet_count(addr)); ret = MAC_TX_ERR; } else { p->header_len = hdr_len; From ee60355c9c8ded25142c5793ccd1b0ce21a3ebd3 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 23 Jun 2016 18:38:12 +0200 Subject: [PATCH 206/345] TSCH: implement off() --- core/net/mac/tsch/tsch.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index e03d34a50..15a75fe80 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -1017,6 +1017,11 @@ turn_on(void) static int turn_off(int keep_radio_on) { + if(keep_radio_on) { + NETSTACK_RADIO.on(); + } else { + NETSTACK_RADIO.off(); + } return 1; } /*---------------------------------------------------------------------------*/ From beb532e7e8aeb099b2db882fcbaf885c1833a9dd Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 23 Jun 2016 18:25:52 +0200 Subject: [PATCH 207/345] TSCH: use sequence number only for unicast data frames --- core/net/mac/framer-802154.c | 4 +++- core/net/mac/tsch/tsch-packet.c | 5 ++--- core/net/mac/tsch/tsch-packet.h | 2 +- core/net/mac/tsch/tsch.c | 23 ++++++++--------------- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/core/net/mac/framer-802154.c b/core/net/mac/framer-802154.c index 7e524afb1..35e39cf33 100644 --- a/core/net/mac/framer-802154.c +++ b/core/net/mac/framer-802154.c @@ -86,14 +86,16 @@ create_frame(int type, int do_create) params.fcf.frame_pending = packetbuf_attr(PACKETBUF_ATTR_PENDING); if(packetbuf_holds_broadcast()) { params.fcf.ack_required = 0; + /* Suppress seqno on broadcast if supported (frame v2 or more) */ + params.fcf.sequence_number_suppression = FRAME802154_VERSION >= FRAME802154_IEEE802154E_2012; } else { params.fcf.ack_required = packetbuf_attr(PACKETBUF_ATTR_MAC_ACK); + params.fcf.sequence_number_suppression = FRAME802154_SUPPR_SEQNO; } /* We do not compress PAN ID in outgoing frames, i.e. include one PAN ID (dest by default) * There is one exception, seemingly a typo in Table 2a: rows 2 and 3: when there is no * source nor destination address, we have dest PAN ID iff compression is *set*. */ params.fcf.panid_compression = 0; - params.fcf.sequence_number_suppression = FRAME802154_SUPPR_SEQNO; /* Insert IEEE 802.15.4 version bits. */ params.fcf.frame_version = FRAME802154_VERSION; diff --git a/core/net/mac/tsch/tsch-packet.c b/core/net/mac/tsch/tsch-packet.c index 17601d054..ba8239b1e 100644 --- a/core/net/mac/tsch/tsch-packet.c +++ b/core/net/mac/tsch/tsch-packet.c @@ -189,7 +189,7 @@ tsch_packet_parse_eack(const uint8_t *buf, int buf_size, /*---------------------------------------------------------------------------*/ /* Create an EB packet */ int -tsch_packet_create_eb(uint8_t *buf, int buf_size, uint8_t seqno, +tsch_packet_create_eb(uint8_t *buf, int buf_size, uint8_t *hdr_len, uint8_t *tsch_sync_ie_offset) { int ret = 0; @@ -210,8 +210,7 @@ tsch_packet_create_eb(uint8_t *buf, int buf_size, uint8_t seqno, p.fcf.frame_version = FRAME802154_IEEE802154E_2012; p.fcf.src_addr_mode = FRAME802154_LONGADDRMODE; p.fcf.dest_addr_mode = FRAME802154_SHORTADDRMODE; - p.seq = seqno; - p.fcf.sequence_number_suppression = FRAME802154_SUPPR_SEQNO; + p.fcf.sequence_number_suppression = 1; /* It is important not to compress PAN ID, as this would result in not including either * source nor destination PAN ID, leaving potential joining devices unaware of the PAN ID. */ p.fcf.panid_compression = 0; diff --git a/core/net/mac/tsch/tsch-packet.h b/core/net/mac/tsch/tsch-packet.h index c48bd479b..e974230e5 100644 --- a/core/net/mac/tsch/tsch-packet.h +++ b/core/net/mac/tsch/tsch-packet.h @@ -94,7 +94,7 @@ int tsch_packet_parse_eack(const uint8_t *buf, int buf_size, uint8_t seqno, frame802154_t *frame, struct ieee802154_ies *ies, uint8_t *hdr_len); /* Create an EB packet */ int tsch_packet_create_eb(uint8_t *buf, int buf_size, - uint8_t seqno, uint8_t *hdr_len, uint8_t *tsch_sync_ie_ptr); + uint8_t *hdr_len, uint8_t *tsch_sync_ie_ptr); /* Update ASN in EB packet */ int tsch_packet_update_eb(uint8_t *buf, int buf_size, uint8_t tsch_sync_ie_offset); /* Parse EB and extract ASN and join priority */ diff --git a/core/net/mac/tsch/tsch.c b/core/net/mac/tsch/tsch.c index 1db8c96e5..d33989b55 100644 --- a/core/net/mac/tsch/tsch.c +++ b/core/net/mac/tsch/tsch.c @@ -134,7 +134,7 @@ struct asn_t current_asn; /* Device rank or join priority: * For PAN coordinator: 0 -- lower is better */ uint8_t tsch_join_priority; -/* The current TSCH sequence number, used for both data and EBs */ +/* The current TSCH sequence number, used for unicast data frames only */ static uint8_t tsch_packet_seqno = 0; /* Current period for EB output */ static clock_time_t tsch_current_eb_period; @@ -728,12 +728,7 @@ PROCESS_THREAD(tsch_send_eb_process, ev, data) uint8_t tsch_sync_ie_offset; /* Prepare the EB packet and schedule it to be sent */ packetbuf_clear(); - /* We don't use seqno 0 */ - if(++tsch_packet_seqno == 0) { - tsch_packet_seqno++; - } packetbuf_set_attr(PACKETBUF_ATTR_FRAME_TYPE, FRAME802154_BEACONFRAME); - packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, tsch_packet_seqno); #if LLSEC802154_ENABLED if(tsch_is_pan_secured) { /* Set security level, key id and index */ @@ -743,7 +738,7 @@ PROCESS_THREAD(tsch_send_eb_process, ev, data) } #endif /* LLSEC802154_ENABLED */ eb_len = tsch_packet_create_eb(packetbuf_dataptr(), PACKETBUF_SIZE, - tsch_packet_seqno, &hdr_len, &tsch_sync_ie_offset); + &hdr_len, &tsch_sync_ie_offset); if(eb_len != 0) { struct tsch_packet *p; packetbuf_set_datalen(eb_len); @@ -876,14 +871,14 @@ send_packet(mac_callback_t sent, void *ptr) return; } - /* PACKETBUF_ATTR_MAC_SEQNO cannot be zero, due to a pecuilarity - in framer-802154.c. */ - if(++tsch_packet_seqno == 0) { - tsch_packet_seqno++; - } - /* Ask for ACK if we are sending anything other than broadcast */ if(!linkaddr_cmp(addr, &linkaddr_null)) { + /* PACKETBUF_ATTR_MAC_SEQNO cannot be zero, due to a pecuilarity + in framer-802154.c. */ + if(++tsch_packet_seqno == 0) { + tsch_packet_seqno++; + } + packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, tsch_packet_seqno); packetbuf_set_attr(PACKETBUF_ATTR_MAC_ACK, 1); } else { /* Broadcast packets shall be added to broadcast queue @@ -893,7 +888,6 @@ send_packet(mac_callback_t sent, void *ptr) } packetbuf_set_attr(PACKETBUF_ATTR_FRAME_TYPE, FRAME802154_DATAFRAME); - packetbuf_set_attr(PACKETBUF_ATTR_MAC_SEQNO, tsch_packet_seqno); #if LLSEC802154_ENABLED if(tsch_is_pan_secured) { @@ -949,7 +943,6 @@ packet_input(void) /* Check for duplicates */ duplicate = mac_sequence_is_duplicate(); if(duplicate) { - extern clock_time_t duplicate_age; /* Drop the packet. */ PRINTF("TSCH:! drop dup ll from %u seqno %u\n", TSCH_LOG_ID_FROM_LINKADDR(packetbuf_addr(PACKETBUF_ADDR_SENDER)), From 54957e4e03e6cef3a6f99d7562306b6981c2e69e Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Thu, 23 Jun 2016 18:28:18 +0200 Subject: [PATCH 208/345] mac-seqno: add a lifetime to sequence numbers in history --- core/net/mac/mac-sequence.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/net/mac/mac-sequence.c b/core/net/mac/mac-sequence.c index 40ac3c28a..ccbbb2114 100644 --- a/core/net/mac/mac-sequence.c +++ b/core/net/mac/mac-sequence.c @@ -51,9 +51,16 @@ struct seqno { linkaddr_t sender; + clock_time_t timestamp; uint8_t seqno; }; +#ifdef NETSTACK_CONF_MAC_SEQNO_MAX_AGE +#define SEQNO_MAX_AGE NETSTACK_CONF_MAC_SEQNO_MAX_AGE +#else /* NETSTACK_CONF_MAC_SEQNO_MAX_AGE */ +#define SEQNO_MAX_AGE (20 * CLOCK_SECOND) +#endif /* NETSTACK_CONF_MAC_SEQNO_MAX_AGE */ + #ifdef NETSTACK_CONF_MAC_SEQNO_HISTORY #define MAX_SEQNOS NETSTACK_CONF_MAC_SEQNO_HISTORY #else /* NETSTACK_CONF_MAC_SEQNO_HISTORY */ @@ -66,6 +73,7 @@ int mac_sequence_is_duplicate(void) { int i; + clock_time_t now = clock_time(); /* * Check for duplicate packet by comparing the sequence number of the incoming @@ -75,8 +83,14 @@ mac_sequence_is_duplicate(void) if(linkaddr_cmp(packetbuf_addr(PACKETBUF_ADDR_SENDER), &received_seqnos[i].sender)) { if(packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO) == received_seqnos[i].seqno) { - /* Duplicate packet. */ +#if SEQNO_MAX_AGE > 0 + if(now - received_seqnos[i].timestamp <= SEQNO_MAX_AGE) { + /* Duplicate packet. */ + return 1; + } +#else /* SEQNO_MAX_AGE > 0 */ return 1; +#endif /* SEQNO_MAX_AGE > 0 */ } break; } @@ -103,6 +117,7 @@ mac_sequence_register_seqno(void) memcpy(&received_seqnos[j], &received_seqnos[j - 1], sizeof(struct seqno)); } received_seqnos[0].seqno = packetbuf_attr(PACKETBUF_ATTR_MAC_SEQNO); + received_seqnos[0].timestamp = clock_time(); linkaddr_copy(&received_seqnos[0].sender, packetbuf_addr(PACKETBUF_ADDR_SENDER)); } From 442e1be391f083dfe2d60d28cec251624509ba81 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Fri, 24 Jun 2016 23:34:23 +0200 Subject: [PATCH 209/345] Moved project-conf.h inclusion to the top of contiki-conf.h --- platform/z1/contiki-conf.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/platform/z1/contiki-conf.h b/platform/z1/contiki-conf.h index 44d74efdb..e16b9db8a 100644 --- a/platform/z1/contiki-conf.h +++ b/platform/z1/contiki-conf.h @@ -33,6 +33,10 @@ #include "platform-conf.h" +#ifdef PROJECT_CONF_H +#include PROJECT_CONF_H +#endif /* PROJECT_CONF_H */ + #define XMAC_CONF_COMPOWER 1 #define CXMAC_CONF_COMPOWER 1 @@ -94,11 +98,11 @@ #endif #ifndef CC2420_CONF_CHANNEL -#define CC2420_CONF_CHANNEL 26 +#define CC2420_CONF_CHANNEL 26 #endif /* CC2420_CONF_CHANNEL */ #ifndef CC2420_CONF_CCA_THRESH -#define CC2420_CONF_CCA_THRESH -45 +#define CC2420_CONF_CCA_THRESH -45 #endif /* CC2420_CONF_CCA_THRESH */ #define IEEE802154_CONF_PANID 0xABCD @@ -142,15 +146,15 @@ #define UIP_CONF_ROUTER 1 /* Handle 10 neighbors */ -#define NBR_TABLE_CONF_MAX_NEIGHBORS 15 +#define NBR_TABLE_CONF_MAX_NEIGHBORS 15 /* Handle 10 routes */ -#define UIP_CONF_MAX_ROUTES 15 +#define UIP_CONF_MAX_ROUTES 15 #define UIP_CONF_ND6_SEND_RA 0 #define UIP_CONF_ND6_REACHABLE_TIME 600000 #define UIP_CONF_ND6_RETRANS_TIMER 10000 -#define NETSTACK_CONF_WITH_IPV6 1 +#define NETSTACK_CONF_WITH_IPV6 1 #define UIP_CONF_IPV6_QUEUE_PKT 0 #define UIP_CONF_IPV6_CHECKS 1 #define UIP_CONF_IPV6_REASSEMBLY 0 @@ -165,8 +169,8 @@ #endif /* SICSLOWPAN_CONF_FRAG */ #define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2 #else /* NETSTACK_CONF_WITH_IPV6 */ -#define UIP_CONF_IP_FORWARD 1 -#define UIP_CONF_BUFFER_SIZE 108 +#define UIP_CONF_IP_FORWARD 1 +#define UIP_CONF_BUFFER_SIZE 108 #endif /* NETSTACK_CONF_WITH_IPV6 */ #define UIP_CONF_ICMP_DEST_UNREACH 1 @@ -188,8 +192,4 @@ #define UIP_CONF_TCP_SPLIT 0 -#ifdef PROJECT_CONF_H -#include PROJECT_CONF_H -#endif /* PROJECT_CONF_H */ - #endif /* CONTIKI_CONF_H */ From 1002b7ffee2b91e7fc54e1a7f33390ec3e9240da Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Fri, 24 Jun 2016 23:36:40 +0200 Subject: [PATCH 210/345] Fixed spacing --- platform/z1/contiki-conf.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/platform/z1/contiki-conf.h b/platform/z1/contiki-conf.h index e16b9db8a..f2674452a 100644 --- a/platform/z1/contiki-conf.h +++ b/platform/z1/contiki-conf.h @@ -87,14 +87,14 @@ #define COLLECT_NBR_TABLE_CONF_MAX_NEIGHBORS 32 -#define QUEUEBUF_CONF_NUM 8 +#define QUEUEBUF_CONF_NUM 8 #endif /* NETSTACK_CONF_WITH_IPV6 */ #define PACKETBUF_CONF_ATTRS_INLINE 1 #ifdef RF_CHANNEL -#define CC2420_CONF_CHANNEL RF_CHANNEL +#define CC2420_CONF_CHANNEL RF_CHANNEL #endif #ifndef CC2420_CONF_CHANNEL @@ -111,22 +111,22 @@ * use 15ms instead. */ #define TSCH_CONF_DEFAULT_TIMESLOT_LENGTH 15000 -#define SHELL_VARS_CONF_RAM_BEGIN 0x1100 -#define SHELL_VARS_CONF_RAM_END 0x2000 +#define SHELL_VARS_CONF_RAM_BEGIN 0x1100 +#define SHELL_VARS_CONF_RAM_END 0x2000 #define CFS_CONF_OFFSET_TYPE long -#define PROFILE_CONF_ON 0 -#define ENERGEST_CONF_ON 1 +#define PROFILE_CONF_ON 0 +#define ENERGEST_CONF_ON 1 -#define ELFLOADER_CONF_TEXT_IN_ROM 0 -#define ELFLOADER_CONF_DATAMEMORY_SIZE 0x400 -#define ELFLOADER_CONF_TEXTMEMORY_SIZE 0x800 +#define ELFLOADER_CONF_TEXT_IN_ROM 0 +#define ELFLOADER_CONF_DATAMEMORY_SIZE 0x400 +#define ELFLOADER_CONF_TEXTMEMORY_SIZE 0x800 #define AODV_COMPLIANCE -#define AODV_NUM_RT_ENTRIES 32 +#define AODV_NUM_RT_ENTRIES 32 -#define WITH_ASCII 1 +#define WITH_ASCII 1 #define PROCESS_CONF_NUMEVENTS 8 #define PROCESS_CONF_STATS 1 @@ -134,16 +134,16 @@ #define UART0_CONF_TX_WITH_INTERRUPT 0 /* So far, printfs without interrupt. */ -#define UART0_CONF_RX_WITH_DMA 0 +#define UART0_CONF_RX_WITH_DMA 0 #ifdef NETSTACK_CONF_WITH_IPV6 -#define LINKADDR_CONF_SIZE 8 +#define LINKADDR_CONF_SIZE 8 -#define UIP_CONF_LL_802154 1 -#define UIP_CONF_LLH_LEN 0 +#define UIP_CONF_LL_802154 1 +#define UIP_CONF_LLH_LEN 0 -#define UIP_CONF_ROUTER 1 +#define UIP_CONF_ROUTER 1 /* Handle 10 neighbors */ #define NBR_TABLE_CONF_MAX_NEIGHBORS 15 @@ -160,7 +160,7 @@ #define UIP_CONF_IPV6_REASSEMBLY 0 #define UIP_CONF_NETIF_MAX_ADDRESSES 3 #define UIP_CONF_IP_FORWARD 0 -#define UIP_CONF_BUFFER_SIZE 140 +#define UIP_CONF_BUFFER_SIZE 140 #define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 #ifndef SICSLOWPAN_CONF_FRAG From 0034322fe0428b18d7f2f44b6d2dbb359efce010 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Fri, 24 Jun 2016 23:43:15 +0200 Subject: [PATCH 211/345] Made configuration parameters easily overridable from project-conf.h (without having to undef first) --- platform/z1/contiki-conf.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/platform/z1/contiki-conf.h b/platform/z1/contiki-conf.h index f2674452a..7ae4b34af 100644 --- a/platform/z1/contiki-conf.h +++ b/platform/z1/contiki-conf.h @@ -105,7 +105,9 @@ #define CC2420_CONF_CCA_THRESH -45 #endif /* CC2420_CONF_CCA_THRESH */ +#ifndef IEEE802154_CONF_PANID #define IEEE802154_CONF_PANID 0xABCD +#endif /* The TSCH default slot length of 10ms is a bit too short for this platform, * use 15ms instead. */ @@ -146,9 +148,14 @@ #define UIP_CONF_ROUTER 1 /* Handle 10 neighbors */ +#ifndef NBR_TABLE_CONF_MAX_NEIGHBORS #define NBR_TABLE_CONF_MAX_NEIGHBORS 15 +#endif + /* Handle 10 routes */ +#ifndef UIP_CONF_MAX_ROUTES #define UIP_CONF_MAX_ROUTES 15 +#endif #define UIP_CONF_ND6_SEND_RA 0 #define UIP_CONF_ND6_REACHABLE_TIME 600000 @@ -160,7 +167,10 @@ #define UIP_CONF_IPV6_REASSEMBLY 0 #define UIP_CONF_NETIF_MAX_ADDRESSES 3 #define UIP_CONF_IP_FORWARD 0 + +#ifndef UIP_CONF_BUFFER_SIZE #define UIP_CONF_BUFFER_SIZE 140 +#endif #define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 #ifndef SICSLOWPAN_CONF_FRAG @@ -170,7 +180,11 @@ #define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2 #else /* NETSTACK_CONF_WITH_IPV6 */ #define UIP_CONF_IP_FORWARD 1 + +#ifndef UIP_CONF_BUFFER_SIZE #define UIP_CONF_BUFFER_SIZE 108 +#endif + #endif /* NETSTACK_CONF_WITH_IPV6 */ #define UIP_CONF_ICMP_DEST_UNREACH 1 From 99822545c5dad72de2759560d87fda5195f79bf7 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Fri, 24 Jun 2016 23:58:32 +0200 Subject: [PATCH 212/345] Added BOARD_STRING to the Z1 platform --- platform/z1/contiki-conf.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platform/z1/contiki-conf.h b/platform/z1/contiki-conf.h index 7ae4b34af..1be18c997 100644 --- a/platform/z1/contiki-conf.h +++ b/platform/z1/contiki-conf.h @@ -206,4 +206,6 @@ #define UIP_CONF_TCP_SPLIT 0 +#define BOARD_STRING "Zolertia Z1 platform" + #endif /* CONTIKI_CONF_H */ From 108e43b10371dbb57ad6b7f30ab31b5a4564f7f0 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Sat, 25 Jun 2016 22:23:58 +0200 Subject: [PATCH 213/345] Made configuration parameters easily overridable to be consistent with Travis CI tests --- platform/z1/contiki-conf.h | 147 ++++++++++++++++++++++--------------- 1 file changed, 89 insertions(+), 58 deletions(-) diff --git a/platform/z1/contiki-conf.h b/platform/z1/contiki-conf.h index 1be18c997..536b51913 100644 --- a/platform/z1/contiki-conf.h +++ b/platform/z1/contiki-conf.h @@ -43,11 +43,23 @@ #if NETSTACK_CONF_WITH_IPV6 /* Network setup for IPv6 */ -#define NETSTACK_CONF_NETWORK sicslowpan_driver -#define NETSTACK_CONF_MAC csma_driver -#define NETSTACK_CONF_RDC contikimac_driver -#define NETSTACK_CONF_RADIO cc2420_driver -#define NETSTACK_CONF_FRAMER framer_802154 +#ifndef NETSTACK_CONF_NETWORK +#define NETSTACK_CONF_NETWORK sicslowpan_driver +#endif + +#ifndef NETSTACK_CONF_MAC +#define NETSTACK_CONF_MAC csma_driver +#endif + +#ifndef NETSTACK_CONF_RDC +#define NETSTACK_CONF_RDC contikimac_driver +#endif + +#ifndef NETSTACK_CONF_FRAMER +#define NETSTACK_CONF_FRAMER framer_802154 +#endif + +#define NETSTACK_CONF_RADIO cc2420_driver /* Specify a minimum packet size for 6lowpan compression to be enabled. This is needed for ContikiMAC, which needs packets to be @@ -55,84 +67,103 @@ used. */ #define SICSLOWPAN_CONF_COMPRESSION_THRESHOLD 63 -#define CC2420_CONF_AUTOACK 1 -#define NETSTACK_RDC_CHANNEL_CHECK_RATE 8 -#define RIME_CONF_NO_POLITE_ANNOUCEMENTS 0 -#define CXMAC_CONF_ANNOUNCEMENTS 0 -#define XMAC_CONF_ANNOUNCEMENTS 0 +#define CC2420_CONF_AUTOACK 1 +#define NETSTACK_RDC_CHANNEL_CHECK_RATE 8 +#define RIME_CONF_NO_POLITE_ANNOUCEMENTS 0 +#define CXMAC_CONF_ANNOUNCEMENTS 0 +#define XMAC_CONF_ANNOUNCEMENTS 0 -#define QUEUEBUF_CONF_NUM 4 +#ifndef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +#endif #else /* NETSTACK_CONF_WITH_IPV6 */ /* Network setup for non-IPv6 (rime). */ +#ifndef NETSTACK_CONF_NETWORK +#define NETSTACK_CONF_NETWORK rime_driver +#endif -#define NETSTACK_CONF_NETWORK rime_driver -#define NETSTACK_CONF_MAC csma_driver -#define NETSTACK_CONF_RDC contikimac_driver +#ifndef NETSTACK_CONF_MAC +#define NETSTACK_CONF_MAC csma_driver +#endif + +#ifndef NETSTACK_CONF_RDC +#define NETSTACK_CONF_RDC contikimac_driver +#endif + +#ifndef NETSTACK_CONF_FRAMER +#define NETSTACK_CONF_FRAMER contikimac_framer +#endif + +#ifndef NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE #define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8 -#define NETSTACK_CONF_FRAMER contikimac_framer +#endif -#define CC2420_CONF_AUTOACK 1 +#define CC2420_CONF_AUTOACK 1 -#define COLLECT_CONF_ANNOUNCEMENTS 1 -#define RIME_CONF_NO_POLITE_ANNOUCEMENTS 0 -#define CXMAC_CONF_ANNOUNCEMENTS 0 -#define XMAC_CONF_ANNOUNCEMENTS 0 -#define CONTIKIMAC_CONF_ANNOUNCEMENTS 0 +#define COLLECT_CONF_ANNOUNCEMENTS 1 +#define RIME_CONF_NO_POLITE_ANNOUCEMENTS 0 +#define CXMAC_CONF_ANNOUNCEMENTS 0 +#define XMAC_CONF_ANNOUNCEMENTS 0 +#define CONTIKIMAC_CONF_ANNOUNCEMENTS 0 -#define CONTIKIMAC_CONF_COMPOWER 1 -#define XMAC_CONF_COMPOWER 1 -#define CXMAC_CONF_COMPOWER 1 +#define CONTIKIMAC_CONF_COMPOWER 1 +#define XMAC_CONF_COMPOWER 1 +#define CXMAC_CONF_COMPOWER 1 -#define COLLECT_NBR_TABLE_CONF_MAX_NEIGHBORS 32 +#define COLLECT_NBR_TABLE_CONF_MAX_NEIGHBORS 32 -#define QUEUEBUF_CONF_NUM 8 +#ifndef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 8 +#endif #endif /* NETSTACK_CONF_WITH_IPV6 */ -#define PACKETBUF_CONF_ATTRS_INLINE 1 +#define PACKETBUF_CONF_ATTRS_INLINE 1 #ifdef RF_CHANNEL -#define CC2420_CONF_CHANNEL RF_CHANNEL +#define CC2420_CONF_CHANNEL RF_CHANNEL #endif #ifndef CC2420_CONF_CHANNEL -#define CC2420_CONF_CHANNEL 26 +#define CC2420_CONF_CHANNEL 26 #endif /* CC2420_CONF_CHANNEL */ #ifndef CC2420_CONF_CCA_THRESH -#define CC2420_CONF_CCA_THRESH -45 +#define CC2420_CONF_CCA_THRESH -45 #endif /* CC2420_CONF_CCA_THRESH */ #ifndef IEEE802154_CONF_PANID -#define IEEE802154_CONF_PANID 0xABCD +#define IEEE802154_CONF_PANID 0xABCD #endif /* The TSCH default slot length of 10ms is a bit too short for this platform, * use 15ms instead. */ +#ifndef TSCH_CONF_DEFAULT_TIMESLOT_LENGTH #define TSCH_CONF_DEFAULT_TIMESLOT_LENGTH 15000 +#endif #define SHELL_VARS_CONF_RAM_BEGIN 0x1100 #define SHELL_VARS_CONF_RAM_END 0x2000 -#define CFS_CONF_OFFSET_TYPE long +#define CFS_CONF_OFFSET_TYPE long -#define PROFILE_CONF_ON 0 -#define ENERGEST_CONF_ON 1 +#define PROFILE_CONF_ON 0 +#define ENERGEST_CONF_ON 1 #define ELFLOADER_CONF_TEXT_IN_ROM 0 #define ELFLOADER_CONF_DATAMEMORY_SIZE 0x400 #define ELFLOADER_CONF_TEXTMEMORY_SIZE 0x800 #define AODV_COMPLIANCE -#define AODV_NUM_RT_ENTRIES 32 +#define AODV_NUM_RT_ENTRIES 32 -#define WITH_ASCII 1 +#define WITH_ASCII 1 -#define PROCESS_CONF_NUMEVENTS 8 -#define PROCESS_CONF_STATS 1 -/*#define PROCESS_CONF_FASTPOLL 4*/ +#define PROCESS_CONF_NUMEVENTS 8 +#define PROCESS_CONF_STATS 1 +/*#define PROCESS_CONF_FASTPOLL 4*/ #define UART0_CONF_TX_WITH_INTERRUPT 0 /* So far, printfs without interrupt. */ @@ -157,7 +188,7 @@ #define UIP_CONF_MAX_ROUTES 15 #endif -#define UIP_CONF_ND6_SEND_RA 0 +#define UIP_CONF_ND6_SEND_RA 0 #define UIP_CONF_ND6_REACHABLE_TIME 600000 #define UIP_CONF_ND6_RETRANS_TIMER 10000 @@ -179,33 +210,33 @@ #endif /* SICSLOWPAN_CONF_FRAG */ #define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2 #else /* NETSTACK_CONF_WITH_IPV6 */ -#define UIP_CONF_IP_FORWARD 1 +#define UIP_CONF_IP_FORWARD 1 #ifndef UIP_CONF_BUFFER_SIZE -#define UIP_CONF_BUFFER_SIZE 108 +#define UIP_CONF_BUFFER_SIZE 108 #endif #endif /* NETSTACK_CONF_WITH_IPV6 */ -#define UIP_CONF_ICMP_DEST_UNREACH 1 +#define UIP_CONF_ICMP_DEST_UNREACH 1 #define UIP_CONF_DHCP_LIGHT -#define UIP_CONF_LLH_LEN 0 -#define UIP_CONF_RECEIVE_WINDOW 48 -#define UIP_CONF_TCP_MSS 48 -#define UIP_CONF_MAX_CONNECTIONS 4 -#define UIP_CONF_MAX_LISTENPORTS 8 -#define UIP_CONF_UDP_CONNS 12 -#define UIP_CONF_FWCACHE_SIZE 30 -#define UIP_CONF_BROADCAST 1 -#define UIP_ARCH_IPCHKSUM 1 -#define UIP_CONF_UDP 1 -#define UIP_CONF_UDP_CHECKSUMS 1 -#define UIP_CONF_PINGADDRCONF 0 -#define UIP_CONF_LOGGING 0 +#define UIP_CONF_LLH_LEN 0 +#define UIP_CONF_RECEIVE_WINDOW 48 +#define UIP_CONF_TCP_MSS 48 +#define UIP_CONF_MAX_CONNECTIONS 4 +#define UIP_CONF_MAX_LISTENPORTS 8 +#define UIP_CONF_UDP_CONNS 12 +#define UIP_CONF_FWCACHE_SIZE 30 +#define UIP_CONF_BROADCAST 1 +#define UIP_ARCH_IPCHKSUM 1 +#define UIP_CONF_UDP 1 +#define UIP_CONF_UDP_CHECKSUMS 1 +#define UIP_CONF_PINGADDRCONF 0 +#define UIP_CONF_LOGGING 0 -#define UIP_CONF_TCP_SPLIT 0 +#define UIP_CONF_TCP_SPLIT 0 -#define BOARD_STRING "Zolertia Z1 platform" +#define BOARD_STRING "Zolertia Z1 platform" #endif /* CONTIKI_CONF_H */ From ab1652648ea47fd7dd4eebb2ec605fa2313553dc Mon Sep 17 00:00:00 2001 From: Arthur Fabre Date: Tue, 14 Jun 2016 15:10:23 +0100 Subject: [PATCH 214/345] zoul: Add support for flashing to multiple devices This adds support for flashing to multiple devices, by implementing the $MOTES option used by the Z1. This replaces the $PORT interface, as it only allowed flashing to one device at a time, and the $MOTES interface was still used for other tasks (such as getting a list of connected devices). A foreach loop is used to dynamically create an upload rule per device that needs to be flashed. The "main" upload rule depends on the device specific ones. This allows for parallel flashing. The PORT variable can still be sued for backwards compatibility. Changed the MOTES variable that makes a $(shell) call to not be recursively expanded. --- platform/zoul/Makefile.zoul | 54 +++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/platform/zoul/Makefile.zoul b/platform/zoul/Makefile.zoul index 49e6ed13b..1adb5eea7 100644 --- a/platform/zoul/Makefile.zoul +++ b/platform/zoul/Makefile.zoul @@ -12,10 +12,6 @@ endif PYTHON = python BSL_FLAGS += -e -w -v -ifdef PORT - BSL_FLAGS += -p $(PORT) -endif - ### Configure the build for the board and pull in board-specific sources CONTIKI_TARGET_DIRS += . dev CONTIKI_TARGET_DIRS += . $(BOARD) @@ -57,28 +53,48 @@ endif ### Detect if a mote is connected over serial port ifeq ($(HOST_OS),Darwin) USBDEVPREFIX= - MOTELIST = $(CONTIKI)/tools/zolertia/motelist-zolertia-macos - MOTES = $(shell $(MOTELIST) -c 2>&- | cut -f 2 -d ,) - SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-macos + MOTELIST := $(CONTIKI)/tools/zolertia/motelist-zolertia-macos + MOTES := $(shell $(MOTELIST) -c 2>&- | cut -f 2 -d ,) + SERIALDUMP := $(CONTIKI)/tools/sky/serialdump-macos else ### If we are not running under Mac, we assume Linux USBDEVPREFIX= - SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-linux - MOTELIST = $(CONTIKI)/tools/zolertia/motelist-zolertia - MOTES = $(shell $(MOTELIST) -b $(MOTELIST_ZOLERTIA) -c 2>&- | cut -f 2 -d , | \ + SERIALDUMP := $(CONTIKI)/tools/sky/serialdump-linux + MOTELIST := $(CONTIKI)/tools/zolertia/motelist-zolertia + MOTES := $(shell $(MOTELIST) -b $(MOTELIST_ZOLERTIA) -c 2>&- | cut -f 2 -d , | \ perl -ne 'print $$1 . " " if(m-(/dev/\w+)-);') endif -%.upload: %.bin %.elf +### If PORT is defined, override to keep backward compatibility +ifdef PORT + MOTES := $(PORT) +endif + +### Check the BSL script exists ifeq ($(wildcard $(BSL)), ) +%.upload: @echo "ERROR: Could not find the cc2538-bsl script. Did you run 'git submodule update --init' ?" else - $(eval BSL_ADDRESS_ARG := -a $(shell $(OBJDUMP) -h $*.elf | grep -B1 LOAD | \ - grep -Ev 'LOAD|\-\-' | awk '{print "0x" $$5}' | \ - sort -g | head -1)) - $(PYTHON) $(BSL) $(BSL_FLAGS) $(BSL_ADDRESS_ARG) $< +### Upload to every MOTE +%.upload: $(foreach MOTE,$(MOTES),%.$(MOTE)) + @# Dummy recipe to prevent "No rule to make *.upload errors" endif +### Variable that expands into a pattern rule to upload to a given MOTE. +### Requires $(MOTE) to be defined +### $$$$ Double escapes $s that need to be passed to the shell - once for when make parses UPLOAD_RULE, and once for when the expanded rule is parsed by make. +define UPLOAD_RULE +%.$(MOTE): %.bin %.elf + @echo "Flashing $(MOTE)" + @BSL_ADDRESS=`$(OBJDUMP) -h $$*.elf | grep -B1 LOAD | \ + grep -Ev 'LOAD|\-\-' | awk '{print "0x" $$$$5}' | \ + sort -g | head -1`; \ + $(PYTHON) $(BSL) $(BSL_FLAGS) -a $$$${BSL_ADDRESS} -p $(MOTE) $$< +endef + +### Create an upload rule for every MOTE connected +$(foreach MOTE,$(MOTES),$(eval $(UPLOAD_RULE))) + motelist: $(MOTELIST) zoul-motelist: @@ -86,16 +102,8 @@ zoul-motelist: zoul-motes: @echo $(MOTES) -ifdef PORT -serialview: - $(SERIALDUMP) -b115200 $(USBDEVPREFIX) $(PORT) | $(CONTIKI)/tools/timestamp - -login: - $(SERIALDUMP) -b115200 $(USBDEVPREFIX) $(PORT) -else serialview: $(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(firstword $(MOTES)) | $(CONTIKI)/tools/timestamp login: $(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(firstword $(MOTES)) -endif From e361c49f14fab76c9cc02116b10cecd5d2b3f789 Mon Sep 17 00:00:00 2001 From: Yasuyuki Tanaka Date: Mon, 27 Jun 2016 20:57:48 +0200 Subject: [PATCH 215/345] RPL non-storing: fix a bug causing an infinite loop It falls into an infinite loop if it goes to the default label in the switch statement of rpl_srh_get_next_hop() or rpl_process_srh_header(). --- core/net/rpl/rpl-ext-header.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index b6d17d4a9..655df1674 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -195,12 +195,6 @@ rpl_srh_get_next_hop(uip_ipaddr_t *ipaddr) /* Look for routing header */ while(uip_next_hdr != NULL && *uip_next_hdr != UIP_PROTO_ROUTING) { switch(*uip_next_hdr) { - case UIP_PROTO_TCP: - case UIP_PROTO_UDP: - case UIP_PROTO_ICMP6: - case UIP_PROTO_NONE: - uip_next_hdr = NULL; - break; case UIP_PROTO_HBHO: case UIP_PROTO_DESTO: case UIP_PROTO_FRAG: @@ -211,6 +205,7 @@ rpl_srh_get_next_hop(uip_ipaddr_t *ipaddr) uip_next_hdr = &UIP_EXT_BUF->next; break; default: + uip_next_hdr = NULL; break; } } @@ -249,12 +244,6 @@ rpl_process_srh_header(void) /* Look for routing header */ while(uip_next_hdr != NULL && *uip_next_hdr != UIP_PROTO_ROUTING) { switch(*uip_next_hdr) { - case UIP_PROTO_TCP: - case UIP_PROTO_UDP: - case UIP_PROTO_ICMP6: - case UIP_PROTO_NONE: - uip_next_hdr = NULL; - break; case UIP_PROTO_HBHO: case UIP_PROTO_DESTO: case UIP_PROTO_FRAG: @@ -265,6 +254,7 @@ rpl_process_srh_header(void) uip_next_hdr = &UIP_EXT_BUF->next; break; default: + uip_next_hdr = NULL; break; } } From 5a79bad4b1da84d3e41985d113b800c30128dcab Mon Sep 17 00:00:00 2001 From: Yasuyuki Tanaka Date: Mon, 27 Jun 2016 20:57:48 +0200 Subject: [PATCH 216/345] RPL: prevent unintended memory access (rpl_remove_header) When it goes to the default label in the switch statement of rpl_remove_header(), UIP_EXT_BUF does not always point to an IPv6 extension header. "Move to next header" process should be done only in case of UIP_PROTO_DESTO. Otherwise, it returns with doing nothing. --- core/net/rpl/rpl-ext-header.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index 655df1674..b13adb916 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -655,11 +655,6 @@ rpl_remove_header(void) /* Look for hop-by-hop and routing headers */ while(uip_next_hdr != NULL) { switch(*uip_next_hdr) { - case UIP_PROTO_TCP: - case UIP_PROTO_UDP: - case UIP_PROTO_ICMP6: - case UIP_PROTO_NONE: - return; case UIP_PROTO_HBHO: case UIP_PROTO_ROUTING: /* Remove hop-by-hop and routing headers */ @@ -674,13 +669,22 @@ rpl_remove_header(void) PRINTF("RPL: Removing RPL extension header (type %u, len %u)\n", *uip_next_hdr, rpl_ext_hdr_len); memmove(UIP_EXT_BUF, ((uint8_t *)UIP_EXT_BUF) + rpl_ext_hdr_len, uip_len - UIP_IPH_LEN); break; - default: + case UIP_PROTO_DESTO: + /* + * As per RFC 2460, any header other than the Destination + * Options header does not appear between the Hop-by-Hop + * Options header and the Routing header. + * + * We're moving to the next header only if uip_next_hdr has + * UIP_PROTO_DESTO. Otherwise, we'll return. + */ /* Move to next header */ if(uip_next_hdr != &UIP_IP_BUF->proto) { uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; } uip_next_hdr = &UIP_EXT_BUF->next; - break; + default: + return; } } } From 13f18fd842bf93223fb54481a3e6d5bdef921f1c Mon Sep 17 00:00:00 2001 From: Yasuyuki Tanaka Date: Mon, 27 Jun 2016 20:57:48 +0200 Subject: [PATCH 217/345] RPL: update uip_ext_len whenever moving to next header (rpl-ext-header.c) --- core/net/rpl/rpl-ext-header.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index b13adb916..e7f6428a3 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -199,10 +199,8 @@ rpl_srh_get_next_hop(uip_ipaddr_t *ipaddr) case UIP_PROTO_DESTO: case UIP_PROTO_FRAG: /* Move to next header */ - if(uip_next_hdr != &UIP_IP_BUF->proto) { - uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; - } uip_next_hdr = &UIP_EXT_BUF->next; + uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; break; default: uip_next_hdr = NULL; @@ -248,10 +246,8 @@ rpl_process_srh_header(void) case UIP_PROTO_DESTO: case UIP_PROTO_FRAG: /* Move to next header */ - if(uip_next_hdr != &UIP_IP_BUF->proto) { - uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; - } uip_next_hdr = &UIP_EXT_BUF->next; + uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; break; default: uip_next_hdr = NULL; @@ -679,10 +675,8 @@ rpl_remove_header(void) * UIP_PROTO_DESTO. Otherwise, we'll return. */ /* Move to next header */ - if(uip_next_hdr != &UIP_IP_BUF->proto) { - uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; - } uip_next_hdr = &UIP_EXT_BUF->next; + uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; default: return; } From ffdc53718ddef7175e911a3fc45b8eb1693c5800 Mon Sep 17 00:00:00 2001 From: Yasuyuki Tanaka Date: Mon, 27 Jun 2016 20:57:48 +0200 Subject: [PATCH 218/345] RPL: code cleanup (rpl-ext-header.c) --- core/net/rpl/rpl-ext-header.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index e7f6428a3..5ba429a26 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -154,8 +154,8 @@ rpl_verify_hbh_header(int uip_ext_opt_offset) if((down && !sender_closer) || (!down && sender_closer)) { PRINTF("RPL: Loop detected - senderrank: %d my-rank: %d sender_closer: %d\n", - sender_rank, instance->current_dag->rank, - sender_closer); + sender_rank, instance->current_dag->rank, + sender_closer); /* Attempt to repair the loop by sending a unicast DIO back to the sender * so that it gets a fresh update of our rank. */ if(sender != NULL) { @@ -197,7 +197,11 @@ rpl_srh_get_next_hop(uip_ipaddr_t *ipaddr) switch(*uip_next_hdr) { case UIP_PROTO_HBHO: case UIP_PROTO_DESTO: - case UIP_PROTO_FRAG: + /* + * As per RFC 2460, only the Hop-by-Hop Options header and + * Destination Options header can appear before the Routing + * header. + */ /* Move to next header */ uip_next_hdr = &UIP_EXT_BUF->next; uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; @@ -244,7 +248,11 @@ rpl_process_srh_header(void) switch(*uip_next_hdr) { case UIP_PROTO_HBHO: case UIP_PROTO_DESTO: - case UIP_PROTO_FRAG: + /* + * As per RFC 2460, only the Hop-by-Hop Options header and + * Destination Options header can appear before the Routing + * header. + */ /* Move to next header */ uip_next_hdr = &UIP_EXT_BUF->next; uip_ext_len += (UIP_EXT_BUF->len << 3) + 8; From 9caaf260129731e4ca5e2ee9ef3ba1d9251c354b Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Mon, 27 Jun 2016 19:48:15 +0300 Subject: [PATCH 219/345] CC26xx: fix a regression in and refactor LPM code --- cpu/cc26xx-cc13xx/lpm.c | 178 +++++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 65 deletions(-) diff --git a/cpu/cc26xx-cc13xx/lpm.c b/cpu/cc26xx-cc13xx/lpm.c index 3253202c2..78aa2c764 100644 --- a/cpu/cc26xx-cc13xx/lpm.c +++ b/cpu/cc26xx-cc13xx/lpm.c @@ -83,7 +83,7 @@ LIST(modules_list); #define SLEEP_GUARD_TIME (RTIMER_SECOND / 1000) /* 1.0 ms */ #define MAX_SLEEP_TIME RTIMER_SECOND -#define MINIMAL_SAFE_SCHEDULE 8u +#define MIN_SAFE_SCHEDULE 8u /*---------------------------------------------------------------------------*/ /* Prototype of a function in clock.c. Called every time we come out of DS */ void clock_update(void); @@ -251,71 +251,71 @@ wake_up(void) #endif } /*---------------------------------------------------------------------------*/ -static int -setup_sleep_mode(rtimer_clock_t *next_timer) +static uint8_t +check_next_rtimer(rtimer_clock_t now, rtimer_clock_t *next_rtimer, bool *next_rtimer_set) +{ + uint8_t max_pm = LPM_MODE_MAX_SUPPORTED; + + if(ti_lib_aon_rtc_channel_active(AON_RTC_CH0)) { + *next_rtimer_set = true; + + /* find out the timer of the next rtimer interrupt */ + *next_rtimer = ti_lib_aon_rtc_compare_value_get(AON_RTC_CH0); + + if(RTIMER_CLOCK_LT(*next_rtimer, now + 2)) { + max_pm = MIN(max_pm, LPM_MODE_AWAKE); + } else if(RTIMER_CLOCK_LT(*next_rtimer, now + STANDBY_MIN_DURATION)) { + max_pm = MIN(max_pm, LPM_MODE_SLEEP); + } + } else { + *next_rtimer_set = false; + } + + return max_pm; +} +/*---------------------------------------------------------------------------*/ +static uint8_t +check_next_etimer(rtimer_clock_t now, rtimer_clock_t *next_etimer, bool *next_etimer_set) +{ + uint8_t max_pm = LPM_MODE_MAX_SUPPORTED; + + *next_etimer_set = false; + + /* Find out the time of the next etimer */ + if(etimer_pending()) { + int32_t until_next_etimer = (int32_t)etimer_next_expiration_time() - (int32_t)clock_time(); + if(until_next_etimer < 1) { + max_pm = MIN(max_pm, LPM_MODE_AWAKE); + } else { + *next_etimer_set = true; + *next_etimer = soc_rtc_last_isr_time() + (until_next_etimer * (RTIMER_SECOND / CLOCK_SECOND)); + if(RTIMER_CLOCK_LT(*next_etimer, now + STANDBY_MIN_DURATION)) { + max_pm = MIN(max_pm, LPM_MODE_SLEEP); + } + } + } + + return max_pm; +} +/*---------------------------------------------------------------------------*/ +static uint8_t +setup_sleep_mode(void) { lpm_registered_module_t *module; uint8_t max_pm = LPM_MODE_MAX_SUPPORTED; + uint8_t pm; - rtimer_clock_t now = RTIMER_NOW(); - const rtimer_clock_t max_sleep = now + MAX_SLEEP_TIME; - - /* next_timer will hold the time of the next system wakeup due to a timer*/ - *next_timer = max_sleep; + rtimer_clock_t now; + rtimer_clock_t next_rtimer = 0; + rtimer_clock_t next_etimer = 0; + bool next_rtimer_set = false; + bool next_etimer_set = false; /* Check if any events fired before we turned interrupts off. If so, abort */ if(LPM_MODE_MAX_SUPPORTED == LPM_MODE_AWAKE || process_nevents()) { return LPM_MODE_AWAKE; } - if(ti_lib_aon_rtc_channel_active(AON_RTC_CH0)) { - rtimer_clock_t next_rtimer; - /* find out the timer of the next rtimer interrupt */ - next_rtimer = ti_lib_aon_rtc_compare_value_get(AON_RTC_CH0); - if(RTIMER_CLOCK_LT(next_rtimer, now + 2)) { - return LPM_MODE_AWAKE; - } - if(RTIMER_CLOCK_LT(next_rtimer, now + STANDBY_MIN_DURATION)) { - return LPM_MODE_SLEEP; - } - *next_timer = next_rtimer; - } - - /* also find out the timer of the next etimer */ - if(etimer_pending()) { - int32_t until_next_etimer; - rtimer_clock_t next_etimer; - - until_next_etimer = (int32_t)etimer_next_expiration_time() - (int32_t)clock_time(); - if(until_next_etimer < 1) { - return LPM_MODE_AWAKE; - } - - next_etimer = soc_rtc_last_isr_time() + (until_next_etimer * (RTIMER_SECOND / CLOCK_SECOND)); - if(RTIMER_CLOCK_LT(next_etimer, now + STANDBY_MIN_DURATION)) { - /* ensure that we schedule sleep a minimal number of ticks into the - future */ - soc_rtc_schedule_one_shot(AON_RTC_CH1, now + MINIMAL_SAFE_SCHEDULE); - return LPM_MODE_SLEEP; - } - - if(RTIMER_CLOCK_LT(max_sleep, next_etimer)) { - /* if max_pm is LPM_MODE_SLEEP, we could trigger the watchdog if we slept - for too long. */ - if(RTIMER_CLOCK_LT(max_sleep, *next_timer)) { - soc_rtc_schedule_one_shot(AON_RTC_CH1, max_sleep); - } - } else { - /* Reschedule AON RTC CH1 to fire just in time for the next etimer event */ - soc_rtc_schedule_one_shot(AON_RTC_CH1, next_etimer); - } - - if(RTIMER_CLOCK_LT(next_etimer, *next_timer)) { - /* set `next_timer` to the time the first etimer fires */ - *next_timer = next_etimer; - } - } - /* Collect max allowed PM permission from interested modules */ for(module = list_head(modules_list); module != NULL; module = module->next) { @@ -327,6 +327,60 @@ setup_sleep_mode(rtimer_clock_t *next_timer) } } + now = RTIMER_NOW(); + + pm = check_next_rtimer(now, &next_rtimer, &next_rtimer_set); + if(pm < max_pm) { + max_pm = pm; + } + pm = check_next_etimer(now, &next_etimer, &next_etimer_set); + if(pm < max_pm) { + max_pm = pm; + } + + if(max_pm == LPM_MODE_SLEEP) { + if(next_etimer_set) { + /* Schedule the next system wakeup due to etimer */ + if(RTIMER_CLOCK_LT(next_etimer, now + MIN_SAFE_SCHEDULE)) { + /* Too soon in future, use this minimal interval instead */ + next_etimer = now + MIN_SAFE_SCHEDULE; + } else if(RTIMER_CLOCK_LT(now + MAX_SLEEP_TIME, next_etimer)) { + /* Too far in future, use MAX_SLEEP_TIME instead */ + next_etimer = now + MAX_SLEEP_TIME; + } + soc_rtc_schedule_one_shot(AON_RTC_CH1, next_etimer); + } else { + /* No etimers set. Since by default the CH1 RTC fires once every clock tick, + * need to explicitly schedule a wakeup in the future to save energy. + * But do not stay in this mode for too long, otherwise watchdog will be trigerred. */ + soc_rtc_schedule_one_shot(AON_RTC_CH1, now + MAX_SLEEP_TIME); + } + + } else if(max_pm == LPM_MODE_DEEP_SLEEP) { + /* Watchdog is not enabled, so deep sleep can continue an arbitrary long time. + * On the other hand, if `CC2650_FAST_RADIO_STARTUP` is defined, + * early wakeup before the next rtimer should be scheduled. */ + +#if CC2650_FAST_RADIO_STARTUP + if(next_rtimer_set) { + if(!next_etimer_set || RTIMER_CLOCK_LT(next_rtimer - SLEEP_GUARD_TIME, next_etimer)) { + /* schedule a wakeup briefly before the next rtimer to wake up the system */ + soc_rtc_schedule_one_shot(AON_RTC_CH2, next_rtimer - SLEEP_GUARD_TIME); + } + } +#endif + + if(next_etimer_set) { + /* Schedule the next system wakeup due to etimer. + * No need to compare the `next_etimer` to `now` here as this branch + * is only entered when there's sufficient time for deep sleeping. */ + soc_rtc_schedule_one_shot(AON_RTC_CH1, next_etimer); + } else { + /* Use the farthest possible wakeup time */ + soc_rtc_schedule_one_shot(AON_RTC_CH1, now - 1); + } + } + return max_pm; } /*---------------------------------------------------------------------------*/ @@ -350,16 +404,11 @@ lpm_sleep(void) } /*---------------------------------------------------------------------------*/ static void -deep_sleep(rtimer_clock_t next_timer) +deep_sleep(void) { uint32_t domains = LOCKABLE_DOMAINS; lpm_registered_module_t *module; -#if CC2650_FAST_RADIO_STARTUP - /* schedule a wakeup briefly before the next etimer/rtimer to wake up the system */ - soc_rtc_schedule_one_shot(AON_RTC_CH2, next_timer - SLEEP_GUARD_TIME); -#endif - /* * Notify all registered modules that we are dropping to mode X. We do not * need to do this for simple sleep. @@ -490,18 +539,17 @@ void lpm_drop() { uint8_t max_pm; - rtimer_clock_t next_timer; /* Critical. Don't get interrupted! */ ti_lib_int_master_disable(); - max_pm = setup_sleep_mode(&next_timer); + max_pm = setup_sleep_mode(); /* Drop */ if(max_pm == LPM_MODE_SLEEP) { lpm_sleep(); } else if(max_pm == LPM_MODE_DEEP_SLEEP) { - deep_sleep(next_timer); + deep_sleep(); } ti_lib_int_master_enable(); From 1e4141b589c680bc2b048ac187aa55c8351eb304 Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Wed, 29 Jun 2016 01:14:12 +0300 Subject: [PATCH 220/345] CC26xx: change default TSCH guard time to 1.8ms --- platform/srf06-cc26xx/contiki-conf.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/platform/srf06-cc26xx/contiki-conf.h b/platform/srf06-cc26xx/contiki-conf.h index c1546f6a8..bb6eb4e8f 100644 --- a/platform/srf06-cc26xx/contiki-conf.h +++ b/platform/srf06-cc26xx/contiki-conf.h @@ -66,8 +66,8 @@ #endif /* - * Disable turning off HF oscillator when the radio is off: - * You need to set this in order to use TSCH, disable to save more energy. + * If set, the systems keeps the HF crystal oscillator on even when the radio is off. + * You need to set this to 1 to use TSCH with its default 2.2ms or larger guard time. */ #ifndef CC2650_FAST_RADIO_STARTUP #define CC2650_FAST_RADIO_STARTUP 0 @@ -373,12 +373,22 @@ typedef uint32_t rtimer_clock_t; #define TSCH_CONF_TIMESYNC_REMOVE_JITTER 0 #endif +#ifndef TSCH_CONF_BASE_DRIFT_PPM /* The drift compared to "true" 10ms slots. - Enable adaptive sync to enable compensation for this. */ + * Enable adaptive sync to enable compensation for this. */ #define TSCH_CONF_BASE_DRIFT_PPM -977 +#endif /* 10 times per second */ -#define TSCH_CONF_ASSOCIATION_CHANNEL_SWITCH_FREQUENCY 10 +#ifndef TSCH_CONF_CHANNEL_SCAN_DURATION +#define TSCH_CONF_CHANNEL_SCAN_DURATION (CLOCK_SECOND / 10) +#endif + +/* Slightly reduce the TSCH guard time (from 2200 usec to 1800 usec) to make sure + * the CC26xx radio has sufficient time to start up. */ +#ifndef TSCH_CONF_RX_WAIT +#define TSCH_CONF_RX_WAIT 1800 +#endif /** @} */ /*---------------------------------------------------------------------------*/ From b6617f17c5ef49be372d9eee2975536efd6082d6 Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Wed, 29 Jun 2016 01:32:22 +0300 Subject: [PATCH 221/345] CC26xx: always request HF crystal oscillator at radio on() --- cpu/cc26xx-cc13xx/rf-core/ieee-mode.c | 2 -- platform/srf06-cc26xx/contiki-main.c | 5 ----- 2 files changed, 7 deletions(-) diff --git a/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c index 08843d699..8f13eb3ee 100644 --- a/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c +++ b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c @@ -1222,13 +1222,11 @@ on(void) return RF_CORE_CMD_OK; } -#if !CC2650_FAST_RADIO_STARTUP /* * Request the HF XOSC as the source for the HF clock. Needed before we can * use the FS. This will only request, it will _not_ perform the switch. */ oscillators_request_hf_xosc(); -#endif if(rf_is_on()) { PRINTF("on: We were on. PD=%u, RX=0x%04x \n", rf_core_is_accessible(), diff --git a/platform/srf06-cc26xx/contiki-main.c b/platform/srf06-cc26xx/contiki-main.c index b3f5c37f7..b3d64f24a 100644 --- a/platform/srf06-cc26xx/contiki-main.c +++ b/platform/srf06-cc26xx/contiki-main.c @@ -149,11 +149,6 @@ main(void) /* Set the LF XOSC as the LF system clock source */ oscillators_select_lf_xosc(); -#if CC2650_FAST_RADIO_STARTUP - /* Also request HF XOSC to start up */ - oscillators_request_hf_xosc(); -#endif - lpm_init(); board_init(); From 3e987ec138f1892af4c7565c9ac8963e831e4f0c Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Wed, 29 Jun 2016 16:51:38 +0200 Subject: [PATCH 222/345] Border router: include RPL links in HTTP reply when non-storing mode is enabled --- .../ipv6/rpl-border-router/border-router.c | 69 ++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/examples/ipv6/rpl-border-router/border-router.c b/examples/ipv6/rpl-border-router/border-router.c index 84943e68f..90b1fdf23 100644 --- a/examples/ipv6/rpl-border-router/border-router.c +++ b/examples/ipv6/rpl-border-router/border-router.c @@ -41,7 +41,10 @@ #include "net/ip/uip.h" #include "net/ipv6/uip-ds6.h" #include "net/rpl/rpl.h" - +#include "net/rpl/rpl-private.h" +#if RPL_WITH_NON_STORING +#include "net/rpl/rpl-ns.h" +#endif /* RPL_WITH_NON_STORING */ #include "net/netstack.h" #include "dev/button-sensor.h" #include "dev/slip.h" @@ -144,6 +147,9 @@ static PT_THREAD(generate_routes(struct httpd_state *s)) { static uip_ds6_route_t *r; +#if RPL_WITH_NON_STORING + static rpl_ns_node_t *link; +#endif /* RPL_WITH_NON_STORING */ static uip_ds6_nbr_t *nbr; #if BUF_USES_STACK char buf[256]; @@ -210,7 +216,7 @@ PT_THREAD(generate_routes(struct httpd_state *s)) } #endif } - ADD("

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 E2WmhD&Hw-a diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur deleted file mode 100755 index 687929672736bd49639bf1f37ade4458910a7b3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425736 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≈K=i4)5ai9CGV$ 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ℜ>nV;vAWEckKHWK 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 BN0 Date: Mon, 14 Apr 2014 13:27:01 +0200 Subject: [PATCH 127/345] adapt new names and api --- platform/osd-merkur/Makefile.osd-merkur | 2 ++ platform/osd-merkur/contiki-conf.h | 11 +++++------ platform/osd-merkur/contiki-main.c | 14 +++++++------- platform/osd-merkur/params.h | 6 +++--- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index ffc1ca03b..32f882127 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -55,3 +55,5 @@ LDFLAGS += -Wl,--defsym,bootloader_get_mac=0x0001f3a0 include $(CONTIKIAVR)/Makefile.avr include $(CONTIKIAVR)/radio/Makefile.radio + +MODULES += core/net/ipv6 core/net/ipv4 core/net/ip core/net/mac core/net core/net/rime core/net/rpl core/net/mac/sicslowmac core/net/mac/contikimac diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index 6cfe45de1..3df622367 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -38,8 +38,8 @@ * David Kopf */ -#ifndef __CONTIKI_CONF_H__ -#define __CONTIKI_CONF_H__ +#ifndef CONTIKI_CONF_H_ +#define CONTIKI_CONF_H_ /* Platform name, type, and MCU clock rate */ #define PLATFORM_NAME "RFA1" @@ -143,7 +143,7 @@ typedef unsigned short uip_stats_t; #define RDC_CONF_MCU_SLEEP 1 #if UIP_CONF_IPV6 -#define RIMEADDR_CONF_SIZE 8 +#define LINKADDR_CONF_SIZE 8 #define UIP_CONF_ICMP6 1 #define UIP_CONF_UDP 1 //#define UIP_CONF_TCP 1 @@ -151,13 +151,12 @@ typedef unsigned short uip_stats_t; #define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06 #else /* ip4 should build but is largely untested */ -#define RIMEADDR_CONF_SIZE 2 +#define LINKADDR_CONF_SIZE 2 #define NETSTACK_CONF_NETWORK rime_driver #endif #define UIP_CONF_LL_802154 1 #define UIP_CONF_LLH_LEN 0 -//#define UIP_CONF_BUFFER_SIZE 1280 // old 240 /* 10 bytes per stateful address context - see sicslowpan.c */ /* Default is 1 context with prefix aaaa::/64 */ @@ -311,4 +310,4 @@ typedef unsigned short uip_stats_t; #include PROJECT_CONF_H #endif -#endif /* __CONTIKI_CONF_H__ */ +#endif /* CONTIKI_CONF_H_ */ diff --git a/platform/osd-merkur/contiki-main.c b/platform/osd-merkur/contiki-main.c index aa8772510..1f0edb9fb 100644 --- a/platform/osd-merkur/contiki-main.c +++ b/platform/osd-merkur/contiki-main.c @@ -59,7 +59,7 @@ #include "radio/rf230bb/rf230bb.h" #include "net/mac/frame802154.h" #include "net/mac/framer-802154.h" -#include "net/sicslowpan.h" +#include "net/ipv6/sicslowpan.h" #include "contiki.h" #include "contiki-net.h" @@ -88,7 +88,7 @@ #include "net/rime/rime-udp.h" #endif -#include "net/rime.h" +#include "net/rime/rime.h" /* Track interrupt flow through mac, rdc and radio driver */ //#define DEBUGFLOWSIZE 32 @@ -271,24 +271,24 @@ uint8_t i; /* Set addresses BEFORE starting tcpip process */ - rimeaddr_t addr; + linkaddr_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)); + memcpy(&uip_lladdr.addr, &addr.u8, sizeof(linkaddr_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); + linkaddr_set_node_addr(&addr); PRINTA("Panid:%x\n", params_get_panid()); - framer_802154_set_panid(params_get_panid()); +// framer_802154_set_panid(params_get_panid()); 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()); @@ -298,7 +298,7 @@ uint8_t i; #else PRINTA("MAC address "); uint8_t i; - for (i=sizeof(rimeaddr_t); i>0; i--){ + for (i=sizeof(linkaddr_t); i>0; i--){ PRINTA("%x:",addr.u8[i-1]); } PRINTA("\n"); diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h index 7666e8230..d06f3ff14 100644 --- a/platform/osd-merkur/params.h +++ b/platform/osd-merkur/params.h @@ -1,5 +1,5 @@ -#ifndef __PARAMS_H__ -#define __PARAMS_H__ +#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. @@ -103,4 +103,4 @@ uint16_t params_get_panaddr(void); uint8_t params_get_txpower(void); #endif -#endif /* __PARAMS_H__ */ +#endif /* PARAMS_H_ */ From f40bf6d8033d9dd48595a3ef390000ec4eaa4d27 Mon Sep 17 00:00:00 2001 From: harald Date: Mon, 14 Apr 2014 16:08:51 +0200 Subject: [PATCH 128/345] bugfix includes and names --- examples/osd/rpl-border-router/border-router.c | 6 +++--- examples/osd/rpl-border-router/slip-bridge.c | 6 +++--- platform/osd-merkur/params.c | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/osd/rpl-border-router/border-router.c b/examples/osd/rpl-border-router/border-router.c index 28bd23064..91cd0e380 100644 --- a/examples/osd/rpl-border-router/border-router.c +++ b/examples/osd/rpl-border-router/border-router.c @@ -38,8 +38,8 @@ #include "contiki.h" #include "contiki-lib.h" #include "contiki-net.h" -#include "net/uip.h" -#include "net/uip-ds6.h" +#include "net/ip/uip.h" +#include "net/ipv6/uip-ds6.h" #include "net/rpl/rpl.h" #include "net/netstack.h" @@ -54,7 +54,7 @@ #include "dev/leds.h" #define DEBUG DEBUG_NONE -#include "net/uip-debug.h" +#include "net/ip/uip-debug.h" uint16_t dag_id[] = {0x1111, 0x1100, 0, 0, 0, 0, 0, 0x0011}; diff --git a/examples/osd/rpl-border-router/slip-bridge.c b/examples/osd/rpl-border-router/slip-bridge.c index ebf4f3c36..52b4a4060 100644 --- a/examples/osd/rpl-border-router/slip-bridge.c +++ b/examples/osd/rpl-border-router/slip-bridge.c @@ -38,8 +38,8 @@ * Nicolas Tsiftes */ -#include "net/uip.h" -#include "net/uip-ds6.h" +#include "net/ip/uip.h" +#include "net/ipv6/uip-ds6.h" #include "dev/slip.h" #include "dev/uart1.h" #include @@ -47,7 +47,7 @@ #define UIP_IP_BUF ((struct uip_ip_hdr *)&uip_buf[UIP_LLH_LEN]) #define DEBUG DEBUG_PRINT -#include "net/uip-debug.h" +#include "net/ip/uip-debug.h" void set_prefix_64(uip_ipaddr_t *); diff --git a/platform/osd-merkur/params.c b/platform/osd-merkur/params.c index 9e22d412d..4b0252387 100644 --- a/platform/osd-merkur/params.c +++ b/platform/osd-merkur/params.c @@ -168,7 +168,7 @@ params_get_channel(void) { uint8_t params_get_eui64(uint8_t *eui64) { cli(); - eeprom_read_block ((void *)eui64, &eemem_mac_address, sizeof(rimeaddr_t)); + eeprom_read_block ((void *)eui64, &eemem_mac_address, sizeof(linkaddr_t)); sei(); #if CONTIKI_CONF_RANDOM_MAC return randomeui64; @@ -208,7 +208,7 @@ params_get_channel() { } uint8_t params_get_eui64(uint8_t *eui64) { - size_t size = sizeof(rimeaddr_t); + size_t size = sizeof(linkaddr_t); if(settings_get(SETTINGS_KEY_EUI64, 0, (unsigned char*)eui64, &size) == SETTINGS_STATUS_OK) { PRINTD("<-Get EUI64 MAC\n"); return 0; From f9d67ed10c7f34cefa30a77eb6abf5c2d5e86b63 Mon Sep 17 00:00:00 2001 From: harald Date: Mon, 14 Apr 2014 17:03:46 +0200 Subject: [PATCH 129/345] bugfix statusled include --- examples/osd/light-shutter-control/er-example-server.c | 1 + examples/osd/light-shutter-control/statusled.h | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index aaca90171..4ebd5c100 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -55,6 +55,7 @@ #include "erbium.h" #include "pcintkey.h" +#include "statusled.h" #include "dev/led.h" #if defined (PLATFORM_HAS_BUTTON) diff --git a/examples/osd/light-shutter-control/statusled.h b/examples/osd/light-shutter-control/statusled.h index 8f85d641e..3a6eae70b 100644 --- a/examples/osd/light-shutter-control/statusled.h +++ b/examples/osd/light-shutter-control/statusled.h @@ -45,6 +45,7 @@ /** @name LED Functions */ /** @{ */ +void statusledinit(void); void statusled_on(void); void statusled_off(void); /** @} */ From f77717158de050039efe71bbf7f98c573b1d33cd Mon Sep 17 00:00:00 2001 From: harald Date: Mon, 14 Apr 2014 17:18:30 +0200 Subject: [PATCH 130/345] simplify project-conf.h --- .../light-shutter-control/er-example-server.c | 16 ++++++++++++++++ .../osd/light-shutter-control/project-conf.h | 6 ------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index 4ebd5c100..3bd4c819a 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -44,6 +44,22 @@ #include "contiki-net.h" +#ifdef OSDPLUG +//#define PLATFORM_HAS_LEDS 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_OPTRIAC 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 +#endif + +#if (defined (OSDLIGHT) || defined (OSDSHUTTER)) +#define PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_OPTRIAC 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 +#endif + /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 #define REST_RES_OPTRIAC 1 diff --git a/examples/osd/light-shutter-control/project-conf.h b/examples/osd/light-shutter-control/project-conf.h index d4babccb5..987b148eb 100644 --- a/examples/osd/light-shutter-control/project-conf.h +++ b/examples/osd/light-shutter-control/project-conf.h @@ -37,12 +37,6 @@ //#define OSDSHUTTER -//#define PLATFORM_HAS_LEDS 1 -//#define PLATFORM_HAS_BUTTON 1 -#define PLATFORM_HAS_OPTRIAC 1 -#define PLATFORM_HAS_TEMPERATURE 1 -#define PLATFORM_HAS_BATTERY 1 - #define SICSLOWPAN_CONF_FRAG 1 /* For Debug: Dont allow MCU sleeping between channel checks */ From b6e0ef1d956286198333543b679afd77d5ca7b55 Mon Sep 17 00:00:00 2001 From: harald Date: Mon, 14 Apr 2014 17:42:51 +0200 Subject: [PATCH 131/345] add contiki led, remove led1,led2 --- .../light-shutter-control/er-example-server.c | 92 ++++++------------- 1 file changed, 29 insertions(+), 63 deletions(-) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index 3bd4c819a..cbaab3c27 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -45,7 +45,7 @@ #ifdef OSDPLUG -//#define PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_LED 1 //#define PLATFORM_HAS_BUTTON 1 #define PLATFORM_HAS_OPTRIAC 1 #define PLATFORM_HAS_TEMPERATURE 1 @@ -53,7 +53,7 @@ #endif #if (defined (OSDLIGHT) || defined (OSDSHUTTER)) -#define PLATFORM_HAS_LEDS 1 +#define PLATFORM_HAS_LED 1 #define PLATFORM_HAS_BUTTON 1 #define PLATFORM_HAS_OPTRIAC 1 #define PLATFORM_HAS_TEMPERATURE 1 @@ -65,7 +65,7 @@ #define REST_RES_OPTRIAC 1 #define REST_RES_TEMPERATURE 1 #define REST_RES_EVENT 0 -#define REST_RES_LEDS 0 +#define REST_RES_LED 1 #define REST_RES_TOGGLE 0 #define REST_RES_BATTERY 1 @@ -73,11 +73,10 @@ #include "pcintkey.h" #include "statusled.h" -#include "dev/led.h" #if defined (PLATFORM_HAS_BUTTON) #include "dev/button-sensor.h" #endif -#if defined (PLATFORM_HAS_LEDS) +#if defined (PLATFORM_HAS_LED) #include "dev/leds.h" #endif #if defined (PLATFORM_HAS_OPTRIAC) @@ -220,65 +219,33 @@ extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe REST.set_response_status(response, REST.status.BAD_REQUEST); } } -/*A simple actuator example, post variable mode, relay is activated or deactivated*/ -RESOURCE(led1, METHOD_GET | METHOD_PUT , "actuators/led1", "title=\"Led1\";rt=\"led\""); + +/******************************************************************************/ +#if REST_RES_LED +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(led, METHOD_POST | METHOD_PUT , "a/led", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\""); + void -led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +led_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { - char mode[10]; - static uint8_t led1 = 0; - static char name[17]="led1"; + size_t len = 0; + const char *mode = NULL; + uint8_t led = 0; int success = 1; - char temp[100]; - int index = 0; - size_t len = 0; + led = LEDS_RED; - const char *pmode = NULL; - const char *pname = NULL; + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); - if(led1 == 0) - index += sprintf(temp + index," \"mode\" : \"off\"\n"); - if(led1 == 1) - index += sprintf(temp + index," \"mode\" : \"on\"\n"); - index += sprintf(temp + index,"}\n"); - - len = strlen(temp); - memcpy(buffer, temp,len ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, len); - break; - case METHOD_POST: - success = 0; - break; - case METHOD_PUT: - if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { - PRINTF("name %s\n", mode); - memcpy(mode, pmode,len); - mode[len]=0; - if (!strcmp(mode, "on")) { - led1_on(); - led1 = 1; - } else if (!strcmp(mode, "off")) { - led1_off(); - led1 = 0; - } else { - success = 0; - } - } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { - PRINTF("name %s\n", name); - memcpy(name, pname,len); - name[len]=0; + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); } else { success = 0; } - break; - default: + } else { success = 0; } @@ -286,6 +253,8 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ REST.set_response_status(response, REST.status.BAD_REQUEST); } } +#endif + /******************************************************************************/ #if (defined (PLATFORM_HAS_OPTRIAC) && defined (OSDPLUG)) /******************************************************************************/ @@ -337,12 +306,10 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr optriac_sensor.configure(OPTRIAC_SENSOR_A,1); optriac_sensor.configure(OPTRIAC_SENSOR_B,1); statusled_on(); -// led1_on(); // Debug } else if (strncmp(mode, "off", len)==0) { optriac_sensor.configure(OPTRIAC_SENSOR_A,0); optriac_sensor.configure(OPTRIAC_SENSOR_B,0); statusled_off(); -// led1_off(); // Debug } else { success = 0; } @@ -591,7 +558,7 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr void hw_init() { - led1_off(); + leds_off(LEDS_RED); statusledinit(); key_init(); } @@ -640,7 +607,6 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_init_engine(); /* Activate the application-specific resources. */ - rest_activate_resource(&resource_led1); rest_activate_resource(&resource_extbutton); #if REST_RES_INFO rest_activate_resource(&resource_info); @@ -698,10 +664,10 @@ PROCESS_THREAD(rest_server_example, ev, data) // Toggle Triac A if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0){ optriac_sensor.configure(OPTRIAC_SENSOR_A,1); - led1_on(); + leds_on(LEDS_RED); }else{ optriac_sensor.configure(OPTRIAC_SENSOR_A,0); - led1_off(); + leds_off(LEDS_RED); } } if(ext6 != is_button_ext6()) { @@ -710,10 +676,10 @@ PROCESS_THREAD(rest_server_example, ev, data) // Toggle Triac B if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0){ optriac_sensor.configure(OPTRIAC_SENSOR_B,1); - led2_on(); + statusled_on(); }else{ optriac_sensor.configure(OPTRIAC_SENSOR_B,0); - led2_off(); + statusled_off(); } } etimer_reset(&ds_periodic_timer); From b0c8597dbc727eee70f44f51b8ca77e0355f3fc7 Mon Sep 17 00:00:00 2001 From: harald Date: Tue, 15 Apr 2014 17:29:05 +0200 Subject: [PATCH 132/345] add shutter control resources, reset,timer --- .../light-shutter-control/er-example-server.c | 454 +++++++++++++++--- .../osd/light-shutter-control/project-conf.h | 4 +- 2 files changed, 388 insertions(+), 70 deletions(-) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index cbaab3c27..fdb22a86e 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -42,7 +42,7 @@ #include #include "contiki.h" #include "contiki-net.h" - +#include #ifdef OSDPLUG #define PLATFORM_HAS_LED 1 @@ -61,12 +61,15 @@ #endif /* Define which resources to include to meet memory constraints. */ -#define REST_RES_INFO 1 +#define REST_RES_MODEL 1 +#define REST_RES_NAME 1 +#define REST_RES_SW 1 +#define REST_RES_RESET 1 +#define REST_RES_TIMER 1 #define REST_RES_OPTRIAC 1 #define REST_RES_TEMPERATURE 1 #define REST_RES_EVENT 0 #define REST_RES_LED 1 -#define REST_RES_TOGGLE 0 #define REST_RES_BATTERY 1 #include "erbium.h" @@ -116,13 +119,12 @@ #endif /******************************************************************************/ - -#if REST_RES_INFO +#if REST_RES_MODEL /* * Resources are defined by the RESOURCE macro. * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). */ -RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); +RESOURCE(model, METHOD_GET, "p/model", "title=\"model\";rt=\"simple.dev.mdl\""); /* * A handler function named [resource name]_handler must be implemented for each RESOURCE. @@ -131,7 +133,7 @@ RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. */ void -info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +model_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { char message[100]; int index = 0; @@ -139,17 +141,17 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format - index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre3\",\n"); -#ifdef OSDPLUG - index += sprintf(message + index," \"name\" : \"PLUG\"\n"); +#ifdef OSDPLUG + index += sprintf(message + index,"{\n \"model\" : \"PingThePlug\"\n"); #endif #ifdef OSDLIGHT - index += sprintf(message + index," \"name\" : \"light-actor\"\n"); + index += sprintf(message + index,"{\n \"model\" : \"Light-Actor\"\n"); #endif #ifdef OSDSHUTTER - index += sprintf(message + index," \"name\" : \"shutter-actor\"\n"); + index += sprintf(message + index,"{\n \"model\" : \"Shutter-Control\n"); #endif index += sprintf(message + index,"}\n"); + length = strlen(message); memcpy(buffer, message,length ); @@ -158,9 +160,254 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } #endif +/******************************************************************************/ +#if REST_RES_SW +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(sw, METHOD_GET, "p/sw", "title=\"Software Version\";rt=\"simple.dev.sv\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +sw_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"sw\" : \"V0.8\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_NAME +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(name, METHOD_POST | METHOD_GET, "p/name", "title=\"name\";rt=\"simple.dev.n\""); +/* eeprom space */ +#define P_NAME "Testboard" +#define P_NAME_MAX 17 +uint8_t eemem_p_name[P_NAME_MAX] EEMEM = P_NAME; + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +name_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t eebuffer[32]; + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + int success = 1; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + cli(); + eeprom_read_block (eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"name\" : \"%s\"\n",eebuffer); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + break; + + case METHOD_POST: + if (success && (length=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + if (length < P_NAME_MAX) { + memcpy(&eebuffer, name,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + + +/******************************************************************************/ +#if REST_RES_TIMER +/*A simple actuator example*/ +RESOURCE(timer, METHOD_GET | METHOD_POST , "a/timer", "title=\"TIMER, POST timer=XXX\";rt=\"Control\""); +/* eeprom space */ +#define P_TIMER "60" +#define P_TIMER_MAX 10 +uint8_t eemem_p_timer[P_TIMER_MAX] EEMEM = P_TIMER; + +void +timer_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t eebuffer[32]; + const char *timer = NULL; + char message[100]; + int length = 0; /* |<-------->| */ + int index = 0; + int success = 1; + + switch(REST.get_method_type(request)){ + + case METHOD_GET: + cli(); + eeprom_read_block (eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + sei(); + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"timer\" : \"%s\"\n",eebuffer); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + break; + + case METHOD_POST: + if (success && (length=REST.get_post_variable(request, "timer", &timer))) { + PRINTF("name %s\n", timer); + if (length < P_TIMER_MAX) { + memcpy(&eebuffer, timer,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + sei(); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_RESET +/*A simple actuator example*/ +RESOURCE(reset, METHOD_GET | METHOD_POST , "p/reset", "title=\"RESET, POST mode=on\";rt=\"Control\""); +/* eeprom space */ +#define P_RESET "0" +#define P_RESET_MAX 10 +uint8_t eemem_p_reset[P_RESET_MAX] EEMEM = P_RESET; + +void +reset_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t eebuffer[32]; + const char *mode = NULL; + char message[100]; + int length = 0; /* |<-------->| */ + int index = 0; + int reset = 0; + size_t len = 0; + int success = 1; + + switch(REST.get_method_type(request)){ + + case METHOD_GET: + cli(); + eeprom_read_block (eebuffer, &eemem_p_reset, sizeof(eemem_p_reset)); + sei(); + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"reset\" : \"%s\"\n",eebuffer); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + break; + + case METHOD_POST: + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + if (strncmp(mode, "on", len)==0) { + length=strlen(P_NAME); + memcpy(&eebuffer, P_NAME,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + length=strlen(P_TIMER); + memcpy(&eebuffer, P_TIMER,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + eeprom_read_block (eebuffer, &eemem_p_reset, sizeof(eemem_p_reset)); + sei(); + reset= atoi((char*)eebuffer) + 1; + length=sprintf((char*)eebuffer,"%d",reset); + cli(); + eeprom_write_block(&eebuffer, &eemem_p_reset, sizeof(eemem_p_reset)); + sei(); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ // pcintkey_ext /*A simple actuator example. read the key button status*/ -RESOURCE(extbutton, METHOD_GET | METHOD_PUT , "sensors/extbutton", "title=\"ext.Button\";rt=\"Text\""); +RESOURCE(extbutton, METHOD_GET | METHOD_POST , "s/extbutton", "title=\"ext.Button\";rt=\"Text\""); void extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -202,7 +449,7 @@ extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe REST.set_response_payload(response, buffer, length); break; - case METHOD_PUT: + case METHOD_POST: if (success && (len=REST.get_post_variable(request, "name", &name))) { PRINTF("name %s\n", name); @@ -223,10 +470,10 @@ extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe /******************************************************************************/ #if REST_RES_LED /*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ -RESOURCE(led, METHOD_POST | METHOD_PUT , "a/led", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\""); +RESOURCE(led1, METHOD_POST | METHOD_PUT , "a/led1", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\""); void -led_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { size_t len = 0; const char *mode = NULL; @@ -253,6 +500,36 @@ led_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s REST.set_response_status(response, REST.status.BAD_REQUEST); } } + +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(led2, METHOD_POST | METHOD_PUT , "a/led2", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\""); + +void +led2_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *mode = NULL; + int success = 1; + + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + statusled_on(); + } else if (strncmp(mode, "off", len)==0) { + statusled_off(); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} #endif /******************************************************************************/ @@ -260,7 +537,7 @@ led_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_s /******************************************************************************/ #if REST_RES_OPTRIAC /*A simple actuator example*/ -RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC, POST/PUT mode=on|off\";rt=\"Control\""); +RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "a/optriac", "title=\"TRIAC, POST/PUT mode=on|off\";rt=\"Control\""); void optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -296,10 +573,10 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr REST.set_response_payload(response, buffer, len); break; - case METHOD_POST: + case METHOD_PUT: success = 0; break; - case METHOD_PUT: + case METHOD_POST: if (success && (len=REST.get_post_variable(request, "mode", &mode))) { PRINTF("mode %s\n", mode); if (strncmp(mode, "on", len)==0) { @@ -333,7 +610,7 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr /******************************************************************************/ #if REST_RES_OPTRIAC /*A simple actuator example*/ -RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\""); +RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "a/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\""); void optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -371,10 +648,10 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr REST.set_response_payload(response, buffer, len); break; - case METHOD_POST: + case METHOD_PUT: success = 0; break; - case METHOD_PUT: + case METHOD_POST: if ((len=REST.get_query_variable(request, "type", &type))) { PRINTF("type %.*s\n", len, type); @@ -393,11 +670,9 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr PRINTF("mode %s\n", mode); if (strncmp(mode, "on", len)==0) { - led1_on(); // Debug optriac_sensor.configure(triac,1); } else if (strncmp(mode, "off", len)==0) { optriac_sensor.configure(triac,0); - led1_off(); // Debug } else { success = 0; } @@ -416,33 +691,63 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr /******************************************************************************/ #endif /* PLATFORM_HAS_OPTRIAC */ + /******************************************************************************/ -#if defined (PLATFORM_HAS_LEDS) +#if (defined (PLATFORM_HAS_OPTRIAC) && defined (OSDSHUTTER)) /******************************************************************************/ -#if REST_RES_LEDS -/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ -RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); +#if REST_RES_OPTRIAC +/*A simple actuator example*/ +RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "a/optriac", "title=\"TRIAC: ?type=a|b, POST/PUT mode=on|off\";rt=\"Control\""); void -leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { - size_t len = 0; - const char *color = NULL; + const char *type = NULL; const char *mode = NULL; - uint8_t led = 0; + static char namea[17]="Triac-a"; + static char nameb[17]="Triac-b"; + + char temp[100]; + int index = 0; + size_t len = 0; + + uint8_t triac = 0; int success = 1; + switch(REST.get_method_type(request)){ + case METHOD_GET: + // jSON Format + index += sprintf(temp + index,"{\n \"%s\" : ",namea); + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0) + index += sprintf(temp + index,"\"off\",\n"); + if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 1) + index += sprintf(temp + index,"\"on\",\n"); + index += sprintf(temp + index," \"%s\" : ",nameb); + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0) + index += sprintf(temp + index,"\"off\"\n"); + if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 1) + index += sprintf(temp + index,"\"on\"\n"); + index += sprintf(temp + index,"}\n"); - if ((len=REST.get_query_variable(request, "color", &color))) { - PRINTF("color %.*s\n", len, color); + len = strlen(temp); + memcpy(buffer, temp,len ); - if (strncmp(color, "r", len)==0) { - led = LEDS_RED; - } else if(strncmp(color,"g", len)==0) { - led = LEDS_GREEN; - } else if (strncmp(color,"b", len)==0) { - led = LEDS_BLUE; + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, len); + break; + + case METHOD_PUT: + success = 0; + break; + case METHOD_POST: + if ((len=REST.get_query_variable(request, "type", &type))) { + PRINTF("type %.*s\n", len, type); + + if (strncmp(type, "a", len)==0) { + triac = OPTRIAC_SENSOR_A; + } else if(strncmp(type,"b", len)==0) { + triac = OPTRIAC_SENSOR_B; } else { - success = 0; + triac = OPTRIAC_SENSOR_A; } } else { success = 0; @@ -452,40 +757,42 @@ leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ PRINTF("mode %s\n", mode); if (strncmp(mode, "on", len)==0) { - leds_on(led); + if (triac == OPTRIAC_SENSOR_A){ + statusled_off(); + optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + leds_on(LEDS_RED); + optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + } else { + leds_off(LEDS_RED); + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + statusled_on(); + optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + } } else if (strncmp(mode, "off", len)==0) { - leds_off(led); + optriac_sensor.configure(triac,0); } else { success = 0; } } else { success = 0; } - + break; + default: + success = 0; + } if (!success) { REST.set_response_status(response, REST.status.BAD_REQUEST); } } #endif - /******************************************************************************/ -#if REST_RES_TOGGLE -/* A simple actuator example. Toggles the red led */ -RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); -void -toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - leds_toggle(LEDS_RED); -} -#endif -#endif /* PLATFORM_HAS_LEDS */ +#endif /* PLATFORM_HAS_OPTRIAC */ -/******************************************************************************/ /******************************************************************************/ #if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +RESOURCE(temperature, METHOD_GET, "s/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); void temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -520,7 +827,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre /******************************************************************************/ #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +RESOURCE(battery, METHOD_GET, "s/battery", "title=\"Battery status\";rt=\"battery-mV\""); void battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -607,10 +914,23 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_init_engine(); /* Activate the application-specific resources. */ - rest_activate_resource(&resource_extbutton); -#if REST_RES_INFO - rest_activate_resource(&resource_info); +#if REST_RES_MODEL + rest_activate_resource(&resource_model); #endif +#if REST_RES_SW + rest_activate_resource(&resource_sw); +#endif +#if REST_RES_NAME + rest_activate_resource(&resource_name); +#endif +#if REST_RES_RESET + rest_activate_resource(&resource_reset); +#endif +#if REST_RES_TIMER + rest_activate_resource(&resource_timer); +#endif + + rest_activate_resource(&resource_extbutton); /* Activate the application-specific resources. */ #if REST_RES_OPTRIAC SENSORS_ACTIVATE(optriac_sensor); @@ -621,14 +941,12 @@ PROCESS_THREAD(rest_server_example, ev, data) rest_activate_event_resource(&resource_pir); PRINTF("ACTIVATE PIR\n"); #endif -#if defined (PLATFORM_HAS_LEDS) -#if REST_RES_LEDS - rest_activate_resource(&resource_leds); +#if defined (PLATFORM_HAS_LED) +#if REST_RES_LED + rest_activate_resource(&resource_led1); + rest_activate_resource(&resource_led2); #endif -#if REST_RES_TOGGLE - rest_activate_resource(&resource_toggle); -#endif -#endif /* PLATFORM_HAS_LEDS */ +#endif /* PLATFORM_HAS_LED */ #if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE SENSORS_ACTIVATE(temperature_sensor); rest_activate_resource(&resource_temperature); diff --git a/examples/osd/light-shutter-control/project-conf.h b/examples/osd/light-shutter-control/project-conf.h index 987b148eb..8ed7c9df4 100644 --- a/examples/osd/light-shutter-control/project-conf.h +++ b/examples/osd/light-shutter-control/project-conf.h @@ -32,9 +32,9 @@ #ifndef PROJECT_RPL_WEB_CONF_H_ #define PROJECT_RPL_WEB_CONF_H_ -#define OSDPLUG +//#define OSDPLUG //#define OSDLIGHT -//#define OSDSHUTTER +#define OSDSHUTTER #define SICSLOWPAN_CONF_FRAG 1 From ac79f1b5967241220e4075d7684c0897b96a50d8 Mon Sep 17 00:00:00 2001 From: harald Date: Wed, 16 Apr 2014 09:31:48 +0200 Subject: [PATCH 133/345] change battery and cpttem format to xx.xx --- .../osd/light-shutter-control/er-example-server.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index fdb22a86e..a93bde6e7 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -804,14 +804,15 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", temperature/100, temperature % 100); + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); } else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d.%02d}", temperature/100, temperature % 100); REST.set_response_payload(response, buffer, strlen((char *)buffer)); } @@ -839,15 +840,15 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", battery/1000, battery % 1000); REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); } else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); - + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{\"battery\":%d.%02d}", battery/1000, battery % 1000); + REST.set_response_payload(response, buffer, strlen((char *)buffer)); } else From 598a0da30d12c1a63800a96ef0122ffb857af77e Mon Sep 17 00:00:00 2001 From: harald Date: Wed, 23 Apr 2014 16:13:23 +0200 Subject: [PATCH 134/345] change to port F6,F7 --- examples/osd/light-shutter-control/pcintkey.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/osd/light-shutter-control/pcintkey.c b/examples/osd/light-shutter-control/pcintkey.c index 3da35669d..5fc065e24 100644 --- a/examples/osd/light-shutter-control/pcintkey.c +++ b/examples/osd/light-shutter-control/pcintkey.c @@ -62,14 +62,14 @@ void key_init(void) { // Pairing Button - PORTB |= (1< Date: Wed, 23 Apr 2014 16:13:58 +0200 Subject: [PATCH 135/345] add timer and shutter functionality --- .../light-shutter-control/er-example-server.c | 71 ++++++++++++++++--- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index a93bde6e7..a8b9dd1d5 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -118,6 +118,10 @@ #define PRINTLLADDR(addr) #endif +/******************************************************************************/ +uint8_t g_triac_a = 0; +uint8_t g_triac_b = 0; + /******************************************************************************/ #if REST_RES_MODEL /* @@ -183,7 +187,7 @@ sw_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_si /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format - index += sprintf(message + index,"{\n \"sw\" : \"V0.8\"\n"); + index += sprintf(message + index,"{\n \"sw\" : \"V0.9\"\n"); index += sprintf(message + index,"}\n"); length = strlen(message); @@ -274,6 +278,15 @@ RESOURCE(timer, METHOD_GET | METHOD_POST , "a/timer", "title=\"TIMER, POST timer #define P_TIMER_MAX 10 uint8_t eemem_p_timer[P_TIMER_MAX] EEMEM = P_TIMER; +int gtimer_read(){ + uint8_t eebuffer[32]; + + cli(); + eeprom_read_block (eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + sei(); + return atoi((const char *)eebuffer); +} + void timer_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -758,15 +771,17 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if (strncmp(mode, "on", len)==0) { if (triac == OPTRIAC_SENSOR_A){ - statusled_off(); - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); - leds_on(LEDS_RED); - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); +// statusled_off(); +// optriac_sensor.configure(OPTRIAC_SENSOR_B,0); +// leds_on(LEDS_RED); +// optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + g_triac_a = 1; } else { - leds_off(LEDS_RED); - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); - statusled_on(); - optriac_sensor.configure(OPTRIAC_SENSOR_B,1); +// leds_off(LEDS_RED); +// optriac_sensor.configure(OPTRIAC_SENSOR_A,0); +// statusled_on(); +// optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + g_triac_b = 1; } } else if (strncmp(mode, "off", len)==0) { optriac_sensor.configure(triac,0); @@ -880,6 +895,7 @@ AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); PROCESS_THREAD(rest_server_example, ev, data) { static struct etimer ds_periodic_timer; + static struct etimer triac_off_timer; static int ext4=0; static int ext5=0; static int ext6=0; @@ -977,6 +993,7 @@ PROCESS_THREAD(rest_server_example, ev, data) /* Button Tric Logic */ if(etimer_expired(&ds_periodic_timer)) { PRINTF("Periodic %d %d\n",ext5,ext6); +#if (defined (OSDLIGHT)) if(ext5 != is_button_ext5()) { ext5 = is_button_ext5(); PRINTF("Toggle Triac A\n"); @@ -1001,8 +1018,44 @@ PROCESS_THREAD(rest_server_example, ev, data) statusled_off(); } } +#endif +#if (defined (OSDSHUTTER)) + if( is_button_ext5() || g_triac_a == 1) { + PRINTF("Triac A\n"); + g_triac_a = 0; + // Triac B off + optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + statusled_off(); + // Triac A on + optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + leds_on(LEDS_RED); + etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); + } + if( is_button_ext6() || g_triac_b == 1) { + PRINTF("Triac B\n"); + g_triac_b = 0; + // Triac A off + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + leds_off(LEDS_RED); + // Triac B on + optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + statusled_on(); + etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); + } +#endif etimer_reset(&ds_periodic_timer); } + + if(etimer_expired(&triac_off_timer)) { + PRINTF("Triac off timer\n"); + // Triac A off + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + leds_off(LEDS_RED); + // Triac B off + optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + statusled_off(); + } + } /* while (1) */ PROCESS_END(); From 40bd9950d1f385373d5f687d727ebf6e4504ffc2 Mon Sep 17 00:00:00 2001 From: harald Date: Thu, 24 Apr 2014 13:55:21 +0200 Subject: [PATCH 136/345] add 0.5s delay between off and on --- .../light-shutter-control/er-example-server.c | 66 +++++++++++++------ 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/examples/osd/light-shutter-control/er-example-server.c b/examples/osd/light-shutter-control/er-example-server.c index a8b9dd1d5..298954ecc 100644 --- a/examples/osd/light-shutter-control/er-example-server.c +++ b/examples/osd/light-shutter-control/er-example-server.c @@ -896,6 +896,7 @@ PROCESS_THREAD(rest_server_example, ev, data) { static struct etimer ds_periodic_timer; static struct etimer triac_off_timer; + static uint8_t state=0; static int ext4=0; static int ext5=0; static int ext6=0; @@ -990,6 +991,7 @@ PROCESS_THREAD(rest_server_example, ev, data) #endif /* PLATFORM_HAS_PIR */ } #endif /* REST_RES_EVENT */ + /* Button Tric Logic */ if(etimer_expired(&ds_periodic_timer)) { PRINTF("Periodic %d %d\n",ext5,ext6); @@ -1019,29 +1021,51 @@ PROCESS_THREAD(rest_server_example, ev, data) } } #endif -#if (defined (OSDSHUTTER)) - if( is_button_ext5() || g_triac_a == 1) { - PRINTF("Triac A\n"); - g_triac_a = 0; - // Triac B off - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); - statusled_off(); - // Triac A on - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); - leds_on(LEDS_RED); - etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); +#if (defined (OSDSHUTTER)) + if( is_button_ext5()) { + g_triac_a = 1; } - if( is_button_ext6() || g_triac_b == 1) { - PRINTF("Triac B\n"); - g_triac_b = 0; - // Triac A off - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); - leds_off(LEDS_RED); - // Triac B on - optriac_sensor.configure(OPTRIAC_SENSOR_B,1); - statusled_on(); - etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); + if( is_button_ext6()) { + g_triac_b = 1; } + + PRINTF("State: %d\n",state); + switch(state) + { + case 0: + if( g_triac_a == 1) { + PRINTF("Triac A\n"); + g_triac_a = 0; + // Triac B off + optriac_sensor.configure(OPTRIAC_SENSOR_B,0); + statusled_off(); + state = 1; + } + if( g_triac_b == 1) { + PRINTF("Triac B\n"); + g_triac_b = 0; + // Triac A off + optriac_sensor.configure(OPTRIAC_SENSOR_A,0); + leds_off(LEDS_RED); + state = 2; + } + break; + case 1: + // Triac A on + optriac_sensor.configure(OPTRIAC_SENSOR_A,1); + leds_on(LEDS_RED); + etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); + state=0; + break; + case 2: + // Triac B on + optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + statusled_on(); + etimer_set(&triac_off_timer, gtimer_read()*CLOCK_SECOND); + state=0; + break; + default : state = 0; + } // switch #endif etimer_reset(&ds_periodic_timer); } From 5fcac26e80c1437894cdc3339e5a26ded20371c5 Mon Sep 17 00:00:00 2001 From: harald Date: Wed, 30 Apr 2014 15:20:25 +0200 Subject: [PATCH 137/345] get s/button ->show button status 0/1 --- examples/osd/merkurboard/er-example-server.c | 13 ++++++++++--- platform/osd-merkur/dev/button-sensor.c | 3 ++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/examples/osd/merkurboard/er-example-server.c b/examples/osd/merkurboard/er-example-server.c index df1c6e0c5..5e79f8468 100644 --- a/examples/osd/merkurboard/er-example-server.c +++ b/examples/osd/merkurboard/er-example-server.c @@ -293,10 +293,17 @@ EVENT_RESOURCE(event, METHOD_GET, "s/button", "title=\"Event demo\";obs"); void event_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + int button = button_sensor.value(0); + + index += sprintf(message + index,"%d",button); + length = strlen(message); + memcpy(buffer, message,length ); + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - /* Usually, a CoAP server would response with the current resource representation. */ - const char *msg = "It's eventful!"; - REST.set_response_payload(response, (uint8_t *)msg, strlen(msg)); + REST.set_response_payload(response, buffer, length); /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ } diff --git a/platform/osd-merkur/dev/button-sensor.c b/platform/osd-merkur/dev/button-sensor.c index 825467781..4bf62ea5a 100644 --- a/platform/osd-merkur/dev/button-sensor.c +++ b/platform/osd-merkur/dev/button-sensor.c @@ -39,7 +39,8 @@ ISR(INT4_vect) static int value(int type) { - return (PORTE & _BV(PE4) ? 0 : 1) || !timer_expired(&debouncetimer); + return (PINE & _BV(PE4) ? 0 : 1) || !timer_expired(&debouncetimer); + //return 0; } From 0a5872e261f028ed2c93ba45f1b90a23419850dd Mon Sep 17 00:00:00 2001 From: harald Date: Thu, 8 May 2014 13:04:27 +0200 Subject: [PATCH 138/345] change resources to simple and make climate2 default --- examples/osd/climate/er-example-server.c | 28 ++++++++++++------------ examples/osd/climate/project-conf.h | 2 +- platform/osd-merkur/dev/dht11.c | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/osd/climate/er-example-server.c b/examples/osd/climate/er-example-server.c index e924b8b8b..ee744ce68 100644 --- a/examples/osd/climate/er-example-server.c +++ b/examples/osd/climate/er-example-server.c @@ -46,9 +46,9 @@ /* Define which resources to include to meet memory constraints. */ #define REST_RES_INFO 1 -#define REST_RES_DS1820 1 +#define REST_RES_DS1820 0 #define REST_RES_DHT11 1 -#define REST_RES_DHT11TEMP 0 +#define REST_RES_DHT11TEMP 1 #define REST_RES_LEDS 1 #define REST_RES_TOGGLE 0 #define REST_RES_BATTERY 1 @@ -147,7 +147,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ #define DS1820_TEMP_MSB 1 #define DS1820_COUNT_REMAIN 6 #define DS1820_COUNT_PER_C 7 -RESOURCE(ds1820, METHOD_GET, "sensors/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); +RESOURCE(ds1820, METHOD_GET, "s/temp", "title=\"Temperatur DS1820\";rt=\"temperature-c\""); void ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -204,7 +204,7 @@ ds1820_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre #if REST_RES_DHT11TEMP /*A simple getter example. Returns the reading from dhtxx sensor*/ -RESOURCE(dht11temp, METHOD_GET, "sensors/temp", "title=\"Temperatur DHTxx\";rt=\"temperature-c\""); +RESOURCE(dht11temp, METHOD_GET, "s/temp", "title=\"Temperatur DHTxx\";rt=\"temperature-c\""); void dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -217,7 +217,7 @@ dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf(message, REST_MAX_CHUNK_SIZE, "%4d",dht11_temp); + snprintf(message, REST_MAX_CHUNK_SIZE, "%d.%02d",dht11_temp/100, dht11_temp % 100); length = strlen(message); memcpy(buffer, message,length ); @@ -227,7 +227,7 @@ dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%4d\"}",dht11_temp); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"temp\":\"%d.%02d\"}",dht11_temp/100, dht11_temp % 100); length = strlen(message); memcpy(buffer, message,length ); @@ -244,7 +244,7 @@ dht11temp_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe #if REST_RES_DHT11 /*A simple getter example. Returns the reading from dhtxx sensor*/ -RESOURCE(dht11, METHOD_GET, "sensors/hum", "title=\"Humidity DHTxx\";rt=\"humidity-%\""); +RESOURCE(dht11, METHOD_GET, "s/hum", "title=\"Humidity DHTxx\";rt=\"humidity-%\""); void dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -257,7 +257,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf(message, REST_MAX_CHUNK_SIZE, "%2d",dht11_hum); + snprintf(message, REST_MAX_CHUNK_SIZE, "%d.%02d",dht11_hum/100, dht11_hum % 100); length = strlen(message); memcpy(buffer, message,length ); @@ -267,7 +267,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf(message, REST_MAX_CHUNK_SIZE, "{\"hum\":\"%d\"}",dht11_hum); + snprintf(message, REST_MAX_CHUNK_SIZE, "{\"hum\":\"%d.%02d\"}",dht11_hum/100, dht11_hum % 100); length = strlen(message); memcpy(buffer, message,length ); @@ -287,7 +287,7 @@ dht11_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred /******************************************************************************/ #if REST_RES_LEDS /*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ -RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); +RESOURCE(leds, METHOD_POST | METHOD_PUT , "a/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); void leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -337,7 +337,7 @@ leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /******************************************************************************/ #if REST_RES_TOGGLE /* A simple actuator example. Toggles the red led */ -RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); +RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "a/toggle", "title=\"Red LED\";rt=\"Control\""); void toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -349,7 +349,7 @@ toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferre /******************************************************************************/ #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +RESOURCE(battery, METHOD_GET, "s/battery", "title=\"Battery status\";rt=\"battery-mV\""); void battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -361,14 +361,14 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", battery/1000, battery % 1000); REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); } else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d.%02d}", battery/1000, battery % 1000); REST.set_response_payload(response, buffer, strlen((char *)buffer)); } diff --git a/examples/osd/climate/project-conf.h b/examples/osd/climate/project-conf.h index d503e1717..ba521f078 100644 --- a/examples/osd/climate/project-conf.h +++ b/examples/osd/climate/project-conf.h @@ -33,7 +33,7 @@ #define PROJECT_ERBIUM_CONF_H_ #define PLATFORM_HAS_BATTERY 1 -#define PLATFORM_HAS_DS1820 1 +//#define PLATFORM_HAS_DS1820 1 #define PLATFORM_HAS_DHT11 1 #define PLATFORM_HAS_LEDS 1 diff --git a/platform/osd-merkur/dev/dht11.c b/platform/osd-merkur/dev/dht11.c index c43db4456..0bea2efbf 100644 --- a/platform/osd-merkur/dev/dht11.c +++ b/platform/osd-merkur/dev/dht11.c @@ -30,7 +30,7 @@ #define mdelay(u) clock_delay_msec(u) // define for DHT11 else for DHT22, RHT03 - #define DHT11 1 +// #define DHT11 1 uint8_t DHT_Read_Data(uint16_t *temperature, uint16_t *humidity){ From be01bf77a9b34520edea8c0678f8f8348f3b6dec Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Tue, 13 May 2014 16:56:59 +0200 Subject: [PATCH 139/345] Allow changing bootloader_get_mac address Current default in the Makefile is the *new* bootloader address. But for backward compatibility we've modified the run*.sh files to use the old address. The run*.sh also now explain how to change the default. --- examples/osd/.gitignore | 2 ++ examples/osd/6lowpan-tk/run.sh | 4 +++- examples/osd/climate/run.sh | 4 +++- examples/osd/dual-rgbw-actor/run.sh | 4 +++- examples/osd/embedd-vm-merkurboard/run.sh | 4 +++- examples/osd/er-rest-example-merkurboard/run.sh | 4 +++- examples/osd/er-rest-example-merkurboard/runclient.sh | 4 +++- examples/osd/light-actor/run.sh | 4 +++- examples/osd/light-shutter-control/run.sh | 4 +++- examples/osd/merkurboard/run.sh | 4 +++- examples/osd/merkurboard/runclient.sh | 4 +++- examples/osd/pingtheplug/run.sh | 4 +++- examples/osd/pir-sensor/run.sh | 4 +++- examples/osd/powerbox/run.sh | 4 +++- examples/osd/rpl-border-router/run.sh | 4 +++- examples/osd/servo-sensor/run.sh | 4 +++- examples/osd/slip-radio/run.sh | 4 +++- examples/osd/wirelessplug/run.sh | 4 +++- platform/osd-merkur/Makefile.osd-merkur | 9 ++++++++- 19 files changed, 61 insertions(+), 18 deletions(-) create mode 100644 examples/osd/.gitignore diff --git a/examples/osd/.gitignore b/examples/osd/.gitignore new file mode 100644 index 000000000..d21857f07 --- /dev/null +++ b/examples/osd/.gitignore @@ -0,0 +1,2 @@ +*.osd-merkur +*.eep diff --git a/examples/osd/6lowpan-tk/run.sh b/examples/osd/6lowpan-tk/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/6lowpan-tk/run.sh +++ b/examples/osd/6lowpan-tk/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/climate/run.sh b/examples/osd/climate/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/climate/run.sh +++ b/examples/osd/climate/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/dual-rgbw-actor/run.sh b/examples/osd/dual-rgbw-actor/run.sh index b2cd87d5e..c65c87c3a 100755 --- a/examples/osd/dual-rgbw-actor/run.sh +++ b/examples/osd/dual-rgbw-actor/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) #make clean TARGET=osd-merkur -make -j TARGET=osd-merkur +make -j TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 #avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/embedd-vm-merkurboard/run.sh b/examples/osd/embedd-vm-merkurboard/run.sh index c20cc4e5b..a634126e4 100755 --- a/examples/osd/embedd-vm-merkurboard/run.sh +++ b/examples/osd/embedd-vm-merkurboard/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 embedd-vm-server.osd-merkur avr-objcopy -j .text -j .data -O ihex embedd-vm-server.osd-merkur embedd-vm-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex embedd-vm-server.osd-merkur embedd-vm-server.osd-merkur.eep diff --git a/examples/osd/er-rest-example-merkurboard/run.sh b/examples/osd/er-rest-example-merkurboard/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/er-rest-example-merkurboard/run.sh +++ b/examples/osd/er-rest-example-merkurboard/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/er-rest-example-merkurboard/runclient.sh b/examples/osd/er-rest-example-merkurboard/runclient.sh index 3503afa2b..70dcea0e5 100755 --- a/examples/osd/er-rest-example-merkurboard/runclient.sh +++ b/examples/osd/er-rest-example-merkurboard/runclient.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-client.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.eep diff --git a/examples/osd/light-actor/run.sh b/examples/osd/light-actor/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/light-actor/run.sh +++ b/examples/osd/light-actor/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/light-shutter-control/run.sh b/examples/osd/light-shutter-control/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/light-shutter-control/run.sh +++ b/examples/osd/light-shutter-control/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/merkurboard/run.sh b/examples/osd/merkurboard/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/merkurboard/run.sh +++ b/examples/osd/merkurboard/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/merkurboard/runclient.sh b/examples/osd/merkurboard/runclient.sh index 3503afa2b..70dcea0e5 100755 --- a/examples/osd/merkurboard/runclient.sh +++ b/examples/osd/merkurboard/runclient.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-client.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.eep diff --git a/examples/osd/pingtheplug/run.sh b/examples/osd/pingtheplug/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/pingtheplug/run.sh +++ b/examples/osd/pingtheplug/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/pir-sensor/run.sh b/examples/osd/pir-sensor/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/pir-sensor/run.sh +++ b/examples/osd/pir-sensor/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/powerbox/run.sh b/examples/osd/powerbox/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/powerbox/run.sh +++ b/examples/osd/powerbox/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/rpl-border-router/run.sh b/examples/osd/rpl-border-router/run.sh index 098192f57..2bcaa03ef 100755 --- a/examples/osd/rpl-border-router/run.sh +++ b/examples/osd/rpl-border-router/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 border-router.osd-merkur avr-objcopy -j .text -j .data -O ihex border-router.osd-merkur border-router.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex border-router.osd-merkur border-router.osd-merkur.eep diff --git a/examples/osd/servo-sensor/run.sh b/examples/osd/servo-sensor/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/servo-sensor/run.sh +++ b/examples/osd/servo-sensor/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/slip-radio/run.sh b/examples/osd/slip-radio/run.sh index 056794e5d..94e36daac 100755 --- a/examples/osd/slip-radio/run.sh +++ b/examples/osd/slip-radio/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size slip-radio.osd-merkur avr-objcopy -j .text -j .data -O ihex slip-radio.osd-merkur slip-radio.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex slip-radio.osd-merkur slip-radio.osd-merkur.eep diff --git a/examples/osd/wirelessplug/run.sh b/examples/osd/wirelessplug/run.sh index 4f21e9b63..2efd2cf48 100755 --- a/examples/osd/wirelessplug/run.sh +++ b/examples/osd/wirelessplug/run.sh @@ -1,6 +1,8 @@ #!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) make clean TARGET=osd-merkur -make TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 32f882127..01d2db10d 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -50,7 +50,14 @@ AVRDUDE_MCU=m128rfa1 # CFLAGS += -save-temps # Bootloader bonsai # LDFLAGS += -save-temps -LDFLAGS += -Wl,--defsym,bootloader_get_mac=0x0001f3a0 +# For the old bonsai bootloader compiled with squeeze gcc-avr we +# directly used the address of the bootloader: +#BOOTLOADER_GET_MAC=0x0001f3a0 +# For newer bonsai we have a jump table at the end of the bootloader +# section: +BOOTLOADER_GET_MAC=0x0001ff80 + +LDFLAGS += -Wl,--defsym,bootloader_get_mac=$(BOOTLOADER_GET_MAC) include $(CONTIKIAVR)/Makefile.avr From 2a63d0a972af9e19f5bf4338af1e28f2207f2622 Mon Sep 17 00:00:00 2001 From: harald Date: Thu, 15 May 2014 15:34:05 +0200 Subject: [PATCH 140/345] bugfix define panid --- platform/osd-merkur/contiki-conf.h | 2 ++ platform/osd-merkur/params.h | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/osd-merkur/contiki-conf.h b/platform/osd-merkur/contiki-conf.h index 3df622367..d01424b8f 100644 --- a/platform/osd-merkur/contiki-conf.h +++ b/platform/osd-merkur/contiki-conf.h @@ -50,6 +50,8 @@ #include +#define IEEE802154_CONF_PANID 0xAAAA // default panid + /* 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. diff --git a/platform/osd-merkur/params.h b/platform/osd-merkur/params.h index d06f3ff14..a8fa7637e 100644 --- a/platform/osd-merkur/params.h +++ b/platform/osd-merkur/params.h @@ -13,8 +13,7 @@ * Note the parameters in this file can be changed without forcing a complete rebuild. */ // default settings -#define CHANNEL_802_15_4 26 // default frequency (11-26) -#define IEEE802154_CONF_PANID 0xABCD // default panid +#define CHANNEL_802_15_4 26 // default frequency (11-26) // end default settings From 90ed9d14d21e43e60fab1d2f3774deb537c3850e Mon Sep 17 00:00:00 2001 From: harald Date: Thu, 22 May 2014 16:25:15 +0200 Subject: [PATCH 141/345] add Arduino pin definition and commands --- examples/osd/arduino-merkurboard/Makefile | 95 ++ examples/osd/arduino-merkurboard/README | 76 + examples/osd/arduino-merkurboard/README.md | 166 +++ .../arduino-merkurboard/er-example-client.c | 149 ++ .../arduino-merkurboard/er-example-server.c | 543 +++++++ .../arduino-merkurboard/er-plugtest-server.c | 1298 +++++++++++++++++ examples/osd/arduino-merkurboard/flash.sh | 2 + .../osd/arduino-merkurboard/flashclient.sh | 2 + .../osd/arduino-merkurboard/in6addr.patch | 10 + .../osd/arduino-merkurboard/project-conf.h | 102 ++ examples/osd/arduino-merkurboard/run.sh | 8 + examples/osd/arduino-merkurboard/runclient.sh | 8 + .../osd/arduino-merkurboard/server-client.csc | 227 +++ .../osd/arduino-merkurboard/server-only.csc | 189 +++ platform/osd-merkur/Makefile.osd-merkur | 2 + platform/osd-merkur/dev/Arduino.h | 211 +++ platform/osd-merkur/dev/binary.h | 515 +++++++ platform/osd-merkur/dev/pins_arduino.h | 262 ++++ platform/osd-merkur/dev/wiring.c | 324 ++++ platform/osd-merkur/dev/wiring_analog.c | 291 ++++ platform/osd-merkur/dev/wiring_digital.c | 181 +++ platform/osd-merkur/dev/wiring_private.h | 69 + 22 files changed, 4730 insertions(+) create mode 100644 examples/osd/arduino-merkurboard/Makefile create mode 100644 examples/osd/arduino-merkurboard/README create mode 100644 examples/osd/arduino-merkurboard/README.md create mode 100644 examples/osd/arduino-merkurboard/er-example-client.c create mode 100644 examples/osd/arduino-merkurboard/er-example-server.c create mode 100644 examples/osd/arduino-merkurboard/er-plugtest-server.c create mode 100755 examples/osd/arduino-merkurboard/flash.sh create mode 100755 examples/osd/arduino-merkurboard/flashclient.sh create mode 100644 examples/osd/arduino-merkurboard/in6addr.patch create mode 100644 examples/osd/arduino-merkurboard/project-conf.h create mode 100755 examples/osd/arduino-merkurboard/run.sh create mode 100755 examples/osd/arduino-merkurboard/runclient.sh create mode 100644 examples/osd/arduino-merkurboard/server-client.csc create mode 100644 examples/osd/arduino-merkurboard/server-only.csc create mode 100644 platform/osd-merkur/dev/Arduino.h create mode 100644 platform/osd-merkur/dev/binary.h create mode 100644 platform/osd-merkur/dev/pins_arduino.h create mode 100644 platform/osd-merkur/dev/wiring.c create mode 100644 platform/osd-merkur/dev/wiring_analog.c create mode 100644 platform/osd-merkur/dev/wiring_digital.c create mode 100644 platform/osd-merkur/dev/wiring_private.h diff --git a/examples/osd/arduino-merkurboard/Makefile b/examples/osd/arduino-merkurboard/Makefile new file mode 100644 index 000000000..39d79b8e1 --- /dev/null +++ b/examples/osd/arduino-merkurboard/Makefile @@ -0,0 +1,95 @@ +all: er-example-server er-example-client +# use this target explicitly if requried: er-plugtest-server + + +# variable for this Makefile +# configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) +WITH_COAP=13 + +# for some platforms +UIP_CONF_IPV6=1 +# IPv6 make config disappeared completely +CFLAGS += -DUIP_CONF_IPV6=1 + +CONTIKI=../../.. +CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" + + +# variable for Makefile.include +ifneq ($(TARGET), minimal-net) +CFLAGS += -DUIP_CONF_IPV6_RPL=1 +else +# minimal-net does not support RPL under Linux and is mostly used to test CoAP only +${info INFO: compiling without RPL} +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=640 +endif + +# linker optimizations +SMALL=1 + +# REST framework, requires WITH_COAP +ifeq ($(WITH_COAP), 13) +${info INFO: compiling with CoAP-13} +CFLAGS += -DWITH_COAP=13 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-13 +else ifeq ($(WITH_COAP), 12) +${info INFO: compiling with CoAP-12} +CFLAGS += -DWITH_COAP=12 +CFLAGS += -DREST=coap_rest_implementation +CFLAGS += -DUIP_CONF_TCP=0 +APPS += er-coap-12 +else 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 + +connect-minimal: + sudo ip address add fdfd::1/64 dev tap0 diff --git a/examples/osd/arduino-merkurboard/README b/examples/osd/arduino-merkurboard/README new file mode 100644 index 000000000..84d7dd2f4 --- /dev/null +++ b/examples/osd/arduino-merkurboard/README @@ -0,0 +1,76 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== +Compile the Example +------------------- +./run.sh + +OSD-Merkur Board +---------------------- +write the images to the OSD-Merkur Board: + +./flash.sh + +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 + +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) diff --git a/examples/osd/arduino-merkurboard/README.md b/examples/osd/arduino-merkurboard/README.md new file mode 100644 index 000000000..1aa35b091 --- /dev/null +++ b/examples/osd/arduino-merkurboard/README.md @@ -0,0 +1,166 @@ +A Quick Introduction to the Erbium (Er) REST Engine +=================================================== + +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 Plugtests. Erbium (Er) participated in Paris, France, March 2012 and + Sophia-Antipolis, France, November 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](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: + + make TARGET=cooja server-only.csc + +Open new terminal + + make connect-router-cooja + +- 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: + + make TARGET=cooja server-client.csc + +Open new terminal + + make connect-router-cooja + +- Wait until red LED toggles on mote 2 (server) +- 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) + + make TARGET=sky er-example-server.upload MOTE=2 + make TARGET=sky login MOTE=2 + +2. Press reset button, get address, abort with Ctrl+C: + Line: "Tentative link-local IPv6 address fe80:0000:0000:0000:____:____:____:____" + + cd ../ipv6/rpl-border-router/ + make TARGET=sky border-router.upload MOTE=1 + make connect-router + + For a BR tty other than USB0: + + make connect-router-port PORT=X + +3. 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 + + make TARGET=sky er-example-client.upload MOTE=3 + +MINIMAL-NET HOWTO +----------------- + +With the target minimal-net you can test your CoAP applications without +constraints, i.e., with large buffers, debug output, memory protection, etc. +The er-plugtest-server is thought for the minimal-net platform, as it requires +an 1280-byte IP buffer and 1024-byte blocks. + + make TARGET=minimal-net er-plugtest-server + sudo ./er-plugtest-server.minimal-net + +Open new terminal + + make connect-minimal + +- Start Copper and discover resources at coap://[fdfd::ff:fe00:10]:5683/ +- You can enable the ETSI Plugtest menu in Copper's preferences + +Under Windows/Cygwin, WPCAP might need a patch in +\usr\include\w32api\in6addr.h: + + 21,23c21 + < #ifdef __INSIDE_CYGWIN__ + < uint32_t __s6_addr32[4]; + < #endif + --- + > u_int __s6_addr32[4]; + 36d33 + < #ifdef __INSIDE_CYGWIN__ + 39d35 + < #endif + +DETAILS +------- + +Erbium currently implements draft 13. Central features are commented in +er-example-server.c. In general, apps/er-coap-13 supports: + +- All draft 13 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=13 uses Erbium CoAP 13 apps/er-coap-13/. The default port for + coap-13 is 5683. +- WITH_COAP=12 uses Erbium CoAP 12 apps/er-coap-12/. The default port for + coap-12 is 5683. +- 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 +----- + +- Dedicated Observe buffers +- Optimize message struct variable access (directly access struct without copying) +- Observe client +- Multiple If-Match ETags +- (Message deduplication) diff --git a/examples/osd/arduino-merkurboard/er-example-client.c b/examples/osd/arduino-merkurboard/er-example-client.c new file mode 100644 index 000000000..14b5a291a --- /dev/null +++ b/examples/osd/arduino-merkurboard/er-example-client.c @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2013, Matthias Kovatsch + * 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 + */ + +#include +#include +#include + +#include "contiki.h" +#include "contiki-net.h" + +#include "dev/button-sensor.h" +#include "dev/leds.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" +#elif WITH_COAP == 12 +#include "er-coap-12-engine.h" +#elif WITH_COAP == 13 +#include "er-coap-13-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, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x26e6) /* cooja2 */ + +#define LOCAL_PORT UIP_HTONS(COAP_DEFAULT_PORT+1) +#define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT) + +PROCESS(coap_client_example, "COAP Client Example"); +AUTOSTART_PROCESSES(&coap_client_example); + + +uip_ipaddr_t server_ipaddr; + +/* 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"}; + +/* This function is will be passed to COAP_BLOCKING_REQUEST() to handle responses. */ +void +client_chunk_handler(void *response) +{ + const uint8_t *chunk; + + int len = coap_get_payload(response, &chunk); + printf("|%.*s", len, (char *)chunk); +} + + +PROCESS_THREAD(coap_client_example, ev, data) +{ + PROCESS_BEGIN(); + + leds_off(LEDS_RED); + + 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(); + +#if PLATFORM_HAS_BUTTON + SENSORS_ACTIVATE(button_sensor); + PRINTF("Press a button to request %s\n", service_urls[1]); +#endif + + while(1) { + PROCESS_YIELD(); + +#if PLATFORM_HAS_BUTTON + if (ev == sensors_event && data == &button_sensor) { + + /* send a request to notify the end of the process */ + + PRINTF("--Toggle --\n"); + leds_toggle(LEDS_RED); + /* 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"); + } +#endif + } + + PROCESS_END(); +} diff --git a/examples/osd/arduino-merkurboard/er-example-server.c b/examples/osd/arduino-merkurboard/er-example-server.c new file mode 100644 index 000000000..1f68d6bce --- /dev/null +++ b/examples/osd/arduino-merkurboard/er-example-server.c @@ -0,0 +1,543 @@ +/* + * Copyright (c) 2013, Matthias Kovatsch + * 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. + */ + +/* +From: +http://tools.ietf.org/id/draft-ietf-core-interfaces-01.txt + +Appendix A. Profile example + + The following is a short definition of simple profile. This + simplistic profile is for use in the examples of this document. + + +--------------------+-----------+------------+---------+ + | Function Set | Root Path | RT | IF | + +--------------------+-----------+------------+---------+ + | Device Description | /d | simple.dev | core.ll | + | Sensors | /s | simple.sen | core.b | + | Actuators | /a | simple.act | core.b | + +--------------------+-----------+------------+---------+ + + List of Function Sets + + +-------+----------+----------------+---------+------------+ + | Type | Path | RT | IF | Data Type | + +-------+----------+----------------+---------+------------+ + | Name | /d/name | simple.dev.n | core.p | xsd:string | + | Model | /d/model | simple.dev.mdl | core.rp | xsd:string | + +-------+----------+----------------+---------+------------+ + + Device Description Function Set + + +-------------+-------------+----------------+--------+-------------+ + | Type | Path | RT | IF | Data Type | + +-------------+-------------+----------------+--------+-------------+ + | Light | /s/light | simple.sen.lt | core.s | xsd:decimal | + | | | | | (lux) | + | Humidity | /s/humidity | simple.sen.hum | core.s | xsd:decimal | + | | | | | (%RH) | + | Temperature | /s/temp | simple.sen.tmp | core.s | xsd:decimal | + | | | | | (degC) | + +-------------+-------------+----------------+--------+-------------+ + + Sensors Function Set + + +------+------------+----------------+--------+-------------+ + | Type | Path | RT | IF | Data Type | + +------+------------+----------------+--------+-------------+ + | LED | /a/{#}/led | simple.act.led | core.a | xsd:boolean | + +------+------------+----------------+--------+-------------+ + + Actuators Function Set +*/ + +/** + * \file + * Erbium (Er) REST Engine example (with CoAP-specific code) + * \author + * Matthias Kovatsch + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" +#include + + +/* Define which resources to include to meet memory constraints. */ +#define REST_RES_MODEL 1 +#define REST_RES_NAME 1 +#define REST_RES_SW 1 +#define REST_RES_EVENT 1 +#define REST_RES_LED 1 +#define REST_RES_TOGGLE 1 +#define REST_RES_BATTERY 1 +#define REST_RES_TEMPERATURE 1 + +#include "erbium.h" + +#include "dev/Arduino.h" + +#if defined (PLATFORM_HAS_BUTTON) +#include "dev/button-sensor.h" +#endif +#if defined (PLATFORM_HAS_LED) +#include "dev/leds.h" +#endif +#if defined (PLATFORM_HAS_BATTERY) +#include "dev/battery-sensor.h" +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) +#include "dev/temperature-sensor.h" +#endif + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP == 3 +#include "er-coap-03.h" +#elif WITH_COAP == 7 +#include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.h" +#else +#warning "Erbium example without CoAP-specifc functionality" +#endif /* CoAP-specific example */ + +#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 + + +/******************************************************************************/ +#if REST_RES_MODEL +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(model, METHOD_GET, "p/model", "title=\"model\";rt=\"simple.dev.mdl\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +model_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"model\" : \"Merkurboard\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_SW +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(sw, METHOD_GET, "p/sw", "title=\"Software Version\";rt=\"simple.dev.sv\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +sw_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"sw\" : \"V0.8\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_NAME +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(name, METHOD_POST | METHOD_GET, "p/name", "title=\"name\";rt=\"simple.dev.n\""); +/* eeprom space */ +#define P_NAME "Testboard" +#define P_NAME_MAX 17 +uint8_t eemem_p_name[P_NAME_MAX] EEMEM = P_NAME; + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +name_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t eebuffer[32]; + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + int success = 1; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + cli(); + eeprom_read_block (eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"name\" : \"%s\"\n",eebuffer); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + break; + + case METHOD_POST: + if (success && (length=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + if (length < P_NAME_MAX) { + memcpy(&eebuffer, name,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_EVENT && defined (PLATFORM_HAS_BUTTON) +/* + * Example for an event resource. + * Additionally takes a period parameter that defines the interval to call [name]_periodic_handler(). + * A default post_handler takes care of subscriptions and manages a list of subscribers to notify. + */ +EVENT_RESOURCE(event, METHOD_GET, "s/button", "title=\"Event demo\";obs"); + +void +event_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + int button = button_sensor.value(0); + + index += sprintf(message + index,"%d",button); + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_response_payload(response, buffer, length); + + /* A post_handler that handles subscriptions/observing will be called for periodic resources by the framework. */ +} + +/* Additionally, a handler function named [resource name]_event_handler must be implemented for each PERIODIC_RESOURCE defined. + * It will be called by the REST manager process with the defined period. */ +void +event_event_handler(resource_t *r) +{ + static uint16_t event_counter = 0; + static char content[12]; + + ++event_counter; + + PRINTF("TICK %u for /%s\n", event_counter, r->url); + + /* Build notification. */ + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_CON, REST.status.OK, 0 ); + coap_set_payload(notification, content, snprintf(content, sizeof(content), "EVENT %u", event_counter)); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(r, event_counter, notification); +} +#endif /* PLATFORM_HAS_BUTTON */ + + +/******************************************************************************/ +#if defined (PLATFORM_HAS_LED) +/******************************************************************************/ +#if REST_RES_LED +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(led, METHOD_POST | METHOD_PUT , "a/led", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\""); + +void +led_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *mode = NULL; + uint8_t led = 0; + int success = 1; + + led = LEDS_RED; + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_TOGGLE +/* A simple actuator example. Toggles the red led */ +RESOURCE(toggle, METHOD_POST, "a/toggle", "title=\"Red LED\";rt=\"Control\""); +void +toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + leds_toggle(LEDS_RED); +} +#endif +#endif /* PLATFORM_HAS_LED */ + +/******************************************************************************/ +#if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(battery, METHOD_GET, "s/battery", "title=\"Battery status\";rt=\"Battery\""); +void +battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int battery = battery_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", battery/1000, battery % 1000); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{\"battery\":%d.%02d}", battery/1000, battery % 1000); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_BATTERY */ + +/******************************************************************************/ +#if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) +/* A simple getter example. Returns the reading from light sensor with a simple etag */ +RESOURCE(temperature, METHOD_GET, "s/cputemp", "title=\"CPU Temperature\";rt=\"simple.sen.tmp\""); +void +temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + int temperature = temperature_sensor.value(0); + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", temperature/100, temperature % 100); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } + else if (num && (accept[0]==REST.type.APPLICATION_JSON)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d.%02d}", temperature/100, temperature % 100); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_TEMPERATURE */ + +void +hw_init() +{ +#if defined (PLATFORM_HAS_LED) +// leds_off(LEDS_RED); +// Pin 4 has an LED connected on the Merkurboard. +// give it a name: +int led = 4; + + pinMode(led, OUTPUT); + digitalWrite(led, HIGH); + +#endif +} + +PROCESS(rest_server_example, "Erbium Example Server"); +AUTOSTART_PROCESSES(&rest_server_example); + +PROCESS_THREAD(rest_server_example, ev, data) +{ + PROCESS_BEGIN(); + + PRINTF("Starting Erbium Example 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); + + /* Initialize the OSD Hardware. */ + hw_init(); + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ +#if REST_RES_MODEL + rest_activate_resource(&resource_model); +#endif +#if REST_RES_SW + rest_activate_resource(&resource_sw); +#endif +#if REST_RES_NAME + rest_activate_resource(&resource_name); +#endif +#if defined (PLATFORM_HAS_BUTTON) && REST_RES_EVENT + rest_activate_event_resource(&resource_event); + SENSORS_ACTIVATE(button_sensor); +#endif +#if defined (PLATFORM_HAS_LED) +#if REST_RES_LED + rest_activate_resource(&resource_led); +#endif +#if REST_RES_TOGGLE + rest_activate_resource(&resource_toggle); +#endif +#endif /* PLATFORM_HAS_LED */ +#if defined (PLATFORM_HAS_BATTERY) && REST_RES_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource(&resource_battery); +#endif +#if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE + SENSORS_ACTIVATE(temperature_sensor); + rest_activate_resource(&resource_temperature); +#endif + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); +#if defined (PLATFORM_HAS_BUTTON) + if (ev == sensors_event && data == &button_sensor) { + PRINTF("BUTTON\n"); +#if REST_RES_EVENT + /* Call the event_handler for this application-specific event. */ + event_event_handler(&resource_event); +#endif + } +#endif /* PLATFORM_HAS_BUTTON */ + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/arduino-merkurboard/er-plugtest-server.c b/examples/osd/arduino-merkurboard/er-plugtest-server.c new file mode 100644 index 000000000..5a791a09c --- /dev/null +++ b/examples/osd/arduino-merkurboard/er-plugtest-server.c @@ -0,0 +1,1298 @@ +/* + * Copyright (c) 2013, Matthias Kovatsch + * 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 + */ + +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" + +#define MAX_PLUGFEST_PAYLOAD 64+1 /* +1 for the terminating zero, which is not transmitted */ +#define MAX_PLUGFEST_BODY 2048 +#define CHUNKS_TOTAL 2012 + +/* 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_LOC_QUERY 1 +#define REST_RES_MULTI 1 +#define REST_RES_LINKS 1 +#define REST_RES_PATH 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 + +#define REST_RES_MIRROR 1 + + + +#if !defined (CONTIKI_TARGET_MINIMAL_NET) +#warning "Should only be compiled for minimal-net!" +#endif + + + +#include "erbium.h" + +/* For CoAP-specific example: not required for normal RESTful Web service. */ +#if WITH_COAP==7 +#include "er-coap-07.h" +#elif WITH_COAP == 12 +#include "er-coap-12.h" +#elif WITH_COAP == 13 +#include "er-coap-13.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\""); + +static uint8_t test_etag[8] = {0}; +static uint8_t test_etag_len = 1; +static uint8_t test_change = 1; +static uint8_t test_none_match_okay = 1; + +static +void +test_update_etag() +{ + int i; + test_etag_len = (random_rand() % 8) + 1; + for (i=0; i0 && len==test_etag_len && memcmp(test_etag, bytes, len)==0) + { + PRINTF("validate "); + REST.set_response_status(response, REST.status.NOT_MODIFIED); + REST.set_header_etag(response, test_etag, test_etag_len); + + test_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + else + { + /* Code 2.05 CONTENT is default. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_etag(response, test_etag, test_etag_len); + REST.set_header_max_age(response, 30); + 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, "/location1/location2/location3"); + } + else if (method & METHOD_PUT) + { + PRINTF("PUT "); + + if (coap_get_header_if_none_match(request)) + { + if (test_none_match_okay) + { + REST.set_response_status(response, REST.status.CREATED); + + test_none_match_okay = 0; + PRINTF("### SERVER ACTION ### If-None-Match will FAIL\n"); + } + else + { + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + + test_none_match_okay = 1; + PRINTF("### SERVER ACTION ### If-None-Match will SUCCEED\n"); + } + } + else if (((len = coap_get_header_if_match(request, &bytes))>0 && (len==test_etag_len && memcmp(test_etag, bytes, len)==0)) || len==0) + { + test_update_etag(); + REST.set_header_etag(response, test_etag, test_etag_len); + + REST.set_response_status(response, REST.status.CHANGED); + + if (len>0) + { + test_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + } + else + { + + PRINTF("Check %u/%u\n [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n [0x%02X%02X%02X%02X%02X%02X%02X%02X] ", len, test_etag_len, + bytes[0], + bytes[1], + bytes[2], + bytes[3], + bytes[4], + bytes[5], + bytes[6], + bytes[7], + test_etag[0], + test_etag[1], + test_etag[2], + test_etag[3], + test_etag[4], + test_etag[5], + test_etag[6], + test_etag[7] ); + + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } + } + 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); +} + + +RESOURCE(create1, METHOD_PUT|METHOD_DELETE, "create1", "title=\"Default test resource\""); + +static uint8_t create1_exists = 0; + +void +create1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t method = REST.get_method_type(request); + + if (test_change) + { + test_update_etag(); + } + + PRINTF("/create1 "); + + if (method & METHOD_PUT) + { + PRINTF("PUT "); + + if (coap_get_header_if_none_match(request)) + { + if (!create1_exists) + { + REST.set_response_status(response, REST.status.CREATED); + + create1_exists = 1; + } + else + { + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } + } + else + { + REST.set_response_status(response, REST.status.CHANGED); + } + } + else if (method & METHOD_DELETE) + { + PRINTF("DELETE "); + REST.set_response_status(response, REST.status.DELETED); + + create1_exists = 0; + } +} + +RESOURCE(create2, METHOD_POST, "create2", "title=\"Creates on POST\""); + +void +create2_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + if (test_change) + { + test_update_etag(); + } + + PRINTF("/create2 "); + + REST.set_response_status(response, REST.status.CREATED); + REST.set_header_location(response, "/location1/location2/location3"); +} + +RESOURCE(create3, METHOD_PUT|METHOD_DELETE, "create3", "title=\"Default test resource\""); + +static uint8_t create3_exists = 0; + +void +create3_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t method = REST.get_method_type(request); + + if (test_change) + { + test_update_etag(); + } + + PRINTF("/create3 "); + + if (method & METHOD_PUT) + { + PRINTF("PUT "); + + if (coap_get_header_if_none_match(request)) + { + if (!create3_exists) + { + REST.set_response_status(response, REST.status.CREATED); + + create3_exists = 1; + } + else + { + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } + } + else + { + REST.set_response_status(response, REST.status.CHANGED); + } + } + else if (method & METHOD_DELETE) + { + PRINTF("DELETE "); + REST.set_response_status(response, REST.status.DELETED); + + create3_exists = 0; + } +} + + + + + +RESOURCE(validate, METHOD_GET|METHOD_PUT, "validate", "title=\"Default test resource\""); + +static uint8_t validate_etag[8] = {0}; +static uint8_t validate_etag_len = 1; +static uint8_t validate_change = 1; + +static +void +validate_update_etag() +{ + int i; + validate_etag_len = (random_rand() % 8) + 1; + for (i=0; i0 && len==validate_etag_len && memcmp(validate_etag, bytes, len)==0) + { + PRINTF("validate "); + REST.set_response_status(response, REST.status.NOT_MODIFIED); + REST.set_header_etag(response, validate_etag, validate_etag_len); + + validate_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + else + { + /* Code 2.05 CONTENT is default. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_etag(response, validate_etag, validate_etag_len); + REST.set_header_max_age(response, 30); + 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_PUT) + { + PRINTF("PUT "); + + if (((len = coap_get_header_if_match(request, &bytes))>0 && (len==validate_etag_len && memcmp(validate_etag, bytes, len)==0)) || len==0) + { + validate_update_etag(); + REST.set_header_etag(response, validate_etag, validate_etag_len); + + REST.set_response_status(response, REST.status.CHANGED); + + if (len>0) + { + validate_change = 1; + PRINTF("### SERVER ACTION ### Resouce will change\n"); + } + } + else + { + PRINTF("Check %u/%u\n [0x%02X%02X%02X%02X%02X%02X%02X%02X]\n [0x%02X%02X%02X%02X%02X%02X%02X%02X] ", len, validate_etag_len, + bytes[0], + bytes[1], + bytes[2], + bytes[3], + bytes[4], + bytes[5], + bytes[6], + bytes[7], + validate_etag[0], + validate_etag[1], + validate_etag[2], + validate_etag[3], + validate_etag[4], + validate_etag[5], + validate_etag[6], + validate_etag[7] ); + + REST.set_response_status(response, PRECONDITION_FAILED_4_12); + } + } + + 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_LOC_QUERY +/* + * Resource accepting query parameters + */ +RESOURCE(locquery, METHOD_POST, "location-query", "title=\"Resource accepting query parameters\""); + +void +locquery_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("/location-query POST (%s %u)\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid); + + REST.set_response_status(response, REST.status.CREATED); + REST.set_header_location(response, "?first=1&second=2"); +} +#endif + +#if REST_RES_MULTI +/* + * Resource providing text/plain and application/xml + */ +RESOURCE(multi, METHOD_GET, "multi-format", "title=\"Resource providing text/plain and application/xml\";ct=\"0 41\""); +void +multi_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; + + const uint16_t *accept = NULL; + int num = REST.get_header_accept(request, &accept); + + PRINTF("/multi-format GET (%s %u) %d\n", coap_req->type==COAP_TYPE_CON?"CON":"NON", coap_req->mid, num); + + if (num==0 || (num && accept[0]==REST.type.TEXT_PLAIN)) + { + 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%s", coap_req->type, coap_req->code, coap_req->mid, num ? "\nAccept: 0" : "")); +PRINTF("PLAIN\n"); + } + else if (num && (accept[0]==REST.type.APPLICATION_XML)) + { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + REST.set_response_payload(response, buffer, snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "", coap_req->type, coap_req->code, coap_req->mid, accept[0])); +PRINTF("XML\n"); + } + else + { + REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); + const char *msg = "Supporting content-types text/plain and application/xml"; + REST.set_response_payload(response, msg, strlen(msg)); + PRINTF("ERROR\n"); + } +} +#endif + +#if REST_RES_LINKS +/* + * Resources providing text/plain and application/xml + */ +RESOURCE(link1, METHOD_GET, "link1", "rt=\"Type1 Type2\";if=\"If1\""); +SUB_RESOURCE(link2, METHOD_GET, "link2", "rt=\"Type2 Type3\";if=\"If2\"", link1); +SUB_RESOURCE(link3, METHOD_GET, "link3", "rt=\"Type1 Type3\";if=\"foo\"", link1); + +void +link1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + const char *msg = "Dummy link"; + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_response_payload(response, msg, strlen(msg)); +} +#endif + +#if REST_RES_PATH +/* + * Resources providing text/plain and application/xml + */ +RESOURCE(path, METHOD_GET | HAS_SUB_RESOURCES, "path", "ct=\"40\""); + +void +path_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + + const char *uri_path = NULL; + int len = REST.get_url(request, &uri_path); + int base_len = strlen(resource_path.url); + + if (len==base_len) + { + REST.set_header_content_type(response, REST.type.APPLICATION_LINK_FORMAT); + snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, ",,"); + } + else + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, MAX_PLUGFEST_PAYLOAD, "/%.*s", len, uri_path); + } + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); +} +#endif + +#if REST_RES_SEPARATE +/* Required to manually (=not by the engine) handle the response transaction. */ +#if WITH_COAP == 7 +#include "er-coap-07-separate.h" +#include "er-coap-07-transactions.h" +#elif WITH_COAP == 12 +#include "er-coap-12-separate.h" +#include "er-coap-12-transactions.h" +#elif WITH_COAP == 13 +#include "er-coap-13-separate.h" +#include "er-coap-13-transactions.h" +#endif +/* + * 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 + +/* double expansion */ +#define TO_STRING2(x) #x +#define TO_STRING(x) TO_STRING2(x) + +/* + * Large resource + */ +RESOURCE(large, METHOD_GET, "large", "title=\"Large resource\";rt=\"block\";sz=\"" TO_STRING(CHUNKS_TOTAL) "\""); + +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 = 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\";sz=\"" TO_STRING(MAX_PLUGFEST_BODY) "\""); + +static int32_t large_update_size = 0; +static uint8_t large_update_store[MAX_PLUGFEST_BODY] = {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, MIN(large_update_size - *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, (const uint8_t **) &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, (const uint8_t **) &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 + +#if WITH_COAP == 12 +#include "er-coap-12-observing.h" +#elif WITH_COAP == 13 +#include "er-coap-13-observing.h" +#endif +/* + * Observable resource which changes every 5 seconds + */ +PERIODIC_RESOURCE(obs, METHOD_GET|METHOD_PUT|METHOD_DELETE, "obs", "title=\"Observable resource which changes every 5 seconds\";obs", 5*CLOCK_SECOND); + +static uint16_t obs_counter = 0; +static char obs_content[MAX_PLUGFEST_BODY]; +static size_t obs_content_len = 0; +static unsigned int obs_format = 0; + +static char obs_status = 0; + +static +void +obs_purge_list() +{ + PRINTF("### SERVER ACTION ### Purging obs list"); + coap_remove_observer_by_url(NULL, 0, resource_obs.url); +} + +void +obs_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t method = request==NULL ? METHOD_GET : REST.get_method_type(request); + + /* Keep server log clean from ticking events */ + if (request!=NULL) + { + PRINTF("/obs "); + } + + if (method & METHOD_GET) + { + /* Keep server log clean from ticking events */ + if (request!=NULL) + { + PRINTF("GET "); + } + + REST.set_header_content_type(response, obs_format); + REST.set_header_max_age(response, 5); + + if (obs_content_len) + { + REST.set_header_content_type(response, obs_format); + REST.set_response_payload(response, obs_content, obs_content_len); + } + else + { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + 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. */ + } + else if (method & METHOD_PUT) + { + uint8_t *incoming = NULL; + unsigned int ct = REST.get_header_content_type(request); + + PRINTF("PUT "); + + if (ct!=obs_format) + { + obs_status = 1; + + obs_format = ct; + } else { + + obs_format = ct; + obs_content_len = REST.get_request_payload(request, (const uint8_t **) &incoming); + memcpy(obs_content, incoming, obs_content_len); + obs_periodic_handler(&resource_obs); + } + + REST.set_response_status(response, REST.status.CHANGED); + } + else if (method & METHOD_DELETE) + { + PRINTF("DELETE "); + + obs_status = 2; + + REST.set_response_status(response, REST.status.DELETED); + } + + /* Keep server log clean from ticking events */ + if (request!=NULL) + { + PRINTF("\n"); + } +} + +/* + * 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); + + if (obs_status==1) + { + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_NON, INTERNAL_SERVER_ERROR_5_00, 0 ); + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(&resource_obs, -1, notification); + + PRINTF("######### sending 5.00\n"); + + obs_purge_list(); + } + else if (obs_status==2) + { + + coap_packet_t notification[1]; /* This way the packet can be treated as pointer as usual. */ + coap_init_message(notification, COAP_TYPE_NON, NOT_FOUND_4_04, 0 ); + + + /* Notify the registered observers with the given message type, observe option, and payload. */ + REST.notify_subscribers(&resource_obs, -1, notification); + + obs_purge_list(); + + obs_counter = 0; + obs_content_len = 0; + } + else + { + /* 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); + } + obs_status = 0; +} +#endif + +#if REST_RES_MIRROR +/* This resource mirrors the incoming request. It shows how to access the options and how to set them for the response. */ +RESOURCE(mirror, METHOD_GET | METHOD_POST | METHOD_PUT | METHOD_DELETE, "debug/mirror", "title=\"Returns your decoded message\";rt=\"Debug\""); + +void +mirror_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* The ETag and Token is copied to the header. */ + uint8_t opaque[] = {0x0A, 0xBC, 0xDE}; + + /* Strings are not copied, so use static string buffers or strings in .text memory (char *str = "string in .text";). */ + static char location[] = {'/','f','/','a','?','k','&','e', 0}; + + /* Getter for the header option Content-Type. If the option is not set, text/plain is returned by default. */ + unsigned int content_type = REST.get_header_content_type(request); + + /* The other getters copy the value (or string/array pointer) to the given pointers and return 1 for success or the length of strings/arrays. */ + uint32_t max_age_and_size = 0; + const char *str = NULL; + uint32_t observe = 0; + const uint8_t *bytes = NULL; + const uint16_t *words = NULL; + uint32_t block_num = 0; + uint8_t block_more = 0; + uint16_t block_size = 0; + const char *query = ""; + int len = 0; + + /* Mirror the received header options in the response payload. Unsupported getters (e.g., rest_get_header_observe() with HTTP) will return 0. */ + + int strpos = 0; + /* snprintf() counts the terminating '\0' to the size parameter. + * The additional byte is taken care of by allocating REST_MAX_CHUNK_SIZE+1 bytes in the REST framework. + * Add +1 to fill the complete buffer, as the payload does not need a terminating '\0'. */ + + + if (strpos<=REST_MAX_CHUNK_SIZE && (len = REST.get_header_if_match(request, &bytes))) + { + strpos += snprintf((char *)buffer+strpos, REST_MAX_CHUNK_SIZE-strpos+1, "If-Match 0x"); + int index = 0; + for (index = 0; index= REST_MAX_CHUNK_SIZE) + { + buffer[REST_MAX_CHUNK_SIZE-1] = 0xBB; /* '»' to indicate truncation */ + } + + REST.set_response_payload(response, buffer, strpos); + + PRINTF("/mirror options received: %s\n", buffer); + + /* Set dummy header options for response. Like getters, some setters are not implemented for HTTP and have no effect. */ + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + REST.set_header_max_age(response, 17); /* For HTTP, browsers will not re-request the page for 17 seconds. */ + REST.set_header_etag(response, opaque, 2); + REST.set_header_location(response, location); /* Initial slash is omitted by framework */ + REST.set_header_length(response, strpos); /* For HTTP, browsers will not re-request the page for 10 seconds. CoAP action depends on the client. */ + +/* CoAP-specific example: actions not required for normal RESTful Web service. */ + coap_set_header_uri_host(response, "Contiki"); + coap_set_header_observe(response, 10); + coap_set_header_proxy_uri(response, "ftp://x"); + //coap_set_header_block2(response, 42, 0, 64); + //coap_set_header_block1(response, 23, 0, 16); + coap_set_header_accept(response, APPLICATION_XML); + coap_set_header_accept(response, APPLICATION_ATOM_XML); + coap_set_header_if_none_match(response); +} +#endif /* REST_RES_MIRROR */ + + + + + +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); + + /* Initialize the REST engine. */ + rest_init_engine(); + + /* Activate the application-specific resources. */ +#if REST_RES_TEST + rest_activate_resource(&resource_test); + rest_activate_resource(&resource_validate); + rest_activate_resource(&resource_create1); + rest_activate_resource(&resource_create2); + rest_activate_resource(&resource_create3); +#endif +#if REST_RES_LONG + rest_activate_resource(&resource_longpath); +#endif +#if REST_RES_QUERY + rest_activate_resource(&resource_query); +#endif +#if REST_RES_LOC_QUERY + rest_activate_resource(&resource_locquery); +#endif +#if REST_RES_MULTI + rest_activate_resource(&resource_multi); +#endif +#if REST_RES_LINKS + rest_activate_resource(&resource_link1); + rest_activate_resource(&resource_link2); + rest_activate_resource(&resource_link3); +#endif +#if REST_RES_PATH + rest_activate_resource(&resource_path); +#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 + +#if REST_RES_MIRROR + rest_activate_resource(&resource_mirror); +#endif + + /* Define application-specific events here. */ + while(1) { + PROCESS_WAIT_EVENT(); + + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/arduino-merkurboard/flash.sh b/examples/osd/arduino-merkurboard/flash.sh new file mode 100755 index 000000000..e92d472f6 --- /dev/null +++ b/examples/osd/arduino-merkurboard/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-server.osd-merkur.hex:a -U eeprom:w:er-example-server.osd-merkur.eep:a diff --git a/examples/osd/arduino-merkurboard/flashclient.sh b/examples/osd/arduino-merkurboard/flashclient.sh new file mode 100755 index 000000000..30979eed4 --- /dev/null +++ b/examples/osd/arduino-merkurboard/flashclient.sh @@ -0,0 +1,2 @@ +#!/bin/bash +sudo avrdude -pm128rfa1 -c arduino -P/dev/ttyUSB0 -b57600 -e -U flash:w:er-example-client.osd-merkur.hex:a -U eeprom:w:er-example-client.osd-merkur.eep:a diff --git a/examples/osd/arduino-merkurboard/in6addr.patch b/examples/osd/arduino-merkurboard/in6addr.patch new file mode 100644 index 000000000..92ca106cf --- /dev/null +++ b/examples/osd/arduino-merkurboard/in6addr.patch @@ -0,0 +1,10 @@ +21,23c21 +< #ifdef __INSIDE_CYGWIN__ +< uint32_t __s6_addr32[4]; +< #endif +--- +> u_int __s6_addr32[4]; +36d33 +< #ifdef __INSIDE_CYGWIN__ +39d35 +< #endif diff --git a/examples/osd/arduino-merkurboard/project-conf.h b/examples/osd/arduino-merkurboard/project-conf.h new file mode 100644 index 000000000..c85939445 --- /dev/null +++ b/examples/osd/arduino-merkurboard/project-conf.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2013, Matthias Kovatsch + * 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_ERBIUM_CONF_H_ +#define PROJECT_ERBIUM_CONF_H_ + +#define PLATFORM_HAS_LED 1 +#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 + +/* Some platforms have weird includes. */ +// #undef IEEE802154_CONF_PANID +// #define IEEE802154_CONF_PANID 0xAAAA + +/* 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 + +// enabel LEAF-NODE mode +//#define RPL_CONF_LEAF_ONLY 1 + +/* Increase rpl-border-router IP-buffer when using more than 64. */ +#undef REST_MAX_CHUNK_SIZE +#define REST_MAX_CHUNK_SIZE 64 + +/* Estimate your header size, especially when using Proxy-Uri. */ +/* +#undef COAP_MAX_HEADER_SIZE +#define COAP_MAX_HEADER_SIZE 70 +*/ + +/* The IP buffer size must fit all other hops, in particular the border router. */ + +#undef UIP_CONF_BUFFER_SIZE +#define UIP_CONF_BUFFER_SIZE 256 + + +/* Multiplies with chunk size, be aware of memory constraints. */ +#undef COAP_MAX_OPEN_TRANSACTIONS +#define COAP_MAX_OPEN_TRANSACTIONS 4 + +/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */ +/* +#undef COAP_MAX_OBSERVERS +#define COAP_MAX_OBSERVERS 2 +*/ + +/* Filtering .well-known/core per query can be disabled to save space. */ +/* +#undef COAP_LINK_FORMAT_FILTERING +#define COAP_LINK_FORMAT_FILTERING 0 +*/ + +/* Save some memory for the sky platform. */ +/* +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 10 +*/ + +/* Reduce 802.15.4 frame queue to save RAM. */ +/* +#undef QUEUEBUF_CONF_NUM +#define QUEUEBUF_CONF_NUM 4 +*/ + +/* +#undef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 1 +*/ +#endif /* PROJECT_ERBIUM_CONF_H_ */ diff --git a/examples/osd/arduino-merkurboard/run.sh b/examples/osd/arduino-merkurboard/run.sh new file mode 100755 index 000000000..2efd2cf48 --- /dev/null +++ b/examples/osd/arduino-merkurboard/run.sh @@ -0,0 +1,8 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 +avr-size -C --mcu=MCU=atmega128rfa1 er-example-server.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-server.osd-merkur er-example-server.osd-merkur.eep diff --git a/examples/osd/arduino-merkurboard/runclient.sh b/examples/osd/arduino-merkurboard/runclient.sh new file mode 100755 index 000000000..70dcea0e5 --- /dev/null +++ b/examples/osd/arduino-merkurboard/runclient.sh @@ -0,0 +1,8 @@ +#!/bin/bash +# For the new bootloader (using a jump-table) you want to use +# BOOTLOADER_GET_MAC=0x0001ff80 (which is the current default) +make clean TARGET=osd-merkur +make TARGET=osd-merkur BOOTLOADER_GET_MAC=0x0001f3a0 +avr-size -C --mcu=MCU=atmega128rfa1 er-example-client.osd-merkur +avr-objcopy -j .text -j .data -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.hex +avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex er-example-client.osd-merkur er-example-client.osd-merkur.eep diff --git a/examples/osd/arduino-merkurboard/server-client.csc b/examples/osd/arduino-merkurboard/server-client.csc new file mode 100644 index 000000000..0c09f41b5 --- /dev/null +++ b/examples/osd/arduino-merkurboard/server-client.csc @@ -0,0 +1,227 @@ + + + [APPS_DIR]/mrm + [APPS_DIR]/mspsim + [APPS_DIR]/avrora + [APPS_DIR]/serial_socket + [APPS_DIR]/collect-view + [APPS_DIR]/powertracker + + REST with RPL router + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.Msp802154Radio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.Msp802154Radio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + client + Erbium Client + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c + make er-example-client.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.Msp802154Radio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 46.57186415376375 + 40.35946215910942 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + + se.sics.cooja.interfaces.Position + 18.638049428485125 + 47.55034515769599 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 3 + + client + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 + + 300 + 2 + 178 + 261 + 1 + + + se.sics.cooja.plugins.LogListener + + + + + 762 + 3 + 491 + 2 + 182 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 4 + 74 + 578 + 18 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + 2 + + + + + 125 + 25.49079397896416 + + 1624 + 5 + 252 + 6 + 712 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 2 + + Serial port + 0,0 + + 853 + 1 + 491 + 765 + 182 + + + diff --git a/examples/osd/arduino-merkurboard/server-only.csc b/examples/osd/arduino-merkurboard/server-only.csc new file mode 100644 index 000000000..935bd6e79 --- /dev/null +++ b/examples/osd/arduino-merkurboard/server-only.csc @@ -0,0 +1,189 @@ + + + [APPS_DIR]/mrm + [APPS_DIR]/mspsim + [APPS_DIR]/avrora + [APPS_DIR]/serial_socket + [APPS_DIR]/collect-view + [APPS_DIR]/powertracker + + REST with RPL router + 123456 + 1000000 + + se.sics.cooja.radiomediums.UDGM + 50.0 + 50.0 + 1.0 + 1.0 + + + 40000 + + + se.sics.cooja.mspmote.SkyMoteType + rplroot + Sky RPL Root + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c + make border-router.sky TARGET=sky + [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.Msp802154Radio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + se.sics.cooja.mspmote.SkyMoteType + server + Erbium Server + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c + make er-example-server.sky TARGET=sky + [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky + se.sics.cooja.interfaces.Position + se.sics.cooja.interfaces.RimeAddress + se.sics.cooja.interfaces.IPAddress + se.sics.cooja.interfaces.Mote2MoteRelations + se.sics.cooja.interfaces.MoteAttributes + se.sics.cooja.mspmote.interfaces.MspClock + se.sics.cooja.mspmote.interfaces.MspMoteID + se.sics.cooja.mspmote.interfaces.SkyButton + se.sics.cooja.mspmote.interfaces.SkyFlash + se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem + se.sics.cooja.mspmote.interfaces.Msp802154Radio + se.sics.cooja.mspmote.interfaces.MspSerial + se.sics.cooja.mspmote.interfaces.SkyLED + se.sics.cooja.mspmote.interfaces.MspDebugOutput + se.sics.cooja.mspmote.interfaces.SkyTemperature + + + + + se.sics.cooja.interfaces.Position + 33.260163187353555 + 30.643217359962595 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 1 + + rplroot + + + + + se.sics.cooja.interfaces.Position + 35.100895239785295 + 39.70574552287428 + 0.0 + + + se.sics.cooja.mspmote.interfaces.MspMoteID + 2 + + server + + + + se.sics.cooja.plugins.SimControl + 259 + 0 + 179 + 0 + 0 + + + se.sics.cooja.plugins.Visualizer + + se.sics.cooja.plugins.skins.IDVisualizerSkin + se.sics.cooja.plugins.skins.UDGMVisualizerSkin + se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin + se.sics.cooja.plugins.skins.AttributeVisualizerSkin + se.sics.cooja.plugins.skins.LEDVisualizerSkin + se.sics.cooja.plugins.skins.AddressVisualizerSkin + 7.9849281638410705 0.0 0.0 7.9849281638410705 -133.27812697619663 -225.04752569190535 + + 300 + 5 + 175 + 263 + 3 + + + se.sics.cooja.plugins.LogListener + + + + + 560 + 2 + 326 + 1 + 293 + + + se.sics.cooja.plugins.RadioLogger + + 150 + + + 451 + -1 + 305 + 73 + 140 + true + + + SerialSocketServer + 0 + 422 + 3 + 74 + 39 + 199 + + + se.sics.cooja.plugins.TimeLine + + 0 + 1 + + + + + 125 + 25.49079397896416 + + 1624 + 4 + 252 + 4 + 622 + + + se.sics.cooja.plugins.MoteInterfaceViewer + 1 + + Serial port + 0,0 + + 702 + 1 + 646 + 564 + 2 + + + diff --git a/platform/osd-merkur/Makefile.osd-merkur b/platform/osd-merkur/Makefile.osd-merkur index 01d2db10d..27d6fb1d1 100644 --- a/platform/osd-merkur/Makefile.osd-merkur +++ b/platform/osd-merkur/Makefile.osd-merkur @@ -24,6 +24,8 @@ CONTIKI_TARGET_SOURCEFILES += servo.c servo-sensor.c #CONTIKI_TARGET_SOURCEFILES += t4-servo.c t4-servo-sensor.c #Needed for Relay 1 to 4 CONTIKI_TARGET_SOURCEFILES += relay.c relay-sensor.c +# Arduino +CONTIKI_TARGET_SOURCEFILES += wiring_digital.c CONTIKIBOARD=. BOOTLOADER_START = 0x1F000 diff --git a/platform/osd-merkur/dev/Arduino.h b/platform/osd-merkur/dev/Arduino.h new file mode 100644 index 000000000..2a5dcccba --- /dev/null +++ b/platform/osd-merkur/dev/Arduino.h @@ -0,0 +1,211 @@ +#ifndef Arduino_h +#define Arduino_h + +#include +#include +#include + +#include +#include +#include + +#include "binary.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#define HIGH 0x1 +#define LOW 0x0 + +#define INPUT 0x0 +#define OUTPUT 0x1 +#define INPUT_PULLUP 0x2 + +#define true 0x1 +#define false 0x0 + +#define PI 3.1415926535897932384626433832795 +#define HALF_PI 1.5707963267948966192313216916398 +#define TWO_PI 6.283185307179586476925286766559 +#define DEG_TO_RAD 0.017453292519943295769236907684886 +#define RAD_TO_DEG 57.295779513082320876798154814105 + +#define SERIAL 0x0 +#define DISPLAY 0x1 + +#define LSBFIRST 0 +#define MSBFIRST 1 + +#define CHANGE 1 +#define FALLING 2 +#define RISING 3 + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define INTERNAL1V1 2 +#define INTERNAL2V56 3 +#elif defined(__AVR_ATmega128RFA1__) +#else +#define INTERNAL 3 +#endif +#define DEFAULT 1 +#define EXTERNAL 0 + +// undefine stdlib's abs if encountered +#ifdef abs +#undef abs +#endif + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) +#define abs(x) ((x)>0?(x):-(x)) +#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) +#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) +#define radians(deg) ((deg)*DEG_TO_RAD) +#define degrees(rad) ((rad)*RAD_TO_DEG) +#define sq(x) ((x)*(x)) + +#define interrupts() sei() +#define noInterrupts() cli() + +#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) +#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) +#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) + +#define lowByte(w) ((uint8_t) ((w) & 0xff)) +#define highByte(w) ((uint8_t) ((w) >> 8)) + +#define bitRead(value, bit) (((value) >> (bit)) & 0x01) +#define bitSet(value, bit) ((value) |= (1UL << (bit))) +#define bitClear(value, bit) ((value) &= ~(1UL << (bit))) +#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) + + +typedef unsigned int word; + +#define bit(b) (1UL << (b)) + +typedef uint8_t boolean; +typedef uint8_t byte; + +void init(void); + +void pinMode(uint8_t, uint8_t); +void digitalWrite(uint8_t, uint8_t); +int digitalRead(uint8_t); +int analogRead(uint8_t); +void analogReference(uint8_t mode); +void analogWrite(uint8_t, int); + +unsigned long millis(void); +unsigned long micros(void); +void delay(unsigned long); +void delayMicroseconds(unsigned int us); +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); + +void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); +uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); + +void attachInterrupt(uint8_t, void (*)(void), int mode); +void detachInterrupt(uint8_t); + +void setup(void); +void loop(void); + +// Get the bit location within the hardware port of the given virtual pin. +// This comes from the pins_*.c file for the active board configuration. + +#define analogInPinToBit(P) (P) + +// On the ATmega1280, the addresses of some of the port registers are +// greater than 255, so we can't store them in uint8_t's. +extern const uint16_t PROGMEM port_to_mode_PGM[]; +extern const uint16_t PROGMEM port_to_input_PGM[]; +extern const uint16_t PROGMEM port_to_output_PGM[]; + +extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; +// extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; +extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; +extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; + +// Get the bit location within the hardware port of the given virtual pin. +// This comes from the pins_*.c file for the active board configuration. +// +// These perform slightly better as macros compared to inline functions +// +#define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) +#define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) +#define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) +#define analogInPinToBit(P) (P) +#define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) +#define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) +#define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) ) + +#define NOT_A_PIN 0 +#define NOT_A_PORT 0 + +#ifdef ARDUINO_MAIN +#define PA 1 +#define PB 2 +#define PC 3 +#define PD 4 +#define PE 5 +#define PF 6 +#define PG 7 +#define PH 8 +#define PJ 10 +#define PK 11 +#define PL 12 +#endif + +#define NOT_ON_TIMER 0 +#define TIMER0A 1 +#define TIMER0B 2 +#define TIMER1A 3 +#define TIMER1B 4 +#define TIMER1C 5 +#define TIMER2 6 +#define TIMER2A 7 +#define TIMER2B 8 + +#define TIMER3A 9 +#define TIMER3B 10 +#define TIMER3C 11 +#define TIMER4A 12 +#define TIMER4B 13 +#define TIMER4C 14 +#define TIMER4D 15 +#define TIMER5A 16 +#define TIMER5B 17 +#define TIMER5C 18 + +#ifdef __cplusplus +} // extern "C" +#endif + +#ifdef __cplusplus +#include "WCharacter.h" +#include "WString.h" +#include "HardwareSerial.h" + +uint16_t makeWord(uint16_t w); +uint16_t makeWord(byte h, byte l); + +#define word(...) makeWord(__VA_ARGS__) + +unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); + +void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); +void noTone(uint8_t _pin); + +// WMath prototypes +long random(long); +long random(long, long); +void randomSeed(unsigned int); +long map(long, long, long, long, long); + +#endif + +#include "pins_arduino.h" + +#endif \ No newline at end of file diff --git a/platform/osd-merkur/dev/binary.h b/platform/osd-merkur/dev/binary.h new file mode 100644 index 000000000..af1498033 --- /dev/null +++ b/platform/osd-merkur/dev/binary.h @@ -0,0 +1,515 @@ +#ifndef Binary_h +#define Binary_h + +#define B0 0 +#define B00 0 +#define B000 0 +#define B0000 0 +#define B00000 0 +#define B000000 0 +#define B0000000 0 +#define B00000000 0 +#define B1 1 +#define B01 1 +#define B001 1 +#define B0001 1 +#define B00001 1 +#define B000001 1 +#define B0000001 1 +#define B00000001 1 +#define B10 2 +#define B010 2 +#define B0010 2 +#define B00010 2 +#define B000010 2 +#define B0000010 2 +#define B00000010 2 +#define B11 3 +#define B011 3 +#define B0011 3 +#define B00011 3 +#define B000011 3 +#define B0000011 3 +#define B00000011 3 +#define B100 4 +#define B0100 4 +#define B00100 4 +#define B000100 4 +#define B0000100 4 +#define B00000100 4 +#define B101 5 +#define B0101 5 +#define B00101 5 +#define B000101 5 +#define B0000101 5 +#define B00000101 5 +#define B110 6 +#define B0110 6 +#define B00110 6 +#define B000110 6 +#define B0000110 6 +#define B00000110 6 +#define B111 7 +#define B0111 7 +#define B00111 7 +#define B000111 7 +#define B0000111 7 +#define B00000111 7 +#define B1000 8 +#define B01000 8 +#define B001000 8 +#define B0001000 8 +#define B00001000 8 +#define B1001 9 +#define B01001 9 +#define B001001 9 +#define B0001001 9 +#define B00001001 9 +#define B1010 10 +#define B01010 10 +#define B001010 10 +#define B0001010 10 +#define B00001010 10 +#define B1011 11 +#define B01011 11 +#define B001011 11 +#define B0001011 11 +#define B00001011 11 +#define B1100 12 +#define B01100 12 +#define B001100 12 +#define B0001100 12 +#define B00001100 12 +#define B1101 13 +#define B01101 13 +#define B001101 13 +#define B0001101 13 +#define B00001101 13 +#define B1110 14 +#define B01110 14 +#define B001110 14 +#define B0001110 14 +#define B00001110 14 +#define B1111 15 +#define B01111 15 +#define B001111 15 +#define B0001111 15 +#define B00001111 15 +#define B10000 16 +#define B010000 16 +#define B0010000 16 +#define B00010000 16 +#define B10001 17 +#define B010001 17 +#define B0010001 17 +#define B00010001 17 +#define B10010 18 +#define B010010 18 +#define B0010010 18 +#define B00010010 18 +#define B10011 19 +#define B010011 19 +#define B0010011 19 +#define B00010011 19 +#define B10100 20 +#define B010100 20 +#define B0010100 20 +#define B00010100 20 +#define B10101 21 +#define B010101 21 +#define B0010101 21 +#define B00010101 21 +#define B10110 22 +#define B010110 22 +#define B0010110 22 +#define B00010110 22 +#define B10111 23 +#define B010111 23 +#define B0010111 23 +#define B00010111 23 +#define B11000 24 +#define B011000 24 +#define B0011000 24 +#define B00011000 24 +#define B11001 25 +#define B011001 25 +#define B0011001 25 +#define B00011001 25 +#define B11010 26 +#define B011010 26 +#define B0011010 26 +#define B00011010 26 +#define B11011 27 +#define B011011 27 +#define B0011011 27 +#define B00011011 27 +#define B11100 28 +#define B011100 28 +#define B0011100 28 +#define B00011100 28 +#define B11101 29 +#define B011101 29 +#define B0011101 29 +#define B00011101 29 +#define B11110 30 +#define B011110 30 +#define B0011110 30 +#define B00011110 30 +#define B11111 31 +#define B011111 31 +#define B0011111 31 +#define B00011111 31 +#define B100000 32 +#define B0100000 32 +#define B00100000 32 +#define B100001 33 +#define B0100001 33 +#define B00100001 33 +#define B100010 34 +#define B0100010 34 +#define B00100010 34 +#define B100011 35 +#define B0100011 35 +#define B00100011 35 +#define B100100 36 +#define B0100100 36 +#define B00100100 36 +#define B100101 37 +#define B0100101 37 +#define B00100101 37 +#define B100110 38 +#define B0100110 38 +#define B00100110 38 +#define B100111 39 +#define B0100111 39 +#define B00100111 39 +#define B101000 40 +#define B0101000 40 +#define B00101000 40 +#define B101001 41 +#define B0101001 41 +#define B00101001 41 +#define B101010 42 +#define B0101010 42 +#define B00101010 42 +#define B101011 43 +#define B0101011 43 +#define B00101011 43 +#define B101100 44 +#define B0101100 44 +#define B00101100 44 +#define B101101 45 +#define B0101101 45 +#define B00101101 45 +#define B101110 46 +#define B0101110 46 +#define B00101110 46 +#define B101111 47 +#define B0101111 47 +#define B00101111 47 +#define B110000 48 +#define B0110000 48 +#define B00110000 48 +#define B110001 49 +#define B0110001 49 +#define B00110001 49 +#define B110010 50 +#define B0110010 50 +#define B00110010 50 +#define B110011 51 +#define B0110011 51 +#define B00110011 51 +#define B110100 52 +#define B0110100 52 +#define B00110100 52 +#define B110101 53 +#define B0110101 53 +#define B00110101 53 +#define B110110 54 +#define B0110110 54 +#define B00110110 54 +#define B110111 55 +#define B0110111 55 +#define B00110111 55 +#define B111000 56 +#define B0111000 56 +#define B00111000 56 +#define B111001 57 +#define B0111001 57 +#define B00111001 57 +#define B111010 58 +#define B0111010 58 +#define B00111010 58 +#define B111011 59 +#define B0111011 59 +#define B00111011 59 +#define B111100 60 +#define B0111100 60 +#define B00111100 60 +#define B111101 61 +#define B0111101 61 +#define B00111101 61 +#define B111110 62 +#define B0111110 62 +#define B00111110 62 +#define B111111 63 +#define B0111111 63 +#define B00111111 63 +#define B1000000 64 +#define B01000000 64 +#define B1000001 65 +#define B01000001 65 +#define B1000010 66 +#define B01000010 66 +#define B1000011 67 +#define B01000011 67 +#define B1000100 68 +#define B01000100 68 +#define B1000101 69 +#define B01000101 69 +#define B1000110 70 +#define B01000110 70 +#define B1000111 71 +#define B01000111 71 +#define B1001000 72 +#define B01001000 72 +#define B1001001 73 +#define B01001001 73 +#define B1001010 74 +#define B01001010 74 +#define B1001011 75 +#define B01001011 75 +#define B1001100 76 +#define B01001100 76 +#define B1001101 77 +#define B01001101 77 +#define B1001110 78 +#define B01001110 78 +#define B1001111 79 +#define B01001111 79 +#define B1010000 80 +#define B01010000 80 +#define B1010001 81 +#define B01010001 81 +#define B1010010 82 +#define B01010010 82 +#define B1010011 83 +#define B01010011 83 +#define B1010100 84 +#define B01010100 84 +#define B1010101 85 +#define B01010101 85 +#define B1010110 86 +#define B01010110 86 +#define B1010111 87 +#define B01010111 87 +#define B1011000 88 +#define B01011000 88 +#define B1011001 89 +#define B01011001 89 +#define B1011010 90 +#define B01011010 90 +#define B1011011 91 +#define B01011011 91 +#define B1011100 92 +#define B01011100 92 +#define B1011101 93 +#define B01011101 93 +#define B1011110 94 +#define B01011110 94 +#define B1011111 95 +#define B01011111 95 +#define B1100000 96 +#define B01100000 96 +#define B1100001 97 +#define B01100001 97 +#define B1100010 98 +#define B01100010 98 +#define B1100011 99 +#define B01100011 99 +#define B1100100 100 +#define B01100100 100 +#define B1100101 101 +#define B01100101 101 +#define B1100110 102 +#define B01100110 102 +#define B1100111 103 +#define B01100111 103 +#define B1101000 104 +#define B01101000 104 +#define B1101001 105 +#define B01101001 105 +#define B1101010 106 +#define B01101010 106 +#define B1101011 107 +#define B01101011 107 +#define B1101100 108 +#define B01101100 108 +#define B1101101 109 +#define B01101101 109 +#define B1101110 110 +#define B01101110 110 +#define B1101111 111 +#define B01101111 111 +#define B1110000 112 +#define B01110000 112 +#define B1110001 113 +#define B01110001 113 +#define B1110010 114 +#define B01110010 114 +#define B1110011 115 +#define B01110011 115 +#define B1110100 116 +#define B01110100 116 +#define B1110101 117 +#define B01110101 117 +#define B1110110 118 +#define B01110110 118 +#define B1110111 119 +#define B01110111 119 +#define B1111000 120 +#define B01111000 120 +#define B1111001 121 +#define B01111001 121 +#define B1111010 122 +#define B01111010 122 +#define B1111011 123 +#define B01111011 123 +#define B1111100 124 +#define B01111100 124 +#define B1111101 125 +#define B01111101 125 +#define B1111110 126 +#define B01111110 126 +#define B1111111 127 +#define B01111111 127 +#define B10000000 128 +#define B10000001 129 +#define B10000010 130 +#define B10000011 131 +#define B10000100 132 +#define B10000101 133 +#define B10000110 134 +#define B10000111 135 +#define B10001000 136 +#define B10001001 137 +#define B10001010 138 +#define B10001011 139 +#define B10001100 140 +#define B10001101 141 +#define B10001110 142 +#define B10001111 143 +#define B10010000 144 +#define B10010001 145 +#define B10010010 146 +#define B10010011 147 +#define B10010100 148 +#define B10010101 149 +#define B10010110 150 +#define B10010111 151 +#define B10011000 152 +#define B10011001 153 +#define B10011010 154 +#define B10011011 155 +#define B10011100 156 +#define B10011101 157 +#define B10011110 158 +#define B10011111 159 +#define B10100000 160 +#define B10100001 161 +#define B10100010 162 +#define B10100011 163 +#define B10100100 164 +#define B10100101 165 +#define B10100110 166 +#define B10100111 167 +#define B10101000 168 +#define B10101001 169 +#define B10101010 170 +#define B10101011 171 +#define B10101100 172 +#define B10101101 173 +#define B10101110 174 +#define B10101111 175 +#define B10110000 176 +#define B10110001 177 +#define B10110010 178 +#define B10110011 179 +#define B10110100 180 +#define B10110101 181 +#define B10110110 182 +#define B10110111 183 +#define B10111000 184 +#define B10111001 185 +#define B10111010 186 +#define B10111011 187 +#define B10111100 188 +#define B10111101 189 +#define B10111110 190 +#define B10111111 191 +#define B11000000 192 +#define B11000001 193 +#define B11000010 194 +#define B11000011 195 +#define B11000100 196 +#define B11000101 197 +#define B11000110 198 +#define B11000111 199 +#define B11001000 200 +#define B11001001 201 +#define B11001010 202 +#define B11001011 203 +#define B11001100 204 +#define B11001101 205 +#define B11001110 206 +#define B11001111 207 +#define B11010000 208 +#define B11010001 209 +#define B11010010 210 +#define B11010011 211 +#define B11010100 212 +#define B11010101 213 +#define B11010110 214 +#define B11010111 215 +#define B11011000 216 +#define B11011001 217 +#define B11011010 218 +#define B11011011 219 +#define B11011100 220 +#define B11011101 221 +#define B11011110 222 +#define B11011111 223 +#define B11100000 224 +#define B11100001 225 +#define B11100010 226 +#define B11100011 227 +#define B11100100 228 +#define B11100101 229 +#define B11100110 230 +#define B11100111 231 +#define B11101000 232 +#define B11101001 233 +#define B11101010 234 +#define B11101011 235 +#define B11101100 236 +#define B11101101 237 +#define B11101110 238 +#define B11101111 239 +#define B11110000 240 +#define B11110001 241 +#define B11110010 242 +#define B11110011 243 +#define B11110100 244 +#define B11110101 245 +#define B11110110 246 +#define B11110111 247 +#define B11111000 248 +#define B11111001 249 +#define B11111010 250 +#define B11111011 251 +#define B11111100 252 +#define B11111101 253 +#define B11111110 254 +#define B11111111 255 + +#endif diff --git a/platform/osd-merkur/dev/pins_arduino.h b/platform/osd-merkur/dev/pins_arduino.h new file mode 100644 index 000000000..8f6749eab --- /dev/null +++ b/platform/osd-merkur/dev/pins_arduino.h @@ -0,0 +1,262 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2014 Harald Pichler + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 249 2014-04-18 17:35:12Z pichler $ +*/ + +/* + This version of pins_arduino.h is for the Merkur Dev Board r1 + Harald Pichler 2014 Apr 18 +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include + +#define NUM_DIGITAL_PINS 15 +#define NUM_ANALOG_INPUTS 6 +#define analogInputToDigitalPin(p) ((p < NUM_ANALOG_INPUTS) ? (p) + NUM_DIGITAL_PINS : -1) +#define digitalPinHasPWM(p) ((p) == 2 ||(p) == 3 ||(p) == 4 ||(p) == 14 ) + +// Dev board specific defines: RF RX and TX LEDs: +#define RXLED_DDR DDRB +#define RXLED_PORT PORTB +#define RXLED_POS PB6 + +#define TXLED_DDR DDRB +#define TXLED_PORT PORTB +#define TXLED_POS PB7 + +const static uint8_t SS = 10; +const static uint8_t MOSI = 11; +const static uint8_t MISO = 13; +const static uint8_t SCK = 12; + +const static uint8_t SDA = 9; +const static uint8_t SCL = 8; +const static uint8_t LED = 4; +const static uint8_t LED1 = 4; +const static uint8_t LED2 = 5; + +const static uint8_t A0 = 15; +const static uint8_t A1 = 16; +const static uint8_t A2 = 17; +const static uint8_t A3 = 18; +const static uint8_t A4 = 19; +const static uint8_t A5 = 20; +//const static uint8_t A6 = 21; +//const static uint8_t A7 = 22; + +// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins) +// Only pins available for RECEIVE (TRANSMIT can be on any pin): +// Pins: 10, 11, 12, 13, 14 + +#define digitalPinToPCICR(p) ( (((p) >= 10) && ((p) <= 14)) || ? (&PCICR) : ((uint8_t *)0) ) + +#define digitalPinToPCICRbit(p) ( 0 ) + +#define digitalPinToPCMSK(p) ( (((p) >= 10) && ((p) <= 14)) ? (&PCMSK0) : ((uint8_t *)0) ) + +#define digitalPinToPCMSKbit(p) ( ((p) == 10) ? 6 : \ + ( ((p) == 11) ? 5 : \ + ( ((p) == 12) ? 1 : \ + ( ((p) == 13) ? 3 : \ + ( ((p) == 14) ? 7 : \ + 0 ) ) ) ) ) + +#ifdef ARDUINO_MAIN + +const uint16_t PROGMEM port_to_mode_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t)&DDRB, + NOT_A_PORT, + (uint16_t)&DDRD, + (uint16_t)&DDRE, + (uint16_t)&DDRF, + (uint16_t)&DDRG, + NOT_A_PORT, + NOT_A_PORT, + NOT_A_PORT, + NOT_A_PORT, + NOT_A_PORT, +}; + +const uint16_t PROGMEM port_to_output_PGM[] = { + NOT_A_PORT, + NOT_A_PORT, + (uint16_t)&PORTB, + NOT_A_PORT, + (uint16_t)&PORTD, + (uint16_t)&PORTE, + (uint16_t)&PORTF, + (uint16_t)&PORTG, + NOT_A_PORT, + NOT_A_PORT, + NOT_A_PORT, + NOT_A_PORT, + NOT_A_PORT, +}; + +const uint16_t PROGMEM port_to_input_PGM[] = { + NOT_A_PIN, + NOT_A_PIN, + NOT_A_PIN, + (uint16_t)&PINC, + (uint16_t)&PIND, + (uint16_t)&PINE, + (uint16_t)&PINF, + (uint16_t)&PING, + NOT_A_PIN, + NOT_A_PIN, + NOT_A_PIN, + NOT_A_PIN, + NOT_A_PIN, +}; + +const uint8_t PROGMEM digital_pin_to_port_PGM[] = { + // PORTLIST + // ------------------------------------------- + PE , // PE 1 ** 0 ** D0 / USART0_TX + PE , // PE 0 ** 1 ** D1 / USART0_RX + PE , // PE 3 ** 2 ** D2 / PWM + PE , // PE 4 ** 3 ** D3 / PWM + PE , // PE 5 ** 4 ** D4 / PWM / LED1 / LED + PE , // PE 6 ** 5 ** D5 / LED2 + PD , // PD 3 ** 6 ** D6 / USART1_TX + PD , // PD 2 ** 7 ** D7 / USART1_RX + PD , // PD 0 ** 8 ** D8 / I2C_SCL + PD , // PD 1 ** 9 ** D9 / I2C_SDA + PB , // PB 0 ** 10 ** D10 / SPI_SSN + PB , // PB 2 ** 11 ** D11 / SPI_MOSI + PB , // PB 1 ** 12 ** D12 / SPI_SCK + PB , // PB 3 ** 13 ** D13 / SPI_MISO + PB , // PB 4 ** 14 ** D14 / PWM + PF , // PF 7 ** 15 ** A0 / D15 + PF , // PF 6 ** 16 ** A1 / D16 + PF , // PF 5 ** 17 ** A2 / D17 + PF , // PF 4 ** 18 ** A3 / D18 + PF , // PF 0 ** 19 ** A4 / D19 + PF , // PF 1 ** 20 ** A5 / D20 +// PB , // PB 6 ** 34 ** D34 / LED1 / LED / PWM +// PB , // PB 7 ** 35 ** D35 / LED2 / PWM +// PE , // PE 2 ** 2 ** D2 +// PE , // PE 7 ** 7 ** D7 +// PB , // PB 5 ** 8 ** D8 / PWM +// PG , // PG 0 ** 16 ** D16 +// PG , // PG 1 ** 17 ** D17 +// PG , // PG 2 ** 18 ** D18 +// PG , // PG 5 ** 19 ** D19 / PWM +// PD , // PD 4 ** 22 ** D22 +// PD , // PD 5 ** 23 ** D23 +// PD , // PD 6 ** 24 ** D24 +// PD , // PD 7 ** 25 ** D25 +// PF , // PF 2 ** 28 ** A2 / D28 +// PF , // PF 3 ** 29 ** A3 / D29 +}; + +const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { + // PIN IN PORT + // ------------------------------------------- + _BV( 1 ) , // PE 1 ** 0 ** USART0_TX + _BV( 0 ) , // PE 0 ** 1 ** USART0_RX + _BV( 3 ) , // PE 3 ** 2 ** D3 / PWM + _BV( 4 ) , // PE 4 ** 3 ** D4 / PWM + _BV( 5 ) , // PE 5 ** 4 ** D5 / PWM + _BV( 6 ) , // PE 6 ** 5 ** D6 + _BV( 3 ) , // PD 3 ** 6 ** D21 / USART1_TX + _BV( 2 ) , // PD 2 ** 7 ** D20 / USART1_RX + _BV( 0 ) , // PD 0 ** 8 ** D15 / I2C_SCL + _BV( 1 ) , // PD 1 ** 9 ** D14 / I2C_SDA + _BV( 0 ) , // PB 0 ** 10 ** D10 / SPI_SSN + _BV( 2 ) , // PB 2 ** 11 ** D11 / SPI_MOSI + _BV( 1 ) , // PB 1 ** 12 ** D13 / SPI_SCK + _BV( 3 ) , // PB 3 ** 13 ** D12 / SPI_MISO + _BV( 4 ) , // PB 4 ** 14 ** D9 / PWM + _BV( 7 ) , // PF 7 ** 15 ** A0 / D33 + _BV( 6 ) , // PF 6 ** 16 ** A1 / D32 + _BV( 5 ) , // PF 5 ** 17 ** A2 / D31 + _BV( 4 ) , // PF 4 ** 18 ** A3 / D30 + _BV( 0 ) , // PF 0 ** 19 ** A4 / D26 + _BV( 1 ) , // PF 1 ** 20 ** A5 / D27 +// _BV( 2 ) , // PE 2 ** 2 ** D2 +// _BV( 7 ) , // PE 7 ** 7 ** D7 +// _BV( 5 ) , // PB 5 ** 8 ** D8 / PWM +// _BV( 0 ) , // PG 0 ** 16 ** D16 +// _BV( 1 ) , // PG 1 ** 17 ** D17 +// _BV( 2 ) , // PG 2 ** 18 ** D18 +// _BV( 5 ) , // PG 5 ** 19 ** D19 / PWM +// _BV( 4 ) , // PD 4 ** 22 ** D22 +// _BV( 5 ) , // PD 5 ** 23 ** D23 +// _BV( 6 ) , // PD 6 ** 24 ** D24 +// _BV( 7 ) , // PD 7 ** 25 ** D25 +// _BV( 2 ) , // PF 2 ** 28 ** A2 / D28 +// _BV( 3 ) , // PF 3 ** 29 ** A3 / D29 +// _BV( 6 ) , // PB 6 ** 34 ** D34 / LED1 / LED / PWM +// _BV( 7 ) , // PB 7 ** 35 ** D35 / LED2 / PWM +}; + +// !!! +const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { + // TIMERS + // ------------------------------------------- + NOT_ON_TIMER , // PE 1 ** 0 ** USART0_TX + NOT_ON_TIMER , // PE 0 ** 1 ** USART0_RX + TIMER3A , // PE 3 ** 2 ** D3 / PWM + TIMER3B , // PE 4 ** 3 ** D4 / PWM + TIMER3C , // PE 5 ** 4 ** D5 / PWM + NOT_ON_TIMER , // PE 6 ** 5 ** D6 + NOT_ON_TIMER , // PD 3 ** 6 ** D21 / USART1_TX + NOT_ON_TIMER , // PD 2 ** 7 ** D20 / USART1_RX + NOT_ON_TIMER , // PD 0 ** 8 ** D15 / I2C_SCL + NOT_ON_TIMER , // PD 1 ** 9 ** D14 / I2C_SDA + NOT_ON_TIMER , // PB 0 ** 10 ** D10 / SPI_SSN + NOT_ON_TIMER , // PB 2 ** 11 ** D11 / SPI_MOSI + NOT_ON_TIMER , // PB 1 ** 12 ** D13 / SPI_SCK + NOT_ON_TIMER , // PB 3 ** 13 ** D12 / SPI_MISO + TIMER2A , // PB 4 ** 14 ** D9 / PWM + NOT_ON_TIMER , // PF 7 ** 15 ** A0 / D33 + NOT_ON_TIMER , // PF 6 ** 16 ** A1 / D32 + NOT_ON_TIMER , // PF 5 ** 17 ** A2 / D31 + NOT_ON_TIMER , // PF 4 ** 18 ** A3 / D30 + NOT_ON_TIMER , // PF 0 ** 19 ** A4 / D26 + NOT_ON_TIMER , // PF 1 ** 20 ** A5 / D27 +// NOT_ON_TIMER , // PF 2 ** 28 ** A6 / D28 +// NOT_ON_TIMER , // PF 3 ** 29 ** A7 / D29 +// NOT_ON_TIMER , // PE 2 ** 2 ** D2 +// NOT_ON_TIMER , // PE 7 ** 7 ** D7 +// TIMER1A , // PB 5 ** 8 ** D8 / PWM +// NOT_ON_TIMER , // PG 0 ** 16 ** D16 +// NOT_ON_TIMER , // PG 1 ** 17 ** D17 +// NOT_ON_TIMER , // PG 2 ** 18 ** D18 +// TIMER0B , // PG 5 ** 19 ** D19 / PWM +// NOT_ON_TIMER , // PD 4 ** 22 ** D22 +// NOT_ON_TIMER , // PD 5 ** 23 ** D23 +// NOT_ON_TIMER , // PD 6 ** 24 ** D24 +// NOT_ON_TIMER , // PD 7 ** 25 ** D25 +// TIMER1B , // PB 6 ** 34 ** D34/ PWM +// TIMER1C , // PB 7 ** 35 ** D35 / PWM +}; + +#endif + +#endif diff --git a/platform/osd-merkur/dev/wiring.c b/platform/osd-merkur/dev/wiring.c new file mode 100644 index 000000000..ac8bb6f9b --- /dev/null +++ b/platform/osd-merkur/dev/wiring.c @@ -0,0 +1,324 @@ +/* + wiring.c - Partial implementation of the Wiring API for the ATmega8. + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id$ +*/ + +#include "wiring_private.h" + +// the prescaler is set so that timer0 ticks every 64 clock cycles, and the +// the overflow handler is called every 256 ticks. +#define MICROSECONDS_PER_TIMER0_OVERFLOW (clockCyclesToMicroseconds(64 * 256)) + +// the whole number of milliseconds per timer0 overflow +#define MILLIS_INC (MICROSECONDS_PER_TIMER0_OVERFLOW / 1000) + +// the fractional number of milliseconds per timer0 overflow. we shift right +// by three to fit these numbers into a byte. (for the clock speeds we care +// about - 8 and 16 MHz - this doesn't lose precision.) +#define FRACT_INC ((MICROSECONDS_PER_TIMER0_OVERFLOW % 1000) >> 3) +#define FRACT_MAX (1000 >> 3) + +volatile unsigned long timer0_overflow_count = 0; +volatile unsigned long timer0_millis = 0; +static unsigned char timer0_fract = 0; + +#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) +SIGNAL(TIM0_OVF_vect) +#else +SIGNAL(TIMER0_OVF_vect) +#endif +{ + // copy these to local variables so they can be stored in registers + // (volatile variables must be read from memory on every access) + unsigned long m = timer0_millis; + unsigned char f = timer0_fract; + + m += MILLIS_INC; + f += FRACT_INC; + if (f >= FRACT_MAX) { + f -= FRACT_MAX; + m += 1; + } + + timer0_fract = f; + timer0_millis = m; + timer0_overflow_count++; +} + +unsigned long millis() +{ + unsigned long m; + uint8_t oldSREG = SREG; + + // disable interrupts while we read timer0_millis or we might get an + // inconsistent value (e.g. in the middle of a write to timer0_millis) + cli(); + m = timer0_millis; + SREG = oldSREG; + + return m; +} + +unsigned long micros() { + unsigned long m; + uint8_t oldSREG = SREG, t; + + cli(); + m = timer0_overflow_count; +#if defined(TCNT0) + t = TCNT0; +#elif defined(TCNT0L) + t = TCNT0L; +#else + #error TIMER 0 not defined +#endif + + +#ifdef TIFR0 + if ((TIFR0 & _BV(TOV0)) && (t < 255)) + m++; +#else + if ((TIFR & _BV(TOV0)) && (t < 255)) + m++; +#endif + + SREG = oldSREG; + + return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond()); +} + +void delay(unsigned long ms) +{ + uint16_t start = (uint16_t)micros(); + + while (ms > 0) { + if (((uint16_t)micros() - start) >= 1000) { + ms--; + start += 1000; + } + } +} + +/* Delay for the given number of microseconds. Assumes a 8 or 16 MHz clock. */ +void delayMicroseconds(unsigned int us) +{ + // calling avrlib's delay_us() function with low values (e.g. 1 or + // 2 microseconds) gives delays longer than desired. + //delay_us(us); +#if F_CPU >= 20000000L + // for the 20 MHz clock on rare Arduino boards + + // for a one-microsecond delay, simply wait 2 cycle and return. The overhead + // of the function call yields a delay of exactly a one microsecond. + __asm__ __volatile__ ( + "nop" "\n\t" + "nop"); //just waiting 2 cycle + if (--us == 0) + return; + + // the following loop takes a 1/5 of a microsecond (4 cycles) + // per iteration, so execute it five times for each microsecond of + // delay requested. + us = (us<<2) + us; // x5 us + + // account for the time taken in the preceeding commands. + us -= 2; + +#elif F_CPU >= 16000000L + // for the 16 MHz clock on most Arduino boards + + // for a one-microsecond delay, simply return. the overhead + // of the function call yields a delay of approximately 1 1/8 us. + if (--us == 0) + return; + + // the following loop takes a quarter of a microsecond (4 cycles) + // per iteration, so execute it four times for each microsecond of + // delay requested. + us <<= 2; + + // account for the time taken in the preceeding commands. + us -= 2; +#else + // for the 8 MHz internal clock on the ATmega168 + + // for a one- or two-microsecond delay, simply return. the overhead of + // the function calls takes more than two microseconds. can't just + // subtract two, since us is unsigned; we'd overflow. + if (--us == 0) + return; + if (--us == 0) + return; + + // the following loop takes half of a microsecond (4 cycles) + // per iteration, so execute it twice for each microsecond of + // delay requested. + us <<= 1; + + // partially compensate for the time taken by the preceeding commands. + // we can't subtract any more than this or we'd overflow w/ small delays. + us--; +#endif + + // busy wait + __asm__ __volatile__ ( + "1: sbiw %0,1" "\n\t" // 2 cycles + "brne 1b" : "=w" (us) : "0" (us) // 2 cycles + ); +} + +void init() +{ + // this needs to be called before setup() or some functions won't + // work there + sei(); + + // on the ATmega168, timer 0 is also used for fast hardware pwm + // (using phase-correct PWM would mean that timer 0 overflowed half as often + // resulting in different millis() behavior on the ATmega8 and ATmega168) +#if defined(TCCR0A) && defined(WGM01) + sbi(TCCR0A, WGM01); + sbi(TCCR0A, WGM00); +#endif + + // set timer 0 prescale factor to 64 +#if defined(__AVR_ATmega128__) + // CPU specific: different values for the ATmega128 + sbi(TCCR0, CS02); +#elif defined(TCCR0) && defined(CS01) && defined(CS00) + // this combination is for the standard atmega8 + sbi(TCCR0, CS01); + sbi(TCCR0, CS00); +#elif defined(TCCR0B) && defined(CS01) && defined(CS00) + // this combination is for the standard 168/328/1280/2560 + sbi(TCCR0B, CS01); + sbi(TCCR0B, CS00); +#elif defined(TCCR0A) && defined(CS01) && defined(CS00) + // this combination is for the __AVR_ATmega645__ series + sbi(TCCR0A, CS01); + sbi(TCCR0A, CS00); +#else + #error Timer 0 prescale factor 64 not set correctly +#endif + + // enable timer 0 overflow interrupt +#if defined(TIMSK) && defined(TOIE0) + sbi(TIMSK, TOIE0); +#elif defined(TIMSK0) && defined(TOIE0) + sbi(TIMSK0, TOIE0); +#else + #error Timer 0 overflow interrupt not set correctly +#endif + + // timers 1 and 2 are used for phase-correct hardware pwm + // this is better for motors as it ensures an even waveform + // note, however, that fast pwm mode can achieve a frequency of up + // 8 MHz (with a 16 MHz clock) at 50% duty cycle + +#if defined(TCCR1B) && defined(CS11) && defined(CS10) + TCCR1B = 0; + + // set timer 1 prescale factor to 64 + sbi(TCCR1B, CS11); +#if F_CPU >= 8000000L + sbi(TCCR1B, CS10); +#endif +#elif defined(TCCR1) && defined(CS11) && defined(CS10) + sbi(TCCR1, CS11); +#if F_CPU >= 8000000L + sbi(TCCR1, CS10); +#endif +#endif + // put timer 1 in 8-bit phase correct pwm mode +#if defined(TCCR1A) && defined(WGM10) + sbi(TCCR1A, WGM10); +#elif defined(TCCR1) + #warning this needs to be finished +#endif + + // set timer 2 prescale factor to 64 +#if defined(TCCR2) && defined(CS22) + sbi(TCCR2, CS22); +#elif defined(TCCR2B) && defined(CS22) + sbi(TCCR2B, CS22); +#else + #warning Timer 2 not finished (may not be present on this CPU) +#endif + + // configure timer 2 for phase correct pwm (8-bit) +#if defined(TCCR2) && defined(WGM20) + sbi(TCCR2, WGM20); +#elif defined(TCCR2A) && defined(WGM20) + sbi(TCCR2A, WGM20); +#else + #warning Timer 2 not finished (may not be present on this CPU) +#endif + +#if defined(TCCR3B) && defined(CS31) && defined(WGM30) + sbi(TCCR3B, CS31); // set timer 3 prescale factor to 64 + sbi(TCCR3B, CS30); + sbi(TCCR3A, WGM30); // put timer 3 in 8-bit phase correct pwm mode +#endif + +#if defined(TCCR4A) && defined(TCCR4B) && defined(TCCR4D) /* beginning of timer4 block for 32U4 and similar */ + sbi(TCCR4B, CS42); // set timer4 prescale factor to 64 + sbi(TCCR4B, CS41); + sbi(TCCR4B, CS40); + sbi(TCCR4D, WGM40); // put timer 4 in phase- and frequency-correct PWM mode + sbi(TCCR4A, PWM4A); // enable PWM mode for comparator OCR4A + sbi(TCCR4C, PWM4D); // enable PWM mode for comparator OCR4D +#else /* beginning of timer4 block for ATMEGA1280 and ATMEGA2560 */ +#if defined(TCCR4B) && defined(CS41) && defined(WGM40) + sbi(TCCR4B, CS41); // set timer 4 prescale factor to 64 + sbi(TCCR4B, CS40); + sbi(TCCR4A, WGM40); // put timer 4 in 8-bit phase correct pwm mode +#endif +#endif /* end timer4 block for ATMEGA1280/2560 and similar */ + +#if defined(TCCR5B) && defined(CS51) && defined(WGM50) + sbi(TCCR5B, CS51); // set timer 5 prescale factor to 64 + sbi(TCCR5B, CS50); + sbi(TCCR5A, WGM50); // put timer 5 in 8-bit phase correct pwm mode +#endif + +#if defined(ADCSRA) + // set a2d prescale factor to 128 + // 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range. + // XXX: this will not work properly for other clock speeds, and + // this code should use F_CPU to determine the prescale factor. + sbi(ADCSRA, ADPS2); + sbi(ADCSRA, ADPS1); + sbi(ADCSRA, ADPS0); + + // enable a2d conversions + sbi(ADCSRA, ADEN); +#endif + + // the bootloader connects pins 0 and 1 to the USART; disconnect them + // here so they can be used as normal digital i/o; they will be + // reconnected in Serial.begin() +#if defined(UCSRB) + UCSRB = 0; +#elif defined(UCSR0B) + UCSR0B = 0; +#endif +} diff --git a/platform/osd-merkur/dev/wiring_analog.c b/platform/osd-merkur/dev/wiring_analog.c new file mode 100644 index 000000000..80478c03f --- /dev/null +++ b/platform/osd-merkur/dev/wiring_analog.c @@ -0,0 +1,291 @@ +/* + wiring_analog.c - analog input and output + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 28 September 2010 by Mark Sproul + + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#include "wiring_private.h" +#include "pins_arduino.h" + +uint8_t analog_reference = DEFAULT; + +void analogReference(uint8_t mode) +{ + // can't actually set the register here because the default setting + // will connect AVCC and the AREF pin, which would cause a short if + // there's something connected to AREF. + analog_reference = mode; +} + +int analogRead(uint8_t pin) +{ + uint8_t low, high; + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + if (pin >= 54) pin -= 54; // allow for channel or pin numbers +#elif defined(__AVR_ATmega32U4__) + if (pin >= 18) pin -= 18; // allow for channel or pin numbers +#elif defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644P__) + if (pin >= 24) pin -= 24; // allow for channel or pin numbers +#elif defined(__AVR_ATmega128RFA1__) + if (pin >= 26) pin -= 26; // allow for channel or pin numbers +#else + if (pin >= 14) pin -= 14; // allow for channel or pin numbers +#endif + +#if defined(__AVR_ATmega32U4__) + pin = analogPinToChannel(pin); + ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); +#elif defined(ADCSRB) && defined(MUX5) + // the MUX5 bit of ADCSRB selects whether we're reading from channels + // 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high). + ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5); +#endif + // set the analog reference (high two bits of ADMUX) and select the + // channel (low 4 bits). this also sets ADLAR (left-adjust result) + // to 0 (the default). +#if defined(ADMUX) + ADMUX = (analog_reference << 6) | (pin & 0x07); +#endif + + // without a delay, we seem to read from the wrong channel + //delay(1); + +#if defined(ADCSRA) && defined(ADCL) + // start the conversion + sbi(ADCSRA, ADSC); + + // ADSC is cleared when the conversion finishes + while (bit_is_set(ADCSRA, ADSC)); + + // we have to read ADCL first; doing so locks both ADCL + // and ADCH until ADCH is read. reading ADCL second would + // cause the results of each conversion to be discarded, + // as ADCL and ADCH would be locked when it completed. + low = ADCL; + high = ADCH; +#else + // we dont have an ADC, return 0 + low = 0; + high = 0; +#endif + + // combine the two bytes + return (high << 8) | low; +} + +// Right now, PWM output only works on the pins with +// hardware support. These are defined in the appropriate +// pins_*.c file. For the rest of the pins, we default +// to digital output. +void analogWrite(uint8_t pin, int val) +{ + // We need to make sure the PWM output is enabled for those pins + // that support it, as we turn it off when digitally reading or + // writing with them. Also, make sure the pin is in output mode + // for consistenty with Wiring, which doesn't require a pinMode + // call for the analog output pins. + pinMode(pin, OUTPUT); + if (val == 0) + { + digitalWrite(pin, LOW); + } + else if (val == 255) + { + digitalWrite(pin, HIGH); + } + else + { + switch(digitalPinToTimer(pin)) + { + // XXX fix needed for atmega8 + #if defined(TCCR0) && defined(COM00) && !defined(__AVR_ATmega8__) + case TIMER0A: + // connect pwm to pin on timer 0 + sbi(TCCR0, COM00); + OCR0 = val; // set pwm duty + break; + #endif + + #if defined(TCCR0A) && defined(COM0A1) + case TIMER0A: + // connect pwm to pin on timer 0, channel A + sbi(TCCR0A, COM0A1); + OCR0A = val; // set pwm duty + break; + #endif + + #if defined(TCCR0A) && defined(COM0B1) + case TIMER0B: + // connect pwm to pin on timer 0, channel B + sbi(TCCR0A, COM0B1); + OCR0B = val; // set pwm duty + break; + #endif + + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: + // connect pwm to pin on timer 1, channel A + sbi(TCCR1A, COM1A1); + OCR1A = val; // set pwm duty + break; + #endif + + #if defined(TCCR1A) && defined(COM1B1) + case TIMER1B: + // connect pwm to pin on timer 1, channel B + sbi(TCCR1A, COM1B1); + OCR1B = val; // set pwm duty + break; + #endif + + #if defined(TCCR1A) && defined(COM1C1) + case TIMER1C: + // connect pwm to pin on timer 1, channel C + sbi(TCCR1A, COM1C1); + OCR1C = val; // set pwm duty + break; + #endif + + #if defined(TCCR2) && defined(COM21) + case TIMER2: + // connect pwm to pin on timer 2 + sbi(TCCR2, COM21); + OCR2 = val; // set pwm duty + break; + #endif + + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: + // connect pwm to pin on timer 2, channel A + sbi(TCCR2A, COM2A1); + OCR2A = val; // set pwm duty + break; + #endif + + #if defined(TCCR2A) && defined(COM2B1) + case TIMER2B: + // connect pwm to pin on timer 2, channel B + sbi(TCCR2A, COM2B1); + OCR2B = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: + // connect pwm to pin on timer 3, channel A + sbi(TCCR3A, COM3A1); + OCR3A = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3B1) + case TIMER3B: + // connect pwm to pin on timer 3, channel B + sbi(TCCR3A, COM3B1); + OCR3B = val; // set pwm duty + break; + #endif + + #if defined(TCCR3A) && defined(COM3C1) + case TIMER3C: + // connect pwm to pin on timer 3, channel C + sbi(TCCR3A, COM3C1); + OCR3C = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) + case TIMER4A: + //connect pwm to pin on timer 4, channel A + sbi(TCCR4A, COM4A1); + #if defined(COM4A0) // only used on 32U4 + cbi(TCCR4A, COM4A0); + #endif + OCR4A = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4B1) + case TIMER4B: + // connect pwm to pin on timer 4, channel B + sbi(TCCR4A, COM4B1); + OCR4B = val; // set pwm duty + break; + #endif + + #if defined(TCCR4A) && defined(COM4C1) + case TIMER4C: + // connect pwm to pin on timer 4, channel C + sbi(TCCR4A, COM4C1); + OCR4C = val; // set pwm duty + break; + #endif + + #if defined(TCCR4C) && defined(COM4D1) + case TIMER4D: + // connect pwm to pin on timer 4, channel D + sbi(TCCR4C, COM4D1); + #if defined(COM4D0) // only used on 32U4 + cbi(TCCR4C, COM4D0); + #endif + OCR4D = val; // set pwm duty + break; + #endif + + + #if defined(TCCR5A) && defined(COM5A1) + case TIMER5A: + // connect pwm to pin on timer 5, channel A + sbi(TCCR5A, COM5A1); + OCR5A = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5B1) + case TIMER5B: + // connect pwm to pin on timer 5, channel B + sbi(TCCR5A, COM5B1); + OCR5B = val; // set pwm duty + break; + #endif + + #if defined(TCCR5A) && defined(COM5C1) + case TIMER5C: + // connect pwm to pin on timer 5, channel C + sbi(TCCR5A, COM5C1); + OCR5C = val; // set pwm duty + break; + #endif + + case NOT_ON_TIMER: + default: + if (val < 128) { + digitalWrite(pin, LOW); + } else { + digitalWrite(pin, HIGH); + } + } + } +} + diff --git a/platform/osd-merkur/dev/wiring_digital.c b/platform/osd-merkur/dev/wiring_digital.c new file mode 100644 index 000000000..cac0a7b12 --- /dev/null +++ b/platform/osd-merkur/dev/wiring_digital.c @@ -0,0 +1,181 @@ +/* + wiring_digital.c - digital input and output functions + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Modified 28 September 2010 by Mark Sproul + + $Id: wiring.c 248 2007-02-03 15:36:30Z mellis $ +*/ + +#define ARDUINO_MAIN +#include "wiring_private.h" +#include "pins_arduino.h" + +void pinMode(uint8_t pin, uint8_t mode) +{ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile uint8_t *reg, *out; + + if (port == NOT_A_PIN) return; + + // JWS: can I let the optimizer do this? + reg = portModeRegister(port); + out = portOutputRegister(port); + + if (mode == INPUT) { + uint8_t oldSREG = SREG; + cli(); + *reg &= ~bit; + *out &= ~bit; + SREG = oldSREG; + } else if (mode == INPUT_PULLUP) { + uint8_t oldSREG = SREG; + cli(); + *reg &= ~bit; + *out |= bit; + SREG = oldSREG; + } else { + uint8_t oldSREG = SREG; + cli(); + *reg |= bit; + SREG = oldSREG; + } +} + +// Forcing this inline keeps the callers from having to push their own stuff +// on the stack. It is a good performance win and only takes 1 more byte per +// user than calling. (It will take more bytes on the 168.) +// +// But shouldn't this be moved into pinMode? Seems silly to check and do on +// each digitalread or write. +// +// Mark Sproul: +// - Removed inline. Save 170 bytes on atmega1280 +// - changed to a switch statment; added 32 bytes but much easier to read and maintain. +// - Added more #ifdefs, now compiles for atmega645 +// +//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline)); +//static inline void turnOffPWM(uint8_t timer) +static void turnOffPWM(uint8_t timer) +{ + switch (timer) + { + #if defined(TCCR1A) && defined(COM1A1) + case TIMER1A: cbi(TCCR1A, COM1A1); break; + #endif + #if defined(TCCR1A) && defined(COM1B1) + case TIMER1B: cbi(TCCR1A, COM1B1); break; + #endif + #if defined(TCCR1A) && defined(COM1B1) + case TIMER1C: cbi(TCCR1A, COM1C1); break; + #endif + + #if defined(TCCR2) && defined(COM21) + case TIMER2: cbi(TCCR2, COM21); break; + #endif + + #if defined(TCCR0A) && defined(COM0A1) + case TIMER0A: cbi(TCCR0A, COM0A1); break; + #endif + + #if defined(TIMER0B) && defined(COM0B1) + case TIMER0B: cbi(TCCR0A, COM0B1); break; + #endif + #if defined(TCCR2A) && defined(COM2A1) + case TIMER2A: cbi(TCCR2A, COM2A1); break; + #endif + #if defined(TCCR2A) && defined(COM2B1) + case TIMER2B: cbi(TCCR2A, COM2B1); break; + #endif + + #if defined(TCCR3A) && defined(COM3A1) + case TIMER3A: cbi(TCCR3A, COM3A1); break; + #endif + #if defined(TCCR3A) && defined(COM3B1) + case TIMER3B: cbi(TCCR3A, COM3B1); break; + #endif + #if defined(TCCR3A) && defined(COM3C1) + case TIMER3C: cbi(TCCR3A, COM3C1); break; + #endif + + #if defined(TCCR4A) && defined(COM4A1) + case TIMER4A: cbi(TCCR4A, COM4A1); break; + #endif + #if defined(TCCR4A) && defined(COM4B1) + case TIMER4B: cbi(TCCR4A, COM4B1); break; + #endif + #if defined(TCCR4A) && defined(COM4C1) + case TIMER4C: cbi(TCCR4A, COM4C1); break; + #endif + #if defined(TCCR4C) && defined(COM4D1) + case TIMER4D: cbi(TCCR4C, COM4D1); break; + #endif + + #if defined(TCCR5A) + case TIMER5A: cbi(TCCR5A, COM5A1); break; + case TIMER5B: cbi(TCCR5A, COM5B1); break; + case TIMER5C: cbi(TCCR5A, COM5C1); break; + #endif + } +} + +void digitalWrite(uint8_t pin, uint8_t val) +{ + uint8_t timer = digitalPinToTimer(pin); + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + volatile uint8_t *out; + + if (port == NOT_A_PIN) return; + + // If the pin that support PWM output, we need to turn it off + // before doing a digital write. + if (timer != NOT_ON_TIMER) turnOffPWM(timer); + + out = portOutputRegister(port); + + uint8_t oldSREG = SREG; + cli(); + + if (val == LOW) { + *out &= ~bit; + } else { + *out |= bit; + } + + SREG = oldSREG; +} + +int digitalRead(uint8_t pin) +{ + uint8_t timer = digitalPinToTimer(pin); + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + + if (port == NOT_A_PIN) return LOW; + + // If the pin that support PWM output, we need to turn it off + // before getting a digital reading. + if (timer != NOT_ON_TIMER) turnOffPWM(timer); + + if (*portInputRegister(port) & bit) return HIGH; + return LOW; +} diff --git a/platform/osd-merkur/dev/wiring_private.h b/platform/osd-merkur/dev/wiring_private.h new file mode 100644 index 000000000..da6fa6628 --- /dev/null +++ b/platform/osd-merkur/dev/wiring_private.h @@ -0,0 +1,69 @@ +/* + wiring_private.h - Internal header file. + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2005-2006 David A. Mellis + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 239 2007-01-12 17:58:39Z mellis $ +*/ + +#ifndef WiringPrivate_h +#define WiringPrivate_h + +#include +#include +#include +#include + +#include "Arduino.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + +#define EXTERNAL_INT_0 0 +#define EXTERNAL_INT_1 1 +#define EXTERNAL_INT_2 2 +#define EXTERNAL_INT_3 3 +#define EXTERNAL_INT_4 4 +#define EXTERNAL_INT_5 5 +#define EXTERNAL_INT_6 6 +#define EXTERNAL_INT_7 7 + +#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) +#define EXTERNAL_NUM_INTERRUPTS 8 +#elif defined(__AVR_ATmega128RFA1__) +#define EXTERNAL_NUM_INTERRUPTS 8 +#else +#define EXTERNAL_NUM_INTERRUPTS 2 +#endif + +typedef void (*voidFuncPtr)(void); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif From 078faa39d49be690c2618c56913c445e2c724f55 Mon Sep 17 00:00:00 2001 From: harald Date: Tue, 27 May 2014 11:31:54 +0200 Subject: [PATCH 142/345] cleanup code --- examples/osd/pingtheplug/Makefile | 7 +- examples/osd/pingtheplug/er-example-server.c | 577 ++++++++++++------- examples/osd/pingtheplug/pcintkey.c | 18 +- examples/osd/pingtheplug/project-conf.h | 32 +- examples/osd/pingtheplug/server-client.csc | 227 -------- examples/osd/pingtheplug/static-routing.c | 155 ----- examples/osd/pingtheplug/static-routing.h | 20 - examples/osd/pingtheplug/todo | 9 - 8 files changed, 402 insertions(+), 643 deletions(-) delete mode 100644 examples/osd/pingtheplug/server-client.csc delete mode 100644 examples/osd/pingtheplug/static-routing.c delete mode 100644 examples/osd/pingtheplug/static-routing.h delete mode 100644 examples/osd/pingtheplug/todo diff --git a/examples/osd/pingtheplug/Makefile b/examples/osd/pingtheplug/Makefile index e3da53956..7a3466655 100644 --- a/examples/osd/pingtheplug/Makefile +++ b/examples/osd/pingtheplug/Makefile @@ -6,20 +6,17 @@ all: er-example-server # configure CoAP implementation (3|7|12|13) (er-coap-07 also supports CoAP draft 08) WITH_COAP=13 - -# variable for Makefile.include -WITH_UIP6=1 # for some platforms UIP_CONF_IPV6=1 # IPv6 make config disappeared completely -CFLAGS += -DUIP_CONF_IPV6 -CFLAGS += -DUIP_CONF_IPV6_RPL +CFLAGS += -DUIP_CONF_IPV6=1 CONTIKI=../../.. CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\" # pcintkey PROJECT_SOURCEFILES += pcintkey.c +PROJECT_SOURCEFILES += statusled.c # variable for Makefile.include ifneq ($(TARGET), minimal-net) diff --git a/examples/osd/pingtheplug/er-example-server.c b/examples/osd/pingtheplug/er-example-server.c index 0c205ea82..451b102ce 100644 --- a/examples/osd/pingtheplug/er-example-server.c +++ b/examples/osd/pingtheplug/er-example-server.c @@ -42,25 +42,35 @@ #include #include "contiki.h" #include "contiki-net.h" +#include + + +#define PLATFORM_HAS_LED 1 +//#define PLATFORM_HAS_BUTTON 1 +#define PLATFORM_HAS_OPTRIAC 1 +#define PLATFORM_HAS_TEMPERATURE 1 +#define PLATFORM_HAS_BATTERY 1 /* Define which resources to include to meet memory constraints. */ -#define REST_RES_INFO 1 +#define REST_RES_MODEL 1 +#define REST_RES_NAME 1 +#define REST_RES_SW 1 +#define REST_RES_RESET 1 +#define REST_RES_TIMER 1 #define REST_RES_OPTRIAC 1 #define REST_RES_TEMPERATURE 1 -#define REST_RES_EVENT 0 -#define REST_RES_LEDS 0 -#define REST_RES_TOGGLE 0 +#define REST_RES_LED 1 #define REST_RES_BATTERY 1 #include "erbium.h" #include "pcintkey.h" +#include "statusled.h" -#include "dev/led.h" #if defined (PLATFORM_HAS_BUTTON) #include "dev/button-sensor.h" #endif -#if defined (PLATFORM_HAS_LEDS) +#if defined (PLATFORM_HAS_LED) #include "dev/leds.h" #endif #if defined (PLATFORM_HAS_OPTRIAC) @@ -88,7 +98,7 @@ #warning "Erbium example without CoAP-specifc functionality" #endif /* CoAP-specific example */ -#define DEBUG 0 +#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]) @@ -100,13 +110,16 @@ #endif /******************************************************************************/ +uint8_t g_triac_a = 0; +uint8_t g_triac_b = 0; -#if REST_RES_INFO +/******************************************************************************/ +#if REST_RES_MODEL /* * Resources are defined by the RESOURCE macro. * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). */ -RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); +RESOURCE(model, METHOD_GET, "p/model", "title=\"model\";rt=\"simple.dev.mdl\""); /* * A handler function named [resource name]_handler must be implemented for each RESOURCE. @@ -115,7 +128,7 @@ RESOURCE(info, METHOD_GET, "info", "title=\"Info\";rt=\"text\""); * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. */ void -info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +model_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { char message[100]; int index = 0; @@ -123,8 +136,7 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ // jSON Format - index += sprintf(message + index,"{\n \"Version\" : \"V1.0pre1\",\n"); - index += sprintf(message + index," \"name\" : \"light-actor\"\n"); + index += sprintf(message + index,"{\n \"model\" : \"PingThePlug\"\n"); index += sprintf(message + index,"}\n"); length = strlen(message); @@ -135,9 +147,263 @@ info_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } #endif +/******************************************************************************/ +#if REST_RES_SW +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(sw, METHOD_GET, "p/sw", "title=\"Software Version\";rt=\"simple.dev.sv\""); + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +sw_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"sw\" : \"V0.9\"\n"); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); +} +#endif + +/******************************************************************************/ +#if REST_RES_NAME +/* + * Resources are defined by the RESOURCE macro. + * Signature: resource name, the RESTful methods it handles, and its URI path (omitting the leading slash). + */ +RESOURCE(name, METHOD_POST | METHOD_GET, "p/name", "title=\"name\";rt=\"simple.dev.n\""); +/* eeprom space */ +#define P_NAME "Testboard" +#define P_NAME_MAX 17 +uint8_t eemem_p_name[P_NAME_MAX] EEMEM = P_NAME; + +/* + * A handler function named [resource name]_handler must be implemented for each RESOURCE. + * A buffer for the response payload is provided through the buffer pointer. Simple resources can ignore + * preferred_size and offset, but must respect the REST_MAX_CHUNK_SIZE limit for the buffer. + * If a smaller block size is requested for CoAP, the REST framework automatically splits the data. + */ +void +name_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t eebuffer[32]; + char message[100]; + int index = 0; + int length = 0; /* |<-------->| */ + const char *name = NULL; + int success = 1; + + switch(REST.get_method_type(request)){ + case METHOD_GET: + cli(); + eeprom_read_block (eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"name\" : \"%s\"\n",eebuffer); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + break; + + case METHOD_POST: + if (success && (length=REST.get_post_variable(request, "name", &name))) { + PRINTF("name %s\n", name); + if (length < P_NAME_MAX) { + memcpy(&eebuffer, name,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + + +/******************************************************************************/ +#if REST_RES_TIMER +/*A simple actuator example*/ +RESOURCE(timer, METHOD_GET | METHOD_POST , "a/timer", "title=\"TIMER, POST timer=XXX\";rt=\"Control\""); +/* eeprom space */ +#define P_TIMER "60" +#define P_TIMER_MAX 10 +uint8_t eemem_p_timer[P_TIMER_MAX] EEMEM = P_TIMER; + +int gtimer_read(){ + uint8_t eebuffer[32]; + + cli(); + eeprom_read_block (eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + sei(); + return atoi((const char *)eebuffer); +} + +void +timer_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t eebuffer[32]; + const char *timer = NULL; + char message[100]; + int length = 0; /* |<-------->| */ + int index = 0; + int success = 1; + + switch(REST.get_method_type(request)){ + + case METHOD_GET: + cli(); + eeprom_read_block (eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + sei(); + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"timer\" : \"%s\"\n",eebuffer); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + break; + + case METHOD_POST: + if (success && (length=REST.get_post_variable(request, "timer", &timer))) { + PRINTF("name %s\n", timer); + if (length < P_TIMER_MAX) { + memcpy(&eebuffer, timer,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + sei(); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ +#if REST_RES_RESET +/*A simple actuator example*/ +RESOURCE(reset, METHOD_GET | METHOD_POST , "p/reset", "title=\"RESET, POST mode=on\";rt=\"Control\""); +/* eeprom space */ +#define P_RESET "0" +#define P_RESET_MAX 10 +uint8_t eemem_p_reset[P_RESET_MAX] EEMEM = P_RESET; + +void +reset_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + uint8_t eebuffer[32]; + const char *mode = NULL; + char message[100]; + int length = 0; /* |<-------->| */ + int index = 0; + int reset = 0; + size_t len = 0; + int success = 1; + + switch(REST.get_method_type(request)){ + + case METHOD_GET: + cli(); + eeprom_read_block (eebuffer, &eemem_p_reset, sizeof(eemem_p_reset)); + sei(); + /* Some data that has the length up to REST_MAX_CHUNK_SIZE. For more, see the chunk resource. */ + // jSON Format + index += sprintf(message + index,"{\n \"reset\" : \"%s\"\n",eebuffer); + index += sprintf(message + index,"}\n"); + + length = strlen(message); + memcpy(buffer, message,length ); + + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + REST.set_response_payload(response, buffer, length); + break; + + case METHOD_POST: + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + if (strncmp(mode, "on", len)==0) { + length=strlen(P_NAME); + memcpy(&eebuffer, P_NAME,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_name, sizeof(eemem_p_name)); + sei(); + length=strlen(P_TIMER); + memcpy(&eebuffer, P_TIMER,length); + eebuffer[length]=0; + cli(); + eeprom_write_block(&eebuffer, &eemem_p_timer, sizeof(eemem_p_timer)); + eeprom_read_block (eebuffer, &eemem_p_reset, sizeof(eemem_p_reset)); + sei(); + reset= atoi((char*)eebuffer) + 1; + length=sprintf((char*)eebuffer,"%d",reset); + cli(); + eeprom_write_block(&eebuffer, &eemem_p_reset, sizeof(eemem_p_reset)); + sei(); + } else { + success = 0; + } + } else { + success = 0; + } + break; + default: + success = 0; + } + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + +/******************************************************************************/ // pcintkey_ext /*A simple actuator example. read the key button status*/ -RESOURCE(extbutton, METHOD_GET | METHOD_PUT , "sensors/extbutton", "title=\"ext.Button\";rt=\"Text\""); +RESOURCE(extbutton, METHOD_GET | METHOD_POST , "s/extbutton", "title=\"ext.Button\";rt=\"Text\""); void extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -179,7 +445,7 @@ extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe REST.set_response_payload(response, buffer, length); break; - case METHOD_PUT: + case METHOD_POST: if (success && (len=REST.get_post_variable(request, "name", &name))) { PRINTF("name %s\n", name); @@ -196,65 +462,33 @@ extbutton_handler(void* request, void* response, uint8_t *buffer, uint16_t prefe REST.set_response_status(response, REST.status.BAD_REQUEST); } } -/*A simple actuator example, post variable mode, relay is activated or deactivated*/ -RESOURCE(led1, METHOD_GET | METHOD_PUT , "actuators/led1", "title=\"Led1\";rt=\"led\""); + +/******************************************************************************/ +#if REST_RES_LED +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(led1, METHOD_POST | METHOD_PUT , "a/led1", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\""); + void led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { - char mode[10]; - static uint8_t led1 = 0; - static char name[17]="led1"; + size_t len = 0; + const char *mode = NULL; + uint8_t led = 0; int success = 1; - char temp[100]; - int index = 0; - size_t len = 0; + led = LEDS_RED; - const char *pmode = NULL; - const char *pname = NULL; + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); - switch(REST.get_method_type(request)){ - case METHOD_GET: - // jSON Format - index += sprintf(temp + index,"{\n \"name\" : \"%s\",\n",name); - if(led1 == 0) - index += sprintf(temp + index," \"mode\" : \"off\"\n"); - if(led1 == 1) - index += sprintf(temp + index," \"mode\" : \"on\"\n"); - index += sprintf(temp + index,"}\n"); - - len = strlen(temp); - memcpy(buffer, temp,len ); - - REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - REST.set_response_payload(response, buffer, len); - break; - case METHOD_POST: - success = 0; - break; - case METHOD_PUT: - if (success && (len=REST.get_post_variable(request, "mode", &pmode))) { - PRINTF("name %s\n", mode); - memcpy(mode, pmode,len); - mode[len]=0; - if (!strcmp(mode, "on")) { - led1_on(); - led1 = 1; - } else if (!strcmp(mode, "off")) { - led1_off(); - led1 = 0; - } else { - success = 0; - } - } else if (success && (len=REST.get_post_variable(request, "name", &pname))) { - PRINTF("name %s\n", name); - memcpy(name, pname,len); - name[len]=0; + if (strncmp(mode, "on", len)==0) { + leds_on(led); + } else if (strncmp(mode, "off", len)==0) { + leds_off(led); } else { success = 0; } - break; - default: + } else { success = 0; } @@ -263,12 +497,40 @@ led1_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_ } } -/******************************************************************************/ -#if defined (PLATFORM_HAS_OPTRIAC) -/******************************************************************************/ +/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ +RESOURCE(led2, METHOD_POST | METHOD_PUT , "a/led2", "title=\"LED: POST/PUT mode=on|off\";rt=\"simple.act.led\""); + +void +led2_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + size_t len = 0; + const char *mode = NULL; + int success = 1; + + + if (success && (len=REST.get_post_variable(request, "mode", &mode))) { + PRINTF("mode %s\n", mode); + + if (strncmp(mode, "on", len)==0) { + statusled_on(); + } else if (strncmp(mode, "off", len)==0) { + statusled_off(); + } else { + success = 0; + } + } else { + success = 0; + } + + if (!success) { + REST.set_response_status(response, REST.status.BAD_REQUEST); + } +} +#endif + #if REST_RES_OPTRIAC /*A simple actuator example*/ -RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "actuators/optriac", "title=\"TRIAC, POST/PUT mode=on|off\";rt=\"Control\""); +RESOURCE(optriac, METHOD_GET | METHOD_POST | METHOD_PUT , "a/optriac", "title=\"TRIAC, POST/PUT mode=on|off\";rt=\"Control\""); void optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) @@ -304,20 +566,20 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr REST.set_response_payload(response, buffer, len); break; - case METHOD_POST: + case METHOD_PUT: success = 0; break; - case METHOD_PUT: + case METHOD_POST: if (success && (len=REST.get_post_variable(request, "mode", &mode))) { PRINTF("mode %s\n", mode); if (strncmp(mode, "on", len)==0) { - led1_on(); // Debug optriac_sensor.configure(OPTRIAC_SENSOR_A,1); optriac_sensor.configure(OPTRIAC_SENSOR_B,1); + statusled_on(); } else if (strncmp(mode, "off", len)==0) { optriac_sensor.configure(OPTRIAC_SENSOR_A,0); optriac_sensor.configure(OPTRIAC_SENSOR_B,0); - led1_off(); // Debug + statusled_off(); } else { success = 0; } @@ -332,80 +594,12 @@ optriac_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr REST.set_response_status(response, REST.status.BAD_REQUEST); } } -#endif -/******************************************************************************/ #endif /* PLATFORM_HAS_OPTRIAC */ -/******************************************************************************/ -#if defined (PLATFORM_HAS_LEDS) -/******************************************************************************/ -#if REST_RES_LEDS -/*A simple actuator example, depending on the color query parameter and post variable mode, corresponding led is activated or deactivated*/ -RESOURCE(leds, METHOD_POST | METHOD_PUT , "actuators/leds", "title=\"LEDs: ?color=r|g|b, POST/PUT mode=on|off\";rt=\"Control\""); - -void -leds_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - size_t len = 0; - const char *color = NULL; - const char *mode = NULL; - uint8_t led = 0; - int success = 1; - - if ((len=REST.get_query_variable(request, "color", &color))) { - PRINTF("color %.*s\n", len, color); - - if (strncmp(color, "r", len)==0) { - led = LEDS_RED; - } else if(strncmp(color,"g", len)==0) { - led = LEDS_GREEN; - } else if (strncmp(color,"b", len)==0) { - led = LEDS_BLUE; - } else { - success = 0; - } - } else { - success = 0; - } - - if (success && (len=REST.get_post_variable(request, "mode", &mode))) { - PRINTF("mode %s\n", mode); - - if (strncmp(mode, "on", len)==0) { - leds_on(led); - } else if (strncmp(mode, "off", len)==0) { - leds_off(led); - } else { - success = 0; - } - } else { - success = 0; - } - - if (!success) { - REST.set_response_status(response, REST.status.BAD_REQUEST); - } -} -#endif - -/******************************************************************************/ -#if REST_RES_TOGGLE -/* A simple actuator example. Toggles the red led */ -RESOURCE(toggle, METHOD_GET | METHOD_PUT | METHOD_POST, "actuators/toggle", "title=\"Red LED\";rt=\"Control\""); -void -toggle_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) -{ - leds_toggle(LEDS_RED); -} -#endif -#endif /* PLATFORM_HAS_LEDS */ - -/******************************************************************************/ - /******************************************************************************/ #if REST_RES_TEMPERATURE && defined (PLATFORM_HAS_TEMPERATURE) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(temperature, METHOD_GET, "sensors/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); +RESOURCE(temperature, METHOD_GET, "s/cputemp", "title=\"Temperature status\";rt=\"temperature-c\""); void temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -417,14 +611,15 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", temperature); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", temperature/100, temperature % 100); + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); } else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d}", temperature); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'temperature':%d.%02d}", temperature/100, temperature % 100); REST.set_response_payload(response, buffer, strlen((char *)buffer)); } @@ -440,7 +635,7 @@ temperature_handler(void* request, void* response, uint8_t *buffer, uint16_t pre /******************************************************************************/ #if REST_RES_BATTERY && defined (PLATFORM_HAS_BATTERY) /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(battery, METHOD_GET, "sensors/battery", "title=\"Battery status\";rt=\"battery-mV\""); +RESOURCE(battery, METHOD_GET, "s/battery", "title=\"Battery status\";rt=\"battery-mV\""); void battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { @@ -452,15 +647,15 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr if ((num==0) || (num && accept[0]==REST.type.TEXT_PLAIN)) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", battery); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d.%02d", battery/1000, battery % 1000); REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); } else if (num && (accept[0]==REST.type.APPLICATION_JSON)) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); - snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'battery':%d}", battery); - + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{\"battery\":%d.%02d}", battery/1000, battery % 1000); + REST.set_response_payload(response, buffer, strlen((char *)buffer)); } else @@ -478,7 +673,8 @@ battery_handler(void* request, void* response, uint8_t *buffer, uint16_t preferr void hw_init() { - led1_off(); + leds_off(LEDS_RED); + statusledinit(); key_init(); } @@ -491,9 +687,14 @@ AUTOSTART_PROCESSES(&rest_server_example, &sensors_process); PROCESS_THREAD(rest_server_example, ev, data) { static struct etimer ds_periodic_timer; + static uint8_t state=0; static int ext4=0; static int ext5=0; static int ext6=0; +// ext4 = is_button_ext4(); +// ext5 = is_button_ext5(); +// ext6 = is_button_ext6(); + PROCESS_BEGIN(); PRINTF("Starting Erbium Example Server\n"); @@ -510,35 +711,46 @@ PROCESS_THREAD(rest_server_example, ev, data) 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) && !defined (CONTIKI_TARGET_NATIVE) + set_global_address(); + configure_routing(); +#endif + /* Initialize the OSD Hardware. */ hw_init(); /* Initialize the REST engine. */ rest_init_engine(); /* Activate the application-specific resources. */ - rest_activate_resource(&resource_led1); - rest_activate_resource(&resource_extbutton); -#if REST_RES_INFO - rest_activate_resource(&resource_info); +#if REST_RES_MODEL + rest_activate_resource(&resource_model); #endif +#if REST_RES_SW + rest_activate_resource(&resource_sw); +#endif +#if REST_RES_NAME + rest_activate_resource(&resource_name); +#endif +#if REST_RES_RESET + rest_activate_resource(&resource_reset); +#endif +#if REST_RES_TIMER + rest_activate_resource(&resource_timer); +#endif + + rest_activate_resource(&resource_extbutton); /* Activate the application-specific resources. */ #if REST_RES_OPTRIAC SENSORS_ACTIVATE(optriac_sensor); rest_activate_resource(&resource_optriac); #endif -#if defined (PLATFORM_HAS_PIR) && (REST_RES_EVENT) - SENSORS_ACTIVATE(pir_sensor); - rest_activate_event_resource(&resource_pir); - PRINTF("ACTIVATE PIR\n"); +#if defined (PLATFORM_HAS_LED) +#if REST_RES_LED + rest_activate_resource(&resource_led1); + rest_activate_resource(&resource_led2); #endif -#if defined (PLATFORM_HAS_LEDS) -#if REST_RES_LEDS - rest_activate_resource(&resource_leds); -#endif -#if REST_RES_TOGGLE - rest_activate_resource(&resource_toggle); -#endif -#endif /* PLATFORM_HAS_LEDS */ +#endif /* PLATFORM_HAS_LED */ #if defined (PLATFORM_HAS_TEMPERATURE) && REST_RES_TEMPERATURE SENSORS_ACTIVATE(temperature_sensor); rest_activate_resource(&resource_temperature); @@ -552,47 +764,10 @@ PROCESS_THREAD(rest_server_example, ev, data) /* Define application-specific events here. */ while(1) { PROCESS_WAIT_EVENT(); -#if defined (REST_RES_EVENT) - if (ev == sensors_event ) { - PRINTF("EVENT\n"); -#if (REST_RES_EVENT && defined (PLATFORM_HAS_PIR)) - if (data == &pir_sensor) { - PRINTF("PIR EVENT\n"); - /* Call the event_handler for this application-specific event. */ - pir_event_handler(&resource_pir); - PRINTF("CALL EVENT HANDLER\n"); - } -#endif /* PLATFORM_HAS_PIR */ - } -#endif /* REST_RES_EVENT */ + /* Button Tric Logic */ if(etimer_expired(&ds_periodic_timer)) { PRINTF("Periodic %d %d\n",ext5,ext6); - if(ext5 != is_button_ext5()) { - ext5 = is_button_ext5(); - PRINTF("Toggle Triac A\n"); - // Toggle Triac A - if(optriac_sensor.value(OPTRIAC_SENSOR_A) == 0){ - optriac_sensor.configure(OPTRIAC_SENSOR_A,1); - led1_on(); - }else{ - optriac_sensor.configure(OPTRIAC_SENSOR_A,0); - led1_off(); - } - } - if(ext6 != is_button_ext6()) { - ext6 = is_button_ext6(); - PRINTF("Toggle Triac B\n"); - // Toggle Triac B - if(optriac_sensor.value(OPTRIAC_SENSOR_B) == 0){ - optriac_sensor.configure(OPTRIAC_SENSOR_B,1); - led2_on(); - }else{ - optriac_sensor.configure(OPTRIAC_SENSOR_B,0); - led2_off(); - } - } - etimer_reset(&ds_periodic_timer); } } /* while (1) */ diff --git a/examples/osd/pingtheplug/pcintkey.c b/examples/osd/pingtheplug/pcintkey.c index 3da35669d..5fc065e24 100644 --- a/examples/osd/pingtheplug/pcintkey.c +++ b/examples/osd/pingtheplug/pcintkey.c @@ -62,14 +62,14 @@ void key_init(void) { // Pairing Button - PORTB |= (1< - - [CONTIKI_DIR]/tools/cooja/apps/mrm - [CONTIKI_DIR]/tools/cooja/apps/mspsim - [CONTIKI_DIR]/tools/cooja/apps/avrora - [CONTIKI_DIR]/tools/cooja/apps/serial_socket - [CONTIKI_DIR]/tools/cooja/apps/collect-view - - REST with RPL router - -2147483648 - 123456 - 1000000 - - se.sics.cooja.radiomediums.UDGM - 50.0 - 50.0 - 1.0 - 1.0 - - - 40000 - - - se.sics.cooja.mspmote.SkyMoteType - rplroot - Sky RPL Root - [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.c - make border-router.sky TARGET=sky - [CONTIKI_DIR]/examples/ipv6/rpl-border-router/border-router.sky - se.sics.cooja.interfaces.Position - se.sics.cooja.interfaces.RimeAddress - se.sics.cooja.interfaces.IPAddress - se.sics.cooja.interfaces.Mote2MoteRelations - se.sics.cooja.interfaces.MoteAttributes - se.sics.cooja.mspmote.interfaces.MspClock - se.sics.cooja.mspmote.interfaces.MspMoteID - se.sics.cooja.mspmote.interfaces.SkyButton - se.sics.cooja.mspmote.interfaces.SkyFlash - se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio - se.sics.cooja.mspmote.interfaces.MspSerial - se.sics.cooja.mspmote.interfaces.SkyLED - se.sics.cooja.mspmote.interfaces.MspDebugOutput - se.sics.cooja.mspmote.interfaces.SkyTemperature - - - se.sics.cooja.mspmote.SkyMoteType - server - Erbium Server - [CONTIKI_DIR]/examples/er-rest-example/er-example-server.c - make er-example-server.sky TARGET=sky - [CONTIKI_DIR]/examples/er-rest-example/er-example-server.sky - se.sics.cooja.interfaces.Position - se.sics.cooja.interfaces.RimeAddress - se.sics.cooja.interfaces.IPAddress - se.sics.cooja.interfaces.Mote2MoteRelations - se.sics.cooja.interfaces.MoteAttributes - se.sics.cooja.mspmote.interfaces.MspClock - se.sics.cooja.mspmote.interfaces.MspMoteID - se.sics.cooja.mspmote.interfaces.SkyButton - se.sics.cooja.mspmote.interfaces.SkyFlash - se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio - se.sics.cooja.mspmote.interfaces.MspSerial - se.sics.cooja.mspmote.interfaces.SkyLED - se.sics.cooja.mspmote.interfaces.MspDebugOutput - se.sics.cooja.mspmote.interfaces.SkyTemperature - - - se.sics.cooja.mspmote.SkyMoteType - client - Erbium Client - [CONTIKI_DIR]/examples/er-rest-example/er-example-client.c - make er-example-client.sky TARGET=sky - [CONTIKI_DIR]/examples/er-rest-example/er-example-client.sky - se.sics.cooja.interfaces.Position - se.sics.cooja.interfaces.RimeAddress - se.sics.cooja.interfaces.IPAddress - se.sics.cooja.interfaces.Mote2MoteRelations - se.sics.cooja.interfaces.MoteAttributes - se.sics.cooja.mspmote.interfaces.MspClock - se.sics.cooja.mspmote.interfaces.MspMoteID - se.sics.cooja.mspmote.interfaces.SkyButton - se.sics.cooja.mspmote.interfaces.SkyFlash - se.sics.cooja.mspmote.interfaces.SkyCoffeeFilesystem - se.sics.cooja.mspmote.interfaces.SkyByteRadio - se.sics.cooja.mspmote.interfaces.MspSerial - se.sics.cooja.mspmote.interfaces.SkyLED - se.sics.cooja.mspmote.interfaces.MspDebugOutput - se.sics.cooja.mspmote.interfaces.SkyTemperature - - - - - se.sics.cooja.interfaces.Position - 33.260163187353555 - 30.643217359962595 - 0.0 - - - se.sics.cooja.mspmote.interfaces.MspMoteID - 1 - - rplroot - - - - - se.sics.cooja.interfaces.Position - 46.57186415376375 - 40.35946215910942 - 0.0 - - - se.sics.cooja.mspmote.interfaces.MspMoteID - 2 - - server - - - - - se.sics.cooja.interfaces.Position - 18.638049428485125 - 47.55034515769599 - 0.0 - - - se.sics.cooja.mspmote.interfaces.MspMoteID - 3 - - client - - - - se.sics.cooja.plugins.SimControl - 259 - 0 - 179 - 0 - 0 - - - se.sics.cooja.plugins.Visualizer - - se.sics.cooja.plugins.skins.IDVisualizerSkin - se.sics.cooja.plugins.skins.UDGMVisualizerSkin - se.sics.cooja.plugins.skins.MoteTypeVisualizerSkin - se.sics.cooja.plugins.skins.AttributeVisualizerSkin - se.sics.cooja.plugins.skins.LEDVisualizerSkin - se.sics.cooja.plugins.skins.AddressVisualizerSkin - 3.61568947862321 0.0 0.0 3.61568947862321 15.610600779367 -85.92728269158351 - - 300 - 2 - 178 - 261 - 1 - - - se.sics.cooja.plugins.LogListener - - - - - 762 - 3 - 491 - 2 - 182 - - - se.sics.cooja.plugins.RadioLogger - - 150 - - - 451 - -1 - 305 - 73 - 140 - true - - - SerialSocketServer - 0 - 422 - 4 - 74 - 578 - 18 - - - se.sics.cooja.plugins.TimeLine - - 0 - 1 - 2 - - - - - 125 - 25.49079397896416 - - 1624 - 5 - 252 - 6 - 712 - - - se.sics.cooja.plugins.MoteInterfaceViewer - 2 - - Serial port - 0,0 - - 853 - 1 - 491 - 765 - 182 - - - diff --git a/examples/osd/pingtheplug/static-routing.c b/examples/osd/pingtheplug/static-routing.c deleted file mode 100644 index 628594892..000000000 --- a/examples/osd/pingtheplug/static-routing.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * static-routing.c - * - * Created on: Oct 12, 2010 - * Author: simonduq - */ - -#include -#include "static-routing.h" - -#define DEBUG 0 -#if DEBUG -#include -#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(inode_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); - } - } -} diff --git a/examples/osd/pingtheplug/static-routing.h b/examples/osd/pingtheplug/static-routing.h deleted file mode 100644 index 0dff0b7ba..000000000 --- a/examples/osd/pingtheplug/static-routing.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * 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_ */ diff --git a/examples/osd/pingtheplug/todo b/examples/osd/pingtheplug/todo deleted file mode 100644 index c72368662..000000000 --- a/examples/osd/pingtheplug/todo +++ /dev/null @@ -1,9 +0,0 @@ -*) pcintkey-sensor -Die PinChange Interrupts der Pins laufen alle über PCINT0_vect. - -Somit sollte der folgende Code für die Aktivierung reichen: -PCICR |= BV(PCIE0); -PCMSK0 |= BV(PCINT4) | BV(PCINT5) | BV(PCINT6); - -*) led-sensor -*) EmbedVM integration From 2d424bd2594ad3221648b4ae88af5ee30fb1d1d5 Mon Sep 17 00:00:00 2001 From: harald Date: Tue, 27 May 2014 11:33:10 +0200 Subject: [PATCH 143/345] initial upload --- .../osd/pingtheplug/doc/rolladen-brd3.pdf | Bin 0 -> 41262 bytes .../pingtheplug/doc/rolladen-verdrahtung.pdf | Bin 0 -> 259125 bytes examples/osd/pingtheplug/doc/rolladen.pdf | Bin 0 -> 24683 bytes examples/osd/pingtheplug/statusled.c | 86 ++++++++++++++++++ examples/osd/pingtheplug/statusled.h | 53 +++++++++++ 5 files changed, 139 insertions(+) create mode 100644 examples/osd/pingtheplug/doc/rolladen-brd3.pdf create mode 100644 examples/osd/pingtheplug/doc/rolladen-verdrahtung.pdf create mode 100644 examples/osd/pingtheplug/doc/rolladen.pdf create mode 100644 examples/osd/pingtheplug/statusled.c create mode 100644 examples/osd/pingtheplug/statusled.h diff --git a/examples/osd/pingtheplug/doc/rolladen-brd3.pdf b/examples/osd/pingtheplug/doc/rolladen-brd3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..66dcb840b818eec7d682ca702cffbb7f5921deae GIT binary patch literal 41262 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

Routes
");
+  ADD("
Routes
\n");
   SEND_STRING(&s->sout, buf);
 #if BUF_USES_STACK
   bufptr = buf; bufend = bufptr + sizeof(buf);
@@ -259,6 +265,65 @@ PT_THREAD(generate_routes(struct httpd_state *s))
   }
   ADD("
"); +#if RPL_WITH_NON_STORING + ADD("Links
\n");
+  SEND_STRING(&s->sout, buf);
+#if BUF_USES_STACK
+  bufptr = buf; bufend = bufptr + sizeof(buf);
+#else
+  blen = 0;
+#endif
+  for(link = rpl_ns_node_head(); link != NULL; link = rpl_ns_node_next(link)) {
+    if(link->parent != NULL) {
+      uip_ipaddr_t child_ipaddr;
+      uip_ipaddr_t parent_ipaddr;
+
+      rpl_ns_get_node_global_addr(&child_ipaddr, link);
+      rpl_ns_get_node_global_addr(&parent_ipaddr, link->parent);
+
+#if BUF_USES_STACK
+#if WEBSERVER_CONF_ROUTE_LINKS
+      ADD("");
+      ipaddr_add(&child_ipaddr);
+      ADD("");
+#else
+      ipaddr_add(&child_ipaddr);
+#endif
+#else
+#if WEBSERVER_CONF_ROUTE_LINKS
+      ADD("");
+      SEND_STRING(&s->sout, buf); //TODO: why tunslip6 needs an output here, wpcapslip does not
+      blen = 0;
+      ipaddr_add(&child_ipaddr);
+      ADD("");
+#else
+      ipaddr_add(&child_ipaddr);
+#endif
+#endif
+
+      ADD(" (parent: ");
+      ipaddr_add(&parent_ipaddr);
+      if(1 || (link->lifetime < 600)) {
+        ADD(") %us\n", (unsigned int)link->lifetime); // iotlab printf does not have %lu
+        //ADD(") %lus\n", (unsigned long)r->state.lifetime);
+      } else {
+        ADD(")\n");
+      }
+      SEND_STRING(&s->sout, buf);
+#if BUF_USES_STACK
+      bufptr = buf; bufend = bufptr + sizeof(buf);
+#else
+      blen = 0;
+#endif
+    }
+  }
+  ADD("
"); +#endif /* RPL_WITH_NON_STORING */ + #if WEBSERVER_CONF_FILESTATS static uint16_t numtimes; ADD("
This page sent %u times",++numtimes); From e584a54608f3895db61f254cea9ec1796d2ae41c Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Wed, 3 Feb 2016 16:30:59 +0100 Subject: [PATCH 223/345] Insert RPL ext header in tcpip_ipv6_output for consistency --- core/net/ip/tcpip.c | 4 ++++ core/net/ipv6/uip-icmp6.c | 12 ------------ core/net/ipv6/uip6.c | 4 ---- 3 files changed, 4 insertions(+), 16 deletions(-) diff --git a/core/net/ip/tcpip.c b/core/net/ip/tcpip.c index df3f0608d..faee7e9e5 100644 --- a/core/net/ip/tcpip.c +++ b/core/net/ip/tcpip.c @@ -548,6 +548,10 @@ tcpip_ipv6_output(void) return; } +#if UIP_CONF_IPV6_RPL + rpl_insert_header(); +#endif /* UIP_CONF_IPV6_RPL */ + if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) { /* Next hop determination */ diff --git a/core/net/ipv6/uip-icmp6.c b/core/net/ipv6/uip-icmp6.c index d246a4d58..466627a98 100644 --- a/core/net/ipv6/uip-icmp6.c +++ b/core/net/ipv6/uip-icmp6.c @@ -160,11 +160,6 @@ echo_request_input(void) uip_ext_len = 0; } - /* Insert RPL extension headers */ -#if UIP_CONF_IPV6_RPL - rpl_insert_header(); -#endif /* UIP_CONF_IPV6_RPL */ - /* Below is important for the correctness of UIP_ICMP_BUF and the * checksum */ @@ -260,10 +255,6 @@ uip_icmp6_error_output(uint8_t type, uint8_t code, uint32_t param) { UIP_ICMP_BUF->icmpchksum = 0; UIP_ICMP_BUF->icmpchksum = ~uip_icmp6chksum(); -#if UIP_CONF_IPV6_RPL - rpl_insert_header(); -#endif /* UIP_CONF_IPV6_RPL */ - UIP_STAT(++uip_stat.icmp.sent); PRINTF("Sending ICMPv6 ERROR message type %d code %d to ", type, code); @@ -301,9 +292,6 @@ uip_icmp6_send(const uip_ipaddr_t *dest, int type, int code, int payload_len) UIP_STAT(++uip_stat.icmp.sent); UIP_STAT(++uip_stat.ip.sent); -#if UIP_CONF_IPV6_RPL - rpl_insert_header(); -#endif /* UIP_CONF_IPV6_RPL */ tcpip_ipv6_output(); } /*---------------------------------------------------------------------------*/ diff --git a/core/net/ipv6/uip6.c b/core/net/ipv6/uip6.c index 94f4dfcf9..0ce97d610 100644 --- a/core/net/ipv6/uip6.c +++ b/core/net/ipv6/uip6.c @@ -1582,10 +1582,6 @@ uip_process(uint8_t flag) } #endif /* UIP_UDP_CHECKSUMS */ -#if UIP_CONF_IPV6_RPL - rpl_insert_header(); -#endif /* UIP_CONF_IPV6_RPL */ - UIP_STAT(++uip_stat.udp.sent); goto ip_send_nolen; #endif /* UIP_UDP */ From d73b22962449da9f7d5f22eb830f403c3c50b59a Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Mon, 13 Jun 2016 12:04:19 +0200 Subject: [PATCH 224/345] Fix and cleanup RPL ext header handling --- core/net/ip/tcpip.c | 13 +-- core/net/ipv6/uip6.c | 10 +- core/net/rpl/rpl-ext-header.c | 199 +++++++++++----------------------- 3 files changed, 68 insertions(+), 154 deletions(-) diff --git a/core/net/ip/tcpip.c b/core/net/ip/tcpip.c index faee7e9e5..ea6ed6753 100644 --- a/core/net/ip/tcpip.c +++ b/core/net/ip/tcpip.c @@ -549,7 +549,12 @@ tcpip_ipv6_output(void) } #if UIP_CONF_IPV6_RPL - rpl_insert_header(); + if(!rpl_update_header()) { + /* Packet can not be forwarded */ + PRINTF("tcpip_ipv6_output: RPL header update error\n"); + uip_clear_buf(); + return; + } #endif /* UIP_CONF_IPV6_RPL */ if(!uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) { @@ -655,12 +660,6 @@ tcpip_ipv6_output(void) /* End of next hop determination */ -#if UIP_CONF_IPV6_RPL - if(!rpl_finalize_header(nexthop)) { - uip_clear_buf(); - return; - } -#endif /* UIP_CONF_IPV6_RPL */ nbr = uip_ds6_nbr_lookup(nexthop); if(nbr == NULL) { #if UIP_ND6_SEND_NA diff --git a/core/net/ipv6/uip6.c b/core/net/ipv6/uip6.c index 0ce97d610..3795999a4 100644 --- a/core/net/ipv6/uip6.c +++ b/core/net/ipv6/uip6.c @@ -890,7 +890,7 @@ ext_hdr_options_process(void) */ #if UIP_CONF_IPV6_RPL PRINTF("Processing RPL option\n"); - if(rpl_verify_hbh_header(uip_ext_opt_offset)) { + if(!rpl_verify_hbh_header(uip_ext_opt_offset)) { PRINTF("RPL Option Error: Dropping Packet\n"); return 1; } @@ -1228,14 +1228,6 @@ uip_process(uint8_t flag) goto send; } -#if UIP_CONF_IPV6_RPL - if(!rpl_update_header()) { - /* Packet can not be forwarded */ - PRINTF("RPL header update error\n"); - goto drop; - } -#endif /* UIP_CONF_IPV6_RPL */ - UIP_IP_BUF->ttl = UIP_IP_BUF->ttl - 1; PRINTF("Forwarding packet to "); PRINT6ADDR(&UIP_IP_BUF->destipaddr); diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index 5ba429a26..593e7a33f 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -78,26 +78,22 @@ rpl_verify_hbh_header(int uip_ext_opt_offset) uip_ds6_route_t *route; rpl_parent_t *sender = NULL; - if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8)) { - PRINTF("RPL: Hop-by-hop extension header has wrong size\n"); - return 1; - } + if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8) + || UIP_EXT_HDR_OPT_RPL_BUF->opt_type != UIP_EXT_HDR_OPT_RPL + || UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) { - if(UIP_EXT_HDR_OPT_RPL_BUF->opt_type != UIP_EXT_HDR_OPT_RPL) { - PRINTF("RPL: Non RPL Hop-by-hop option\n"); - return 1; - } - - if(UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) { - PRINTF("RPL: Bad header option! (wrong length)\n"); - return 1; + PRINTF("RPL: Hop-by-hop extension header has wrong size or type (%u %u %u)\n", + UIP_HBHO_BUF->len, + UIP_EXT_HDR_OPT_RPL_BUF->opt_type, + UIP_EXT_HDR_OPT_RPL_BUF->opt_len); + return 0; /* Drop */ } instance = rpl_get_instance(UIP_EXT_HDR_OPT_RPL_BUF->instance); if(instance == NULL) { PRINTF("RPL: Unknown instance: %u\n", UIP_EXT_HDR_OPT_RPL_BUF->instance); - return 1; + return 0; } if(UIP_EXT_HDR_OPT_RPL_BUF->flags & RPL_HDR_OPT_FWD_ERR) { @@ -116,14 +112,13 @@ rpl_verify_hbh_header(int uip_ext_opt_offset) /* Trigger DAO retransmission */ rpl_reset_dio_timer(instance); /* drop the packet as it is not routable */ - return 1; + return 0; } if(!instance->current_dag->joined) { PRINTF("RPL: No DAG in the instance\n"); - return 1; + return 0; } - down = 0; if(UIP_EXT_HDR_OPT_RPL_BUF->flags & RPL_HDR_OPT_DOWN) { down = 1; @@ -167,16 +162,16 @@ rpl_verify_hbh_header(int uip_ext_opt_offset) PRINTF("RPL: Rank error signalled in RPL option!\n"); /* Packet must be dropped and dio trickle timer reset, see RFC6550 - 11.2.2.2 */ rpl_reset_dio_timer(instance); - return 1; + return 0; } PRINTF("RPL: Single error tolerated\n"); RPL_STAT(rpl_stats.loop_warnings++); UIP_EXT_HDR_OPT_RPL_BUF->flags |= RPL_HDR_OPT_RANK_ERR; - return 0; + return 1; } PRINTF("RPL: Rank OK\n"); - return 0; + return 1; } /*---------------------------------------------------------------------------*/ #if RPL_WITH_NON_STORING @@ -482,52 +477,39 @@ update_hbh_header(void) uip_ext_len = 0; uip_ext_opt_offset = 2; - PRINTF("RPL: Verifying the presence of the RPL header option\n"); + if(UIP_IP_BUF->proto == UIP_PROTO_HBHO && UIP_EXT_HDR_OPT_RPL_BUF->opt_type == UIP_EXT_HDR_OPT_RPL) { + if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8) + || UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) { - switch(UIP_IP_BUF->proto) { - case UIP_PROTO_HBHO: - if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8)) { - PRINTF("RPL: Hop-by-hop extension header has wrong size\n"); - uip_ext_len = last_uip_ext_len; - return 1; - } - if(UIP_EXT_HDR_OPT_RPL_BUF->opt_type != UIP_EXT_HDR_OPT_RPL) { - PRINTF("RPL: Non RPL Hop-by-hop option support not implemented\n"); - uip_ext_len = last_uip_ext_len; - return 1; - } - if(UIP_EXT_HDR_OPT_RPL_BUF->opt_len != RPL_HDR_OPT_LEN) { - PRINTF("RPL: RPL Hop-by-hop option has wrong length\n"); - uip_ext_len = last_uip_ext_len; - return 1; + PRINTF("RPL: Hop-by-hop extension header has wrong size (%u %u)\n", + UIP_EXT_HDR_OPT_RPL_BUF->opt_len, + uip_ext_len); + return 0; /* Drop */ } + instance = rpl_get_instance(UIP_EXT_HDR_OPT_RPL_BUF->instance); if(instance == NULL || !instance->used || !instance->current_dag->joined) { - PRINTF("RPL: Unable to add hop-by-hop extension header: incorrect instance\n"); - return 1; + PRINTF("RPL: Unable to add/update hop-by-hop extension header: incorrect instance\n"); + uip_ext_len = last_uip_ext_len; + return 0; /* Drop */ } - break; - default: - PRINTF("RPL: No hop-by-hop option found\n"); - return 1; - } - switch(UIP_EXT_HDR_OPT_BUF->type) { - case UIP_EXT_HDR_OPT_RPL: PRINTF("RPL: Updating RPL option\n"); + /* Update sender rank and instance, will update flags next */ UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(instance->current_dag->rank); + UIP_EXT_HDR_OPT_RPL_BUF->instance = instance->instance_id; if(RPL_IS_STORING(instance)) { /* In non-storing mode, downwards traffic does not have the HBH option */ /* Check the direction of the down flag, as per Section 11.2.2.3, - which states that if a packet is going down it should in - general not go back up again. If this happens, a - RPL_HDR_OPT_FWD_ERR should be flagged. */ + which states that if a packet is going down it should in + general not go back up again. If this happens, a + RPL_HDR_OPT_FWD_ERR should be flagged. */ if((UIP_EXT_HDR_OPT_RPL_BUF->flags & RPL_HDR_OPT_DOWN)) { if(uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr) == NULL) { UIP_EXT_HDR_OPT_RPL_BUF->flags |= RPL_HDR_OPT_FWD_ERR; PRINTF("RPL forwarding error\n"); /* We should send back the packet to the originating parent, - but it is not feasible yet, so we send a No-Path DAO instead */ + but it is not feasible yet, so we send a No-Path DAO instead */ PRINTF("RPL generate No-Path DAO\n"); parent = rpl_get_parent((uip_lladdr_t *)packetbuf_addr(PACKETBUF_ADDR_SENDER)); if(parent != NULL) { @@ -538,11 +520,11 @@ update_hbh_header(void) } } else { /* Set the down extension flag correctly as described in Section - 11.2 of RFC6550. If the packet progresses along a DAO route, - the down flag should be set. */ + 11.2 of RFC6550. If the packet progresses along a DAO route, + the down flag should be set. */ if(uip_ds6_route_lookup(&UIP_IP_BUF->destipaddr) == NULL) { /* No route was found, so this packet will go towards the RPL - root. If so, we should not set the down flag. */ + root. If so, we should not set the down flag. */ UIP_EXT_HDR_OPT_RPL_BUF->flags &= ~RPL_HDR_OPT_DOWN; PRINTF("RPL option going up\n"); } else { @@ -552,18 +534,14 @@ update_hbh_header(void) } } } - - uip_ext_len = last_uip_ext_len; - return 1; - default: - PRINTF("RPL: Multi Hop-by-hop options not implemented\n"); - uip_ext_len = last_uip_ext_len; - return 1; } + + uip_ext_len = last_uip_ext_len; + return 1; } /*---------------------------------------------------------------------------*/ static int -insert_hbh_header(void) +insert_hbh_header(const rpl_instance_t *instance) { int uip_ext_opt_offset; int last_uip_ext_len; @@ -594,8 +572,8 @@ insert_hbh_header(void) UIP_EXT_HDR_OPT_RPL_BUF->opt_type = UIP_EXT_HDR_OPT_RPL; UIP_EXT_HDR_OPT_RPL_BUF->opt_len = RPL_HDR_OPT_LEN; UIP_EXT_HDR_OPT_RPL_BUF->flags = 0; - UIP_EXT_HDR_OPT_RPL_BUF->instance = 0; - UIP_EXT_HDR_OPT_RPL_BUF->senderrank = 0; + UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(instance->current_dag->rank); + UIP_EXT_HDR_OPT_RPL_BUF->instance = instance->instance_id; uip_len += RPL_HOP_BY_HOP_LEN; temp_len = UIP_IP_BUF->len[1]; UIP_IP_BUF->len[1] += RPL_HOP_BY_HOP_LEN; @@ -604,44 +582,9 @@ insert_hbh_header(void) } uip_ext_len = last_uip_ext_len + RPL_HOP_BY_HOP_LEN; - return 1; -} -/*---------------------------------------------------------------------------*/ -int -rpl_finalize_header(uip_ipaddr_t *addr) -{ - rpl_parent_t *parent; - int uip_ext_opt_offset; - int last_uip_ext_len; - last_uip_ext_len = uip_ext_len; - uip_ext_len = 0; - uip_ext_opt_offset = 2; - - if(UIP_IP_BUF->proto == UIP_PROTO_HBHO) { - if(UIP_HBHO_BUF->len != ((RPL_HOP_BY_HOP_LEN - 8) / 8)) { - PRINTF("RPL: Non RPL Hop-by-hop options support not implemented\n"); - uip_ext_len = last_uip_ext_len; - return 1; - } - - if(UIP_EXT_HDR_OPT_BUF->type == UIP_EXT_HDR_OPT_RPL) { - if(UIP_EXT_HDR_OPT_RPL_BUF->senderrank == 0) { - PRINTF("RPL: Updating RPL option\n"); - if(default_instance == NULL || !default_instance->used || !default_instance->current_dag->joined) { - PRINTF("RPL: Unable to add hop-by-hop extension header: incorrect default instance\n"); - return 0; - } - parent = rpl_find_parent(default_instance->current_dag, addr); - if(parent == NULL || parent != parent->dag->preferred_parent) { - UIP_EXT_HDR_OPT_RPL_BUF->flags = RPL_HDR_OPT_DOWN; - } - UIP_EXT_HDR_OPT_RPL_BUF->instance = default_instance->instance_id; - UIP_EXT_HDR_OPT_RPL_BUF->senderrank = UIP_HTONS(default_instance->current_dag->rank); - } - } - } - return 1; + /* Update header before returning */ + return update_hbh_header(); } /*---------------------------------------------------------------------------*/ void @@ -654,8 +597,6 @@ rpl_remove_header(void) uip_ext_len = 0; uip_next_hdr = &UIP_IP_BUF->proto; - PRINTF("RPL: Verifying the presence of RPL extension headers\n"); - /* Look for hop-by-hop and routing headers */ while(uip_next_hdr != NULL) { switch(*uip_next_hdr) { @@ -691,51 +632,33 @@ rpl_remove_header(void) } } /*---------------------------------------------------------------------------*/ -void -rpl_insert_header(void) -{ - if(default_instance == NULL || default_instance->current_dag == NULL - || uip_is_addr_linklocal(&UIP_IP_BUF->destipaddr) || uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) { - return; - } - - if(RPL_IS_STORING(default_instance)) { - insert_hbh_header(); - } - - if(RPL_IS_NON_STORING(default_instance)) { - if(default_instance->current_dag != NULL) { - if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) { - insert_srh_header(); - } else { - insert_hbh_header(); - } - } - } -} -/*---------------------------------------------------------------------------*/ int rpl_update_header(void) { - if(default_instance == NULL) { - return 0; + if(default_instance == NULL || default_instance->current_dag == NULL + || uip_is_addr_linklocal(&UIP_IP_BUF->destipaddr) || uip_is_addr_mcast(&UIP_IP_BUF->destipaddr)) { + return 1; } - if(default_instance->current_dag != NULL) { - if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) { - /* At the root, remove headers if any, and insert SRH or HBH - * (SRH is inserted only if the destination is in the DODAG) */ - rpl_remove_header(); - if(RPL_IS_NON_STORING(default_instance)) { - return insert_srh_header(); - } else { - return insert_hbh_header(); - } + if(default_instance->current_dag->rank == ROOT_RANK(default_instance)) { + /* At the root, remove headers if any, and insert SRH or HBH + * (SRH is inserted only if the destination is in the DODAG) */ + rpl_remove_header(); + if(RPL_IS_NON_STORING(default_instance)) { + return insert_srh_header(); } else { - return update_hbh_header(); + return insert_hbh_header(default_instance); } } else { - return 0; + if(uip_ds6_is_my_addr(&UIP_IP_BUF->srcipaddr) + && UIP_IP_BUF->ttl == uip_ds6_if.cur_hop_limit) { + /* Insert HBH option at source. Checking the address is not sufficient because + * in non-storing mode, a packet may go up and then down the same path again */ + return insert_hbh_header(default_instance); + } else { + /* Update HBH option at forwarders */ + return update_hbh_header(); + } } } From 00f2344b4a947687de7435022b03f6416f51211d Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Tue, 28 Jun 2016 14:59:23 +0200 Subject: [PATCH 225/345] RPL insert_srh_header: return success when no SRH is needed because the destination is a direct child --- core/net/rpl/rpl-ext-header.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/net/rpl/rpl-ext-header.c b/core/net/rpl/rpl-ext-header.c index 593e7a33f..80de287d9 100644 --- a/core/net/rpl/rpl-ext-header.c +++ b/core/net/rpl/rpl-ext-header.c @@ -378,7 +378,7 @@ insert_srh_header(void) if(node == root_node) { PRINTF("RPL: SRH no need to insert SRH\n"); - return 0; + return 1; } while(node != NULL && node != root_node) { From 7a1576815e5b4555d940867e05152328f2f1eeda Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Wed, 29 Jun 2016 17:06:12 +0200 Subject: [PATCH 226/345] rpl-tsch example: use RPL non-storing mode --- examples/ipv6/rpl-tsch/node.c | 62 ++++++++++++++----- examples/ipv6/rpl-tsch/project-conf.h | 15 ++++- regression-tests/11-ipv6/19-z1-rpl-tsch.csc | 2 +- .../11-ipv6/20-z1-rpl-tsch-orchestra.csc | 2 +- .../11-ipv6/21-z1-rpl-tsch-security.csc | 2 +- 5 files changed, 61 insertions(+), 22 deletions(-) diff --git a/examples/ipv6/rpl-tsch/node.c b/examples/ipv6/rpl-tsch/node.c index 35852b608..a49540f7a 100644 --- a/examples/ipv6/rpl-tsch/node.c +++ b/examples/ipv6/rpl-tsch/node.c @@ -41,6 +41,7 @@ #include "net/rpl/rpl.h" #include "net/ipv6/uip-ds6-route.h" #include "net/mac/tsch/tsch.h" +#include "net/rpl/rpl-private.h" #if WITH_ORCHESTRA #include "orchestra.h" #endif /* WITH_ORCHESTRA */ @@ -68,46 +69,73 @@ print_network_status(void) int i; uint8_t state; uip_ds6_defrt_t *default_route; +#if RPL_WITH_STORING uip_ds6_route_t *route; +#endif /* RPL_WITH_STORING */ +#if RPL_WITH_NON_STORING + rpl_ns_node_t *link; +#endif /* RPL_WITH_NON_STORING */ - PRINTA("--- Network status ---\n"); + PRINTF("--- Network status ---\n"); /* Our IPv6 addresses */ - PRINTA("- Server IPv6 addresses:\n"); + PRINTF("- Server IPv6 addresses:\n"); for(i = 0; i < UIP_DS6_ADDR_NB; i++) { state = uip_ds6_if.addr_list[i].state; if(uip_ds6_if.addr_list[i].isused && (state == ADDR_TENTATIVE || state == ADDR_PREFERRED)) { - PRINTA("-- "); - uip_debug_ipaddr_print(&uip_ds6_if.addr_list[i].ipaddr); - PRINTA("\n"); + PRINTF("-- "); + PRINT6ADDR(&uip_ds6_if.addr_list[i].ipaddr); + PRINTF("\n"); } } /* Our default route */ - PRINTA("- Default route:\n"); + PRINTF("- Default route:\n"); default_route = uip_ds6_defrt_lookup(uip_ds6_defrt_choose()); if(default_route != NULL) { - PRINTA("-- "); - uip_debug_ipaddr_print(&default_route->ipaddr); - PRINTA(" (lifetime: %lu seconds)\n", (unsigned long)default_route->lifetime.interval); + PRINTF("-- "); + PRINT6ADDR(&default_route->ipaddr); + PRINTF(" (lifetime: %lu seconds)\n", (unsigned long)default_route->lifetime.interval); } else { - PRINTA("-- None\n"); + PRINTF("-- None\n"); } +#if RPL_WITH_STORING /* Our routing entries */ - PRINTA("- Routing entries (%u in total):\n", uip_ds6_route_num_routes()); + PRINTF("- Routing entries (%u in total):\n", uip_ds6_route_num_routes()); route = uip_ds6_route_head(); while(route != NULL) { - PRINTA("-- "); - uip_debug_ipaddr_print(&route->ipaddr); - PRINTA(" via "); - uip_debug_ipaddr_print(uip_ds6_route_nexthop(route)); - PRINTA(" (lifetime: %lu seconds)\n", (unsigned long)route->state.lifetime); + PRINTF("-- "); + PRINT6ADDR(&route->ipaddr); + PRINTF(" via "); + PRINT6ADDR(uip_ds6_route_nexthop(route)); + PRINTF(" (lifetime: %lu seconds)\n", (unsigned long)route->state.lifetime); route = uip_ds6_route_next(route); } +#endif - PRINTA("----------------------\n"); +#if RPL_WITH_NON_STORING + /* Our routing links */ + PRINTF("- Routing links (%u in total):\n", rpl_ns_num_nodes()); + link = rpl_ns_node_head(); + while(link != NULL) { + if(link->parent != NULL) { + uip_ipaddr_t child_ipaddr; + uip_ipaddr_t parent_ipaddr; + rpl_ns_get_node_global_addr(&child_ipaddr, link); + rpl_ns_get_node_global_addr(&parent_ipaddr, link->parent); + PRINTF("-- "); + PRINT6ADDR(&child_ipaddr); + PRINTF(" to "); + PRINT6ADDR(&parent_ipaddr); + PRINTF(" (lifetime: %lu seconds)\n", (unsigned long)link->lifetime); + } + link = rpl_ns_node_next(link); + } +#endif + + PRINTF("----------------------\n"); } /*---------------------------------------------------------------------------*/ static void diff --git a/examples/ipv6/rpl-tsch/project-conf.h b/examples/ipv6/rpl-tsch/project-conf.h index 8ac0a93b6..9a0d98d58 100644 --- a/examples/ipv6/rpl-tsch/project-conf.h +++ b/examples/ipv6/rpl-tsch/project-conf.h @@ -45,6 +45,17 @@ #define WITH_SECURITY 0 #endif /* WITH_SECURITY */ +/*******************************************************/ +/********* Enable RPL non-storing mode *****************/ +/*******************************************************/ + +#undef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 0 /* No need for routes */ +#undef RPL_CONF_MOP +#define RPL_CONF_MOP RPL_MOP_NON_STORING /* Mode of operation*/ +#undef ORCHESTRA_CONF_RULES +#define ORCHESTRA_CONF_RULES { &eb_per_time_source, &unicast_per_neighbor_rpl_ns, &default_common } /* Orchestra in non-storing */ + /*******************************************************/ /********************* Enable TSCH *********************/ /*******************************************************/ @@ -140,8 +151,8 @@ #define UIP_CONF_TCP 0 #undef QUEUEBUF_CONF_NUM #define QUEUEBUF_CONF_NUM 3 -#undef UIP_CONF_MAX_ROUTES -#define UIP_CONF_MAX_ROUTES 8 +#undef RPL_NS_CONF_LINK_NUM +#define RPL_NS_CONF_LINK_NUM 8 #undef NBR_TABLE_CONF_MAX_NEIGHBORS #define NBR_TABLE_CONF_MAX_NEIGHBORS 8 #undef UIP_CONF_ND6_SEND_NA diff --git a/regression-tests/11-ipv6/19-z1-rpl-tsch.csc b/regression-tests/11-ipv6/19-z1-rpl-tsch.csc index 7488e8c3b..3a679a140 100644 --- a/regression-tests/11-ipv6/19-z1-rpl-tsch.csc +++ b/regression-tests/11-ipv6/19-z1-rpl-tsch.csc @@ -272,7 +272,7 @@ make node.z1 TARGET=z1 MAKE_WITH_ORCHESTRA=0 MAKE_WITH_SECURITY=0 /* Wait until a node (can only be the DAGRoot) has * 8 routing entries (i.e. can reach every node) */ log.log("Waiting for routing tables to fill\n"); -WAIT_UNTIL(msg.endsWith("Routing entries (8 in total):")); +WAIT_UNTIL(msg.endsWith("Routing links (8 in total):")); log.log("Root routing table ready\n"); log.testOK(); /* Report test success and quit */ diff --git a/regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc b/regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc index 3fecd2040..9c8c19b5b 100644 --- a/regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc +++ b/regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc @@ -277,7 +277,7 @@ log.log("Orchestra started\n"); /* Wait until a node (can only be the DAGRoot) has * 8 routing entries (i.e. can reach every node) */ log.log("Waiting for routing tables to fill\n"); -WAIT_UNTIL(msg.endsWith("Routing entries (8 in total):")); +WAIT_UNTIL(msg.endsWith("Routing links (8 in total):")); log.log("Root routing table ready\n"); log.testOK(); /* Report test success and quit */ diff --git a/regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc b/regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc index e2cda7e44..a5924fb88 100644 --- a/regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc +++ b/regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc @@ -274,7 +274,7 @@ log.log("Waiting for association with security\n"); /* Wait until a node (can only be the DAGRoot) has * 8 routing entries (i.e. can reach every node) */ log.log("Waiting for routing tables to fill\n"); -WAIT_UNTIL(msg.endsWith("Routing entries (8 in total):")); +WAIT_UNTIL(msg.endsWith("Routing links (8 in total):")); log.log("Root routing table ready\n"); log.testOK(); /* Report test success and quit */ From 5d99008afb1f49e866f4eb2c3672c0b0a134e577 Mon Sep 17 00:00:00 2001 From: Mohamed Seliem Date: Fri, 1 Jul 2016 08:10:03 +0200 Subject: [PATCH 227/345] remove duplicate include Update uip-ds6-nbr.h --- core/net/ipv6/uip-ds6-nbr.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/net/ipv6/uip-ds6-nbr.h b/core/net/ipv6/uip-ds6-nbr.h index 40a17d1e2..0e22e22dc 100644 --- a/core/net/ipv6/uip-ds6-nbr.h +++ b/core/net/ipv6/uip-ds6-nbr.h @@ -50,8 +50,6 @@ #include "net/nbr-table.h" #include "sys/stimer.h" #include "net/ipv6/uip-ds6.h" -#include "net/nbr-table.h" - #if UIP_CONF_IPV6_QUEUE_PKT #include "net/ip/uip-packetqueue.h" #endif /*UIP_CONF_QUEUE_PKT */ From d5e2a779d400e969dae80057d14dad1999520507 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Mon, 4 Jul 2016 17:58:42 +0200 Subject: [PATCH 228/345] Added DHT22 sensor to Zoul-based platforms --- examples/zolertia/zoul/Makefile | 3 +- examples/zolertia/zoul/test-dht22.c | 88 ++++++++++ platform/zoul/dev/dht22.c | 255 ++++++++++++++++++++++++++++ platform/zoul/dev/dht22.h | 114 +++++++++++++ 4 files changed, 459 insertions(+), 1 deletion(-) create mode 100644 examples/zolertia/zoul/test-dht22.c create mode 100644 platform/zoul/dev/dht22.c create mode 100644 platform/zoul/dev/dht22.h diff --git a/examples/zolertia/zoul/Makefile b/examples/zolertia/zoul/Makefile index ddd89f4ca..d11279e44 100644 --- a/examples/zolertia/zoul/Makefile +++ b/examples/zolertia/zoul/Makefile @@ -5,11 +5,12 @@ CONTIKI_PROJECT += test-bmp085-bmp180 test-motion test-rotation-sensor CONTIKI_PROJECT += test-grove-light-sensor test-grove-loudness-sensor CONTIKI_PROJECT += test-weather-meter test-grove-gyro test-lcd test-iaq CONTIKI_PROJECT += test-pm10-sensor test-vac-sensor test-aac-sensor -CONTIKI_PROJECT += test-zonik +CONTIKI_PROJECT += test-zonik test-dht22.c CONTIKI_TARGET_SOURCEFILES += tsl2563.c sht25.c bmpx8x.c motion-sensor.c CONTIKI_TARGET_SOURCEFILES += adc-sensors.c weather-meter.c grove-gyro.c CONTIKI_TARGET_SOURCEFILES += rgb-bl-lcd.c pm10-sensor.c iaq.c zonik.c relay.c +CONTIKI_TARGET_SOURCEFILES += dht22.c all: $(CONTIKI_PROJECT) diff --git a/examples/zolertia/zoul/test-dht22.c b/examples/zolertia/zoul/test-dht22.c new file mode 100644 index 000000000..43048eba3 --- /dev/null +++ b/examples/zolertia/zoul/test-dht22.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2016, Zolertia + * 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. + * + */ +/** + * \addtogroup zoul-examples + * @{ + * + * \defgroup zoul-dht22-test DHT22 temperature and humidity sensor test + * + * Demonstrates the use of the DHT22 digital temperature and humidity sensor + * @{ + * + * \file + * A quick program for testing the DHT22 temperature and humidity sensor + * \author + * Antonio Lignan + */ +/*---------------------------------------------------------------------------*/ +#include +#include "contiki.h" +#include "dev/dht22.h" +/*---------------------------------------------------------------------------*/ +PROCESS(remote_dht22_process, "DHT22 test"); +AUTOSTART_PROCESSES(&remote_dht22_process); +/*---------------------------------------------------------------------------*/ +static struct etimer et; +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(remote_dht22_process, ev, data) +{ + int16_t temperature, humidity; + + PROCESS_BEGIN(); + SENSORS_ACTIVATE(dht22); + + /* Let it spin and read sensor data */ + + while(1) { + etimer_set(&et, CLOCK_SECOND); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + + /* The standard sensor API may be used to read sensors individually, using + * the `dht22.value(DHT22_READ_TEMP)` and `dht22.value(DHT22_READ_HUM)`, + * however a single read operation (5ms) returns both values, so by using + * the function below we save one extra operation + */ + if(dht22_read_all(&temperature, &humidity) != DHT22_ERROR) { + printf("Temperature %02d.%02d ºC, ", temperature / 10, temperature % 10); + printf("Humidity %02d.%02d RH\n", humidity / 10, humidity % 10); + } else { + printf("Failed to read the sensor\n"); + } + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ + diff --git a/platform/zoul/dev/dht22.c b/platform/zoul/dev/dht22.c new file mode 100644 index 000000000..f12859dff --- /dev/null +++ b/platform/zoul/dev/dht22.c @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup zoul-dht22 + * @{ + * + * \file + * Driver for the DHT22 temperature and humidity sensor + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dht22.h" +#include "dev/gpio.h" +#include "lib/sensors.h" +#include "dev/ioc.h" +#include "dev/watchdog.h" +#include +/*---------------------------------------------------------------------------*/ +#define DEBUG 0 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +#define BUSYWAIT_UNTIL(max_time) \ + do { \ + rtimer_clock_t t0; \ + t0 = RTIMER_NOW(); \ + while(RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (max_time))) { \ + watchdog_periodic(); \ + } \ + } while(0) +/*---------------------------------------------------------------------------*/ +#define DHT22_PORT_BASE GPIO_PORT_TO_BASE(DHT22_PORT) +#define DHT22_PIN_MASK GPIO_PIN_MASK(DHT22_PIN) +/*---------------------------------------------------------------------------*/ +static uint8_t enabled; +static uint8_t busy; +static uint8_t dht22_data[DHT22_BUFFER]; +/*---------------------------------------------------------------------------*/ +static int +dht22_read(void) +{ + uint8_t i; + uint8_t j = 0; + uint8_t last_state; + uint8_t counter = 0; + uint8_t checksum = 0; + + if(enabled) { + /* Exit low power mode and initialize variables */ + GPIO_SET_OUTPUT(DHT22_PORT_BASE, DHT22_PIN_MASK); + GPIO_SET_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + BUSYWAIT_UNTIL(DHT22_AWAKE_TIME); + memset(dht22_data, 0, DHT22_BUFFER); + + /* Initialization sequence */ + GPIO_CLR_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + BUSYWAIT_UNTIL(DHT22_START_TIME); + GPIO_SET_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + clock_delay_usec(DHT22_READY_TIME); + + /* Prepare to read, DHT22 should keep line low 80us, then 80us high. + * The ready-to-send-bit condition is the line kept low for 50us, then if + * the line is high between 24-25us the bit sent will be "0" (zero), else + * if the line is high between 70-74us the bit sent will be "1" (one). + */ + GPIO_SET_INPUT(DHT22_PORT_BASE, DHT22_PIN_MASK); + last_state = GPIO_READ_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + + for(i = 0; i < DHT22_MAX_TIMMING; i++) { + counter = 0; + while(GPIO_READ_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK) == last_state) { + counter++; + clock_delay_usec(DHT22_READING_DELAY); + + /* Exit if not responsive */ + if(counter == 0xFF) { + break; + } + } + + last_state = GPIO_READ_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + + /* Double check for stray sensor */ + if(counter == 0xFF) { + break; + } + + /* Ignore the first 3 transitions (the 80us x 2 start condition plus the + * first ready-to-send-bit state), and discard ready-to-send-bit counts + */ + if((i >= 4) && ((i % 2) == 0)) { + dht22_data[j / 8] <<= 1; + if(counter > DHT22_COUNT) { + dht22_data[j / 8] |= 1; + } + j++; + } + } + + for(i = 0; i < DHT22_BUFFER; i++) { + PRINTF("DHT22: (%u) %u\n", i, dht22_data[i]); + } + + /* If we have 5 bytes (40 bits), wrap-up and end */ + if(j >= 40) { + /* The first 2 bytes are humidity values, the next 2 are temperature, the + * final byte is the checksum + */ + checksum = dht22_data[0] + dht22_data[1] + dht22_data[2] + dht22_data[3]; + checksum &= 0xFF; + if(dht22_data[4] == checksum) { + GPIO_SET_INPUT(DHT22_PORT_BASE, DHT22_PIN_MASK); + GPIO_SET_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + return DHT22_SUCCESS; + } + PRINTF("DHT22: bad checksum\n"); + } + } + return DHT22_ERROR; +} +/*---------------------------------------------------------------------------*/ +static uint16_t +dht22_humidity(void) +{ + uint16_t res; + res = dht22_data[0]; + res *= 256; + res += dht22_data[1]; + busy = 0; + return res; +} +/*---------------------------------------------------------------------------*/ +static uint16_t +dht22_temperature(void) +{ + uint16_t res; + res = dht22_data[2] & 0x7F; + res *= 256; + res += dht22_data[3]; + busy = 0; + return res; +} +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + if((type != DHT22_READ_HUM) && (type != DHT22_READ_TEMP) && + (type != DHT22_READ_ALL)) { + PRINTF("DHT22: Invalid type %u\n", type); + return DHT22_ERROR; + } + + if(busy) { + PRINTF("DHT22: ongoing operation, wait\n"); + return DHT22_BUSY; + } + + busy = 1; + + if(dht22_read() != DHT22_SUCCESS) { + PRINTF("DHT22: Fail to read sensor\n"); + GPIO_SET_INPUT(DHT22_PORT_BASE, DHT22_PIN_MASK); + GPIO_SET_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + busy = 0; + return DHT22_ERROR; + } + + switch(type) { + case DHT22_READ_HUM: + return dht22_humidity(); + case DHT22_READ_TEMP: + return dht22_temperature(); + case DHT22_READ_ALL: + return DHT22_SUCCESS; + default: + return DHT22_ERROR; + } +} +/*---------------------------------------------------------------------------*/ +int +dht22_read_all(int *temperature, int *humidity) +{ + if((temperature == NULL) || (humidity == NULL)) { + PRINTF("DHT22: Invalid arguments\n"); + return DHT22_ERROR; + } + + if(value(DHT22_READ_ALL) != DHT22_ERROR) { + *temperature = dht22_temperature(); + *humidity = dht22_humidity(); + return DHT22_SUCCESS; + } + + /* Already cleaned-up in the value() function */ + return DHT22_ERROR; +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int value) +{ + if(type != SENSORS_ACTIVE) { + return DHT22_ERROR; + } + + GPIO_SOFTWARE_CONTROL(DHT22_PORT_BASE, DHT22_PIN_MASK); + GPIO_SET_INPUT(DHT22_PORT_BASE, DHT22_PIN_MASK); + ioc_set_over(DHT22_PORT, DHT22_PIN, IOC_OVERRIDE_OE); + GPIO_SET_PIN(DHT22_PORT_BASE, DHT22_PIN_MASK); + + /* Restart flag */ + busy = 0; + + if(value) { + enabled = 1; + return DHT22_SUCCESS; + } + + enabled = 0; + return DHT22_SUCCESS; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(dht22, DHT22_SENSOR, value, configure, NULL); +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/platform/zoul/dev/dht22.h b/platform/zoul/dev/dht22.h new file mode 100644 index 000000000..f75a96494 --- /dev/null +++ b/platform/zoul/dev/dht22.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup zoul-sensors + * @{ + * + * \defgroup zoul-dht22 DHT22 temperature and humidity sensor + * + * Driver for the DHT22 temperature and humidity sensor + * @{ + * + * \file + * Header file for the DHT22 temperature and humidity sensor + */ +/*---------------------------------------------------------------------------*/ +#include "lib/sensors.h" +/*---------------------------------------------------------------------------*/ +#ifndef DHT22_H_ +#define DHT22_H_ +/* -------------------------------------------------------------------------- */ +/** + * \name DHT22 default pin and port + * @{ + */ +#ifdef DHT22_CONF_PIN +#define DHT22_PIN DHT22_CONF_PIN +#else +#define DHT22_PIN 5 +#endif +#ifdef DHT22_CONF_PORT +#define DHT22_PORT DHT22_CONF_PORT +#else +#define DHT22_PORT GPIO_A_NUM +#endif +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name DHT22 available commands + * @{ + */ +#define DHT22_READ_TEMP 0x01 +#define DHT22_READ_HUM 0x02 +#define DHT22_READ_ALL 0x03 +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name DHT22 return types + * @{ + */ +#define DHT22_ERROR (-1) +#define DHT22_SUCCESS 0x00 +#define DHT22_BUSY 0xFF +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name DHT22 constants + * @{ + */ +#define DHT22_BUFFER 5 /**< Buffer to store the samples */ +#define DHT22_COUNT 8 /**< Minimum ticks to detect a "1" bit */ +#define DHT22_MAX_TIMMING 85 /**< Maximum ticks in a single operation */ +#define DHT22_READING_DELAY 1 /**< 1 us */ +#define DHT22_READY_TIME 20 /**< 40 us */ +#define DHT22_START_TIME (RTIMER_SECOND / 50) /**< 20 ms */ +#define DHT22_AWAKE_TIME (RTIMER_SECOND / 4) /**< 250 ms */ +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name DHT22 auxiliary functions + * @{ + */ +int dht22_read_all(int *temperature, int *humidity); +/** @} */ +/* -------------------------------------------------------------------------- */ +#define DHT22_SENSOR "DHT22 sensor" +/* -------------------------------------------------------------------------- */ +extern const struct sensors_sensor dht22; +/* -------------------------------------------------------------------------- */ +#endif /* DHT22_H_ */ +/* -------------------------------------------------------------------------- */ +/** + * @} + * @} + */ From 6f8306a465460aca63810c4771a2c407b213342d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Mon, 13 Jun 2016 15:40:56 +0200 Subject: [PATCH 229/345] core/net/mac/frame802154: Fix typo in PAN ID compression condition --- core/net/mac/frame802154.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/core/net/mac/frame802154.c b/core/net/mac/frame802154.c index 77727ab47..a188a7358 100644 --- a/core/net/mac/frame802154.c +++ b/core/net/mac/frame802154.c @@ -146,30 +146,18 @@ frame802154_has_panid(frame802154_fcf_t *fcf, int *has_src_pan_id, int *has_dest } if(fcf->frame_version == FRAME802154_IEEE802154E_2012) { + /* IEEE 802.15.4e-2012, Table 2a, PAN ID Compression */ if(!fcf->panid_compression) { - /* Compressed PAN ID == no PAN ID at all */ - if(fcf->dest_addr_mode == fcf->dest_addr_mode) { - /* No address or both addresses: include destination PAN ID */ - dest_pan_id = 1; - } else if(fcf->dest_addr_mode) { - /* Only dest address, include dest PAN ID */ + if(fcf->dest_addr_mode) { + /* Use destination PAN ID if destination address is present */ dest_pan_id = 1; } else if(fcf->src_addr_mode) { /* Only src address, include src PAN ID */ src_pan_id = 1; } - } - if(fcf->dest_addr_mode == 0 && fcf->dest_addr_mode == 1) { - /* No address included, include dest PAN ID conditionally */ - if(!fcf->panid_compression) { - dest_pan_id = 1; - } - } - /* Remove the following rule the day rows 2 and 3 from table 2a are fixed: */ - if(fcf->dest_addr_mode == 0 && fcf->dest_addr_mode == 0) { - /* Not meaningful, we include a PAN ID iff the compress flag is set, but - * this is what the standard currently stipulates */ - dest_pan_id = fcf->panid_compression; + } else if((fcf->dest_addr_mode == 0) && (fcf->src_addr_mode == 0)) { + /* No address included: PAN ID compression flag changes meaning */ + dest_pan_id = 1; } } else { /* No PAN ID in ACK */ From 4373aecec295cf0f5c1098e7c28c5a3023f8a42d Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Tue, 5 Jul 2016 00:47:52 +0200 Subject: [PATCH 230/345] Tag non-file goals as ".PHONY" --- tools/6502/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/6502/Makefile b/tools/6502/Makefile index 46b0d4095..76837fe1d 100644 --- a/tools/6502/Makefile +++ b/tools/6502/Makefile @@ -62,6 +62,7 @@ endif CC65 := $(shell cl65 --print-target-path) define makes +.PHONY: $1-$2makes $1-$2makes: $(MAKE) -C ../../cpu/6502/ethconfig TARGET=$1 $2 $(MAKE) -C ../../cpu/6502/ipconfig TARGET=$1 $2 @@ -81,6 +82,8 @@ $(eval $(call makes,apple2enh,clean)) zip $@ $^ echo $(ZIPCOMMENT) | zip -z $@ +.PHONY: apple2 apple2-clean atari atari-clean c64 c64-clean c128 c128-clean + apple2: contiki-apple2.zip apple2-clean: apple2enh-cleanmakes From 4ceaaba4bde36404a3c4fdfd4cddf396a6eae92a Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Tue, 5 Jul 2016 12:13:46 +0200 Subject: [PATCH 231/345] RPL: added missing return, to not join instances with unsupported MOP --- core/net/rpl/rpl-dag.c | 1 + 1 file changed, 1 insertion(+) diff --git a/core/net/rpl/rpl-dag.c b/core/net/rpl/rpl-dag.c index 4e9af23f7..de5932692 100644 --- a/core/net/rpl/rpl-dag.c +++ b/core/net/rpl/rpl-dag.c @@ -1086,6 +1086,7 @@ rpl_join_instance(uip_ipaddr_t *from, rpl_dio_t *dio) || (!RPL_WITH_STORING && (dio->mop == RPL_MOP_STORING_NO_MULTICAST || dio->mop == RPL_MOP_STORING_MULTICAST))) { PRINTF("RPL: DIO advertising a non-supported MOP %u\n", dio->mop); + return; } /* Determine the objective function by using the From c4def60cdd02760bed023bf516ddbbf89e2bd916 Mon Sep 17 00:00:00 2001 From: Marko Gucanin Date: Tue, 5 Jul 2016 16:44:24 +0200 Subject: [PATCH 232/345] removed exception handler for SYSCALL, causing an infinite loop after calling vAHI_SwReset() --- platform/jn516x/dev/exceptions.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/platform/jn516x/dev/exceptions.c b/platform/jn516x/dev/exceptions.c index 10a3bf11b..a04654077 100644 --- a/platform/jn516x/dev/exceptions.c +++ b/platform/jn516x/dev/exceptions.c @@ -182,7 +182,6 @@ vEXC_Register(void) BUS_ERROR = (uint32)exception_handler; UNALIGNED_ACCESS = (uint32)exception_handler; ILLEGAL_INSTRUCTION = (uint32)exception_handler; - SYSCALL = (uint32)exception_handler; TRAP = (uint32)exception_handler; GENERIC = (uint32)exception_handler; STACK_OVERFLOW = (uint32)exception_handler; @@ -211,11 +210,6 @@ vException_IllegalInstruction(uint32 *pu32Stack, eExceptionType eType) exception_handler(pu32Stack, eType); } PUBLIC void -vException_SysCall(uint32 *pu32Stack, eExceptionType eType) -{ - exception_handler(pu32Stack, eType); -} -PUBLIC void vException_Trap(uint32 *pu32Stack, eExceptionType eType) { exception_handler(pu32Stack, eType); From 74d04562df5b665e31a796f38d788ef3e3c7f51d Mon Sep 17 00:00:00 2001 From: Marko Gucanin Date: Wed, 6 Jul 2016 15:45:15 +0200 Subject: [PATCH 233/345] Revert "removed exception handler for SYSCALL, causing an infinite loop after calling vAHI_SwReset()" This reverts commit c4def60cdd02760bed023bf516ddbbf89e2bd916. --- platform/jn516x/dev/exceptions.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/platform/jn516x/dev/exceptions.c b/platform/jn516x/dev/exceptions.c index a04654077..10a3bf11b 100644 --- a/platform/jn516x/dev/exceptions.c +++ b/platform/jn516x/dev/exceptions.c @@ -182,6 +182,7 @@ vEXC_Register(void) BUS_ERROR = (uint32)exception_handler; UNALIGNED_ACCESS = (uint32)exception_handler; ILLEGAL_INSTRUCTION = (uint32)exception_handler; + SYSCALL = (uint32)exception_handler; TRAP = (uint32)exception_handler; GENERIC = (uint32)exception_handler; STACK_OVERFLOW = (uint32)exception_handler; @@ -210,6 +211,11 @@ vException_IllegalInstruction(uint32 *pu32Stack, eExceptionType eType) exception_handler(pu32Stack, eType); } PUBLIC void +vException_SysCall(uint32 *pu32Stack, eExceptionType eType) +{ + exception_handler(pu32Stack, eType); +} +PUBLIC void vException_Trap(uint32 *pu32Stack, eExceptionType eType) { exception_handler(pu32Stack, eType); From 1a1d17143bcaef6f087ea1fe205cba03bba28ec4 Mon Sep 17 00:00:00 2001 From: Marko Gucanin Date: Wed, 6 Jul 2016 16:28:47 +0200 Subject: [PATCH 234/345] return from exception handler if E_EXC_SYSCALL is generated --- platform/jn516x/dev/exceptions.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platform/jn516x/dev/exceptions.c b/platform/jn516x/dev/exceptions.c index 10a3bf11b..ac975ecac 100644 --- a/platform/jn516x/dev/exceptions.c +++ b/platform/jn516x/dev/exceptions.c @@ -354,6 +354,9 @@ exception_handler(uint32 *pu32Stack, eExceptionType eType) } #endif + if(eType == E_EXC_SYSCALL) + return; + #if EXCEPTION_STALLS_SYSTEM while(1) { } From 1fc9bbe315b6efdedfe95cdcb34a0f82ede9903e Mon Sep 17 00:00:00 2001 From: Marko Gucanin Date: Fri, 8 Jul 2016 16:25:34 +0200 Subject: [PATCH 235/345] added { } --- platform/jn516x/dev/exceptions.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/jn516x/dev/exceptions.c b/platform/jn516x/dev/exceptions.c index ac975ecac..e23ff2906 100644 --- a/platform/jn516x/dev/exceptions.c +++ b/platform/jn516x/dev/exceptions.c @@ -354,8 +354,9 @@ exception_handler(uint32 *pu32Stack, eExceptionType eType) } #endif - if(eType == E_EXC_SYSCALL) + if(eType == E_EXC_SYSCALL){ return; + } #if EXCEPTION_STALLS_SYSTEM while(1) { From a8aa778b31f877b001869743b23e4fbd65a569b0 Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Fri, 15 Jul 2016 13:17:40 +0200 Subject: [PATCH 236/345] Removed unused file platform/avr-rss2/dev/ds18b20.c --- platform/avr-rss2/dev/ds18b20.c | 247 -------------------------------- 1 file changed, 247 deletions(-) delete mode 100644 platform/avr-rss2/dev/ds18b20.c diff --git a/platform/avr-rss2/dev/ds18b20.c b/platform/avr-rss2/dev/ds18b20.c deleted file mode 100644 index 6044ad91e..000000000 --- a/platform/avr-rss2/dev/ds18b20.c +++ /dev/null @@ -1,247 +0,0 @@ -/* - - Contiki library for DS18B20 temperature sensor - - For more details see http://xxx - - Author - - Author - - - License - GPLv3 - - */ - -#include "ds18b20.h" - -/* probe_for_ds18b20 probes for the sensor. Returns 0 on failure, 1 on success */ -/* Assumptions: only one sensor on the "1-wire bus", on port WSN_DS18B20_PORT */ -/* BUG: THIS CODE DOES NOT WORK AS INTENDED! IT RETURNS "1" EVEN WHEN THERE IS NO */ -/* SENSOR CONNECTED. */ - -uint8_t -ds18b20_probe(void) -{ - uint8_t result = 0; - - /* Reset 1W-bus */ - - /* Pull PIN low for 480 microseconds (us) */ - /* Start with setting bit DS18B20_1_PIN to 0 */ - OW_SET_PIN_LOW(); - /* then set direction to OUT by setting DS18B20_1_DDR bit to 1 */ - OW_SET_OUTPUT(); - /* Delay 480 us */ - clock_delay_usec(480); - /* See if sensor responds. First release the bus and switch to INput mode */ - /* by setting DS18B20_1_DDR bit to 0 */ - OW_SET_INPUT(); - /* Activate internal pull-up by setting pin to HIGH (when in INput mode) */ - /* OW_SET_PIN_HIGH(); */ - /* Wait for the pin to go HIGH for 64 us */ - clock_delay_usec(64); - /* Now the sensor, if present, pulls the pin LOW for 60-240 us */ - /* Detect 0 on PIND bit DS18B20_1_PIN. Invert the result so a presence (aka a 0) */ - /* sets "result" to 1 (for success) */ - result = !OW_GET_PIN_STATE(); - - /* The sensor releases the pin so it goes HIGH after 240 us, add some */ - /* for the signal to stabilize, say 300 usecs to be on the safe side? */ - if(result) { - clock_delay_usec(300); - /* Now the bus should be HIGH again */ - result = OW_GET_PIN_STATE(); - } - - return result; -} -/* Write 1 or 0 on the bus */ - -void -write_bit(uint8_t bit) -{ - /* Set pin to 0 */ - OW_SET_OUTPUT(); - OW_SET_PIN_LOW(); - - /* Pin should be 0 for at least 1 us */ - clock_delay_usec(2); - - /* If we're writing a 1, let interna pull-up pull the bus high */ - /* within 15 us of setting the bus to low */ - if(bit) { - /* Internal pull-up is activated by setting direction to IN and the */ - /* setting the pin to HIGH */ - OW_SET_INPUT(); - OW_SET_PIN_HIGH(); - } - /* OK, now the bus is either LOW, or pulled HIGH by the internal pull-up */ - /* Let this state remain for 60 us, then release the bus */ - clock_delay_usec(60); - - /* Release the bus */ - OW_SET_PIN_HIGH(); - OW_SET_INPUT(); - - /* Allow > 1 us between read/write operations */ - clock_delay_usec(2); -} -/* */ -/* Read one bit of information from the bus, and return it as 1 or 0 */ -/* */ - -uint8_t -read_bit(void) -{ - uint8_t bit = 0; - - /* Set pin to 0 */ - OW_SET_OUTPUT(); - OW_SET_PIN_LOW(); - - /* Pin should be 0 for at least 1 us */ - clock_delay_usec(2); - - /* Now read the bus, start by setting in/out direction and activating internal */ - /* pull-up resistor */ - OW_SET_INPUT(); - OW_SET_PIN_HIGH(); - - /* ds18b20 either keeps the pin down or releases the bus and the */ - /* bus then goes high because of the interna pull-up resistor */ - /* Check whichever happens before 15 us has passed */ - clock_delay_usec(15 - 2 - 1); - bit = OW_GET_PIN_STATE(); - - /* The complete read cycle must last at least 60 us. We have now spent */ - /* about 14-15 us in delays, so add another delay to reach >= 60 us */ - clock_delay_usec(50); - - /* Release bus */ - OW_SET_PIN_HIGH(); - OW_SET_INPUT(); - - /* Allow > 1 us between read/write operations */ - clock_delay_usec(2); - - return bit ? 1 : 0; -} -/* */ -/* Read one byte of information. A byte is read least significant bit first */ -/* */ - -uint8_t -read_byte(void) -{ - uint8_t result = 0; - uint8_t bit; - int i; - - for(i = 0; i < 8; i++) { - bit = read_bit(); - result += (bit << i); - } - return result; -} -/* */ -/* Write one byte of information. A byte is written least significant bit first */ -/* */ - -void -write_byte(uint8_t byte) -{ - int i; - - for(i = 0; i < 8; i++) { - write_bit((byte >> i) & 1); - } -} -/* */ -/* ds18b20_get_temp returns the temperature in "temp" (in degrees celsius) */ -/* Returns 0 on failure (and then "temp" is left unchanged */ -/* Returns 1 on success, and sets temp */ -/* */ - -uint8_t -ds18b20_get_temp(float *temp) -{ - uint8_t result = 0; - - /* Reset bus by probing. Probe returns 1 on success/presence of sensor */ - if(ds18b20_probe()) { - /* write command "skip rom" since we only have one sensor on the wire! */ - write_byte(DS18B20_COMMAND_SKIP_ROM); - - /* write command to start measurement */ - write_byte(DS18B20_COMMAND_START_CONVERSION); - - /* Wait for conversion to complete */ - /* Conversion is 12-bit by default. */ - /* Since we have external power to the sensor (ie not in "parasitic power" mode) */ - /* the bus is held LOW by the sensor while the conversion is going on, and then HIGH */ - /* when conversion is finished. */ - OW_SET_INPUT(); - int count = 0; - while(!OW_GET_PIN_STATE()) { - clock_delay_msec(10); - count++; - /* Longest conversion time is 750 ms (12-bit resolution) */ - /* So if count > 80 (for a little margin!), we return -274.0 */ - /* which indicates failure to read the temperature. */ - if(count > 80) { - return 0; - } - } - - /* The result is stored in the "scratch pad", a 9 byte memory block. */ - /* The first two bytes are the conversion result. Reading the scratch pad */ - /* can be terminated by sending a reset signal (but we read all 9 bytes) */ - (void)ds18b20_probe(); - write_byte(DS18B20_COMMAND_SKIP_ROM); - write_byte(DS18B20_COMMAND_READ_SCRATCH_PAD); - uint8_t i, sp_arr[9]; - for(i = 0; i < 9; i++) { - sp_arr[i] = read_byte(); - } - - /* Check CRC, if mismatch, return 0 (failure to read temperature) */ - uint8_t crc_cal = crc8_ds18b20(sp_arr, 8); - - if(crc_cal != sp_arr[8]) { - return 0; - } - - /* OK, now decode what the temperature reading is. This code assumes 12-bit resolution, */ - /* so this must be modified if the code is modified to use any other resolution! */ - int16_t temp_res; - uint8_t temp_lsb = sp_arr[0]; - uint8_t temp_msb = sp_arr[1]; - - temp_res = (int16_t)temp_msb << 8 | temp_lsb; - *temp = (float)temp_res * 0.0625; - - result = 1; - } - return result; -} -/* */ -/* crc8 algorithm for ds18b20 */ -/* http://www.miscel.dk/MiscEl/CRCcalculations.html */ -/* */ - -uint8_t -crc8_ds18b20(uint8_t *buf, uint8_t buf_len) -{ - uint8_t result = 0; - uint8_t i, b; - - for(i = 0; i < buf_len; i++) { - result = result ^ buf[i]; - for(b = 1; b < 9; b++) { - if(result & 0x1) { - result = (result >> 1) ^ 0x8C; - } else { - result = result >> 1; - } - } - } - return result; -} From fbf3daa564792eabeb1a61a638ec300e46a1e682 Mon Sep 17 00:00:00 2001 From: Robert Olsson Date: Fri, 15 Jul 2016 17:44:20 +0200 Subject: [PATCH 237/345] Fix README.md not reference GPL --- examples/avr-rss2/ipv6/sensd_client/README.md | 220 +----------------- 1 file changed, 4 insertions(+), 216 deletions(-) diff --git a/examples/avr-rss2/ipv6/sensd_client/README.md b/examples/avr-rss2/ipv6/sensd_client/README.md index 17beb02f3..b8cc23ae6 100644 --- a/examples/avr-rss2/ipv6/sensd_client/README.md +++ b/examples/avr-rss2/ipv6/sensd_client/README.md @@ -1,222 +1,10 @@ Contiki client for sensd ======================== -Sensd README describes the concept. sensd code is on github. +Contiki client connects to: +"sensd - A WSN Internet GW, hub, agent, proxy & cloud" -sensd - A WSN Internet GW, hub, agent, proxy & cloud -==================================================== - -Authors --------- -Robert Olsson -Jens Laas - -Contributors ------------- - -Abstract --------- -We've outlined, designed and implemented and very simple concept for WSN -data sharing, including data collection, storage and retrieval using -standard text tools. The concept restricts Internet access to WSN -motes and acts agent not to expose motes directly for robustness and -security reasons. Low level, physical or link WSN protocol can be used. -including 6lowpan, RIME etc and any type of Radio Duty Cycling (RDC). -sensd works on the application layer. A TCP connection initiates an -implicit "subscribe". The M2P model is currently supported. - -Key concepts ------------- - -* Agent. sensd works as an agent and does not allow direct Internet - access to motes. Recall motes are constrained in most aspects and - can not support many connections, has weak security etc. - -* Hub. Share the data from the root or sink node over TCP. In effect sensor - data can be sent over Internet to be shared over among TCP active listeners. - The TCP connection initiates an implicit "subscribe". - -* Proxy. The support proxy functions over ipv4 and well as ipv6. Sensd can - forward to a proxy on a public IP. The typical case is when GW is behind - a NAT. - -* WSN RP "rendez-vous point". A concepts where data from various WSN nets - are merged. This models a "cloud service" functionality for WSN networks. - sensd can be used both to forward data to RP. It can also work as the RP. - RP receiving WSN data and allowing multiple TCP listeners. - -* All programs are written C, script in Java and bash. Designed for small - footprint and with minimal dependencies. sensd runs on Raspberry Pi and - Openwrt. - -* This work introduces a simple tag format for sensor data. The overall - idea is that data tagging is an "agreement" between producers and consumer. - Tags are simple are description of the data. Example T=25.2. where T= - is the tag 25.2 the value. Most likely this a temperature. But we - can't be sure since we don't know since this is an agreement between - the producer and the consumer. Tags are also used for identification. - Example tags, E64= Where globally unique ID can used. Another more - relaxed example is TXT= a user description. See docs. - -* Geotagging and timestamping is supported via tags. - -* Ecosystem support. There are telphone apps to for data monitoring and - and plotting. Android app can act as WSN-agent and forward to proxy/RP. - -* The concept also includes a mapping to URI (Unified Resource Identifier) - to form a WSN caching server similar to CoAP using http-proxy. - -* Copyright. Open-Source via GPL. Projecet used github.com - - -Introduction ------------- - -This is collection of software to implement data monitoring and data collection -from WSN Wireless Sensor Networks. The goal is to have a very simple, -straight-forward and robust framework. - -The scenario: One or several motes is connected to USB or serial port to gather -received information from connected WSN motes. Data can be visualized in -several ways. - -* Sensor data report can be transmitted and propagated throughout the - Internet. sensd acts as server and sends incoming report to active - listeners. - -* Data is kept in ASCII with tagging and ID information. Data is conveniently - handled, copied and viewed with standard text utilities of your OS. - -* Last mote report is cached into the file system suitable for URI use. The - Format is SID/TAG. Typical tags are EUI64 and unique serial numbers. The - different TAGS are left for mote user to define. Although the TAGS used in - our example setup are included in this draft for example purposes. - - -Both formats can easily be stored or linked directly in web tree to form a -URI to format WSN logging/datafile or caching service. - -A daemon that reads WSN mote reports from USB/serial and stores data in a ASCII -data file. Default is located at _/var/log/sensors.dat_ - -Addtional components --------------------- - -* seltag [More info] (https://github.com/herjulf/sensd/blob/master/seltag/README.md) - -* js A set of Java-scripts can plot, print and visualize sensor data from - sensd directly in your web-browser. - -* documentation and sample files. [More info] (https://github.com/herjulf/sensd/blob/master/seltag/README.md) - -* Read Sensors Android app. [Source Code] (https://github.com/herjulf/Read-Sensors) - - -Datafile logging ----------------- - -Below is and example of the anatomy of a sensors.dat file we are currently using in our WSN -data collection networks. - - 2012-05-22 14:07:46 UT=1337688466 ID=283c0cdd030000d7 PS=0 T=30.56 T_MCU=34.6 V_MCU=3.08 UP=2C15C V_IN=4.66 - - 2012-05-22 14:11:41 UT=1337688701 ID=28a9d5dc030000af PS=0 T=36.00 V_MCU=2.92 UP=12C8A0 RH=42.0 V_IN=4.13 V_A1=3.43 [ADDR=0.175 SEQ=33 RSSI=21 LQI=255 DRP=1.00] - -Each line is a mote report. They start with date and time and are followed by a set of -tags. The tags is different for different motes. In other words they can -send different data. Essential is the ID which should be unique for each mote. - -The information with brackets is information generated by the receiving mote -and is not a part the motes data. Typically RSSI (Receiver Signal Strength -Indicator) and LQI (Link Quality Indicator) - - -Internet sensor data --------------------- - -Start sensd with the `-report` option. This enables reports to be transmitted -over IP to remote listeners. Default TCP port 1234. - -Server side example: - - sensd -report -p 1234 -D /dev/ttyUSB0 - -Client side. Example using netcat: - - nc server-ip 1234 - -URI format ----------- - -URI (Unified Resource Identifier) displays the node ID and the tags in a file tree. -It is easy to export this into a web tree to form a URI similar to a CoAP gateway. - -Example: In our case we have a unique sensor ID followed by the different data -fields represented by "tags". - - /tmp/WSN1-GW1/281a98d20200004a: - DRP ID LQI PS RH RSSI SEQ T V_IN V_MCU ADDR - - /tmp/WSN1-GW1/28be51ce02000031: - DRP ID LQI PS RH RSSI SEQ T UP V_IN V_MCU ADDR - -Read Temp from a sensor: - - cat /tmp/WSN1-GW1/281a98d20200004a/T - 19.44 - -And it's very easy to link this tree into a web-server. - -GPS support ------------ - -Positioning support has been added via GPS device connected to serial -or USB port. Tags added when enabled GWGPS_LON & GWGPS_LAT. -GPS code from. https://github.com/herjulf/gps_simple - -Getting the source and building -------------------------------- - -Code is stored in github. Typically procedure below is the very straight- -forward unix way: - - git clone http://github.com/herjulf/sensd - cd sensd - make - -Put your binaries after your preference: - -Pre-built binary versions --------------------------- - -For x86: -Sensd and friends are available in Bifrost/Linux packages. Those packages are -statically linked and can be used on most x86 Linuxes. 32-bit compiled. - -http://ftp.sunet.se/pub/Linux/distributions/bifrost/download/opt/opt-sensd-2.3-1.tar.gz - - -Use ---- - -The WSN data logging and caching concept is in actual use with Contiki, RIME -broadcast application. - -Tips ----- - -One can use netcat to listen to reports: - -Example: - - nc radio-sensors.com 1235 - -To save in file use nohup: - - nohup nc radio-sensors.com 1235 > /var/log/sensors.dat - -As sensd used TCP and ASCII encoding. tetlnet and web-browsers can be used -as well. - +For full sensd documentation and code see: +https://github.com/herjulf/sensd From 833dc89f7c76c07c17c26ad017d0c89837f6285a Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 16 Jul 2016 17:07:05 +0100 Subject: [PATCH 238/345] Fix code style --- cpu/cc2538/dev/cc2538-rf.c | 47 +++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/cpu/cc2538/dev/cc2538-rf.c b/cpu/cc2538/dev/cc2538-rf.c index 52708e0ca..dfbdfb699 100644 --- a/cpu/cc2538/dev/cc2538-rf.c +++ b/cpu/cc2538/dev/cc2538-rf.c @@ -185,8 +185,8 @@ get_channel() { uint8_t chan = REG(RFCORE_XREG_FREQCTRL) & RFCORE_XREG_FREQCTRL_FREQ; - return ((chan - CC2538_RF_CHANNEL_MIN) / CC2538_RF_CHANNEL_SPACING - + CC2538_RF_CHANNEL_MIN); + return (chan - CC2538_RF_CHANNEL_MIN) / CC2538_RF_CHANNEL_SPACING + + CC2538_RF_CHANNEL_MIN; } /*---------------------------------------------------------------------------*/ /** @@ -207,14 +207,15 @@ set_channel(uint8_t channel) } /* Changes to FREQCTRL take effect after the next recalibration */ - + /* If we are off, save state, otherwise switch off and save state */ if((REG(RFCORE_XREG_FSMSTAT0) & RFCORE_XREG_FSMSTAT0_FSM_FFCTRL_STATE) != 0) { was_on = 1; off(); } - REG(RFCORE_XREG_FREQCTRL) = (CC2538_RF_CHANNEL_MIN - + (channel - CC2538_RF_CHANNEL_MIN) * CC2538_RF_CHANNEL_SPACING); + REG(RFCORE_XREG_FREQCTRL) = (CC2538_RF_CHANNEL_MIN + + (channel - CC2538_RF_CHANNEL_MIN) * + CC2538_RF_CHANNEL_SPACING); /* switch radio back on only if radio was on before - otherwise will turn on radio foor sleepy nodes */ if(was_on) { on(); @@ -222,7 +223,7 @@ set_channel(uint8_t channel) rf_channel = channel; - return (int8_t) channel; + return (int8_t)channel; } /*---------------------------------------------------------------------------*/ static radio_value_t @@ -351,15 +352,15 @@ static void set_poll_mode(uint8_t enable) { poll_mode = enable; - + if(enable) { mac_timer_init(); - REG(RFCORE_XREG_RFIRQM0) &= ~RFCORE_XREG_RFIRQM0_FIFOP; // mask out FIFOP interrupt source - REG(RFCORE_SFR_RFIRQF0) &= ~RFCORE_SFR_RFIRQF0_FIFOP; // clear pending FIFOP interrupt - nvic_interrupt_disable(NVIC_INT_RF_RXTX); // disable RF interrupts + REG(RFCORE_XREG_RFIRQM0) &= ~RFCORE_XREG_RFIRQM0_FIFOP; /* mask out FIFOP interrupt source */ + REG(RFCORE_SFR_RFIRQF0) &= ~RFCORE_SFR_RFIRQF0_FIFOP; /* clear pending FIFOP interrupt */ + nvic_interrupt_disable(NVIC_INT_RF_RXTX); /* disable RF interrupts */ } else { - REG(RFCORE_XREG_RFIRQM0) |= RFCORE_XREG_RFIRQM0_FIFOP; // enable FIFOP interrupt source - nvic_interrupt_enable(NVIC_INT_RF_RXTX); // enable RF interrupts + REG(RFCORE_XREG_RFIRQM0) |= RFCORE_XREG_RFIRQM0_FIFOP; /* enable FIFOP interrupt source */ + nvic_interrupt_enable(NVIC_INT_RF_RXTX); /* enable RF interrupts */ } } /*---------------------------------------------------------------------------*/ @@ -527,7 +528,7 @@ init(void) */ udma_set_channel_src(CC2538_RF_CONF_RX_DMA_CHAN, RFCORE_SFR_RFDATA); } - + set_poll_mode(poll_mode); process_start(&cc2538_rf_process, NULL); @@ -782,10 +783,10 @@ read(void *buf, unsigned short bufsize) } } } - + CC2538_RF_CSP_ISFLUSHRX(); - return (len); + return len; } /*---------------------------------------------------------------------------*/ static int @@ -799,9 +800,9 @@ receiving_packet(void) * * FSMSTAT1 & (TX_ACTIVE | SFD) == SFD <=> receiving */ - return ((REG(RFCORE_XREG_FSMSTAT1) - & (RFCORE_XREG_FSMSTAT1_TX_ACTIVE | RFCORE_XREG_FSMSTAT1_SFD)) - == RFCORE_XREG_FSMSTAT1_SFD); + return (REG(RFCORE_XREG_FSMSTAT1) + & (RFCORE_XREG_FSMSTAT1_TX_ACTIVE | RFCORE_XREG_FSMSTAT1_SFD)) + == RFCORE_XREG_FSMSTAT1_SFD; } /*---------------------------------------------------------------------------*/ static int @@ -809,7 +810,7 @@ pending_packet(void) { PRINTF("RF: Pending\n"); - return (REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_FIFOP); + return REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_FIFOP; } /*---------------------------------------------------------------------------*/ static radio_result_t @@ -963,15 +964,15 @@ get_object(radio_param_t param, void *dest, size_t size) return RADIO_RESULT_OK; } - + if(param == RADIO_PARAM_LAST_PACKET_TIMESTAMP) { if(size != sizeof(rtimer_clock_t) || !dest) { return RADIO_RESULT_INVALID_VALUE; } - *(rtimer_clock_t*)dest = get_sfd_timestamp(); + *(rtimer_clock_t *)dest = get_sfd_timestamp(); return RADIO_RESULT_OK; } - + return RADIO_RESULT_NOT_SUPPORTED; } /*---------------------------------------------------------------------------*/ @@ -1075,7 +1076,7 @@ void cc2538_rf_rx_tx_isr(void) { ENERGEST_ON(ENERGEST_TYPE_IRQ); - + if(!poll_mode) { process_poll(&cc2538_rf_process); } From 6ef9509dfb87b249a019cd34892eec2844a38742 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 16 Jul 2016 17:07:52 +0100 Subject: [PATCH 239/345] Change get_sfd_timestamp() to static We also move the function to a different location so we won't have to provide the prototype separately --- cpu/cc2538/dev/cc2538-rf.c | 56 +++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/cpu/cc2538/dev/cc2538-rf.c b/cpu/cc2538/dev/cc2538-rf.c index dfbdfb699..17cbf7a1d 100644 --- a/cpu/cc2538/dev/cc2538-rf.c +++ b/cpu/cc2538/dev/cc2538-rf.c @@ -137,7 +137,6 @@ static int8_t rssi; static uint8_t crc_corr; void mac_timer_init(void); -uint32_t get_sfd_timestamp(void); /*---------------------------------------------------------------------------*/ static uint8_t rf_flags; static uint8_t rf_channel = CC2538_RF_CHANNEL; @@ -380,6 +379,34 @@ set_auto_ack(uint8_t enable) } } /*---------------------------------------------------------------------------*/ +static uint32_t +get_sfd_timestamp(void) +{ + uint64_t sfd, timer_val, buffer; + + REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMSEL) | 0x00000000; + REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_LATCH_MODE; + timer_val = REG(RFCORE_SFR_MTM0) & RFCORE_SFR_MTM0_MTM0; + timer_val |= ((REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1) << 8); + REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMOVFSEL) | 0x00000000; + timer_val |= ((REG(RFCORE_SFR_MTMOVF0) & RFCORE_SFR_MTMOVF0_MTMOVF0) << 16); + timer_val |= ((REG(RFCORE_SFR_MTMOVF1) & RFCORE_SFR_MTMOVF1_MTMOVF1) << 24); + buffer = REG(RFCORE_SFR_MTMOVF2) & RFCORE_SFR_MTMOVF2_MTMOVF2; + timer_val |= (buffer << 32); + + REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMSEL) | 0x00000001; + REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_LATCH_MODE; + sfd = REG(RFCORE_SFR_MTM0) & RFCORE_SFR_MTM0_MTM0; + sfd |= ((REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1) << 8); + REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMOVFSEL) | 0x00000010; + sfd |= ((REG(RFCORE_SFR_MTMOVF0) & RFCORE_SFR_MTMOVF0_MTMOVF0) << 16); + sfd |= ((REG(RFCORE_SFR_MTMOVF1) & RFCORE_SFR_MTMOVF1_MTMOVF1) << 24); + buffer = REG(RFCORE_SFR_MTMOVF2) & RFCORE_SFR_MTMOVF2_MTMOVF2; + sfd |= (buffer << 32); + + return RTIMER_NOW() - RADIO_TO_RTIMER(timer_val - sfd); +} +/*---------------------------------------------------------------------------*/ /* Netstack API radio driver functions */ /*---------------------------------------------------------------------------*/ static int @@ -1128,33 +1155,6 @@ cc2538_rf_set_promiscous_mode(char p) set_frame_filtering(p); } /*---------------------------------------------------------------------------*/ -uint32_t get_sfd_timestamp(void) -{ - uint64_t sfd, timer_val, buffer; - - REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMSEL) | 0x00000000; - REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_LATCH_MODE; - timer_val = REG(RFCORE_SFR_MTM0) & RFCORE_SFR_MTM0_MTM0; - timer_val |= ((REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1) << 8); - REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMOVFSEL) | 0x00000000; - timer_val |= ((REG(RFCORE_SFR_MTMOVF0) & RFCORE_SFR_MTMOVF0_MTMOVF0) << 16); - timer_val |= ((REG(RFCORE_SFR_MTMOVF1) & RFCORE_SFR_MTMOVF1_MTMOVF1) << 24); - buffer = REG(RFCORE_SFR_MTMOVF2) & RFCORE_SFR_MTMOVF2_MTMOVF2; - timer_val |= (buffer << 32); - - REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMSEL) | 0x00000001; - REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_LATCH_MODE; - sfd = REG(RFCORE_SFR_MTM0) & RFCORE_SFR_MTM0_MTM0; - sfd |= ((REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1) << 8); - REG(RFCORE_SFR_MTMSEL) = (REG(RFCORE_SFR_MTMSEL) & ~RFCORE_SFR_MTMSEL_MTMOVFSEL) | 0x00000010; - sfd |= ((REG(RFCORE_SFR_MTMOVF0) & RFCORE_SFR_MTMOVF0_MTMOVF0) << 16); - sfd |= ((REG(RFCORE_SFR_MTMOVF1) & RFCORE_SFR_MTMOVF1_MTMOVF1) << 24); - buffer = REG(RFCORE_SFR_MTMOVF2) & RFCORE_SFR_MTMOVF2_MTMOVF2; - sfd |= (buffer << 32); - - return (RTIMER_NOW() - RADIO_TO_RTIMER(timer_val - sfd)); -} -/*---------------------------------------------------------------------------*/ void mac_timer_init(void) { CLOCK_STABLE(); From c359e98bf18bf81b7f58f48cb9f16283b166742d Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 16 Jul 2016 17:10:21 +0100 Subject: [PATCH 240/345] Change mac_timer_init() to static We also move the function to a different location so we won't have to provide the prototype separately --- cpu/cc2538/dev/cc2538-rf.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/cpu/cc2538/dev/cc2538-rf.c b/cpu/cc2538/dev/cc2538-rf.c index 17cbf7a1d..b5b04da8c 100644 --- a/cpu/cc2538/dev/cc2538-rf.c +++ b/cpu/cc2538/dev/cc2538-rf.c @@ -135,8 +135,6 @@ static uint8_t volatile poll_mode = 0; static uint8_t send_on_cca = 1; static int8_t rssi; static uint8_t crc_corr; - -void mac_timer_init(void); /*---------------------------------------------------------------------------*/ static uint8_t rf_flags; static uint8_t rf_channel = CC2538_RF_CHANNEL; @@ -348,6 +346,20 @@ set_frame_filtering(uint8_t enable) } /*---------------------------------------------------------------------------*/ static void +mac_timer_init(void) +{ + CLOCK_STABLE(); + REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_SYNC; + REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_RUN; + while(!(REG(RFCORE_SFR_MTCTRL) & RFCORE_SFR_MTCTRL_STATE)); + REG(RFCORE_SFR_MTCTRL) &= ~RFCORE_SFR_MTCTRL_RUN; + while(REG(RFCORE_SFR_MTCTRL) & RFCORE_SFR_MTCTRL_STATE); + REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_SYNC; + REG(RFCORE_SFR_MTCTRL) |= (RFCORE_SFR_MTCTRL_RUN); + while(!(REG(RFCORE_SFR_MTCTRL) & RFCORE_SFR_MTCTRL_STATE)); +} +/*---------------------------------------------------------------------------*/ +static void set_poll_mode(uint8_t enable) { poll_mode = enable; @@ -1155,17 +1167,4 @@ cc2538_rf_set_promiscous_mode(char p) set_frame_filtering(p); } /*---------------------------------------------------------------------------*/ -void mac_timer_init(void) -{ - CLOCK_STABLE(); - REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_SYNC; - REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_RUN; - while(!(REG(RFCORE_SFR_MTCTRL) & RFCORE_SFR_MTCTRL_STATE)); - REG(RFCORE_SFR_MTCTRL) &= ~RFCORE_SFR_MTCTRL_RUN; - while(REG(RFCORE_SFR_MTCTRL) & RFCORE_SFR_MTCTRL_STATE); - REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_SYNC; - REG(RFCORE_SFR_MTCTRL) |= (RFCORE_SFR_MTCTRL_RUN); - while(!(REG(RFCORE_SFR_MTCTRL) & RFCORE_SFR_MTCTRL_STATE)); -} -/*---------------------------------------------------------------------------*/ /** @} */ From 081ec100a45dcd36fc1a5dc4f505421d0b44fc22 Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Sat, 2 Jul 2016 15:30:49 +0300 Subject: [PATCH 241/345] TSCH: add RADIO_DELAY_BEFORE_DETECT to rx guard time when waiting for a packet to be received --- core/net/mac/tsch/tsch-slot-operation.c | 4 ++-- platform/srf06-cc26xx/contiki-conf.h | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/net/mac/tsch/tsch-slot-operation.c b/core/net/mac/tsch/tsch-slot-operation.c index be83da4ab..b2c89a44f 100644 --- a/core/net/mac/tsch/tsch-slot-operation.c +++ b/core/net/mac/tsch/tsch-slot-operation.c @@ -580,7 +580,7 @@ PT_THREAD(tsch_tx_slot(struct pt *pt, struct rtimer *t)) tsch_radio_on(TSCH_RADIO_CMD_ON_WITHIN_TIMESLOT); /* Wait for ACK to come */ BUSYWAIT_UNTIL_ABS(NETSTACK_RADIO.receiving_packet(), - tx_start_time, tx_duration + tsch_timing[tsch_ts_rx_ack_delay] + tsch_timing[tsch_ts_ack_wait]); + tx_start_time, tx_duration + tsch_timing[tsch_ts_rx_ack_delay] + tsch_timing[tsch_ts_ack_wait] + RADIO_DELAY_BEFORE_DETECT); TSCH_DEBUG_TX_EVENT(); ack_start_time = RTIMER_NOW() - RADIO_DELAY_BEFORE_DETECT; @@ -753,7 +753,7 @@ PT_THREAD(tsch_rx_slot(struct pt *pt, struct rtimer *t)) if(!packet_seen) { /* Check if receiving within guard time */ BUSYWAIT_UNTIL_ABS((packet_seen = NETSTACK_RADIO.receiving_packet()), - current_slot_start, tsch_timing[tsch_ts_rx_offset] + tsch_timing[tsch_ts_rx_wait]); + current_slot_start, tsch_timing[tsch_ts_rx_offset] + tsch_timing[tsch_ts_rx_wait] + RADIO_DELAY_BEFORE_DETECT); } if(!packet_seen) { /* no packets on air */ diff --git a/platform/srf06-cc26xx/contiki-conf.h b/platform/srf06-cc26xx/contiki-conf.h index c1546f6a8..cb9ca25b2 100644 --- a/platform/srf06-cc26xx/contiki-conf.h +++ b/platform/srf06-cc26xx/contiki-conf.h @@ -346,9 +346,8 @@ typedef uint32_t rtimer_clock_t; /* Delay between GO signal and start listening. * This value is so small because the radio is constantly on within each timeslot. */ #define RADIO_DELAY_BEFORE_RX ((unsigned)US_TO_RTIMERTICKS(15)) -/* Delay between the SFD finishes arriving and it is detected in software. - * Not important on this platform as it uses hardware timestamps for SFD */ -#define RADIO_DELAY_BEFORE_DETECT ((unsigned)US_TO_RTIMERTICKS(0)) +/* Delay between the SFD finishes arriving and it is detected in software. */ +#define RADIO_DELAY_BEFORE_DETECT ((unsigned)US_TO_RTIMERTICKS(352)) /* Timer conversion; radio is running at 4 MHz */ #define RADIO_TIMER_SECOND 4000000u From 2fe4b4d5bb12d1ee71f28eb8c336e5038100ae21 Mon Sep 17 00:00:00 2001 From: Atis Elsts Date: Sat, 2 Jul 2016 15:11:47 +0300 Subject: [PATCH 242/345] CC26xx: enable MCU sleeping while transmitting if and only if not in poll mode --- cpu/cc26xx-cc13xx/rf-core/ieee-mode.c | 31 +++++++++------------------ 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c index 8f13eb3ee..f76fe2beb 100644 --- a/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c +++ b/cpu/cc26xx-cc13xx/rf-core/ieee-mode.c @@ -763,9 +763,9 @@ check_rat_overflow(bool first_time) { static uint32_t last_value; uint32_t current_value; - uint8_t interrupts_enabled; + uint8_t interrupts_disabled; - interrupts_enabled = ti_lib_int_master_disable(); + interrupts_disabled = ti_lib_int_master_disable(); if(first_time) { last_value = HWREG(RFC_RAT_BASE + RATCNT); } else { @@ -777,7 +777,7 @@ check_rat_overflow(bool first_time) } last_value = current_value; } - if(interrupts_enabled) { + if(!interrupts_disabled) { ti_lib_int_master_enable(); } } @@ -867,7 +867,6 @@ transmit(unsigned short transmit_len) uint8_t tx_active = 0; rtimer_clock_t t0; volatile rfc_CMD_IEEE_TX_t cmd; - uint8_t interrupts_enabled; if(!rf_is_on()) { was_off = 1; @@ -908,16 +907,8 @@ transmit(unsigned short transmit_len) cmd.startTime = 0; cmd.startTrigger.triggerType = TRIG_NOW; - /* XXX: there seems to be no function that gets interrupt state w/o changing it */ - interrupts_enabled = ti_lib_int_master_disable(); - if(interrupts_enabled) { - ti_lib_int_master_enable(); - } - /* Enable the LAST_FG_COMMAND_DONE interrupt, which will wake us up */ - if(interrupts_enabled) { - rf_core_cmd_done_en(true, poll_mode); - } + rf_core_cmd_done_en(true, poll_mode); ret = rf_core_send_cmd((uint32_t)&cmd, &cmd_status); @@ -934,7 +925,7 @@ transmit(unsigned short transmit_len) * 1) make the `lpm_sleep()` call here unconditional; * 2) change the radio ISR priority to allow radio ISR to interrupt rtimer ISR. */ - if(interrupts_enabled) { + if(!poll_mode) { lpm_sleep(); } } @@ -966,13 +957,11 @@ transmit(unsigned short transmit_len) ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); ENERGEST_ON(ENERGEST_TYPE_LISTEN); - if(interrupts_enabled) { - /* - * Disable LAST_FG_COMMAND_DONE interrupt. We don't really care about it - * except when we are transmitting - */ - rf_core_cmd_done_dis(poll_mode); - } + /* + * Disable LAST_FG_COMMAND_DONE interrupt. We don't really care about it + * except when we are transmitting + */ + rf_core_cmd_done_dis(poll_mode); if(was_off) { off(); From 7fdb9849de9469836680f802bcd7787b7bbb7f60 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 16 Jul 2016 22:33:59 +0100 Subject: [PATCH 243/345] Remove unnecessary parentheses --- cpu/cc2538/dev/cc2538-rf.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpu/cc2538/dev/cc2538-rf.c b/cpu/cc2538/dev/cc2538-rf.c index b5b04da8c..6916524d2 100644 --- a/cpu/cc2538/dev/cc2538-rf.c +++ b/cpu/cc2538/dev/cc2538-rf.c @@ -210,9 +210,9 @@ set_channel(uint8_t channel) was_on = 1; off(); } - REG(RFCORE_XREG_FREQCTRL) = (CC2538_RF_CHANNEL_MIN + - (channel - CC2538_RF_CHANNEL_MIN) * - CC2538_RF_CHANNEL_SPACING); + REG(RFCORE_XREG_FREQCTRL) = CC2538_RF_CHANNEL_MIN + + (channel - CC2538_RF_CHANNEL_MIN) * CC2538_RF_CHANNEL_SPACING; + /* switch radio back on only if radio was on before - otherwise will turn on radio foor sleepy nodes */ if(was_on) { on(); From c87e579b06b75148feb0d77079463cabe6dcceeb Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 16 Jul 2016 23:58:59 +0100 Subject: [PATCH 244/345] Adjust ContikiMAC timings for CC13xx PROP mode #1684 slightly varied RF startup time and, as a result, threw ContikiMAC timing configuration off. This manifests itself with very poor CC13xx PROP mode radio performance, as documented in #1747. This pull fixes this bug by slightly increasing ContikiMAC's inter-packet interval. This gives the receiver a little more time to respond with an ACK to unicast frames. Fixes #1747 --- platform/srf06-cc26xx/contiki-conf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/srf06-cc26xx/contiki-conf.h b/platform/srf06-cc26xx/contiki-conf.h index d756977c8..23849a3bf 100644 --- a/platform/srf06-cc26xx/contiki-conf.h +++ b/platform/srf06-cc26xx/contiki-conf.h @@ -106,7 +106,7 @@ #define CONTIKIMAC_CONF_LISTEN_TIME_AFTER_PACKET_DETECTED (RTIMER_ARCH_SECOND / 20) #define CONTIKIMAC_CONF_SEND_SW_ACK 1 #define CONTIKIMAC_CONF_AFTER_ACK_DETECTECT_WAIT_TIME (RTIMER_SECOND / 1000) -#define CONTIKIMAC_CONF_INTER_PACKET_INTERVAL (RTIMER_SECOND / 250) +#define CONTIKIMAC_CONF_INTER_PACKET_INTERVAL (RTIMER_SECOND / 240) #else #define NETSTACK_CONF_RADIO ieee_mode_driver From 568973f6ec1c0db7c1777fe942d5e1c307c06451 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 16 Jul 2016 17:48:25 +0100 Subject: [PATCH 245/345] Don't flush the CC2538 RF RX FIFO unconditionally After reading a frame, `read()` checks the status of the RX FIFO: * If an overflow is detected, the FIFO gets flushed * If there are more frames in the FIFO, the `cc2538_rf_process` will get polled again in order to read out the next frame. #1550 changed `read()`, which now performs the above check for non-poll mode, but it then flushes the FIFO unconditionally. Therefore, if there are two or more frames in the FIFO, they will get flushed before the `cc2538_rf_process` has had a chance to read them out. This results in missed frames. Reproducing this is trivial: Build a CC2538 sniffer and see how it will never show you .15.4 ACK frames. ACK reception completes while `read()` is still streaming the previous captured frame to the host. Upon completion, the FIFO will get flushed and the ACK will get lost. This pull proposes removing the unconditional flush and reverting to the original logic for non-TSCH operation. Pinging @thomas-ha here for input regarding poll mode. This pull sits on top of #1778 --- cpu/cc2538/dev/cc2538-rf.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/cpu/cc2538/dev/cc2538-rf.c b/cpu/cc2538/dev/cc2538-rf.c index 6916524d2..1226e764d 100644 --- a/cpu/cc2538/dev/cc2538-rf.c +++ b/cpu/cc2538/dev/cc2538-rf.c @@ -823,8 +823,6 @@ read(void *buf, unsigned short bufsize) } } - CC2538_RF_CSP_ISFLUSHRX(); - return len; } /*---------------------------------------------------------------------------*/ From 788cb1e11962cba0c6f0f74284ab3711e3739bf5 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:38:18 +0100 Subject: [PATCH 246/345] Move ROM function macros to separate file --- cpu/cc26xx-cc13xx/ti-lib-rom.h | 200 +++++++++++++++++++++++++++++++++ cpu/cc26xx-cc13xx/ti-lib.h | 189 +------------------------------ 2 files changed, 203 insertions(+), 186 deletions(-) create mode 100644 cpu/cc26xx-cc13xx/ti-lib-rom.h diff --git a/cpu/cc26xx-cc13xx/ti-lib-rom.h b/cpu/cc26xx-cc13xx/ti-lib-rom.h new file mode 100644 index 000000000..9db42df9f --- /dev/null +++ b/cpu/cc26xx-cc13xx/ti-lib-rom.h @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup cc26xx-ti-lib + * @{ + * + * \file + * Header file with CC13xxware/CC26xxware ROM API. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TI_LIB_ROM_H_ +#define TI_LIB_ROM_H_ +/*---------------------------------------------------------------------------*/ +/* rom.h */ +#include "driverlib/rom.h" + +/* AON API */ +#define ti_lib_rom_aon_event_mcu_wake_up_set ROM_AONEventMcuWakeUpSet +#define ti_lib_rom_aon_event_mcu_wake_up_get ROM_AONEventMcuWakeUpGet +#define ti_lib_rom_aon_event_aux_wake_up_set ROM_AONEventAuxWakeUpSet +#define ti_lib_rom_aon_event_aux_wake_up_get ROM_AONEventAuxWakeUpGet +#define ti_lib_rom_aon_event_mcu_set ROM_AONEventMcuSet +#define ti_lib_rom_aon_event_mcu_get ROM_AONEventMcuGet + +/* AON_WUC API */ +#define ti_lib_rom_aon_wuc_aux_reset ROM_AONWUCAuxReset +#define ti_lib_rom_aon_wuc_recharge_ctrl_config_set ROM_AONWUCRechargeCtrlConfigSet +#define ti_lib_rom_aon_wuc_osc_config ROM_AONWUCOscConfig + +/* AUX_TDC API */ +#define ti_lib_rom_aux_tdc_config_set ROM_AUXTDCConfigSet +#define ti_lib_rom_aux_tdc_measurement_done ROM_AUXTDCMeasurementDone + +/* AUX_TIMER API */ +#define ti_lib_rom_aux_timer_configure ROM_AUXTimerConfigure +#define ti_lib_rom_aux_timer_start ROM_AUXTimerStart +#define ti_lib_rom_aux_timer_stop ROM_AUXTimerStop +#define ti_lib_rom_aux_timer_prescale_set ROM_AUXTimerPrescaleSet +#define ti_lib_rom_aux_timer_prescale_get ROM_AUXTimerPrescaleGet + +/* AUX_WUC API */ +#define ti_lib_rom_aux_wuc_clock_enable ROM_AUXWUCClockEnable +#define ti_lib_rom_aux_wuc_clock_disable ROM_AUXWUCClockDisable +#define ti_lib_rom_aux_wuc_clock_status ROM_AUXWUCClockStatus +#define ti_lib_rom_aux_wuc_power_ctrl ROM_AUXWUCPowerCtrl + +/* FLASH API */ +#define ti_lib_rom_flash_power_mode_get ROM_FlashPowerModeGet +#define ti_lib_rom_flash_protection_set ROM_FlashProtectionSet +#define ti_lib_rom_flash_protection_get ROM_FlashProtectionGet +#define ti_lib_rom_flash_protection_save ROM_FlashProtectionSave +#define ti_lib_rom_flash_efuse_read_row ROM_FlashEfuseReadRow +#define ti_lib_rom_flash_disable_sectors_for_write ROM_FlashDisableSectorsForWrite + +/* I2C API */ +#define ti_lib_rom_i2c_master_init_exp_clk ROM_I2CMasterInitExpClk +#define ti_lib_rom_i2c_master_err ROM_I2CMasterErr + +/* INTERRUPT API */ +#define ti_lib_rom_int_priority_grouping_set ROM_IntPriorityGroupingSet +#define ti_lib_rom_int_priority_grouping_get ROM_IntPriorityGroupingGet +#define ti_lib_rom_int_priority_set ROM_IntPrioritySet +#define ti_lib_rom_int_priority_get ROM_IntPriorityGet +#define ti_lib_rom_int_enable ROM_IntEnable +#define ti_lib_rom_int_disable ROM_IntDisable +#define ti_lib_rom_int_pend_set ROM_IntPendSet +#define ti_lib_rom_int_pend_get ROM_IntPendGet +#define ti_lib_rom_int_pend_clear ROM_IntPendClear + +/* IOC API */ +#define ti_lib_rom_ioc_port_configure_set ROM_IOCPortConfigureSet +#define ti_lib_rom_ioc_port_configure_get ROM_IOCPortConfigureGet +#define ti_lib_rom_ioc_io_shutdown_set ROM_IOCIOShutdownSet +#define ti_lib_rom_ioc_io_mode_set ROM_IOCIOModeSet +#define ti_lib_rom_ioc_io_int_set ROM_IOCIOIntSet +#define ti_lib_rom_ioc_io_port_pull_set ROM_IOCIOPortPullSet +#define ti_lib_rom_ioc_io_hyst_set ROM_IOCIOHystSet +#define ti_lib_rom_ioc_io_input_set ROM_IOCIOInputSet +#define ti_lib_rom_ioc_io_slew_ctrl_set ROM_IOCIOSlewCtrlSet +#define ti_lib_rom_ioc_io_drv_strength_set ROM_IOCIODrvStrengthSet +#define ti_lib_rom_ioc_io_port_id_set ROM_IOCIOPortIdSet +#define ti_lib_rom_ioc_int_enable ROM_IOCIntEnable +#define ti_lib_rom_ioc_int_disable ROM_IOCIntDisable +#define ti_lib_rom_ioc_pin_type_gpio_input ROM_IOCPinTypeGpioInput +#define ti_lib_rom_ioc_pin_type_gpio_output ROM_IOCPinTypeGpioOutput +#define ti_lib_rom_ioc_pin_type_uart ROM_IOCPinTypeUart +#define ti_lib_rom_ioc_pin_type_ssi_master ROM_IOCPinTypeSsiMaster +#define ti_lib_rom_ioc_pin_type_ssi_slave ROM_IOCPinTypeSsiSlave +#define ti_lib_rom_ioc_pin_type_i2c ROM_IOCPinTypeI2c +#define ti_lib_rom_ioc_pin_type_aux ROM_IOCPinTypeAux + +/* PRCM API */ +#define ti_lib_rom_prcm_inf_clock_configure_set ROM_PRCMInfClockConfigureSet +#define ti_lib_rom_prcm_inf_clock_configure_get ROM_PRCMInfClockConfigureGet +#define ti_lib_rom_prcm_audio_clock_config_set ROM_PRCMAudioClockConfigSet +#define ti_lib_rom_prcm_power_domain_on ROM_PRCMPowerDomainOn +#define ti_lib_rom_prcm_power_domain_off ROM_PRCMPowerDomainOff +#define ti_lib_rom_prcm_peripheral_run_enable ROM_PRCMPeripheralRunEnable +#define ti_lib_rom_prcm_peripheral_run_disable ROM_PRCMPeripheralRunDisable +#define ti_lib_rom_prcm_peripheral_sleep_enable ROM_PRCMPeripheralSleepEnable +#define ti_lib_rom_prcm_peripheral_sleep_disable ROM_PRCMPeripheralSleepDisable +#define ti_lib_rom_prcm_peripheral_deep_sleep_enable ROM_PRCMPeripheralDeepSleepEnable +#define ti_lib_rom_prcm_peripheral_deep_sleep_disable ROM_PRCMPeripheralDeepSleepDisable +#define ti_lib_rom_prcm_power_domain_status ROM_PRCMPowerDomainStatus +#define ti_lib_rom_prcm_deep_sleep ROM_PRCMDeepSleep + +/* SMPH API */ +#define ti_lib_rom_smph_acquire ROM_SMPHAcquire + +/* SSI API */ +#define ti_lib_rom_ssi_config_set_exp_clk ROM_SSIConfigSetExpClk +#define ti_lib_rom_ssi_data_put ROM_SSIDataPut +#define ti_lib_rom_ssi_data_put_non_blocking ROM_SSIDataPutNonBlocking +#define ti_lib_rom_ssi_data_get ROM_SSIDataGet +#define ti_lib_rom_ssi_data_get_non_blocking ROM_SSIDataGetNonBlocking + +/* TIMER API */ +#define ti_lib_rom_timer_configure ROM_TimerConfigure +#define ti_lib_rom_timer_level_control ROM_TimerLevelControl +#define ti_lib_rom_timer_stall_control ROM_TimerStallControl +#define ti_lib_rom_timer_wait_on_trigger_control ROM_TimerWaitOnTriggerControl + +/* TRNG API */ +#define ti_lib_rom_trng_number_get ROM_TRNGNumberGet + +/* UART API */ +#define ti_lib_rom_uart_fifo_level_get ROM_UARTFIFOLevelGet +#define ti_lib_rom_uart_config_set_exp_clk ROM_UARTConfigSetExpClk +#define ti_lib_rom_uart_config_get_exp_clk ROM_UARTConfigGetExpClk +#define ti_lib_rom_uart_disable ROM_UARTDisable +#define ti_lib_rom_uart_char_get_non_blocking ROM_UARTCharGetNonBlocking +#define ti_lib_rom_uart_char_get ROM_UARTCharGet +#define ti_lib_rom_uart_char_put_non_blocking ROM_UARTCharPutNonBlocking +#define ti_lib_rom_uart_char_put ROM_UARTCharPut + +/* UDMA API */ +#define ti_lib_rom_udma_channel_attribute_enable ROM_uDMAChannelAttributeEnable +#define ti_lib_rom_udma_channel_attribute_disable ROM_uDMAChannelAttributeDisable +#define ti_lib_rom_udma_channel_attribute_get ROM_uDMAChannelAttributeGet +#define ti_lib_rom_udma_channel_control_set ROM_uDMAChannelControlSet +#define ti_lib_rom_udma_channel_transfer_set ROM_uDMAChannelTransferSet +#define ti_lib_rom_udma_channel_scatter_gather_set ROM_uDMAChannelScatterGatherSet +#define ti_lib_rom_udma_channel_size_get ROM_uDMAChannelSizeGet +#define ti_lib_rom_udma_channel_mode_get ROM_uDMAChannelModeGet + +/* VIMS API */ +#define ti_lib_rom_vims_configure ROM_VIMSConfigure +#define ti_lib_rom_vims_mode_set ROM_VIMSModeSet + +/* HAPI */ +#define ti_lib_hapi_crc32(a, b, c) HapiCrc32(a, b, c) +#define ti_lib_hapi_get_flash_size() HapiGetFlashSize() +#define ti_lib_hapi_get_chip_id() HapiGetChipId() +#define ti_lib_hapi_sector_erase(a) HapiSectorErase(a) +#define ti_lib_hapi_program_flash(a, b, c) HapiProgramFlash(a, b, c) +#define ti_lib_hapi_reset_device() HapiResetDevice() +#define ti_lib_hapi_fletcher32(a, b, c) HapiFletcher32(a, b, c) +#define ti_lib_hapi_min_value(a, b) HapiMinValue(a,b) +#define ti_lib_hapi_max_value(a, b) HapiMaxValue(a,b) +#define ti_lib_hapi_mean_value(a, b) HapiMeanValue(a,b) +#define ti_lib_hapi_stand_deviation_value(a, b) HapiStandDeviationValue(a,b) +#define ti_lib_hapi_hf_source_safe_switch() HapiHFSourceSafeSwitch() +#define ti_lib_hapi_select_comp_a_input(a) HapiSelectCompAInput(a) +#define ti_lib_hapi_select_comp_a_ref(a) HapiSelectCompARef(a) +#define ti_lib_hapi_select_adc_comp_b_input(a) HapiSelectADCCompBInput(a) +#define ti_lib_hapi_select_comp_b_ref(a) HapiSelectCompBRef(a) +/*---------------------------------------------------------------------------*/ +#endif /* TI_LIB_ROM_H_ */ +/*---------------------------------------------------------------------------*/ +/** + * @} + */ diff --git a/cpu/cc26xx-cc13xx/ti-lib.h b/cpu/cc26xx-cc13xx/ti-lib.h index 7396fb40f..cc51100e3 100644 --- a/cpu/cc26xx-cc13xx/ti-lib.h +++ b/cpu/cc26xx-cc13xx/ti-lib.h @@ -52,6 +52,9 @@ #ifndef TI_LIB_H_ #define TI_LIB_H_ /*---------------------------------------------------------------------------*/ +/* Include ROM API */ +#include "ti-lib-rom.h" +/*---------------------------------------------------------------------------*/ /* aon_batmon.h */ #include "driverlib/aon_batmon.h" @@ -370,192 +373,6 @@ #define ti_lib_pwr_ctrl_io_freeze_enable(...) PowerCtrlIOFreezeEnable(__VA_ARGS__) #define ti_lib_pwr_ctrl_io_freeze_disable(...) PowerCtrlIOFreezeDisable(__VA_ARGS__) /*---------------------------------------------------------------------------*/ -/* rom.h */ -#include "driverlib/rom.h" - -/* AON API */ -#define ti_lib_rom_aon_event_mcu_wake_up_set ROM_AONEventMcuWakeUpSet -#define ti_lib_rom_aon_event_mcu_wake_up_get ROM_AONEventMcuWakeUpGet -#define ti_lib_rom_aon_event_aux_wake_up_set ROM_AONEventAuxWakeUpSet -#define ti_lib_rom_aon_event_aux_wake_up_get ROM_AONEventAuxWakeUpGet -#define ti_lib_rom_aon_event_mcu_set ROM_AONEventMcuSet -#define ti_lib_rom_aon_event_mcu_get ROM_AONEventMcuGet - -/* AON_IOC API */ -#define ti_lib_rom_aon_ioc_drive_strength_set ROM_AONIOCDriveStrengthSet -#define ti_lib_rom_aon_ioc_drive_strength_get ROM_AONIOCDriveStrengthGet - -/* AON_RTC API */ -#define ti_lib_rom_aon_rtc_status ROM_AONRTCStatus -#define ti_lib_rom_aon_rtc_event_clear ROM_AONRTCEventClear -#define ti_lib_rom_aon_rtc_event_get ROM_AONRTCEventGet -#define ti_lib_rom_aon_rtc_mode_ch1_set ROM_AONRTCModeCh1Set -#define ti_lib_rom_aon_rtc_mode_ch1_get ROM_AONRTCModeCh1Get -#define ti_lib_rom_aon_rtc_mode_ch2_set ROM_AONRTCModeCh2Set -#define ti_lib_rom_aon_rtc_mode_ch2_get ROM_AONRTCModeCh2Get -#define ti_lib_rom_aon_rtc_channel_enable ROM_AONRTCChannelEnable -#define ti_lib_rom_aon_rtc_channel_disable ROM_AONRTCChannelDisable -#define ti_lib_rom_aon_rtc_compare_value_set ROM_AONRTCCompareValueSet -#define ti_lib_rom_aon_rtc_compare_value_get ROM_AONRTCCompareValueGet -#define ti_lib_rom_aon_rtc_current_compare_value_get ROM_AONRTCCurrentCompareValueGet - -/* AON_WUC API */ -#define ti_lib_rom_aon_wuc_aux_s_ram_config ROM_AONWUCAuxSRamConfig -#define ti_lib_rom_aon_wuc_aux_wakeup_event ROM_AONWUCAuxWakeupEvent -#define ti_lib_rom_aon_wuc_aux_reset ROM_AONWUCAuxReset -#define ti_lib_rom_aon_wuc_recharge_ctrl_config_set ROM_AONWUCRechargeCtrlConfigSet -#define ti_lib_rom_aon_wuc_osc_config ROM_AONWUCOscConfig - -/* AUX_TDC API */ -#define ti_lib_rom_aux_tdc_config_set ROM_AUXTDCConfigSet -#define ti_lib_rom_aux_tdc_measurement_done ROM_AUXTDCMeasurementDone - -/* AUX_TIMER API */ -#define ti_lib_rom_aux_timer_configure ROM_AUXTimerConfigure -#define ti_lib_rom_aux_timer_start ROM_AUXTimerStart -#define ti_lib_rom_aux_timer_stop ROM_AUXTimerStop -#define ti_lib_rom_aux_timer_prescale_set ROM_AUXTimerPrescaleSet -#define ti_lib_rom_aux_timer_prescale_get ROM_AUXTimerPrescaleGet - -/* AUX_WUC API */ -#define ti_lib_rom_aux_wuc_clock_enable ROM_AUXWUCClockEnable -#define ti_lib_rom_aux_wuc_clock_disable ROM_AUXWUCClockDisable -#define ti_lib_rom_aux_wuc_clock_status ROM_AUXWUCClockStatus -#define ti_lib_rom_aux_wuc_power_ctrl ROM_AUXWUCPowerCtrl - -/* FLASH API */ -#define ti_lib_rom_flash_power_mode_get ROM_FlashPowerModeGet -#define ti_lib_rom_flash_protection_set ROM_FlashProtectionSet -#define ti_lib_rom_flash_protection_get ROM_FlashProtectionGet -#define ti_lib_rom_flash_protection_save ROM_FlashProtectionSave -#define ti_lib_rom_flash_efuse_read_row ROM_FlashEfuseReadRow -#define ti_lib_rom_flash_disable_sectors_for_write ROM_FlashDisableSectorsForWrite - -/* I2C API */ -#define ti_lib_rom_i2c_master_init_exp_clk ROM_I2CMasterInitExpClk -#define ti_lib_rom_i2c_master_err ROM_I2CMasterErr - -/* INTERRUPT API */ -#define ti_lib_rom_int_priority_grouping_set ROM_IntPriorityGroupingSet -#define ti_lib_rom_int_priority_grouping_get ROM_IntPriorityGroupingGet -#define ti_lib_rom_int_priority_set ROM_IntPrioritySet -#define ti_lib_rom_int_priority_get ROM_IntPriorityGet -#define ti_lib_rom_int_enable ROM_IntEnable -#define ti_lib_rom_int_disable ROM_IntDisable -#define ti_lib_rom_int_pend_set ROM_IntPendSet -#define ti_lib_rom_int_pend_get ROM_IntPendGet -#define ti_lib_rom_int_pend_clear ROM_IntPendClear - -/* IOC API */ -#define ti_lib_rom_ioc_port_configure_set ROM_IOCPortConfigureSet -#define ti_lib_rom_ioc_port_configure_get ROM_IOCPortConfigureGet -#define ti_lib_rom_ioc_io_shutdown_set ROM_IOCIOShutdownSet -#define ti_lib_rom_ioc_io_jtag_set ROM_IOCIOJTagSet -#define ti_lib_rom_ioc_io_mode_set ROM_IOCIOModeSet -#define ti_lib_rom_ioc_io_int_set ROM_IOCIOIntSet -#define ti_lib_rom_ioc_io_port_pull_set ROM_IOCIOPortPullSet -#define ti_lib_rom_ioc_io_hyst_set ROM_IOCIOHystSet -#define ti_lib_rom_ioc_io_input_set ROM_IOCIOInputSet -#define ti_lib_rom_ioc_io_slew_ctrl_set ROM_IOCIOSlewCtrlSet -#define ti_lib_rom_ioc_io_drv_strength_set ROM_IOCIODrvStrengthSet -#define ti_lib_rom_ioc_io_port_id_set ROM_IOCIOPortIdSet -#define ti_lib_rom_ioc_int_enable ROM_IOCIntEnable -#define ti_lib_rom_ioc_int_disable ROM_IOCIntDisable -#define ti_lib_rom_ioc_pin_type_gpio_input ROM_IOCPinTypeGpioInput -#define ti_lib_rom_ioc_pin_type_gpio_output ROM_IOCPinTypeGpioOutput -#define ti_lib_rom_ioc_pin_type_uart ROM_IOCPinTypeUart -#define ti_lib_rom_ioc_pin_type_ssi_master ROM_IOCPinTypeSsiMaster -#define ti_lib_rom_ioc_pin_type_ssi_slave ROM_IOCPinTypeSsiSlave -#define ti_lib_rom_ioc_pin_type_i2c ROM_IOCPinTypeI2c -#define ti_lib_rom_ioc_pin_type_spis ROM_IOCPinTypeSpis -#define ti_lib_rom_ioc_pin_type_aux ROM_IOCPinTypeAux - -/* PRCM API */ -#define ti_lib_rom_prcm_inf_clock_configure_set ROM_PRCMInfClockConfigureSet -#define ti_lib_rom_prcm_inf_clock_configure_get ROM_PRCMInfClockConfigureGet -#define ti_lib_rom_prcm_audio_clock_config_set ROM_PRCMAudioClockConfigSet -#define ti_lib_rom_prcm_power_domain_on ROM_PRCMPowerDomainOn -#define ti_lib_rom_prcm_power_domain_off ROM_PRCMPowerDomainOff -#define ti_lib_rom_prcm_peripheral_run_enable ROM_PRCMPeripheralRunEnable -#define ti_lib_rom_prcm_peripheral_run_disable ROM_PRCMPeripheralRunDisable -#define ti_lib_rom_prcm_peripheral_sleep_enable ROM_PRCMPeripheralSleepEnable -#define ti_lib_rom_prcm_peripheral_sleep_disable ROM_PRCMPeripheralSleepDisable -#define ti_lib_rom_prcm_peripheral_deep_sleep_enable ROM_PRCMPeripheralDeepSleepEnable -#define ti_lib_rom_prcm_peripheral_deep_sleep_disable ROM_PRCMPeripheralDeepSleepDisable -#define ti_lib_rom_prcm_power_domain_status ROM_PRCMPowerDomainStatus -#define ti_lib_rom_prcm_deep_sleep ROM_PRCMDeepSleep - -/* SMPH API */ -#define ti_lib_rom_smph_acquire ROM_SMPHAcquire - -/* SPIS API */ -#define ti_lib_rom_spis_data_put ROM_SPISDataPut -#define ti_lib_rom_spis_tx_get_value ROM_SPISTxGetValue -#define ti_lib_rom_spis_data_get ROM_SPISDataGet -#define ti_lib_rom_spis_rx_get_value ROM_SPISRxGetValue -#define ti_lib_rom_spis_int_status ROM_SPISIntStatus - -/* SSI API */ -#define ti_lib_rom_ssi_config_set_exp_clk ROM_SSIConfigSetExpClk -#define ti_lib_rom_ssi_data_put ROM_SSIDataPut -#define ti_lib_rom_ssi_data_put_non_blocking ROM_SSIDataPutNonBlocking -#define ti_lib_rom_ssi_data_get ROM_SSIDataGet -#define ti_lib_rom_ssi_data_get_non_blocking ROM_SSIDataGetNonBlocking - -/* TIMER API */ -#define ti_lib_rom_timer_configure ROM_TimerConfigure -#define ti_lib_rom_timer_level_control ROM_TimerLevelControl -#define ti_lib_rom_timer_trigger_control ROM_TimerTriggerControl -#define ti_lib_rom_timer_stall_control ROM_TimerStallControl -#define ti_lib_rom_timer_wait_on_trigger_control ROM_TimerWaitOnTriggerControl - -/* TRNG API */ -#define ti_lib_rom_trng_configure ROM_TRNGConfigure -#define ti_lib_rom_trng_number_get ROM_TRNGNumberGet - -/* UART API */ -#define ti_lib_rom_uart_fifo_level_get ROM_UARTFIFOLevelGet -#define ti_lib_rom_uart_config_set_exp_clk ROM_UARTConfigSetExpClk -#define ti_lib_rom_uart_config_get_exp_clk ROM_UARTConfigGetExpClk -#define ti_lib_rom_uart_disable ROM_UARTDisable -#define ti_lib_rom_uart_char_get_non_blocking ROM_UARTCharGetNonBlocking -#define ti_lib_rom_uart_char_get ROM_UARTCharGet -#define ti_lib_rom_uart_char_put_non_blocking ROM_UARTCharPutNonBlocking -#define ti_lib_rom_uart_char_put ROM_UARTCharPut - -/* UDMA API */ -#define ti_lib_rom_udma_channel_attribute_enable ROM_uDMAChannelAttributeEnable -#define ti_lib_rom_udma_channel_attribute_disable ROM_uDMAChannelAttributeDisable -#define ti_lib_rom_udma_channel_attribute_get ROM_uDMAChannelAttributeGet -#define ti_lib_rom_udma_channel_control_set ROM_uDMAChannelControlSet -#define ti_lib_rom_udma_channel_transfer_set ROM_uDMAChannelTransferSet -#define ti_lib_rom_udma_channel_scatter_gather_set ROM_uDMAChannelScatterGatherSet -#define ti_lib_rom_udma_channel_size_get ROM_uDMAChannelSizeGet -#define ti_lib_rom_udma_channel_mode_get ROM_uDMAChannelModeGet - -/* VIMS API */ -#define ti_lib_rom_vims_configure ROM_VIMSConfigure -#define ti_lib_rom_vims_mode_set ROM_VIMSModeSet -#define ti_lib_rom_vims_mode_get ROM_VIMSModeGet - -/* HAPI */ -#define ti_lib_hapi_crc32(a, b, c) HapiCrc32(a, b, c) -#define ti_lib_hapi_get_chip_id() HapiGetChipId() -#define ti_lib_hapi_reset_device() HapiResetDevice() -#define ti_lib_hapi_fletcher32(a, b, c) HapiFletcher32(a, b, c) -#define ti_lib_hapi_min_value(a, b) HapiMinValue(a,b) -#define ti_lib_hapi_max_value(a, b) HapiMaxValue(a,b) -#define ti_lib_hapi_mean_value(a, b) HapiMeanValue(a,b) -#define ti_lib_hapi_stand_deviation_value(a, b) HapiStandDeviationValue(a,b) -#define ti_lib_hapi_hf_source_safe_switch() HapiHFSourceSafeSwitch() -#define ti_lib_hapi_select_comp_a_input(a) HapiSelectCompAInput(a) -#define ti_lib_hapi_select_comp_a_ref(a) HapiSelectCompARef(a) -#define ti_lib_hapi_select_adc_comp_b_input(a) HapiSelectADCCompBInput(a) -#define ti_lib_hapi_select_comp_b_ref(a) HapiSelectCompBRef(a) -#define ti_lib_hapi_get_flash_size() HapiGetFlashSize() -#define ti_lib_hapi_sector_erase(a) HapiSectorErase(a) -#define ti_lib_hapi_program_flash(a, b, c) HapiProgramFlash(a, b, c) -/*---------------------------------------------------------------------------*/ /* sys_ctrl.h */ #include "driverlib/sys_ctrl.h" From 171fe8d08ebd7974982b9485b4871574acc1d64d Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:38:47 +0100 Subject: [PATCH 247/345] Adjust GPIO macros to reflect API in latest CCxxware --- cpu/cc26xx-cc13xx/ti-lib.h | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/cpu/cc26xx-cc13xx/ti-lib.h b/cpu/cc26xx-cc13xx/ti-lib.h index cc51100e3..dccfc3603 100644 --- a/cpu/cc26xx-cc13xx/ti-lib.h +++ b/cpu/cc26xx-cc13xx/ti-lib.h @@ -228,14 +228,24 @@ /* gpio.h */ #include "driverlib/gpio.h" -#define ti_lib_gpio_dir_mode_set(...) GPIODirModeSet(__VA_ARGS__) -#define ti_lib_gpio_dir_mode_get(...) GPIODirModeGet(__VA_ARGS__) -#define ti_lib_gpio_pin_write(...) GPIOPinWrite(__VA_ARGS__) -#define ti_lib_gpio_pin_read(...) GPIOPinRead(__VA_ARGS__) -#define ti_lib_gpio_pin_clear(...) GPIOPinClear(__VA_ARGS__) -#define ti_lib_gpio_pin_toggle(...) GPIOPinToggle(__VA_ARGS__) -#define ti_lib_gpio_event_get(...) GPIOEventGet(__VA_ARGS__) -#define ti_lib_gpio_event_clear(...) GPIOEventClear(__VA_ARGS__) +#define ti_lib_gpio_read_dio(...) GPIO_readDio(__VA_ARGS__) +#define ti_lib_gpio_read_multi_dio(...) GPIO_readMultiDio(__VA_ARGS__) +#define ti_lib_gpio_write_dio(...) GPIO_writeDio(__VA_ARGS__) +#define ti_lib_gpio_write_multi_dio(...) GPIO_writeMultiDio(__VA_ARGS__) +#define ti_lib_gpio_set_dio(...) GPIO_setDio(__VA_ARGS__) +#define ti_lib_gpio_set_multi_dio(...) GPIO_setMultiDio(__VA_ARGS__) +#define ti_lib_gpio_clear_dio(...) GPIO_clearDio(__VA_ARGS__) +#define ti_lib_gpio_clear_multi_dio(...) GPIO_clearMultiDio(__VA_ARGS__) +#define ti_lib_gpio_toggle_dio(...) GPIO_toggleDio(__VA_ARGS__) +#define ti_lib_gpio_toggle_multi_dio(...) GPIO_toggleMultiDio(__VA_ARGS__) +#define ti_lib_gpio_get_output_enable_dio(...) GPIO_getOutputEnableDio(__VA_ARGS__) +#define ti_lib_gpio_get_output_enable_multi_dio(...) GPIO_getOutputEnableMultiDio(__VA_ARGS__) +#define ti_lib_gpio_set_output_enable_dio(...) GPIO_setOutputEnableDio(__VA_ARGS__) +#define ti_lib_gpio_set_output_enable_multi_dio(...) GPIO_setOutputEnableMultiDio(__VA_ARGS__) +#define ti_lib_gpio_get_event_dio(...) GPIO_getEventDio(__VA_ARGS__) +#define ti_lib_gpio_get_event_multi_dio(...) GPIO_getEventMultiDio(__VA_ARGS__) +#define ti_lib_gpio_clear_event_dio(...) GPIO_clearEventDio(__VA_ARGS__) +#define ti_lib_gpio_clear_event_multi_dio(...) GPIO_clearEventMultiDio(__VA_ARGS__) /*---------------------------------------------------------------------------*/ /* i2c.h */ #include "driverlib/i2c.h" From f68b77fdfa9f9236fbb36d3f549b65ca1808502e Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 26 Jun 2016 01:01:16 +0100 Subject: [PATCH 248/345] Remove ROM AUX timer macros They have been undefined in CCxxwares --- cpu/cc26xx-cc13xx/ti-lib-rom.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cpu/cc26xx-cc13xx/ti-lib-rom.h b/cpu/cc26xx-cc13xx/ti-lib-rom.h index 9db42df9f..7334978b9 100644 --- a/cpu/cc26xx-cc13xx/ti-lib-rom.h +++ b/cpu/cc26xx-cc13xx/ti-lib-rom.h @@ -59,13 +59,6 @@ #define ti_lib_rom_aux_tdc_config_set ROM_AUXTDCConfigSet #define ti_lib_rom_aux_tdc_measurement_done ROM_AUXTDCMeasurementDone -/* AUX_TIMER API */ -#define ti_lib_rom_aux_timer_configure ROM_AUXTimerConfigure -#define ti_lib_rom_aux_timer_start ROM_AUXTimerStart -#define ti_lib_rom_aux_timer_stop ROM_AUXTimerStop -#define ti_lib_rom_aux_timer_prescale_set ROM_AUXTimerPrescaleSet -#define ti_lib_rom_aux_timer_prescale_get ROM_AUXTimerPrescaleGet - /* AUX_WUC API */ #define ti_lib_rom_aux_wuc_clock_enable ROM_AUXWUCClockEnable #define ti_lib_rom_aux_wuc_clock_disable ROM_AUXWUCClockDisable From 0e4c02bf3badd68f4052a4cc7fa4c9718d5ce87a Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 26 Jun 2016 01:01:37 +0100 Subject: [PATCH 249/345] Update ChipInfo and OSC macros --- cpu/cc26xx-cc13xx/ti-lib.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cpu/cc26xx-cc13xx/ti-lib.h b/cpu/cc26xx-cc13xx/ti-lib.h index dccfc3603..c8b38c2c6 100644 --- a/cpu/cc26xx-cc13xx/ti-lib.h +++ b/cpu/cc26xx-cc13xx/ti-lib.h @@ -198,6 +198,7 @@ #define ti_lib_chipinfo_package_type_is_5x5(...) ChipInfo_PackageTypeIs5x5(__VA_ARGS__) #define ti_lib_chipinfo_package_type_is_7x7(...) ChipInfo_PackageTypeIs7x7(__VA_ARGS__) #define ti_lib_chipinfo_get_device_id_hw_rev_code(...) ChipInfo_GetDeviceIdHwRevCode(__VA_ARGS__) +#define ti_lib_chipinfo_get_chip_type(...) ChipInfo_GetChipType(__VA_ARGS__) #define ti_lib_chipinfo_get_chip_family(...) ChipInfo_GetChipFamily(__VA_ARGS__) #define ti_lib_chipinfo_chip_family_is_cc26xx(...) ChipInfo_ChipFamilyIsCC26xx(__VA_ARGS__) #define ti_lib_chipinfo_chip_family_is_cc13xx(...) ChipInfo_ChipFamilyIsCC13xx(__VA_ARGS__) @@ -330,15 +331,22 @@ #include "driverlib/osc.h" #define ti_lib_osc_xhf_power_mode_set(...) OSCXHfPowerModeSet(__VA_ARGS__) +#define ti_lib_osc_clock_loss_event_enable(...) OSCClockLossEventEnable(__VA_ARGS__) +#define ti_lib_osc_clock_loss_event_disable(...) OSCClockLossEventDisable(__VA_ARGS__) #define ti_lib_osc_clock_source_set(...) OSCClockSourceSet(__VA_ARGS__) #define ti_lib_osc_clock_source_get(...) OSCClockSourceGet(__VA_ARGS__) #define ti_lib_osc_hf_source_ready(...) OSCHfSourceReady(__VA_ARGS__) #define ti_lib_osc_hf_source_switch(...) OSCHfSourceSwitch(__VA_ARGS__) -#define ti_lib_osc_interface_enable(...) OSCInterfaceEnable(__VA_ARGS__) -#define ti_lib_osc_interface_disable(...) OSCInterfaceDisable(__VA_ARGS__) #define ti_lib_osc_hf_get_startup_time(...) OSCHF_GetStartupTime(__VA_ARGS__) #define ti_lib_osc_hf_turn_on_xosc(...) OSCHF_TurnOnXosc(__VA_ARGS__) #define ti_lib_osc_hf_attempt_to_switch_to_xosc(...) OSCHF_AttemptToSwitchToXosc(__VA_ARGS__) +#define ti_lib_osc_hf_debug_get_crystal_amplitude(...) OSCHF_DebugGetCrystalAmplitude(__VA_ARGS__) +#define ti_lib_osc_hf_debug_get_expected_average_crystal_amplitude(...) \ + OSCHF_DebugGetExpectedAverageCrystalAmplitude(__VA_ARGS__) +#define ti_lib_osc_hposc_relative_frequency_offset_get(...) \ + OSC_HPOSCRelativeFrequencyOffsetGet(__VA_ARGS__) +#define ti_lib_osc_hposc_relative_frequency_offset_to_rf_core_format_convert(...) \ + OSC_HPOSCRelativeFrequencyOffsetToRFCoreFormatConvert(__VA_ARGS__) #define ti_lib_osc_hf_switch_to_rc_osc_turn_off_xosc(...) OSCHF_SwitchToRcOscTurnOffXosc(__VA_ARGS__) /*---------------------------------------------------------------------------*/ /* prcm.h */ From ccba6bdb207a483d719db59420be2d1e93ac3fd5 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:40:14 +0100 Subject: [PATCH 250/345] Update cpu files to reflect API in latest CCxxware versions --- cpu/cc26xx-cc13xx/dev/cc26xx-uart.c | 6 ++--- cpu/cc26xx-cc13xx/dev/gpio-interrupt.c | 8 +++---- cpu/cc26xx-cc13xx/dev/soc-rtc.c | 2 +- cpu/cc26xx-cc13xx/dev/soc-trng.c | 4 ++-- cpu/cc26xx-cc13xx/lpm.c | 4 ++-- cpu/cc26xx-cc13xx/rf-core/rf-core.c | 32 +++++++++++++------------- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/cpu/cc26xx-cc13xx/dev/cc26xx-uart.c b/cpu/cc26xx-cc13xx/dev/cc26xx-uart.c index d7753066f..140a5d203 100644 --- a/cpu/cc26xx-cc13xx/dev/cc26xx-uart.c +++ b/cpu/cc26xx-cc13xx/dev/cc26xx-uart.c @@ -120,7 +120,7 @@ static void disable_interrupts(void) { /* Acknowledge UART interrupts */ - ti_lib_int_disable(INT_UART0); + ti_lib_int_disable(INT_UART0_COMB); /* Disable all UART module interrupts */ ti_lib_uart_int_disable(UART0_BASE, CC26XX_UART_INTERRUPT_ALL); @@ -141,7 +141,7 @@ enable_interrupts(void) ti_lib_uart_int_enable(UART0_BASE, CC26XX_UART_RX_INTERRUPT_TRIGGERS); /* Acknowledge UART interrupts */ - ti_lib_int_enable(INT_UART0); + ti_lib_int_enable(INT_UART0_COMB); } } /*---------------------------------------------------------------------------*/ @@ -154,7 +154,7 @@ configure(void) * to avoid falling edge glitches */ ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_UART_TX); - ti_lib_gpio_pin_write(BOARD_UART_TX, 1); + ti_lib_gpio_set_dio(BOARD_IOID_UART_TX); /* * Map UART signals to the correct GPIO pins and configure them as diff --git a/cpu/cc26xx-cc13xx/dev/gpio-interrupt.c b/cpu/cc26xx-cc13xx/dev/gpio-interrupt.c index b080a5d3f..41ac5b5c6 100644 --- a/cpu/cc26xx-cc13xx/dev/gpio-interrupt.c +++ b/cpu/cc26xx-cc13xx/dev/gpio-interrupt.c @@ -55,7 +55,7 @@ gpio_interrupt_register_handler(uint8_t ioid, gpio_interrupt_handler_t f) uint8_t interrupts_disabled = ti_lib_int_master_disable(); /* Clear interrupts on specified pins */ - ti_lib_gpio_event_clear(1 << ioid); + ti_lib_gpio_clear_event_dio(ioid); handlers[ioid] = f; @@ -74,7 +74,7 @@ gpio_interrupt_init() handlers[i] = NULL; } - ti_lib_int_enable(INT_EDGE_DETECT); + ti_lib_int_enable(INT_AON_GPIO_EDGE); } /*---------------------------------------------------------------------------*/ void @@ -86,13 +86,13 @@ gpio_interrupt_isr(void) ENERGEST_ON(ENERGEST_TYPE_IRQ); /* Read interrupt flags */ - pin_mask = (HWREG(GPIO_BASE + GPIO_O_EVFLAGS31_0) & GPIO_PIN_MASK); + pin_mask = (HWREG(GPIO_BASE + GPIO_O_EVFLAGS31_0) & GPIO_DIO_ALL_MASK); /* Clear the interrupt flags */ HWREG(GPIO_BASE + GPIO_O_EVFLAGS31_0) = pin_mask; /* Run custom ISRs */ - for(i = 0; i < NUM_GPIO_PINS; i++) { + for(i = 0; i < NUM_IO_MAX; i++) { /* Call the handler if there is one registered for this event */ if((pin_mask & (1 << i)) && handlers[i] != NULL) { handlers[i](i); diff --git a/cpu/cc26xx-cc13xx/dev/soc-rtc.c b/cpu/cc26xx-cc13xx/dev/soc-rtc.c index 398f14d6a..110a584c5 100644 --- a/cpu/cc26xx-cc13xx/dev/soc-rtc.c +++ b/cpu/cc26xx-cc13xx/dev/soc-rtc.c @@ -100,7 +100,7 @@ soc_rtc_init(void) ti_lib_aon_rtc_channel_enable(AON_RTC_CH1); ti_lib_aon_rtc_enable(); - ti_lib_int_enable(INT_AON_RTC); + ti_lib_rom_int_enable(INT_AON_RTC_COMB); /* Re-enable interrupts */ if(!interrupts_disabled) { diff --git a/cpu/cc26xx-cc13xx/dev/soc-trng.c b/cpu/cc26xx-cc13xx/dev/soc-trng.c index 5c54093e8..33a217be8 100644 --- a/cpu/cc26xx-cc13xx/dev/soc-trng.c +++ b/cpu/cc26xx-cc13xx/dev/soc-trng.c @@ -71,7 +71,7 @@ static void disable_number_ready_interrupt(void) { ti_lib_trng_int_disable(TRNG_NUMBER_READY); - ti_lib_rom_int_disable(INT_TRNG); + ti_lib_rom_int_disable(INT_TRNG_IRQ); } /*---------------------------------------------------------------------------*/ static void @@ -79,7 +79,7 @@ enable_number_ready_interrupt(void) { ti_lib_trng_int_clear(TRNG_NUMBER_READY); ti_lib_trng_int_enable(TRNG_NUMBER_READY); - ti_lib_rom_int_enable(INT_TRNG); + ti_lib_rom_int_enable(INT_TRNG_IRQ); } /*---------------------------------------------------------------------------*/ static bool diff --git a/cpu/cc26xx-cc13xx/lpm.c b/cpu/cc26xx-cc13xx/lpm.c index 78aa2c764..f73c7827b 100644 --- a/cpu/cc26xx-cc13xx/lpm.c +++ b/cpu/cc26xx-cc13xx/lpm.c @@ -127,7 +127,7 @@ lpm_shutdown(uint32_t wakeup_pin, uint32_t io_pull, uint32_t wake_on) /* Configure the wakeup trigger */ if(wakeup_pin != IOID_UNUSED) { - ti_lib_gpio_dir_mode_set((1 << wakeup_pin), GPIO_DIR_MODE_IN); + ti_lib_gpio_set_output_enable_dio(wakeup_pin, GPIO_OUTPUT_DISABLE); ti_lib_ioc_port_configure_set(wakeup_pin, IOC_PORT_GPIO, io_cfg); } @@ -584,7 +584,7 @@ lpm_pin_set_default_state(uint32_t ioid) } ti_lib_ioc_port_configure_set(ioid, IOC_PORT_GPIO, IOC_STD_OUTPUT); - ti_lib_gpio_dir_mode_set((1 << ioid), GPIO_DIR_MODE_IN); + ti_lib_gpio_set_output_enable_dio(ioid, GPIO_OUTPUT_DISABLE); } /*---------------------------------------------------------------------------*/ /** diff --git a/cpu/cc26xx-cc13xx/rf-core/rf-core.c b/cpu/cc26xx-cc13xx/rf-core/rf-core.c index 15fc8e3bc..fa4438415 100644 --- a/cpu/cc26xx-cc13xx/rf-core/rf-core.c +++ b/cpu/cc26xx-cc13xx/rf-core/rf-core.c @@ -236,10 +236,10 @@ rf_core_power_up() uint32_t cmd_status; bool interrupts_disabled = ti_lib_int_master_disable(); - ti_lib_int_pend_clear(INT_RF_CPE0); - ti_lib_int_pend_clear(INT_RF_CPE1); - ti_lib_int_disable(INT_RF_CPE0); - ti_lib_int_disable(INT_RF_CPE1); + ti_lib_int_pend_clear(INT_RFC_CPE_0); + ti_lib_int_pend_clear(INT_RFC_CPE_1); + ti_lib_int_disable(INT_RFC_CPE_0); + ti_lib_int_disable(INT_RFC_CPE_1); /* Enable RF Core power domain */ ti_lib_prcm_power_domain_on(PRCM_DOMAIN_RFCORE); @@ -252,8 +252,8 @@ rf_core_power_up() HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = 0x0; - ti_lib_int_enable(INT_RF_CPE0); - ti_lib_int_enable(INT_RF_CPE1); + ti_lib_int_enable(INT_RFC_CPE_0); + ti_lib_int_enable(INT_RFC_CPE_1); if(!interrupts_disabled) { ti_lib_int_master_enable(); @@ -335,8 +335,8 @@ void rf_core_power_down() { bool interrupts_disabled = ti_lib_int_master_disable(); - ti_lib_int_disable(INT_RF_CPE0); - ti_lib_int_disable(INT_RF_CPE1); + ti_lib_int_disable(INT_RFC_CPE_0); + ti_lib_int_disable(INT_RFC_CPE_1); if(rf_core_is_accessible()) { HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; @@ -358,10 +358,10 @@ rf_core_power_down() while(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) != PRCM_DOMAIN_POWER_OFF); - ti_lib_int_pend_clear(INT_RF_CPE0); - ti_lib_int_pend_clear(INT_RF_CPE1); - ti_lib_int_enable(INT_RF_CPE0); - ti_lib_int_enable(INT_RF_CPE1); + ti_lib_int_pend_clear(INT_RFC_CPE_0); + ti_lib_int_pend_clear(INT_RFC_CPE_1); + ti_lib_int_enable(INT_RFC_CPE_0); + ti_lib_int_enable(INT_RFC_CPE_1); if(!interrupts_disabled) { ti_lib_int_master_enable(); } @@ -462,10 +462,10 @@ rf_core_setup_interrupts(bool poll_mode) /* Clear interrupt flags, active low clear(?) */ HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; - ti_lib_int_pend_clear(INT_RF_CPE0); - ti_lib_int_pend_clear(INT_RF_CPE1); - ti_lib_int_enable(INT_RF_CPE0); - ti_lib_int_enable(INT_RF_CPE1); + ti_lib_int_pend_clear(INT_RFC_CPE_0); + ti_lib_int_pend_clear(INT_RFC_CPE_1); + ti_lib_int_enable(INT_RFC_CPE_0); + ti_lib_int_enable(INT_RFC_CPE_1); if(!interrupts_disabled) { ti_lib_int_master_enable(); From c42cb2b0cba5e960ddc617b37b552ae93eb832ab Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:41:02 +0100 Subject: [PATCH 251/345] Update to latest CCxxwares: common drivers --- platform/srf06-cc26xx/common/ext-flash.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/srf06-cc26xx/common/ext-flash.c b/platform/srf06-cc26xx/common/ext-flash.c index 62fea2288..7faaab0c0 100644 --- a/platform/srf06-cc26xx/common/ext-flash.c +++ b/platform/srf06-cc26xx/common/ext-flash.c @@ -94,7 +94,7 @@ static void select_on_bus(void) { - ti_lib_gpio_pin_write(BOARD_FLASH_CS, 0); + ti_lib_gpio_clear_dio(BOARD_IOID_FLASH_CS); } /*---------------------------------------------------------------------------*/ /** @@ -103,7 +103,7 @@ select_on_bus(void) static void deselect(void) { - ti_lib_gpio_pin_write(BOARD_FLASH_CS, 1); + ti_lib_gpio_set_dio(BOARD_IOID_FLASH_CS); } /*---------------------------------------------------------------------------*/ /** From 5de7b1bbacda4e27d3f8e8f3e190c891fb1a16df Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:42:00 +0100 Subject: [PATCH 252/345] Update to latest CCxxwares: Launchpad drivers --- .../srf06-cc26xx/launchpad/button-sensor.c | 26 +++++++++---------- platform/srf06-cc26xx/launchpad/leds-arch.c | 8 +++--- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/platform/srf06-cc26xx/launchpad/button-sensor.c b/platform/srf06-cc26xx/launchpad/button-sensor.c index d37369d0a..eb8bd3033 100644 --- a/platform/srf06-cc26xx/launchpad/button-sensor.c +++ b/platform/srf06-cc26xx/launchpad/button-sensor.c @@ -83,7 +83,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_LEFT) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_LEFT) == 0) { left_timer.start = clock_time(); left_timer.duration = 0; } else { @@ -104,7 +104,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_RIGHT) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_RIGHT) == 0) { right_timer.start = clock_time(); right_timer.duration = 0; } else { @@ -122,19 +122,19 @@ config_buttons(int type, int c, uint32_t key) { switch(type) { case SENSORS_HW_INIT: - ti_lib_gpio_event_clear(1 << key); - ti_lib_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); - ti_lib_gpio_dir_mode_set((1 << key), GPIO_DIR_MODE_IN); + ti_lib_gpio_clear_event_dio(key); + ti_lib_rom_ioc_pin_type_gpio_input(key); + ti_lib_rom_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); gpio_interrupt_register_handler(key, button_press_handler); break; case SENSORS_ACTIVE: if(c) { - ti_lib_gpio_event_clear(1 << key); - ti_lib_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); - ti_lib_gpio_dir_mode_set((1 << key), GPIO_DIR_MODE_IN); - ti_lib_ioc_int_enable(key); + ti_lib_gpio_clear_event_dio(key); + ti_lib_rom_ioc_pin_type_gpio_input(key); + ti_lib_rom_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); + ti_lib_rom_ioc_int_enable(key); } else { - ti_lib_ioc_int_disable(key); + ti_lib_rom_ioc_int_disable(key); } break; default: @@ -164,7 +164,7 @@ status(int type, uint32_t key_io_id) switch(type) { case SENSORS_ACTIVE: case SENSORS_READY: - if(ti_lib_ioc_port_configure_get(key_io_id) & IOC_INT_ENABLE) { + if(ti_lib_rom_ioc_port_configure_get(key_io_id) & IOC_INT_ENABLE) { return 1; } break; @@ -178,7 +178,7 @@ static int value_left(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_LEFT) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_LEFT) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)left_timer.duration; @@ -190,7 +190,7 @@ static int value_right(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_RIGHT) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_RIGHT) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)right_timer.duration; diff --git a/platform/srf06-cc26xx/launchpad/leds-arch.c b/platform/srf06-cc26xx/launchpad/leds-arch.c index e853487fd..0d8385ad6 100644 --- a/platform/srf06-cc26xx/launchpad/leds-arch.c +++ b/platform/srf06-cc26xx/launchpad/leds-arch.c @@ -55,7 +55,7 @@ leds_arch_init(void) ti_lib_rom_ioc_pin_type_gpio_output(BOARD_IOID_LED_1); ti_lib_rom_ioc_pin_type_gpio_output(BOARD_IOID_LED_2); - ti_lib_gpio_pin_write(BOARD_LED_ALL, 0); + ti_lib_gpio_clear_multi_dio(BOARD_LED_ALL); } /*---------------------------------------------------------------------------*/ unsigned char @@ -68,13 +68,13 @@ void leds_arch_set(unsigned char leds) { c = leds; - ti_lib_gpio_pin_write(BOARD_LED_ALL, 0); + ti_lib_gpio_clear_multi_dio(BOARD_LED_ALL); if((leds & LEDS_RED) == LEDS_RED) { - ti_lib_gpio_pin_write(BOARD_LED_1, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_1); } if((leds & LEDS_YELLOW) == LEDS_YELLOW) { - ti_lib_gpio_pin_write(BOARD_LED_2, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_2); } } /*---------------------------------------------------------------------------*/ From f6437b6086803af4065c71ad02db74cbc8bd6cc1 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:42:32 +0100 Subject: [PATCH 253/345] Update to latest CCxxwares: Sensortag drivers --- platform/srf06-cc26xx/sensortag/board.c | 4 ++-- .../srf06-cc26xx/sensortag/button-sensor.c | 24 +++++++++---------- .../srf06-cc26xx/sensortag/cc2650/leds-arch.c | 8 +++---- .../srf06-cc26xx/sensortag/mpu-9250-sensor.c | 6 ++--- platform/srf06-cc26xx/sensortag/reed-relay.c | 4 ++-- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/platform/srf06-cc26xx/sensortag/board.c b/platform/srf06-cc26xx/sensortag/board.c index f06545170..f1f4a29e1 100644 --- a/platform/srf06-cc26xx/sensortag/board.c +++ b/platform/srf06-cc26xx/sensortag/board.c @@ -75,7 +75,7 @@ shutdown_handler(uint8_t mode) SENSORS_DEACTIVATE(tmp_007_sensor); SENSORS_DEACTIVATE(hdc_1000_sensor); SENSORS_DEACTIVATE(mpu_9250_sensor); - ti_lib_gpio_pin_clear(BOARD_MPU_POWER); + ti_lib_gpio_clear_dio(BOARD_IOID_MPU_POWER); } /* In all cases, stop the I2C */ @@ -111,7 +111,7 @@ configure_unused_pins(void) /* Digital Microphone */ ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_MIC_POWER); - ti_lib_gpio_pin_clear((1 << BOARD_IOID_MIC_POWER)); + ti_lib_gpio_clear_dio(BOARD_IOID_MIC_POWER); ti_lib_ioc_io_drv_strength_set(BOARD_IOID_MIC_POWER, IOC_CURRENT_2MA, IOC_STRENGTH_MIN); diff --git a/platform/srf06-cc26xx/sensortag/button-sensor.c b/platform/srf06-cc26xx/sensortag/button-sensor.c index 921d96b20..9df55d21d 100644 --- a/platform/srf06-cc26xx/sensortag/button-sensor.c +++ b/platform/srf06-cc26xx/sensortag/button-sensor.c @@ -86,7 +86,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_LEFT) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_LEFT) == 0) { left_timer.start = clock_time(); left_timer.duration = 0; } else { @@ -107,7 +107,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_RIGHT) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_RIGHT) == 0) { right_timer.start = clock_time(); right_timer.duration = 0; } else { @@ -132,19 +132,19 @@ config_buttons(int type, int c, uint32_t key) { switch(type) { case SENSORS_HW_INIT: - ti_lib_gpio_event_clear(1 << key); - ti_lib_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); - ti_lib_gpio_dir_mode_set((1 << key), GPIO_DIR_MODE_IN); + ti_lib_gpio_clear_event_dio(key); + ti_lib_rom_ioc_pin_type_gpio_input(key); + ti_lib_rom_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); gpio_interrupt_register_handler(key, button_press_handler); break; case SENSORS_ACTIVE: if(c) { - ti_lib_gpio_event_clear(1 << key); - ti_lib_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); - ti_lib_gpio_dir_mode_set((1 << key), GPIO_DIR_MODE_IN); - ti_lib_ioc_int_enable(key); + ti_lib_gpio_clear_event_dio(key); + ti_lib_rom_ioc_pin_type_gpio_input(key); + ti_lib_rom_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); + ti_lib_rom_ioc_int_enable(key); } else { - ti_lib_ioc_int_disable(key); + ti_lib_rom_ioc_int_disable(key); } break; default: @@ -225,7 +225,7 @@ static int value_left(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_LEFT) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_LEFT) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)left_timer.duration; @@ -237,7 +237,7 @@ static int value_right(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_RIGHT) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_RIGHT) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)right_timer.duration; diff --git a/platform/srf06-cc26xx/sensortag/cc2650/leds-arch.c b/platform/srf06-cc26xx/sensortag/cc2650/leds-arch.c index e415dca55..c36959063 100644 --- a/platform/srf06-cc26xx/sensortag/cc2650/leds-arch.c +++ b/platform/srf06-cc26xx/sensortag/cc2650/leds-arch.c @@ -55,7 +55,7 @@ leds_arch_init(void) ti_lib_rom_ioc_pin_type_gpio_output(BOARD_IOID_LED_1); ti_lib_rom_ioc_pin_type_gpio_output(BOARD_IOID_LED_2); - ti_lib_gpio_pin_write(BOARD_LED_ALL, 0); + ti_lib_gpio_clear_multi_dio(BOARD_LED_ALL); } /*---------------------------------------------------------------------------*/ unsigned char @@ -68,13 +68,13 @@ void leds_arch_set(unsigned char leds) { c = leds; - ti_lib_gpio_pin_write(BOARD_LED_ALL, 0); + ti_lib_gpio_clear_multi_dio(BOARD_LED_ALL); if((leds & LEDS_RED) == LEDS_RED) { - ti_lib_gpio_pin_write(BOARD_LED_1, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_1); } if((leds & LEDS_YELLOW) == LEDS_YELLOW) { - ti_lib_gpio_pin_write(BOARD_LED_2, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_2); } } /*---------------------------------------------------------------------------*/ diff --git a/platform/srf06-cc26xx/sensortag/mpu-9250-sensor.c b/platform/srf06-cc26xx/sensortag/mpu-9250-sensor.c index 275f2b352..5a97666b3 100644 --- a/platform/srf06-cc26xx/sensortag/mpu-9250-sensor.c +++ b/platform/srf06-cc26xx/sensortag/mpu-9250-sensor.c @@ -505,7 +505,7 @@ initialise(void *not_used) static void power_up(void) { - ti_lib_gpio_pin_write(BOARD_MPU_POWER, 1); + ti_lib_gpio_set_dio(BOARD_IOID_MPU_POWER); state = SENSOR_STATE_BOOTING; ctimer_set(&startup_timer, SENSOR_BOOT_DELAY, initialise, NULL); @@ -608,7 +608,7 @@ configure(int type, int enable) ti_lib_rom_ioc_pin_type_gpio_output(BOARD_IOID_MPU_POWER); ti_lib_ioc_io_drv_strength_set(BOARD_IOID_MPU_POWER, IOC_CURRENT_4MA, IOC_STRENGTH_MAX); - ti_lib_gpio_pin_clear(BOARD_MPU_POWER); + ti_lib_gpio_clear_dio(BOARD_IOID_MPU_POWER); elements = MPU_9250_SENSOR_TYPE_NONE; break; case SENSORS_ACTIVE: @@ -629,7 +629,7 @@ configure(int type, int enable) sensor_sleep(); while(ti_lib_i2c_master_busy(I2C0_BASE)); state = SENSOR_STATE_DISABLED; - ti_lib_gpio_pin_clear(BOARD_MPU_POWER); + ti_lib_gpio_clear_dio(BOARD_IOID_MPU_POWER); } } break; diff --git a/platform/srf06-cc26xx/sensortag/reed-relay.c b/platform/srf06-cc26xx/sensortag/reed-relay.c index 9be161b48..598bfd970 100644 --- a/platform/srf06-cc26xx/sensortag/reed-relay.c +++ b/platform/srf06-cc26xx/sensortag/reed-relay.c @@ -74,7 +74,7 @@ reed_interrupt_handler(uint8_t ioid) static int value(int type) { - return (int)ti_lib_gpio_pin_read(1 << BOARD_IOID_REED_RELAY); + return (int)ti_lib_gpio_read_dio(BOARD_IOID_REED_RELAY); } /*---------------------------------------------------------------------------*/ /** @@ -91,7 +91,7 @@ configure(int type, int value) switch(type) { case SENSORS_HW_INIT: ti_lib_ioc_int_disable(BOARD_IOID_REED_RELAY); - ti_lib_gpio_event_clear(1 << BOARD_IOID_REED_RELAY); + ti_lib_gpio_clear_event_dio(BOARD_IOID_REED_RELAY); /* Enable the GPIO clock when the CM3 is running */ ti_lib_prcm_peripheral_run_enable(PRCM_PERIPH_GPIO); From 01590088d390f875aa7eca269c3cdd5c1e4dfcbb Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:43:04 +0100 Subject: [PATCH 254/345] Update to latest CCxxwares: Srf06+EM drivers --- platform/srf06-cc26xx/srf06/als-sensor.c | 12 +++---- platform/srf06-cc26xx/srf06/board.c | 6 ++-- platform/srf06-cc26xx/srf06/button-sensor.c | 36 ++++++++++----------- platform/srf06-cc26xx/srf06/leds-arch.c | 12 +++---- 4 files changed, 33 insertions(+), 33 deletions(-) diff --git a/platform/srf06-cc26xx/srf06/als-sensor.c b/platform/srf06-cc26xx/srf06/als-sensor.c index f149d16a1..3b6fdecb9 100644 --- a/platform/srf06-cc26xx/srf06/als-sensor.c +++ b/platform/srf06-cc26xx/srf06/als-sensor.c @@ -59,18 +59,18 @@ config(int type, int enable) ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_ALS_PWR); break; case SENSORS_ACTIVE: - ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_ALS_PWR); - ti_lib_ioc_port_configure_set(BOARD_IOID_ALS_OUT, IOC_PORT_GPIO, - IOC_STD_OUTPUT); - ti_lib_gpio_dir_mode_set(BOARD_ALS_OUT, GPIO_DIR_MODE_IN); + ti_lib_rom_ioc_pin_type_gpio_output(BOARD_IOID_ALS_PWR); + ti_lib_rom_ioc_port_configure_set(BOARD_IOID_ALS_OUT, IOC_PORT_GPIO, + IOC_STD_OUTPUT); + ti_lib_rom_ioc_pin_type_gpio_input(BOARD_IOID_ALS_OUT); if(enable) { - ti_lib_gpio_pin_write(BOARD_ALS_PWR, 1); + ti_lib_gpio_set_dio(BOARD_IOID_ALS_PWR); aux_ctrl_register_consumer(&als_aux); ti_lib_aux_adc_select_input(ADC_COMPB_IN_AUXIO7); clock_delay_usec(2000); } else { - ti_lib_gpio_pin_write(BOARD_ALS_PWR, 0); + ti_lib_gpio_clear_dio(BOARD_IOID_ALS_PWR); aux_ctrl_unregister_consumer(&als_aux); } break; diff --git a/platform/srf06-cc26xx/srf06/board.c b/platform/srf06-cc26xx/srf06/board.c index 15528f79a..ffa77a011 100644 --- a/platform/srf06-cc26xx/srf06/board.c +++ b/platform/srf06-cc26xx/srf06/board.c @@ -50,7 +50,7 @@ lpm_handler(uint8_t mode) { /* Ambient light sensor (off, output low) */ ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_ALS_PWR); - ti_lib_gpio_pin_write(BOARD_ALS_PWR, 0); + ti_lib_gpio_clear_dio(BOARD_IOID_ALS_PWR); ti_lib_ioc_pin_type_gpio_input(BOARD_IOID_ALS_OUT); ti_lib_ioc_io_port_pull_set(BOARD_IOID_ALS_OUT, IOC_NO_IOPULL); } @@ -77,11 +77,11 @@ configure_unused_pins(void) { /* Turn off 3.3-V domain (lcd/sdcard power, output low) */ ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_3V3_EN); - ti_lib_gpio_pin_write(BOARD_3V3_EN, 0); + ti_lib_gpio_clear_dio(BOARD_IOID_3V3_EN); /* Accelerometer (PWR output low, CSn output, high) */ ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_ACC_PWR); - ti_lib_gpio_pin_write(BOARD_ACC_PWR, 0); + ti_lib_gpio_clear_dio(BOARD_IOID_ACC_PWR); } /*---------------------------------------------------------------------------*/ void diff --git a/platform/srf06-cc26xx/srf06/button-sensor.c b/platform/srf06-cc26xx/srf06/button-sensor.c index b397e86f5..23f668355 100644 --- a/platform/srf06-cc26xx/srf06/button-sensor.c +++ b/platform/srf06-cc26xx/srf06/button-sensor.c @@ -87,7 +87,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_SELECT) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_SELECT) == 0) { sel_timer.start = clock_time(); sel_timer.duration = 0; } else { @@ -107,7 +107,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_LEFT) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_LEFT) == 0) { left_timer.start = clock_time(); left_timer.duration = 0; } else { @@ -128,7 +128,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_RIGHT) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_RIGHT) == 0) { right_timer.start = clock_time(); right_timer.duration = 0; } else { @@ -151,7 +151,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_UP) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_UP) == 0) { up_timer.start = clock_time(); up_timer.duration = 0; } else { @@ -171,7 +171,7 @@ button_press_handler(uint8_t ioid) * Start press duration counter on press (falling), notify on release * (rising) */ - if(ti_lib_gpio_pin_read(BOARD_KEY_DOWN) == 0) { + if(ti_lib_gpio_read_dio(BOARD_IOID_KEY_DOWN) == 0) { down_timer.start = clock_time(); down_timer.duration = 0; } else { @@ -193,19 +193,19 @@ config_buttons(int type, int c, uint32_t key) { switch(type) { case SENSORS_HW_INIT: - ti_lib_gpio_event_clear(1 << key); - ti_lib_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); - ti_lib_gpio_dir_mode_set((1 << key), GPIO_DIR_MODE_IN); + ti_lib_gpio_clear_event_dio(key); + ti_lib_rom_ioc_pin_type_gpio_input(key); + ti_lib_rom_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); gpio_interrupt_register_handler(key, button_press_handler); break; case SENSORS_ACTIVE: if(c) { - ti_lib_gpio_event_clear(1 << key); - ti_lib_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); - ti_lib_gpio_dir_mode_set((1 << key), GPIO_DIR_MODE_IN); - ti_lib_ioc_int_enable(key); + ti_lib_gpio_clear_event_dio(key); + ti_lib_rom_ioc_pin_type_gpio_input(key); + ti_lib_rom_ioc_port_configure_set(key, IOC_PORT_GPIO, BUTTON_GPIO_CFG); + ti_lib_rom_ioc_int_enable(key); } else { - ti_lib_ioc_int_disable(key); + ti_lib_rom_ioc_int_disable(key); } break; default: @@ -327,7 +327,7 @@ static int value_select(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_SELECT) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_SELECT) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)sel_timer.duration; @@ -339,7 +339,7 @@ static int value_left(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_LEFT) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_LEFT) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)left_timer.duration; @@ -351,7 +351,7 @@ static int value_right(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_RIGHT) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_RIGHT) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)right_timer.duration; @@ -363,7 +363,7 @@ static int value_up(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_UP) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_UP) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)up_timer.duration; @@ -375,7 +375,7 @@ static int value_down(int type) { if(type == BUTTON_SENSOR_VALUE_STATE) { - return ti_lib_gpio_pin_read(BOARD_KEY_DOWN) == 0 ? + return ti_lib_gpio_read_dio(BOARD_IOID_KEY_DOWN) == 0 ? BUTTON_SENSOR_VALUE_PRESSED : BUTTON_SENSOR_VALUE_RELEASED; } else if(type == BUTTON_SENSOR_VALUE_DURATION) { return (int)down_timer.duration; diff --git a/platform/srf06-cc26xx/srf06/leds-arch.c b/platform/srf06-cc26xx/srf06/leds-arch.c index 423789350..2a1627005 100644 --- a/platform/srf06-cc26xx/srf06/leds-arch.c +++ b/platform/srf06-cc26xx/srf06/leds-arch.c @@ -56,7 +56,7 @@ leds_arch_init(void) ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_LED_3); ti_lib_ioc_pin_type_gpio_output(BOARD_IOID_LED_4); - ti_lib_gpio_pin_write(BOARD_LED_ALL, 0); + ti_lib_gpio_clear_multi_dio(BOARD_LED_ALL); } /*---------------------------------------------------------------------------*/ unsigned char @@ -71,19 +71,19 @@ leds_arch_set(unsigned char leds) c = leds; /* Clear everything */ - ti_lib_gpio_pin_write(BOARD_LED_ALL, 0); + ti_lib_gpio_clear_multi_dio(BOARD_LED_ALL); if((leds & LEDS_RED) == LEDS_RED) { - ti_lib_gpio_pin_write(BOARD_LED_1, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_1); } if((leds & LEDS_YELLOW) == LEDS_YELLOW) { - ti_lib_gpio_pin_write(BOARD_LED_2, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_2); } if((leds & LEDS_GREEN) == LEDS_GREEN) { - ti_lib_gpio_pin_write(BOARD_LED_3, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_3); } if((leds & LEDS_ORANGE) == LEDS_ORANGE) { - ti_lib_gpio_pin_write(BOARD_LED_4, 1); + ti_lib_gpio_set_dio(BOARD_IOID_LED_4); } } /*---------------------------------------------------------------------------*/ From 4495d147027462abfb6a529ae82b7daeabade09b Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 19:44:27 +0100 Subject: [PATCH 255/345] Make ROM bootloader configurable through contiki- or project-conf.h --- cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx | 6 +++++ platform/srf06-cc26xx/README.md | 24 +++++++++++++------ platform/srf06-cc26xx/contiki-conf.h | 13 ++++++++++ .../srf06-cc26xx/launchpad/cc1310/board.h | 22 +++++++++++++++++ .../srf06-cc26xx/launchpad/cc2650/board.h | 22 +++++++++++++++++ platform/srf06-cc26xx/srf06/cc13xx/board.h | 22 +++++++++++++++++ platform/srf06-cc26xx/srf06/cc26xx/board.h | 22 +++++++++++++++++ 7 files changed, 124 insertions(+), 7 deletions(-) diff --git a/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx b/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx index 2a8dd114e..9efbf091f 100644 --- a/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx +++ b/cpu/cc26xx-cc13xx/Makefile.cc26xx-cc13xx @@ -101,6 +101,12 @@ $(OBJECTDIR)/ieee-addr.o: ieee-addr.c FORCE | $(OBJECTDIR) $(TRACE_CC) $(Q)$(CC) $(CFLAGS) -c $< -o $@ +### Always re-build ccfg.c so changes to ccfg-conf.h will apply without having +### to make clean first +$(OBJECTDIR)/ccfg.o: ccfg.c FORCE | $(OBJECTDIR) + $(TRACE_CC) + $(Q)$(CC) $(CFLAGS) -include "contiki-conf.h" -c $< -o $@ + ### Compilation rules CUSTOM_RULE_LINK=1 diff --git a/platform/srf06-cc26xx/README.md b/platform/srf06-cc26xx/README.md index 04d66a0d4..980038593 100644 --- a/platform/srf06-cc26xx/README.md +++ b/platform/srf06-cc26xx/README.md @@ -107,23 +107,31 @@ If the `BOARD` variable is unspecified, an image for the Srf06 CC26XXEM will be If you want to switch between building for one platform to the other, make certain to `make clean` before building for the new one, or you will get linker errors. -If you want to upload the compiled firmware to a node via the serial boot loader you need to manually enable the boot loader and then use `make cc26xx-demo.upload`. On the SmartRF06 board you enable the boot loader by resetting the board (EM RESET button) while holding the `select` button. (The boot loader backdoor needs to be enabled on the chip, and the chip needs to be configured correctly, for this to work. See README in the `tools/cc2538-bsl` directory for more info). The serial uploader script will automatically pick the first available serial port. If this is not the port where your node is connected, you can force the script to use a specific port by defining the `PORT` argument eg. `make cc26xx-demo.upload PORT=/dev/tty.usbserial` - -The serial bootloader can also be used with the LaunchPad and the changes required to achieve this are the same as those required for the SmartRF. The only difference is that you will need to map `BL_PIN_NUMBER` to either the left or right user button (values to be used for `BL_PIN_NUMBER` in `ccfg.c` are `0x0D` and `0x0E` respectively). - -Note that uploading over serial doesn't work for the Sensortag, you can use TI's SmartRF Flash Programmer in this case. - For the `cc26xx-demo`, the included readme describes in detail what the example does. To generate an assembly listing of the compiled firmware, run `make cc26xx-demo.lst`. This may be useful for debugging or optimizing your application code. To intersperse the C source code within the assembly listing, you must instruct the compiler to include debugging information by adding `CFLAGS += -g` to the project Makefile and rebuild by running `make clean cc26xx-demo.lst`. +How to Program your Device +-------------------------- +To program your device on Windows, use TI's [SmartRF Flash Programmer][smart-rf-flashprog] (FLASH-PROGRAMMER-2). + +On Linux and OS X, you can program your device via the chip's serial ROM boot loader. In order for this to work, the following conditions need to be met: + +* The board can support the bootloader. This is the case for SmartRF06EB with CC26xx/CC13xx EMs and it is also the case for LaunchPads. Note that uploading over serial does not (and will not) work for the Sensortag. +* The chip is not programmed with a valid image, or the image has the bootloader backdoor unlocked. To enable the bootloader backdoor in your image, define `ROM_BOOTLOADER_ENABLE` to 1 in `contiki-conf.h`. + +You will then need to manually enter the boot loader and use the `.upload` make target (e.g. `make cc26xx-demo.upload` for the `cc26xx-demo`). On the SmartRF06, you enter the boot loader by resetting the EM (EM RESET button) while holding the `select` button. For the LaunchPad, you enter the bootloader by resetting the chip while holding `BTN_1`. It is possible to change the pin and its corresponding level (High/Low) that will trigger bootloader mode by changing `SET_CCFG_BL_CONFIG_BL_LEVEL` and `SET_CCFG_BL_CONFIG_BL_PIN_NUMBER` in `board.h`. + +The serial uploader script will automatically pick the first available serial port. If this is not the port where your node is connected, you can force the script to use a specific port by defining the `PORT` argument eg. `make cc26xx-demo.upload PORT=/dev/tty.usbserial`. + +For more information on the serial bootloader, see its README under the `tools/cc2538-bsl` directory. + CC13xx/CC26xx Border Router over UART ===================================== The platform code can be used as a border router (SLIP over UART) by using the example under `examples/ipv6/rpl-border-router`. This example defines the following: - #ifndef UIP_CONF_BUFFER_SIZE #define UIP_CONF_BUFFER_SIZE 140 #endif @@ -234,3 +242,5 @@ The chip will come out of low power mode by one of the following events: is an AON RTC Channel 2 compare interrupt. * Rtimer triggers, as part of ContikiMAC's sleep/wake-up cycles. The rtimer sits on the AON RTC channel 0. + +[smart-rf-flashprog]: http://www.ti.com/tool/flash-programmer "SmartRF Flash Programmer" diff --git a/platform/srf06-cc26xx/contiki-conf.h b/platform/srf06-cc26xx/contiki-conf.h index d756977c8..eff879af5 100644 --- a/platform/srf06-cc26xx/contiki-conf.h +++ b/platform/srf06-cc26xx/contiki-conf.h @@ -288,6 +288,19 @@ #endif /** @} */ /*---------------------------------------------------------------------------*/ +/** + * \name ROM Bootloader configuration + * + * Enable/Disable the ROM bootloader in your image, if the board supports it. + * Look in board.h to choose the DIO and corresponding level that will cause + * the chip to enter bootloader mode. + * @{ + */ +#ifndef ROM_BOOTLOADER_ENABLE +#define ROM_BOOTLOADER_ENABLE 0 +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ /** * \name Button configurations * diff --git a/platform/srf06-cc26xx/launchpad/cc1310/board.h b/platform/srf06-cc26xx/launchpad/cc1310/board.h index d6cfeeedb..9c750e0f9 100644 --- a/platform/srf06-cc26xx/launchpad/cc1310/board.h +++ b/platform/srf06-cc26xx/launchpad/cc1310/board.h @@ -150,6 +150,28 @@ #define BOARD_IOID_SDA IOID_5 /** @} */ /*---------------------------------------------------------------------------*/ +/** + * \brief ROM bootloader configuration + * + * Change SET_CCFG_BL_CONFIG_BL_PIN_NUMBER to BOARD_IOID_KEY_xyz to select + * which button triggers the bootloader on reset. + * + * The remaining values are not meant to be modified by the user + * @{ + */ +#if ROM_BOOTLOADER_ENABLE +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0xC5 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x00 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER BOARD_IOID_KEY_LEFT +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xC5 +#else +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0x00 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x01 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER 0xFF +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xFF +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ /** * \brief Remaining pins * diff --git a/platform/srf06-cc26xx/launchpad/cc2650/board.h b/platform/srf06-cc26xx/launchpad/cc2650/board.h index a65ca5361..d71896c3c 100644 --- a/platform/srf06-cc26xx/launchpad/cc2650/board.h +++ b/platform/srf06-cc26xx/launchpad/cc2650/board.h @@ -150,6 +150,28 @@ #define BOARD_IOID_SDA IOID_5 /** @} */ /*---------------------------------------------------------------------------*/ +/** + * \brief ROM bootloader configuration + * + * Change SET_CCFG_BL_CONFIG_BL_PIN_NUMBER to BOARD_IOID_KEY_xyz to select + * which button triggers the bootloader on reset. + * + * The remaining values are not meant to be modified by the user + * @{ + */ +#if ROM_BOOTLOADER_ENABLE +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0xC5 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x00 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER BOARD_IOID_KEY_LEFT +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xC5 +#else +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0x00 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x01 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER 0xFF +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xFF +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ /** * \brief Remaining pins * diff --git a/platform/srf06-cc26xx/srf06/cc13xx/board.h b/platform/srf06-cc26xx/srf06/cc13xx/board.h index eff486fc5..831c2ee33 100644 --- a/platform/srf06-cc26xx/srf06/cc13xx/board.h +++ b/platform/srf06-cc26xx/srf06/cc13xx/board.h @@ -227,6 +227,28 @@ #define BOARD_ACC_MISO BOARD_SPI_MISO /** @} */ /*---------------------------------------------------------------------------*/ +/** + * \brief ROM bootloader configuration + * + * Change SET_CCFG_BL_CONFIG_BL_PIN_NUMBER to BOARD_IOID_KEY_xyz to select + * which button triggers the bootloader on reset. + * + * The remaining values are not meant to be modified by the user + * @{ + */ +#if ROM_BOOTLOADER_ENABLE +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0xC5 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x00 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER BOARD_IOID_KEY_SELECT +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xC5 +#else +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0x00 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x01 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER 0xFF +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xFF +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ /** * \name Device string used on startup * @{ diff --git a/platform/srf06-cc26xx/srf06/cc26xx/board.h b/platform/srf06-cc26xx/srf06/cc26xx/board.h index 3dd064bc3..35080aea9 100644 --- a/platform/srf06-cc26xx/srf06/cc26xx/board.h +++ b/platform/srf06-cc26xx/srf06/cc26xx/board.h @@ -227,6 +227,28 @@ #define BOARD_ACC_MISO BOARD_SPI_MISO /** @} */ /*---------------------------------------------------------------------------*/ +/** + * \brief ROM bootloader configuration + * + * Change SET_CCFG_BL_CONFIG_BL_PIN_NUMBER to BOARD_IOID_KEY_xyz to select + * which button triggers the bootloader on reset. + * + * The remaining values are not meant to be modified by the user + * @{ + */ +#if ROM_BOOTLOADER_ENABLE +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0xC5 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x00 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER BOARD_IOID_KEY_SELECT +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xC5 +#else +#define SET_CCFG_BL_CONFIG_BOOTLOADER_ENABLE 0x00 +#define SET_CCFG_BL_CONFIG_BL_LEVEL 0x01 +#define SET_CCFG_BL_CONFIG_BL_PIN_NUMBER 0xFF +#define SET_CCFG_BL_CONFIG_BL_ENABLE 0xFF +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ /** * \name Device string used on startup * @{ From 9839b91be54114233a2bf8f1b1e6b3c7817d853a Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 26 Jun 2016 00:58:48 +0100 Subject: [PATCH 256/345] Enable the ROM bootloader in our examples --- examples/cc26xx/cc26xx-web-demo/project-conf.h | 3 +++ examples/cc26xx/project-conf.h | 3 +++ examples/cc26xx/very-sleepy-demo/project-conf.h | 3 +++ 3 files changed, 9 insertions(+) diff --git a/examples/cc26xx/cc26xx-web-demo/project-conf.h b/examples/cc26xx/cc26xx-web-demo/project-conf.h index ee77b125f..d40fc9313 100644 --- a/examples/cc26xx/cc26xx-web-demo/project-conf.h +++ b/examples/cc26xx/cc26xx-web-demo/project-conf.h @@ -42,6 +42,9 @@ #define CC26XX_WEB_DEMO_CONF_COAP_SERVER 1 #define CC26XX_WEB_DEMO_CONF_NET_UART 1 /*---------------------------------------------------------------------------*/ +/* Enable the ROM bootloader */ +#define ROM_BOOTLOADER_ENABLE 1 +/*---------------------------------------------------------------------------*/ /* * Shrink the size of the uIP buffer, routing table and ND cache. * Set the TCP MSS diff --git a/examples/cc26xx/project-conf.h b/examples/cc26xx/project-conf.h index 7c1363c16..fc2d23ab1 100644 --- a/examples/cc26xx/project-conf.h +++ b/examples/cc26xx/project-conf.h @@ -34,6 +34,9 @@ /* Disable button shutdown functionality */ #define BUTTON_SENSOR_CONF_ENABLE_SHUTDOWN 0 /*---------------------------------------------------------------------------*/ +/* Enable the ROM bootloader */ +#define ROM_BOOTLOADER_ENABLE 1 +/*---------------------------------------------------------------------------*/ /* Change to match your configuration */ #define IEEE802154_CONF_PANID 0xABCD #define RF_CORE_CONF_CHANNEL 25 diff --git a/examples/cc26xx/very-sleepy-demo/project-conf.h b/examples/cc26xx/very-sleepy-demo/project-conf.h index 477a535bf..8e58e12da 100644 --- a/examples/cc26xx/very-sleepy-demo/project-conf.h +++ b/examples/cc26xx/very-sleepy-demo/project-conf.h @@ -35,6 +35,9 @@ #define IEEE802154_CONF_PANID 0xABCD #define RF_CORE_CONF_CHANNEL 25 /*---------------------------------------------------------------------------*/ +/* Enable the ROM bootloader */ +#define ROM_BOOTLOADER_ENABLE 1 +/*---------------------------------------------------------------------------*/ /* For very sleepy operation */ #define RF_BLE_CONF_ENABLED 0 #define UIP_DS6_CONF_PERIOD CLOCK_SECOND From dc1f9fe010f8967d895fdfbcf1fe4570ef2fe5a2 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 26 Jun 2016 01:02:10 +0100 Subject: [PATCH 257/345] Simplify MODESEL value determination --- cpu/cc26xx-cc13xx/rf-core/rf-core.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/cpu/cc26xx-cc13xx/rf-core/rf-core.c b/cpu/cc26xx-cc13xx/rf-core/rf-core.c index fa4438415..8fc9541f6 100644 --- a/cpu/cc26xx-cc13xx/rf-core/rf-core.c +++ b/cpu/cc26xx-cc13xx/rf-core/rf-core.c @@ -371,26 +371,17 @@ uint8_t rf_core_set_modesel() { uint8_t rv = RF_CORE_CMD_ERROR; + ChipType_t chip_type = ti_lib_chipinfo_get_chip_type(); - if(ti_lib_chipinfo_chip_family_is_cc26xx()) { - if(ti_lib_chipinfo_supports_ble() == true && - ti_lib_chipinfo_supports_ieee_802_15_4() == true) { - /* CC2650 */ - HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE5; - rv = RF_CORE_CMD_OK; - } else if(ti_lib_chipinfo_supports_ble() == false && - ti_lib_chipinfo_supports_ieee_802_15_4() == true) { - /* CC2630 */ - HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE2; - rv = RF_CORE_CMD_OK; - } - } else if(ti_lib_chipinfo_chip_family_is_cc13xx()) { - if(ti_lib_chipinfo_supports_ble() == false && - ti_lib_chipinfo_supports_ieee_802_15_4() == false) { - /* CC1310 */ - HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE3; - rv = RF_CORE_CMD_OK; - } + if(chip_type == CHIP_TYPE_CC2650) { + HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE5; + rv = RF_CORE_CMD_OK; + } else if(chip_type == CHIP_TYPE_CC2630) { + HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE2; + rv = RF_CORE_CMD_OK; + } else if(chip_type == CHIP_TYPE_CC1310) { + HWREG(PRCM_BASE + PRCM_O_RFCMODESEL) = PRCM_RFCMODESEL_CURR_MODE3; + rv = RF_CORE_CMD_OK; } return rv; From fd826037865e90b8baa4b7fced21c889cf7d4d46 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 20:23:14 +0100 Subject: [PATCH 258/345] Update CC13xxware to v2.04.02.17240 --- cpu/cc26xx-cc13xx/lib/cc13xxware | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpu/cc26xx-cc13xx/lib/cc13xxware b/cpu/cc26xx-cc13xx/lib/cc13xxware index 6bdb6da3f..f7bdc4302 160000 --- a/cpu/cc26xx-cc13xx/lib/cc13xxware +++ b/cpu/cc26xx-cc13xx/lib/cc13xxware @@ -1 +1 @@ -Subproject commit 6bdb6da3fa9682303799e5c3b1f755398e87fc99 +Subproject commit f7bdc430225db8f9204c3f02faddd7f8f8752fe8 From eec890d60ee0fc8f36bd342d5fdfc86593a9141f Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sat, 11 Jun 2016 20:23:40 +0100 Subject: [PATCH 259/345] Update CC26xxware to v2.24.02.17202 --- cpu/cc26xx-cc13xx/lib/cc26xxware | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpu/cc26xx-cc13xx/lib/cc26xxware b/cpu/cc26xx-cc13xx/lib/cc26xxware index 0270b50ac..0e8396b97 160000 --- a/cpu/cc26xx-cc13xx/lib/cc26xxware +++ b/cpu/cc26xx-cc13xx/lib/cc26xxware @@ -1 +1 @@ -Subproject commit 0270b50ac750f8f3348a98f900a470e7a65ffce8 +Subproject commit 0e8396b97921049575763dff45d564ff2cf6d0d6 From e7c5c3609050adef2de9add0bd6403fc5aa54552 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 26 Jun 2016 02:00:20 +0100 Subject: [PATCH 260/345] Change CCxxware submodule URLs We now host both CCxxware repos under contiki-os, so we change the submodule URLs accordingly. --- .gitmodules | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 29e886554..af65c1bda 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,10 +6,10 @@ url = https://github.com/JelmerT/cc2538-bsl.git [submodule "cpu/cc26xx-cc13xx/lib/cc26xxware"] path = cpu/cc26xx-cc13xx/lib/cc26xxware - url = https://github.com/g-oikonomou/cc26xxware.git + url = https://github.com/contiki-os/cc26xxware.git [submodule "cpu/cc26xx-cc13xx/lib/cc13xxware"] path = cpu/cc26xx-cc13xx/lib/cc13xxware - url = https://github.com/g-oikonomou/cc13xxware.git + url = https://github.com/contiki-os/cc13xxware.git [submodule "platform/stm32nucleo-spirit1/stm32cube-lib"] path = platform/stm32nucleo-spirit1/stm32cube-lib url = https://github.com/STclab/stm32nucleo-spirit1-lib From 94413f99fef055578a60f3d1ef6f9855ba2220f0 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 17 Jul 2016 01:31:21 +0100 Subject: [PATCH 261/345] Shrink ND cache and routing table for the CC26xx web demo --- examples/cc26xx/cc26xx-web-demo/project-conf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cc26xx/cc26xx-web-demo/project-conf.h b/examples/cc26xx/cc26xx-web-demo/project-conf.h index d40fc9313..adf2f1427 100644 --- a/examples/cc26xx/cc26xx-web-demo/project-conf.h +++ b/examples/cc26xx/cc26xx-web-demo/project-conf.h @@ -50,8 +50,8 @@ * Set the TCP MSS */ #define UIP_CONF_BUFFER_SIZE 900 -#define NBR_TABLE_CONF_MAX_NEIGHBORS 8 -#define UIP_CONF_MAX_ROUTES 8 +#define NBR_TABLE_CONF_MAX_NEIGHBORS 5 +#define UIP_CONF_MAX_ROUTES 5 #define UIP_CONF_TCP_MSS 128 /*---------------------------------------------------------------------------*/ #endif /* PROJECT_CONF_H_ */ From b5bc140680805d8cf2b82566fbbc9796eaf6a593 Mon Sep 17 00:00:00 2001 From: "Kitty(chun hua) Jiang" Date: Mon, 18 Jul 2016 17:29:16 +0800 Subject: [PATCH 262/345] Update comments: RFC3513 is obsoleted by RFC4921 --- core/net/ip/uip-debug.c | 4 ++-- core/net/ip/uip.h | 6 +++--- doc/uip6-doc.txt | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) mode change 100644 => 100755 core/net/ip/uip-debug.c mode change 100644 => 100755 core/net/ip/uip.h mode change 100644 => 100755 doc/uip6-doc.txt diff --git a/core/net/ip/uip-debug.c b/core/net/ip/uip-debug.c old mode 100644 new mode 100755 index 7804ba4db..737c7d5dc --- a/core/net/ip/uip-debug.c +++ b/core/net/ip/uip-debug.c @@ -56,7 +56,7 @@ uip_debug_ipaddr_print(const uip_ipaddr_t *addr) #if NETSTACK_CONF_WITH_IPV6 if(ip64_addr_is_ipv4_mapped_addr(addr)) { /* - * Printing IPv4-mapped addresses is done according to RFC 3513 [1] + * Printing IPv4-mapped addresses is done according to RFC 4291 [1] * * "An alternative form that is sometimes more * convenient when dealing with a mixed environment @@ -67,7 +67,7 @@ uip_debug_ipaddr_print(const uip_ipaddr_t *addr) * low-order 8-bit pieces of the address (standard * IPv4 representation)." * - * [1] https://tools.ietf.org/html/rfc3513#page-5 + * [1] https://tools.ietf.org/html/rfc4291#page-4 */ PRINTA("::FFFF:%u.%u.%u.%u", addr->u8[12], addr->u8[13], addr->u8[14], addr->u8[15]); } else { diff --git a/core/net/ip/uip.h b/core/net/ip/uip.h old mode 100644 new mode 100755 index 12d77ff10..dd41b25f0 --- a/core/net/ip/uip.h +++ b/core/net/ip/uip.h @@ -2012,7 +2012,7 @@ CCIF extern uip_lladdr_t uip_lladdr; (((a)->u8[15]) == 0x02)) /** - * \brief is addr (a) a link local unicast address, see RFC3513 + * \brief is addr (a) a link local unicast address, see RFC 4291 * i.e. is (a) on prefix FE80::/10 * a is of type uip_ipaddr_t* */ @@ -2036,7 +2036,7 @@ CCIF extern uip_lladdr_t uip_lladdr; } while(0) /** - * \brief is addr (a) a solicited node multicast address, see RFC3513 + * \brief is addr (a) a solicited node multicast address, see RFC 4291 * a is of type uip_ipaddr_t* */ #define uip_is_addr_solicited_node(a) \ @@ -2097,7 +2097,7 @@ CCIF extern uip_lladdr_t uip_lladdr; #endif /*UIP_CONF_LL_802154*/ /** - * \brief is address a multicast address, see RFC 3513 + * \brief is address a multicast address, see RFC 4291 * a is of type uip_ipaddr_t* * */ #define uip_is_addr_mcast(a) \ diff --git a/doc/uip6-doc.txt b/doc/uip6-doc.txt old mode 100644 new mode 100755 index 492337f25..916196765 --- a/doc/uip6-doc.txt +++ b/doc/uip6-doc.txt @@ -339,7 +339,7 @@ We will soon support RFC4944 transmission of IPv6 packets over 802.15.4\n \li Path MTU Discovery RFC 1981 (SHOULD): no support \li Jumbograms RFC 2675 (MAY): no support \li ICMPv6 RFC 4443 (MUST): full support -\li IPv6 addressing architecture RFC 3513 (MUST): full support +\li IPv6 addressing architecture RFC 4291 (MUST): full support \li Privacy extensions for address autoconfiguration RFC 3041 (SHOULD): no support. \li Default Address Selection RFC 3484 (MUST): full support. \li MLDv1 (RFC 2710) and MLDv2 (RFC 3810) (conditional MUST applying here): no support. As we run IPv6 over Multicast or broadcast capable links (Ethernet or 802.15.4), the conditional MUST applies. We should be able to send an MLD report when joining a solicited node multicast group at address configuration time. This will be available in a later release. From 6dfd358821e32dc9c9df1464667c2ab06931b31d Mon Sep 17 00:00:00 2001 From: Sumankumar Panchal Date: Sun, 12 Jun 2016 20:46:17 +0530 Subject: [PATCH 263/345] TSCH port for CC2538 based platforms. --- core/net/mac/tsch/README.md | 5 +++-- examples/ipv6/rpl-tsch/project-conf.h | 6 ++++++ platform/cc2538dk/contiki-conf.h | 2 -- platform/openmote-cc2538/contiki-conf.h | 6 ++++++ platform/zoul/contiki-conf.h | 2 -- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/net/mac/tsch/README.md b/core/net/mac/tsch/README.md index 0b7c54ef3..97b433e4b 100644 --- a/core/net/mac/tsch/README.md +++ b/core/net/mac/tsch/README.md @@ -38,6 +38,7 @@ It has been tested on the following platforms: * Zolertia Z1 (`z1`, tested in cooja only) * CC2538DK (`cc2538dk`, tested on hardware) * Zolertia Zoul (`zoul`, tested on hardware) + * OpenMote-CC2538 (`openmote-cc2538`, tested on hardware) * CC2650 (`srf06-cc26xx`, tested on hardware) This implementation was present at the ETSI Plugtest @@ -79,7 +80,7 @@ Orchestra is implemented in: A simple TSCH+RPL example is included under `examples/ipv6/rpl-tsch`. To use TSCH, first make sure your platform supports it. -Currently, `jn516x`, `sky`, `z1`, `cc2538dk`, `zoul` and `srf06-cc26xx` are the supported platforms. +Currently, `jn516x`, `sky`, `z1`, `cc2538dk`, `zoul`, `openmote-cc2538`, and `srf06-cc26xx` are the supported platforms. To add your own, we refer the reader to the next section. To add TSCH to your application, first include the TSCH module from your makefile with: @@ -165,7 +166,7 @@ Finally, one can also implement his own scheduler, centralized or distributed, b ## Porting TSCH to a new platform Porting TSCH to a new platform requires a few new features in the radio driver, a number of timing-related configuration paramters. -The easiest is probably to start from one of the existing port: `jn516x`, `sky`, `z1`, `cc2538dk`, `zoul`, `srf06-cc26xx`. +The easiest is probably to start from one of the existing port: `jn516x`, `sky`, `z1`, `cc2538dk`, `zoul`, `openmote-cc2538`, `srf06-cc26xx`. ### Radio features required for TSCH diff --git a/examples/ipv6/rpl-tsch/project-conf.h b/examples/ipv6/rpl-tsch/project-conf.h index 8ac0a93b6..36f4a8a72 100644 --- a/examples/ipv6/rpl-tsch/project-conf.h +++ b/examples/ipv6/rpl-tsch/project-conf.h @@ -164,4 +164,10 @@ #endif /* CONTIKI_TARGET_Z1 */ +#if CONTIKI_TARGET_CC2538DK || CONTIKI_TARGET_ZOUL || \ + CONTIKI_TARGET_OPENMOTE_CC2538 +#define TSCH_CONF_HW_FRAME_FILTERING 0 +#endif /* CONTIKI_TARGET_CC2538DK || CONTIKI_TARGET_ZOUL \ + || CONTIKI_TARGET_OPENMOTE_CC2538 */ + #endif /* __PROJECT_CONF_H__ */ diff --git a/platform/cc2538dk/contiki-conf.h b/platform/cc2538dk/contiki-conf.h index c6f0e2b6a..d1a10811f 100644 --- a/platform/cc2538dk/contiki-conf.h +++ b/platform/cc2538dk/contiki-conf.h @@ -40,8 +40,6 @@ typedef uint32_t rtimer_clock_t; #define RTIMER_CLOCK_DIFF(a,b) ((int32_t)((a)-(b))) /** @} */ /*---------------------------------------------------------------------------*/ -#define TSCH_CONF_HW_FRAME_FILTERING 0 - /* 352us from calling transmit() until the SFD byte has been sent */ #define RADIO_DELAY_BEFORE_TX ((unsigned)US_TO_RTIMERTICKS(352)) /* 192us as in datasheet but ACKs are not always received, so adjusted to 250us */ diff --git a/platform/openmote-cc2538/contiki-conf.h b/platform/openmote-cc2538/contiki-conf.h index 87b58f299..543d3a5e5 100644 --- a/platform/openmote-cc2538/contiki-conf.h +++ b/platform/openmote-cc2538/contiki-conf.h @@ -79,6 +79,12 @@ typedef uint32_t rtimer_clock_t; #define RTIMER_CLOCK_DIFF(a, b) ((int32_t)((a) - (b))) /** @} */ /*---------------------------------------------------------------------------*/ +/* 352us from calling transmit() until the SFD byte has been sent */ +#define RADIO_DELAY_BEFORE_TX ((unsigned)US_TO_RTIMERTICKS(352)) +/* 192us as in datasheet but ACKs are not always received, so adjusted to 250us */ +#define RADIO_DELAY_BEFORE_RX ((unsigned)US_TO_RTIMERTICKS(250)) +#define RADIO_DELAY_BEFORE_DETECT 0 +/*---------------------------------------------------------------------------*/ /** * \name Serial Boot Loader Backdoor configuration * diff --git a/platform/zoul/contiki-conf.h b/platform/zoul/contiki-conf.h index 59463f691..6bdae897a 100644 --- a/platform/zoul/contiki-conf.h +++ b/platform/zoul/contiki-conf.h @@ -77,8 +77,6 @@ typedef uint32_t rtimer_clock_t; #define RTIMER_CLOCK_DIFF(a, b) ((int32_t)((a) - (b))) /** @} */ /*---------------------------------------------------------------------------*/ -#define TSCH_CONF_HW_FRAME_FILTERING 0 - /* 352us from calling transmit() until the SFD byte has been sent */ #define RADIO_DELAY_BEFORE_TX ((unsigned)US_TO_RTIMERTICKS(352)) /* 192us as in datasheet but ACKs are not always received, so adjusted to 250us */ From 3bb58b7c82967d45c692758176a7fcbe8ea82393 Mon Sep 17 00:00:00 2001 From: Sumankumar Panchal Date: Fri, 22 Jul 2016 22:33:10 +0530 Subject: [PATCH 264/345] Minor data type correction. --- cpu/cc2538/dev/i2c.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpu/cc2538/dev/i2c.c b/cpu/cc2538/dev/i2c.c index 76cac20f8..34537a08f 100644 --- a/cpu/cc2538/dev/i2c.c +++ b/cpu/cc2538/dev/i2c.c @@ -171,7 +171,7 @@ i2c_single_send(uint8_t slave_addr, uint8_t data) uint8_t i2c_single_receive(uint8_t slave_addr, uint8_t *data) { - uint32_t temp; + uint8_t temp; i2c_master_set_slave_address(slave_addr, I2C_RECEIVE); i2c_master_command(I2C_MASTER_CMD_SINGLE_RECEIVE); From 8ab0522cecb7a5a0f2e3a4124464065c2d023a13 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:34:43 +0100 Subject: [PATCH 265/345] Fix PROP mode channel switching If `NETSTACK_CONF_RADIO.set_value(RADIO_PARAM_CHANNEL, ...)` is called when radio is on, it will fail to apply the channel change, because it won't re-send `CMD_PROP_RADIO_DIV_SETUP` and `CMD_PROP_FS`. This commit fixes this condition, by making sure the correct commands are sent to the radio. --- cpu/cc26xx-cc13xx/rf-core/prop-mode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c index 94aef33b9..e5d78b92b 100644 --- a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c +++ b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c @@ -1104,7 +1104,7 @@ set_value(radio_param_t param, radio_value_t value) rv = RADIO_RESULT_ERROR; } - if(rx_on_prop() != RF_CORE_CMD_OK) { + if(soft_on_prop() != RF_CORE_CMD_OK) { PRINTF("set_value: rx_on_prop() failed\n"); rv = RADIO_RESULT_ERROR; } From e37c522c2f5de00a93b49c457bf573c50a2589ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= Date: Tue, 26 Jul 2016 15:21:34 +0200 Subject: [PATCH 266/345] =?UTF-8?q?core/net/rpl:=20Fix=20more=20function?= =?UTF-8?q?=20declaration=20isn=E2=80=99t=20a=20prototype?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/net/rpl/rpl-ns.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/net/rpl/rpl-ns.h b/core/net/rpl/rpl-ns.h index 66f911f77..96c05dedb 100644 --- a/core/net/rpl/rpl-ns.h +++ b/core/net/rpl/rpl-ns.h @@ -67,6 +67,6 @@ rpl_ns_node_t *rpl_ns_node_next(rpl_ns_node_t *item); rpl_ns_node_t *rpl_ns_get_node(const rpl_dag_t *dag, const uip_ipaddr_t *addr); int rpl_ns_is_node_reachable(const rpl_dag_t *dag, const uip_ipaddr_t *addr); void rpl_ns_get_node_global_addr(uip_ipaddr_t *addr, rpl_ns_node_t *node); -void rpl_ns_periodic(); +void rpl_ns_periodic(void); #endif /* RPL_NS_H */ From 520117b188b1dfc3ee29798757f395eb47b149a1 Mon Sep 17 00:00:00 2001 From: marcas756 Date: Sat, 30 Jul 2016 12:57:09 +0200 Subject: [PATCH 267/345] Make set_bits_in_byte() static (like for get_bits_in_byte) --- core/net/rime/chameleon-bitopt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/net/rime/chameleon-bitopt.c b/core/net/rime/chameleon-bitopt.c index 78bb58ebc..f659b312b 100644 --- a/core/net/rime/chameleon-bitopt.c +++ b/core/net/rime/chameleon-bitopt.c @@ -169,7 +169,7 @@ header_size(const struct packetbuf_attrlist *a) return size; } /*---------------------------------------------------------------------------*/ -void CC_INLINE +static void CC_INLINE set_bits_in_byte(uint8_t *target, int bitpos, uint8_t val, int vallen) { unsigned short shifted_val; From 836fa4d6fafe9fa4f5d33ca561642321dcc2a28d Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Sun, 31 Jul 2016 17:03:42 -0700 Subject: [PATCH 268/345] galileo: Build link-stats.c when IPv6 is enabled This is required by the IPv6 implementation in Contiki OS. --- platform/galileo/Makefile.galileo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/galileo/Makefile.galileo b/platform/galileo/Makefile.galileo index 8be977bc8..daada587a 100644 --- a/platform/galileo/Makefile.galileo +++ b/platform/galileo/Makefile.galileo @@ -8,7 +8,7 @@ CONTIKI_TARGET_MAIN = ${addprefix $(OBJECTDIR)/,contiki-main.o} CONTIKI_SOURCEFILES += contiki-main.c clock.c rtimer-arch.c gpio-pcal9535a.c pwm-pca9685.c galileo-pinmux.c eth-proc.c eth-conf.c ifeq ($(CONTIKI_WITH_IPV6),1) - CONTIKI_SOURCEFILES += nbr-table.c packetbuf.c linkaddr.c + CONTIKI_SOURCEFILES += nbr-table.c packetbuf.c linkaddr.c link-stats.c endif PROJECT_SOURCEFILES += newlib-syscalls.c From e4241fbeb9fa77bcf702f10030888df22ee0f891 Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Tue, 2 Aug 2016 18:07:20 +0200 Subject: [PATCH 269/345] Updated TSCH readme --- core/net/mac/tsch/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/net/mac/tsch/README.md b/core/net/mac/tsch/README.md index 97b433e4b..fc07f4007 100644 --- a/core/net/mac/tsch/README.md +++ b/core/net/mac/tsch/README.md @@ -11,6 +11,7 @@ which defines how to run a basic RPL+TSCH network. It was developped by: * Simon Duquennoy, SICS, simonduq@sics.se, github user: [simonduq](https://github.com/simonduq) * Beshr Al Nahas, SICS (now Chalmers University), beshr@chalmers.se, github user: [beshrns](https://github.com/beshrns) +* Atis Elsts, Univ. Bristol, atis.elsts@bristol.ac.uk, github user: [atiselsts](https://github.com/atiselsts) You can find an extensive evaluation of this implementation in our paper [*Orchestra: Robust Mesh Networks Through Autonomously Scheduled TSCH*](http://www.simonduquennoy.net/papers/duquennoy15orchestra.pdf), ACM SenSys'15. @@ -31,6 +32,7 @@ This implementation includes: * A scheduling API to add/remove slotframes and links * A system for logging from TSCH timeslot operation interrupt, with postponed printout * Orchestra: an autonomous scheduler for TSCH+RPL networks + * A drift compensation mechanism It has been tested on the following platforms: * NXP JN516x (`jn516x`, tested on hardware) @@ -72,6 +74,7 @@ Implements the 6TiSCH minimal configuration K1-K2 keys pair. * `tsch-rpl.[ch]`: used for TSCH+RPL networks, to align TSCH and RPL states (preferred parent -> time source, rank -> join priority) as defined in the 6TiSCH minimal configuration. * `tsch-log.[ch]`: logging system for TSCH, including delayed messages for logging from slot operation interrupt. +* `tsch-adaptive-timesync.c`: used to learn the relative drift to the node's time source and automatically compensate for it. Orchestra is implemented in: * `apps/orchestra`: see `apps/orchestra/README.md` for more information. @@ -200,6 +203,8 @@ too slow for the default 10ms timeslots. 1. [IEEE 802.15.4e-2012 ammendment][ieee802.15.4e-2012] 2. [IETF 6TiSCH Working Group][ietf-6tisch-wg] +3. [A test procedure for Contiki timers in TSCH][tsch-sync-test] [ieee802.15.4e-2012]: http://standards.ieee.org/getieee802/download/802.15.4e-2012.pdf [ietf-6tisch-wg]: https://datatracker.ietf.org/wg/6tisch +[tsch-sync-test]: https://github.com/abbypjoby/Contiki-Synchronisation-Test From e50b73c9b1862a772a12bfc5c829343cb17581c4 Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Sun, 31 Jul 2016 15:14:13 -0700 Subject: [PATCH 270/345] galileo: Add support for containerized build environment This patch adds a Dockerfile for building a container configured as a build environment for Intel Galileo boards. This patch also provides documentation for using the containerized build environment. Finally, it streamlines the instructions for booting Contiki on Galileo and includes other documentation refinements. --- platform/galileo/README.md | 107 ++++++++++++++++++------- platform/galileo/bsp/docker/Dockerfile | 8 ++ 2 files changed, 88 insertions(+), 27 deletions(-) create mode 100644 platform/galileo/bsp/docker/Dockerfile diff --git a/platform/galileo/README.md b/platform/galileo/README.md index e441876db..529739ea8 100644 --- a/platform/galileo/README.md +++ b/platform/galileo/README.md @@ -47,13 +47,59 @@ Standard APIs: Optional support for protection domains is also implemented and is described in cpu/x86/mm/README.md. -Building --------- +Preparation +----------- Prerequisites on all Ubuntu Linux systems include texinfo and uuid-dev. Additional prerequisites on 64-bit Ubuntu Linux systems include gcc-multilib and g++-multilib. +Docker can optionally be used to prepare an Ubuntu-based, containerized build +environment. This has been tested with Docker installed on Microsoft Windows 10. + +If not using a containerized environment, proceed to the "Building" section +below. + +Using a Docker-based environment on Windows requires that the repository has +been checked out with Git configured to preserve UNIX-style line endings. This +can be accomplished by changing the 'core.autocrlf' setting prior to cloning +the repository [5]: +``` +git config --global core.autocrlf input +``` +Note that this is a global setting, so it may affect other Git operations. + +The drive containing the repository needs to be shared with Docker containers +for the following steps to work [6]. Note that this is a global setting that +affects other containers that may be present on the host. + +Open Microsoft PowerShell and navigate to the base directory of the repository. +Run the following command to create the build environment: +``` +docker build -t contiki-galileo-build platform/galileo/bsp/docker +``` +This creates a container named 'contiki-galileo-build' based on Ubuntu and +installs development tools in the container. + +The build commands shown below can be run within the newly-created container. To +obtain a shell, run the following command in PowerShell from the base directory +of the repository. +``` +docker run -t -i -v ${Pwd}:/contiki contiki-galileo-build +``` +This command mounts the current directory and its subdirectories at the path +'/contiki' within the container. Changes to those files in the container are +visible to the host and vice versa. However, changes to the container +filesystem are not automatically persisted when the container is stopped. + +The containerized build environment does not currently support building the Grub +bootloader nor debugging using the instructions in this document. + +See the Docker Overview for more information about working with containers [7]. + +Building +-------- + To build applications for this platform you should first build newlib (in case it wasn't already built). To build newlib you can run the following command: @@ -98,9 +144,11 @@ the IMRs. Running ------- -In order to boot the Contiki image, you will need a multiboot-compliant -bootloader. In the bsp directory, we provide a helper script which builds the -Grub bootloader with multiboot support. To build the bootloader, just run the +You will need a multiboot-compliant bootloader to boot Contiki images in that +format. However, this is not needed for booting UEFI images. + +In the bsp directory, we provide a helper script which builds the Grub +bootloader with multiboot support. To build the bootloader, just run the following command: ``` $ platform/galileo/bsp/grub/build_grub.sh @@ -112,8 +160,18 @@ detailed instructions. ### Prepare SDcard +The instructions in this section are for a native Linux development environment, +so equivalent operations should be substituted when using some other environment +(e.g. Windows Explorer can be used to perform equivalent operations when using +Docker on Windows as a development environment). + Mount the sdcard in directory /mnt/sdcard. +Create UEFI boot directory: +``` +$ mkdir -p /mnt/sdcard/efi/boot +``` + #### Approach for Multiboot-compliant ELF Image Copy Contiki binary image to sdcard @@ -123,14 +181,14 @@ $ cp examples/hello-world/hello-world.galileo /mnt/sdcard Copy grub binary to sdcard ``` -$ cp platform/galileo/bsp/grub/bin/grub.efi /mnt/sdcard +$ cp platform/galileo/bsp/grub/bin/grub.efi /mnt/sdcard/efi/boot/bootia32.efi ``` #### Approach for UEFI Image -Copy Contiki binary image to sdcard +Copy Contiki binary image to sdcard: ``` -$ cp examples/hello-world/hello-world.galileo.efi /mnt/sdcard +$ cp examples/hello-world/hello-world.galileo.efi /mnt/sdcard/efi/boot/bootia32.efi ``` ### Connect to the console output @@ -150,38 +208,27 @@ Press [Enter] to directly boot. Press [F7] to show boot menu options. ``` -Press and select the option "UEFI Internal Shell" within the menu. +Waiting for the system to select the default boot device may be sufficient. +However, if this does not boot Contiki or Grub (depending on what is installed +as the UEFI boot image) then perform the following procedure after rebooting +and waiting for the boot message to appear: Press and select the option +"UEFI Misc Device" within the menu. -#### Boot Multiboot-compliant ELF Image +No additional steps should be required to boot a Contiki UEFI image. -Once you have a shell, run the following commands to run grub application: -``` -$ fs0: -$ grub.efi -``` - -You'll reach the grub shell. Now run the following commands to boot Contiki -image: +Run the following additional commands to boot a multiboot-compliant image: ``` $ multiboot /hello-world.galileo $ boot ``` -#### Boot UEFI Image - -Once you have a shell, run the following commands to boot Contiki image: -``` -$ fs0: -$ hello-world.galileo.efi -``` - ### Verify that Contiki is Running This should boot the Contiki image, resulting in the following messages being sent to the serial console: ``` Starting Contiki -Hello World +Hello, world ``` Debugging @@ -224,3 +271,9 @@ References [3] https://www.gnu.org/software/grub/manual/multiboot/multiboot.html [4] http://www.uefi.org/ + +[5] https://www.git-scm.com/book/en/v2/Customizing-Git-Git-Configuration + +[6] https://docs.docker.com/docker-for-windows/#/shared-drives + +[7] https://docs.docker.com/engine/understanding-docker/ diff --git a/platform/galileo/bsp/docker/Dockerfile b/platform/galileo/bsp/docker/Dockerfile new file mode 100644 index 000000000..87fbe2cc0 --- /dev/null +++ b/platform/galileo/bsp/docker/Dockerfile @@ -0,0 +1,8 @@ +FROM ubuntu:16.04 +RUN apt-get update \ + && apt-get install -y \ + gcc-multilib g++-multilib git make patch texinfo uuid-dev wget \ + && rm -rf /var/lib/apt/lists/* +WORKDIR /contiki +ENV TARGET galileo +CMD ["/bin/bash", "-l"] From a3c8fe672402289b61a68e8d181eb2922d10021a Mon Sep 17 00:00:00 2001 From: Simon Duquennoy Date: Wed, 3 Aug 2016 16:00:31 +0200 Subject: [PATCH 271/345] Travis: remove all tests involving TSCH compilation on z1, which resulted in stochastic off-by-2-bytes linker errors --- regression-tests/01-compile-base/Makefile | 3 --- .../11-ipv6/{19-z1-rpl-tsch.csc => 19-z1-rpl-tsch.csc.flaky} | 0 ...tsch-orchestra.csc => 20-z1-rpl-tsch-orchestra.csc.flaky} | 0 ...l-tsch-security.csc => 21-z1-rpl-tsch-security.csc.flaky} | 0 regression-tests/18-compile-arm-ports/Makefile | 5 ++++- 5 files changed, 4 insertions(+), 4 deletions(-) rename regression-tests/11-ipv6/{19-z1-rpl-tsch.csc => 19-z1-rpl-tsch.csc.flaky} (100%) rename regression-tests/11-ipv6/{20-z1-rpl-tsch-orchestra.csc => 20-z1-rpl-tsch-orchestra.csc.flaky} (100%) rename regression-tests/11-ipv6/{21-z1-rpl-tsch-security.csc => 21-z1-rpl-tsch-security.csc.flaky} (100%) diff --git a/regression-tests/01-compile-base/Makefile b/regression-tests/01-compile-base/Makefile index bc38a9777..5ae452c36 100644 --- a/regression-tests/01-compile-base/Makefile +++ b/regression-tests/01-compile-base/Makefile @@ -35,9 +35,6 @@ wget/minimal-net \ zolertia/z1/z1 \ settings-example/avr-raven \ ipv6/multicast/sky \ -ipv6/rpl-tsch/z1 \ -ipv6/rpl-tsch/z1:MAKE_WITH_ORCHESTRA=1 \ -ipv6/rpl-tsch/z1:MAKE_WITH_SECURITY=1 \ cfs-coffee/sky \ cfs-coffee/z1 \ cfs-coffee/wismote \ diff --git a/regression-tests/11-ipv6/19-z1-rpl-tsch.csc b/regression-tests/11-ipv6/19-z1-rpl-tsch.csc.flaky similarity index 100% rename from regression-tests/11-ipv6/19-z1-rpl-tsch.csc rename to regression-tests/11-ipv6/19-z1-rpl-tsch.csc.flaky diff --git a/regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc b/regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc.flaky similarity index 100% rename from regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc rename to regression-tests/11-ipv6/20-z1-rpl-tsch-orchestra.csc.flaky diff --git a/regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc b/regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc.flaky similarity index 100% rename from regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc rename to regression-tests/11-ipv6/21-z1-rpl-tsch-security.csc.flaky diff --git a/regression-tests/18-compile-arm-ports/Makefile b/regression-tests/18-compile-arm-ports/Makefile index e0addfa9f..e6e3c581f 100644 --- a/regression-tests/18-compile-arm-ports/Makefile +++ b/regression-tests/18-compile-arm-ports/Makefile @@ -49,7 +49,10 @@ udp-ipv6/stm32nucleo-spirit1 \ hello-world/stm32nucleo-spirit1 \ cfs-coffee/cc2538dk \ cfs-coffee/openmote-cc2538 \ -cfs-coffee/zoul +cfs-coffee/zoul \ +ipv6/rpl-tsch/zoul \ +ipv6/rpl-tsch/zoul:MAKE_WITH_ORCHESTRA=1 \ +ipv6/rpl-tsch/zoul:MAKE_WITH_SECURITY=1 TOOLS= From 31ad67abd71bd044ab80a66534f3995fd10f3edc Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Wed, 3 Aug 2016 07:58:51 -0700 Subject: [PATCH 272/345] x86: Support configurable UART baud rate This patch extends the Intel Quark X1000 SoC UART initialization API to accept a numeric baud rate specification. --- cpu/x86/drivers/quarkX1000/uart.c | 13 ++++++++----- cpu/x86/drivers/quarkX1000/uart.h | 2 +- platform/galileo/contiki-main.c | 6 ++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cpu/x86/drivers/quarkX1000/uart.c b/cpu/x86/drivers/quarkX1000/uart.c index 341e31cf7..c78a04ca1 100644 --- a/cpu/x86/drivers/quarkX1000/uart.c +++ b/cpu/x86/drivers/quarkX1000/uart.c @@ -35,10 +35,10 @@ PROT_DOMAINS_ALLOC(uart_16x50_driver_t, quarkX1000_uart0); PROT_DOMAINS_ALLOC(uart_16x50_driver_t, quarkX1000_uart1); -/* Divisor setting for 115200 baud from section 18.2.2 of Intel Quark SoC - * X1000 Datasheet. +/* UART base frequency from section 18.2.2 of Intel Quark SoC X1000 + * Datasheet. */ -#define QUARK_X1000_UART_DL_115200 24 +#define QUARK_X1000_UART_FBASE 44236800 /*---------------------------------------------------------------------------*/ /** @@ -46,8 +46,9 @@ PROT_DOMAINS_ALLOC(uart_16x50_driver_t, quarkX1000_uart1); * \param dev Device to initialize. */ void -quarkX1000_uart_init(quarkX1000_uart_dev_t dev) +quarkX1000_uart_init(quarkX1000_uart_dev_t dev, unsigned baud) { + uint16_t dl; pci_config_addr_t pci_addr; uart_16x50_driver_t ATTR_KERN_ADDR_SPACE *drv; @@ -67,7 +68,9 @@ quarkX1000_uart_init(quarkX1000_uart_dev_t dev) drv = &quarkX1000_uart1; PROT_DOMAINS_INIT_ID(quarkX1000_uart1); } - uart_16x50_init(drv, pci_addr, QUARK_X1000_UART_DL_115200); + /* Divisor setting from section 18.2.2 of Intel Quark SoC X1000 Datasheet. */ + dl = QUARK_X1000_UART_FBASE / (16 * baud); + uart_16x50_init(drv, pci_addr, dl); } /*---------------------------------------------------------------------------*/ /** diff --git a/cpu/x86/drivers/quarkX1000/uart.h b/cpu/x86/drivers/quarkX1000/uart.h index 8b545d8cd..2eec5c103 100644 --- a/cpu/x86/drivers/quarkX1000/uart.h +++ b/cpu/x86/drivers/quarkX1000/uart.h @@ -38,7 +38,7 @@ typedef enum { QUARK_X1000_UART_1 } quarkX1000_uart_dev_t; -void quarkX1000_uart_init(quarkX1000_uart_dev_t dev); +void quarkX1000_uart_init(quarkX1000_uart_dev_t dev, unsigned baud); void quarkX1000_uart_tx(quarkX1000_uart_dev_t dev, uint8_t c); #endif /* CPU_X86_DRIVERS_QUARKX1000_UART_H_ */ diff --git a/platform/galileo/contiki-main.c b/platform/galileo/contiki-main.c index ccc1f519f..3ac787af7 100644 --- a/platform/galileo/contiki-main.c +++ b/platform/galileo/contiki-main.c @@ -86,8 +86,10 @@ main(void) quarkX1000_imr_conf(); #endif irq_init(); - /* Initialize UART connected to Galileo Gen2 FTDI header */ - quarkX1000_uart_init(QUARK_X1000_UART_1); + /* Initialize UART connected to Galileo Gen1 3.5mm audio-style jack or + * Galileo Gen2 FTDI header + */ + quarkX1000_uart_init(QUARK_X1000_UART_1, 115200); clock_init(); rtimer_init(); From bde8eb35ae360f4e952acf3c26a4c4606e02df11 Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Thu, 4 Aug 2016 15:51:37 -0700 Subject: [PATCH 273/345] x86, galileo: Fix UART system call authorization initialization This patch fixes UART system call authorization initialization (when protection domain support is enabled) to only initialize the system call entrypoint and authorization data structures once, prior to per-port setup. Previously, if two UARTs were configured, the setup procedure for the second UART would erase the system call authorization for the first (console) UART, resulting in a crash upon the next attempt to perform console output. --- cpu/x86/drivers/legacy_pc/uart-16x50.c | 20 +++++++++++++++----- cpu/x86/drivers/legacy_pc/uart-16x50.h | 8 +++++--- cpu/x86/drivers/quarkX1000/uart.c | 14 ++++++++++++-- cpu/x86/drivers/quarkX1000/uart.h | 3 ++- platform/galileo/contiki-main.c | 3 ++- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/cpu/x86/drivers/legacy_pc/uart-16x50.c b/cpu/x86/drivers/legacy_pc/uart-16x50.c index d17e61498..7d9493c74 100644 --- a/cpu/x86/drivers/legacy_pc/uart-16x50.c +++ b/cpu/x86/drivers/legacy_pc/uart-16x50.c @@ -140,6 +140,18 @@ SYSCALLS_DEFINE(uart_16x50_tx, uart_16x50_driver_t c_this, uint8_t c) prot_domains_disable_mmio(); } /*---------------------------------------------------------------------------*/ +/** + * \brief Perform common initialization that must precede per-port + * initialization. + */ +/*---------------------------------------------------------------------------*/ +void +uart_16x50_init(void) +{ + SYSCALLS_INIT(uart_16x50_setup); + SYSCALLS_INIT(uart_16x50_tx); +} +/*---------------------------------------------------------------------------*/ /** * \brief Initialize an MMIO-programmable 16X50 UART. * \param c_this Structure that will be initialized to represent the device. @@ -147,9 +159,9 @@ SYSCALLS_DEFINE(uart_16x50_tx, uart_16x50_driver_t c_this, uint8_t c) * \param dl Divisor setting to configure the baud rate. */ void -uart_16x50_init(uart_16x50_driver_t ATTR_KERN_ADDR_SPACE *c_this, - pci_config_addr_t pci_addr, - uint16_t dl) +uart_16x50_init_port(uart_16x50_driver_t ATTR_KERN_ADDR_SPACE *c_this, + pci_config_addr_t pci_addr, + uint16_t dl) { uart_16x50_driver_t loc_c_this; @@ -157,9 +169,7 @@ uart_16x50_init(uart_16x50_driver_t ATTR_KERN_ADDR_SPACE *c_this, * firmware during boot. */ pci_init(c_this, pci_addr, UART_MMIO_SZ, 0, 0); - SYSCALLS_INIT(uart_16x50_setup); SYSCALLS_AUTHZ(uart_16x50_setup, *c_this); - SYSCALLS_INIT(uart_16x50_tx); SYSCALLS_AUTHZ(uart_16x50_tx, *c_this); prot_domains_copy_dcd(&loc_c_this, c_this); diff --git a/cpu/x86/drivers/legacy_pc/uart-16x50.h b/cpu/x86/drivers/legacy_pc/uart-16x50.h index 4a038b948..8a3ddad49 100644 --- a/cpu/x86/drivers/legacy_pc/uart-16x50.h +++ b/cpu/x86/drivers/legacy_pc/uart-16x50.h @@ -35,9 +35,11 @@ typedef pci_driver_t uart_16x50_driver_t; -void uart_16x50_init(uart_16x50_driver_t ATTR_KERN_ADDR_SPACE *c_this, - pci_config_addr_t pci_addr, - uint16_t dl); +void uart_16x50_init(void); + +void uart_16x50_init_port(uart_16x50_driver_t ATTR_KERN_ADDR_SPACE *c_this, + pci_config_addr_t pci_addr, + uint16_t dl); void uart_16x50_tx(uart_16x50_driver_t c_this, uint8_t c); diff --git a/cpu/x86/drivers/quarkX1000/uart.c b/cpu/x86/drivers/quarkX1000/uart.c index c78a04ca1..2044e42e8 100644 --- a/cpu/x86/drivers/quarkX1000/uart.c +++ b/cpu/x86/drivers/quarkX1000/uart.c @@ -40,13 +40,23 @@ PROT_DOMAINS_ALLOC(uart_16x50_driver_t, quarkX1000_uart1); */ #define QUARK_X1000_UART_FBASE 44236800 +/*---------------------------------------------------------------------------*/ +/** + * \brief Perform common initialization that must precede per-port + * initialization. + */ +void +quarkX1000_uart_init(void) +{ + uart_16x50_init(); +} /*---------------------------------------------------------------------------*/ /** * \brief Initialize a UART. * \param dev Device to initialize. */ void -quarkX1000_uart_init(quarkX1000_uart_dev_t dev, unsigned baud) +quarkX1000_uart_init_port(quarkX1000_uart_dev_t dev, unsigned baud) { uint16_t dl; pci_config_addr_t pci_addr; @@ -70,7 +80,7 @@ quarkX1000_uart_init(quarkX1000_uart_dev_t dev, unsigned baud) } /* Divisor setting from section 18.2.2 of Intel Quark SoC X1000 Datasheet. */ dl = QUARK_X1000_UART_FBASE / (16 * baud); - uart_16x50_init(drv, pci_addr, dl); + uart_16x50_init_port(drv, pci_addr, dl); } /*---------------------------------------------------------------------------*/ /** diff --git a/cpu/x86/drivers/quarkX1000/uart.h b/cpu/x86/drivers/quarkX1000/uart.h index 2eec5c103..6b1312ed8 100644 --- a/cpu/x86/drivers/quarkX1000/uart.h +++ b/cpu/x86/drivers/quarkX1000/uart.h @@ -38,7 +38,8 @@ typedef enum { QUARK_X1000_UART_1 } quarkX1000_uart_dev_t; -void quarkX1000_uart_init(quarkX1000_uart_dev_t dev, unsigned baud); +void quarkX1000_uart_init(void); +void quarkX1000_uart_init_port(quarkX1000_uart_dev_t dev, unsigned baud); void quarkX1000_uart_tx(quarkX1000_uart_dev_t dev, uint8_t c); #endif /* CPU_X86_DRIVERS_QUARKX1000_UART_H_ */ diff --git a/platform/galileo/contiki-main.c b/platform/galileo/contiki-main.c index 3ac787af7..5e95c4902 100644 --- a/platform/galileo/contiki-main.c +++ b/platform/galileo/contiki-main.c @@ -86,10 +86,11 @@ main(void) quarkX1000_imr_conf(); #endif irq_init(); + quarkX1000_uart_init(); /* Initialize UART connected to Galileo Gen1 3.5mm audio-style jack or * Galileo Gen2 FTDI header */ - quarkX1000_uart_init(QUARK_X1000_UART_1, 115200); + quarkX1000_uart_init_port(QUARK_X1000_UART_1, 115200); clock_init(); rtimer_init(); From e1359519abe1b47f3c4c0879175cd050648a119b Mon Sep 17 00:00:00 2001 From: Andreas Urke Date: Tue, 9 Aug 2016 00:25:37 +0200 Subject: [PATCH 274/345] Fix i2c multiple write bug, as reported by Ron Segal: https://sourceforge.net/p/contiki/mailman/message/34633862/ --- platform/srf06-cc26xx/sensortag/board-i2c.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/platform/srf06-cc26xx/sensortag/board-i2c.c b/platform/srf06-cc26xx/sensortag/board-i2c.c index cf74e2a93..ba9eddddd 100644 --- a/platform/srf06-cc26xx/sensortag/board-i2c.c +++ b/platform/srf06-cc26xx/sensortag/board-i2c.c @@ -256,12 +256,11 @@ board_i2c_write_read(uint8_t *wdata, uint8_t wlen, uint8_t *rdata, uint8_t rlen) for(i = 1; i < wlen && success; i++) { /* Write next byte */ ti_lib_i2c_master_data_put(I2C0_BASE, wdata[i]); - if(i < wlen - 1) { - /* Clear START */ - ti_lib_i2c_master_control(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); - while(ti_lib_i2c_master_busy(I2C0_BASE)); - success = i2c_status(); - } + + /* Clear START */ + ti_lib_i2c_master_control(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); + while(ti_lib_i2c_master_busy(I2C0_BASE)); + success = i2c_status(); } if(!success) { return false; From 8128986ccd7271324bc1601a9ec02dcbbbbcc529 Mon Sep 17 00:00:00 2001 From: Andreas Urke Date: Tue, 9 Aug 2016 00:41:19 +0200 Subject: [PATCH 275/345] Remove unecessary bool --- platform/srf06-cc26xx/sensortag/board-i2c.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/platform/srf06-cc26xx/sensortag/board-i2c.c b/platform/srf06-cc26xx/sensortag/board-i2c.c index ba9eddddd..17486d65b 100644 --- a/platform/srf06-cc26xx/sensortag/board-i2c.c +++ b/platform/srf06-cc26xx/sensortag/board-i2c.c @@ -174,8 +174,6 @@ board_i2c_write(uint8_t *data, uint8_t len) bool board_i2c_write_single(uint8_t data) { - bool success; - /* Write slave address */ ti_lib_i2c_master_slave_addr_set(I2C0_BASE, slave_addr, false); @@ -188,9 +186,8 @@ board_i2c_write_single(uint8_t data) /* Assert RUN + START + STOP */ ti_lib_i2c_master_control(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND); while(ti_lib_i2c_master_busy(I2C0_BASE)); - success = i2c_status(); - return success; + return i2c_status(); } /*---------------------------------------------------------------------------*/ bool From ae5205f9e2d216daad834d44abcc3175c4dcd1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Th=C3=A9baudeau?= Date: Wed, 10 Aug 2016 04:56:15 +0200 Subject: [PATCH 276/345] doxygen: Fix orphan modules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Benoît Thébaudeau --- cpu/cc2538/dev/ecc-algorithm.c | 2 +- cpu/cc2538/dev/ecc-curve.c | 2 +- cpu/cc2538/dev/sha256.h | 2 +- platform/srf06-cc26xx/srf06/board.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cpu/cc2538/dev/ecc-algorithm.c b/cpu/cc2538/dev/ecc-algorithm.c index 7ecd99ad8..9e389375f 100644 --- a/cpu/cc2538/dev/ecc-algorithm.c +++ b/cpu/cc2538/dev/ecc-algorithm.c @@ -29,7 +29,7 @@ * SUCH DAMAGE. */ /** - * \addtogroup c2538-ecc-algo + * \addtogroup cc2538-ecc-algo * @{ * * \file diff --git a/cpu/cc2538/dev/ecc-curve.c b/cpu/cc2538/dev/ecc-curve.c index d3291d1b6..fa8408a4c 100644 --- a/cpu/cc2538/dev/ecc-curve.c +++ b/cpu/cc2538/dev/ecc-curve.c @@ -29,7 +29,7 @@ * SUCH DAMAGE. */ /** - * \addtogroup c2538-ecc-curves + * \addtogroup cc2538-ecc-curves * @{ */ #include "contiki.h" diff --git a/cpu/cc2538/dev/sha256.h b/cpu/cc2538/dev/sha256.h index b2e799bd8..86508e267 100644 --- a/cpu/cc2538/dev/sha256.h +++ b/cpu/cc2538/dev/sha256.h @@ -37,7 +37,7 @@ * \addtogroup cc2538-crypto * @{ * - * \defgroup cc2538-sha526 cc2538 SHA-256 + * \defgroup cc2538-sha256 cc2538 SHA-256 * * Driver for the cc2538 SHA-256 mode of the security core * @{ diff --git a/platform/srf06-cc26xx/srf06/board.c b/platform/srf06-cc26xx/srf06/board.c index 15528f79a..fba6070de 100644 --- a/platform/srf06-cc26xx/srf06/board.c +++ b/platform/srf06-cc26xx/srf06/board.c @@ -29,7 +29,7 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup sensortag-common-peripherals + * \addtogroup srf06-common-peripherals * @{ * * \file From 9e03df6cb75365732315372571b80187d8302177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Th=C3=A9baudeau?= Date: Thu, 11 Aug 2016 23:49:03 +0200 Subject: [PATCH 277/345] CC2538: Use the 32.768-kHz crystal if present MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enable the 32.768-kHz crystal on all the CC2538 platforms where it is present in order to get a better time accuracy. Signed-off-by: Benoît Thébaudeau --- platform/cc2538dk/contiki-conf.h | 10 ++++++++++ platform/openmote-cc2538/contiki-conf.h | 11 ++++++++++- platform/zoul/contiki-conf.h | 11 ++++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/platform/cc2538dk/contiki-conf.h b/platform/cc2538dk/contiki-conf.h index d1a10811f..64179b983 100644 --- a/platform/cc2538dk/contiki-conf.h +++ b/platform/cc2538dk/contiki-conf.h @@ -64,6 +64,16 @@ typedef uint32_t rtimer_clock_t; #endif /** @} */ /*---------------------------------------------------------------------------*/ +/** + * \name CC2538 System Control configuration + * + * @{ + */ +#ifndef SYS_CTRL_CONF_OSC32K_USE_XTAL +#define SYS_CTRL_CONF_OSC32K_USE_XTAL 1 /**< Use the on-board 32.768-kHz crystal */ +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ /** * \name Watchdog Timer configuration * diff --git a/platform/openmote-cc2538/contiki-conf.h b/platform/openmote-cc2538/contiki-conf.h index 543d3a5e5..90cc6d648 100644 --- a/platform/openmote-cc2538/contiki-conf.h +++ b/platform/openmote-cc2538/contiki-conf.h @@ -102,7 +102,16 @@ typedef uint32_t rtimer_clock_t; #define FLASH_CCA_CONF_BOOTLDR_BACKDOOR_ACTIVE_HIGH 0 /**< A logic low level activates the boot loader */ #endif /** @} */ - +/*---------------------------------------------------------------------------*/ +/** + * \name CC2538 System Control configuration + * + * @{ + */ +#ifndef SYS_CTRL_CONF_OSC32K_USE_XTAL +#define SYS_CTRL_CONF_OSC32K_USE_XTAL 1 /**< Use the on-board 32.768-kHz crystal */ +#endif +/** @} */ /*---------------------------------------------------------------------------*/ /** * \name CFS configuration diff --git a/platform/zoul/contiki-conf.h b/platform/zoul/contiki-conf.h index 6bdae897a..bf9754730 100644 --- a/platform/zoul/contiki-conf.h +++ b/platform/zoul/contiki-conf.h @@ -100,7 +100,16 @@ typedef uint32_t rtimer_clock_t; #define FLASH_CCA_CONF_BOOTLDR_BACKDOOR_ACTIVE_HIGH 0 /**< A logic low level activates the boot loader */ #endif /** @} */ - +/*---------------------------------------------------------------------------*/ +/** + * \name CC2538 System Control configuration + * + * @{ + */ +#ifndef SYS_CTRL_CONF_OSC32K_USE_XTAL +#define SYS_CTRL_CONF_OSC32K_USE_XTAL 1 /**< Use the on-board 32.768-kHz crystal */ +#endif +/** @} */ /*---------------------------------------------------------------------------*/ /** * \name CFS configuration From 0de1dc1025330817c470b52d4c9c5a82425206d9 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:49:15 +0100 Subject: [PATCH 278/345] Remove built-in sniffer support: CC2530 --- cpu/cc253x/dev/cc2530-rf.c | 23 ----------------------- platform/cc2530dk/contiki-conf.h | 11 ----------- 2 files changed, 34 deletions(-) diff --git a/cpu/cc253x/dev/cc2530-rf.c b/cpu/cc253x/dev/cc2530-rf.c index 55e7d3125..52c9a1c3e 100644 --- a/cpu/cc253x/dev/cc2530-rf.c +++ b/cpu/cc253x/dev/cc2530-rf.c @@ -101,11 +101,6 @@ #define CC2530_RF_TX_POWER_TXCTRL_MIN_VAL 0x09 /* Value for min TX Power */ #define CC2530_RF_TX_POWER_TXCTRL_DEF_VAL 0x69 /* Reset Value */ /*---------------------------------------------------------------------------*/ -#if CC2530_RF_CONF_HEXDUMP -#include "dev/io-arch.h" -static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 }; /* Snif */ -#endif -/*---------------------------------------------------------------------------*/ #ifdef CC2530_RF_CONF_AUTOACK #define CC2530_RF_AUTOACK CC2530_RF_CONF_AUTOACK #else @@ -531,15 +526,6 @@ read(void *buf, unsigned short bufsize) return 0; } -#if CC2530_RF_CONF_HEXDUMP - /* If we reach here, chances are the FIFO is holding a valid frame */ - io_arch_writeb(magic[0]); - io_arch_writeb(magic[1]); - io_arch_writeb(magic[2]); - io_arch_writeb(magic[3]); - io_arch_writeb(len); -#endif - RF_RX_LED_ON(); PUTSTRING("RF: read (0x"); @@ -548,9 +534,6 @@ read(void *buf, unsigned short bufsize) len -= CHECKSUM_LEN; for(i = 0; i < len; ++i) { ((unsigned char *)(buf))[i] = RFD; -#if CC2530_RF_CONF_HEXDUMP - io_arch_writeb(((unsigned char *)(buf))[i]); -#endif PUTHEX(((unsigned char *)(buf))[i]); } PUTSTRING("\n"); @@ -559,12 +542,6 @@ read(void *buf, unsigned short bufsize) rssi = ((int8_t) RFD) - RSSI_OFFSET; crc_corr = RFD; -#if CC2530_RF_CONF_HEXDUMP - io_arch_writeb(rssi); - io_arch_writeb(crc_corr); - io_arch_flush(); -#endif - /* MS bit CRC OK/Not OK, 7 LS Bits, Correlation value */ if(crc_corr & CRC_BIT_MASK) { packetbuf_set_attr(PACKETBUF_ATTR_RSSI, rssi); diff --git a/platform/cc2530dk/contiki-conf.h b/platform/cc2530dk/contiki-conf.h index 9c79aa828..33ad58433 100644 --- a/platform/cc2530dk/contiki-conf.h +++ b/platform/cc2530dk/contiki-conf.h @@ -85,17 +85,6 @@ #define UART0_CONF_WITH_INPUT 1 #endif -/* Output all captured frames over the UART in hexdump format */ -#ifndef CC2530_RF_CONF_HEXDUMP -#define CC2530_RF_CONF_HEXDUMP 0 -#endif - -#if CC2530_RF_CONF_HEXDUMP -/* We need UART1 output */ -#undef UART_ZERO_CONF_ENABLE -#define UART_ZERO_CONF_ENABLE 1 -#endif - /* Code Shortcuts */ /* * When set, this directive also configures the following bypasses: From dbd4f630fdc4758ab274c80f1f622eef9b135499 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:51:08 +0100 Subject: [PATCH 279/345] Remove built-in sniffer support: CC13xx PROP mode --- cpu/cc26xx-cc13xx/rf-core/prop-mode.c | 32 --------------------------- platform/srf06-cc26xx/contiki-conf.h | 4 ---- 2 files changed, 36 deletions(-) diff --git a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c index 94aef33b9..a46e651f0 100644 --- a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c +++ b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c @@ -107,16 +107,6 @@ #define PROP_MODE_USE_CRC16 0 #endif /*---------------------------------------------------------------------------*/ -#ifdef PROP_MODE_CONF_SNIFFER -#define PROP_MODE_SNIFFER PROP_MODE_CONF_SNIFFER -#else -#define PROP_MODE_SNIFFER 0 -#endif - -#if PROP_MODE_SNIFFER -static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 }; -#endif -/*---------------------------------------------------------------------------*/ /** * \brief Returns the current status of a running Radio Op command * \param a A pointer with the buffer used to initiate the command @@ -773,28 +763,6 @@ read_frame(void *buf, unsigned short buf_len) } packetbuf_set_attr(PACKETBUF_ATTR_RSSI, (int8_t)data_ptr[len]); - -#if PROP_MODE_SNIFFER - { - int i; - - cc26xx_uart_write_byte(magic[0]); - cc26xx_uart_write_byte(magic[1]); - cc26xx_uart_write_byte(magic[2]); - cc26xx_uart_write_byte(magic[3]); - - cc26xx_uart_write_byte(len + 2); - - for(i = 0; i < len; ++i) { - cc26xx_uart_write_byte(((uint8_t *)(buf))[i]); - } - - cc26xx_uart_write_byte((uint8_t)rx_stats.lastRssi); - cc26xx_uart_write_byte(0x80); - - while(cc26xx_uart_busy() == UART_BUSY); - } -#endif } /* Move read entry pointer to next entry */ diff --git a/platform/srf06-cc26xx/contiki-conf.h b/platform/srf06-cc26xx/contiki-conf.h index d756977c8..5a1524f52 100644 --- a/platform/srf06-cc26xx/contiki-conf.h +++ b/platform/srf06-cc26xx/contiki-conf.h @@ -172,10 +172,6 @@ #ifndef RF_BLE_CONF_ENABLED #define RF_BLE_CONF_ENABLED 0 /**< 0 to disable BLE support */ #endif - -#ifndef PROP_MODE_CONF_SNIFFER -#define PROP_MODE_CONF_SNIFFER 0 /**< 1 to enable sniffer mode */ -#endif /** @} */ /*---------------------------------------------------------------------------*/ /** @} */ From a52d50f3329f285029dcbb6613b0dabb548df85d Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:51:30 +0100 Subject: [PATCH 280/345] Remove built-in sniffer support: CC1200 --- dev/cc1200/cc1200-conf.h | 10 ------ dev/cc1200/cc1200.c | 68 +--------------------------------------- 2 files changed, 1 insertion(+), 77 deletions(-) diff --git a/dev/cc1200/cc1200-conf.h b/dev/cc1200/cc1200-conf.h index 1e50cc828..9d28922a4 100644 --- a/dev/cc1200/cc1200-conf.h +++ b/dev/cc1200/cc1200-conf.h @@ -222,15 +222,5 @@ #define CC1200_RX_LEDS CC1200_CONF_RX_LEDS #endif /*---------------------------------------------------------------------------*/ -/* - * If set, enable sniff mode: turn radio on (and keep it on), disable - * address filter and auto ack - */ -#ifdef CC1200_CONF_SNIFFER -#define CC1200_SNIFFER CC1200_CONF_SNIFFER -#else -#define CC1200_SNIFFER 0 -#endif -/*---------------------------------------------------------------------------*/ #endif /* CC1200_H_ */ diff --git a/dev/cc1200/cc1200.c b/dev/cc1200/cc1200.c index bed33c5b6..013c54ee6 100644 --- a/dev/cc1200/cc1200.c +++ b/dev/cc1200/cc1200.c @@ -374,17 +374,6 @@ extern const cc1200_rf_cfg_t CC1200_RF_CFG; } while(0) #endif /*---------------------------------------------------------------------------*/ -/* Sniffer configuration */ -#if CC1200_SNIFFER -static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 }; -#include "dev/uart.h" -#define write_byte(b) uart_write_byte(CC1200_RF_CONF_SNIFFER_UART, b) -#define flush() -#else /* CC1200_SNIFFER */ -#define write_byte(b) -#define flush() -#endif /* CC1200_SNIFFER */ -/*---------------------------------------------------------------------------*/ /* Variables */ /*---------------------------------------------------------------------------*/ /* Flag indicating whether non-interrupt routines are using SPI */ @@ -553,11 +542,6 @@ calculate_freq(uint8_t channel); /* Update rf channel if possible, else postpone it (-> pollhandler). */ static int set_channel(uint8_t channel); -#if !CC1200_SNIFFER -/* Check broadcast address. */ -static int -is_broadcast_addr(uint8_t mode, uint8_t *addr); -#endif /* CC1200_SNIFFER */ /* Validate address and send ACK if requested. */ static int addr_check_auto_ack(uint8_t *frame, uint16_t frame_len); @@ -574,8 +558,7 @@ PROCESS_THREAD(cc1200_process, ev, data) PROCESS_BEGIN(); -#if CC1200_USE_RX_WATCHDOG && !CC1200_SNIFFER - /* RX watchdog interferes with sniffer. Reason unknown... */ +#if CC1200_USE_RX_WATCHDOG while(1) { if((rf_flags & (RF_ON | RF_TX_ACTIVE)) == RF_ON) { @@ -716,11 +699,6 @@ init(void) * configuration of the GPIO0 pin */ off(); - -/* #if CC1200_SNIFFER */ -/* on(); */ -/* #endif */ - } return 1; @@ -881,10 +859,6 @@ read(void *buf, unsigned short buf_len) int len = 0; - #if CC1200_SNIFFER - uint8_t i; - #endif - if(rx_pkt_len > 0) { int8_t rssi = rx_pkt[rx_pkt_len - 2]; @@ -911,21 +885,6 @@ read(void *buf, unsigned short buf_len) packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, crc_lqi & ~(1 << 7)); - - #if CC1200_SNIFFER - write_byte(magic[0]); - write_byte(magic[1]); - write_byte(magic[2]); - write_byte(magic[3]); - write_byte(len + 2); - for(i = 0; i < len; ++i) { - write_byte(((unsigned char *)(buf))[i]); - } - write_byte(rssi); - write_byte(crc_lqi); - flush(); - #endif - RIMESTATS_ADD(llrx); } @@ -2137,7 +2096,6 @@ set_channel(uint8_t channel) } /*---------------------------------------------------------------------------*/ /* Check broadcast address. */ -#if !CC1200_SNIFFER static int is_broadcast_addr(uint8_t mode, uint8_t *addr) { @@ -2153,30 +2111,7 @@ is_broadcast_addr(uint8_t mode, uint8_t *addr) return 1; } -#endif /* CC12100_SNIFFER */ /*---------------------------------------------------------------------------*/ -/* Validate address and send ACK if requested. */ -#if CC1200_SNIFFER -static int -addr_check_auto_ack(uint8_t *frame, uint16_t frame_len) -{ - - frame802154_t info154; - - if(frame802154_parse(frame, frame_len, &info154) != 0) { - - /* We accept all 802.15.4 frames ... */ - return ADDR_CHECK_OK; - - } else { - - /* .. and discard others. */ - return INVALID_FRAME; - - } - -} -#else /* CC1200_SNIFFER */ static int addr_check_auto_ack(uint8_t *frame, uint16_t frame_len) { @@ -2245,7 +2180,6 @@ addr_check_auto_ack(uint8_t *frame, uint16_t frame_len) return INVALID_FRAME; } -#endif /* CC1200_SNIFFER */ /*---------------------------------------------------------------------------*/ /* * The CC1200 interrupt handler: called by the hardware interrupt From a932dfa6df80e5a40439372257437469076792d5 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:51:48 +0100 Subject: [PATCH 281/345] Remove built-in sniffer support: CC2538 --- cpu/cc2538/dev/cc2538-rf.c | 42 -------------------------------------- 1 file changed, 42 deletions(-) diff --git a/cpu/cc2538/dev/cc2538-rf.c b/cpu/cc2538/dev/cc2538-rf.c index 6916524d2..ec7591fcb 100644 --- a/cpu/cc2538/dev/cc2538-rf.c +++ b/cpu/cc2538/dev/cc2538-rf.c @@ -91,29 +91,6 @@ /* 192 usec off -> on interval (RX Callib -> SFD Wait). We wait a bit more */ #define ONOFF_TIME RTIMER_ARCH_SECOND / 3125 /*---------------------------------------------------------------------------*/ -/* Sniffer configuration */ -#ifndef CC2538_RF_CONF_SNIFFER_USB -#define CC2538_RF_CONF_SNIFFER_USB 0 -#endif - -#if CC2538_RF_CONF_SNIFFER -static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 }; /** Snif */ - -#if CC2538_RF_CONF_SNIFFER_USB -#include "usb/usb-serial.h" -#define write_byte(b) usb_serial_writeb(b) -#define flush() usb_serial_flush() -#else -#include "dev/uart.h" -#define write_byte(b) uart_write_byte(CC2538_RF_CONF_SNIFFER_UART, b) -#define flush() -#endif - -#else /* CC2538_RF_CONF_SNIFFER */ -#define write_byte(b) -#define flush() -#endif /* CC2538_RF_CONF_SNIFFER */ -/*---------------------------------------------------------------------------*/ #ifdef CC2538_RF_CONF_AUTOACK #define CC2538_RF_AUTOACK CC2538_RF_CONF_AUTOACK #else @@ -526,11 +503,6 @@ init(void) REG(RFCORE_XREG_FRMCTRL0) |= RFCORE_XREG_FRMCTRL0_AUTOACK; #endif - /* If we are a sniffer, turn off frame filtering */ -#if CC2538_RF_CONF_SNIFFER - REG(RFCORE_XREG_FRMFILT0) &= ~RFCORE_XREG_FRMFILT0_FRAME_FILTER_EN; -#endif - /* Disable source address matching and autopend */ REG(RFCORE_XREG_SRCMATCH) = 0; @@ -798,20 +770,6 @@ read(void *buf, unsigned short bufsize) return 0; } -#if CC2538_RF_CONF_SNIFFER - write_byte(magic[0]); - write_byte(magic[1]); - write_byte(magic[2]); - write_byte(magic[3]); - write_byte(len + 2); - for(i = 0; i < len; ++i) { - write_byte(((unsigned char *)(buf))[i]); - } - write_byte(rssi); - write_byte(crc_corr); - flush(); -#endif - if(!poll_mode) { /* If FIFOP==1 and FIFO==0 then we had a FIFO overflow at some point. */ if(REG(RFCORE_XREG_FSMSTAT1) & RFCORE_XREG_FSMSTAT1_FIFOP) { From b0672713bbbfbe4eba0c8a39db5f6be833c88cb1 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:59:17 +0100 Subject: [PATCH 282/345] Remove built-in sniffer support: aducrf101 --- cpu/arm/aducrf101/dev/radio.c | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/cpu/arm/aducrf101/dev/radio.c b/cpu/arm/aducrf101/dev/radio.c index 6e2b2ca47..49cc5c124 100644 --- a/cpu/arm/aducrf101/dev/radio.c +++ b/cpu/arm/aducrf101/dev/radio.c @@ -57,20 +57,6 @@ static RIE_BaseConfigs base_config = ADUCRF101_RADIO_BASE_CONFIG; static int current_channel = 915000000; static int current_power = 31; static int radio_is_on = 0; - -/*---------------------------------------------------------------------------*/ -/* Sniffer configuration. We can re-use the CC2538 sniffer application - if we also accept CC2538_RF_CONF_SNIFFER. */ -#ifndef ADUCRF101_RF_CONF_SNIFFER -#if CC2538_RF_CONF_SNIFFER -#define ADUCRF101_RF_CONF_SNIFFER 1 -#endif -#endif - -#if ADUCRF101_RF_CONF_SNIFFER -#include "dev/uart.h" -static const uint8_t magic[] = { 0x53, 0x6E, 0x69, 0x66 }; /* Snif */ -#endif /*---------------------------------------------------------------------------*/ /* "Channel" is really frequency, and can be within the bands: 431000000 Hz to 464000000 Hz @@ -246,20 +232,6 @@ read(void *buf, unsigned short buf_len) /* Re-enter receive mode immediately after receiving a packet */ RadioRxPacketVariableLen(); -#if ADUCRF101_RF_CONF_SNIFFER - uart_put(magic[0]); - uart_put(magic[1]); - uart_put(magic[2]); - uart_put(magic[3]); - uart_put(packet_len + 2); - for(int i = 0; i < packet_len; i++) { - uart_put(((uint8_t *)buf)[i]); - } - /* FCS value is Wireshark's "TI CC24xx format" option: */ - uart_put(rssi); /* RSSI */ - uart_put(0x80); /* CRC is OK, LQI correlation is 0 */ -#endif - return packet_len; } /*---------------------------------------------------------------------------*/ From fa769b98e95ac2b93bc220bd873399caa756fe6e Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:52:23 +0100 Subject: [PATCH 283/345] Remove legacy CC2530 sniffer example --- examples/cc2530dk/sniffer/Makefile | 11 -- examples/cc2530dk/sniffer/Makefile.target | 1 - examples/cc2530dk/sniffer/netstack.c | 49 --------- examples/cc2530dk/sniffer/project-conf.h | 56 ---------- examples/cc2530dk/sniffer/sniffer.c | 54 ---------- examples/cc2530dk/sniffer/stub-rdc.c | 100 ------------------ .../14-compile-8051-ports/Makefile | 1 - 7 files changed, 272 deletions(-) delete mode 100644 examples/cc2530dk/sniffer/Makefile delete mode 100644 examples/cc2530dk/sniffer/Makefile.target delete mode 100644 examples/cc2530dk/sniffer/netstack.c delete mode 100644 examples/cc2530dk/sniffer/project-conf.h delete mode 100644 examples/cc2530dk/sniffer/sniffer.c delete mode 100644 examples/cc2530dk/sniffer/stub-rdc.c diff --git a/examples/cc2530dk/sniffer/Makefile b/examples/cc2530dk/sniffer/Makefile deleted file mode 100644 index f57ded291..000000000 --- a/examples/cc2530dk/sniffer/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -DEFINES+=PROJECT_CONF_H -PROJECT_SOURCEFILES += stub-rdc.c - -CONTIKI_PROJECT = sniffer - -all: $(CONTIKI_PROJECT) - -CONTIKI = ../../.. - -CONTIKI_WITH_RIME = 1 -include $(CONTIKI)/Makefile.include diff --git a/examples/cc2530dk/sniffer/Makefile.target b/examples/cc2530dk/sniffer/Makefile.target deleted file mode 100644 index 70609bbdb..000000000 --- a/examples/cc2530dk/sniffer/Makefile.target +++ /dev/null @@ -1 +0,0 @@ -TARGET = cc2530dk diff --git a/examples/cc2530dk/sniffer/netstack.c b/examples/cc2530dk/sniffer/netstack.c deleted file mode 100644 index d59acc3fe..000000000 --- a/examples/cc2530dk/sniffer/netstack.c +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * Stub file overriding core/net/netstack.c. What we want to achieve - * here is call netstack_init from main without initialising the RDC, - * MAC and Network layers. It will just turn on the radio instead. - * - * \author - * George Oikonomou - - */ - -#include "netstack.h" -/*---------------------------------------------------------------------------*/ -void -netstack_init(void) -{ - NETSTACK_RADIO.init(); -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/cc2530dk/sniffer/project-conf.h b/examples/cc2530dk/sniffer/project-conf.h deleted file mode 100644 index 9f8af335a..000000000 --- a/examples/cc2530dk/sniffer/project-conf.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * Project specific configuration defines for the sniffer example. - * - * \author - * George Oikonomou - - */ - -#ifndef PROJECT_CONF_H_ -#define PROJECT_CONF_H_ - -#define CC2530_RF_CONF_HEXDUMP 1 -#define CC2530_RF_CONF_AUTOACK 0 -#define NETSTACK_CONF_RDC stub_rdc_driver -#define ADC_SENSOR_CONF_ON 0 -#define LPM_CONF_MODE 0 -#define UART0_CONF_HIGH_SPEED 1 - -/* Change to 0 to build for the SmartRF + cc2530 EM */ -#define MODELS_CONF_CC2531_USB_STICK 1 - -/* Used by cc2531 USB dongle builds, has no effect on SmartRF builds */ -#define USB_SERIAL_CONF_BUFFERED 1 - -#endif /* PROJECT_CONF_H_ */ diff --git a/examples/cc2530dk/sniffer/sniffer.c b/examples/cc2530dk/sniffer/sniffer.c deleted file mode 100644 index 7ad375d88..000000000 --- a/examples/cc2530dk/sniffer/sniffer.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * - */ - -#include "contiki.h" -#include "cc253x.h" - -#define DEBUG DEBUG_NONE -#include "net/ip/uip-debug.h" - -/*---------------------------------------------------------------------------*/ -PROCESS(sniffer_process, "Sniffer process"); -AUTOSTART_PROCESSES(&sniffer_process); -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(sniffer_process, ev, data) -{ - - PROCESS_BEGIN(); - - PRINTF("Sniffer started\n"); - - /* Turn off RF Address Recognition - We need to accept all frames */ - FRMFILT0 &= ~0x01; - - PROCESS_EXIT(); - - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/cc2530dk/sniffer/stub-rdc.c b/examples/cc2530dk/sniffer/stub-rdc.c deleted file mode 100644 index a4db0710d..000000000 --- a/examples/cc2530dk/sniffer/stub-rdc.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - */ - -/** - * \file - * Definition of a fake RDC driver to be used with passive - * examples. The sniffer will never send packets and it will never - * push incoming packets up the stack. We do this by defining this - * driver as our RDC. We then drop everything - * - * \author - * George Oikonomou - - */ - -#include "net/mac/mac.h" -#include "net/mac/rdc.h" -/*---------------------------------------------------------------------------*/ -static void -send(mac_callback_t sent, void *ptr) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -input(void) -{ -} -/*---------------------------------------------------------------------------*/ -static int -on(void) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -static int -off(int keep_radio_on) -{ - return keep_radio_on; -} -/*---------------------------------------------------------------------------*/ -static unsigned short -cca(void) -{ - return 0; -} -/*---------------------------------------------------------------------------*/ -static void -init(void) -{ -} -/*---------------------------------------------------------------------------*/ -const struct rdc_driver stub_rdc_driver = { - "stub-rdc", - init, - send, - send_list, - input, - on, - off, - cca, -}; -/*---------------------------------------------------------------------------*/ diff --git a/regression-tests/14-compile-8051-ports/Makefile b/regression-tests/14-compile-8051-ports/Makefile index 974e74df2..4ac1304c0 100644 --- a/regression-tests/14-compile-8051-ports/Makefile +++ b/regression-tests/14-compile-8051-ports/Makefile @@ -6,7 +6,6 @@ hello-world/cc2530dk \ cc2530dk/cc2530dk \ cc2530dk/border-router/cc2530dk \ cc2530dk/udp-ipv6/cc2530dk \ -cc2530dk/sniffer/cc2530dk \ ipv6/multicast/cc2530dk \ TOOLS= From 32e4f0f432a429a5a7f265d9c6573933e2687579 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:00:52 +0100 Subject: [PATCH 284/345] Remove legacy CC2538 sniffer example --- examples/cc2538-common/sniffer/Makefile | 10 -- .../cc2538-common/sniffer/Makefile.target | 1 - examples/cc2538-common/sniffer/netstack.c | 46 --------- examples/cc2538-common/sniffer/project-conf.h | 50 ---------- examples/cc2538-common/sniffer/sniffer.c | 72 -------------- examples/cc2538-common/sniffer/stub-rdc.c | 96 ------------------- .../18-compile-arm-ports/Makefile | 3 - 7 files changed, 278 deletions(-) delete mode 100644 examples/cc2538-common/sniffer/Makefile delete mode 100644 examples/cc2538-common/sniffer/Makefile.target delete mode 100644 examples/cc2538-common/sniffer/netstack.c delete mode 100644 examples/cc2538-common/sniffer/project-conf.h delete mode 100644 examples/cc2538-common/sniffer/sniffer.c delete mode 100644 examples/cc2538-common/sniffer/stub-rdc.c diff --git a/examples/cc2538-common/sniffer/Makefile b/examples/cc2538-common/sniffer/Makefile deleted file mode 100644 index d40baddd8..000000000 --- a/examples/cc2538-common/sniffer/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -DEFINES+=PROJECT_CONF_H=\"project-conf.h\" -PROJECT_SOURCEFILES += stub-rdc.c - -CONTIKI_PROJECT = sniffer - -all: $(CONTIKI_PROJECT) - -CONTIKI = ../../.. -CONTIKI_WITH_RIME = 1 -include $(CONTIKI)/Makefile.include diff --git a/examples/cc2538-common/sniffer/Makefile.target b/examples/cc2538-common/sniffer/Makefile.target deleted file mode 100644 index 777593c88..000000000 --- a/examples/cc2538-common/sniffer/Makefile.target +++ /dev/null @@ -1 +0,0 @@ -TARGET = cc2538dk diff --git a/examples/cc2538-common/sniffer/netstack.c b/examples/cc2538-common/sniffer/netstack.c deleted file mode 100644 index 3aeb6968e..000000000 --- a/examples/cc2538-common/sniffer/netstack.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/** - * \file - * Stub file overriding core/net/netstack.c. What we want to achieve - * here is call netstack_init from main without initialising the RDC, - * MAC and Network layers. It will just turn on the radio instead. - * - * \author - * George Oikonomou - - */ -#include "netstack.h" -/*---------------------------------------------------------------------------*/ -void -netstack_init(void) -{ - NETSTACK_RADIO.init(); - NETSTACK_RADIO.on(); -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/cc2538-common/sniffer/project-conf.h b/examples/cc2538-common/sniffer/project-conf.h deleted file mode 100644 index 7e1ac0cd6..000000000 --- a/examples/cc2538-common/sniffer/project-conf.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/** - * \addtogroup cc2538-sniffer - * @{ - * - * \file - * Project specific configuration defines for the cc2538 sniffer - */ -#ifndef PROJECT_CONF_H_ -#define PROJECT_CONF_H_ - -#define CC2538_RF_CONF_SNIFFER 1 -#define CC2538_RF_CONF_AUTOACK 0 -#undef NETSTACK_CONF_RDC -#define NETSTACK_CONF_RDC stub_rdc_driver - -#define UART0_CONF_BAUD_RATE 460800 - -#endif /* PROJECT_CONF_H_ */ - -/** @} */ diff --git a/examples/cc2538-common/sniffer/sniffer.c b/examples/cc2538-common/sniffer/sniffer.c deleted file mode 100644 index fe20b9c76..000000000 --- a/examples/cc2538-common/sniffer/sniffer.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/** - * \addtogroup cc2538-examples - * @{ - * - * \defgroup cc2538-sniffer cc2538 Sniffer - * - * Sniffer for the CC2538-based platforms. Originally based on the sensinode - * and cc2530dk sniffers. - * - * This example is to be used combined with the sensniff host-side tool, - * which can be downloaded from: https://github.com/g-oikonomou/sensniff - * - * @{ - * - * \file - * Implementation of a Sniffer Process Thread - */ -#include "contiki.h" - -#define DEBUG DEBUG_NONE -#include "net/ip/uip-debug.h" -/*---------------------------------------------------------------------------*/ -PROCESS(sniffer_process, "Sniffer process"); -AUTOSTART_PROCESSES(&sniffer_process); -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(sniffer_process, ev, data) -{ - - PROCESS_BEGIN(); - - PRINTF("Sniffer started\n"); - - PROCESS_EXIT(); - - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ - -/** - * @} - * @} - */ diff --git a/examples/cc2538-common/sniffer/stub-rdc.c b/examples/cc2538-common/sniffer/stub-rdc.c deleted file mode 100644 index a8c54de6a..000000000 --- a/examples/cc2538-common/sniffer/stub-rdc.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/** - * \file - * Definition of a fake RDC driver to be used with passive - * examples. The sniffer will never send packets and it will never - * push incoming packets up the stack. We do this by defining this - * driver as our RDC. We then drop everything - * - * \author - * George Oikonomou - - */ -#include "net/mac/mac.h" -#include "net/mac/rdc.h" -/*---------------------------------------------------------------------------*/ -static void -send(mac_callback_t sent, void *ptr) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -input(void) -{ -} -/*---------------------------------------------------------------------------*/ -static int -on(void) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -static int -off(int keep_radio_on) -{ - return keep_radio_on; -} -/*---------------------------------------------------------------------------*/ -static unsigned short -cca(void) -{ - return 0; -} -/*---------------------------------------------------------------------------*/ -static void -init(void) -{ -} -/*---------------------------------------------------------------------------*/ -const struct rdc_driver stub_rdc_driver = { - "stub-rdc", - init, - send, - send_list, - input, - on, - off, - cca, -}; -/*---------------------------------------------------------------------------*/ diff --git a/regression-tests/18-compile-arm-ports/Makefile b/regression-tests/18-compile-arm-ports/Makefile index e6e3c581f..e3640c07c 100644 --- a/regression-tests/18-compile-arm-ports/Makefile +++ b/regression-tests/18-compile-arm-ports/Makefile @@ -6,7 +6,6 @@ hello-world/ev-aducrf101mkxz \ ipv6/rpl-border-router/ev-aducrf101mkxz \ webserver-ipv6/ev-aducrf101mkxz \ ipv6/multicast/ev-aducrf101mkxz \ -cc2538-common/sniffer/ev-aducrf101mkxz \ cc26xx/cc26xx-web-demo/srf06-cc26xx \ cc26xx/very-sleepy-demo/srf06-cc26xx:BOARD=sensortag/cc2650 \ cc26xx/cc26xx-web-demo/srf06-cc26xx:BOARD=sensortag/cc2650 \ @@ -24,12 +23,10 @@ cc2538dk/cc2538dk \ cc2538dk/udp-ipv6-echo-server/cc2538dk \ ipv6/multicast/cc2538dk \ cc2538-common/cc2538dk \ -cc2538-common/sniffer/cc2538dk \ cc2538-common/mqtt-demo/cc2538dk \ cc2538-common/crypto/cc2538dk \ cc2538-common/pka/cc2538dk \ cc2538-common/zoul \ -cc2538-common/sniffer/zoul \ cc2538-common/mqtt-demo/zoul \ cc2538-common/crypto/zoul \ cc2538-common/pka/zoul \ From 63417cba0e64dcfc4b42f8fd9f13e07e77cdf146 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:20:16 +0100 Subject: [PATCH 285/345] Remove legacy zoul/CC1200 sniffer example --- .../zolertia/zoul/cc1200-sniffer/Makefile | 10 -- .../zoul/cc1200-sniffer/Makefile.target | 1 - .../zolertia/zoul/cc1200-sniffer/README.md | 35 ------- .../zolertia/zoul/cc1200-sniffer/netstack.c | 46 --------- .../zoul/cc1200-sniffer/project-conf.h | 59 ------------ .../zolertia/zoul/cc1200-sniffer/sniffer.c | 67 ------------- .../zolertia/zoul/cc1200-sniffer/stub-rdc.c | 96 ------------------- 7 files changed, 314 deletions(-) delete mode 100644 examples/zolertia/zoul/cc1200-sniffer/Makefile delete mode 100644 examples/zolertia/zoul/cc1200-sniffer/Makefile.target delete mode 100644 examples/zolertia/zoul/cc1200-sniffer/README.md delete mode 100644 examples/zolertia/zoul/cc1200-sniffer/netstack.c delete mode 100644 examples/zolertia/zoul/cc1200-sniffer/project-conf.h delete mode 100644 examples/zolertia/zoul/cc1200-sniffer/sniffer.c delete mode 100644 examples/zolertia/zoul/cc1200-sniffer/stub-rdc.c diff --git a/examples/zolertia/zoul/cc1200-sniffer/Makefile b/examples/zolertia/zoul/cc1200-sniffer/Makefile deleted file mode 100644 index 5c2fa1675..000000000 --- a/examples/zolertia/zoul/cc1200-sniffer/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -DEFINES+=PROJECT_CONF_H=\"project-conf.h\" -PROJECT_SOURCEFILES += stub-rdc.c - -CONTIKI_PROJECT = sniffer - -all: $(CONTIKI_PROJECT) - -CONTIKI = ../../../.. -CONTIKI_WITH_RIME = 1 -include $(CONTIKI)/Makefile.include diff --git a/examples/zolertia/zoul/cc1200-sniffer/Makefile.target b/examples/zolertia/zoul/cc1200-sniffer/Makefile.target deleted file mode 100644 index 75430a6e4..000000000 --- a/examples/zolertia/zoul/cc1200-sniffer/Makefile.target +++ /dev/null @@ -1 +0,0 @@ -TARGET = zoul diff --git a/examples/zolertia/zoul/cc1200-sniffer/README.md b/examples/zolertia/zoul/cc1200-sniffer/README.md deleted file mode 100644 index 95ec65193..000000000 --- a/examples/zolertia/zoul/cc1200-sniffer/README.md +++ /dev/null @@ -1,35 +0,0 @@ -CC1200 README -======================== - -The CC1200 sniffer is heavily based on the CC2538 sniffer, used with the -IEEE 802.15.4 Sensniff application by George Oikonomou. - -Sensniff requires [Wireshark](http://www.wireshark.org/). - -Get Wireshark ------------------ -The best way is to go to the Wireshark site and follow the instructions for your -specific OS, in a bundle this will install for Ubuntu/LInux systems: - -`sudo apt-get install wireshark` - -To allow non-super users to capture packets: - -`sudo dpkg-reconfigure wireshark` - -Flash the sniffer application to the Zoul ------------------ -make sniffer.upload - -Run Sensniff ------------------ -``` -git clone https://github.com/g-oikonomou/sensniff -cd sensniff/host -python sensniff.py --non-interactive -d /dev/ttyUSB0 -b 460800 -``` - -On another terminal run: - -`sudo wireshark -i /tmp/sensnifff` - diff --git a/examples/zolertia/zoul/cc1200-sniffer/netstack.c b/examples/zolertia/zoul/cc1200-sniffer/netstack.c deleted file mode 100644 index 3aeb6968e..000000000 --- a/examples/zolertia/zoul/cc1200-sniffer/netstack.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/** - * \file - * Stub file overriding core/net/netstack.c. What we want to achieve - * here is call netstack_init from main without initialising the RDC, - * MAC and Network layers. It will just turn on the radio instead. - * - * \author - * George Oikonomou - - */ -#include "netstack.h" -/*---------------------------------------------------------------------------*/ -void -netstack_init(void) -{ - NETSTACK_RADIO.init(); - NETSTACK_RADIO.on(); -} -/*---------------------------------------------------------------------------*/ diff --git a/examples/zolertia/zoul/cc1200-sniffer/project-conf.h b/examples/zolertia/zoul/cc1200-sniffer/project-conf.h deleted file mode 100644 index fca02e711..000000000 --- a/examples/zolertia/zoul/cc1200-sniffer/project-conf.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/** - * \addtogroup zoul-cc1200-sniffer - * @{ - * - * \file - * Project specific configuration defines for the CC1200 sniffer - */ -#ifndef PROJECT_CONF_H_ -#define PROJECT_CONF_H_ - -#define CC1200_CONF_SNIFFER 1 -#define CC1200_RF_CONF_SNIFFER_UART 0 -#define CC1200_CONF_RF_CFG cc1200_802154g_863_870_fsk_50kbps - -#undef NETSTACK_CONF_RADIO -#define NETSTACK_CONF_RADIO cc1200_driver - -#define CC1200_CONF_USE_GPIO2 0 -#define CC1200_CONF_USE_RX_WATCHDOG 0 -#define ANTENNA_SW_SELECT_DEF_CONF ANTENNA_SW_SELECT_SUBGHZ - -#undef NETSTACK_CONF_RDC -#define NETSTACK_CONF_RDC stub_rdc_driver - -#define UART0_CONF_BAUD_RATE 460800 - -#endif /* PROJECT_CONF_H_ */ - -/** @} */ diff --git a/examples/zolertia/zoul/cc1200-sniffer/sniffer.c b/examples/zolertia/zoul/cc1200-sniffer/sniffer.c deleted file mode 100644 index a0241f795..000000000 --- a/examples/zolertia/zoul/cc1200-sniffer/sniffer.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/** - * \addtogroup zoul-examples - * @{ - * - * \defgroup zoul-cc1200-sniffer CC1200 Sniffer - * - * Sniffer for the Zolertia's Zoul CC1200 on-board radio - * - * This example is to be used combined with the sensniff host-side tool, - * which can be downloaded from: https://github.com/g-oikonomou/sensniff - * - * @{ - * - * \file - * Implementation of a Sniffer Process Thread - */ -#include "contiki.h" - -#define DEBUG DEBUG_NONE -#include "net/ip/uip-debug.h" -/*---------------------------------------------------------------------------*/ -PROCESS(sniffer_process, "Sniffer process"); -AUTOSTART_PROCESSES(&sniffer_process); -/*---------------------------------------------------------------------------*/ -PROCESS_THREAD(sniffer_process, ev, data) -{ - PROCESS_BEGIN(); - PRINTF("Sniffer started\n"); - PROCESS_EXIT(); - PROCESS_END(); -} -/*---------------------------------------------------------------------------*/ - -/** - * @} - * @} - */ diff --git a/examples/zolertia/zoul/cc1200-sniffer/stub-rdc.c b/examples/zolertia/zoul/cc1200-sniffer/stub-rdc.c deleted file mode 100644 index a8c54de6a..000000000 --- a/examples/zolertia/zoul/cc1200-sniffer/stub-rdc.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2010, Loughborough University - Computer Science - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -/** - * \file - * Definition of a fake RDC driver to be used with passive - * examples. The sniffer will never send packets and it will never - * push incoming packets up the stack. We do this by defining this - * driver as our RDC. We then drop everything - * - * \author - * George Oikonomou - - */ -#include "net/mac/mac.h" -#include "net/mac/rdc.h" -/*---------------------------------------------------------------------------*/ -static void -send(mac_callback_t sent, void *ptr) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list) -{ - if(sent) { - sent(ptr, MAC_TX_OK, 1); - } -} -/*---------------------------------------------------------------------------*/ -static void -input(void) -{ -} -/*---------------------------------------------------------------------------*/ -static int -on(void) -{ - return 1; -} -/*---------------------------------------------------------------------------*/ -static int -off(int keep_radio_on) -{ - return keep_radio_on; -} -/*---------------------------------------------------------------------------*/ -static unsigned short -cca(void) -{ - return 0; -} -/*---------------------------------------------------------------------------*/ -static void -init(void) -{ -} -/*---------------------------------------------------------------------------*/ -const struct rdc_driver stub_rdc_driver = { - "stub-rdc", - init, - send, - send_list, - input, - on, - off, - cca, -}; -/*---------------------------------------------------------------------------*/ From 07f984eec26fe02198113a0e4c1fd67c3d37df25 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:27:41 +0100 Subject: [PATCH 286/345] Remove legacy sniffer references: Docs --- cpu/cc2538/dbg.h | 2 -- platform/cc2538dk/README.md | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/cpu/cc2538/dbg.h b/cpu/cc2538/dbg.h index 2e283c0b1..4ac02148a 100644 --- a/cpu/cc2538/dbg.h +++ b/cpu/cc2538/dbg.h @@ -39,8 +39,6 @@ * On the cc2538, character I/O can be directed over USB or UART. This is * controlled by a series of configuration directives: * - SLIP_ARCH_CONF_USB: Controls the operation of slip-arch. - * - CC2538_RF_CONF_SNIFFER_USB: Controls the output of the RF driver when - * operating as a sniffer * - DBG_CONF_USB: Controls all debugging output * * Defaults for those defines are set in contiki-conf.h diff --git a/platform/cc2538dk/README.md b/platform/cc2538dk/README.md index 4bcb2c6f4..540055035 100644 --- a/platform/cc2538dk/README.md +++ b/platform/cc2538dk/README.md @@ -337,7 +337,7 @@ More things to play around with Build a Sniffer - Live Traffic Capture with Wireshark ----------------------------------------------------- -There is a sniffer example in `examples/cc2538dk/sniffer/` +There is a sniffer example in `examples/sensniff/` Diverging from platform defaults, this example configures the UART to use a baud rate of 460800. The reason is that sniffers operating at 115200 are liable to corrupt frames. This is almost certain to occur when sniffing a ContikiMAC-based deployment. See more details on how to configure UART baud rates in the "Advanced Topics" section. @@ -366,7 +366,6 @@ Switching between UART and USB (CDC-ACM) By default, everything is configured to use the UART (stdio, border router's SLIP, sniffer's output stream). If you want to change this, these are the relevant lines in contiki-conf.h (0: UART, 1: USB): #define SLIP_ARCH_CONF_USB 0 /** SLIP over UART by default */ - #define CC2538_RF_CONF_SNIFFER_USB 0 /** Sniffer out over UART by default */ #define DBG_CONF_USB 0 /** All debugging over UART by default */ You can multiplex things (for instance, SLIP as well as debugging over USB or SLIP over USB but debugging over UART and other combinations). @@ -377,7 +376,6 @@ By default, everything is configured to use the UART0 (stdio, border router's SL #define SERIAL_LINE_CONF_UART 0 #define SLIP_ARCH_CONF_UART 0 - #define CC2538_RF_CONF_SNIFFER_UART 0 #define DBG_CONF_UART 0 #define UART1_CONF_UART 0 From 4a4b3a344d80a3262b44b9bd7d9575ca801e856a Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:28:12 +0100 Subject: [PATCH 287/345] Remove legacy sniffer configuration: cc2538dk --- platform/cc2538dk/contiki-conf.h | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/platform/cc2538dk/contiki-conf.h b/platform/cc2538dk/contiki-conf.h index 64179b983..4707f2cc8 100644 --- a/platform/cc2538dk/contiki-conf.h +++ b/platform/cc2538dk/contiki-conf.h @@ -150,10 +150,6 @@ typedef uint32_t rtimer_clock_t; #define SLIP_ARCH_CONF_USB 0 /**< SLIP over UART by default */ #endif -#ifndef CC2538_RF_CONF_SNIFFER_USB -#define CC2538_RF_CONF_SNIFFER_USB 0 /**< Sniffer out over UART by default */ -#endif - #ifndef DBG_CONF_USB #define DBG_CONF_USB 0 /**< All debugging over UART by default */ #endif @@ -168,12 +164,6 @@ typedef uint32_t rtimer_clock_t; #endif #endif -#if !CC2538_RF_CONF_SNIFFER_USB -#ifndef CC2538_RF_CONF_SNIFFER_UART -#define CC2538_RF_CONF_SNIFFER_UART 0 /**< UART to use with sniffer */ -#endif -#endif - #if !DBG_CONF_USB #ifndef DBG_CONF_UART #define DBG_CONF_UART 0 /**< UART to use for debugging */ @@ -200,15 +190,6 @@ typedef uint32_t rtimer_clock_t; #endif #endif -/* - * When set, the radio turns off address filtering and sends all captured - * frames down a peripheral (UART or USB, depending on the value of - * CC2538_RF_CONF_SNIFFER_USB) - */ -#ifndef CC2538_RF_CONF_SNIFFER -#define CC2538_RF_CONF_SNIFFER 0 -#endif - /** * \brief Define this as 1 to build a headless node. * @@ -229,12 +210,6 @@ typedef uint32_t rtimer_clock_t; #undef STARTUP_CONF_VERBOSE #define STARTUP_CONF_VERBOSE 0 - -/* Little sanity check: We can't have quiet sniffers */ -#if CC2538_RF_CONF_SNIFFER -#error "CC2538_RF_CONF_SNIFFER == 1 and CC2538_CONF_QUIET == 1" -#error "These values are conflicting. Please set either to 0" -#endif #endif /* CC2538_CONF_QUIET */ /** @@ -243,8 +218,7 @@ typedef uint32_t rtimer_clock_t; #ifndef USB_SERIAL_CONF_ENABLE #define USB_SERIAL_CONF_ENABLE \ ((SLIP_ARCH_CONF_USB & SLIP_ARCH_CONF_ENABLED) | \ - DBG_CONF_USB | \ - (CC2538_RF_CONF_SNIFFER & CC2538_RF_CONF_SNIFFER_USB)) + DBG_CONF_USB) #endif /* @@ -264,9 +238,6 @@ typedef uint32_t rtimer_clock_t; #define UART_IN_USE_BY_SLIP(u) (SLIP_ARCH_CONF_ENABLED && \ !SLIP_ARCH_CONF_USB && \ SLIP_ARCH_CONF_UART == (u)) -#define UART_IN_USE_BY_RF_SNIFFER(u) (CC2538_RF_CONF_SNIFFER && \ - !CC2538_RF_CONF_SNIFFER_USB && \ - CC2538_RF_CONF_SNIFFER_UART == (u)) #define UART_IN_USE_BY_DBG(u) (!DBG_CONF_USB && DBG_CONF_UART == (u)) #define UART_IN_USE_BY_UART1(u) (UART1_CONF_UART == (u)) @@ -274,7 +245,6 @@ typedef uint32_t rtimer_clock_t; UART_CONF_ENABLE && \ (UART_IN_USE_BY_SERIAL_LINE(u) || \ UART_IN_USE_BY_SLIP(u) || \ - UART_IN_USE_BY_RF_SNIFFER(u) || \ UART_IN_USE_BY_DBG(u) || \ UART_IN_USE_BY_UART1(u)) \ ) From 35c37f356c20dc95e0e8cc9bc0901b14449a0b00 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:28:21 +0100 Subject: [PATCH 288/345] Remove legacy sniffer configuration: openmote-cc2538 --- platform/openmote-cc2538/contiki-conf.h | 32 +------------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/platform/openmote-cc2538/contiki-conf.h b/platform/openmote-cc2538/contiki-conf.h index 90cc6d648..def315b7c 100644 --- a/platform/openmote-cc2538/contiki-conf.h +++ b/platform/openmote-cc2538/contiki-conf.h @@ -199,10 +199,6 @@ typedef uint32_t rtimer_clock_t; #define SLIP_ARCH_CONF_USB 0 /**< SLIP over UART by default */ #endif -#ifndef CC2538_RF_CONF_SNIFFER_USB -#define CC2538_RF_CONF_SNIFFER_USB 0 /**< Sniffer out over UART by default */ -#endif - #ifndef DBG_CONF_USB #define DBG_CONF_USB 0 /**< All debugging over UART by default */ #endif @@ -217,12 +213,6 @@ typedef uint32_t rtimer_clock_t; #endif #endif -#if !CC2538_RF_CONF_SNIFFER_USB -#ifndef CC2538_RF_CONF_SNIFFER_UART -#define CC2538_RF_CONF_SNIFFER_UART 0 /**< UART to use with sniffer */ -#endif -#endif - #if !DBG_CONF_USB #ifndef DBG_CONF_UART #define DBG_CONF_UART 0 /**< UART to use for debugging */ @@ -249,15 +239,6 @@ typedef uint32_t rtimer_clock_t; #endif #endif -/* - * When set, the radio turns off address filtering and sends all captured - * frames down a peripheral (UART or USB, depending on the value of - * CC2538_RF_CONF_SNIFFER_USB) - */ -#ifndef CC2538_RF_CONF_SNIFFER -#define CC2538_RF_CONF_SNIFFER 0 -#endif - /** * \brief Define this as 1 to build a headless node. * @@ -278,12 +259,6 @@ typedef uint32_t rtimer_clock_t; #undef STARTUP_CONF_VERBOSE #define STARTUP_CONF_VERBOSE 0 - -/* Little sanity check: We can't have quiet sniffers */ -#if CC2538_RF_CONF_SNIFFER -#error "CC2538_RF_CONF_SNIFFER == 1 and CC2538_CONF_QUIET == 1" -#error "These values are conflicting. Please set either to 0" -#endif #endif /* CC2538_CONF_QUIET */ /** @@ -292,8 +267,7 @@ typedef uint32_t rtimer_clock_t; #ifndef USB_SERIAL_CONF_ENABLE #define USB_SERIAL_CONF_ENABLE \ ((SLIP_ARCH_CONF_USB & SLIP_ARCH_CONF_ENABLED) | \ - DBG_CONF_USB | \ - (CC2538_RF_CONF_SNIFFER & CC2538_RF_CONF_SNIFFER_USB)) + DBG_CONF_USB) #endif /* @@ -313,9 +287,6 @@ typedef uint32_t rtimer_clock_t; #define UART_IN_USE_BY_SLIP(u) (SLIP_ARCH_CONF_ENABLED && \ !SLIP_ARCH_CONF_USB && \ SLIP_ARCH_CONF_UART == (u)) -#define UART_IN_USE_BY_RF_SNIFFER(u) (CC2538_RF_CONF_SNIFFER && \ - !CC2538_RF_CONF_SNIFFER_USB && \ - CC2538_RF_CONF_SNIFFER_UART == (u)) #define UART_IN_USE_BY_DBG(u) (!DBG_CONF_USB && DBG_CONF_UART == (u)) #define UART_IN_USE_BY_UART1(u) (UART1_CONF_UART == (u)) @@ -323,7 +294,6 @@ typedef uint32_t rtimer_clock_t; UART_CONF_ENABLE && \ (UART_IN_USE_BY_SERIAL_LINE(u) || \ UART_IN_USE_BY_SLIP(u) || \ - UART_IN_USE_BY_RF_SNIFFER(u) || \ UART_IN_USE_BY_DBG(u) || \ UART_IN_USE_BY_UART1(u)) \ ) From d7028652fe449f584edfba34a6bf09716cb86a86 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:28:31 +0100 Subject: [PATCH 289/345] Remove legacy sniffer configuration: zoul --- platform/zoul/contiki-conf.h | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/platform/zoul/contiki-conf.h b/platform/zoul/contiki-conf.h index bf9754730..d7fdcb39f 100644 --- a/platform/zoul/contiki-conf.h +++ b/platform/zoul/contiki-conf.h @@ -197,10 +197,6 @@ typedef uint32_t rtimer_clock_t; #define SLIP_ARCH_CONF_USB 0 /**< SLIP over UART by default */ #endif -#ifndef CC2538_RF_CONF_SNIFFER_USB -#define CC2538_RF_CONF_SNIFFER_USB 0 /**< Sniffer out over UART by default */ -#endif - #ifndef DBG_CONF_USB #define DBG_CONF_USB 0 /**< All debugging over UART by default */ #endif @@ -215,12 +211,6 @@ typedef uint32_t rtimer_clock_t; #endif #endif -#if !CC2538_RF_CONF_SNIFFER_USB -#ifndef CC2538_RF_CONF_SNIFFER_UART -#define CC2538_RF_CONF_SNIFFER_UART 0 /**< UART to use with sniffer */ -#endif -#endif - #if !DBG_CONF_USB #ifndef DBG_CONF_UART #define DBG_CONF_UART 0 /**< UART to use for debugging */ @@ -247,15 +237,6 @@ typedef uint32_t rtimer_clock_t; #endif #endif -/* - * When set, the radio turns off address filtering and sends all captured - * frames down a peripheral (UART or USB, depending on the value of - * CC2538_RF_CONF_SNIFFER_USB) - */ -#ifndef CC2538_RF_CONF_SNIFFER -#define CC2538_RF_CONF_SNIFFER 0 -#endif - /** * \brief Define this as 1 to build a headless node. * @@ -276,12 +257,6 @@ typedef uint32_t rtimer_clock_t; #undef STARTUP_CONF_VERBOSE #define STARTUP_CONF_VERBOSE 0 - -/* Little sanity check: We can't have quiet sniffers */ -#if CC2538_RF_CONF_SNIFFER -#error "CC2538_RF_CONF_SNIFFER == 1 and CC2538_CONF_QUIET == 1" -#error "These values are conflicting. Please set either to 0" -#endif #endif /* CC2538_CONF_QUIET */ /** @@ -290,8 +265,7 @@ typedef uint32_t rtimer_clock_t; #ifndef USB_SERIAL_CONF_ENABLE #define USB_SERIAL_CONF_ENABLE \ ((SLIP_ARCH_CONF_USB & SLIP_ARCH_CONF_ENABLED) | \ - DBG_CONF_USB | \ - (CC2538_RF_CONF_SNIFFER & CC2538_RF_CONF_SNIFFER_USB)) + DBG_CONF_USB) #endif /* @@ -311,9 +285,6 @@ typedef uint32_t rtimer_clock_t; #define UART_IN_USE_BY_SLIP(u) (SLIP_ARCH_CONF_ENABLED && \ !SLIP_ARCH_CONF_USB && \ SLIP_ARCH_CONF_UART == (u)) -#define UART_IN_USE_BY_RF_SNIFFER(u) (CC2538_RF_CONF_SNIFFER && \ - !CC2538_RF_CONF_SNIFFER_USB && \ - CC2538_RF_CONF_SNIFFER_UART == (u)) #define UART_IN_USE_BY_DBG(u) (!DBG_CONF_USB && DBG_CONF_UART == (u)) #define UART_IN_USE_BY_UART1(u) (UART1_CONF_UART == (u)) @@ -321,7 +292,6 @@ typedef uint32_t rtimer_clock_t; UART_CONF_ENABLE && \ (UART_IN_USE_BY_SERIAL_LINE(u) || \ UART_IN_USE_BY_SLIP(u) || \ - UART_IN_USE_BY_RF_SNIFFER(u) || \ UART_IN_USE_BY_DBG(u) || \ UART_IN_USE_BY_UART1(u)) \ ) From 983a618a3625ed9bd9312dd0e7261040e59b228c Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:03:35 +0100 Subject: [PATCH 290/345] Extend CC13xx PROP mode driver We now write a dummy LQI in read() and we also add support for `RADIO_PARAM_RX_MODE` in `set_value()` --- cpu/cc26xx-cc13xx/rf-core/prop-mode.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c index a46e651f0..8c185c579 100644 --- a/cpu/cc26xx-cc13xx/rf-core/prop-mode.c +++ b/cpu/cc26xx-cc13xx/rf-core/prop-mode.c @@ -763,6 +763,7 @@ read_frame(void *buf, unsigned short buf_len) } packetbuf_set_attr(PACKETBUF_ATTR_RSSI, (int8_t)data_ptr[len]); + packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, 0x7F); } /* Move read entry pointer to next entry */ @@ -1050,6 +1051,8 @@ set_value(radio_param_t param, radio_value_t value) rv = RADIO_RESULT_ERROR; } + return RADIO_RESULT_OK; + case RADIO_PARAM_RX_MODE: return RADIO_RESULT_OK; case RADIO_PARAM_CCA_THRESHOLD: rssi_threshold = (int8_t)value; From 39e8435141dfa79bb75b7d028b24a3a591262853 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:04:16 +0100 Subject: [PATCH 291/345] Add 460800 baud rate support to Z1 --- platform/z1/contiki-z1-main.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/platform/z1/contiki-z1-main.c b/platform/z1/contiki-z1-main.c index 92a7b5bd7..8783b3f94 100644 --- a/platform/z1/contiki-z1-main.c +++ b/platform/z1/contiki-z1-main.c @@ -104,7 +104,12 @@ static uint8_t is_gateway; #endif void init_platform(void); - +/*---------------------------------------------------------------------------*/ +#ifdef UART0_CONF_BAUD_RATE +#define UART0_BAUD_RATE UART0_CONF_BAUD_RATE +#else +#define UART0_BAUD_RATE 115200 +#endif /*---------------------------------------------------------------------------*/ #if 0 int @@ -202,9 +207,9 @@ main(int argc, char **argv) clock_wait(100); - uart0_init(BAUD2UBR(115200)); /* Must come before first printf */ + uart0_init(BAUD2UBR(UART0_BAUD_RATE)); /* Must come before first printf */ #if NETSTACK_CONF_WITH_IPV4 - slip_arch_init(BAUD2UBR(115200)); + slip_arch_init(BAUD2UBR(UART0_BAUD_RATE)); #endif /* NETSTACK_CONF_WITH_IPV4 */ xmem_init(); From a8dcb6566e7b7eb271d178ccc78871412f4ba481 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:05:27 +0100 Subject: [PATCH 292/345] Add sensniff example core files --- examples/sensniff/netstack.c | 38 ++++ examples/sensniff/project-conf.h | 41 ++++ examples/sensniff/sensniff-rdc.c | 94 +++++++++ examples/sensniff/sensniff.c | 344 +++++++++++++++++++++++++++++++ examples/sensniff/sensniff.h | 45 ++++ 5 files changed, 562 insertions(+) create mode 100644 examples/sensniff/netstack.c create mode 100644 examples/sensniff/project-conf.h create mode 100644 examples/sensniff/sensniff-rdc.c create mode 100644 examples/sensniff/sensniff.c create mode 100644 examples/sensniff/sensniff.h diff --git a/examples/sensniff/netstack.c b/examples/sensniff/netstack.c new file mode 100644 index 000000000..14068ce77 --- /dev/null +++ b/examples/sensniff/netstack.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2010, Loughborough University - Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "netstack.h" +/*---------------------------------------------------------------------------*/ +void +netstack_init(void) +{ + NETSTACK_RADIO.init(); + NETSTACK_RDC.init(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/project-conf.h b/examples/sensniff/project-conf.h new file mode 100644 index 000000000..4d703fc43 --- /dev/null +++ b/examples/sensniff/project-conf.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef PROJECT_CONF_H_ +#define PROJECT_CONF_H_ +/*---------------------------------------------------------------------------*/ +#undef NETSTACK_CONF_RDC +#define NETSTACK_CONF_RDC sensniff_rdc_driver +/*---------------------------------------------------------------------------*/ +/* Include platform-specific header */ +#include "target-conf.h" +/*---------------------------------------------------------------------------*/ +#endif /* PROJECT_CONF_H_ */ diff --git a/examples/sensniff/sensniff-rdc.c b/examples/sensniff/sensniff-rdc.c new file mode 100644 index 000000000..3a5eef428 --- /dev/null +++ b/examples/sensniff/sensniff-rdc.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * Copyright (c) 2012-2013, Centre National de la Recherche Scientifique. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/* + * Author: George Oikonomou + * Loosely based on the example contributed by Etienne Duble (CNRS / LIG), as + * part of the work done for the ANR ARESA2 project. + */ +/*---------------------------------------------------------------------------*/ +#include "net/mac/mac.h" +#include "net/mac/rdc.h" +#include "net/netstack.h" +#include "sensniff.h" +/*---------------------------------------------------------------------------*/ +static void +send(mac_callback_t sent, void *ptr) +{ +} +/*---------------------------------------------------------------------------*/ +static void +send_list(mac_callback_t sent, void *ptr, struct rdc_buf_list *list) +{ +} +/*---------------------------------------------------------------------------*/ +static void +input(void) +{ + sensniff_output_frame(); +} +/*---------------------------------------------------------------------------*/ +static int +on(void) +{ + NETSTACK_RADIO.on(); + return 1; +} +/*---------------------------------------------------------------------------*/ +static int +off(int keep_radio_on) +{ + return keep_radio_on; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +cca(void) +{ + return 0; +} +/*---------------------------------------------------------------------------*/ +static void +init(void) +{ + on(); +} +/*---------------------------------------------------------------------------*/ +const struct rdc_driver sensniff_rdc_driver = { + "sensniff-rdc", + init, + send, + send_list, + input, + on, + off, + cca, +}; +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/sensniff.c b/examples/sensniff/sensniff.c new file mode 100644 index 000000000..93f39ac04 --- /dev/null +++ b/examples/sensniff/sensniff.c @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "sensniff.h" +#include "dev/radio.h" +#include "net/netstack.h" +#include "net/packetbuf.h" +#include "sys/process.h" +#include "sys/ctimer.h" +#include "lib/ringbuf.h" + +#include SENSNIFF_IO_DRIVER_H + +#include +#include +#include +/*---------------------------------------------------------------------------*/ +#define DEBUG 1 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +PROCESS(sensniff_process, "sensniff process"); +AUTOSTART_PROCESSES(&sensniff_process); +/*---------------------------------------------------------------------------*/ +/* Timeout handling for incoming characters. */ +#define TIMEOUT (CLOCK_SECOND >> 1) +static struct ctimer ct; +/*---------------------------------------------------------------------------*/ +#define STATE_WAITING_FOR_MAGIC 0x00 +#define STATE_WAITING_FOR_VERSION 0x01 +#define STATE_WAITING_FOR_CMD 0x02 +#define STATE_WAITING_FOR_LEN_1 0x03 +#define STATE_WAITING_FOR_LEN_2 0x04 +#define STATE_WAITING_FOR_DATA 0x05 + +static uint8_t state; +static uint8_t in_ct; +/*---------------------------------------------------------------------------*/ +#define CMD_FRAME 0x00 +#define CMD_CHANNEL 0x01 +#define CMD_CHANNEL_MIN 0x02 +#define CMD_CHANNEL_MAX 0x03 +#define CMD_ERR_NOT_SUPPORTED 0x7F +#define CMD_GET_CHANNEL 0x81 +#define CMD_GET_CHANNEL_MIN 0x82 +#define CMD_GET_CHANNEL_MAX 0x83 +#define CMD_SET_CHANNEL 0x84 +/*---------------------------------------------------------------------------*/ +#define PROTOCOL_VERSION 2 +/*---------------------------------------------------------------------------*/ +#define BUFSIZE 32 + +static struct ringbuf rxbuf; + +typedef struct cmd_in_s { + uint8_t cmd; + uint16_t len; + uint8_t data; +} cmd_in_t; + +static cmd_in_t command; + +uint8_t cmd_buf[BUFSIZE]; +/*---------------------------------------------------------------------------*/ +static const uint8_t magic[] = { 0xC1, 0x1F, 0xFE, 0x72 }; +/*---------------------------------------------------------------------------*/ +static void +reset_state(void *byte) +{ + state = STATE_WAITING_FOR_MAGIC; + in_ct = 0; + memset(&command, 0, sizeof(command)); +} +/*---------------------------------------------------------------------------*/ +static void +send_header(uint8_t cmd, uint16_t len) +{ + uint16_t i; + + /* Send the magic */ + for(i = 0; i < 4; i++) { + sensniff_io_byte_out(magic[i]); + } + + /* Send the protocol version */ + sensniff_io_byte_out(PROTOCOL_VERSION); + + /* Send the command byte */ + sensniff_io_byte_out(cmd); + + /* Send the length, network endianness */ + sensniff_io_byte_out(len >> 8); + sensniff_io_byte_out(len & 0xFF); +} +/*---------------------------------------------------------------------------*/ +static void +send_error(void) +{ + send_header(CMD_ERR_NOT_SUPPORTED, 0); + + sensniff_io_flush(); +} +/*---------------------------------------------------------------------------*/ +static void +send_channel(void) +{ + radio_value_t chan; + + if(NETSTACK_RADIO.get_value(RADIO_PARAM_CHANNEL, &chan) == + RADIO_RESULT_OK) { + send_header(CMD_CHANNEL, 1); + sensniff_io_byte_out(chan & 0xFF); + sensniff_io_flush(); + return; + } + + send_error(); +} +/*---------------------------------------------------------------------------*/ +static void +set_channel(uint8_t channel) +{ + if(NETSTACK_RADIO.set_value(RADIO_PARAM_CHANNEL, channel) == + RADIO_RESULT_OK) { + send_channel(); + return; + } + + send_error(); +} +/*---------------------------------------------------------------------------*/ +static void +send_channel_min(void) +{ + radio_value_t chan; + + if(NETSTACK_RADIO.get_value(RADIO_CONST_CHANNEL_MIN, &chan) == + RADIO_RESULT_OK) { + send_header(CMD_CHANNEL_MIN, 1); + sensniff_io_byte_out(chan & 0xFF); + sensniff_io_flush(); + return; + } + + send_error(); +} +/*---------------------------------------------------------------------------*/ +static void +send_channel_max(void) +{ + radio_value_t chan; + + if(NETSTACK_RADIO.get_value(RADIO_CONST_CHANNEL_MAX, &chan) == + RADIO_RESULT_OK) { + send_header(CMD_CHANNEL_MAX, 1); + sensniff_io_byte_out(chan & 0xFF); + sensniff_io_flush(); + return; + } + + send_error(); +} +/*---------------------------------------------------------------------------*/ +static int +char_in(unsigned char c) +{ + /* Bump the timeout counter */ + ctimer_set(&ct, TIMEOUT, reset_state, NULL); + + /* Add the character to our ringbuf and poll the consumer process. */ + ringbuf_put(&rxbuf, c); + + process_poll(&sensniff_process); + return 1; +} +/*---------------------------------------------------------------------------*/ +void +sensniff_output_frame() +{ + int i; + uint8_t len = packetbuf_datalen() & 0xFF; + + send_header(CMD_FRAME, len + 2); + + for(i = 0; i < len; i++) { + sensniff_io_byte_out(((uint8_t *)packetbuf_dataptr())[i]); + } + + sensniff_io_byte_out(packetbuf_attr(PACKETBUF_ATTR_RSSI) & 0xFF); + sensniff_io_byte_out(0x80 | + (packetbuf_attr(PACKETBUF_ATTR_LINK_QUALITY) & 0xFF)); + + sensniff_io_flush(); +} +/*---------------------------------------------------------------------------*/ +static void +execute_command(void) +{ + switch(command.cmd) { + case CMD_GET_CHANNEL: + send_channel(); + break; + case CMD_GET_CHANNEL_MIN: + send_channel_min(); + break; + case CMD_GET_CHANNEL_MAX: + send_channel_max(); + break; + case CMD_SET_CHANNEL: + set_channel(command.data); + break; + default: + send_error(); + break; + } +} +/*---------------------------------------------------------------------------*/ +static void +process_incoming_data(void) +{ + int c = 0; + uint8_t byte_in; + + c = ringbuf_get(&rxbuf); + + while(c != -1) { + byte_in = (uint8_t)c; + switch(state) { + case STATE_WAITING_FOR_MAGIC: + if(byte_in == magic[in_ct]) { + in_ct++; + if(in_ct == sizeof(magic)) { + state = STATE_WAITING_FOR_VERSION; + in_ct = 0; + } + } else { + reset_state(&byte_in); + } + break; + case STATE_WAITING_FOR_VERSION: + if(byte_in == PROTOCOL_VERSION) { + state = STATE_WAITING_FOR_CMD; + } else { + reset_state(&byte_in); + } + break; + case STATE_WAITING_FOR_CMD: + command.cmd = byte_in; + + if(command.cmd == CMD_GET_CHANNEL || + command.cmd == CMD_GET_CHANNEL_MIN || + command.cmd == CMD_GET_CHANNEL_MAX) { + execute_command(); + reset_state(&byte_in); + } else { + state = STATE_WAITING_FOR_LEN_1; + } + break; + case STATE_WAITING_FOR_LEN_1: + command.len = byte_in << 8; + state = STATE_WAITING_FOR_LEN_2; + break; + case STATE_WAITING_FOR_LEN_2: + command.len |= byte_in; + if(command.len == 1) { + state = STATE_WAITING_FOR_DATA; + } else { + reset_state(&byte_in); + } + break; + case STATE_WAITING_FOR_DATA: + command.data = byte_in; + execute_command(); + reset_state(&byte_in); + break; + default: + break; + } + c = ringbuf_get(&rxbuf); + } +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(sensniff_process, ev, data) +{ + PROCESS_BEGIN(); + + /* Turn off RF frame filtering and H/W ACKs */ + if(NETSTACK_RADIO.set_value(RADIO_PARAM_RX_MODE, 0) != RADIO_RESULT_OK) { + PRINTF("sensniff: Error setting RF in promiscuous mode\n"); + PROCESS_EXIT(); + } + + /* Initialise the ring buffer */ + ringbuf_init(&rxbuf, cmd_buf, sizeof(cmd_buf)); + + /* Initialise the state machine */ + reset_state(NULL); + + /* Register for char inputs with the character I/O peripheral */ + sensniff_io_set_input(&char_in); + + while(1) { + PROCESS_YIELD(); + + if(ev == PROCESS_EVENT_POLL) { + process_incoming_data(); + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/sensniff.h b/examples/sensniff/sensniff.h new file mode 100644 index 000000000..cbddcb8ca --- /dev/null +++ b/examples/sensniff/sensniff.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef SENSNIFF_H_ +#define SENSNIFF_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" + +#include +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_ERROR 0xFF +#define SENSNIFF_OK 0x00 +/*---------------------------------------------------------------------------*/ +void sensniff_output_frame(void); +/*---------------------------------------------------------------------------*/ +#endif /* SENSNIFF_H_ */ +/*---------------------------------------------------------------------------*/ From c5a3a4e05e451ec5b571cb11cef189d6a2f68a23 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:06:07 +0100 Subject: [PATCH 293/345] Add off-the-shelf sensniff drivers Can be re-used by any platform that uses any of those CPUs --- examples/sensniff/pool/cc13xx-cc26xx-io.h | 43 +++++++++++++ examples/sensniff/pool/cc2530-cc2531-io.h | 43 +++++++++++++ examples/sensniff/pool/cc2538-io.h | 76 +++++++++++++++++++++++ examples/sensniff/pool/msp430-io.h | 56 +++++++++++++++++ 4 files changed, 218 insertions(+) create mode 100644 examples/sensniff/pool/cc13xx-cc26xx-io.h create mode 100644 examples/sensniff/pool/cc2530-cc2531-io.h create mode 100644 examples/sensniff/pool/cc2538-io.h create mode 100644 examples/sensniff/pool/msp430-io.h diff --git a/examples/sensniff/pool/cc13xx-cc26xx-io.h b/examples/sensniff/pool/cc13xx-cc26xx-io.h new file mode 100644 index 000000000..556fd669a --- /dev/null +++ b/examples/sensniff/pool/cc13xx-cc26xx-io.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef CC13XX_CC26XX_IO_H_ +#define CC13XX_CC26XX_IO_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/cc26xx-uart.h" +/*---------------------------------------------------------------------------*/ +#define sensniff_io_byte_out(b) cc26xx_uart_write_byte(b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) cc26xx_uart_set_input(f) +/*---------------------------------------------------------------------------*/ +#endif /* CC13XX_CC26XX_IO_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/pool/cc2530-cc2531-io.h b/examples/sensniff/pool/cc2530-cc2531-io.h new file mode 100644 index 000000000..08ecc289d --- /dev/null +++ b/examples/sensniff/pool/cc2530-cc2531-io.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef CC2530_CC2531_IO_H_ +#define CC2530_CC2531_IO_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/io-arch.h" +/*---------------------------------------------------------------------------*/ +#define sensniff_io_byte_out(b) io_arch_writeb(b) +#define sensniff_io_flush() io_arch_flush() +#define sensniff_io_set_input(f) io_arch_set_input(f) +/*---------------------------------------------------------------------------*/ +#endif /* CC2530_CC2531_IO_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/pool/cc2538-io.h b/examples/sensniff/pool/cc2538-io.h new file mode 100644 index 000000000..ee82ce0a4 --- /dev/null +++ b/examples/sensniff/pool/cc2538-io.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/uart.h" +#include "usb/usb-serial.h" +/*---------------------------------------------------------------------------*/ +#ifndef CC2538_IO_H_ +#define CC2538_IO_H_ +/*---------------------------------------------------------------------------*/ +/* + * Select whether to use native USB as sensniff's I/O interface. + * If defined as 0, UART will be used. Set to 1 to use USB. + */ +#ifdef CC2538_IO_CONF_USB +#define CC2538_IO_USB CC2538_IO_CONF_USB +#else +#define CC2538_IO_USB 0 +#endif +/*---------------------------------------------------------------------------*/ +/* + * UART instance selection. Set to 1 to use UART1. + * Ignored unless CC2538_IO_USB is 0. + */ +#ifdef CC2538_IO_CONF_USE_UART1 +#define CC2538_IO_USE_UART1 CC2538_IO_CONF_USE_UART1 +#else +#define CC2538_IO_USE_UART1 0 +#endif +/*---------------------------------------------------------------------------*/ +#if CC2538_IO_USB +#define sensniff_io_byte_out(b) usb_serial_writeb(b) +#define sensniff_io_flush() usb_serial_flush() +#define sensniff_io_set_input(f) usb_serial_set_input(f) +#else +#if CC2538_IO_USE_UART1 +#define sensniff_io_byte_out(b) uart_write_byte(1, b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) uart_set_input(1, f) +#else +#define sensniff_io_byte_out(b) uart_write_byte(0, b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) uart_set_input(0, f) +#endif /* CC2538_IO_USE_UART_1 */ +#endif /* CC2538_IO_USB */ +/*---------------------------------------------------------------------------*/ +#endif /* CC2538_IO_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/pool/msp430-io.h b/examples/sensniff/pool/msp430-io.h new file mode 100644 index 000000000..a4fefc641 --- /dev/null +++ b/examples/sensniff/pool/msp430-io.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef MSP430_IO_H_ +#define MSP430_IO_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/uart0.h" +#include "dev/uart1.h" +/*---------------------------------------------------------------------------*/ +#ifdef MSP430_IO_CONF_USE_UART1 +#define MSP430_IO_USE_UART1 MSP430_IO_CONF_USE_UART1 +#else +#define MSP430_IO_USE_UART1 0 +#endif +/*---------------------------------------------------------------------------*/ +#if MSP430_IO_USE_UART1 +#define sensniff_io_byte_out(b) uart1_writeb(b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) uart1_set_input(f) +#else +#define sensniff_io_byte_out(b) uart0_writeb(b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) uart0_set_input(f) +#endif +/*---------------------------------------------------------------------------*/ +#endif /* MSP430_IO_H_ */ +/*---------------------------------------------------------------------------*/ From 1e6730758d58632500dbc4af2cd4d736db209bfd Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:06:58 +0100 Subject: [PATCH 294/345] Add sensniff support: cc2530dk --- examples/sensniff/cc2530dk/Makefile.cc2530dk | 1 + examples/sensniff/cc2530dk/target-conf.h | 49 ++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 examples/sensniff/cc2530dk/Makefile.cc2530dk create mode 100644 examples/sensniff/cc2530dk/target-conf.h diff --git a/examples/sensniff/cc2530dk/Makefile.cc2530dk b/examples/sensniff/cc2530dk/Makefile.cc2530dk new file mode 100644 index 000000000..35c94610a --- /dev/null +++ b/examples/sensniff/cc2530dk/Makefile.cc2530dk @@ -0,0 +1 @@ +HAVE_BANKING = 1 diff --git a/examples/sensniff/cc2530dk/target-conf.h b/examples/sensniff/cc2530dk/target-conf.h new file mode 100644 index 000000000..69e405390 --- /dev/null +++ b/examples/sensniff/cc2530dk/target-conf.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +/* Change to 0 to build for the SmartRF + cc2530 EM */ +#define MODELS_CONF_CC2531_USB_STICK 1 +/*---------------------------------------------------------------------------*/ +/* Don't change below this line */ +#define ADC_SENSOR_CONF_ON 0 +#define LPM_CONF_MODE 0 +#define UART0_CONF_HIGH_SPEED 1 +#define UART0_RTSCTS 1 +#define UART0_CONF_WITH_INPUT 1 +#define USB_SERIAL_CONF_BUFFERED 1 +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "pool/cc2530-cc2531-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From 690c299bb01ca567fffab88ed3aab9b2e65c0548 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:08:04 +0100 Subject: [PATCH 295/345] Add sensniff support: cc2538dk --- examples/sensniff/cc2538dk/target-conf.h | 54 ++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 examples/sensniff/cc2538dk/target-conf.h diff --git a/examples/sensniff/cc2538dk/target-conf.h b/examples/sensniff/cc2538dk/target-conf.h new file mode 100644 index 000000000..56aadcb4b --- /dev/null +++ b/examples/sensniff/cc2538dk/target-conf.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +/* + * Selection of Sensniff I/O Interface. + * Define CC2538_IO_CONF_USB as 0 to use UART as sensniff's interface. + * This will default to using UART0, unless you also define + * CC2538_IO_CONF_USE_UART_1 as 1. + * + * Don't forget to also set a correct baud rate (460800 or higher) by defining + * the corresponding UART0_CONF_BAUD_RATE or UART1_CONF_BAUD_RATE + */ +#define CC2538_IO_CONF_USB 1 +#define CC2538_IO_CONF_USE_UART1 0 +/*---------------------------------------------------------------------------*/ +#if CC2538_IO_CONF_USB +#define USB_SERIAL_CONF_ENABLE 1 +#endif +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "pool/cc2538-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From 63941d849aa45952b69f82ab3a02d51998619809 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:08:18 +0100 Subject: [PATCH 296/345] Add sensniff support: jn516x --- examples/sensniff/jn516x/jn516x-io.h | 56 ++++++++++++++++++++++++++ examples/sensniff/jn516x/target-conf.h | 38 +++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 examples/sensniff/jn516x/jn516x-io.h create mode 100644 examples/sensniff/jn516x/target-conf.h diff --git a/examples/sensniff/jn516x/jn516x-io.h b/examples/sensniff/jn516x/jn516x-io.h new file mode 100644 index 000000000..d38ae91eb --- /dev/null +++ b/examples/sensniff/jn516x/jn516x-io.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef JN516X_IO_H_ +#define JN516X_IO_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/uart0.h" +#include "dev/uart1.h" +/*---------------------------------------------------------------------------*/ +#ifdef JN516X_IO_CONF_USE_UART1 +#define JN516X_IO_USE_UART1 JN516X_IO_CONF_USE_UART1 +#else +#define JN516X_IO_USE_UART1 0 +#endif +/*---------------------------------------------------------------------------*/ +#if JN516X_IO_USE_UART1 +#define sensniff_io_byte_out(b) uart1_writeb(b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) uart1_set_input(f) +#else +#define sensniff_io_byte_out(b) uart0_writeb(b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) uart0_set_input(f) +#endif +/*---------------------------------------------------------------------------*/ +#endif /* JN516X_IO_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/jn516x/target-conf.h b/examples/sensniff/jn516x/target-conf.h new file mode 100644 index 000000000..8f30be7b2 --- /dev/null +++ b/examples/sensniff/jn516x/target-conf.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "jn516x/jn516x-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From 525bafcc3c813144bf3ea148bac3a10f9c979013 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:08:46 +0100 Subject: [PATCH 297/345] Add sensniff support: openmote-cc2538 --- .../sensniff/openmote-cc2538/target-conf.h | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 examples/sensniff/openmote-cc2538/target-conf.h diff --git a/examples/sensniff/openmote-cc2538/target-conf.h b/examples/sensniff/openmote-cc2538/target-conf.h new file mode 100644 index 000000000..c4591eacb --- /dev/null +++ b/examples/sensniff/openmote-cc2538/target-conf.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +/* + * Selection of Sensniff I/O Interface. + * Define CC2538_IO_CONF_USB as 0 to use UART as sensniff's interface. + * This will default to using UART0, unless you also define + * CC2538_IO_CONF_USE_UART1 as 1. + * + * Don't forget to also set a correct baud rate (460800 or higher) by defining + * the corresponding UART0_CONF_BAUD_RATE or UART1_CONF_BAUD_RATE + */ +#define CC2538_IO_CONF_USB 0 +#define CC2538_IO_CONF_USE_UART1 0 +/*---------------------------------------------------------------------------*/ +#if CC2538_IO_CONF_USB +#define USB_SERIAL_CONF_ENABLE 1 +#else +#define UART0_CONF_BAUD_RATE 460800 +#endif +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "pool/cc2538-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From 3cebc42a2aff90b58106f1b3afb89d6792112f74 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:09:06 +0100 Subject: [PATCH 298/345] Add sensniff support: cc13xx/cc26xx --- examples/sensniff/srf06-cc26xx/target-conf.h | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 examples/sensniff/srf06-cc26xx/target-conf.h diff --git a/examples/sensniff/srf06-cc26xx/target-conf.h b/examples/sensniff/srf06-cc26xx/target-conf.h new file mode 100644 index 000000000..4d9deffda --- /dev/null +++ b/examples/sensniff/srf06-cc26xx/target-conf.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +#define CC26XX_UART_CONF_BAUD_RATE 460800 +#define RF_BLE_CONF_ENABLED 0 +#define ROM_BOOTLOADER_ENABLE 1 +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "pool/cc13xx-cc26xx-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From d8fcaf9decf9ab51d980e858a51aebdf0329ca20 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:09:18 +0100 Subject: [PATCH 299/345] Add sensniff support: z1 --- examples/sensniff/z1/target-conf.h | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 examples/sensniff/z1/target-conf.h diff --git a/examples/sensniff/z1/target-conf.h b/examples/sensniff/z1/target-conf.h new file mode 100644 index 000000000..6e3db2b48 --- /dev/null +++ b/examples/sensniff/z1/target-conf.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +#define MSP430_IO_CONF_USE_UART1 0 +#define UART0_CONF_BAUD_RATE 460800 +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "pool/msp430-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From 23eb3756c054a42de9d7f37a44995648263c7785 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Fri, 12 Aug 2016 13:21:09 +0200 Subject: [PATCH 300/345] Zoul: added firefly to motelist targets --- tools/zolertia/motelist-zolertia | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/zolertia/motelist-zolertia b/tools/zolertia/motelist-zolertia index e286887ac..75b95b3b9 100755 --- a/tools/zolertia/motelist-zolertia +++ b/tools/zolertia/motelist-zolertia @@ -57,6 +57,8 @@ if( $Opt{board} eq "z1" ) { $Opt{board} = "Zolertia Z1"; } elsif( $Opt{board} eq "remote" ) { $Opt{board} = "Zolertia RE-Mote platform"; +} elsif( $Opt{board} eq "firefly" ) { + $Opt{board} = "Zolertia Firefly platform"; } my @devs = $Opt{method} eq "procfs" ? scan_procfs() : scan_sysfs(); From 8bca7032823d166822aee1cb8a167bbf79355033 Mon Sep 17 00:00:00 2001 From: Yasuyuki Tanaka Date: Fri, 12 Aug 2016 14:05:14 +0200 Subject: [PATCH 301/345] Remove RPL_CONF_WITH_NON_STORING definition --- examples/ipv6/rpl-udp/project-conf.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/ipv6/rpl-udp/project-conf.h b/examples/ipv6/rpl-udp/project-conf.h index 794897a46..1d0a04d52 100644 --- a/examples/ipv6/rpl-udp/project-conf.h +++ b/examples/ipv6/rpl-udp/project-conf.h @@ -60,10 +60,6 @@ #define RPL_CONF_DEFAULT_ROUTE_INFINITE_LIFETIME 1 -#ifndef RPL_CONF_WITH_NON_STORING -#define RPL_CONF_WITH_NON_STORING 0 /* Set this to run with non-storing mode */ -#endif /* RPL_CONF_WITH_NON_STORING */ - #if WITH_NON_STORING #undef RPL_NS_CONF_LINK_NUM #define RPL_NS_CONF_LINK_NUM 40 /* Number of links maintained at the root. Can be set to 0 at non-root nodes. */ From 166f90e4dfba779dcdd92b9e1c34cd20fe23519b Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:09:46 +0100 Subject: [PATCH 302/345] Add sensniff support: zoul --- examples/sensniff/zoul/target-conf.h | 71 ++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 examples/sensniff/zoul/target-conf.h diff --git a/examples/sensniff/zoul/target-conf.h b/examples/sensniff/zoul/target-conf.h new file mode 100644 index 000000000..9f978b4c7 --- /dev/null +++ b/examples/sensniff/zoul/target-conf.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +/* Set to 1 for a sub-ghz sniffer with the CC1200 */ +#ifndef ZOUL_CONF_SUB_GHZ_SNIFFER +#define ZOUL_CONF_SUB_GHZ_SNIFFER 0 +#endif +/*---------------------------------------------------------------------------*/ +#if ZOUL_CONF_SUB_GHZ_SNIFFER +#define NETSTACK_CONF_RADIO cc1200_driver + +/* + * You will need to configure the defines below to match the configuration of + * your sub-ghz network. + */ +#define CC1200_CONF_RF_CFG cc1200_802154g_863_870_fsk_50kbps +#define CC1200_CONF_USE_GPIO2 0 +#define CC1200_CONF_USE_RX_WATCHDOG 0 +#define CC1200_CONF_802154G 0 +#define CC1200_CONF_802154G_CRC16 0 +#define CC1200_CONF_802154G_WHITENING 0 +#define ANTENNA_SW_SELECT_DEF_CONF ANTENNA_SW_SELECT_SUBGHZ +#endif +/*---------------------------------------------------------------------------*/ +/* + * Selection of Sensniff I/O Interface. + * Define CC2538_IO_CONF_USB as 0 to use UART0 as sensniff's interface. + */ +#define CC2538_IO_CONF_USB 0 +/*---------------------------------------------------------------------------*/ +#if CC2538_IO_CONF_USB +#define USB_SERIAL_CONF_ENABLE 1 +#else +#define UART0_CONF_BAUD_RATE 460800 +#endif +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "pool/cc2538-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From 4922925c0766ecdafadf28e4c2075266fc056247 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:15:13 +0100 Subject: [PATCH 303/345] Add sensniff support: ev-aducrf101mkxz --- .../ev-aducrf101mkxz/ev-aducrf101mkxz-io.h | 43 +++++++++++++++++++ .../sensniff/ev-aducrf101mkxz/target-conf.h | 38 ++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 examples/sensniff/ev-aducrf101mkxz/ev-aducrf101mkxz-io.h create mode 100644 examples/sensniff/ev-aducrf101mkxz/target-conf.h diff --git a/examples/sensniff/ev-aducrf101mkxz/ev-aducrf101mkxz-io.h b/examples/sensniff/ev-aducrf101mkxz/ev-aducrf101mkxz-io.h new file mode 100644 index 000000000..883e5e598 --- /dev/null +++ b/examples/sensniff/ev-aducrf101mkxz/ev-aducrf101mkxz-io.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef EV_ADUCRF101MKXZ_IO_H_ +#define EV_ADUCRF101MKXZ_IO_H_ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "dev/uart.h" +/*---------------------------------------------------------------------------*/ +#define sensniff_io_byte_out(b) uart_put(b) +#define sensniff_io_flush() +#define sensniff_io_set_input(f) uart_set_input(f) +/*---------------------------------------------------------------------------*/ +#endif /* EV_ADUCRF101MKXZ_IO_H_ */ +/*---------------------------------------------------------------------------*/ diff --git a/examples/sensniff/ev-aducrf101mkxz/target-conf.h b/examples/sensniff/ev-aducrf101mkxz/target-conf.h new file mode 100644 index 000000000..bd3e518d7 --- /dev/null +++ b/examples/sensniff/ev-aducrf101mkxz/target-conf.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016, George Oikonomou - http://www.spd.gr + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +#ifndef TARGET_CONF_H_ +#define TARGET_CONF_H_ +/*---------------------------------------------------------------------------*/ +#define SENSNIFF_IO_DRIVER_H "ev-aducrf101mkxz/ev-aducrf101mkxz-io.h" +/*---------------------------------------------------------------------------*/ +#endif /* TARGET_CONF_H_ */ +/*---------------------------------------------------------------------------*/ From ac2dcb8b03e4d146f6080734f9ccd91c96576ea3 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:10:03 +0100 Subject: [PATCH 304/345] Add sensniff example Makefile --- examples/sensniff/Makefile | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 examples/sensniff/Makefile diff --git a/examples/sensniff/Makefile b/examples/sensniff/Makefile new file mode 100755 index 000000000..0bc269162 --- /dev/null +++ b/examples/sensniff/Makefile @@ -0,0 +1,25 @@ +DEFINES+=PROJECT_CONF_H=\"project-conf.h\" + +CONTIKI_PROJECT = sensniff + +PROJECT_SOURCEFILES += sensniff-rdc.c netstack.c +PROJECTDIRS += pool $(TARGET) + +ifeq ($(TARGET),) + -include Makefile.target + ifeq ($(TARGET),) + TARGET=srf06-cc26xx + $(info TARGET not defined, using target $(TARGET)) + endif +endif + +CONTIKI_WITH_RIME = 1 + +### Optionally, the target can add its own Makefile, to do things like e.g. +### add more source files to the build or define make variables. +-include $(TARGET)/Makefile.$(TARGET) + +all: $(CONTIKI_PROJECT) + +CONTIKI = ../.. +include $(CONTIKI)/Makefile.include From 20dc86c039b455ebd3c837deed41b54cc225db51 Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 03:48:37 +0100 Subject: [PATCH 305/345] Add sensniff travis tests --- regression-tests/01-compile-base/Makefile | 1 + regression-tests/14-compile-8051-ports/Makefile | 1 + regression-tests/18-compile-arm-ports/Makefile | 7 +++++++ regression-tests/22-compile-nxp-ports/Makefile | 1 + 4 files changed, 10 insertions(+) diff --git a/regression-tests/01-compile-base/Makefile b/regression-tests/01-compile-base/Makefile index 5ae452c36..83e5fda51 100644 --- a/regression-tests/01-compile-base/Makefile +++ b/regression-tests/01-compile-base/Makefile @@ -35,6 +35,7 @@ wget/minimal-net \ zolertia/z1/z1 \ settings-example/avr-raven \ ipv6/multicast/sky \ +sensniff/z1 \ cfs-coffee/sky \ cfs-coffee/z1 \ cfs-coffee/wismote \ diff --git a/regression-tests/14-compile-8051-ports/Makefile b/regression-tests/14-compile-8051-ports/Makefile index 4ac1304c0..2d1cce6c8 100644 --- a/regression-tests/14-compile-8051-ports/Makefile +++ b/regression-tests/14-compile-8051-ports/Makefile @@ -7,6 +7,7 @@ cc2530dk/cc2530dk \ cc2530dk/border-router/cc2530dk \ cc2530dk/udp-ipv6/cc2530dk \ ipv6/multicast/cc2530dk \ +sensniff/cc2530dk \ TOOLS= diff --git a/regression-tests/18-compile-arm-ports/Makefile b/regression-tests/18-compile-arm-ports/Makefile index e3640c07c..a7547cd59 100644 --- a/regression-tests/18-compile-arm-ports/Makefile +++ b/regression-tests/18-compile-arm-ports/Makefile @@ -44,6 +44,13 @@ stm32nucleo-spirit1/sensor-demo/stm32nucleo-spirit1 \ ipv6/multicast/stm32nucleo-spirit1 \ udp-ipv6/stm32nucleo-spirit1 \ hello-world/stm32nucleo-spirit1 \ +sensniff/cc2538dk \ +sensniff/openmote-cc2538 \ +sensniff/zoul \ +sensniff/zoul:ZOUL_CONF_SUB_GHZ_SNIFFER=1 \ +sensniff/srf06-cc26xx \ +sensniff/srf06-cc26xx:BOARD=launchpad/cc1310 \ +sensniff/ev-aducrf101mkxz \ cfs-coffee/cc2538dk \ cfs-coffee/openmote-cc2538 \ cfs-coffee/zoul \ diff --git a/regression-tests/22-compile-nxp-ports/Makefile b/regression-tests/22-compile-nxp-ports/Makefile index 9291cd846..e1a56fe0b 100644 --- a/regression-tests/22-compile-nxp-ports/Makefile +++ b/regression-tests/22-compile-nxp-ports/Makefile @@ -16,6 +16,7 @@ jn516x/tsch/simple-sensor-network/rpl-border-router/jn516x \ jn516x/tsch/tx-power-verification/node/jn516x \ jn516x/tsch/tx-power-verification/rpl-border-router/jn516x \ jn516x/tsch/uart1-test-node/jn516x \ +sensniff/jn516x \ ipv6/rpl-tsch/jn516x \ ipv6/rpl-tsch/jn516x:MAKE_WITH_ORCHESTRA=1 \ ipv6/rpl-tsch/jn516x:MAKE_WITH_SECURITY=1 From 3e7177dcc822eca4365f5e4ed1f88265adb72e1b Mon Sep 17 00:00:00 2001 From: George Oikonomou Date: Sun, 24 Jul 2016 04:10:13 +0100 Subject: [PATCH 306/345] Add sensniff example README --- examples/sensniff/README.md | 83 +++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 examples/sensniff/README.md diff --git a/examples/sensniff/README.md b/examples/sensniff/README.md new file mode 100644 index 000000000..140db4bc9 --- /dev/null +++ b/examples/sensniff/README.md @@ -0,0 +1,83 @@ +sensniff Contiki Project +======================== +This example can be used to create an IEEE 802.15.4 wireless sniffer firmware, +meant to be used in parallel with +[sensniff](https://github.com/g-oikonomou/sensniff). + +Running +======= +* Build this example and program your device +* Connect your device to a host +* Run sensniff on your host +* Fire up wireshark and enjoy. + +Make sure your device's UART baud rate matches the `-b` argument passed to +sensniff. I strongly recommend using at least 460800. This comment does not +apply if your device is using native USB. + +Subsequently, make absolutely certain that your device is tuned to the same RF +channel as the network you are trying to sniff. You can change sniffing channel +through sensniff's text interface. + +More details in sensniff's README. + +Adding support for more platforms +================================= +Firstly, this example will try to turn off frame filtering and automatic h/w +ACKs by calling `NETSTACK_RADIO.set_value(RADIO_PARAM_RX_MODE, 0)`. If your +radio does not support this, then implementing this is your first step towards +running this example on your board. + +Secondly, in order to be able to switch channels and retrieve current/min/max +RF channel supported from sensniff's text interface, your device's radio driver +must also support: + + NETSTACK_RADIO.get_value(RADIO_PARAM_CHANNEL, ...) + NETSTACK_RADIO.set_value(RADIO_PARAM_CHANNEL, ...) + NETSTACK_RADIO.get_value(RADIO_CONST_CHANNEL_MIN, ...) + NETSTACK_RADIO.get_value(RADIO_CONST_CHANNEL_MAX, ...) + +The following radios have been tested: + +* CC13xx/CC26xx in PROP and IEEE modes +* CC2538 +* CC2530/CC2531 +* CC1200 + +One you have the radio sorted out, you also need to configure character I/O. +The firmware captures wireless frames and streams them over a serial line to +the host where your device is connected. This can be achieved over UART or over +CDC-ACM. The example makes zero assumptions about your hardware's capability, +you have to configure thnigs explicitly. + +* Firstly, create a directory named the same as your platform. Crate a header +file therein called `target-conf.h`. This will get included automatically. +* Then look at the header files under `pool`, perhaps your device's CPU is +already supported. If that's the case, then within your `target-conf.h` you +simply need to add a line like this: + + #define SENSNIFF_IO_DRIVER_H "pool/cc2538-io.h" + +choosing the header that corresponds to your device's CPU. Just look for any of +the platforms already supported to see how you can configure things in a more +fine-grained fashion (e.g. to select UART instance, switch between UART/USB +etc). + +* If your CPU is not already supported, then you need to create an additional +header file. In that header file, you will need to define the following three: + + #define sensniff_io_byte_out() + #define sensniff_io_flush() + #define sensniff_io_set_input() + +Those should map to functions implemented by your device's peripheral driver, +e.g. your UART driver. `_byte_out()` and `set_input()` are required, but +`_flush()` is optional and is only really helpful in case of drivers/hardware +that support buffered I/O (as is the case for some Contiki's USB drivers). Once +you have provided those defines, then simple go back to your `target-conf.h` +and: + + #define SENSNIFF_IO_DRIVER_H "header-with-my-own-defines.h" + +That should be it! + From a52a3d94d36040ab3b20ff491680d32caea92e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Th=C3=A9baudeau?= Date: Mon, 15 Aug 2016 03:07:52 +0200 Subject: [PATCH 307/345] cc2538: uart: Fix garbled output occurring upon lpm_enter() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lpm_enter() must not enter PM1+ if the UART is transmitting. Otherwise, the UART clock gets disabled, and its TX is broken. The commit b8b54a033c67e2dbb98dabda6d1b4c9e64d5db90 had already partially fixed this issue, but it could still occur while transmitting stop bits because, contrary to UART_FR.BUSY, UART_FR.TXFE takes only the data bits into account, not the stop bits. Signed-off-by: Benoît Thébaudeau --- cpu/cc2538/dev/uart.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cpu/cc2538/dev/uart.c b/cpu/cc2538/dev/uart.c index cefbecf82..f4764877c 100644 --- a/cpu/cc2538/dev/uart.c +++ b/cpu/cc2538/dev/uart.c @@ -230,9 +230,7 @@ permit_pm1(void) const uart_regs_t *regs; for(regs = &uart_regs[0]; regs < &uart_regs[UART_INSTANCE_COUNT]; regs++) { - /* Note: UART_FR.TXFE reads 0 if the UART clock is gated. */ - if((REG(SYS_CTRL_RCGCUART) & regs->sys_ctrl_rcgcuart_uart) != 0 && - (REG(regs->base + UART_FR) & UART_FR_TXFE) == 0) { + if((REG(regs->base + UART_FR) & UART_FR_BUSY) != 0) { return false; } } From 0a02f0ac7ce73127615d7bc828a89641d77dcde3 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Tue, 16 Aug 2016 14:24:13 +0200 Subject: [PATCH 308/345] Zoul: fixed voltage divider relationship --- platform/zoul/dev/adc-sensors.h | 2 +- platform/zoul/dev/pm10-sensor.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/zoul/dev/adc-sensors.h b/platform/zoul/dev/adc-sensors.h index 501eaa564..769e9d97c 100644 --- a/platform/zoul/dev/adc-sensors.h +++ b/platform/zoul/dev/adc-sensors.h @@ -66,7 +66,7 @@ #define ADC_WRAPPER_SUCCESS 0x00 #define ADC_WRAPPER_ERROR (-1) #define ADC_WRAPPER_EXTERNAL_VREF 5000 -#define ADC_WRAPPER_EXTERNAL_VREF_CROSSVAL 3300 +#define ADC_WRAPPER_EXTERNAL_VREF_CROSSVAL 3000 /*---------------------------------------------------------------------------*/ #define ANALOG_GROVE_LIGHT 0x01 #define ANALOG_PHIDGET_ROTATION_1109 0x02 diff --git a/platform/zoul/dev/pm10-sensor.h b/platform/zoul/dev/pm10-sensor.h index d43256e44..07f7811c1 100644 --- a/platform/zoul/dev/pm10-sensor.h +++ b/platform/zoul/dev/pm10-sensor.h @@ -52,7 +52,7 @@ #define PM10_SENSOR "PM10 Sensor" #define PM10_SENSOR_PULSE_DELAY 280 #define PM10_EXTERNAL_VREF 5000 -#define PM10_EXTERNAL_VREF_CROSSVAL 3300 +#define PM10_EXTERNAL_VREF_CROSSVAL 3000 /* -------------------------------------------------------------------------- */ #ifdef PM10_SENSOR_CONF_CTRL_PIN #define PM10_SENSOR_CTRL_PIN PM10_SENSOR_CONF_CTRL_PIN From 3043f3956cfc1d4533bf0fff4eedcf6bc8444369 Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Mon, 22 Aug 2016 10:29:04 -0700 Subject: [PATCH 309/345] galileo: Simplify pinmux configuration This patch refactors the pinmux configuration code for Intel Galileo to simplify it. This patch also corrects an off-by-one error in how the pin number is checked in galileo_pinmux_set_pin. --- platform/galileo/drivers/galileo-pinmux.c | 79 +++++++++++------------ 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/platform/galileo/drivers/galileo-pinmux.c b/platform/galileo/drivers/galileo-pinmux.c index 3059bdb36..a6b0e6888 100644 --- a/platform/galileo/drivers/galileo-pinmux.c +++ b/platform/galileo/drivers/galileo-pinmux.c @@ -63,26 +63,26 @@ struct pin_config { }; static struct pin_config default_pinmux_config[PINMUX_NUM_PINS] = { - { 0, GALILEO_PINMUX_FUNC_C }, /* UART0_RXD */ - { 1, GALILEO_PINMUX_FUNC_C }, /* UART0_TXD */ - { 2, GALILEO_PINMUX_FUNC_A }, /* GPIO5(out) */ - { 3, GALILEO_PINMUX_FUNC_B }, /* GPIO6(in) */ - { 4, GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS4 (in) */ - { 5, GALILEO_PINMUX_FUNC_B }, /* GPIO8 (in) */ - { 6, GALILEO_PINMUX_FUNC_B }, /* GPIO9 (in) */ - { 7, GALILEO_PINMUX_FUNC_B }, /* EXP1.P0_6 (in) */ - { 8, GALILEO_PINMUX_FUNC_B }, /* EXP1.P1_0 (in) */ - { 9, GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS2 (in) */ - { 10, GALILEO_PINMUX_FUNC_A }, /* GPIO2 (out) */ - { 11, GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS3 (in) */ - { 12, GALILEO_PINMUX_FUNC_B }, /* GPIO7 (in) */ - { 13, GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS5(in) */ - { 14, GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_0 (in)/ADC.IN0 */ - { 15, GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_2 (in)/ADC.IN1 */ - { 16, GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_4 (in)/ADC.IN2 */ - { 17, GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_6 (in)/ADC.IN3 */ - { 18, GALILEO_PINMUX_FUNC_C }, /* I2C_SDA */ - { 19, GALILEO_PINMUX_FUNC_C }, /* I2C_SCL */ + { GALILEO_PINMUX_FUNC_C }, /* UART0_RXD */ + { GALILEO_PINMUX_FUNC_C }, /* UART0_TXD */ + { GALILEO_PINMUX_FUNC_A }, /* GPIO5(out) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO6(in) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS4 (in) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO8 (in) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO9 (in) */ + { GALILEO_PINMUX_FUNC_B }, /* EXP1.P0_6 (in) */ + { GALILEO_PINMUX_FUNC_B }, /* EXP1.P1_0 (in) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS2 (in) */ + { GALILEO_PINMUX_FUNC_A }, /* GPIO2 (out) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS3 (in) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO7 (in) */ + { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS5(in) */ + { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_0 (in)/ADC.IN0 */ + { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_2 (in)/ADC.IN1 */ + { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_4 (in)/ADC.IN2 */ + { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_6 (in)/ADC.IN3 */ + { GALILEO_PINMUX_FUNC_C }, /* I2C_SDA */ + { GALILEO_PINMUX_FUNC_C }, /* I2C_SCL */ }; struct mux_pin { @@ -535,7 +535,7 @@ galileo_pinmux_set_pin(uint8_t pin, GALILEO_PINMUX_FUNC func) struct mux_path *mux_path; uint8_t index, i; - if(pin > PINMUX_NUM_PINS) { + if(pin >= PINMUX_NUM_PINS) { return -1; } @@ -545,38 +545,33 @@ galileo_pinmux_set_pin(uint8_t pin, GALILEO_PINMUX_FUNC func) mux_path = &galileo_pinmux_paths[index]; for(i = 0; i < PINMUX_NUM_PATHS; i++) { + struct gpio_pcal9535a_data *exp = NULL; switch(mux_path->path[i].chip) { case EXP0: - if(gpio_pcal9535a_write(&data.exp0, mux_path->path[i].pin, mux_path->path[i].level) < 0) { - return -1; - } - if(gpio_pcal9535a_config(&data.exp0, mux_path->path[i].pin, mux_path->path[i].cfg) < 0) { - return -1; - } + exp = &data.exp0; break; case EXP1: - if(gpio_pcal9535a_write(&data.exp1, mux_path->path[i].pin, mux_path->path[i].level) < 0) { - return -1; - } - if(gpio_pcal9535a_config(&data.exp1, mux_path->path[i].pin, mux_path->path[i].cfg) < 0) { - return -1; - } + exp = &data.exp1; break; case EXP2: - if(gpio_pcal9535a_write(&data.exp2, mux_path->path[i].pin, mux_path->path[i].level) < 0) { - return -1; - } - if(gpio_pcal9535a_config(&data.exp2, mux_path->path[i].pin, mux_path->path[i].cfg) < 0) { - return -1; - } + exp = &data.exp2; break; case PWM0: if(pwm_pca9685_set_duty_cycle(&data.pwm0, mux_path->path[i].pin, mux_path->path[i].level ? 100 : 0) < 0) { return -1; } - break; + continue; case NONE: - break; + continue; + } + + assert(exp != NULL); + + if(gpio_pcal9535a_write(exp, mux_path->path[i].pin, mux_path->path[i].level) < 0) { + return -1; + } + if(gpio_pcal9535a_config(exp, mux_path->path[i].pin, mux_path->path[i].cfg) < 0) { + return -1; } } @@ -609,7 +604,7 @@ galileo_pinmux_initialize(void) } for(i = 0; i < PINMUX_NUM_PINS; i++) { - if(galileo_pinmux_set_pin(default_pinmux_config[i].pin_num, default_pinmux_config[i].func) < 0) { + if(galileo_pinmux_set_pin(i, default_pinmux_config[i].func) < 0) { return -1; } } From 2912559061d29cdaf896d00b1915e86c316e0ce3 Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Mon, 22 Aug 2016 15:25:32 -0700 Subject: [PATCH 310/345] galileo: Revise pinmux API to be more intuitive This patch replaces the pinmux APIs that require users to look up an arbitrary function number for the desired function of each pin. The replacement API functions have intuitive names and permit users to pass board-level IO port numbers. The API functions internally convert those to CPU-level port numbers when necessary. Furthermore, when configuring a pin to be a digital input or output, those API functions also perform the corresponding configuration operation on the CPU-level GPIO port. The revised APIs halt when users attempt to configure a currently-unsupported GPIO, specifically those in the GPIO_SUS port range and those implemented on the expander chip EXP2. This also means that such ports are left unconfigured during initialization, whereas the pinmuxing for them was setup by the old implementation. --- examples/galileo/gpio-input.c | 3 - examples/galileo/gpio-interrupt.c | 1 - examples/galileo/gpio-output.c | 2 - platform/galileo/contiki-main.c | 6 +- platform/galileo/drivers/galileo-pinmux.c | 180 ++++++++++++++++++---- platform/galileo/drivers/galileo-pinmux.h | 51 +++++- 6 files changed, 195 insertions(+), 48 deletions(-) diff --git a/examples/galileo/gpio-input.c b/examples/galileo/gpio-input.c index 196ea9193..077055a69 100644 --- a/examples/galileo/gpio-input.c +++ b/examples/galileo/gpio-input.c @@ -67,9 +67,6 @@ PROCESS_THREAD(gpio_input_process, ev, data) { PROCESS_BEGIN(); - quarkX1000_gpio_config(PIN_OUTPUT, QUARKX1000_GPIO_OUT); - quarkX1000_gpio_config(PIN_INPUT, QUARKX1000_GPIO_IN); - quarkX1000_gpio_clock_enable(); ctimer_set(&timer, CLOCK_SECOND / 2, timeout, NULL); diff --git a/examples/galileo/gpio-interrupt.c b/examples/galileo/gpio-interrupt.c index 04fb4cc1b..ca4606266 100644 --- a/examples/galileo/gpio-interrupt.c +++ b/examples/galileo/gpio-interrupt.c @@ -63,7 +63,6 @@ PROCESS_THREAD(gpio_interrupt_process, ev, data) { PROCESS_BEGIN(); - quarkX1000_gpio_config(PIN_OUTPUT, QUARKX1000_GPIO_OUT); quarkX1000_gpio_config(PIN_INTR, QUARKX1000_GPIO_INT | QUARKX1000_GPIO_ACTIVE_HIGH | QUARKX1000_GPIO_EDGE); quarkX1000_gpio_set_callback(callback); diff --git a/examples/galileo/gpio-output.c b/examples/galileo/gpio-output.c index 4dad7d684..4cc50597e 100644 --- a/examples/galileo/gpio-output.c +++ b/examples/galileo/gpio-output.c @@ -57,8 +57,6 @@ PROCESS_THREAD(gpio_output_process, ev, data) { PROCESS_BEGIN(); - quarkX1000_gpio_config(PIN, QUARKX1000_GPIO_OUT); - quarkX1000_gpio_clock_enable(); ctimer_set(&timer, CLOCK_SECOND / 2, timeout, NULL); diff --git a/platform/galileo/contiki-main.c b/platform/galileo/contiki-main.c index 5e95c4902..5b8f50a7e 100644 --- a/platform/galileo/contiki-main.c +++ b/platform/galileo/contiki-main.c @@ -99,11 +99,15 @@ main(void) quarkX1000_i2c_init(); quarkX1000_i2c_configure(QUARKX1000_I2C_SPEED_STANDARD, QUARKX1000_I2C_ADDR_MODE_7BIT); + /* The GPIO subsystem must be initialized prior to configuring pinmux, because + * the pinmux configuration automatically performs GPIO configuration for the + * relevant pins. + */ + quarkX1000_gpio_init(); /* use default pinmux configuration */ if(galileo_pinmux_initialize() < 0) { fprintf(stderr, "Failed to initialize pinmux\n"); } - quarkX1000_gpio_init(); shared_isr_init(); /* The ability to remap interrupts is not needed after this point and should diff --git a/platform/galileo/drivers/galileo-pinmux.c b/platform/galileo/drivers/galileo-pinmux.c index a6b0e6888..c99ccd6c2 100644 --- a/platform/galileo/drivers/galileo-pinmux.c +++ b/platform/galileo/drivers/galileo-pinmux.c @@ -29,10 +29,19 @@ */ #include "galileo-pinmux.h" +#include #include "gpio.h" #include "gpio-pcal9535a.h" #include "i2c.h" #include "pwm-pca9685.h" +#include + +typedef enum { + GALILEO_PINMUX_FUNC_A, + GALILEO_PINMUX_FUNC_B, + GALILEO_PINMUX_FUNC_C, + GALILEO_PINMUX_FUNC_D +} GALILEO_PINMUX_FUNC; #define GPIO_PCAL9535A_0_I2C_ADDR 0x25 #define GPIO_PCAL9535A_1_I2C_ADDR 0x26 @@ -41,7 +50,6 @@ #define PINMUX_NUM_FUNCS 4 #define PINMUX_NUM_PATHS 4 -#define PINMUX_NUM_PINS 20 typedef enum { NONE, @@ -62,29 +70,6 @@ struct pin_config { GALILEO_PINMUX_FUNC func; }; -static struct pin_config default_pinmux_config[PINMUX_NUM_PINS] = { - { GALILEO_PINMUX_FUNC_C }, /* UART0_RXD */ - { GALILEO_PINMUX_FUNC_C }, /* UART0_TXD */ - { GALILEO_PINMUX_FUNC_A }, /* GPIO5(out) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO6(in) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS4 (in) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO8 (in) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO9 (in) */ - { GALILEO_PINMUX_FUNC_B }, /* EXP1.P0_6 (in) */ - { GALILEO_PINMUX_FUNC_B }, /* EXP1.P1_0 (in) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS2 (in) */ - { GALILEO_PINMUX_FUNC_A }, /* GPIO2 (out) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS3 (in) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO7 (in) */ - { GALILEO_PINMUX_FUNC_B }, /* GPIO_SUS5(in) */ - { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_0 (in)/ADC.IN0 */ - { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_2 (in)/ADC.IN1 */ - { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_4 (in)/ADC.IN2 */ - { GALILEO_PINMUX_FUNC_B }, /* EXP2.P0_6 (in)/ADC.IN3 */ - { GALILEO_PINMUX_FUNC_C }, /* I2C_SDA */ - { GALILEO_PINMUX_FUNC_C }, /* I2C_SCL */ -}; - struct mux_pin { MUX_CHIP chip; uint8_t pin; @@ -107,7 +92,7 @@ struct pinmux_internal_data { static struct pinmux_internal_data data; -static struct mux_path galileo_pinmux_paths[PINMUX_NUM_PINS * PINMUX_NUM_FUNCS] = { +static struct mux_path galileo_pinmux_paths[GALILEO_NUM_PINS * PINMUX_NUM_FUNCS] = { {0, GALILEO_PINMUX_FUNC_A, { { EXP1, 0, PIN_HIGH, (QUARKX1000_GPIO_OUT) }, /* GPIO3 out */ { EXP1, 1, PIN_LOW, (QUARKX1000_GPIO_OUT) }, @@ -529,13 +514,13 @@ static struct mux_path galileo_pinmux_paths[PINMUX_NUM_PINS * PINMUX_NUM_FUNCS] { NONE, 0, DISABLED, (QUARKX1000_GPIO_IN ) }}}, }; -int +static int galileo_pinmux_set_pin(uint8_t pin, GALILEO_PINMUX_FUNC func) { struct mux_path *mux_path; uint8_t index, i; - if(pin >= PINMUX_NUM_PINS) { + if(pin >= GALILEO_NUM_PINS) { return -1; } @@ -577,11 +562,120 @@ galileo_pinmux_set_pin(uint8_t pin, GALILEO_PINMUX_FUNC func) return 0; } +static void +flatten_pin_num(galileo_pin_group_t grp, unsigned *pin) +{ + if(grp == GALILEO_PIN_GRP_ANALOG) { + *pin += GALILEO_NUM_DIGITAL_PINS; + } + + assert(*pin < GALILEO_NUM_PINS); +} +/* Map a board-level GPIO pin number to the corresponding CPU GPIO pin number. + */ +static int +brd_to_cpu_gpio_pin(unsigned pin, bool *sus) +{ + static const int SUS = 0x100; + unsigned pins[GALILEO_NUM_PINS] = { + 3, 4, 5, 6, + SUS | 4, 8, 9, SUS | 0, + SUS | 1, SUS | 2, 2, SUS | 3, + 7, SUS | 5 + }; + int cpu_pin; + + /* GPIOs in the analog pin space are implemented by EXP2, not the CPU. */ + assert(pin < GALILEO_NUM_DIGITAL_PINS); + cpu_pin = pins[pin]; + + *sus = (cpu_pin & SUS) == SUS; + + return cpu_pin & ~SUS; +} +void +galileo_pinmux_select_din(galileo_pin_group_t grp, unsigned pin) +{ + bool sus; + int cpu_pin; + + flatten_pin_num(grp, &pin); + + assert(galileo_pinmux_set_pin(pin, GALILEO_PINMUX_FUNC_B) == 0); + + cpu_pin = brd_to_cpu_gpio_pin(pin, &sus); + /* GPIO_SUS pins are currently unsupported. */ + assert(!sus); + quarkX1000_gpio_config(cpu_pin, QUARKX1000_GPIO_IN); +} +void +galileo_pinmux_select_dout(galileo_pin_group_t grp, unsigned pin) +{ + bool sus; + int cpu_pin; + + flatten_pin_num(grp, &pin); + + assert(galileo_pinmux_set_pin(pin, GALILEO_PINMUX_FUNC_A) == 0); + + cpu_pin = brd_to_cpu_gpio_pin(pin, &sus); + /* GPIO_SUS pins are currently unsupported. */ + assert(!sus); + quarkX1000_gpio_config(cpu_pin, QUARKX1000_GPIO_OUT); +} +void +galileo_pinmux_select_pwm(unsigned pin) +{ + GALILEO_PINMUX_FUNC func = GALILEO_PINMUX_FUNC_C; + switch(pin) { + case 3: + func = GALILEO_PINMUX_FUNC_D; + break; + case 5: + case 6: + case 9: + case 10: + case 11: + break; + default: + fprintf(stderr, "%s: invalid pin: %d.\n", __FUNCTION__, pin); + halt(); + } + + assert(galileo_pinmux_set_pin(pin, func) == 0); +} +void +galileo_pinmux_select_serial(unsigned pin) +{ + assert(pin < 4); + + assert(galileo_pinmux_set_pin(pin, GALILEO_PINMUX_FUNC_C) == 0); +} +void +galileo_pinmux_select_i2c(void) +{ + assert(galileo_pinmux_set_pin(18, GALILEO_PINMUX_FUNC_C) == 0); + assert(galileo_pinmux_set_pin(19, GALILEO_PINMUX_FUNC_C) == 0); +} +void +galileo_pinmux_select_spi(void) +{ + assert(galileo_pinmux_set_pin(11, GALILEO_PINMUX_FUNC_D) == 0); + assert(galileo_pinmux_set_pin(12, GALILEO_PINMUX_FUNC_C) == 0); + assert(galileo_pinmux_set_pin(13, GALILEO_PINMUX_FUNC_C) == 0); +} +void +galileo_pinmux_select_analog(unsigned pin) +{ + assert(pin < GALILEO_NUM_ANALOG_PINS); + + pin += GALILEO_NUM_DIGITAL_PINS; + + assert(galileo_pinmux_set_pin(pin, GALILEO_PINMUX_FUNC_B) == 0); +} int galileo_pinmux_initialize(void) { - uint8_t i; - /* has to init after I2C master */ if(!quarkX1000_i2c_is_available()) { return -1; @@ -603,11 +697,29 @@ galileo_pinmux_initialize(void) return -1; } - for(i = 0; i < PINMUX_NUM_PINS; i++) { - if(galileo_pinmux_set_pin(i, default_pinmux_config[i].func) < 0) { - return -1; - } - } + /* Activate default pinmux configuration. */ + /* Some of the following lines are commented out due to the GPIO_SUS pins + * being currently unsupported. + */ + galileo_pinmux_select_serial(0); + galileo_pinmux_select_serial(1); + galileo_pinmux_select_dout(GALILEO_PIN_GRP_DIGITAL, 2); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 3); + /*galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 4);*/ + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 5); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 6); + /*galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 7);*/ + /*galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 8);*/ + /*galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 9);*/ + galileo_pinmux_select_dout(GALILEO_PIN_GRP_DIGITAL, 10); + /*galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 11);*/ + galileo_pinmux_select_dout(GALILEO_PIN_GRP_DIGITAL, 12); + /*galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 13);*/ + galileo_pinmux_select_analog(0); + galileo_pinmux_select_analog(1); + galileo_pinmux_select_analog(2); + galileo_pinmux_select_analog(3); + galileo_pinmux_select_i2c(); return 0; } diff --git a/platform/galileo/drivers/galileo-pinmux.h b/platform/galileo/drivers/galileo-pinmux.h index f7d4fa39e..022a43cf6 100644 --- a/platform/galileo/drivers/galileo-pinmux.h +++ b/platform/galileo/drivers/galileo-pinmux.h @@ -33,14 +33,51 @@ #include -typedef enum { - GALILEO_PINMUX_FUNC_A, - GALILEO_PINMUX_FUNC_B, - GALILEO_PINMUX_FUNC_C, - GALILEO_PINMUX_FUNC_D -} GALILEO_PINMUX_FUNC; +typedef enum galileo_pin_group { + GALILEO_PIN_GRP_ANALOG, + GALILEO_PIN_GRP_DIGITAL +} galileo_pin_group_t; + +#define GALILEO_NUM_ANALOG_PINS 6 +#define GALILEO_NUM_DIGITAL_PINS 14 +#define GALILEO_NUM_PINS (GALILEO_NUM_ANALOG_PINS + GALILEO_NUM_DIGITAL_PINS) int galileo_pinmux_initialize(void); -int galileo_pinmux_set_pin(uint8_t pin, GALILEO_PINMUX_FUNC func); + +/** + * \brief Set the indicated pin to be a digital input. + * \param grp Indicates whether the pin is in the analog or digital group. + * \param pin Index of pin within group. + */ +void galileo_pinmux_select_din(galileo_pin_group_t grp, unsigned pin); +/** + * \brief Set the indicated pin to be a digital output. + */ +void galileo_pinmux_select_dout(galileo_pin_group_t grp, unsigned pin); +/** + * \brief Set the indicated pin to be a PWM pin. Only a subset of the pins + * support PWM output. This implicitly operates on the digital pin + * group. + */ +void galileo_pinmux_select_pwm(unsigned pin); +/** + * \brief Connect the indicated pin to a serial port. This implicitly operates + * on the digital pin group. Galileo Gen. 2 supports UART0 on pins 0 and + * 1 and UART1 on pins 2 and 3. + */ +void galileo_pinmux_select_serial(unsigned pin); +/** + * \brief Connect analog pins 4 (SDA) and 5 (SCL) to I2C. + */ +void galileo_pinmux_select_i2c(void); +/** + * \brief Connect digital pins 11 (MOSI), 12 (MISO), and 13 (CLK) to SPI. + */ +void galileo_pinmux_select_spi(void); +/** + * \brief Set the indicated pin to be an ADC input. This implicitly operates + * on the analog pin group. + */ +void galileo_pinmux_select_analog(unsigned pin); #endif /* CPU_X86_DRIVERS_GALILEO_PINMUX_H_ */ From b17a936bf75f62e677fbc9d7360800c42dbca1d5 Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Mon, 22 Aug 2016 16:28:58 -0700 Subject: [PATCH 311/345] galileo: Add board-level abstraction layer for GPIO This patch adds a HAL for GPIOs so that users of the API can specify board-level IO pin numbers rather than CPU-level pin numbers. --- examples/galileo/gpio-input.c | 9 +-- examples/galileo/gpio-interrupt.c | 11 ++-- examples/galileo/gpio-output.c | 5 +- platform/galileo/Makefile.galileo | 2 +- platform/galileo/drivers/galileo-gpio.c | 72 +++++++++++++++++++++++ platform/galileo/drivers/galileo-gpio.h | 40 +++++++++++++ platform/galileo/drivers/galileo-pinmux.c | 11 ++-- 7 files changed, 132 insertions(+), 18 deletions(-) create mode 100644 platform/galileo/drivers/galileo-gpio.c create mode 100644 platform/galileo/drivers/galileo-gpio.h diff --git a/examples/galileo/gpio-input.c b/examples/galileo/gpio-input.c index 077055a69..804c9a86e 100644 --- a/examples/galileo/gpio-input.c +++ b/examples/galileo/gpio-input.c @@ -33,10 +33,11 @@ #include "contiki.h" #include "sys/ctimer.h" +#include "galileo-gpio.h" #include "gpio.h" -#define PIN_OUTPUT 5 -#define PIN_INPUT 6 +#define PIN_OUTPUT 2 +#define PIN_INPUT 3 static uint32_t value; static struct ctimer timer; @@ -51,9 +52,9 @@ timeout(void *data) /* toggle pin state */ value = !value; - quarkX1000_gpio_write(PIN_OUTPUT, value); + galileo_gpio_write(PIN_OUTPUT, value); - quarkX1000_gpio_read(PIN_INPUT, &value_in); + galileo_gpio_read(PIN_INPUT, &value_in); if (value == value_in) printf("GPIO pin value match!\n"); diff --git a/examples/galileo/gpio-interrupt.c b/examples/galileo/gpio-interrupt.c index ca4606266..6289fe4f1 100644 --- a/examples/galileo/gpio-interrupt.c +++ b/examples/galileo/gpio-interrupt.c @@ -33,10 +33,11 @@ #include "contiki.h" #include "sys/ctimer.h" +#include "galileo-gpio.h" #include "gpio.h" -#define PIN_OUTPUT 5 -#define PIN_INTR 6 +#define PIN_OUTPUT 2 +#define PIN_INTR 3 static struct ctimer timer; @@ -47,8 +48,8 @@ static void timeout(void *data) { /* emulate an interrupt */ - quarkX1000_gpio_write(PIN_OUTPUT, 0); - quarkX1000_gpio_write(PIN_OUTPUT, 1); + galileo_gpio_write(PIN_OUTPUT, 0); + galileo_gpio_write(PIN_OUTPUT, 1); ctimer_reset(&timer); } @@ -63,7 +64,7 @@ PROCESS_THREAD(gpio_interrupt_process, ev, data) { PROCESS_BEGIN(); - quarkX1000_gpio_config(PIN_INTR, QUARKX1000_GPIO_INT | QUARKX1000_GPIO_ACTIVE_HIGH | QUARKX1000_GPIO_EDGE); + galileo_gpio_config(PIN_INTR, QUARKX1000_GPIO_INT | QUARKX1000_GPIO_ACTIVE_HIGH | QUARKX1000_GPIO_EDGE); quarkX1000_gpio_set_callback(callback); diff --git a/examples/galileo/gpio-output.c b/examples/galileo/gpio-output.c index 4cc50597e..33a1159da 100644 --- a/examples/galileo/gpio-output.c +++ b/examples/galileo/gpio-output.c @@ -33,9 +33,10 @@ #include "contiki.h" #include "sys/ctimer.h" +#include "galileo-gpio.h" #include "gpio.h" -#define PIN 5 /* IO2 */ +#define PIN 2 static uint32_t value; static struct ctimer timer; @@ -48,7 +49,7 @@ timeout(void *data) { /* toggle pin state */ value = !value; - quarkX1000_gpio_write(PIN, value); + galileo_gpio_write(PIN, value); ctimer_reset(&timer); } diff --git a/platform/galileo/Makefile.galileo b/platform/galileo/Makefile.galileo index daada587a..d0ff4b0a8 100644 --- a/platform/galileo/Makefile.galileo +++ b/platform/galileo/Makefile.galileo @@ -5,7 +5,7 @@ LIBGCC_PATH = /usr/lib/gcc/$(shell gcc -dumpmachine)/$(shell gcc -dumpversion) CONTIKI_TARGET_DIRS = . core/sys/ drivers/ net/ CONTIKI_TARGET_MAIN = ${addprefix $(OBJECTDIR)/,contiki-main.o} -CONTIKI_SOURCEFILES += contiki-main.c clock.c rtimer-arch.c gpio-pcal9535a.c pwm-pca9685.c galileo-pinmux.c eth-proc.c eth-conf.c +CONTIKI_SOURCEFILES += contiki-main.c clock.c rtimer-arch.c gpio-pcal9535a.c pwm-pca9685.c galileo-pinmux.c eth-proc.c eth-conf.c galileo-gpio.c ifeq ($(CONTIKI_WITH_IPV6),1) CONTIKI_SOURCEFILES += nbr-table.c packetbuf.c linkaddr.c link-stats.c diff --git a/platform/galileo/drivers/galileo-gpio.c b/platform/galileo/drivers/galileo-gpio.c new file mode 100644 index 000000000..593f7acda --- /dev/null +++ b/platform/galileo/drivers/galileo-gpio.c @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2016, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "galileo-gpio.h" +#include +#include "gpio.h" + +/* Must be implemented in board-specific pinmux file to map a board-level GPIO + * pin number to the corresponding CPU GPIO pin number. + * + * The return value should always be a positive number. An assertion within the + * function should check the validity of the pin number. + */ +int galileo_brd_to_cpu_gpio_pin(unsigned pin, bool *sus); + +static int +brd_to_cpu_pin(unsigned pin) +{ + int cpu_pin; + bool sus; + + cpu_pin = galileo_brd_to_cpu_gpio_pin(pin, &sus); + assert(!sus); + + return cpu_pin; +} + +void galileo_gpio_config(uint8_t pin, int flags) +{ + assert(quarkX1000_gpio_config(brd_to_cpu_pin(pin), flags) == 0); +} + +/** + * \brief Read from GPIO. + * \param pin Board-level IO pin number. + */ +void galileo_gpio_read(uint8_t pin, uint8_t *value) +{ + assert(quarkX1000_gpio_read(brd_to_cpu_pin(pin), value) == 0); +} + +void galileo_gpio_write(uint8_t pin, uint8_t value) +{ + assert(quarkX1000_gpio_write(brd_to_cpu_pin(pin), value) == 0); +} diff --git a/platform/galileo/drivers/galileo-gpio.h b/platform/galileo/drivers/galileo-gpio.h new file mode 100644 index 000000000..07dbc1082 --- /dev/null +++ b/platform/galileo/drivers/galileo-gpio.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2016, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PLATFORM_GALILEO_DRIVERS_GALILEO_GPIO_H_ +#define PLATFORM_GALILEO_DRIVERS_GALILEO_GPIO_H_ + +#include + +void galileo_gpio_config(uint8_t pin, int flags); +void galileo_gpio_read(uint8_t pin, uint8_t *value); +void galileo_gpio_write(uint8_t pin, uint8_t value); + +#endif /* PLATFORM_GALILEO_DRIVERS_GALILEO_GPIO_H_ */ diff --git a/platform/galileo/drivers/galileo-pinmux.c b/platform/galileo/drivers/galileo-pinmux.c index c99ccd6c2..f4ea5be30 100644 --- a/platform/galileo/drivers/galileo-pinmux.c +++ b/platform/galileo/drivers/galileo-pinmux.c @@ -571,10 +571,9 @@ flatten_pin_num(galileo_pin_group_t grp, unsigned *pin) assert(*pin < GALILEO_NUM_PINS); } -/* Map a board-level GPIO pin number to the corresponding CPU GPIO pin number. - */ -static int -brd_to_cpu_gpio_pin(unsigned pin, bool *sus) +/* See galileo-gpio.c for the declaration of this function. */ +int +galileo_brd_to_cpu_gpio_pin(unsigned pin, bool *sus) { static const int SUS = 0x100; unsigned pins[GALILEO_NUM_PINS] = { @@ -603,7 +602,7 @@ galileo_pinmux_select_din(galileo_pin_group_t grp, unsigned pin) assert(galileo_pinmux_set_pin(pin, GALILEO_PINMUX_FUNC_B) == 0); - cpu_pin = brd_to_cpu_gpio_pin(pin, &sus); + cpu_pin = galileo_brd_to_cpu_gpio_pin(pin, &sus); /* GPIO_SUS pins are currently unsupported. */ assert(!sus); quarkX1000_gpio_config(cpu_pin, QUARKX1000_GPIO_IN); @@ -618,7 +617,7 @@ galileo_pinmux_select_dout(galileo_pin_group_t grp, unsigned pin) assert(galileo_pinmux_set_pin(pin, GALILEO_PINMUX_FUNC_A) == 0); - cpu_pin = brd_to_cpu_gpio_pin(pin, &sus); + cpu_pin = galileo_brd_to_cpu_gpio_pin(pin, &sus); /* GPIO_SUS pins are currently unsupported. */ assert(!sus); quarkX1000_gpio_config(cpu_pin, QUARKX1000_GPIO_OUT); From 418117998545a77e0c6f219e7e97eea7db032f84 Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Mon, 22 Aug 2016 16:54:49 -0700 Subject: [PATCH 312/345] galileo: Add support for Gen. 1 pinmux and GPIO This patch adds support for IO pinmuxing and GPIO on first generation Intel Galileo boards. --- platform/galileo/Makefile.galileo | 12 +- platform/galileo/README.md | 8 +- platform/galileo/drivers/cy8c9540a.c | 131 ++++++++ platform/galileo/drivers/cy8c9540a.h | 72 +++++ .../galileo/drivers/galileo-gen1-pinmux.c | 282 ++++++++++++++++++ ...galileo-pinmux.c => galileo-gen2-pinmux.c} | 0 platform/galileo/drivers/galileo-gpio.c | 36 ++- 7 files changed, 536 insertions(+), 5 deletions(-) create mode 100644 platform/galileo/drivers/cy8c9540a.c create mode 100644 platform/galileo/drivers/cy8c9540a.h create mode 100644 platform/galileo/drivers/galileo-gen1-pinmux.c rename platform/galileo/drivers/{galileo-pinmux.c => galileo-gen2-pinmux.c} (100%) diff --git a/platform/galileo/Makefile.galileo b/platform/galileo/Makefile.galileo index d0ff4b0a8..35a4ad825 100644 --- a/platform/galileo/Makefile.galileo +++ b/platform/galileo/Makefile.galileo @@ -5,7 +5,17 @@ LIBGCC_PATH = /usr/lib/gcc/$(shell gcc -dumpmachine)/$(shell gcc -dumpversion) CONTIKI_TARGET_DIRS = . core/sys/ drivers/ net/ CONTIKI_TARGET_MAIN = ${addprefix $(OBJECTDIR)/,contiki-main.o} -CONTIKI_SOURCEFILES += contiki-main.c clock.c rtimer-arch.c gpio-pcal9535a.c pwm-pca9685.c galileo-pinmux.c eth-proc.c eth-conf.c galileo-gpio.c +CONTIKI_SOURCEFILES += contiki-main.c clock.c rtimer-arch.c eth-proc.c eth-conf.c galileo-gpio.c + +GALILEO_GEN ?= 2 +CFLAGS += -DGALILEO_GEN=$(GALILEO_GEN) +CONTIKI_SOURCEFILES += galileo-gen$(GALILEO_GEN)-pinmux.c + +ifeq ($(GALILEO_GEN),2) +CONTIKI_SOURCEFILES += gpio-pcal9535a.c pwm-pca9685.c +else +CONTIKI_SOURCEFILES += cy8c9540a.c +endif ifeq ($(CONTIKI_WITH_IPV6),1) CONTIKI_SOURCEFILES += nbr-table.c packetbuf.c linkaddr.c link-stats.c diff --git a/platform/galileo/README.md b/platform/galileo/README.md index 529739ea8..e32799e3b 100644 --- a/platform/galileo/README.md +++ b/platform/galileo/README.md @@ -141,6 +141,9 @@ specify X86_CONF_RESTRICT_DMA=1 as a command-line argument to the make command that is used to build the image. This will configure and lock the IMRs. +Galileo Gen. 2 is targeted by default. Specify GALILEO_GEN=1 on the build +command line to target first generation boards. + Running ------- @@ -193,7 +196,8 @@ $ cp examples/hello-world/hello-world.galileo.efi /mnt/sdcard/efi/boot/bootia32. ### Connect to the console output -Connect the serial cable to your computer as shown in [2]. +Connect the serial cable to your computer as shown in [8] for first generation +boards and [2] for second generation boards. Choose a terminal emulator such as PuTTY. Make sure you use the SCO keyboard mode (on PuTTY that option is at Terminal -> Keyboard, on the left menu). @@ -277,3 +281,5 @@ References [6] https://docs.docker.com/docker-for-windows/#/shared-drives [7] https://docs.docker.com/engine/understanding-docker/ + +[8] https://software.intel.com/en-us/articles/intel-galileo-gen-1-board-assembly-using-eclipse-and-intel-xdk-iot-edition diff --git a/platform/galileo/drivers/cy8c9540a.c b/platform/galileo/drivers/cy8c9540a.c new file mode 100644 index 000000000..e042f9e23 --- /dev/null +++ b/platform/galileo/drivers/cy8c9540a.c @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2016, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "cy8c9540a.h" + +#include +#include "i2c.h" +#include + +/* Change this to 0x21 if J2 is set to 1-2 + * (covering the pin marked with the white triangle). */ +#define I2C_ADDR 0x20 + +#define REG_PORT_SEL 0x18 +#define REG_PORT_DIR 0x1C + +#define PORT_CNT 6 + +/* Cache the current state of each port to obviate the need for reading before + * writing to output ports when simply updating a single pin. + */ +static uint8_t out_cache[PORT_CNT]; + +/*---------------------------------------------------------------------------*/ +static void +write_reg(uint8_t reg, uint8_t data) +{ + uint8_t pkt[] = { reg, data }; + assert(quarkX1000_i2c_polling_write(pkt, sizeof(pkt), I2C_ADDR) == 0); +} +/*---------------------------------------------------------------------------*/ +static uint8_t +read_reg(uint8_t reg) +{ + uint8_t data; + assert(quarkX1000_i2c_polling_write(®, 1, I2C_ADDR) == 0); + assert(quarkX1000_i2c_polling_read(&data, 1, I2C_ADDR) == 0); + return data; +} +/*---------------------------------------------------------------------------*/ +void +cy8c9540a_init(void) +{ + uint8_t status; + + /* has to init after I2C master */ + assert(quarkX1000_i2c_is_available()); + + status = read_reg(0x2E); + if((status >> 4) != 4) { + fprintf(stderr, "Failed to communicate with CY8C9540A. Perhaps jumper J2 " + "is not set to 2-3? Halting.\n"); + halt(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Set the direction (in or out) for the indicated GPIO pin. + */ +void +cy8c9540a_set_port_dir(cy8c9540a_bit_addr_t addr, cy8c9540a_port_dir_t dir) +{ + uint8_t mask; + + assert(addr.port < PORT_CNT); + + write_reg(REG_PORT_SEL, addr.port); + mask = read_reg(REG_PORT_DIR); + mask &= ~(1 << addr.pin); + mask |= ((uint8_t)dir) << addr.pin; + write_reg(REG_PORT_DIR, mask); +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Set the drive mode for the indicated GPIO pin. + */ +void +cy8c9540a_set_drive_mode(cy8c9540a_bit_addr_t addr, + cy8c9540a_drive_mode_t drv_mode) +{ + assert(addr.port < PORT_CNT); + + write_reg(REG_PORT_SEL, addr.port); + write_reg((uint8_t)drv_mode, 1 << addr.pin); +} +/*---------------------------------------------------------------------------*/ +bool +cy8c9540a_read(cy8c9540a_bit_addr_t addr) +{ + assert(addr.port < PORT_CNT); + + return ((read_reg(addr.port) >> addr.pin) & 1) == 1; +} +/*---------------------------------------------------------------------------*/ +void +cy8c9540a_write(cy8c9540a_bit_addr_t addr, bool val) +{ + assert(addr.port < PORT_CNT); + + out_cache[addr.port] &= ~(1 << addr.pin); + out_cache[addr.port] |= ((uint8_t)val) << addr.pin; + write_reg(8 + addr.port, out_cache[addr.port]); +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/galileo/drivers/cy8c9540a.h b/platform/galileo/drivers/cy8c9540a.h new file mode 100644 index 000000000..a9c31a484 --- /dev/null +++ b/platform/galileo/drivers/cy8c9540a.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2016, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef PLATFORM_GALILEO_DRIVERS_CY8C9540A_H_ +#define PLATFORM_GALILEO_DRIVERS_CY8C9540A_H_ + +#include +#include + +/* Driver for Cypress Semiconductors CY8C9540A device used for GPIO, PWM, and + * pinmuxing on the first generation Intel Galileo. + */ + +/* The numeric value of each drive mode corresponds to the device register + * address for selecting that mode. Only a subset of the available modes are + * listed here. + */ +typedef enum cy8c9540a_drive_mode { + CY8C9540A_DRIVE_PULL_UP = 0x1D, + CY8C9540A_DRIVE_PULL_DOWN = 0x1E, + CY8C9540A_DRIVE_STRONG = 0x21, + CY8C9540A_DRIVE_HI_Z = 0x23 +} cy8c9540a_drive_mode_t; + +typedef enum cy8c9540a_port_dir { + CY8C9540A_PORT_DIR_OUT = 0, + CY8C9540A_PORT_DIR_IN = 1 +} cy8c9540a_port_dir_t; + +typedef struct cy8c9540a_bit_addr { + uint8_t port; + int pin; +} cy8c9540a_bit_addr_t; + +#define CY8C9540A_BIT_ADDR_INVALID_PORT 0xFF + +void cy8c9540a_init(void); +void cy8c9540a_set_port_dir(cy8c9540a_bit_addr_t addr, + cy8c9540a_port_dir_t dir); +void cy8c9540a_set_drive_mode(cy8c9540a_bit_addr_t addr, + cy8c9540a_drive_mode_t drv_mode); +bool cy8c9540a_read(cy8c9540a_bit_addr_t addr); +void cy8c9540a_write(cy8c9540a_bit_addr_t addr, bool val); + +#endif /* PLATFORM_GALILEO_DRIVERS_CY8C9540A_H_ */ diff --git a/platform/galileo/drivers/galileo-gen1-pinmux.c b/platform/galileo/drivers/galileo-gen1-pinmux.c new file mode 100644 index 000000000..fc94ab5ca --- /dev/null +++ b/platform/galileo/drivers/galileo-gen1-pinmux.c @@ -0,0 +1,282 @@ +/* + * Copyright (C) 2016, Intel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "galileo-pinmux.h" + +#include +#include "cy8c9540a.h" +#include "gpio.h" +#include + +static cy8c9540a_bit_addr_t mux_bit_addrs[] = { + { 3, 4 }, /* IO0 */ + { 3, 5 }, /* IO1 */ + { 1, 7 }, /* IO2 */ + { 1, 6 }, /* IO3 */ + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, /* IO4 */ + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, /* IO5 */ + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, /* IO6 */ + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, /* IO7 */ + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, /* IO8 */ + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, /* IO9 */ + { 3, 6 }, /* IO10 */ + { 3, 7 }, /* IO11 */ + { 5, 2 }, /* IO12 */ + { 5, 3 }, /* IO13 */ + { 3, 1 }, /* A0 */ + { 3, 0 }, /* A1 */ + { 0, 7 }, /* A2 */ + { 0, 6 }, /* A3 */ + { 0, 5 }, /* A4 (also controlled by I2C mux) */ + { 0, 4 }, /* A5 (also controlled by I2C mux) */ +}; + +static cy8c9540a_bit_addr_t i2c_mux_bit_addr = { 1, 5 }; + +/*---------------------------------------------------------------------------*/ +static void +flatten_pin_num(galileo_pin_group_t grp, unsigned *pin) +{ + if(grp == GALILEO_PIN_GRP_ANALOG) { + *pin += GALILEO_NUM_DIGITAL_PINS; + } + + assert(*pin < GALILEO_NUM_PINS); +} +/*---------------------------------------------------------------------------*/ +/* See galileo-gpio.c for the declaration of this function. */ +int +galileo_brd_to_cpu_gpio_pin(unsigned pin, bool *sus) +{ + assert(pin < GALILEO_NUM_PINS); + *sus = false; + switch(pin) { + case 2: + return 6; + case 3: + return 7; + case 10: + return 2; + default: + return -1; /* GPIO pin may be connected to the CY8C9540A chip, but not the + CPU. */ + } +} +/*---------------------------------------------------------------------------*/ +static cy8c9540a_bit_addr_t cy8c9540a_gpio_mapping[] = { + { 4, 6 }, + { 4, 7 }, + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, + { CY8C9540A_BIT_ADDR_INVALID_PORT, 0 }, + { 1, 4 }, + { 0, 1 }, + { 1, 0 }, + { 1, 3 }, + { 1, 2 }, + { 0, 3 }, + { 0, 0 }, /* This driver configures IO10 to connect to CPU GPIO when setting + IO10 to a digital mode, but hardware exists to alternately + connect it to this pin of the CY8C9540A chip. */ + { 1, 1 }, + { 3, 2 }, + { 3, 3 }, + { 4, 0 }, + { 4, 1 }, + { 4, 2 }, + { 4, 3 }, + { 4, 4 }, + { 4, 5 } +}; +/* Map a board-level GPIO pin number to the address of the CY8C9540A pin that + * implements it. + */ +cy8c9540a_bit_addr_t +galileo_brd_to_cy8c9540a_gpio_pin(unsigned pin) +{ + assert(pin < GALILEO_NUM_PINS); + return cy8c9540a_gpio_mapping[pin]; +} +/*---------------------------------------------------------------------------*/ +/* The I2C mux control must be set high to be able to access A4 and A5. + */ +static void +set_i2c_mux(bool val) +{ + cy8c9540a_write(i2c_mux_bit_addr, val); +} +/*---------------------------------------------------------------------------*/ +static void +select_gpio_pwm(unsigned flat_pin, bool pwm) +{ + bool mux_val; + cy8c9540a_bit_addr_t mux_bit_addr; + mux_bit_addr = mux_bit_addrs[flat_pin]; + if(mux_bit_addr.port != CY8C9540A_BIT_ADDR_INVALID_PORT) { + mux_val = pwm || !(flat_pin == 2 || flat_pin == 3 || flat_pin == 10); + cy8c9540a_write(mux_bit_addr, mux_val); + } + if((GALILEO_NUM_DIGITAL_PINS + 4) <= flat_pin) { + /* This single control switches away from both I2C pins. */ + set_i2c_mux(true); + } +} +/*---------------------------------------------------------------------------*/ +static void +select_gpio(galileo_pin_group_t grp, unsigned pin, bool out) +{ + bool sus; + int cpu_pin; + cy8c9540a_bit_addr_t gpio_bit_addr; + + flatten_pin_num(grp, &pin); + select_gpio_pwm(pin, false); + + cpu_pin = galileo_brd_to_cpu_gpio_pin(pin, &sus); + if(cpu_pin == -1) { + gpio_bit_addr = galileo_brd_to_cy8c9540a_gpio_pin(pin); + cy8c9540a_set_port_dir(gpio_bit_addr, + out? + CY8C9540A_PORT_DIR_OUT : + CY8C9540A_PORT_DIR_IN); + cy8c9540a_set_drive_mode(gpio_bit_addr, + out? + CY8C9540A_DRIVE_STRONG : + CY8C9540A_DRIVE_HI_Z); + } else { + quarkX1000_gpio_config(cpu_pin, + out? QUARKX1000_GPIO_OUT : QUARKX1000_GPIO_IN); + } +} +/*---------------------------------------------------------------------------*/ +void +galileo_pinmux_select_din(galileo_pin_group_t grp, unsigned pin) +{ + select_gpio(grp, pin, false); +} +/*---------------------------------------------------------------------------*/ +void galileo_pinmux_select_dout(galileo_pin_group_t grp, unsigned pin) +{ + select_gpio(grp, pin, true); +} +/*---------------------------------------------------------------------------*/ +void galileo_pinmux_select_pwm(unsigned pin) +{ + switch(pin) { + case 3: + case 5: + case 6: + case 9: + case 10: + case 11: + break; + default: + fprintf(stderr, "%s: invalid pin: %d.\n", __FUNCTION__, pin); + halt(); + } + + select_gpio_pwm(pin, true); +} +/*---------------------------------------------------------------------------*/ +void galileo_pinmux_select_serial(unsigned pin) +{ + assert(pin == 0 || pin == 1); + + cy8c9540a_write(mux_bit_addrs[pin], false); +} +/*---------------------------------------------------------------------------*/ +void galileo_pinmux_select_i2c(void) +{ + set_i2c_mux(false); +} +/*---------------------------------------------------------------------------*/ +void galileo_pinmux_select_spi(void) +{ + unsigned pin; + for(pin = 11; pin <= 13; pin++) { + cy8c9540a_write(mux_bit_addrs[pin], false); + } +} +/*---------------------------------------------------------------------------*/ +void galileo_pinmux_select_analog(unsigned pin) +{ + assert(pin < GALILEO_NUM_ANALOG_PINS); + pin += GALILEO_NUM_DIGITAL_PINS; + + cy8c9540a_write(mux_bit_addrs[pin], false); + + if(4 <= pin) { + /* This single control switches away from both I2C pins. */ + set_i2c_mux(true); + } +} +/*---------------------------------------------------------------------------*/ +int +galileo_pinmux_initialize(void) +{ + int i; + + cy8c9540a_init(); + + /* Configure all mux control pins as outputs. */ + for(i = 0; i < GALILEO_NUM_PINS; i++) { + if(mux_bit_addrs[i].port == CY8C9540A_BIT_ADDR_INVALID_PORT) { + continue; + } + + cy8c9540a_set_port_dir(mux_bit_addrs[i], CY8C9540A_PORT_DIR_OUT); + cy8c9540a_set_drive_mode(mux_bit_addrs[i], CY8C9540A_DRIVE_STRONG); + } + cy8c9540a_set_port_dir(i2c_mux_bit_addr, CY8C9540A_PORT_DIR_OUT); + cy8c9540a_set_drive_mode(i2c_mux_bit_addr, CY8C9540A_DRIVE_STRONG); + + /* Activate default pinmux configuration. */ + galileo_pinmux_select_serial(0); + galileo_pinmux_select_serial(1); + galileo_pinmux_select_dout(GALILEO_PIN_GRP_DIGITAL, 2); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 3); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 4); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 5); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 6); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 7); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 8); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 9); + galileo_pinmux_select_dout(GALILEO_PIN_GRP_DIGITAL, 10); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 11); + galileo_pinmux_select_dout(GALILEO_PIN_GRP_DIGITAL, 12); + galileo_pinmux_select_din(GALILEO_PIN_GRP_DIGITAL, 13); + galileo_pinmux_select_analog(0); + galileo_pinmux_select_analog(1); + galileo_pinmux_select_analog(2); + galileo_pinmux_select_analog(3); + galileo_pinmux_select_i2c(); + + return 0; +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/galileo/drivers/galileo-pinmux.c b/platform/galileo/drivers/galileo-gen2-pinmux.c similarity index 100% rename from platform/galileo/drivers/galileo-pinmux.c rename to platform/galileo/drivers/galileo-gen2-pinmux.c diff --git a/platform/galileo/drivers/galileo-gpio.c b/platform/galileo/drivers/galileo-gpio.c index 593f7acda..a6cee8b65 100644 --- a/platform/galileo/drivers/galileo-gpio.c +++ b/platform/galileo/drivers/galileo-gpio.c @@ -31,14 +31,22 @@ #include "galileo-gpio.h" #include #include "gpio.h" +#if GALILEO_GEN == 1 +#include "cy8c9540a.h" +#endif /* Must be implemented in board-specific pinmux file to map a board-level GPIO * pin number to the corresponding CPU GPIO pin number. * - * The return value should always be a positive number. An assertion within the + * For gen. 1 boards, the value -1 may be returned to indicate that the + * specified GPIO pin is not connected to any CPU pin. For gen. 2 boards, the + * return value should always be a positive number. An assertion within the * function should check the validity of the pin number. */ int galileo_brd_to_cpu_gpio_pin(unsigned pin, bool *sus); +#if GALILEO_GEN == 1 +cy8c9540a_bit_addr_t galileo_brd_to_cy8c9540a_gpio_pin(unsigned pin); +#endif static int brd_to_cpu_pin(unsigned pin) @@ -63,10 +71,32 @@ void galileo_gpio_config(uint8_t pin, int flags) */ void galileo_gpio_read(uint8_t pin, uint8_t *value) { - assert(quarkX1000_gpio_read(brd_to_cpu_pin(pin), value) == 0); +#if GALILEO_GEN == 1 + cy8c9540a_bit_addr_t bit_addr; +#endif + int cpu_pin = brd_to_cpu_pin(pin); +#if GALILEO_GEN == 1 + if(cpu_pin == -1) { + bit_addr = galileo_brd_to_cy8c9540a_gpio_pin(pin); + *value = cy8c9540a_read(bit_addr); + return; + } +#endif + assert(quarkX1000_gpio_read(cpu_pin, value) == 0); } void galileo_gpio_write(uint8_t pin, uint8_t value) { - assert(quarkX1000_gpio_write(brd_to_cpu_pin(pin), value) == 0); +#if GALILEO_GEN == 1 + cy8c9540a_bit_addr_t bit_addr; +#endif + int cpu_pin = brd_to_cpu_pin(pin); +#if GALILEO_GEN == 1 + if(cpu_pin == -1) { + bit_addr = galileo_brd_to_cy8c9540a_gpio_pin(pin); + cy8c9540a_write(bit_addr, value); + return; + } +#endif + assert(quarkX1000_gpio_write(cpu_pin, value) == 0); } From c2760811500c7374b87d158056b772422df2a32f Mon Sep 17 00:00:00 2001 From: Michael LeMay Date: Tue, 23 Aug 2016 11:26:31 -0700 Subject: [PATCH 313/345] galileo: Add process to perform DHCP configuration This patch adds a process that is started automatically to request DHCP configuration. It also moves the IP configuration ahead of autostart processes in case some autostart process depends on the IP configuration. --- platform/galileo/contiki-main.c | 4 +-- platform/galileo/net/eth-conf.c | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/platform/galileo/contiki-main.c b/platform/galileo/contiki-main.c index 5e95c4902..d162f394b 100644 --- a/platform/galileo/contiki-main.c +++ b/platform/galileo/contiki-main.c @@ -65,10 +65,10 @@ app_main(void) process_init(); procinit_init(); ctimer_init(); - autostart_start(autostart_processes); - eth_init(); + autostart_start(autostart_processes); + while(1) { process_run(); } diff --git a/platform/galileo/net/eth-conf.c b/platform/galileo/net/eth-conf.c index 061e0aae7..3afb8f211 100644 --- a/platform/galileo/net/eth-conf.c +++ b/platform/galileo/net/eth-conf.c @@ -29,8 +29,10 @@ */ #include "eth-conf.h" +#include #include "net/eth-proc.h" #include "contiki-net.h" +#include "net/ip/dhcpc.h" #include "net/linkaddr.h" #if NETSTACK_CONF_WITH_IPV6 @@ -44,6 +46,8 @@ const linkaddr_t linkaddr_null = { { 0, 0, 0, 0, 0, 0 } }; #define NAMESERVER_IP GATEWAY_IP #endif +PROCESS(dhcp_process, "DHCP"); + /*---------------------------------------------------------------------------*/ void eth_init(void) @@ -70,5 +74,52 @@ eth_init(void) #endif process_start(ð_process, NULL); + /* Comment out the following line to disable DHCP and simply use the static + * IP configuration setup above. + */ + process_start(&dhcp_process, NULL); +} +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(dhcp_process, ev, data) +{ + PROCESS_BEGIN(); + + dhcpc_init(uip_lladdr.addr, sizeof(uip_lladdr.addr)); + + printf("Requesting DHCP configuration...\n"); + dhcpc_request(); + + while(1) { + PROCESS_WAIT_EVENT(); + + if(ev == tcpip_event || ev == PROCESS_EVENT_TIMER) { + dhcpc_appcall(ev, data); + } else if(ev == PROCESS_EVENT_EXIT) { + process_exit(&dhcp_process); + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +void +dhcpc_configured(const struct dhcpc_state *s) +{ + uip_sethostaddr(&s->ipaddr); + uip_setnetmask(&s->netmask); + uip_setdraddr(&s->default_router); + uip_nameserver_update(&s->dnsaddr, UIP_NAMESERVER_INFINITE_LIFETIME); + printf("DHCP configured:\n"); + printf(" - Host IP: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&s->ipaddr)); + printf(" - Netmask: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&s->netmask)); + printf(" - Default router: %d.%d.%d.%d\n", + uip_ipaddr_to_quad(&s->default_router)); + printf(" - DNS server: %d.%d.%d.%d\n", uip_ipaddr_to_quad(&s->dnsaddr)); +} +/*---------------------------------------------------------------------------*/ +void +dhcpc_unconfigured(const struct dhcpc_state *s) +{ + printf("DHCP unconfigured.\n"); } /*---------------------------------------------------------------------------*/ From 25dea7264a22a7e643520e4a508bcb0ee41b8a6c Mon Sep 17 00:00:00 2001 From: Sumankumar Panchal Date: Wed, 24 Aug 2016 00:11:24 +0530 Subject: [PATCH 314/345] CC2520: Added offset to calculate correct RSSI value --- dev/cc2520/cc2520.c | 184 ++++++++++++++++++++++---------------------- 1 file changed, 93 insertions(+), 91 deletions(-) diff --git a/dev/cc2520/cc2520.c b/dev/cc2520/cc2520.c index e0dad1b6a..c24af2670 100644 --- a/dev/cc2520/cc2520.c +++ b/dev/cc2520/cc2520.c @@ -55,12 +55,19 @@ #define FOOTER1_CRC_OK 0x80 #define FOOTER1_CORRELATION 0x7f +#ifdef CC2520_CONF_RSSI_OFFSET +#define RSSI_OFFSET CC2520_CONF_RSSI_OFFSET +#else /* CC2520_CONF_RSSI_OFFSET */ +/* The RSSI_OFFSET is approximate 76 (see CC2520 specification) */ +#define RSSI_OFFSET 76 +#endif /* CC2520_CONF_RSSI_OFFSET */ + #include #define DEBUG 0 #if DEBUG #define PRINTF(...) printf(__VA_ARGS__) #else -#define PRINTF(...) do {} while (0) +#define PRINTF(...) do {} while(0) #endif #if 0 && DEBUG @@ -81,11 +88,11 @@ int cc2520_authority_level_of_sender; int cc2520_packets_seen, cc2520_packets_read; -#define BUSYWAIT_UNTIL(cond, max_time) \ - do { \ - rtimer_clock_t t0; \ - t0 = RTIMER_NOW(); \ - while(!(cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (max_time))); \ +#define BUSYWAIT_UNTIL(cond, max_time) \ + do { \ + rtimer_clock_t t0; \ + t0 = RTIMER_NOW(); \ + while(!(cond) && RTIMER_CLOCK_LT(RTIMER_NOW(), t0 + (max_time))); \ } while(0) volatile uint8_t cc2520_sfd_counter; @@ -97,7 +104,6 @@ static volatile uint16_t last_packet_timestamp; PROCESS(cc2520_process, "CC2520 driver"); /*---------------------------------------------------------------------------*/ - int cc2520_on(void); int cc2520_off(void); @@ -141,7 +147,6 @@ get_value(radio_param_t param, radio_value_t *value) return RADIO_RESULT_NOT_SUPPORTED; } } - static radio_result_t set_value(radio_param_t param, radio_value_t value) { @@ -166,38 +171,35 @@ set_value(radio_param_t param, radio_value_t value) return RADIO_RESULT_NOT_SUPPORTED; } } - static radio_result_t get_object(radio_param_t param, void *dest, size_t size) { return RADIO_RESULT_NOT_SUPPORTED; } - static radio_result_t set_object(radio_param_t param, const void *src, size_t size) { return RADIO_RESULT_NOT_SUPPORTED; } - const struct radio_driver cc2520_driver = - { - cc2520_init, - cc2520_prepare, - cc2520_transmit, - cc2520_send, - cc2520_read, - /* cc2520_set_channel, */ - /* detected_energy, */ - cc2520_cca, - cc2520_receiving_packet, - pending_packet, - cc2520_on, - cc2520_off, - get_value, - set_value, - get_object, - set_object - }; +{ + cc2520_init, + cc2520_prepare, + cc2520_transmit, + cc2520_send, + cc2520_read, + /* cc2520_set_channel, */ + /* detected_energy, */ + cc2520_cca, + cc2520_receiving_packet, + pending_packet, + cc2520_on, + cc2520_off, + get_value, + set_value, + get_object, + set_object +}; /*---------------------------------------------------------------------------*/ @@ -269,7 +271,9 @@ off(void) } /*---------------------------------------------------------------------------*/ #define GET_LOCK() locked++ -static void RELEASE_LOCK(void) { +static void +RELEASE_LOCK(void) +{ if(locked == 1) { if(lock_on) { on(); @@ -315,7 +319,7 @@ cc2520_init(void) { { int s = splhigh(); - cc2520_arch_init(); /* Initalize ports and SPI. */ + cc2520_arch_init(); /* Initalize ports and SPI. */ CC2520_DISABLE_FIFOP_INT(); CC2520_FIFOP_INT_INIT(); splx(s); @@ -339,57 +343,57 @@ cc2520_init(void) /* Change default values as recommended in the data sheet, */ /* correlation threshold = 20, RX bandpass filter = 1.3uA.*/ - setreg(CC2520_TXCTRL, 0x94); - setreg(CC2520_TXPOWER, 0x13); // Output power 1 dBm + setreg(CC2520_TXCTRL, 0x94); + setreg(CC2520_TXPOWER, 0x13); /* Output power 1 dBm */ /* - valeurs de TXPOWER - 0x03 -> -18 dBm - 0x2C -> -7 dBm - 0x88 -> -4 dBm - 0x81 -> -2 dBm - 0x32 -> 0 dBm - 0x13 -> 1 dBm - 0x32 -> 0 dBm - 0x13 -> 1 dBm - 0xAB -> 2 dBm - 0xF2 -> 3 dBm - 0xF7 -> 5 dBm - */ - setreg(CC2520_CCACTRL0, 0xF8); // CCA treshold -80dBm + valeurs de TXPOWER + 0x03 -> -18 dBm + 0x2C -> -7 dBm + 0x88 -> -4 dBm + 0x81 -> -2 dBm + 0x32 -> 0 dBm + 0x13 -> 1 dBm + 0x32 -> 0 dBm + 0x13 -> 1 dBm + 0xAB -> 2 dBm + 0xF2 -> 3 dBm + 0xF7 -> 5 dBm + */ + setreg(CC2520_CCACTRL0, 0xF8); /* CCA treshold -80dBm */ - // Recommended RX settings - setreg(CC2520_MDMCTRL0, 0x84); // Controls modem - setreg(CC2520_MDMCTRL1, 0x14); // Controls modem - setreg(CC2520_RXCTRL, 0x3F); // Adjust currents in RX related analog modules - setreg(CC2520_FSCTRL, 0x5A); // Adjust currents in synthesizer. - setreg(CC2520_FSCAL1, 0x2B); // Adjust currents in VCO - setreg(CC2520_AGCCTRL1, 0x11); // Adjust target value for AGC control loop - setreg(CC2520_AGCCTRL2, 0xEB); + /* Recommended RX settings */ + setreg(CC2520_MDMCTRL0, 0x84); /* Controls modem */ + setreg(CC2520_MDMCTRL1, 0x14); /* Controls modem */ + setreg(CC2520_RXCTRL, 0x3F); /* Adjust currents in RX related analog modules */ + setreg(CC2520_FSCTRL, 0x5A); /* Adjust currents in synthesizer. */ + setreg(CC2520_FSCAL1, 0x2B); /* Adjust currents in VCO */ + setreg(CC2520_AGCCTRL1, 0x11); /* Adjust target value for AGC control loop */ + setreg(CC2520_AGCCTRL2, 0xEB); - // Disable external clock - setreg(CC2520_EXTCLOCK, 0x00); + /* Disable external clock */ + setreg(CC2520_EXTCLOCK, 0x00); - // Tune ADC performance - setreg(CC2520_ADCTEST0, 0x10); - setreg(CC2520_ADCTEST1, 0x0E); - setreg(CC2520_ADCTEST2, 0x03); + /* Tune ADC performance */ + setreg(CC2520_ADCTEST0, 0x10); + setreg(CC2520_ADCTEST1, 0x0E); + setreg(CC2520_ADCTEST2, 0x03); /* Set auto CRC on frame. */ #if CC2520_CONF_AUTOACK - setreg(CC2520_FRMCTRL0, AUTOCRC | AUTOACK); - setreg(CC2520_FRMFILT0, FRAME_MAX_VERSION|FRAME_FILTER_ENABLE); + setreg(CC2520_FRMCTRL0, AUTOCRC | AUTOACK); + setreg(CC2520_FRMFILT0, FRAME_MAX_VERSION | FRAME_FILTER_ENABLE); #else /* setreg(CC2520_FRMCTRL0, 0x60); */ - setreg(CC2520_FRMCTRL0, AUTOCRC); + setreg(CC2520_FRMCTRL0, AUTOCRC); /* Disable filter on @ (remove if you want to address specific wismote) */ - setreg(CC2520_FRMFILT0, 0x00); + setreg(CC2520_FRMFILT0, 0x00); #endif /* CC2520_CONF_AUTOACK */ /* SET_RXENMASK_ON_TX */ - setreg(CC2520_FRMCTRL1, 1); + setreg(CC2520_FRMCTRL1, 1); /* Set FIFOP threshold to maximum .*/ - setreg(CC2520_FIFOPCTRL, FIFOP_THR(0x7F)); + setreg(CC2520_FIFOPCTRL, FIFOP_THR(0x7F)); cc2520_set_pan_addr(0xffff, 0x0000, NULL); cc2520_set_channel(26); @@ -430,7 +434,7 @@ cc2520_transmit(unsigned short payload_len) #if WITH_SEND_CCA strobe(CC2520_INS_SRXON); - BUSYWAIT_UNTIL(status() & BV(CC2520_RSSI_VALID) , RTIMER_SECOND / 10); + BUSYWAIT_UNTIL(status() & BV(CC2520_RSSI_VALID), RTIMER_SECOND / 10); strobe(CC2520_INS_STXONCCA); #else /* WITH_SEND_CCA */ strobe(CC2520_INS_STXON); @@ -457,24 +461,24 @@ cc2520_transmit(unsigned short payload_len) return RADIO_TX_COLLISION; } if(receive_on) { - ENERGEST_OFF(ENERGEST_TYPE_LISTEN); + ENERGEST_OFF(ENERGEST_TYPE_LISTEN); } ENERGEST_ON(ENERGEST_TYPE_TRANSMIT); /* We wait until transmission has ended so that we get an - accurate measurement of the transmission time.*/ - //BUSYWAIT_UNTIL(getreg(CC2520_EXCFLAG0) & TX_FRM_DONE , RTIMER_SECOND / 100); + accurate measurement of the transmission time.*/ + /* BUSYWAIT_UNTIL(getreg(CC2520_EXCFLAG0) & TX_FRM_DONE , RTIMER_SECOND / 100); */ BUSYWAIT_UNTIL(!(status() & BV(CC2520_TX_ACTIVE)), RTIMER_SECOND / 10); #ifdef ENERGEST_CONF_LEVELDEVICE_LEVELS - ENERGEST_OFF_LEVEL(ENERGEST_TYPE_TRANSMIT,cc2520_get_txpower()); + ENERGEST_OFF_LEVEL(ENERGEST_TYPE_TRANSMIT, cc2520_get_txpower()); #endif ENERGEST_OFF(ENERGEST_TYPE_TRANSMIT); if(receive_on) { - ENERGEST_ON(ENERGEST_TYPE_LISTEN); + ENERGEST_ON(ENERGEST_TYPE_LISTEN); } else { - /* We need to explicitly turn off the radio, - * since STXON[CCA] -> TX_ACTIVE -> RX_ACTIVE */ - off(); + /* We need to explicitly turn off the radio, + * since STXON[CCA] -> TX_ACTIVE -> RX_ACTIVE */ + off(); } if(packetbuf_attr(PACKETBUF_ATTR_RADIO_TXPOWER) > 0) { @@ -510,9 +514,9 @@ cc2520_prepare(const void *payload, unsigned short payload_len) PRINTF("cc2520: sending %d bytes\n", payload_len); /*int i; - for(i = 0; i < payload_len;i++) - printf("%x",((uint8_t *) payload)[i]); - printf("\n");*/ + for(i = 0; i < payload_len;i++) + printf("%x",((uint8_t *) payload)[i]); + printf("\n");*/ RIMESTATS_ADD(lltx); /* Wait for any previous transmission to finish. */ @@ -641,15 +645,14 @@ cc2520_set_pan_addr(unsigned pan, tmp[1] = pan >> 8; CC2520_WRITE_RAM(&tmp, CC2520RAM_PANID, 2); - tmp[0] = addr & 0xff; tmp[1] = addr >> 8; CC2520_WRITE_RAM(&tmp, CC2520RAM_SHORTADDR, 2); if(ieee_addr != NULL) { int f; uint8_t tmp_addr[8]; - // LSB first, MSB last for 802.15.4 addresses in CC2520 - for (f = 0; f < 8; f++) { + /* LSB first, MSB last for 802.15.4 addresses in CC2520 */ + for(f = 0; f < 8; f++) { tmp_addr[7 - f] = ieee_addr[f]; } CC2520_WRITE_RAM(tmp_addr, CC2520RAM_IEEEADDR, 8); @@ -737,15 +740,13 @@ cc2520_read(void *buf, unsigned short bufsize) getrxdata(footer, FOOTER_LEN); if(footer[1] & FOOTER1_CRC_OK) { - cc2520_last_rssi = footer[0]; + cc2520_last_rssi = footer[0] - RSSI_OFFSET; cc2520_last_correlation = footer[1] & FOOTER1_CORRELATION; - packetbuf_set_attr(PACKETBUF_ATTR_RSSI, cc2520_last_rssi); packetbuf_set_attr(PACKETBUF_ATTR_LINK_QUALITY, cc2520_last_correlation); RIMESTATS_ADD(llrx); - } else { RIMESTATS_ADD(badcrc); len = FOOTER_LEN; @@ -809,6 +810,7 @@ cc2520_rssi(void) BUSYWAIT_UNTIL(status() & BV(CC2520_RSSI_VALID), RTIMER_SECOND / 100); rssi = (int)((signed char)getreg(CC2520_RSSI)); + rssi -= RSSI_OFFSET; if(radio_was_off) { cc2520_off(); @@ -818,12 +820,12 @@ cc2520_rssi(void) } /*---------------------------------------------------------------------------*/ /* -static int -detected_energy(void) -{ - return cc2520_rssi(); -} -*/ + static int + detected_energy(void) + { + return cc2520_rssi(); + } + */ /*---------------------------------------------------------------------------*/ int cc2520_cca_valid(void) From 8cc1870663e5d4a32ec58b1408f5e81f0fc96775 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Mon, 22 Aug 2016 12:36:12 +0200 Subject: [PATCH 315/345] Zoul: generic servo driver --- cpu/cc2538/dev/pwm.c | 18 +++- cpu/cc2538/dev/pwm.h | 4 +- examples/cc2538-common/test-pwm.c | 2 +- examples/zolertia/zoul/Makefile | 2 +- examples/zolertia/zoul/test-servo.c | 107 ++++++++++++++++++++++ platform/zoul/dev/servo.c | 132 +++++++++++++++++++++++++++ platform/zoul/dev/servo.h | 136 ++++++++++++++++++++++++++++ 7 files changed, 393 insertions(+), 8 deletions(-) create mode 100644 examples/zolertia/zoul/test-servo.c create mode 100644 platform/zoul/dev/servo.c create mode 100644 platform/zoul/dev/servo.h diff --git a/cpu/cc2538/dev/pwm.c b/cpu/cc2538/dev/pwm.c index d6b5b9286..73440013b 100644 --- a/cpu/cc2538/dev/pwm.c +++ b/cpu/cc2538/dev/pwm.c @@ -90,7 +90,8 @@ permit_pm1(void) } /*---------------------------------------------------------------------------*/ int8_t -pwm_enable(uint32_t freq, uint8_t duty, uint8_t timer, uint8_t ab) +pwm_enable(uint32_t freq, uint8_t duty, uint32_t count, uint8_t timer, + uint8_t ab) { uint8_t offset = 0; uint32_t interval_load, duty_count, copy; @@ -109,7 +110,7 @@ pwm_enable(uint32_t freq, uint8_t duty, uint8_t timer, uint8_t ab) return PWM_ERROR; } - PRINTF("PWM: F%08luHz: %u%% on GPT%u-%u\n", freq, duty, timer, ab); + PRINTF("PWM: F%08luHz: %u%%/%lu on GPT%u-%u\n", freq, duty, count, timer, ab); lpm_register_peripheral(permit_pm1); @@ -147,14 +148,21 @@ pwm_enable(uint32_t freq, uint8_t duty, uint8_t timer, uint8_t ab) /* If the duty cycle is zero, leave the GPTIMER configured as PWM to pass a next * configured check, but do nothing else */ - if(!duty) { + if((!duty) && (!count)) { REG(gpt_base + GPTIMER_CTL) |= (copy | gpt_dir); return PWM_SUCCESS; } - /* Get the peripheral clock and equivalent deassert count */ + /* Get the peripheral clock and equivalent deassert count, depending on the + * value given by the user, either use the count number of the duty cycle in + * percentage + */ interval_load = sys_ctrl_get_sys_clock() / freq; - duty_count = ((interval_load * duty) + 1) / 100; + if(duty) { + duty_count = ((interval_load * duty) + 1) / 100; + } else { + duty_count = count; + } PRINTF("PWM: sys %luHz: %lu %lu\n", sys_ctrl_get_sys_clock(), interval_load, duty_count); diff --git a/cpu/cc2538/dev/pwm.h b/cpu/cc2538/dev/pwm.h index 744fa4b6c..294ec3559 100644 --- a/cpu/cc2538/dev/pwm.h +++ b/cpu/cc2538/dev/pwm.h @@ -116,11 +116,13 @@ /** \brief Configures the general purpose timer in PWM mode * \param freq PWM frequency (in Hz) * \param duty PWM duty cycle (percentage in integers) + * \param count PWM duty cycle (count number) * \param timer General purpose timer to use [0-3] * \param ab Select which timer to use (Timer A or B) * \return \c PWM_SUCCESS if successful, else \c PWM_ERROR */ -int8_t pwm_enable(uint32_t freq, uint8_t duty, uint8_t timer, uint8_t ab); +int8_t pwm_enable(uint32_t freq, uint8_t duty, uint32_t count, uint8_t timer, + uint8_t ab); /*---------------------------------------------------------------------------*/ /** \brief Disables a previously PWM configured GPTn * \param timer General purpose timer to disable [0-3] diff --git a/examples/cc2538-common/test-pwm.c b/examples/cc2538-common/test-pwm.c index a1fa8c727..4aa5aede6 100644 --- a/examples/cc2538-common/test-pwm.c +++ b/examples/cc2538-common/test-pwm.c @@ -145,7 +145,7 @@ PROCESS_THREAD(cc2538_pwm_test, ev, data) PRINTF("\nStarting the test\n"); for(i = 0; i < MAX_PWM; i++) { - if(pwm_enable(pwm_num[i].freq, pwm_num[i].duty, + if(pwm_enable(pwm_num[i].freq, pwm_num[i].duty, 0, pwm_num[i].timer, pwm_num[i].ab) == PWM_SUCCESS) { pwm_en[i] = 1; PRINTF("%s (%u) configuration OK\n", gpt_name(pwm_num[i].timer), diff --git a/examples/zolertia/zoul/Makefile b/examples/zolertia/zoul/Makefile index d11279e44..66b530341 100644 --- a/examples/zolertia/zoul/Makefile +++ b/examples/zolertia/zoul/Makefile @@ -10,7 +10,7 @@ CONTIKI_PROJECT += test-zonik test-dht22.c CONTIKI_TARGET_SOURCEFILES += tsl2563.c sht25.c bmpx8x.c motion-sensor.c CONTIKI_TARGET_SOURCEFILES += adc-sensors.c weather-meter.c grove-gyro.c CONTIKI_TARGET_SOURCEFILES += rgb-bl-lcd.c pm10-sensor.c iaq.c zonik.c relay.c -CONTIKI_TARGET_SOURCEFILES += dht22.c +CONTIKI_TARGET_SOURCEFILES += dht22.c servo.c all: $(CONTIKI_PROJECT) diff --git a/examples/zolertia/zoul/test-servo.c b/examples/zolertia/zoul/test-servo.c new file mode 100644 index 000000000..9b65ae617 --- /dev/null +++ b/examples/zolertia/zoul/test-servo.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/** + * \addtogroup zoul-examples + * @{ + * + * \defgroup zoul-servo-test Test the EMAX ES08A II servo motor + * + * Demonstrates the use of the EMAX ES08A servo motor. This servo requires a + * +5V voltage, it can be powered from D+5.1 pin (of the ADC3 connector), but + * it requires either an external power supply other than the USB for programing + * or it can be powered by the USB 2.0 connector, which allows a higher current + * draw. + * + * This test uses the default servo values (freq 50Hz, traveling time 1.5-1.9ms) + * for 0-180º movement, tested with the EMAX ES08A. Depending on the servo used + * you might need to adjust these parameters in the servo.h header file. + * + * @{ + * + * \file + * A quick program for testing a servo motor + * \author + * Antonio Lignan + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dev/leds.h" +#include "dev/servo.h" +#include +#include +/*---------------------------------------------------------------------------*/ +#define DEBUG 1 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +static struct etimer et; +/*---------------------------------------------------------------------------*/ +PROCESS(servo_test_process, "Zolertia servo test process"); +AUTOSTART_PROCESSES(&servo_test_process); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(servo_test_process, ev, data) +{ + PROCESS_BEGIN(); + + static uint8_t deg = 0; + + PRINTF("\nStarting the test\n"); + + while(1) { + + servo_position(SERVO_CHANNEL_5, GPIO_A_NUM, 5, deg); + PRINTF("Current position --> %03uº\n", deg); + + etimer_set(&et, CLOCK_SECOND / 2); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + + /* Increase the position by 10º each iteration */ + deg += 10; + if(deg > SERVO_MAX_DEGREES) { + deg = 0; + servo_stop(SERVO_CHANNEL_5, GPIO_A_NUM, 5); + + /* Stop the servo and wait 2 seconds before resuming from start */ + etimer_set(&et, CLOCK_SECOND * 2); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + } + } + + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/platform/zoul/dev/servo.c b/platform/zoul/dev/servo.c new file mode 100644 index 000000000..2b08599a1 --- /dev/null +++ b/platform/zoul/dev/servo.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup zoul-servo + * @{ + * + * \file + * Driver for a generic Servo driver + * + * \author + * Antonio Lignan + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "dev/pwm.h" +#include "dev/gpio.h" +#include "servo.h" +/*---------------------------------------------------------------------------*/ +#define DEBUG 0 +#if DEBUG +#define PRINTF(...) printf(__VA_ARGS__) +#else +#define PRINTF(...) +#endif +/*---------------------------------------------------------------------------*/ +int +servo_position(uint16_t gptab, uint8_t port, uint8_t pin, uint16_t pos) +{ + uint8_t gpt_num; + uint8_t gpt_ab; + uint32_t count = 0; + + if((gptab < SERVO_CHANNEL_1) && (gptab > SERVO_CHANNEL_7)) { + PRINTF("Servo: invalid servo channel\n"); + return SERVO_ERROR; + } + + /* CC2538 has 4 ports (A-D) and up to 8 pins (0-7) */ + if((port > GPIO_D_NUM) || (pin > 7)) { + PRINTF("Servo: Invalid pin/port settings\n"); + return SERVO_ERROR; + } + + if(pos > SERVO_MAX_DEGREES) { + PRINTF("Servo: invalid position (max %u)\n", SERVO_MAX_DEGREES); + return SERVO_ERROR; + } + + count = (SERVO_MAX_VAL - SERVO_MIN_VAL) * pos; + count /= SERVO_MAX_DEGREES; + count += SERVO_MIN_VAL; + + gpt_num = (uint8_t)(gptab >> 8); + gpt_ab = (uint8_t)(gptab & 0x00FF); + + PRINTF("Servo: F%uHz GPTNUM %u GPTAB %u --> %uº (%lu)\n", SERVO_DEFAULT_FREQ, + gpt_num, gpt_ab, + pos, count); + /* Use count as argument instead of percentage */ + if(pwm_enable(SERVO_DEFAULT_FREQ, 0, count, gpt_num,gpt_ab) != PWM_SUCCESS) { + PRINTF("Servo: failed to configure the pwm channel\n"); + return SERVO_ERROR; + } + + /* Start the PWM as soon as possible, keep the pulses to lock the servo in the + * given position + */ + if(pwm_start(gpt_num, gpt_ab, port, pin) != PWM_SUCCESS) { + PRINTF("Servo: failed to initialize the pwm channel\n"); + return SERVO_ERROR; + } + + return SERVO_SUCCESS; +} +/*---------------------------------------------------------------------------*/ +int +servo_stop(uint16_t gptab, uint8_t port, uint8_t pin) +{ + uint8_t gpt_num; + uint8_t gpt_ab; + + if((gptab < SERVO_CHANNEL_1) && (gptab > SERVO_CHANNEL_7)) { + PRINTF("Servo: invalid servo channel\n"); + return SERVO_ERROR; + } + + /* CC2538 has 4 ports (A-D) and up to 8 pins (0-7) */ + if((port > GPIO_D_NUM) || (pin > 7)) { + PRINTF("Servo: Invalid pin/port settings\n"); + return SERVO_ERROR; + } + + gpt_num = (uint8_t)((gptab & 0xFF00) >> 8); + gpt_ab = (uint8_t)(gptab & 0x00FF); + + if(pwm_disable(gpt_num, gpt_ab, port, pin) != PWM_SUCCESS) { + PRINTF("Servo: unable to disable the pwm channel\n"); + return SERVO_ERROR; + } + + return SERVO_SUCCESS; +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/platform/zoul/dev/servo.h b/platform/zoul/dev/servo.h new file mode 100644 index 000000000..6ec2fae5f --- /dev/null +++ b/platform/zoul/dev/servo.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup zoul-sensors + * @{ + * + * \defgroup zoul-servo Generic servo driver + * + * Driver for a Generic Servo actuator + * + * @{ + * + * \file + * Header file for a Generic Servo driver + * + * \author + * Antonio Lignan + */ +/*---------------------------------------------------------------------------*/ +#ifndef SERVO_H_ +#define SERVO_H_ +#include +#include "dev/pwm.h" +/* -------------------------------------------------------------------------- */ +/** + * \name Servo default settings + * @{ + */ +/* -------------------------------------------------------------------------- */ +#ifndef SERVO_CONF_FREQ +#define SERVO_DEFAULT_FREQ 50 /**< 50 Hz */ +#else +#define SERVO_DEFAULT_FREQ SERVO_CONF_FREQ +#endif + +#ifndef SERVO_CONF_MAX_DEGREES +#define SERVO_MAX_DEGREES 180 +#else +#define SERVO_MAX_DEGREES SERVO_CONF_MAX_DEGREES +#endif + +#ifndef SERVO_CONF_MIN_VAL +#define SERVO_MIN_VAL 9600 /**> roughly equals to 3% duty cycle */ +#else +#define SERVO_MIN_VAL SERVO_CONF_MIN_VAL +#endif + +#ifndef SERVO_CONF_MAX_VAL +#define SERVO_MAX_VAL 38400 /**> roughly equals to 12% duty cycle */ +#else +#define SERVO_MAX_VAL SERVO_CONF_MAX_VAL +#endif +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name Servo general purpose timers mapping + * @{ + */ +#define SERVO_CHANNEL_1 0x001 /**< GPT0-B */ +#define SERVO_CHANNEL_2 0x100 /**< GPT1-A */ +#define SERVO_CHANNEL_3 0x101 /**< GPT1-B */ +#define SERVO_CHANNEL_4 0x200 /**< GPT2-A */ +#define SERVO_CHANNEL_5 0x201 /**< GPT2-B */ +#define SERVO_CHANNEL_6 0x300 /**< GPT3-A */ +#define SERVO_CHANNEL_7 0x301 /**< GPT3-B */ +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name Servo general constants + * @{ + */ +#define SERVO_SUCCESS 0 +#define SERVO_ERROR (-1) +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name Servo public funtions + * @{ + */ + +/** \brief Configures and positions a servo in a given position (by degrees) + * The servo will lock its position as long as it is not stopped + * \param gptab Servo channel (PWM GPT from 1-7) + * \param port Port number to use as PWM + * \param pin Pin number to use as PWM + * \param pos Position to map the servo to (0-360º, integer) + * \return \c SERVO_SUCCESS if successful, else \c SERVO_ERROR + */ +int servo_position(uint16_t gptab, uint8_t port, uint8_t pin, uint16_t pos); + +/** \brief Fully stop a servo and reconfigures back the pin/port as GPIO + * \param gptab Servo channel (PWM GPT from 1-7) + * \param port Port number to use as PWM + * \param pin Pin number to use as PWM + * \return \c SERVO_SUCCESS if successful, else \c SERVO_ERROR + */ +int servo_stop(uint16_t gptab, uint8_t port, uint8_t pin); +/** @} */ +/* -------------------------------------------------------------------------- */ +#endif +/* -------------------------------------------------------------------------- */ +/** + * @} + * @} + */ + From 26c4a81331b63ab350444ca095160fce4b1381e9 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Tue, 16 Aug 2016 15:33:21 +0200 Subject: [PATCH 316/345] Z1: cleaned up non-required libraries from builds and moved SENSORS declaration to its own file --- examples/zolertia/z1/Makefile | 7 ++++-- platform/z1/Makefile.common | 15 +++++------ platform/z1/Makefile.z1 | 2 +- platform/z1/contiki-z1-main.c | 9 +------ platform/z1/dev/z1-sensors.c | 47 +++++++++++++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 platform/z1/dev/z1-sensors.c diff --git a/examples/zolertia/z1/Makefile b/examples/zolertia/z1/Makefile index 78b18d9dc..d0ba2abc8 100644 --- a/examples/zolertia/z1/Makefile +++ b/examples/zolertia/z1/Makefile @@ -7,8 +7,11 @@ ZOLERTIA_Z1SP=0 CONTIKI_PROJECT = test-phidgets blink test-adxl345 test-tmp102 test-light-ziglet CONTIKI_PROJECT += test-battery test-relay-phidget test-tlc59116 test-sht25 -CONTIKI_SOURCEFILES += sht11.c reed-sensor.c -APPS=serial-shell + +CONTIKI_SOURCEFILES += reed-sensor.c sht25.c tlc59116.c light-ziglet.c \ + relay-phidget.c + +MODULES += dev/sht11 ifeq ($(ZOLERTIA_Z1SP),1) CONTIKI_PROJECT += test-potent diff --git a/platform/z1/Makefile.common b/platform/z1/Makefile.common index 642071bdc..6d6bc2e9e 100644 --- a/platform/z1/Makefile.common +++ b/platform/z1/Makefile.common @@ -12,14 +12,12 @@ endif CLEAN += symbols.c symbols.h -ARCH=msp430.c leds.c watchdog.c xmem.c \ - spi.c cc2420.c cc2420-arch.c cc2420-arch-sfd.c\ - node-id.c sensors.c button-sensor.c cfs-coffee.c \ - radio-sensor.c uart0.c uart0-putchar.c uip-ipchksum.c \ - slip.c slip_uart0.c \ - z1-phidgets.c sht11.c sht11-sensor.c light-sensor.c \ - battery-sensor.c sky-sensors.c tmp102.c temperature-sensor.c light-ziglet.c \ - relay-phidget.c tlc59116.c sht25.c +ARCH = msp430.c leds.c watchdog.c xmem.c i2cmaster.c \ + spi.c cc2420.c cc2420-arch.c cc2420-arch-sfd.c\ + node-id.c sensors.c button-sensor.c cfs-coffee.c \ + radio-sensor.c uart0.c uart0-putchar.c uip-ipchksum.c \ + slip.c slip_uart0.c z1-sensors.c adxl345.c temperature-sensor.c \ + z1-phidgets.c light-sensor.c battery-sensor.c sky-sensors.c tmp102.c CONTIKI_TARGET_DIRS = . dev apps net ifndef CONTIKI_TARGET_MAIN @@ -31,7 +29,6 @@ CFLAGS += -DMACID=$(nodemac) endif CONTIKI_TARGET_SOURCEFILES += $(ARCH) $(UIPDRIVERS) -CONTIKI_TARGET_SOURCEFILES += i2cmaster.c adxl345.c MCU=msp430f2617 diff --git a/platform/z1/Makefile.z1 b/platform/z1/Makefile.z1 index 015171af7..6ca3ab0e8 100644 --- a/platform/z1/Makefile.z1 +++ b/platform/z1/Makefile.z1 @@ -12,4 +12,4 @@ endif MODULES += core/net \ core/net/mac core/net/mac/contikimac \ core/net/llsec \ - dev/cc2420 dev/sht11 + dev/cc2420 diff --git a/platform/z1/contiki-z1-main.c b/platform/z1/contiki-z1-main.c index 92a7b5bd7..b95a9c231 100644 --- a/platform/z1/contiki-z1-main.c +++ b/platform/z1/contiki-z1-main.c @@ -43,7 +43,6 @@ #include "lib/random.h" #include "net/netstack.h" #include "net/mac/frame802154.h" -#include "dev/button-sensor.h" #include "dev/adxl345.h" #include "sys/clock.h" @@ -58,12 +57,6 @@ #include "cfs/cfs-coffee.h" #include "sys/autostart.h" -#include "dev/battery-sensor.h" -#include "dev/button-sensor.h" -#include "dev/sht11/sht11-sensor.h" - -SENSORS(&button_sensor); - extern unsigned char node_mac[8]; #if DCOSYNCH_CONF_ENABLED @@ -279,7 +272,7 @@ main(int argc, char **argv) set_rime_addr(); cc2420_init(); - accm_init(); + SENSORS_ACTIVATE(adxl345); { uint8_t longaddr[8]; diff --git a/platform/z1/dev/z1-sensors.c b/platform/z1/dev/z1-sensors.c new file mode 100644 index 000000000..db5b418b9 --- /dev/null +++ b/platform/z1/dev/z1-sensors.c @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \file + * Zolertia Z1 on-board sensors + * \author + * Antonio Lignan, Zolertia + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "lib/sensors.h" +#include "dev/button-sensor.h" +#include "dev/tmp102.h" +#include "dev/adxl345.h" +/*---------------------------------------------------------------------------*/ +/** \brief Exports global symbols for the sensor API */ +SENSORS(&button_sensor, &adxl345, &tmp102); +/*---------------------------------------------------------------------------*/ From 32385b29109592a7eb4c2b61b6b79f677a4bdb90 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Wed, 24 Aug 2016 16:34:02 +0200 Subject: [PATCH 317/345] Zoul: fix TMP102 value conversion --- platform/zoul/dev/tmp102.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/zoul/dev/tmp102.c b/platform/zoul/dev/tmp102.c index 2d3e897e2..4b2de59b0 100644 --- a/platform/zoul/dev/tmp102.c +++ b/platform/zoul/dev/tmp102.c @@ -58,7 +58,8 @@ tmp102_read(uint16_t *data) if(i2c_single_send(TMP102_ADDR, TMP102_TEMP) == I2C_MASTER_ERR_NONE) { /* Read two bytes only */ if(i2c_burst_receive(TMP102_ADDR, buf, 2) == I2C_MASTER_ERR_NONE) { - temp = (buf[0] << 8) + buf[1]; + /* 12-bit value, TMP102 SBOS397F Table 8-9 */ + temp = (buf[0] << 4) + (buf[1] >> 4); if(temp > 2047) { temp -= (1 << 12); } From 8d4888c495b3f560451c8ab5ceffc9e9ac974902 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Wed, 31 Aug 2016 11:29:58 +0200 Subject: [PATCH 318/345] Zoul: added driver to control an AC light dimmer with zero-crossing --- examples/zolertia/zoul/Makefile | 4 +- examples/zolertia/zoul/test-ac-dimmer.c | 102 +++++++++++++++ platform/zoul/dev/ac-dimmer.c | 159 ++++++++++++++++++++++++ platform/zoul/dev/ac-dimmer.h | 108 ++++++++++++++++ 4 files changed, 371 insertions(+), 2 deletions(-) create mode 100644 examples/zolertia/zoul/test-ac-dimmer.c create mode 100644 platform/zoul/dev/ac-dimmer.c create mode 100644 platform/zoul/dev/ac-dimmer.h diff --git a/examples/zolertia/zoul/Makefile b/examples/zolertia/zoul/Makefile index 66b530341..c5e99f92c 100644 --- a/examples/zolertia/zoul/Makefile +++ b/examples/zolertia/zoul/Makefile @@ -5,12 +5,12 @@ CONTIKI_PROJECT += test-bmp085-bmp180 test-motion test-rotation-sensor CONTIKI_PROJECT += test-grove-light-sensor test-grove-loudness-sensor CONTIKI_PROJECT += test-weather-meter test-grove-gyro test-lcd test-iaq CONTIKI_PROJECT += test-pm10-sensor test-vac-sensor test-aac-sensor -CONTIKI_PROJECT += test-zonik test-dht22.c +CONTIKI_PROJECT += test-zonik test-dht22.c test-ac-dimmer.c test-servo.c CONTIKI_TARGET_SOURCEFILES += tsl2563.c sht25.c bmpx8x.c motion-sensor.c CONTIKI_TARGET_SOURCEFILES += adc-sensors.c weather-meter.c grove-gyro.c CONTIKI_TARGET_SOURCEFILES += rgb-bl-lcd.c pm10-sensor.c iaq.c zonik.c relay.c -CONTIKI_TARGET_SOURCEFILES += dht22.c servo.c +CONTIKI_TARGET_SOURCEFILES += dht22.c servo.c ac-dimmer.c all: $(CONTIKI_PROJECT) diff --git a/examples/zolertia/zoul/test-ac-dimmer.c b/examples/zolertia/zoul/test-ac-dimmer.c new file mode 100644 index 000000000..521b023e3 --- /dev/null +++ b/examples/zolertia/zoul/test-ac-dimmer.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016, Zolertia + * 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. + * + */ +/** + * \addtogroup zoul-examples + * @{ + * + * \defgroup zoul-ac-dimmer-test Krida Electronics AC light dimmer test example + * + * Demonstrates the use of an AC dimmer with zero-crossing, connected to the + * ADC1 and ADC2 pins (PA5 and PA4 respectively), powered over the D+5.1 pin + * + * @{ + * + * \file + * A quick program to test an AC dimmer + * \author + * Antonio Lignan + */ +/*---------------------------------------------------------------------------*/ +#include +#include "contiki.h" +#include "dev/ac-dimmer.h" +#include "lib/sensors.h" +/*---------------------------------------------------------------------------*/ +PROCESS(remote_ac_dimmer_process, "AC light dimmer test"); +AUTOSTART_PROCESSES(&remote_ac_dimmer_process); +/*---------------------------------------------------------------------------*/ +static uint8_t dimming; +static struct etimer et; +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(remote_ac_dimmer_process, ev, data) +{ + PROCESS_BEGIN(); + + dimming = 0; + SENSORS_ACTIVATE(ac_dimmer); + + printf("AC dimmer: min %u%% max %u%%\n", DIMMER_DEFAULT_MIN_DIMM_VALUE, + DIMMER_DEFAULT_MAX_DIMM_VALUE); + + /* Set the lamp to 10% and wait a few seconds */ + ac_dimmer.value(DIMMER_DEFAULT_MIN_DIMM_VALUE); + etimer_set(&et, CLOCK_SECOND * 5); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + + /* Upon testing for duty cycles lower than 10% there was noise (probably from + * the triac), causing the driver to skip a beat, and from time to time made + * the test lamp blink. This is easily reproducible by setting the dimmer to + * 5% and using a logic analyzer on the SYNC and GATE pins. The noise was + * picked-up also by the non-connected test probes of the logic analyser. + * Nevertheless the difference between 10% and 2% bright-wise is almost + * negligible + */ + while(1) { + + dimming += DIMMER_DEFAULT_MIN_DIMM_VALUE; + if(dimming > DIMMER_DEFAULT_MAX_DIMM_VALUE) { + dimming = DIMMER_DEFAULT_MIN_DIMM_VALUE; + } + + ac_dimmer.value(dimming); + printf("AC dimmer: light is now --> %u\n", ac_dimmer.status(SENSORS_ACTIVE)); + + etimer_set(&et, CLOCK_SECOND); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/platform/zoul/dev/ac-dimmer.c b/platform/zoul/dev/ac-dimmer.c new file mode 100644 index 000000000..c6b073c76 --- /dev/null +++ b/platform/zoul/dev/ac-dimmer.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup zoul-ac-dimmer + * @{ + * + * \file + * Driver for the Krida Electronics AC light dimmer with zero-crossing, using + * a 50Hz frequency as reference (1/50Hz) ~20ms and 10ms half-cycle + */ +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "ac-dimmer.h" +#include "dev/gpio.h" +#include "lib/sensors.h" +#include "dev/ioc.h" +/*---------------------------------------------------------------------------*/ +#define DIMMER_SYNC_PORT_BASE GPIO_PORT_TO_BASE(DIMMER_SYNC_PORT) +#define DIMMER_SYNC_PIN_MASK GPIO_PIN_MASK(DIMMER_SYNC_PIN) +#define DIMMER_GATE_PORT_BASE GPIO_PORT_TO_BASE(DIMMER_GATE_PORT) +#define DIMMER_GATE_PIN_MASK GPIO_PIN_MASK(DIMMER_GATE_PIN) +/*---------------------------------------------------------------------------*/ +static uint8_t enabled; +static uint8_t dimming; +/*---------------------------------------------------------------------------*/ +PROCESS(ac_dimmer_int_process, "AC Dimmer zero-cross interrupt process"); +/*---------------------------------------------------------------------------*/ +PROCESS_THREAD(ac_dimmer_int_process, ev, data) +{ + PROCESS_EXITHANDLER(); + PROCESS_BEGIN(); + + int dimtime; + + while(1) { + PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL); + dimtime = (uint8_t)(100 - dimming); + dimtime *= 100; + + /* Off cycle */ + clock_delay_usec(dimtime); + GPIO_SET_PIN(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + /* Triac on propagation delay */ + clock_delay_usec(DIMMER_DEFAULT_GATE_PULSE_US); + GPIO_CLR_PIN(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + } + PROCESS_END(); +} +/*---------------------------------------------------------------------------*/ +static void +dimmer_zero_cross_int_handler(uint8_t port, uint8_t pin) +{ + process_poll(&ac_dimmer_int_process); +} +/*---------------------------------------------------------------------------*/ +static int +status(int type) +{ + switch(type) { + case SENSORS_ACTIVE: + return dimming; + case SENSORS_READY: + return enabled; + } + return DIMMER_ERROR; +} +/*---------------------------------------------------------------------------*/ +static int +value(int type) +{ + if(!enabled) { + return DIMMER_ERROR; + } + + dimming = (uint8_t)type; + return DIMMER_SUCCESS; +} +/*---------------------------------------------------------------------------*/ +static int +configure(int type, int value) +{ + if(type != SENSORS_ACTIVE) { + return DIMMER_ERROR; + } + + if(value) { + /* This is the Triac's gate pin */ + GPIO_SOFTWARE_CONTROL(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + GPIO_SET_OUTPUT(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + ioc_set_over(DIMMER_GATE_PORT, DIMMER_GATE_PIN, IOC_OVERRIDE_OE); + GPIO_CLR_PIN(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + + /* This is the zero-crossing pin and interrupt */ + GPIO_SOFTWARE_CONTROL(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); + GPIO_SET_INPUT(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); + + /* Pull-up resistor, detect rising edge */ + GPIO_DETECT_EDGE(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); + GPIO_TRIGGER_SINGLE_EDGE(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); + GPIO_DETECT_RISING(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); + gpio_register_callback(dimmer_zero_cross_int_handler, DIMMER_SYNC_PORT, + DIMMER_SYNC_PIN); + + /* Spin process until an interrupt is received */ + process_start(&ac_dimmer_int_process, NULL); + + /* Enable interrupts */ + GPIO_ENABLE_INTERRUPT(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); + // ioc_set_over(DIMMER_SYNC_PORT, DIMMER_SYNC_PIN, IOC_OVERRIDE_PUE); + nvic_interrupt_enable(DIMMER_INT_VECTOR); + + enabled = 1; + dimming = DIMMER_DEFAULT_START_VALUE; + return DIMMER_SUCCESS; + } + + /* Disable interrupt and pins */ + + GPIO_DISABLE_INTERRUPT(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + GPIO_SET_INPUT(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + GPIO_SET_OUTPUT(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); + process_exit(&ac_dimmer_int_process); + + enabled = 0; + dimming = 0; + return DIMMER_SUCCESS; +} +/*---------------------------------------------------------------------------*/ +SENSORS_SENSOR(ac_dimmer, AC_DIMMER_ACTUATOR, value, configure, status); +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/platform/zoul/dev/ac-dimmer.h b/platform/zoul/dev/ac-dimmer.h new file mode 100644 index 000000000..17d94b5b4 --- /dev/null +++ b/platform/zoul/dev/ac-dimmer.h @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2016, Zolertia - http://www.zolertia.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup zoul-sensors + * @{ + * + * \defgroup zoul-ac-dimmer AC light dimmer with zero-crossing driver + * + * Driver for an AC light dimmer with zero-crossing driver + * @{ + * + * \file + * Header file for an AC light dimmer with zero-crossing driver + */ +/*---------------------------------------------------------------------------*/ +#ifndef AC_DIMMER_H_ +#define AC_DIMMER_H_ +/* -------------------------------------------------------------------------- */ +/** + * \name AC dimmer default pins, ports and interrupt vector + * @{ + */ +#ifdef DIMMER_SYNC_CONF_PIN +#define DIMMER_SYNC_PIN DIMMER_SYNC_CONF_PIN +#else +#define DIMMER_SYNC_PIN 5 +#endif +#ifdef DIMMER_SYNC_CONF_PORT +#define DIMMER_SYNC_PORT DIMMER_SYNC_CONF_PORT +#else +#define DIMMER_SYNC_PORT GPIO_A_NUM +#endif +#ifdef DIMMER_GATE_CONF_PIN +#define DIMMER_GATE_PIN DIMMER_GATE_CONF_PIN +#else +#define DIMMER_GATE_PIN 4 +#endif +#ifdef DIMMER_GATE_CONF_PORT +#define DIMMER_GATE_PORT DIMMER_GATE_CONF_PORT +#else +#define DIMMER_GATE_PORT GPIO_A_NUM +#endif +#ifdef DIMMER_CONF_INT_VECTOR +#define DIMMER_INT_VECTOR DIMMER_CONF_INT_VECTOR +#else +#define DIMMER_INT_VECTOR NVIC_INT_GPIO_PORT_A +#endif +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name AC dimmer values + * @{ + */ +#define DIMMER_DEFAULT_START_VALUE 50 +#define DIMMER_DEFAULT_GATE_PULSE_US 15 +#define DIMMER_DEFAULT_MIN_DIMM_VALUE 10 +#define DIMMER_DEFAULT_MAX_DIMM_VALUE 80 +/** @} */ +/* -------------------------------------------------------------------------- */ +/** + * \name AC dimmer return types + * @{ + */ +#define DIMMER_ERROR (-1) +#define DIMMER_SUCCESS 0x00 +/** @} */ +/* -------------------------------------------------------------------------- */ +#define AC_DIMMER_ACTUATOR "AC light dimmer zero-cross" +/* -------------------------------------------------------------------------- */ +extern const struct sensors_sensor ac_dimmer; +/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ +#endif /* RELAY_H_ */ +/* -------------------------------------------------------------------------- */ +/** + * @} + * @} + */ From 5e400dd43b5a2c6c2fd7f9e2ca56bf0d5e8ceffc Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Wed, 31 Aug 2016 15:36:31 +0200 Subject: [PATCH 319/345] Zoul: fixed ac-dimmer interrupt disable pin/port and check interrupt source --- platform/zoul/dev/ac-dimmer.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/zoul/dev/ac-dimmer.c b/platform/zoul/dev/ac-dimmer.c index c6b073c76..47241ce33 100644 --- a/platform/zoul/dev/ac-dimmer.c +++ b/platform/zoul/dev/ac-dimmer.c @@ -78,7 +78,9 @@ PROCESS_THREAD(ac_dimmer_int_process, ev, data) static void dimmer_zero_cross_int_handler(uint8_t port, uint8_t pin) { - process_poll(&ac_dimmer_int_process); + if((port == DIMMER_SYNC_PORT) && (pin == DIMMER_SYNC_PIN)) { + process_poll(&ac_dimmer_int_process); + } } /*---------------------------------------------------------------------------*/ static int @@ -144,7 +146,7 @@ configure(int type, int value) /* Disable interrupt and pins */ - GPIO_DISABLE_INTERRUPT(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); + GPIO_DISABLE_INTERRUPT(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); GPIO_SET_INPUT(DIMMER_GATE_PORT_BASE, DIMMER_GATE_PIN_MASK); GPIO_SET_OUTPUT(DIMMER_SYNC_PORT_BASE, DIMMER_SYNC_PIN_MASK); process_exit(&ac_dimmer_int_process); From 6dd17f5eecf2cba9e4c1413e45ede6c5313bfa45 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Thu, 1 Sep 2016 10:25:07 +0200 Subject: [PATCH 320/345] MSP430/F2xxx: fix ubr msb byte being hardcoded to zero --- cpu/msp430/f2xxx/uart0.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpu/msp430/f2xxx/uart0.c b/cpu/msp430/f2xxx/uart0.c index 79c75f877..cbba2e7b9 100644 --- a/cpu/msp430/f2xxx/uart0.c +++ b/cpu/msp430/f2xxx/uart0.c @@ -146,8 +146,8 @@ uart0_init(unsigned long ubr) UCA0CTL1 |= UCSWRST; /* Hold peripheral in reset state */ UCA0CTL1 |= UCSSEL_2; /* CLK = SMCLK */ - UCA0BR0 = ubr; /* 8MHz/115200 = 69 = 0x45 */ - UCA0BR1 = 0x00; + UCA0BR0 = ((uint8_t *)&ubr)[0]; /* 8MHz/115200 = 69 = 0x45 */ + UCA0BR1 = ((uint8_t *)&ubr)[1]; UCA0MCTL = UCBRS_3; /* Modulation UCBRSx = 3 */ P3DIR &= ~0x20; /* P3.5 = USCI_A0 RXD as input */ From 89c507f5094a1ba066de5a9c68a49bd9649d720b Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Thu, 1 Sep 2016 15:03:00 +0200 Subject: [PATCH 321/345] Zoul: created RE-Mote rev.A specific profile --- examples/zolertia/zoul/test-power-mgmt.c | 4 ++-- platform/zoul/Makefile.zoul | 12 +++++++++--- platform/zoul/{remote => dev}/antenna-sw.c | 0 platform/zoul/{remote => dev}/antenna-sw.h | 0 platform/zoul/{remote => dev}/rtcc-config.h | 0 platform/zoul/{remote => dev}/rtcc.c | 0 platform/zoul/{remote => dev}/rtcc.h | 0 .../Makefile.remote-reva} | 0 platform/zoul/{remote => remote-reva}/README.md | 2 +- platform/zoul/{remote => remote-reva}/board.c | 4 ++-- platform/zoul/{remote => remote-reva}/board.h | 8 ++++---- platform/zoul/{remote => remote-reva}/power-mgmt.c | 0 platform/zoul/{remote => remote-reva}/power-mgmt.h | 0 13 files changed, 18 insertions(+), 12 deletions(-) rename platform/zoul/{remote => dev}/antenna-sw.c (100%) rename platform/zoul/{remote => dev}/antenna-sw.h (100%) rename platform/zoul/{remote => dev}/rtcc-config.h (100%) rename platform/zoul/{remote => dev}/rtcc.c (100%) rename platform/zoul/{remote => dev}/rtcc.h (100%) rename platform/zoul/{remote/Makefile.remote => remote-reva/Makefile.remote-reva} (100%) rename platform/zoul/{remote => remote-reva}/README.md (98%) rename platform/zoul/{remote => remote-reva}/board.c (95%) rename platform/zoul/{remote => remote-reva}/board.h (98%) rename platform/zoul/{remote => remote-reva}/power-mgmt.c (100%) rename platform/zoul/{remote => remote-reva}/power-mgmt.h (100%) diff --git a/examples/zolertia/zoul/test-power-mgmt.c b/examples/zolertia/zoul/test-power-mgmt.c index 1b0690bdb..e5c2c65a0 100644 --- a/examples/zolertia/zoul/test-power-mgmt.c +++ b/examples/zolertia/zoul/test-power-mgmt.c @@ -32,8 +32,8 @@ * \addtogroup remote-power-management-test * @{ * - * Test the RE-Mote's power management features, shutdown mode and battery - * management + * Test the RE-Mote's (revision A) power management features, shutdown mode and + * battery management * * @{ * diff --git a/platform/zoul/Makefile.zoul b/platform/zoul/Makefile.zoul index 1adb5eea7..d74cb8b11 100644 --- a/platform/zoul/Makefile.zoul +++ b/platform/zoul/Makefile.zoul @@ -4,9 +4,15 @@ ifndef CONTIKI $(error CONTIKI not defined! You must specify where CONTIKI resides!) endif -### If no board is specified the default option is the RE-Mote +### If no board is specified the default option is the RE-Mote revision B ifeq ($(BOARD),) - BOARD=remote + BOARD = remote-revb +endif + +### As previously the RE-Mote revision A was plainly defined as remote, keep for +### backward compatibility +ifeq ($(BOARD), remote) + override BOARD = remote-reva endif PYTHON = python @@ -45,7 +51,7 @@ MODULES += core/net core/net/mac \ BSL = $(CONTIKI)/tools/cc2538-bsl/cc2538-bsl.py -### USe the specific Zoul subplatform to query for connected devices +### Use the specific Zoul subplatform to query for connected devices ifdef MOTELIST_ZOLERTIA MOTELIST_FLAGS += -b $(MOTELIST_ZOLERTIA) endif diff --git a/platform/zoul/remote/antenna-sw.c b/platform/zoul/dev/antenna-sw.c similarity index 100% rename from platform/zoul/remote/antenna-sw.c rename to platform/zoul/dev/antenna-sw.c diff --git a/platform/zoul/remote/antenna-sw.h b/platform/zoul/dev/antenna-sw.h similarity index 100% rename from platform/zoul/remote/antenna-sw.h rename to platform/zoul/dev/antenna-sw.h diff --git a/platform/zoul/remote/rtcc-config.h b/platform/zoul/dev/rtcc-config.h similarity index 100% rename from platform/zoul/remote/rtcc-config.h rename to platform/zoul/dev/rtcc-config.h diff --git a/platform/zoul/remote/rtcc.c b/platform/zoul/dev/rtcc.c similarity index 100% rename from platform/zoul/remote/rtcc.c rename to platform/zoul/dev/rtcc.c diff --git a/platform/zoul/remote/rtcc.h b/platform/zoul/dev/rtcc.h similarity index 100% rename from platform/zoul/remote/rtcc.h rename to platform/zoul/dev/rtcc.h diff --git a/platform/zoul/remote/Makefile.remote b/platform/zoul/remote-reva/Makefile.remote-reva similarity index 100% rename from platform/zoul/remote/Makefile.remote rename to platform/zoul/remote-reva/Makefile.remote-reva diff --git a/platform/zoul/remote/README.md b/platform/zoul/remote-reva/README.md similarity index 98% rename from platform/zoul/remote/README.md rename to platform/zoul/remote-reva/README.md index c1f57a1fd..65bba0ef9 100644 --- a/platform/zoul/remote/README.md +++ b/platform/zoul/remote-reva/README.md @@ -1,4 +1,4 @@ -Zolertia RE-Mote platform +Zolertia RE-Mote platform (revision A) ============================================ ![Zolertia RE-Mote development platform][remote-front] diff --git a/platform/zoul/remote/board.c b/platform/zoul/remote-reva/board.c similarity index 95% rename from platform/zoul/remote/board.c rename to platform/zoul/remote-reva/board.c index ad98f2fd0..ddf85ed86 100644 --- a/platform/zoul/remote/board.c +++ b/platform/zoul/remote-reva/board.c @@ -29,11 +29,11 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup remote + * \addtogroup remote-reva * @{ * * \file - * Board-initialisation for the Zolertia's RE-Mote platform + * Board-initialisation for the Zolertia's RE-Mote revision A platform * */ /*---------------------------------------------------------------------------*/ diff --git a/platform/zoul/remote/board.h b/platform/zoul/remote-reva/board.h similarity index 98% rename from platform/zoul/remote/board.h rename to platform/zoul/remote-reva/board.h index 2887f452a..338d6c8e1 100644 --- a/platform/zoul/remote/board.h +++ b/platform/zoul/remote-reva/board.h @@ -33,7 +33,7 @@ * \addtogroup zoul-platforms * @{ * - * \defgroup remote RE-Mote platform + * \defgroup remote-reva RE-Mote platform revision A * * The RE-Mote was designed jointly with universities and industry partners in * RERUM European project, to ease the development of private and secure @@ -42,7 +42,7 @@ * Shutdown mode to reduce its power consumption down to 300nA. * * This file provides connectivity information on LEDs, Buttons, UART and - * other RE-Mote peripherals + * other RE-Mote revision A peripherals * * This file can be used as the basis to configure other platforms using the * cc2538 SoC. @@ -50,7 +50,7 @@ * * \file * Header file with definitions related to the I/O connections on the Zolertia's - * RE-Mote platform, cc2538-based + * RE-Mote platform (revision A), cc2538-based * * \note Do not include this file directly. It gets included by contiki-conf * after all relevant directives have been set. @@ -485,7 +485,7 @@ * \name Device string used on startup * @{ */ -#define BOARD_STRING "Zolertia RE-Mote platform" +#define BOARD_STRING "Zolertia RE-Mote revision A platform" /** @} */ #endif /* BOARD_H_ */ diff --git a/platform/zoul/remote/power-mgmt.c b/platform/zoul/remote-reva/power-mgmt.c similarity index 100% rename from platform/zoul/remote/power-mgmt.c rename to platform/zoul/remote-reva/power-mgmt.c diff --git a/platform/zoul/remote/power-mgmt.h b/platform/zoul/remote-reva/power-mgmt.h similarity index 100% rename from platform/zoul/remote/power-mgmt.h rename to platform/zoul/remote-reva/power-mgmt.h From 3227360b923c3fec45b0322a0b667aa65d6a8cef Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Thu, 1 Sep 2016 15:16:31 +0200 Subject: [PATCH 322/345] Zoul: Moved specific rev.A examples --- examples/zolertia/zoul/rev-a/Makefile | 9 ++++ examples/zolertia/zoul/rev-a/project-conf.h | 46 +++++++++++++++++++ .../zoul/{ => rev-a}/test-power-mgmt.c | 0 3 files changed, 55 insertions(+) create mode 100644 examples/zolertia/zoul/rev-a/Makefile create mode 100644 examples/zolertia/zoul/rev-a/project-conf.h rename examples/zolertia/zoul/{ => rev-a}/test-power-mgmt.c (100%) diff --git a/examples/zolertia/zoul/rev-a/Makefile b/examples/zolertia/zoul/rev-a/Makefile new file mode 100644 index 000000000..bf3c06f74 --- /dev/null +++ b/examples/zolertia/zoul/rev-a/Makefile @@ -0,0 +1,9 @@ +DEFINES+=PROJECT_CONF_H=\"project-conf.h\" + +CONTIKI_PROJECT = test-power-mgmt + +all: $(CONTIKI_PROJECT) + +CONTIKI = ../../../.. +CONTIKI_WITH_RIME = 1 +include $(CONTIKI)/Makefile.include diff --git a/examples/zolertia/zoul/rev-a/project-conf.h b/examples/zolertia/zoul/rev-a/project-conf.h new file mode 100644 index 000000000..c5a153b5c --- /dev/null +++ b/examples/zolertia/zoul/rev-a/project-conf.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016, Zolertia + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/** + * \addtogroup remote-examples + * @{ + * + * \file + * Project specific configuration defines for the basic RE-Mote examples + */ +#ifndef PROJECT_CONF_H_ +#define PROJECT_CONF_H_ + +#define BROADCAST_CHANNEL 129 +#define NETSTACK_CONF_RDC nullrdc_driver + +#endif /* PROJECT_CONF_H_ */ + +/** @} */ diff --git a/examples/zolertia/zoul/test-power-mgmt.c b/examples/zolertia/zoul/rev-a/test-power-mgmt.c similarity index 100% rename from examples/zolertia/zoul/test-power-mgmt.c rename to examples/zolertia/zoul/rev-a/test-power-mgmt.c From e25a62997d8e67c0c256426c94589a83fd29044e Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Thu, 1 Sep 2016 16:08:01 +0200 Subject: [PATCH 323/345] Zoul: cleaned headers, doxygen tags and uncrustified --- .../zolertia/zoul/at-test/at-master-test.c | 1 - examples/zolertia/zoul/at-test/project-conf.h | 9 ++-- .../zolertia/zoul/cc1200-demo/cc1200-demo.c | 3 +- .../zolertia/zoul/cc1200-demo/project-conf.h | 1 + examples/zolertia/zoul/project-conf.h | 6 ++- examples/zolertia/zoul/rev-a/Makefile.target | 1 + .../zolertia/zoul/rev-a/test-power-mgmt.c | 50 +++++++++---------- examples/zolertia/zoul/rtcc/Makefile.target | 1 + examples/zolertia/zoul/rtcc/project-conf.h | 20 ++++++-- examples/zolertia/zoul/rtcc/test-rtcc.c | 12 ++--- examples/zolertia/zoul/test-aac-sensor.c | 15 +++--- examples/zolertia/zoul/test-ac-dimmer.c | 3 +- examples/zolertia/zoul/test-bmp085-bmp180.c | 2 +- examples/zolertia/zoul/test-grove-gyro.c | 8 +-- examples/zolertia/zoul/test-iaq.c | 28 +++++------ examples/zolertia/zoul/test-motion.c | 3 +- examples/zolertia/zoul/test-pm10-sensor.c | 4 +- examples/zolertia/zoul/test-relay.c | 1 + examples/zolertia/zoul/test-rotation-sensor.c | 2 +- examples/zolertia/zoul/test-servo.c | 1 + examples/zolertia/zoul/test-vac-sensor.c | 14 ++++-- examples/zolertia/zoul/test-weather-meter.c | 4 +- examples/zolertia/zoul/test-zonik.c | 21 ++++---- examples/zolertia/zoul/zoul-demo.c | 3 ++ 24 files changed, 122 insertions(+), 91 deletions(-) create mode 100644 examples/zolertia/zoul/rev-a/Makefile.target create mode 100644 examples/zolertia/zoul/rtcc/Makefile.target diff --git a/examples/zolertia/zoul/at-test/at-master-test.c b/examples/zolertia/zoul/at-test/at-master-test.c index 520c28bdb..1b7d14d53 100644 --- a/examples/zolertia/zoul/at-test/at-master-test.c +++ b/examples/zolertia/zoul/at-test/at-master-test.c @@ -481,7 +481,6 @@ PROCESS_THREAD(at_test_process, ev, data) } /*---------------------------------------------------------------------------*/ /** - * @} * @} * @} */ diff --git a/examples/zolertia/zoul/at-test/project-conf.h b/examples/zolertia/zoul/at-test/project-conf.h index 4a29f1d59..ef1581773 100644 --- a/examples/zolertia/zoul/at-test/project-conf.h +++ b/examples/zolertia/zoul/at-test/project-conf.h @@ -29,7 +29,7 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup remote-examples + * \addtogroup zoul-examples * @{ * * \defgroup zoul-AT-master-test @@ -63,5 +63,8 @@ #define NETSTACK_CONF_RDC nullrdc_driver #endif /* PROJECT_CONF_H_ */ - -/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/examples/zolertia/zoul/cc1200-demo/cc1200-demo.c b/examples/zolertia/zoul/cc1200-demo/cc1200-demo.c index 1fe69f58c..4eb4d27b1 100644 --- a/examples/zolertia/zoul/cc1200-demo/cc1200-demo.c +++ b/examples/zolertia/zoul/cc1200-demo/cc1200-demo.c @@ -35,11 +35,12 @@ * @{ * * \file - * Test file for the CC1200 demo + * Test file for the CC1200 demo * * \author * Antonio Lignan */ +/*---------------------------------------------------------------------------*/ #include "contiki.h" #include "cpu.h" #include "sys/etimer.h" diff --git a/examples/zolertia/zoul/cc1200-demo/project-conf.h b/examples/zolertia/zoul/cc1200-demo/project-conf.h index 9367973ff..add005170 100644 --- a/examples/zolertia/zoul/cc1200-demo/project-conf.h +++ b/examples/zolertia/zoul/cc1200-demo/project-conf.h @@ -43,6 +43,7 @@ * \author * Antonio Lignan */ +/*---------------------------------------------------------------------------*/ #ifndef PROJECT_CONF_H_ #define PROJECT_CONF_H_ diff --git a/examples/zolertia/zoul/project-conf.h b/examples/zolertia/zoul/project-conf.h index 230724b2d..34f3116f6 100644 --- a/examples/zolertia/zoul/project-conf.h +++ b/examples/zolertia/zoul/project-conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2016, Zolertia - http://www.zolertia.com * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,13 +28,15 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*---------------------------------------------------------------------------*/ /** - * \addtogroup remote-examples + * \addtogroup zoul-examples * @{ * * \file * Project specific configuration defines for the basic RE-Mote examples */ +/*---------------------------------------------------------------------------*/ #ifndef PROJECT_CONF_H_ #define PROJECT_CONF_H_ diff --git a/examples/zolertia/zoul/rev-a/Makefile.target b/examples/zolertia/zoul/rev-a/Makefile.target new file mode 100644 index 000000000..75430a6e4 --- /dev/null +++ b/examples/zolertia/zoul/rev-a/Makefile.target @@ -0,0 +1 @@ +TARGET = zoul diff --git a/examples/zolertia/zoul/rev-a/test-power-mgmt.c b/examples/zolertia/zoul/rev-a/test-power-mgmt.c index e5c2c65a0..a29668b22 100644 --- a/examples/zolertia/zoul/rev-a/test-power-mgmt.c +++ b/examples/zolertia/zoul/rev-a/test-power-mgmt.c @@ -80,18 +80,18 @@ static char * print_pm(uint8_t state) { switch(state) { - case PM_SYSOFF_ON: - return "Battery on"; - case PM_SYSOFF_OFF: - return "Battery off"; - case PM_TIMER_ENABLED: - return "Nano Timer enabled"; - case PM_TIMER_DISABLED: - return "Nano Timer disabled"; - case PM_AWAITING_RTC_EVENT: - return "Awaiting RTC event"; - default: - return "UNKNOWN"; + case PM_SYSOFF_ON: + return "Battery on"; + case PM_SYSOFF_OFF: + return "Battery off"; + case PM_TIMER_ENABLED: + return "Nano Timer enabled"; + case PM_TIMER_DISABLED: + return "Nano Timer disabled"; + case PM_AWAITING_RTC_EVENT: + return "Awaiting RTC event"; + default: + return "UNKNOWN"; } } /*---------------------------------------------------------------------------*/ @@ -107,24 +107,24 @@ get_status(uint8_t mask, uint8_t *val) } if(!mask) { - printf("STATUS %u\n", status); + printf("STATUS %u\n", status); *val = PM_IDLE; return PM_SUCCESS; } /* Read back ony the requested status bit */ switch(mask) { - case PM_SYSOFF_ON_MASK: - print_msg = (status & mask) ? PM_SYSOFF_ON : PM_SYSOFF_OFF; - break; - case PM_TIMER_ENABLED_MASK: - print_msg = (status & mask) ? PM_TIMER_ENABLED : PM_TIMER_DISABLED; - break; - case PM_AWAITING_RTC_EVENT_MASK: - print_msg = (status & mask) ? PM_AWAITING_RTC_EVENT : PM_AWAITING_RTC_DIS; - break; - default: - return PM_ERROR; + case PM_SYSOFF_ON_MASK: + print_msg = (status & mask) ? PM_SYSOFF_ON : PM_SYSOFF_OFF; + break; + case PM_TIMER_ENABLED_MASK: + print_msg = (status & mask) ? PM_TIMER_ENABLED : PM_TIMER_DISABLED; + break; + case PM_AWAITING_RTC_EVENT_MASK: + print_msg = (status & mask) ? PM_AWAITING_RTC_EVENT : PM_AWAITING_RTC_DIS; + break; + default: + return PM_ERROR; } printf("Status -> %s\n", print_pm(print_msg)); @@ -194,7 +194,7 @@ PROCESS_THREAD(test_remote_pm, ev, data) broadcast_send(&bc); /* And wait a few seconds before going to sleep */ - while(1){ + while(1) { etimer_set(&et, CLOCK_SECOND); PROCESS_WAIT_EVENT(); diff --git a/examples/zolertia/zoul/rtcc/Makefile.target b/examples/zolertia/zoul/rtcc/Makefile.target new file mode 100644 index 000000000..75430a6e4 --- /dev/null +++ b/examples/zolertia/zoul/rtcc/Makefile.target @@ -0,0 +1 @@ +TARGET = zoul diff --git a/examples/zolertia/zoul/rtcc/project-conf.h b/examples/zolertia/zoul/rtcc/project-conf.h index 9ff57c953..66bf67bc0 100644 --- a/examples/zolertia/zoul/rtcc/project-conf.h +++ b/examples/zolertia/zoul/rtcc/project-conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/ + * Copyright (c) 2015, Zolertia * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,18 +28,28 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ +/*---------------------------------------------------------------------------*/ /** - * \addtogroup remote-examples + * \addtogroup zoul-examples + * @{ + * + * \defgroup remote-rtcc-test RE-Mote on-board RTCC test application + * + * Test the Real-Time-Clock-Calendar built in the RE-Motes revision A and B * @{ * * \file - * Project specific configuration defines for the basic RE-Mote examples + * Project specific configuration defines for the RTCC RE-Mote example */ +/*---------------------------------------------------------------------------*/ #ifndef PROJECT_CONF_H_ #define PROJECT_CONF_H_ #define NETSTACK_CONF_RDC nullrdc_driver #endif /* PROJECT_CONF_H_ */ - -/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ diff --git a/examples/zolertia/zoul/rtcc/test-rtcc.c b/examples/zolertia/zoul/rtcc/test-rtcc.c index cb14d5fa5..9b8895c09 100644 --- a/examples/zolertia/zoul/rtcc/test-rtcc.c +++ b/examples/zolertia/zoul/rtcc/test-rtcc.c @@ -1,5 +1,6 @@ /* - * Copyright (c) 2015, Zolertia - http://www.zolertia.com + * Copyright (c) 2015, Zolertia + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -29,10 +30,8 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup remote-examples + * \addtogroup remote-rtcc-test * @{ - - * \defgroup remote-rtcc-test RE-Mote on-board RTCC test application * * Example project to show the on-board RTCC configuration and operation * Retrieves the current time and date from the system, then sets an alarm to @@ -42,10 +41,8 @@ * @{ * * \file - * RE-Mote on-board RTCC test application - * + * RE-Mote on-board RTCC test application * \author - * * Antonio Lignan * Aitor Mejias * Toni Lozano @@ -178,4 +175,3 @@ PROCESS_THREAD(test_remote_rtcc_process, ev, data) * @} * @} */ - diff --git a/examples/zolertia/zoul/test-aac-sensor.c b/examples/zolertia/zoul/test-aac-sensor.c index bbda23955..d6d8bda01 100644 --- a/examples/zolertia/zoul/test-aac-sensor.c +++ b/examples/zolertia/zoul/test-aac-sensor.c @@ -28,20 +28,22 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* +/** * \addtogroup zoul-examples * @{ + * * \defgroup zoul-aac-sensor-test Test AAC sensor * * Demonstrates the operation of the current AAC analog sensor * @{ * * \file - * Example demonstrating the Zoul module on the RE-Mote & AAC sensor 0-5V 50Amps AC + * Example demonstrating the RE-Mote & AAC sensor 0-5V 50Amps AC * * \author * Javier Sánchez */ +/*---------------------------------------------------------------------------*/ #include "contiki.h" #include "sys/etimer.h" #include "sys/rtimer.h" @@ -64,7 +66,7 @@ AUTOSTART_PROCESSES(&test_aac_sensor_process); /*---------------------------------------------------------------------------*/ PROCESS_THREAD(test_aac_sensor_process, ev, data) { - + PROCESS_BEGIN(); counter = 0; @@ -86,12 +88,12 @@ PROCESS_THREAD(test_aac_sensor_process, ev, data) printf("-----------------------------------------\n" "Counter = 0x%08x\n", counter); - + printf("AC Amps = %d mA\n", adc_sensors.value(ANALOG_AAC_SENSOR)); - + etimer_set(&et, LOOP_INTERVAL); counter++; - } + } } PROCESS_END(); } @@ -100,3 +102,4 @@ PROCESS_THREAD(test_aac_sensor_process, ev, data) * @} * @} */ + diff --git a/examples/zolertia/zoul/test-ac-dimmer.c b/examples/zolertia/zoul/test-ac-dimmer.c index 521b023e3..6fd28faa7 100644 --- a/examples/zolertia/zoul/test-ac-dimmer.c +++ b/examples/zolertia/zoul/test-ac-dimmer.c @@ -70,7 +70,7 @@ PROCESS_THREAD(remote_ac_dimmer_process, ev, data) /* Set the lamp to 10% and wait a few seconds */ ac_dimmer.value(DIMMER_DEFAULT_MIN_DIMM_VALUE); etimer_set(&et, CLOCK_SECOND * 5); - PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); + PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); /* Upon testing for duty cycles lower than 10% there was noise (probably from * the triac), causing the driver to skip a beat, and from time to time made @@ -100,3 +100,4 @@ PROCESS_THREAD(remote_ac_dimmer_process, ev, data) * @} * @} */ + diff --git a/examples/zolertia/zoul/test-bmp085-bmp180.c b/examples/zolertia/zoul/test-bmp085-bmp180.c index 73cf0168f..81d54b31e 100644 --- a/examples/zolertia/zoul/test-bmp085-bmp180.c +++ b/examples/zolertia/zoul/test-bmp085-bmp180.c @@ -38,7 +38,7 @@ * @{ * * \file - * Test file for the BMP085/BMP180 digital pressure and temperature sensor + * Test file for the BMP085/BMP180 digital pressure and temp sensor * * \author * Antonio Lignan diff --git a/examples/zolertia/zoul/test-grove-gyro.c b/examples/zolertia/zoul/test-grove-gyro.c index 24baa360f..978aa69f8 100644 --- a/examples/zolertia/zoul/test-grove-gyro.c +++ b/examples/zolertia/zoul/test-grove-gyro.c @@ -85,7 +85,7 @@ PROCESS_THREAD(remote_grove_gyro_process, ev, data) * the 3 gyroscope axis use GROVE_GYRO_SENSOR. Alternatively the value * GROVE_GYRO_ALL could also be used to power everything at once */ - grove_gyro.configure(GROVE_GYRO_POWER_ON, GROVE_GYRO_SENSOR); + grove_gyro.configure(GROVE_GYRO_POWER_ON, GROVE_GYRO_SENSOR); /* Read back the configured sensor I2C address to check if the sensor is * working OK, this is the only case in which the value() returns a value @@ -128,9 +128,9 @@ PROCESS_THREAD(remote_grove_gyro_process, ev, data) /* This sensor has a different operation from others using Contiki's sensor * API, to make data acquisition we write the readings directly to the - * extern data structure, allowing to write more than 1 value at the same - * operation, and also allowing upon a data interrupt event to immediatly - * access the data. The return value of the value() call is then the status + * extern data structure, allowing to write more than 1 value at the same + * operation, and also allowing upon a data interrupt event to immediatly + * access the data. The return value of the value() call is then the status * result of the read operation */ if(grove_gyro.value(GROVE_GYRO_XYZ) == GROVE_GYRO_SUCCESS) { diff --git a/examples/zolertia/zoul/test-iaq.c b/examples/zolertia/zoul/test-iaq.c index 147ecd8a7..9940448ce 100644 --- a/examples/zolertia/zoul/test-iaq.c +++ b/examples/zolertia/zoul/test-iaq.c @@ -29,24 +29,25 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup remote-examples + * \addtogroup zoul-examples * @{ - * \defgroup remote-iaq-test - * + * + * \defgroup zoul-iaq-test + * * RE-Mote external IAQ test application * Example of iAQ-Core implementation and simple operation reading the value - * of CO2, TVOC sensor and Status. The test checks for a each 5 minutes in + * of CO2, TVOC sensor and Status. The test checks for a each 5 minutes in * order to get the first true measurement as datasheet recomendation - * (standard result of 0x82 is obtained in first time). - * Then, once initialized, periodically each 5 seconds reads - * the values of the IAQ sensor and shows in the screen, toggling the LED + * (standard result of 0x82 is obtained in first time). + * Then, once initialized, periodically each 5 seconds reads + * the values of the IAQ sensor and shows in the screen, toggling the LED * red if CO2 was not initialized and LED green if the reading was succeed. * * @{ * \file - * RE-Mote implementation of external IAQ-CORE-C test application + * RE-Mote implementation of external IAQ-CORE-C test application * \author - * Aitor Mejias + * Aitor Mejias */ /*---------------------------------------------------------------------------*/ #include "contiki.h" @@ -87,17 +88,16 @@ PROCESS_THREAD(test_remote_iaq_process, ev, data) count_delay += LOOP_PERIOD; leds_toggle(LEDS_RED); printf("Test-IAQ: Initializing Time-elapsed: %u seconds of aprox. %lu sec.\n", - count_delay, IAQ_INIT_WAIT); + count_delay, IAQ_INIT_WAIT); } else if(status == IAQ_ACTIVE) { leds_off(LEDS_RED); leds_toggle(LEDS_GREEN); /* Get data from sensor: VOC, CO2 and internal status */ - printf("CO2 current value is: %d ppm\n", iaq.value(IAQ_VOC_VALUE)); - printf("TIAQ current value is: %d ppb\n", iaq.value(IAQ_CO2_VALUE)); + printf("CO2 current value is: %d ppm\n", iaq.value(IAQ_VOC_VALUE)); + printf("TIAQ current value is: %d ppb\n", iaq.value(IAQ_CO2_VALUE)); printf("Status is: 0x%0X\n", iaq.value(IAQ_STATUS)); - } - else { + } else { printf("iAQ-Core Error: 0x%02X\n", status); } } diff --git a/examples/zolertia/zoul/test-motion.c b/examples/zolertia/zoul/test-motion.c index b5c9c3f59..1a4edfcc5 100644 --- a/examples/zolertia/zoul/test-motion.c +++ b/examples/zolertia/zoul/test-motion.c @@ -40,7 +40,7 @@ * @{ * * \file - * Test application for the digital motion/presence sensor + * Test application for the digital motion/presence sensor * * \author * Antonio Lignan @@ -100,3 +100,4 @@ PROCESS_THREAD(test_presence_sensor, ev, data) * @} * @} */ + diff --git a/examples/zolertia/zoul/test-pm10-sensor.c b/examples/zolertia/zoul/test-pm10-sensor.c index d307f9050..2f6dfae42 100644 --- a/examples/zolertia/zoul/test-pm10-sensor.c +++ b/examples/zolertia/zoul/test-pm10-sensor.c @@ -31,13 +31,14 @@ /** * \addtogroup zoul-examples * @{ + * * \defgroup zoul-pm10-sensor-test Test PM10 sensor * * Demonstrates the operation of the Sharp PM10 analog sensor * @{ * * \file - * GP2Y1010AU0F PM10 sensor example using the ADC sensors wrapper + * GP2Y1010AU0F PM10 sensor example using the ADC sensors wrapper * * \author * Toni Lozano @@ -93,3 +94,4 @@ PROCESS_THREAD(test_pm10_sensor_process, ev, data) * @} * @} */ + diff --git a/examples/zolertia/zoul/test-relay.c b/examples/zolertia/zoul/test-relay.c index cd743919d..51f55e537 100644 --- a/examples/zolertia/zoul/test-relay.c +++ b/examples/zolertia/zoul/test-relay.c @@ -87,3 +87,4 @@ PROCESS_THREAD(remote_relay_process, ev, data) * @} * @} */ + diff --git a/examples/zolertia/zoul/test-rotation-sensor.c b/examples/zolertia/zoul/test-rotation-sensor.c index 76fb029ec..6e03d44ea 100644 --- a/examples/zolertia/zoul/test-rotation-sensor.c +++ b/examples/zolertia/zoul/test-rotation-sensor.c @@ -38,7 +38,7 @@ * @{ * * \file - * Phidget analog rotation sensor example using the ADC sensor wrapper + * Phidget analog rotation sensor example using the ADC sensor wrapper * * \author * Antonio Lignan diff --git a/examples/zolertia/zoul/test-servo.c b/examples/zolertia/zoul/test-servo.c index 9b65ae617..ab201c06d 100644 --- a/examples/zolertia/zoul/test-servo.c +++ b/examples/zolertia/zoul/test-servo.c @@ -105,3 +105,4 @@ PROCESS_THREAD(servo_test_process, ev, data) * @} * @} */ + diff --git a/examples/zolertia/zoul/test-vac-sensor.c b/examples/zolertia/zoul/test-vac-sensor.c index 37db59edf..5be57e44b 100644 --- a/examples/zolertia/zoul/test-vac-sensor.c +++ b/examples/zolertia/zoul/test-vac-sensor.c @@ -28,20 +28,23 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* +/*---------------------------------------------------------------------------*/ +/** * \addtogroup zoul-examples * @{ + * * \defgroup zoul-vac-sensor-test Test VAC sensor * * Demonstrates the operation of the voltage VAC analog sensor * @{ * * \file - * Example demonstrating the Zoul module on the RE-Mote & VAC sensor 0-5V 250V AC + * Example demonstrating the RE-Mote & VAC sensor 0-5V 250V AC * * \author * Javier Sánchez */ +/*---------------------------------------------------------------------------*/ #include "contiki.h" #include "sys/etimer.h" #include "sys/rtimer.h" @@ -65,7 +68,7 @@ AUTOSTART_PROCESSES(&test_vac_sensor_process); /*---------------------------------------------------------------------------*/ PROCESS_THREAD(test_vac_sensor_process, ev, data) { - + PROCESS_BEGIN(); counter = 0; @@ -90,10 +93,10 @@ PROCESS_THREAD(test_vac_sensor_process, ev, data) /*AC voltage value, with applied corresponding sensor algorithm*/ printf("AC voltage = %d V\n", adc_sensors.value(ANALOG_VAC_SENSOR)); - + etimer_set(&et, LOOP_INTERVAL); counter++; - } + } } PROCESS_END(); } @@ -102,3 +105,4 @@ PROCESS_THREAD(test_vac_sensor_process, ev, data) * @} * @} */ + diff --git a/examples/zolertia/zoul/test-weather-meter.c b/examples/zolertia/zoul/test-weather-meter.c index 2e2bcba2f..637ba8571 100644 --- a/examples/zolertia/zoul/test-weather-meter.c +++ b/examples/zolertia/zoul/test-weather-meter.c @@ -40,7 +40,7 @@ * @{ * * \file - * Test application for the Sparkfun's weather meter + * Test application for the Sparkfun's weather meter * * \author * Antonio Lignan @@ -153,7 +153,7 @@ PROCESS_THREAD(test_weather_meter_sensors, ev, data) } /*---------------------------------------------------------------------------*/ /** - * @} * @} * @} */ + diff --git a/examples/zolertia/zoul/test-zonik.c b/examples/zolertia/zoul/test-zonik.c index 622b73291..a046a950c 100644 --- a/examples/zolertia/zoul/test-zonik.c +++ b/examples/zolertia/zoul/test-zonik.c @@ -29,22 +29,23 @@ */ /*---------------------------------------------------------------------------*/ /** - * \addtogroup remote-examples + * \addtogroup zoul-examples * @{ + * * \defgroup remote-zonik-test Zolertia Zonik sonometer test application * * Example of Zonik board implementation and simple operation: Infinite loop * enablinkg the sensor and rading few times, acquiring the dBA of sensor * The first value acquired is invalid, because it's in hw init state awaiting - * a valid internal reading.Once the driver is initialized, posterior readings + * a valid internal reading.Once the driver is initialized, posterior readings * are valid.Finally in the loop disables the board with standard call and * shows the error, and loop again enabling it. * * @{ * \file - * RE-Mote test application of Zolertia Zonik sound sensor + * RE-Mote test application of Zolertia Zonik sound sensor * \author - * Aitor Mejias + * Aitor Mejias */ /*---------------------------------------------------------------------------*/ #include "contiki.h" @@ -70,17 +71,17 @@ PROCESS_THREAD(test_remote_zonik_process, ev, data) PROCESS_BEGIN(); printf("Initial status of sensor is: 0x%04X\n", - zonik.status(SENSORS_ACTIVE)); + zonik.status(SENSORS_ACTIVE)); while(1) { /* Configure Zonik and activate the internal process readings */ SENSORS_ACTIVATE(zonik); printf("Initialized. Sensor status: 0x%04X\n", - zonik.status(SENSORS_ACTIVE)); + zonik.status(SENSORS_ACTIVE)); /* Read sensor value dBA multiple times */ - for(i=0; i Date: Thu, 1 Sep 2016 16:45:16 +0200 Subject: [PATCH 324/345] Zoul: Updated READMEs --- examples/zolertia/zoul/README.md | 59 ++++++++++++++++++++++++++++++++ platform/zoul/README.md | 10 +++--- 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 examples/zolertia/zoul/README.md diff --git a/examples/zolertia/zoul/README.md b/examples/zolertia/zoul/README.md new file mode 100644 index 000000000..dbcff3e2a --- /dev/null +++ b/examples/zolertia/zoul/README.md @@ -0,0 +1,59 @@ +Zolertia Zoul test examples +============================================ + +The following tests are valid for the following platforms: + +* RE-Mote revision A +* RE-Mote revision B +* Firefly + +Specific RE-mote revision A examples are available at the `rev-a` folder. + +Compile and install an example +------------------- + +To flash either hardware platform use the same `TARGET=zoul` and the following: + +* RE-Mote revision A : `BOARD=remote-reva` +* RE-Mote revision B : `BOARD=remote-revb` +* Zolertia Firefly : `BOARD=firefly` + +An example on how to compile is shown next: + +`make TARGET=zoul BOARD=remote-revb` + +Or alternatively if you just type `make`, it will default to use the `BOARD=remote-revb`. + +For backward compatibility with the previous `remote` target corresponding to the +RE-Mote revision A, using `BOARD=remote` will default to `BOARD=remote-reva`. + +To upload an example to your Zolertia device, just add the `.upload` target as: + +`make TARGET=zoul BOARD=remote-revb zoul-demo.upload` + +Optionally you can select a specific USB port to flash a given device, in Linux +and assuming there is a device at the `/dev/ttyUSB0`: + +`make TARGET=zoul BOARD=remote-revb zoul-demo.upload PORT=/dev/ttyUSB0` + +If you ommit the `PORT` argument, the system will flash all Zolertia devices connected over USB. + +Visualize the console output +------------------- + +Just type `make login` to open a connection to the console via USB. +As above to specify a given port use the `PORT=/dev/ttyUSB0` argument. + +Alternatively you can save the above `PORT`, `TARGET` or `BOARD` as follows: + +`export BOARD=/dev/ttyUSB0` + +This will save you to type these when running a command on the terminal + +Documentation and guides +------------------- + +More information about the platforms, guides and specific documentation can be found at [Zolertia Wiki][wiki] + +[wiki]: https://github.com/Zolertia/Resources/wiki "Zolertia Wiki" + diff --git a/platform/zoul/README.md b/platform/zoul/README.md index dc2960909..226e99ac5 100644 --- a/platform/zoul/README.md +++ b/platform/zoul/README.md @@ -252,10 +252,11 @@ If you prefer this guide in other formats, use the excellent [pandoc] to convert More Reading ============ 1. [Zolertia website][zolertia-site] -2. [CC2538 System-on-Chip Solution][cc2538] -3. [CC1200 sub-1GHz RF transceiver][cc1200] -4. [Zolertia Hackster channel][hackster] -5. [IoT in five days open source and online book][IoT5days] +2. [Zolertia Wiki page][zolertia-wiki] +3. [CC2538 System-on-Chip Solution][cc2538] +4. [CC1200 sub-1GHz RF transceiver][cc1200] +5. [Zolertia Hackster channel][hackster] +6. [IoT in five days open source and online book][IoT5days] Maintainers =========== @@ -263,6 +264,7 @@ The Zoul and derived platforms (as well as the Z1 mote) are maintained by Zolert Main contributor: Antonio Lignan [zolertia-site]: http://www.zolertia.io/products "Zolertia" +[zolertia-wiki]: https://github.com/Zolertia/Resources/wiki "Zolertia Wiki" [cc1200]: http://www.ti.com/product/cc1200 "CC1200" [smart-rf-studio]: http://www.ti.com/tool/smartrftm-studio "SmartRF Studio" [smart-rf-flashprog]: http://www.ti.com/tool/flash-programmer "SmartRF Flash Programmer" From 5d4b7de4267953244ba16eeb166472b79146d36d Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Fri, 2 Sep 2016 14:58:17 +0200 Subject: [PATCH 325/345] Zoul: created RE-Mote rev.B platform --- platform/zoul/Makefile.zoul | 2 +- platform/zoul/contiki-conf.h | 4 +- platform/zoul/firefly/Makefile.firefly | 2 +- .../{remote-back.png => remote-reva-back.png} | Bin ...remote-front.png => remote-reva-front.png} | Bin ...t-back.png => remote-reva-pinout-back.png} | Bin ...front.png => remote-reva-pinout-front.png} | Bin .../zoul/remote-reva/Makefile.remote-reva | 2 +- platform/zoul/remote-reva/README.md | 9 +- .../zoul/remote-revb/Makefile.remote-revb | 2 + platform/zoul/remote-revb/README.md | 41 ++ platform/zoul/remote-revb/board.c | 61 ++ platform/zoul/remote-revb/board.h | 522 ++++++++++++++++++ platform/zoul/remote-revb/leds-res-arch.c | 103 ++++ 14 files changed, 739 insertions(+), 9 deletions(-) rename platform/zoul/images/{remote-back.png => remote-reva-back.png} (100%) rename platform/zoul/images/{remote-front.png => remote-reva-front.png} (100%) rename platform/zoul/images/{remote-pinout-back.png => remote-reva-pinout-back.png} (100%) rename platform/zoul/images/{remote-pinout-front.png => remote-reva-pinout-front.png} (100%) create mode 100644 platform/zoul/remote-revb/Makefile.remote-revb create mode 100644 platform/zoul/remote-revb/README.md create mode 100644 platform/zoul/remote-revb/board.c create mode 100644 platform/zoul/remote-revb/board.h create mode 100644 platform/zoul/remote-revb/leds-res-arch.c diff --git a/platform/zoul/Makefile.zoul b/platform/zoul/Makefile.zoul index d74cb8b11..cff7f11cf 100644 --- a/platform/zoul/Makefile.zoul +++ b/platform/zoul/Makefile.zoul @@ -28,7 +28,7 @@ PLATFORM_ROOT_DIR = $(CONTIKI)/platform/$(TARGET) ### Include CONTIKI_TARGET_SOURCEFILES += contiki-main.c -CONTIKI_TARGET_SOURCEFILES += leds.c leds-arch.c cc1200-zoul-arch.c +CONTIKI_TARGET_SOURCEFILES += leds.c cc1200-zoul-arch.c CONTIKI_TARGET_SOURCEFILES += adc-zoul.c button-sensor.c zoul-sensors.c CONTIKI_TARGET_SOURCEFILES += $(BOARD_SOURCEFILES) diff --git a/platform/zoul/contiki-conf.h b/platform/zoul/contiki-conf.h index d7fdcb39f..bfe57994c 100644 --- a/platform/zoul/contiki-conf.h +++ b/platform/zoul/contiki-conf.h @@ -458,7 +458,7 @@ typedef uint32_t rtimer_clock_t; /* Don't let contiki-default-conf.h decide if we are an IPv6 build */ #ifndef NETSTACK_CONF_WITH_IPV6 -#define NETSTACK_CONF_WITH_IPV6 0 +#define NETSTACK_CONF_WITH_IPV6 0 #endif #if NETSTACK_CONF_WITH_IPV6 @@ -497,7 +497,7 @@ typedef uint32_t rtimer_clock_t; #define UIP_CONF_ND6_RETRANS_TIMER 10000 #ifndef NBR_TABLE_CONF_MAX_NEIGHBORS -#define NBR_TABLE_CONF_MAX_NEIGHBORS 16 +#define NBR_TABLE_CONF_MAX_NEIGHBORS 16 #endif #ifndef UIP_CONF_MAX_ROUTES #define UIP_CONF_MAX_ROUTES 16 diff --git a/platform/zoul/firefly/Makefile.firefly b/platform/zoul/firefly/Makefile.firefly index afecf9fa5..50cb71997 100644 --- a/platform/zoul/firefly/Makefile.firefly +++ b/platform/zoul/firefly/Makefile.firefly @@ -1,2 +1,2 @@ MOTELIST_ZOLERTIA = firefly -BOARD_SOURCEFILES += board.c +BOARD_SOURCEFILES += board.c leds-arch.c diff --git a/platform/zoul/images/remote-back.png b/platform/zoul/images/remote-reva-back.png similarity index 100% rename from platform/zoul/images/remote-back.png rename to platform/zoul/images/remote-reva-back.png diff --git a/platform/zoul/images/remote-front.png b/platform/zoul/images/remote-reva-front.png similarity index 100% rename from platform/zoul/images/remote-front.png rename to platform/zoul/images/remote-reva-front.png diff --git a/platform/zoul/images/remote-pinout-back.png b/platform/zoul/images/remote-reva-pinout-back.png similarity index 100% rename from platform/zoul/images/remote-pinout-back.png rename to platform/zoul/images/remote-reva-pinout-back.png diff --git a/platform/zoul/images/remote-pinout-front.png b/platform/zoul/images/remote-reva-pinout-front.png similarity index 100% rename from platform/zoul/images/remote-pinout-front.png rename to platform/zoul/images/remote-reva-pinout-front.png diff --git a/platform/zoul/remote-reva/Makefile.remote-reva b/platform/zoul/remote-reva/Makefile.remote-reva index 11f5ebe3a..475208875 100644 --- a/platform/zoul/remote-reva/Makefile.remote-reva +++ b/platform/zoul/remote-reva/Makefile.remote-reva @@ -1,2 +1,2 @@ MOTELIST_ZOLERTIA = remote -BOARD_SOURCEFILES += board.c antenna-sw.c rtcc.c power-mgmt.c +BOARD_SOURCEFILES += board.c antenna-sw.c rtcc.c power-mgmt.c leds-arch.c diff --git a/platform/zoul/remote-reva/README.md b/platform/zoul/remote-reva/README.md index 65bba0ef9..c61e8a2f1 100644 --- a/platform/zoul/remote-reva/README.md +++ b/platform/zoul/remote-reva/README.md @@ -12,15 +12,15 @@ The RE-Mote platform was designed jointly with universities and industrial partn The RE-Mote features a Zoul as its core module and it is bundled with the following features: * ARM Cortex-M3 with 512KB flash and 32KB RAM (16KB retention), 32MHz. -* ISM 2.4-GHz IEEE 802.15.4 & Zigbee compliant. +* ISM 2.4-GHz IEEE 802.15.4 & Zigbee/Thread compliant. * ISM 868-, 915-, 920-, 950-MHz ISM/SRD Band. * On-board RF switch to programatically select RF itnerfaces. Above RF interfaces can be used alternatively over a single RP-SMA connector for external antenna, or simultaneously by using an UFl pigtail or soldering an internal ceramic chip antenna (available on request). * AES-128/256, SHA2 Hardware Encryption Engine. * ECC-128/256, RSA Hardware Acceleration Engine for Secure Key Exchange. -* Power consumption down to 300nA using our shutdown mode. +* Power consumption down to 170nA using our shutdown mode. * Programming over BSL without requiring to press any button to enter bootloader mode. * Built-in battery charger (500mA), Energy Harvesting and Solar Panels to be connected to standards LiPo batteries. -* Power input with wide range 3.7-26VDC. +* Power input with wide range 3.7-16VDC. * On-board micro USB connector for USB 2.0 applications. * RGB LED to allow more than 7 colour combinations. * On-board nano-watt Real Time Clock Calendar (RTCC). @@ -28,10 +28,11 @@ The RE-Mote features a Zoul as its core module and it is bundled with the follow * On-board Micro-SD for external storage. * On-board external Watchdog Timer (WDT) for resilient operation. * Small form-factor of 73x40 mm. +* Available with enclosure for indoor use The most prominent feature of the RE-Mote is its ultra low-power implementation, allowing a flexible and time/date-aware control of the platform operation modes by introducing a real-time clock (RTCC), nanowatt external timer, ultra-low power PIC governing the battery manager, etc. -The RE-Mote features an optional custom-made enclosure to fit most scenarios, allowing to easily connect sensors, actuators and rechargeable LiPo batteries. Its on-board RP-SMA antenna eliminates the need to mechanize an external antenna, allowing to alternatively use either a sub-1GHz or 2.4GHz antenna, or a multiband one. +The RE-Mote features an optional custom-made enclosure to fit most scenarios, allowing to easily connect sensors, actuators and rechargeable LiPo batteries. Its on-board RP-SMA antenna eliminates the need to mechanize an external antenna, allowing to alternatively use either a sub-1GHz or 2.4GHz antenna, or a multiband one. For dual band applications it is possible to use both sub-GHz and 2.4GHz interfaces simultaneously. The external WDT with battery monitor allows a robust and resilience operation for most critical applications. diff --git a/platform/zoul/remote-revb/Makefile.remote-revb b/platform/zoul/remote-revb/Makefile.remote-revb new file mode 100644 index 000000000..34f526c65 --- /dev/null +++ b/platform/zoul/remote-revb/Makefile.remote-revb @@ -0,0 +1,2 @@ +MOTELIST_ZOLERTIA = remote +BOARD_SOURCEFILES += board.c antenna-sw.c rtcc.c leds-res-arch.c diff --git a/platform/zoul/remote-revb/README.md b/platform/zoul/remote-revb/README.md new file mode 100644 index 000000000..e92a1cac4 --- /dev/null +++ b/platform/zoul/remote-revb/README.md @@ -0,0 +1,41 @@ +Zolertia RE-Mote platform (revision B) +============================================ + +The RE-Mote is a hardware development platform to build real IoT (Internet of Things) applications and products, aimed to high skilled developers as well as Makers (Do-It-Yourself enthusiasts) and early beginners, providing an industry-ready and resilient hardware solution for most Smart Cities, Home Comfort, eHealth and Industrial applications. The RE-Mote conciliates an ultra-low power consumption with a high performance design, meeting specifications of processing resources, security and resilient operation. + +The RE-Mote platform was designed jointly with universities and industrial partners from different countries in the context of RERUM European Project. + +The RE-Mote features a Zoul as its core module and it is bundled with the following features: + +* ARM Cortex-M3 with 512KB flash and 32KB RAM (16KB retention), 32MHz. +* ISM 2.4-GHz IEEE 802.15.4 & Zigbee/Thread compliant. +* ISM 868-, 915-, 920-, 950-MHz ISM/SRD Band. +* On-board RF switch to programatically select RF itnerfaces. Above RF interfaces can be used alternatively over a single RP-SMA connector for external antenna, or simultaneously by using an UFl pigtail or soldering an internal ceramic chip antenna (available on request). +* AES-128/256, SHA2 Hardware Encryption Engine. +* ECC-128/256, RSA Hardware Acceleration Engine for Secure Key Exchange. +* Power consumption down to 150nA using our shutdown mode. +* Programming over BSL without requiring to press any button to enter bootloader mode. +* Built-in battery charger (500mA), Energy Harvesting and Solar Panels to be connected to standards LiPo batteries. +* Power input with wide range 3.7-16VDC. +* On-board micro USB connector for USB 2.0 applications. +* RGB LED to allow more than 7 colour combinations. +* On-board nano-watt Real Time Clock Calendar (RTCC). +* User and Reset buttons. +* On-board Micro-SD for external storage. +* On-board external Watchdog Timer (WDT) for resilient operation. +* Small form-factor of 73x40 mm. +* Available with enclosure for indoor use + +The most prominent feature of the RE-Mote is its ultra low-power implementation, allowing a flexible and time/date-aware control of the platform operation modes by using its real-time clock (RTCC) and an ultra-low power PIC governing the battery manager. + +The RE-Mote features an optional custom-made enclosure to fit most scenarios, allowing to easily connect sensors, actuators and rechargeable LiPo batteries. Its on-board RP-SMA antenna eliminates the need to mechanize an external antenna, allowing to alternatively use either a sub-1GHz or 2.4GHz antenna, or a multiband one. For dual band applications it is possible to use both sub-GHz and 2.4GHz interfaces simultaneously. + +The external WDT with battery monitor allows a robust and resilience operation for most critical applications. + +Zoul pin-out +============= + +![RE-Mote pin-out (front)][remote-pinout-front] +![RE-Mote pin-out (back)][remote-pinout-back] + + diff --git a/platform/zoul/remote-revb/board.c b/platform/zoul/remote-revb/board.c new file mode 100644 index 000000000..f3e39617c --- /dev/null +++ b/platform/zoul/remote-revb/board.c @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2014, Texas Instruments Incorporated - http://www.ti.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/*---------------------------------------------------------------------------*/ +/** + * \addtogroup remote-revb + * @{ + * + * \file + * Board-initialisation for the Zolertia's RE-Mote revision B platform + * + */ +/*---------------------------------------------------------------------------*/ +#include "contiki-conf.h" +#include "antenna-sw.h" +#include +#include +/*---------------------------------------------------------------------------*/ +static void +configure_unused_pins(void) +{ + /* FIXME */ +} +/*---------------------------------------------------------------------------*/ +void +board_init() +{ + antenna_sw_config(); + configure_unused_pins(); +} +/*---------------------------------------------------------------------------*/ +/** + * @} + */ + diff --git a/platform/zoul/remote-revb/board.h b/platform/zoul/remote-revb/board.h new file mode 100644 index 000000000..a88069e8e --- /dev/null +++ b/platform/zoul/remote-revb/board.h @@ -0,0 +1,522 @@ +/* + * Copyright (c) 2016, Zolertia + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/** + * \addtogroup zoul-platforms + * @{ + * + * \defgroup remote-revb RE-Mote platform revision B + * + * The RE-Mote was designed jointly with universities and industry partners in + * RERUM European project, to ease the development of private and secure + * applications for IoT and Smart City applications. The RE-Mote packs several + * on-board resources, like a RTC, external WDT, Micro-SD, RF switch and a + * Shutdown mode to reduce its power consumption down to 150nA. + * + * This file provides connectivity information on LEDs, Buttons, UART and + * other RE-Mote revision A peripherals + * + * This file can be used as the basis to configure other platforms using the + * cc2538 SoC. + * @{ + * + * \file + * Header file with definitions related to the I/O connections on the Zolertia's + * RE-Mote platform (revision B), cc2538-based + * + * \note Do not include this file directly. It gets included by contiki-conf + * after all relevant directives have been set. + */ +#ifndef BOARD_H_ +#define BOARD_H_ + +#include "dev/gpio.h" +#include "dev/nvic.h" +/*---------------------------------------------------------------------------*/ +/** \name Connector headers + * + * The RE-Mote features two 2.54 mm header rows over which exposes the following + * pins (facing up, Zolertia/RERUM logo above, buttons and micro USB at bottom): + * ----------------------+---+---+--------------------------------------------- + * PIN_NAME |JP6|JP5| PIN_NAME + * ----------------------+---+---+--------------------------------------------- + * LED1.R/PD4 |-01|17-| PB2/SPIO0.SCLK/CC1200.SCLK + * LED2.G/JTAG.TDO/PB7 |-02|16-| PB1/SPIO0.MOSI/CC1200.MOSI + * LED3.B/JTAG.TDI/PB6 |-03|15-| PB3/SPIO0.MISO/CC1200.MISO + * UART0.RX/PA0 |-04|14-| PA7/AIN7/USD.CS + * UART0.TX/PA1 |-05|13-| DGND + * PD0 |-06|12-| D+3.3 + * I2C.SDA/PC2 |-07|11-| PA5/AIN5/ADC1 + * I2C.SCL/PC3 |-08|10-| PA4/AIN4/ADC2 + * DGND |-09|09-| DGND + * D+3.3 |-10|08-| D+5.0 + * CC1200.GPIO0/PB4 |-11|07-| PA2/AIN2/ADC3 + * CC1200.GPIO2/PB0 |-12|06-| PA6/AIN6/USD.SEL + * UART1.RX/PC1 |-13|05-| PC6/SPI1.MISO + * UART1.TX/PC0 |-14|04-| PC5/SPI1.MOSI + * DGND |-15|03-| PC4/SPI1.SCLK + * D+3.3 |-16|02-| PS+EXT/VIN + * CC1200.CS/PB5 |-17|01-| DGND + * ----------------------+---+---+--------------------------------------------- + * + * Two auxiliary connectors allow to connect an external LiPo battery and + * access to the RESET/user buttons: + * + * - JP4 (placed below JP6 connector): |1-| DGND, |2-| VBAT + * - JP9 (placed above JP5 connector): |1-| BUTTON.RESET, |2-| BUTTON.USER + */ +/*---------------------------------------------------------------------------*/ +/** \name RE-Mote LED configuration + * + * LEDs on the RE-Mote are exposed in the JP6 port as follows: + * - LED1 (Red) -> PD4 + * - LED2 (Green) -> PB7 (shared with JTAG.TDO) + * - LED3 (Blue) -> PB6 (shared with JTAG.TDI) + * + * The LEDs are connected to a MOSFET to minimize current draw. The LEDs can + * be disabled by removing resistors R12, R13 and R14. + * @{ + */ +/*---------------------------------------------------------------------------*/ +#undef LEDS_GREEN +#undef LEDS_YELLOW +#undef LEDS_BLUE +#undef LEDS_RED +#undef LEDS_CONF_ALL + +#define LEDS_RED 1 /**< LED1 (Red) -> PD4 */ +#define LEDS_RED_PIN_MASK (1 << 4) +#define LEDS_RED_PORT_BASE GPIO_D_BASE + +#define LEDS_GREEN 2 /**< LED2 (Green) -> PB7 */ +#define LEDS_GREEN_PIN_MASK (1 << 7) +#define LEDS_GREEN_PORT_BASE GPIO_B_BASE + +#define LEDS_BLUE 4 /**< LED3 (Blue) -> PB6 */ +#define LEDS_BLUE_PIN_MASK (1 << 6) +#define LEDS_BLUE_PORT_BASE GPIO_B_BASE + +#define LEDS_CONF_ALL (LEDS_GREEN | LEDS_BLUE | LEDS_RED) /* 7 */ +#define LEDS_LIGHT_BLUE (LEDS_GREEN | LEDS_BLUE) /* 6 */ +#define LEDS_YELLOW (LEDS_GREEN | LEDS_RED) /* 3 */ +#define LEDS_PURPLE (LEDS_BLUE | LEDS_RED) /* 5 */ +#define LEDS_WHITE LEDS_ALL /* 7 */ + +/* Notify various examples that we have LEDs */ +#define PLATFORM_HAS_LEDS 1 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** \name USB configuration + * + * The USB pullup is enabled by an external resistor, not mapped to a GPIO + */ +#ifdef USB_PULLUP_PORT +#undef USB_PULLUP_PORT +#endif +#ifdef USB_PULLUP_PIN +#undef USB_PULLUP_PIN +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ +/** \name UART configuration + * + * On the RE-Mote, the UARTs are connected to the following ports/pins: + * + * - UART0: + * - RX: PA0, connected to CP2104 serial-to-usb converter TX pin + * - TX: PA1, connected to CP2104 serial-to-usb converter RX pin + * - UART1: + * - RX: PC1 + * - TX: PC0 + * - CTS: disabled as default, PD0 may be assigned if not using I2C interrupts + * - RTS: disabled as default + * + * We configure the port to use UART0 and UART1, CTS/RTS only for UART1, + * both without a HW pull-up resistor + * UART0 and UART1 pins are exposed over the JP6 connector + * @{ + */ +#define UART0_RX_PORT GPIO_A_NUM +#define UART0_RX_PIN 0 +#define UART0_TX_PORT GPIO_A_NUM +#define UART0_TX_PIN 1 + +#define UART1_RX_PORT GPIO_C_NUM +#define UART1_RX_PIN 1 +#define UART1_TX_PORT GPIO_C_NUM +#define UART1_TX_PIN 0 +#define UART1_CTS_PORT (-1) +#define UART1_CTS_PIN (-1) +#define UART1_RTS_PORT (-1) +#define UART1_RTS_PIN (-1) +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name ADC configuration + * + * These values configure which CC2538 pins and ADC channels to use for the ADC + * inputs. By default the RE-Mote allows two out-of-the-box ADC ports with a + * phidget-like 3-pin connector (GND/VDD/ADC) + * + * The RE-Mote allows both 3.3V and 5V analogue sensors as follow: + * + * - ADC1 (PA5): up to 3.3V. + * - ADC2 (PA4): up to 3.3V + * - ADC3 (PA2): up to 5V, by means of a 2/3 voltage divider. + * + * Also there are other ADC channels shared by default with Micro SD card and + * user button implementations: + * + * - ADC4 (PA6): up to 3.3V. + * - ADC5 (PA7): up to 3.3V. + * - ADC6 (PA3): up to 3.3V. + * + * ADC inputs can only be on port A. + * All ADCx are exposed in JP5 connector, but only ADC1 and ADC3 have GND and + * VDD (3/5V) pins next to it, so these can be exposed into a 3-pin phidget-like + * connector, for ADC2 either solder a wire to connect, or use a 4-pin connector + * to expose both ADC1 and ADC2 in a single connector, but this will leave no + * space for a ADC3 connector. + * + * The internal ADC reference is 1190mV, use either a voltage divider as input, + * or a different voltage reference, like AVDD5, or externally using PA7/AIN7 + * and PA6/AIN6 configurable as differential reference, by removing the R26 and + * R33 0Ohm resistors to disconnect off the Micro-SD, and those will be + * accessible from JP5 connector. + * + * To enable the ADC[2,4-6], remove any 0Ohm resistors if required (see above), + * and define in your application `ADC_SENSORS_CONF_ADCx_PIN` and set its + * value with the corresponding pin number (i.e ADC2 to 4 as mapped to PA4). + * To disable any ADC[1-6] just define as above, but set to (-1) instead. + + * Warning: if using ADC6 (PA3), you will need to disable the bootloader by + * making FLASH_CCA_CONF_BOOTLDR_BACKDOOR equal to zero + * + * @{ + */ +#define ADC_SENSORS_PORT GPIO_A_NUM /**< ADC GPIO control port */ + +#ifndef ADC_SENSORS_CONF_ADC1_PIN +#define ADC_SENSORS_ADC1_PIN 5 /**< ADC1 to PA5, 3V3 */ +#else +#if ((ADC_SENSORS_CONF_ADC1_PIN != -1) && (ADC_SENSORS_CONF_ADC1_PIN != 5)) +#error "ADC1 channel should be mapped to PA5 or disabled with -1" +#else +#define ADC_SENSORS_ADC1_PIN ADC_SENSORS_CONF_ADC1_PIN +#endif +#endif + +#ifndef ADC_SENSORS_CONF_ADC3_PIN +#define ADC_SENSORS_ADC3_PIN 2 /**< ADC3 to PA2, 5V */ +#else +#if ((ADC_SENSORS_CONF_ADC3_PIN != -1) && (ADC_SENSORS_CONF_ADC3_PIN != 2)) +#error "ADC3 channel should be mapped to PA2 or disabled with -1" +#else +#define ADC_SENSORS_ADC3_PIN ADC_SENSORS_CONF_ADC3_PIN +#endif +#endif + +#ifndef ADC_SENSORS_CONF_ADC2_PIN +#define ADC_SENSORS_ADC2_PIN (-1) /**< ADC2 no declared */ +#else +#define ADC_SENSORS_ADC2_PIN 4 /**< Hard-coded to PA4 */ +#endif + +#ifndef ADC_SENSORS_CONF_ADC4_PIN +#define ADC_SENSORS_ADC4_PIN (-1) /**< ADC4 not declared */ +#else +#define ADC_SENSORS_ADC4_PIN 6 /**< Hard-coded to PA6 */ +#endif + +#ifndef ADC_SENSORS_CONF_ADC5_PIN +#define ADC_SENSORS_ADC5_PIN (-1) /**< ADC5 not declared */ +#else +#define ADC_SENSORS_ADC5_PIN 7 /**< Hard-coded to PA7 */ +#endif + +#ifndef ADC_SENSORS_CONF_ADC6_PIN +#define ADC_SENSORS_ADC6_PIN (-1) /**< ADC6 not declared */ +#else +#define ADC_SENSORS_ADC6_PIN 3 /**< Hard-coded to PA3 */ +#endif + +#ifndef ADC_SENSORS_CONF_MAX +#define ADC_SENSORS_MAX 2 /**< Maximum sensors */ +#else +#define ADC_SENSORS_MAX ADC_SENSORS_CONF_MAX +#endif +/** @} */ +/*---------------------------------------------------------------------------*/ +/** \name RE-Mote Button configuration + * + * Buttons on the RE-Mote are connected as follows: + * - BUTTON_USER -> PA3, S1 user button, shared with bootloader + * - BUTTON_RESET -> RESET_N line, S2 reset the CC2538 + * - BUTTON_PWR -> Depending on the enabled resistor, it can be used to reset + * the onboard Low-power PIC, provoking a master reset on all + * the RE-Mote's onboards components. Note the BUTTON_RESET + * only resets the CC2538. This is disabled by default, as + * the R45 0Ohm resistor is not soldered on that position + * The other R45 position enables a test-button to drive the + * SYSOFF pin of the power management block, disconnecting the + * battery when used, leaving only powered the RTCC and + * Low-Power PIC. Useful if developing applications using the + * shutdown mode if required to snap out of it. + * @{ + */ +#define BUTTON_USER_PORT GPIO_A_NUM +#define BUTTON_USER_PIN 3 +#define BUTTON_USER_VECTOR NVIC_INT_GPIO_PORT_A + +/* Notify various examples that we have an user button. + * If ADC6 channel is used, then disable the user button + */ +#ifdef PLATFORM_CONF_WITH_BUTTON +#if (PLATFORM_CONF_WITH_BUTTON && (ADC_SENSORS_ADC6_PIN == 3)) +#error "The ADC6 (PA3) and user button cannot be enabled at the same time" +#else +#define PLATFORM_HAS_BUTTON (PLATFORM_CONF_WITH_BUTTON && \ + !(ADC_SENSORS_ADC6_PIN == 3)) +#endif /* (PLATFORM_CONF_WITH_BUTTON && (ADC_SENSORS_ADC6_PIN == 3)) */ +#else +#define PLATFORM_HAS_BUTTON !(ADC_SENSORS_ADC6_PIN == 3) +#endif /* PLATFORM_CONF_WITH_BUTTON */ +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name SPI (SSI0) configuration + * + * These values configure which CC2538 pins to use for the SPI (SSI0) lines, + * reserved exclusively for the CC1200 RF transceiver. These pins are not + * exposed to any connector, and should be avoid to use it. + * TX -> MOSI, RX -> MISO + * @{ + */ +#define SPI0_CLK_PORT GPIO_B_NUM +#define SPI0_CLK_PIN 2 +#define SPI0_TX_PORT GPIO_B_NUM +#define SPI0_TX_PIN 1 +#define SPI0_RX_PORT GPIO_B_NUM +#define SPI0_RX_PIN 3 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name SPI (SSI1) configuration + * + * These values configure which CC2538 pins to use for the SPI (SSI1) lines, + * shared with the microSD and exposed over JP5 connector. + * TX -> MOSI, RX -> MISO + * @{ + */ +#define SPI1_CLK_PORT GPIO_C_NUM +#define SPI1_CLK_PIN 4 +#define SPI1_TX_PORT GPIO_C_NUM +#define SPI1_TX_PIN 5 +#define SPI1_RX_PORT GPIO_C_NUM +#define SPI1_RX_PIN 6 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name I2C configuration + * + * These values configure which CC2538 pins to use for the I2C lines, exposed + * over JP6 connector. + * The I2C bus is shared with the on-board RTC and the Low-Power PIC + * The I2C is exposed over the JP6 header, using a 5-pin connector with 2.54 mm + * spacing, providing also D+3.3V, GND and PD0 pin that can be used as an + * interrupt pin if required + * @{ + */ +#define I2C_SCL_PORT GPIO_C_NUM +#define I2C_SCL_PIN 3 +#define I2C_SDA_PORT GPIO_C_NUM +#define I2C_SDA_PIN 2 +#define I2C_INT_PORT GPIO_D_NUM +#define I2C_INT_PIN 0 +#define I2C_INT_VECTOR NVIC_INT_GPIO_PORT_D +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name Antenna switch configuration + * + * These values configure the required pin to drive the RF antenna switch, to + * either enable the sub-1Ghz RF interface (power-up the CC1200) or the 2.4GHz + * RF interface of the CC2538, both alternatively routed to a RP-SMA connector + * to allow using an external antenna for both cases. + * + * Note it is also possible to enable both RF interfaces at the same time, by + * switching On the sub-1GHz RF interface, and placing an 0Ohm resistor (R19), + * to select between using a ceramic chip antenna (not mounted), or to connect + * and external antenna over a pigtail to the U.Fl connector (not mounted). + * + * RF switch state: + * - LOW: 2.4GHz RF interface on RP-SMA connector, CC1200 powered-off. + * - HIGH: Sub-1GHz RF interface on RP-SMA connector. + * @{ + */ +#define ANTENNA_RF_SW_PORT GPIO_D_NUM +#define ANTENNA_RF_SW_PIN 2 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name Dual RF interface support + * + * Enables support for dual band operation (both CC1200 and 2.4GHz enabled). + * The driver checks the selected Radio stack, and forces the antenna switch to + * either position. Enabling the definition below forces to skip this check. + * @{ + */ +#define REMOTE_DUAL_RF_ENABLED 0 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name CC1200 configuration + * + * These values configure the required pins to drive the CC1200 + * None of the following pins are exposed to any connector, kept for internal + * use only + * @{ + */ +#define CC1200_SPI_INSTANCE 0 +#define CC1200_SPI_SCLK_PORT SPI0_CLK_PORT +#define CC1200_SPI_SCLK_PIN SPI0_CLK_PIN +#define CC1200_SPI_MOSI_PORT SPI0_TX_PORT +#define CC1200_SPI_MOSI_PIN SPI0_TX_PIN +#define CC1200_SPI_MISO_PORT SPI0_RX_PORT +#define CC1200_SPI_MISO_PIN SPI0_RX_PIN +#define CC1200_SPI_CSN_PORT GPIO_B_NUM +#define CC1200_SPI_CSN_PIN 5 +#define CC1200_GDO0_PORT GPIO_B_NUM +#define CC1200_GDO0_PIN 4 +#define CC1200_GDO2_PORT GPIO_B_NUM +#define CC1200_GDO2_PIN 0 +#define CC1200_RESET_PORT GPIO_C_NUM +#define CC1200_RESET_PIN 7 +#define CC1200_GPIOx_VECTOR NVIC_INT_GPIO_PORT_B +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name microSD configuration + * + * These values configure the required pins to drive the built-in microSD + * external module, to be used with SSI1. USD_CSN and USD_SEL are shared with + * ADC4/ADC5, but it is disabled by default as there are 0Ohm resistors + * connecting the PA6/PA7 pins to the microSD (see ADC block above for comments) + * The USD_SEL pin can be used both as output and input, to detect if there is + * a microSD in the slot, or when connected to disable the microSD to save power + * @{ + */ +#define USD_CLK_PORT SPI1_CLK_PORT +#define USD_CLK_PIN SPI1_CLK_PIN +#define USD_MOSI_PORT SPI1_TX_PORT +#define USD_MOSI_PIN SPI1_TX_PIN +#define USD_MISO_PORT SPI1_RX_PORT +#define USD_MISO_PIN SPI1_RX_PIN +#define USD_CSN_PORT GPIO_A_NUM +#define USD_CSN_PIN 7 +#define USD_SEL_PORT GPIO_A_NUM +#define USD_SEL_PIN 6 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name Power management and shutdown mode + * + * The shutdown mode is an ultra-low power operation mode that effectively + * powers-down the entire RE-Mote (CC2538, CC1200, attached sensors, etc) and + * only keeps running a the on-board RTC and an ultra-low power consumption MCU + * The Shutdown mode allows: + * + * - Put the board in an ultra-low power sleep (shutdown) drawing <150nA avg. + * - Awake the system by scheduling the RTCC to awake the Low-Power PIC after + * it disconnects the battery and goes to sleep mode. + * - Awake the system by using the Low-Power PIC's timer + * + * As commented above, S3 can be used to restart the entire board (power + * management block included), or to kick the board out of shutdown mode by + * reconnecting the battery. + * @{ + */ +#define PM_ENABLE_PORT GPIO_D_NUM +#define PM_ENABLE_PIN 1 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name On-board RTCC + * + * The on-board RTCC (real time clock-calendar) is powered over USB/battery, + * and it will remain powered in shutdown mode with the Low-Power PIC. The + * RTC_INT1 is connected to the CC2538, so it is possible to receive interrupts + * from a pre-configured alarm, even waking up the CC2538 from PM3. + * A second interruption pin (RTC_INT2) is connected to the Low-Power PIC, after + * configuring the RTCC the Low-Power PIC can drive the board to shutdown mode, + * and enter into low-power mode (sleep), being the RTCC interrupt the waking up + * source to resume operation. + * + * @{ + */ +#define RTC_SDA_PORT I2C_SDA_PORT +#define RTC_SDA_PIN I2C_SDA_PIN +#define RTC_SCL_PORT I2C_SCL_PORT +#define RTC_SCL_PIN I2C_SCL_PIN +#define RTC_INT1_PORT GPIO_D_NUM +#define RTC_INT1_PIN 3 +#define RTC_INT1_VECTOR NVIC_INT_GPIO_PORT_D +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name On-board external WDT + * The RE-Mote features an on-board external WDT and battery monitor, which + * adds more robustness and prevents the mote to run wild if any unexpected + * problem shows-up. + * The external WDT requires a short pulse (<1ms) to be sent before a 2-second + * period. The battery monitor keeps the device in Reset if the voltage input + * is lower than 2.5V. + * The external WDT can be disabled by removing the R34 0Ohm resistor. + * As default the Texas Instrument's TPS3823 WDT is not mounted. + * Alternatively the testpoint or unused WDT's pad can be used to re-use as GPIO + * @{ + */ +#define EXT_WDT_PORT GPIO_D_NUM +#define EXT_WDT_PIN 5 +/** @} */ +/*---------------------------------------------------------------------------*/ +/** + * \name Device string used on startup + * @{ + */ +#define BOARD_STRING "Zolertia RE-Mote revision B platform" +/** @} */ + +#endif /* BOARD_H_ */ + +/** + * @} + * @} + */ diff --git a/platform/zoul/remote-revb/leds-res-arch.c b/platform/zoul/remote-revb/leds-res-arch.c new file mode 100644 index 000000000..59484c2ff --- /dev/null +++ b/platform/zoul/remote-revb/leds-res-arch.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2015, Zolertia - http://www.zolertia.com + * Copyright (c) 2015, University of Bristol - http://www.bristol.ac.uk + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/** + * \addtogroup zoul + * @{ + * + * \defgroup remote-revb-leds RE-Mote revision B arch LED + * + * LED driver implementation for the RE-Mote revision B + * @{ + * + * \file + * LED driver implementation for the RE-Mote revision B + */ +#include "contiki.h" +#include "reg.h" +#include "dev/leds.h" +#include "dev/gpio.h" +#include "dev/ioc.h" +/*---------------------------------------------------------------------------*/ +#define LEDS_PORTB_PIN_MASK (LEDS_GREEN_PIN_MASK | LEDS_BLUE_PIN_MASK) +/*---------------------------------------------------------------------------*/ +void +leds_arch_init(void) +{ + /* Initialize LED2 (Green) and LED3 (Blue) */ + GPIO_SOFTWARE_CONTROL(GPIO_B_BASE, LEDS_PORTB_PIN_MASK); + GPIO_SET_OUTPUT(GPIO_B_BASE, LEDS_PORTB_PIN_MASK); + GPIO_CLR_PIN(GPIO_B_BASE, LEDS_PORTB_PIN_MASK); + + /* Initialize LED1 (Red) */ + GPIO_SOFTWARE_CONTROL(LEDS_RED_PORT_BASE, LEDS_RED_PIN_MASK); + GPIO_SET_OUTPUT(LEDS_RED_PORT_BASE, LEDS_RED_PIN_MASK); + GPIO_CLR_PIN(LEDS_RED_PORT_BASE, LEDS_RED_PIN_MASK); +} +/*---------------------------------------------------------------------------*/ +unsigned char +leds_arch_get(void) +{ + uint8_t mask_leds; + + mask_leds = GPIO_READ_PIN(LEDS_GREEN_PORT_BASE, LEDS_GREEN_PIN_MASK) == 0 ? 0: LEDS_GREEN; + mask_leds |= GPIO_READ_PIN(LEDS_BLUE_PORT_BASE, LEDS_BLUE_PIN_MASK) == 0 ? 0 : LEDS_BLUE; + mask_leds |= GPIO_READ_PIN(LEDS_RED_PORT_BASE, LEDS_RED_PIN_MASK) == 0 ? 0 : LEDS_RED; + + return mask_leds; +} +/*---------------------------------------------------------------------------*/ +void +leds_arch_set(unsigned char leds) +{ + if(leds & LEDS_GREEN) { + GPIO_SET_PIN(LEDS_GREEN_PORT_BASE, LEDS_GREEN_PIN_MASK); + } else { + GPIO_CLR_PIN(LEDS_GREEN_PORT_BASE, LEDS_GREEN_PIN_MASK); + } + + if(leds & LEDS_BLUE) { + GPIO_SET_PIN(LEDS_BLUE_PORT_BASE, LEDS_BLUE_PIN_MASK); + } else { + GPIO_CLR_PIN(LEDS_BLUE_PORT_BASE, LEDS_BLUE_PIN_MASK); + } + + if(leds & LEDS_RED) { + GPIO_SET_PIN(LEDS_RED_PORT_BASE, LEDS_RED_PIN_MASK); + } else { + GPIO_CLR_PIN(LEDS_RED_PORT_BASE, LEDS_RED_PIN_MASK); + } +} +/*---------------------------------------------------------------------------*/ +/** + * @} + * @} + */ From 448c78da5faa76f06082960854dd4b47ea8f9816 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Mon, 5 Sep 2016 10:34:37 +0200 Subject: [PATCH 326/345] Zoul: updated ADC[4-5] info and link to wiki with RevA-B delta --- platform/zoul/remote-revb/README.md | 2 ++ platform/zoul/remote-revb/board.h | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/zoul/remote-revb/README.md b/platform/zoul/remote-revb/README.md index e92a1cac4..8b6095e24 100644 --- a/platform/zoul/remote-revb/README.md +++ b/platform/zoul/remote-revb/README.md @@ -26,6 +26,8 @@ The RE-Mote features a Zoul as its core module and it is bundled with the follow * Small form-factor of 73x40 mm. * Available with enclosure for indoor use +The changes from Revision A to this new Revision B are summarized in the [Wiki](https://github.com/Zolertia/Resources/wiki/RE-Mote:-Enhancements-from-Rev.A-to-Rev.B) + The most prominent feature of the RE-Mote is its ultra low-power implementation, allowing a flexible and time/date-aware control of the platform operation modes by using its real-time clock (RTCC) and an ultra-low power PIC governing the battery manager. The RE-Mote features an optional custom-made enclosure to fit most scenarios, allowing to easily connect sensors, actuators and rechargeable LiPo batteries. Its on-board RP-SMA antenna eliminates the need to mechanize an external antenna, allowing to alternatively use either a sub-1GHz or 2.4GHz antenna, or a multiband one. For dual band applications it is possible to use both sub-GHz and 2.4GHz interfaces simultaneously. diff --git a/platform/zoul/remote-revb/board.h b/platform/zoul/remote-revb/board.h index a88069e8e..783209e26 100644 --- a/platform/zoul/remote-revb/board.h +++ b/platform/zoul/remote-revb/board.h @@ -70,7 +70,7 @@ * LED1.R/PD4 |-01|17-| PB2/SPIO0.SCLK/CC1200.SCLK * LED2.G/JTAG.TDO/PB7 |-02|16-| PB1/SPIO0.MOSI/CC1200.MOSI * LED3.B/JTAG.TDI/PB6 |-03|15-| PB3/SPIO0.MISO/CC1200.MISO - * UART0.RX/PA0 |-04|14-| PA7/AIN7/USD.CS + * UART0.RX/PA0 |-04|14-| PA7/AIN7/USD.CS|ADC5 * UART0.TX/PA1 |-05|13-| DGND * PD0 |-06|12-| D+3.3 * I2C.SDA/PC2 |-07|11-| PA5/AIN5/ADC1 @@ -78,7 +78,7 @@ * DGND |-09|09-| DGND * D+3.3 |-10|08-| D+5.0 * CC1200.GPIO0/PB4 |-11|07-| PA2/AIN2/ADC3 - * CC1200.GPIO2/PB0 |-12|06-| PA6/AIN6/USD.SEL + * CC1200.GPIO2/PB0 |-12|06-| PA6/AIN6/USD.SEL|ADC4 * UART1.RX/PC1 |-13|05-| PC6/SPI1.MISO * UART1.TX/PC0 |-14|04-| PC5/SPI1.MOSI * DGND |-15|03-| PC4/SPI1.SCLK @@ -90,7 +90,7 @@ * access to the RESET/user buttons: * * - JP4 (placed below JP6 connector): |1-| DGND, |2-| VBAT - * - JP9 (placed above JP5 connector): |1-| BUTTON.RESET, |2-| BUTTON.USER + * - JP9 (placed above JP5 connector): |1-| BUTTON.RESET, |2-| BUTTON.USER|ADC6 */ /*---------------------------------------------------------------------------*/ /** \name RE-Mote LED configuration From 4c5b70e628e697df06e6e0e19a9ef7824027c895 Mon Sep 17 00:00:00 2001 From: Afonso Oliveira Date: Mon, 5 Sep 2016 14:49:41 +0100 Subject: [PATCH 327/345] fix misplaced bracket causing compilation error when probing is deactivated (RPL_WITH_PROBING=0) --- core/net/rpl/rpl-dag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/net/rpl/rpl-dag.c b/core/net/rpl/rpl-dag.c index de5932692..a154defea 100644 --- a/core/net/rpl/rpl-dag.c +++ b/core/net/rpl/rpl-dag.c @@ -917,11 +917,11 @@ rpl_select_parent(rpl_dag_t *dag) /* Probe the best parent shortly in order to get a fresh estimate */ dag->instance->urgent_probing_target = best; rpl_schedule_probing(dag->instance); + } #else /* RPL_WITH_PROBING */ rpl_set_preferred_parent(dag, best); dag->rank = rpl_rank_via_parent(dag->preferred_parent); #endif /* RPL_WITH_PROBING */ - } } else { rpl_set_preferred_parent(dag, NULL); } From 0217776d6eb1fcc438177d0269e02acf23df57ac Mon Sep 17 00:00:00 2001 From: Afonso Oliveira Date: Mon, 5 Sep 2016 16:24:55 +0100 Subject: [PATCH 328/345] fixed identantion on code below alteration --- core/net/rpl/rpl-dag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/net/rpl/rpl-dag.c b/core/net/rpl/rpl-dag.c index a154defea..97a309bc8 100644 --- a/core/net/rpl/rpl-dag.c +++ b/core/net/rpl/rpl-dag.c @@ -919,8 +919,8 @@ rpl_select_parent(rpl_dag_t *dag) rpl_schedule_probing(dag->instance); } #else /* RPL_WITH_PROBING */ - rpl_set_preferred_parent(dag, best); - dag->rank = rpl_rank_via_parent(dag->preferred_parent); + rpl_set_preferred_parent(dag, best); + dag->rank = rpl_rank_via_parent(dag->preferred_parent); #endif /* RPL_WITH_PROBING */ } else { rpl_set_preferred_parent(dag, NULL); From 93757e810d375040691bfaf0e7bf1a00e3036c95 Mon Sep 17 00:00:00 2001 From: Marko Gucanin Date: Mon, 5 Sep 2016 17:36:33 +0200 Subject: [PATCH 329/345] added space between ) and { --- platform/jn516x/dev/exceptions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/jn516x/dev/exceptions.c b/platform/jn516x/dev/exceptions.c index e23ff2906..2991de639 100644 --- a/platform/jn516x/dev/exceptions.c +++ b/platform/jn516x/dev/exceptions.c @@ -354,7 +354,7 @@ exception_handler(uint32 *pu32Stack, eExceptionType eType) } #endif - if(eType == E_EXC_SYSCALL){ + if(eType == E_EXC_SYSCALL) { return; } From 1d32a00ebddea746abdca4ff51e7a56233fa93fa Mon Sep 17 00:00:00 2001 From: Mohamed Seliem Date: Thu, 7 Jul 2016 12:03:53 +0200 Subject: [PATCH 330/345] Fix uip-ds.h table configuration comment this PR to update uip-ds.h comments, this small change is made to ease the track of Tables implementation places remove definition of UIP_CONF_DS6_ROUTE_NBU retire 2 old macros DS6_NBR_NBU, DS6_ROUTE_NBU Update uip-ds6.h Update contiki-conf.h Update contiki-conf.h Update contiki-conf.h fix doxygen comment Update uip-ds6.h --- core/net/ipv6/uip-ds6-route.h | 10 +++------- core/net/ipv6/uip-ds6.h | 2 ++ examples/ipv6/multicast/project-conf.h | 8 ++++---- platform/mbxxx/contiki-conf.h | 2 +- platform/seedeye/contiki-conf.h | 2 +- platform/stm32nucleo-spirit1/contiki-conf.h | 6 +++--- 6 files changed, 14 insertions(+), 16 deletions(-) diff --git a/core/net/ipv6/uip-ds6-route.h b/core/net/ipv6/uip-ds6-route.h index 6855fc2cd..d6f88e943 100644 --- a/core/net/ipv6/uip-ds6-route.h +++ b/core/net/ipv6/uip-ds6-route.h @@ -82,14 +82,10 @@ void uip_ds6_notification_rm(struct uip_ds6_notification *n); #endif /* Routing table */ -#ifndef UIP_CONF_MAX_ROUTES -#ifdef UIP_CONF_DS6_ROUTE_NBU -#define UIP_DS6_ROUTE_NB UIP_CONF_DS6_ROUTE_NBU -#else /* UIP_CONF_DS6_ROUTE_NBU */ -#define UIP_DS6_ROUTE_NB 4 -#endif /* UIP_CONF_DS6_ROUTE_NBU */ -#else /* UIP_CONF_MAX_ROUTES */ +#ifdef UIP_CONF_MAX_ROUTES #define UIP_DS6_ROUTE_NB UIP_CONF_MAX_ROUTES +#else /* UIP_CONF_MAX_ROUTES */ +#define UIP_DS6_ROUTE_NB 4 #endif /* UIP_CONF_MAX_ROUTES */ /** \brief define some additional RPL related route state and diff --git a/core/net/ipv6/uip-ds6.h b/core/net/ipv6/uip-ds6.h index 294eb230c..8803729a0 100644 --- a/core/net/ipv6/uip-ds6.h +++ b/core/net/ipv6/uip-ds6.h @@ -56,6 +56,8 @@ * - the number of elements requested by the user in contiki configuration (name suffixed by _NBU) * - the number of elements assigned by the system (name suffixed by _NBS) * - the total number of elements is the sum (name suffixed by _NB) + * The routing table definitions can be found in uip-ds6-route.h + * The Neighbor cache definitions can be found in nbr-table.h */ /* Default router list */ diff --git a/examples/ipv6/multicast/project-conf.h b/examples/ipv6/multicast/project-conf.h index 8df6d01b4..0c47ab538 100644 --- a/examples/ipv6/multicast/project-conf.h +++ b/examples/ipv6/multicast/project-conf.h @@ -60,9 +60,9 @@ #define UIP_CONF_TCP 0 /* Code/RAM footprint savings so that things will fit on our device */ -#undef UIP_CONF_DS6_NBR_NBU -#undef UIP_CONF_DS6_ROUTE_NBU -#define UIP_CONF_DS6_NBR_NBU 10 -#define UIP_CONF_DS6_ROUTE_NBU 10 +#undef NBR_TABLE_CONF_MAX_NEIGHBORS +#undef UIP_CONF_MAX_ROUTES +#define NBR_TABLE_CONF_MAX_NEIGHBORS 10 +#define UIP_CONF_MAX_ROUTES 10 #endif /* PROJECT_CONF_H_ */ diff --git a/platform/mbxxx/contiki-conf.h b/platform/mbxxx/contiki-conf.h index 1d2b17322..4b1e3aac6 100644 --- a/platform/mbxxx/contiki-conf.h +++ b/platform/mbxxx/contiki-conf.h @@ -109,7 +109,7 @@ #define QUEUEBUF_CONF_NUM 2 #define QUEUEBUF_CONF_REF_NUM 0 #define NBR_TABLE_CONF_MAX_NEIGHBORS 4 -#define UIP_CONF_DS6_ROUTE_NBU 4 +#define UIP_CONF_MAX_ROUTES 4 #define RPL_CONF_MAX_PARENTS_PER_DAG 4 #define RPL_CONF_MAX_INSTANCES 1 #define RPL_CONF_MAX_DAG_PER_INSTANCE 1 diff --git a/platform/seedeye/contiki-conf.h b/platform/seedeye/contiki-conf.h index d58ff686d..de0d18c57 100644 --- a/platform/seedeye/contiki-conf.h +++ b/platform/seedeye/contiki-conf.h @@ -93,7 +93,7 @@ typedef uint32_t rtimer_clock_t; /* IPv6 configuration options */ #define NETSTACK_CONF_WITH_IPV6 1 #define NBR_TABLE_CONF_MAX_NEIGHBORS 20 /* number of neighbors */ -#define UIP_CONF_DS6_ROUTE_NBU 20 /* number of routes */ +#define UIP_CONF_MAX_ROUTES 20 /* number of routes */ #define UIP_CONF_ND6_SEND_RA 0 #define UIP_CONF_ND6_REACHABLE_TIME 600000 #define UIP_CONF_ND6_RETRANS_TIMER 10000 diff --git a/platform/stm32nucleo-spirit1/contiki-conf.h b/platform/stm32nucleo-spirit1/contiki-conf.h index 9a97ab355..43a3d8d9f 100644 --- a/platform/stm32nucleo-spirit1/contiki-conf.h +++ b/platform/stm32nucleo-spirit1/contiki-conf.h @@ -85,9 +85,9 @@ #define UIP_CONF_ROUTER 1 /* configure number of neighbors and routes */ -#ifndef UIP_CONF_DS6_ROUTE_NBU -#define UIP_CONF_DS6_ROUTE_NBU 30 -#endif /* UIP_CONF_DS6_ROUTE_NBU */ +#ifndef UIP_CONF_MAX_ROUTES +#define UIP_CONF_MAX_ROUTES 30 +#endif /* UIP_CONF_MAX_ROUTES */ #define UIP_CONF_ND6_SEND_RA 0 #define UIP_CONF_ND6_REACHABLE_TIME 600000 /* 90000// 600000 */ From ddae68bce366995ea611932acf5bf54d1188eebf Mon Sep 17 00:00:00 2001 From: Khaled Qorany Date: Tue, 6 Sep 2016 11:24:17 +0200 Subject: [PATCH 331/345] Referring to the ESMRF engine that was recently merged --- core/net/ipv6/multicast/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/net/ipv6/multicast/README.md b/core/net/ipv6/multicast/README.md index 7a33fca0f..e65c39f6a 100644 --- a/core/net/ipv6/multicast/README.md +++ b/core/net/ipv6/multicast/README.md @@ -7,8 +7,14 @@ What does it do These files, alongside some core modifications, add support for IPv6 multicast to contiki's uIPv6 engine. -Currently, two modes are supported: +Currently, three modes are supported: +* 'Enhanced Stateless Multicast RPL Forwarding' (ESMRF) + ESMRF is an enhanced version of the SMRF engine with the aim + of resolving the sending limitation of SMRF to allow any node + within the DODAG to send multicast traffic up and down the RPL tree. + ESMRF is documented here: + http://dl.acm.org/citation.cfm?id=2753479 * 'Stateless Multicast RPL Forwarding' (SMRF) RPL in MOP 3 handles group management as per the RPL docs, SMRF is a lightweight engine which handles datagram forwarding. From 980de99472e40cabcf40a25ba00be18716d3ce48 Mon Sep 17 00:00:00 2001 From: Antonio Lignan Date: Tue, 13 Sep 2016 15:15:11 +0200 Subject: [PATCH 332/345] Zoul: Removed misplaced project target --- examples/zolertia/zoul/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/zolertia/zoul/Makefile b/examples/zolertia/zoul/Makefile index c5e99f92c..c06984c73 100644 --- a/examples/zolertia/zoul/Makefile +++ b/examples/zolertia/zoul/Makefile @@ -1,11 +1,11 @@ DEFINES+=PROJECT_CONF_H=\"project-conf.h\" -CONTIKI_PROJECT = zoul-demo test-tsl2563 test-sht25 test-power-mgmt +CONTIKI_PROJECT = zoul-demo test-tsl2563 test-sht25 test-servo.c CONTIKI_PROJECT += test-bmp085-bmp180 test-motion test-rotation-sensor CONTIKI_PROJECT += test-grove-light-sensor test-grove-loudness-sensor CONTIKI_PROJECT += test-weather-meter test-grove-gyro test-lcd test-iaq CONTIKI_PROJECT += test-pm10-sensor test-vac-sensor test-aac-sensor -CONTIKI_PROJECT += test-zonik test-dht22.c test-ac-dimmer.c test-servo.c +CONTIKI_PROJECT += test-zonik test-dht22.c test-ac-dimmer.c CONTIKI_TARGET_SOURCEFILES += tsl2563.c sht25.c bmpx8x.c motion-sensor.c CONTIKI_TARGET_SOURCEFILES += adc-sensors.c weather-meter.c grove-gyro.c From c663bb527ebc7dbb3518663d5a4cb083a118bd11 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Fri, 16 Sep 2016 14:12:37 +0200 Subject: [PATCH 333/345] add UIP_CONF_ROUTER to project.conf --- examples/osd/triggerbaord/project-conf.h | 3 +++ platform/osd-merkur-128/contiki-conf.h | 1 - platform/osd-merkur-256/contiki-conf.h | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/osd/triggerbaord/project-conf.h b/examples/osd/triggerbaord/project-conf.h index 62e1d8d2b..230f9ba0b 100644 --- a/examples/osd/triggerbaord/project-conf.h +++ b/examples/osd/triggerbaord/project-conf.h @@ -38,6 +38,9 @@ #define LOOP_INTERVAL (10 * CLOCK_SECOND) +/* Seeping nodes are host nodes without routing features */ +#define UIP_CONF_ROUTER 0 + /* For Debug: Dont allow MCU sleeping between channel checks */ //#undef RDC_CONF_MCU_SLEEP //#define RDC_CONF_MCU_SLEEP 0 diff --git a/platform/osd-merkur-128/contiki-conf.h b/platform/osd-merkur-128/contiki-conf.h index 638145710..553864b30 100644 --- a/platform/osd-merkur-128/contiki-conf.h +++ b/platform/osd-merkur-128/contiki-conf.h @@ -275,7 +275,6 @@ typedef unsigned short uip_stats_t; /* ************************************************************************** */ #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 diff --git a/platform/osd-merkur-256/contiki-conf.h b/platform/osd-merkur-256/contiki-conf.h index e66aac285..5d4def29f 100644 --- a/platform/osd-merkur-256/contiki-conf.h +++ b/platform/osd-merkur-256/contiki-conf.h @@ -276,7 +276,6 @@ typedef unsigned short uip_stats_t; /* ************************************************************************** */ #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 From fd12dcccf081df1c8115e0b8ed0f06c9323f0339 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Fri, 16 Sep 2016 14:31:38 +0200 Subject: [PATCH 334/345] bugfix minimal push button time --- cpu/avr/dev/button-sensor.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/cpu/avr/dev/button-sensor.c b/cpu/avr/dev/button-sensor.c index 14b959d2e..68569ec4f 100644 --- a/cpu/avr/dev/button-sensor.c +++ b/cpu/avr/dev/button-sensor.c @@ -12,6 +12,7 @@ static struct timer debouncetimer; static int status(int type); static int enabled = 0; volatile static int bstate; +volatile static int bstatei; struct sensors_sensor *sensors[1]; unsigned char sensors_flags[1]; @@ -22,18 +23,18 @@ unsigned char sensors_flags[1]; /*---------------------------------------------------------------------------*/ ISR(INT4_vect) { - -// leds_toggle(LEDS_RED); if(BUTTON_CHECK_IRQ()) { + bstatei = (PINE & _BV(PE4) ? 0 : 1); if(timer_expired(&debouncetimer)) { - // led1_on(); - timer_set(&debouncetimer, CLOCK_SECOND / 8); +// led1_on(); + timer_set(&debouncetimer, CLOCK_SECOND / 16); bstate = (PINE & _BV(PE4) ? 0 : 1); - sensors_changed(&button_sensor); + if(bstate == bstatei){ + sensors_changed(&button_sensor); + } // led1_off(); } } - } /*---------------------------------------------------------------------------*/ From 5de29079aedb5749f6ac9c20c0de65a6d60f20ca Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Fri, 16 Sep 2016 16:18:02 +0200 Subject: [PATCH 335/345] bugfix switch netstack mode --- apps/arduino/arduino-process.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/arduino/arduino-process.c b/apps/arduino/arduino-process.c index 8cda5a0ae..56a04d50d 100644 --- a/apps/arduino/arduino-process.c +++ b/apps/arduino/arduino-process.c @@ -56,6 +56,7 @@ #include "adc.h" #include "hw-arduino.h" #include "contiki.h" +#include "net/netstack.h" #define DEBUG 0 #if DEBUG @@ -110,20 +111,26 @@ PROCESS(arduino_sketch, "Arduino Sketch Wrapper"); #define LOOP_INTERVAL (1 * CLOCK_SECOND) #endif +#ifndef SLEEP_NETWORK_INTERVAL +#define SLEEP_NETWORK_INTERVAL (60 * CLOCK_SECOND) +#endif + PROCESS_THREAD(arduino_sketch, ev, data) { static struct etimer loop_periodic_timer; - + static struct etimer network_off_periodic_timer; PROCESS_BEGIN(); adc_init (); mcu_sleep_init (); setup (); /* Define application-specific events here. */ etimer_set(&loop_periodic_timer, LOOP_INTERVAL); + etimer_set(&network_off_periodic_timer, SLEEP_NETWORK_INTERVAL); while (1) { PROCESS_WAIT_EVENT(); #if PLATFORM_HAS_BUTTON if(ev == sensors_event && data == &button_sensor) { + NETSTACK_MAC.off(1); mcu_sleep_off(); PRINTF("*******BUTTON*******\n"); @@ -136,11 +143,16 @@ PROCESS_THREAD(arduino_sketch, ev, data) } #endif /* PLATFORM_HAS_BUTTON */ - if(etimer_expired(&loop_periodic_timer)) { - mcu_sleep_off(); - loop (); - mcu_sleep_on(); - etimer_reset(&loop_periodic_timer); + if(etimer_expired(&network_off_periodic_timer)) { +// NETSTACK_MAC.off(0); + NETSTACK_MAC.on(); + etimer_reset(&network_off_periodic_timer); + } + if(etimer_expired(&loop_periodic_timer)) { + mcu_sleep_off(); + loop (); + mcu_sleep_on(); + etimer_reset(&loop_periodic_timer); } } PROCESS_END(); From 28f2b2caa8b71f087bd11a562c47559afc6e9909 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Tue, 20 Sep 2016 21:20:34 +0200 Subject: [PATCH 336/345] add coap client function --- examples/osd/triggerbaord/sketch.pde | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/examples/osd/triggerbaord/sketch.pde b/examples/osd/triggerbaord/sketch.pde index 0c4845d5b..9c7ce0709 100755 --- a/examples/osd/triggerbaord/sketch.pde +++ b/examples/osd/triggerbaord/sketch.pde @@ -13,6 +13,7 @@ extern "C" { #include "arduino-process.h" #include "rest-engine.h" +#include "er-coap-engine.h" #include "net/netstack.h" #include "dev/button-sensor.h" @@ -31,6 +32,17 @@ uint8_t bled_pin=7; uint8_t bled_status; } +#define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT) +// should be the same :-) +#define UIP_NTOHS(x) UIP_HTONS(x) +#define SERVER_NODE(ip) \ + uip_ip6addr(ip,0xfe80,0,0,0,0,0,0,0x01) + +uip_ipaddr_t server_ipaddr, tmp_addr; +char server_resource [20] = "button"; + +extern int32_t event_counter; + void setup (void) { // switch off the led @@ -45,6 +57,7 @@ void setup (void) SENSORS_ACTIVATE(button_sensor); // init coap resourcen rest_init_engine (); + SERVER_NODE (&server_ipaddr); #pragma GCC diagnostic ignored "-Wwrite-strings" rest_activate_resource (&res_led, "s/led"); rest_activate_resource (&res_bled, "s/bled"); @@ -53,9 +66,31 @@ void setup (void) rest_activate_resource(&res_event, "s/button"); #pragma GCC diagnostic pop +// mcu_sleep_set(64); NETSTACK_MAC.off(1); } +int coap_server_post(void) +{ + static coap_packet_t request [1]; /* Array: treat as pointer */ + char buf [9]; + coap_transaction_t *transaction; + int buttonstate = button_sensor.value(0); + sprintf (buf, "state=%d&event=%lu",buttonstate,event_counter); +// printf ("%s\n", buf); + coap_init_message (request, COAP_TYPE_NON, COAP_PUT, 0); + coap_set_header_uri_path (request, server_resource); + coap_set_header_content_format (request, REST.type.TEXT_PLAIN); + coap_set_payload (request, buf, strlen (buf)); + request->mid = coap_get_mid (); + transaction = coap_new_transaction + (request->mid, &server_ipaddr, REMOTE_PORT); + transaction->packet_len = coap_serialize_message + (request, transaction->packet); + coap_send_transaction (transaction); + return 0; +} + void loop (void) { From 8b1745214c5c529c0cecc2249f373d1e6329023f Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Tue, 20 Sep 2016 21:22:11 +0200 Subject: [PATCH 337/345] bugfix answear speed --- examples/osd/rpl-border-router/project-conf.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/osd/rpl-border-router/project-conf.h b/examples/osd/rpl-border-router/project-conf.h index d02caa0f1..2299703d4 100644 --- a/examples/osd/rpl-border-router/project-conf.h +++ b/examples/osd/rpl-border-router/project-conf.h @@ -31,6 +31,9 @@ #ifndef PROJECT_ROUTER_CONF_H_ #define PROJECT_ROUTER_CONF_H_ +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 + #ifndef UIP_FALLBACK_INTERFACE #define UIP_FALLBACK_INTERFACE rpl_interface #endif From ae790611827445d19a3ba7cd072db8b30dd878c7 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Fri, 23 Sep 2016 14:59:30 +0200 Subject: [PATCH 338/345] bugfix powercyle and sleep mcu timing --- core/net/mac/contikimac/contikimac.c | 5 ++--- cpu/avr/radio/rf230bb/rf230bb.c | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/core/net/mac/contikimac/contikimac.c b/core/net/mac/contikimac/contikimac.c index 7912fe7dd..3c3e76429 100644 --- a/core/net/mac/contikimac/contikimac.c +++ b/core/net/mac/contikimac/contikimac.c @@ -502,10 +502,9 @@ powercycle(struct rtimer *t, void *ptr) ensure an occasional wake cycle or foreground processing will be blocked until a packet is detected */ #if RDC_CONF_MCU_SLEEP - static uint8_t sleepcycle; - if((sleepcycle++ < mcusleepcycle) && !we_are_sending && !radio_is_on) { - rtimer_arch_sleep(RTIMER_NOW() - cycle_start); + if((sleepcycle++ < mcusleepcycle) && !we_are_sending && !radio_is_on && !(NETSTACK_RADIO.receiving_packet() || NETSTACK_RADIO.pending_packet())) { + rtimer_arch_sleep(cycle_start - RTIMER_NOW()); } else { sleepcycle = 0; #ifndef RDC_CONF_PT_YIELD_OFF diff --git a/cpu/avr/radio/rf230bb/rf230bb.c b/cpu/avr/radio/rf230bb/rf230bb.c index 624018f36..6f5c5e47d 100644 --- a/cpu/avr/radio/rf230bb/rf230bb.c +++ b/cpu/avr/radio/rf230bb/rf230bb.c @@ -1796,8 +1796,8 @@ rf230_cca(void) // if (cca & 0x40) {/*DEBUGFLOW('3')*/;} else {rf230_pending=1;DEBUGFLOW('4');} if (cca & 0x40) { // DEBUGFLOW('5'); -// return 1; - return 0; + return 1; +// return 0; } else { // DEBUGFLOW('6'); busyexit: From 916bebd1026f877d8aaaf78b695b03c37608f9bd Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Mon, 26 Sep 2016 21:04:05 +0200 Subject: [PATCH 339/345] reduce power consumtion --- examples/osd/arduino-htu21/project-conf.h | 2 +- examples/osd/arduino-htu21/sketch.pde | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/osd/arduino-htu21/project-conf.h b/examples/osd/arduino-htu21/project-conf.h index e25aed53c..b52067590 100644 --- a/examples/osd/arduino-htu21/project-conf.h +++ b/examples/osd/arduino-htu21/project-conf.h @@ -38,7 +38,7 @@ #define SICSLOWPAN_CONF_FRAG 1 -#define LOOP_INTERVAL (10 * CLOCK_SECOND) +#define LOOP_INTERVAL (30 * CLOCK_SECOND) /* Save energy */ //#define RDC_CONF_PT_YIELD_OFF diff --git a/examples/osd/arduino-htu21/sketch.pde b/examples/osd/arduino-htu21/sketch.pde index 4ea3500ea..54ebfcaf6 100644 --- a/examples/osd/arduino-htu21/sketch.pde +++ b/examples/osd/arduino-htu21/sketch.pde @@ -42,10 +42,12 @@ void setup (void) rest_activate_resource (&res_htu21dtemp, "s/temp"); rest_activate_resource (&res_htu21dhum, "s/hum"); rest_activate_resource (&res_battery, "s/battery"); + + // mcu_sleep_set(64); } // at project-conf.h -// LOOP_INTERVAL (10 * CLOCK_SECOND) +// LOOP_INTERVAL (30 * CLOCK_SECOND) void loop (void) { mcu_sleep_off(); From a37fd79426873ee64bd65912b8896c4a795229c6 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Mon, 26 Sep 2016 21:06:14 +0200 Subject: [PATCH 340/345] disable mcusleep --- examples/osd/arduino-ledstrip/project-conf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/osd/arduino-ledstrip/project-conf.h b/examples/osd/arduino-ledstrip/project-conf.h index e9408e312..574e15250 100644 --- a/examples/osd/arduino-ledstrip/project-conf.h +++ b/examples/osd/arduino-ledstrip/project-conf.h @@ -39,8 +39,8 @@ #define SICSLOWPAN_CONF_FRAG 1 /* For Debug: Dont allow MCU sleeping between channel checks */ -//#undef RDC_CONF_MCU_SLEEP -//#define RDC_CONF_MCU_SLEEP 0 +#undef RDC_CONF_MCU_SLEEP +#define RDC_CONF_MCU_SLEEP 0 /* Disabling RDC for demo purposes. Core updates often require more memory. */ /* For projects, optimize memory and enable RDC again. */ From 0fd28e05850318b7e96fa745d2e67cbcdef8af5c Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Sun, 16 Oct 2016 22:02:54 +0200 Subject: [PATCH 341/345] remove PT_YIELD to habe better ping sync --- core/net/mac/contikimac/contikimac.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/net/mac/contikimac/contikimac.c b/core/net/mac/contikimac/contikimac.c index 3c3e76429..7380be168 100644 --- a/core/net/mac/contikimac/contikimac.c +++ b/core/net/mac/contikimac/contikimac.c @@ -481,8 +481,8 @@ powercycle(struct rtimer *t, void *ptr) break; } - schedule_powercycle(t, CCA_CHECK_TIME + CCA_SLEEP_TIME); - PT_YIELD(&pt); + // schedule_powercycle(t, CCA_CHECK_TIME + CCA_SLEEP_TIME); + // PT_YIELD(&pt); } if(radio_is_on) { if(!(NETSTACK_RADIO.receiving_packet() || From 47760c57e60115852ff7dbb48d4d5197abef1701 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Sun, 16 Oct 2016 22:08:18 +0200 Subject: [PATCH 342/345] add parameter to save more power --- examples/osd/arduino-merkurboard/project-conf.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/osd/arduino-merkurboard/project-conf.h b/examples/osd/arduino-merkurboard/project-conf.h index 2d5781ca4..491c0c530 100644 --- a/examples/osd/arduino-merkurboard/project-conf.h +++ b/examples/osd/arduino-merkurboard/project-conf.h @@ -36,6 +36,9 @@ //#define PLATFORM_HAS_BUTTON 1 #define PLATFORM_HAS_BATTERY 1 +/* Save energy */ +//#define RDC_CONF_PT_YIELD_OFF + /* For Debug: Dont allow MCU sleeping between channel checks */ //#undef RDC_CONF_MCU_SLEEP //#define RDC_CONF_MCU_SLEEP 0 From b7b3f0a33aa557c9611ba029a1fa9c10736ff54c Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Wed, 19 Oct 2016 08:32:21 +0200 Subject: [PATCH 343/345] add mcusleep set parameter to save energie --- examples/osd/arduino-htu21/sketch.pde | 1 + examples/osd/arduino-merkurboard/sketch.pde | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/osd/arduino-htu21/sketch.pde b/examples/osd/arduino-htu21/sketch.pde index 54ebfcaf6..610379f92 100644 --- a/examples/osd/arduino-htu21/sketch.pde +++ b/examples/osd/arduino-htu21/sketch.pde @@ -44,6 +44,7 @@ void setup (void) rest_activate_resource (&res_battery, "s/battery"); // mcu_sleep_set(64); + mcu_sleep_set(48); } // at project-conf.h diff --git a/examples/osd/arduino-merkurboard/sketch.pde b/examples/osd/arduino-merkurboard/sketch.pde index 41df5a847..b1acb9318 100644 --- a/examples/osd/arduino-merkurboard/sketch.pde +++ b/examples/osd/arduino-merkurboard/sketch.pde @@ -34,6 +34,7 @@ void setup (void) rest_activate_resource (&res_cputemp, "s/cputemp"); // NETSTACK_MAC.off(1); + // mcu_sleep_set(48); } void loop (void) From 8891a0ec449cbda34503530db5456b12c3273d26 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Wed, 19 Oct 2016 09:45:45 +0200 Subject: [PATCH 344/345] reduce power consumtion --- examples/osd/arduino-htu21/sketch.pde | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/osd/arduino-htu21/sketch.pde b/examples/osd/arduino-htu21/sketch.pde index 610379f92..7c3d9bae8 100644 --- a/examples/osd/arduino-htu21/sketch.pde +++ b/examples/osd/arduino-htu21/sketch.pde @@ -43,8 +43,7 @@ void setup (void) rest_activate_resource (&res_htu21dhum, "s/hum"); rest_activate_resource (&res_battery, "s/battery"); - // mcu_sleep_set(64); - mcu_sleep_set(48); + mcu_sleep_set(128); // Power consumtion 278uA; average over 20 minutes } // at project-conf.h From 54e676343fbe1c0ec7966e5a2c4ed9e0ea5050f2 Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Thu, 20 Oct 2016 15:41:26 +0200 Subject: [PATCH 345/345] set reciever amplifier to -90dB if use nullmac --- platform/osd-merkur-128/contiki-conf.h | 2 +- platform/osd-merkur-256/contiki-conf.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/osd-merkur-128/contiki-conf.h b/platform/osd-merkur-128/contiki-conf.h index 553864b30..0b2d8ebb1 100644 --- a/platform/osd-merkur-128/contiki-conf.h +++ b/platform/osd-merkur-128/contiki-conf.h @@ -174,7 +174,7 @@ typedef unsigned short uip_stats_t; #define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_RADIO rf230_driver /* CCA theshold energy -91 to -61 dBm (default -77). Set this smaller than the $ */ -#define RF230_CONF_CCA_THRES -85 +#define RF230_CONF_CCA_THRES -90 /* 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. */ diff --git a/platform/osd-merkur-256/contiki-conf.h b/platform/osd-merkur-256/contiki-conf.h index 5d4def29f..6c1965274 100644 --- a/platform/osd-merkur-256/contiki-conf.h +++ b/platform/osd-merkur-256/contiki-conf.h @@ -175,7 +175,7 @@ typedef unsigned short uip_stats_t; #define NETSTACK_CONF_FRAMER framer_802154 #define NETSTACK_CONF_RADIO rf230_driver /* CCA theshold energy -91 to -61 dBm (default -77). Set this smaller than the $ */ -#define RF230_CONF_CCA_THRES -85 +#define RF230_CONF_CCA_THRES -90 /* 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. */

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�Z07QoXz$1&*I9V{XB-1-bpK`6GwQZ7 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep new file mode 100644 index 000000000..1996e8fde --- /dev/null +++ b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur.eep @@ -0,0 +1 @@ +:00000001FF From 243fd6f11e5d28e26131ee8e918f8a8115a0a2a5 Mon Sep 17 00:00:00 2001 From: harald42 Date: Fri, 5 Jul 2013 13:46:55 +0200 Subject: [PATCH 071/345] bugfix binarys --- .../er-example-client.c | 4 ++-- .../er-example-client.osd-merkur.eep | 2 +- .../er-example-server.osd-merkur | Bin 418175 -> 422173 bytes .../er-example-server.osd-merkur.eep | 3 +++ platform/osd-merkur/params.h | 6 +++--- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.c b/examples/osd/er-rest-example-merkurboard/er-example-client.c index 20cc507b8..b5abe9f05 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-client.c +++ b/examples/osd/er-rest-example-merkurboard/er-example-client.c @@ -74,7 +74,7 @@ #endif /* TODO: This server address is hard-coded for Cooja. */ -#define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x26D0) /* cooja2 */ +#define SERVER_NODE(ipaddr) uip_ip6addr(ipaddr, 0xfe80, 0, 0, 0, 0x0221, 0x2eff, 0xff00, 0x270d) /* cooja2 */ #define LOCAL_PORT UIP_HTONS(COAP_DEFAULT_PORT+1) #define REMOTE_PORT UIP_HTONS(COAP_DEFAULT_PORT) @@ -127,7 +127,7 @@ PROCESS_THREAD(coap_client_example, ev, data) /* send a request to notify the end of the process */ PRINTF("--Toggle --\n"); - //leds_toggle(LEDS_RED); + leds_toggle(LEDS_RED); /* prepare request, TID is set by COAP_BLOCKING_REQUEST() */ coap_init_message(request, COAP_TYPE_CON, COAP_POST, 0 ); diff --git a/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur.eep b/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur.eep index bd9f1b15e..16392b886 100644 --- a/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur.eep +++ b/examples/osd/er-rest-example-merkurboard/er-example-client.osd-merkur.eep @@ -1,4 +1,4 @@ -:1000000000212EFFFF001EF941544D45474131327A +:1000000000212EFFFF001EFB41544D454741313278 :100010003872666131006C6F63616C686F73740075 :0900200000001AE5CDAB00000060 :00000001FF diff --git a/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur b/examples/osd/er-rest-example-merkurboard/er-example-server.osd-merkur index c736773f55371b3b8ce335b69ff10ec5c04d8581..6d2e9f30f052966e70267cb67715fd6e8a6dcdaa 100755 GIT binary patch delta 137017 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 H?9BULL^<%Z delta 134148 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