diff --git a/examples/osd/powerbox/Makefile b/examples/osd/powerbox/Makefile index d99c2db03..51ec8a2cc 100644 --- a/examples/osd/powerbox/Makefile +++ b/examples/osd/powerbox/Makefile @@ -1,70 +1,38 @@ -all: er-example-server -# use this target explicitly if requried: er-plugtest-server +SERIAL=/dev/ttyUSB0 +ifeq ($(TARGET), osd-merkur) +PLATFORM_FILES= avr-size powerbox.osd-merkur.hex \ + powerbox.osd-merkur.eep +endif - -# 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 +all: powerbox $(PLATFORM_FILES) CONTIKI=../../.. + +# Contiki IPv6 configuration +WITH_UIP6=1 +UIP_CONF_IPV6=1 +CFLAGS += -DUIP_CONF_IPV6=1 +CFLAGS += -DUIP_CONF_IPV6_RPL=1 + 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 +# automatically build RESTful resources +REST_RESOURCES_DIR = ./resources +REST_RESOURCES_DIR_COMMON = ../resources-common +REST_RESOURCES_FILES= $(notdir \ + $(shell find $(REST_RESOURCES_DIR_COMMON) -name '*.c') \ + ) + +PROJECTDIRS += $(REST_RESOURCES_DIR_COMMON) +PROJECT_SOURCEFILES += $(REST_RESOURCES_FILES) # 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 +# REST Engine shall use Erbium CoAP implementation +APPS += er-coap +APPS += rest-engine +APPS += json json-resource # optional rules to get assembly #CUSTOM_RULE_C_TO_OBJECTDIR_O = 1 @@ -72,6 +40,16 @@ APPS += erbium include $(CONTIKI)/Makefile.include +# minimal-net target is currently broken in Contiki +ifeq ($(TARGET), minimal-net) +CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\" +${info INFO: compiling with large buffers} +CFLAGS += -DUIP_CONF_BUFFER_SIZE=1300 +CFLAGS += -DREST_MAX_CHUNK_SIZE=1024 +CFLAGS += -DCOAP_MAX_HEADER_SIZE=176 +CFLAGS += -DUIP_CONF_IPV6_RPL=0 +endif + # optional rules to get assembly #$(OBJECTDIR)/%.o: asmdir/%.S # $(CC) $(CFLAGS) -MMD -c $< -o $@ @@ -88,7 +66,29 @@ 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 + sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 -p 60001 aaaa::1/64 + +connect-router-native: $(CONTIKI)/examples/ipv6/native-border-router/border-router.native + sudo $(CONTIKI)/exmples/ipv6/native-border-router/border-router.native -a 127.0.0.1 -p 60001 aaaa::1/64 connect-minimal: - sudo ip address add fdfd::1/64 dev tap0 + sudo ip address add fdfd::1/64 dev tap0 + +avr-size: powerbox.osd-merkur + avr-size -C --mcu=MCU=atmega128rfa1 powerbox.osd-merkur + +powerbox.osd-merkur.hex: powerbox.osd-merkur + avr-objcopy -j .text -j .data -O ihex powerbox.osd-merkur \ + powerbox.osd-merkur.hex + +powerbox.osd-merkur.eep: powerbox.osd-merkur + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O ihex \ + powerbox.osd-merkur powerbox.osd-merkur.eep + +flash: powerbox.osd-merkur.hex powerbox.osd-merkur.eep + avrdude -pm128rfa1 -c arduino -P$(SERIAL) -b57600 -e -U \ + flash:w:powerbox.osd-merkur.hex:a -U \ + eeprom:w:powerbox.osd-merkur.eep:a + +.PHONY: flash avr-size diff --git a/examples/osd/powerbox/README b/examples/osd/powerbox/README deleted file mode 100644 index 84d7dd2f4..000000000 --- a/examples/osd/powerbox/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/powerbox/er-example-server.c b/examples/osd/powerbox/er-example-server.c deleted file mode 100644 index 253705154..000000000 --- a/examples/osd/powerbox/er-example-server.c +++ /dev/null @@ -1,430 +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) 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 -} - -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(); - - } /* while (1) */ - PROCESS_END(); -} diff --git a/examples/osd/powerbox/flash.sh b/examples/osd/powerbox/flash.sh index e92d472f6..2b14c43f4 100755 --- a/examples/osd/powerbox/flash.sh +++ b/examples/osd/powerbox/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 +make flash TARGET=osd-merkur diff --git a/examples/osd/powerbox/powerbox.c b/examples/osd/powerbox/powerbox.c new file mode 100644 index 000000000..3c9b359e5 --- /dev/null +++ b/examples/osd/powerbox/powerbox.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2015, 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. + */ + +/** + * \file + * LED-strip driver for Seeed Studio LED-Strip + * \author + * Ralf Schlatterbeck + */ + +#include +#include +#include +#include +#include "contiki.h" +#include "contiki-net.h" +#include "rest-engine.h" +#include "generic_resource.h" + +/* + * Resources to be activated need to be imported through the extern keyword. + * The build system automatically compiles the resources in the + * corresponding sub-directory. + */ + +#if PLATFORM_HAS_BATTERY +#include "dev/battery-sensor.h" +extern resource_t res_battery; +#endif + +#if PLATFORM_HAS_RADIO +#include "dev/radio-sensor.h" +extern resource_t res_radio; +#endif + +#include "dev/relay-sensor.h" + +GENERIC_RESOURCE + ( rel1 + , REL_1 + , s + , state_from_string + , state_to_string + ); + +PROCESS(bowerbox, "POWERBOX Example"); +AUTOSTART_PROCESSES(&bowerbox); + +PROCESS_THREAD(bowerbox, ev, data) +{ + + PROCESS_BEGIN(); + + /* Initialize the REST engine. */ + rest_init_engine (); + printf ("Initialized\n"); + + /* Activate the application-specific resources. */ +#if PLATFORM_HAS_BATTERY + SENSORS_ACTIVATE(battery_sensor); + rest_activate_resource (&res_battery,"s/battery"); +#endif + + SENSORS_ACTIVATE(relay_sensor); + + /* Define application-specific events here. */ + /* Don't do anything for now, everything done in resources */ + while(1) { + PROCESS_WAIT_EVENT(); + } /* while (1) */ + + PROCESS_END(); +} diff --git a/examples/osd/powerbox/project-conf.h b/examples/osd/powerbox/project-conf.h index b1410c36c..af40cac78 100644 --- a/examples/osd/powerbox/project-conf.h +++ b/examples/osd/powerbox/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 @@ -32,9 +32,13 @@ #ifndef PROJECT_ERBIUM_CONF_H_ #define PROJECT_ERBIUM_CONF_H_ -#define PLATFORM_HAS_LEDS 1 -#define PLATFORM_HAS_RELAY 1 +#define PLATFORM_HAS_INFO 1 #define PLATFORM_HAS_BATTERY 1 +#define PLATFORM_HAS_DS1820 1 +#define PLATFORM_HAS_DHT11HUM 1 +//#define PLATFORM_HAS_DHT11TEMP 1 +#define PLATFORM_HAS_LEDS 1 + /* Some platforms have weird includes. */ #undef IEEE802154_CONF_PANID @@ -57,7 +61,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 640 +#define UIP_CONF_BUFFER_SIZE 256 /* Multiplies with chunk size, be aware of memory constraints. */ @@ -77,18 +81,18 @@ */ /* 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 diff --git a/examples/osd/powerbox/run.sh b/examples/osd/powerbox/run.sh index 2efd2cf48..295a9ab1d 100755 --- a/examples/osd/powerbox/run.sh +++ b/examples/osd/powerbox/run.sh @@ -3,6 +3,3 @@ # 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/powerbox/server-client.csc b/examples/osd/powerbox/server-client.csc deleted file mode 100644 index 8c45fdf02..000000000 --- a/examples/osd/powerbox/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/powerbox/server-only.csc b/examples/osd/powerbox/server-only.csc deleted file mode 100644 index d5eee34d6..000000000 --- a/examples/osd/powerbox/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/powerbox/todo b/examples/osd/powerbox/todo deleted file mode 100644 index 0a1f20ba2..000000000 --- a/examples/osd/powerbox/todo +++ /dev/null @@ -1,3 +0,0 @@ - -*) leds-sensor get -*) EmbedVM integration