From 16c8c3853d9818e08349bed0eeb67fa2585dba9a Mon Sep 17 00:00:00 2001 From: Harald Pichler Date: Fri, 16 Aug 2013 13:21:06 +0200 Subject: [PATCH] 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 zcmc${349bq+CM%W2$@O9WD<@^NJ1tg$T2x40W=^=a6Lf51X&M6Nx~rsas==~QMzYx zO~^4lJ(B?h0d-gL0$vqVSZKrpbS1FvtFo)oNjL%m>BvC91^IoS?sO)B=HNIsck=%{ zt1B+~ck*_|`QN1T2KV+9;d4Je8}aetvl5>b_$ zjH~$xd0*z`D$iH*k0{@k6ub`7Q5-Mtol`WoaOR>VT}tRe$IqU6y=y}4k zmM5OE6fb&u&JsL^>h8FIV(N_}EtALpVT@()GpXJEAF9hOSXeZB%;0BGTfxHFixyZ= z3WW+(dM$J3ESy95K~3mz^}pK|EmFuFytEyFn!wjIuy)q`MW6>Pw9G1gQu&@=yg>Ob zTC!OAo{NSliDg=1iIxEERC0dN(kJFDRFX^QEL=*QB=FKXONt86?D=Te)a$BiFS|rV zu|#{+p65KXpy&w&4Wyv`<-$dQG*azZpD0=|XEypl$vm@QcBeOs7R_IT-XUV1ShQ$q z;i4rSxt1&wL~?V!V4}*4B`Q zHlt@*bZ^hi<-I*R-CCwBf{(8q#|J0M(XvIdNha|UbL{?$IgcfcmpN`|x=nI%tTfa* z+S)^8mFNA8-n*75X)kAx3;k+|+mlAi<>{-3lwVonWgP_$y*D2pR&q;5PphL$a!D@X z+fY`3CYE@l|B3WJLS4dPe18{Od&~{k5u|?%U3r4i4MhC!219gAwUwT6QE^k)9SDsp>z$Jc3sLU@7<(gem0orNs zI!~%Os=>w8jtU1S^$=t1(RPP)gsv@%&>+2LD0y9nV?#qoFqbSZH+rm|koB`x*NK-pR9@mmvQO4i@iRcz1i9OE?B@ z9}RV$bW2g9nrp$S-^yh_t@3h{Xt!L+%sLvj1OQw>z0nyJ8TAdvZzD7Ce%xP zp*u)i%&6O^Q1fpQBdCoDJCMQpq1`E_^1t~0wUA$vy8DF@Y1*&s-rF<*Ir?;pEnEYVW-7&}yvS{?hhd zO252>eyQF~d5j*Dql%%iOdOz*P3aF9O6f4NO&Hk(S*W}n)6KYN&3wqFHdPy#l+wT% z!bm15NYvr4#GeKq&KN#pb}ROUh|KW9D!B@-OrC3tZx^lbRmc#}OJWr|To;!gqdPlit!gZEn|+@-UeY>V{0 z6SLbO@j=MnBlJ^dJM%U(P|WA!P$C{Bj-$j0r9@vqhXOjR3p7x2{!dG#KQ!h-3uqEm z&mZAQ8m_upTt{5>uHCN9uI?p*q~VhX4rbFB_z}GRYWL&Jdue}4dx6n=8sb{xK4FuA5|V@!f!W$K#L?ab>6Kl1sRpnO&b2R;J_ zG|E3?9#4HX^>sl0I_*eKfP(*=dR3aMnCF~Tt$sfNE4bgN$H-?weIz9(jDDvjz^e#I_ZsG;CD#q z%;QgVjQT2N)UW6=>MM?Wx@giqj-W21{v`Vgd#xt^oSA*%35jH=)S>gm_>-l-rS%s- zXCCVU{UP~lPZ*$uouCFeTXai@Aq}cl`jnZ6x9>2M6|F?{ajm40YEN{fY9+Up({wt` z;XkpLS#3O_hUNe@iT>(Tqvwr*M9<^b!PgHAy>1kLf?m*Yb>%vZ%=NBXj84+gRm}HH z|GLTiBfQxcU3Z4R%*Xhm>Z>x{WcngAh#SGB<&DcB&8h19%Z!~9xF8=%;SJnP zTu{lmQYm#ja_haC?xzuQnVHQ!$ra?2zP!kg^zT!2=S8JF$z7{mvTIsH@4d|2&fU+= zz1l+@1ZyuyOluj}QqxixBr=i7B@y0)JGlorT}dnIvV(M@j>^=fCv&5eQZGweQ0kqQ z-6*w6DMk4L6jnyOnD7y!(wXia=gxC4a<6b}(s%95MS5yEle+EJZP#;%_>+(Nzf1ee z$(3e<-?irhb5`rw=4NxTe7U*Ste11e^bn-@+uWFAlfi6PbK??|z2n)l=NxJ5oED1ABwSK@lSo zLcNV`N9%*cQQje5O8;1INy3ytg-BVyp&#fy7CL zLyD!h_9j^y&VRr#{UU=6{y*)#QM7n%-oMm8Hst9cGh>&AtwsJ~DamS(eS3$Bl(v{N zLVC-ty@|?GkhxDtZ@+WzfR1+t*}fNAuRZ5t|8oikrIi24y}bgZH}Nkeq>Uj9n5p9(tYgOBZyA!VNZ+-ilBpw!D@-qz`iQ@u zXD3r!Tz;i1_Mp0h^}k(;#?nruH#KT{)O}E|_42n&UqvJI^Yu|I&?uk!ri~$r)%3Sa zKjmFtAA7ZzShGTVy72Mm=-F-fOOjIA3Fq&%vQ5z()uZ{~DgJ_dDw`7WEwg}M&M(A_ zI$x1LqLg&XBkj`I#^j-e;e1>-ykoCKiu)LqgKHTZxHE21P(+^umGeOg=fjm8idKn; zNzi!Jqpn(5E4+K^Fa5IR##2A`FZ9c&j`Y|2D?h$d9DFLZ->UOBow@~M%>Hqf*v14j zlvZP8k)X<&_uk?n1CLb4}++{Q#YbdHJbJOxbt!^dd35GRboyP4cl zE(71Bds9Dte%r!rD)0BDy`Hus`HkK?;%MeO74t7cU=>om?WJvc4;RPBkyZ$8ug%X$ z5v>W-$Hu&boX~!;!K>T8#cYwvkHu^er_2`dzUowV`ux;aG2dtsG$i%L)cs7rf~h?~ zYxN<;w&KCIj9`QOfLOh4#ybsqZHCaoV-l=5`)Ui42z#Oj39?YC|p8aq0S%HImh zC3W}P+jfDvjd5G!<}gH`p`E^Om}+62uz-mGb@}}l_j4&{S47fTy2iMq|p5<=svUit8G7m?mcmb;_g)Fo(2ndqkgMiqyO&;{gV~? zH}u~M`h6*aN28i-TcW&ocznD%d#ZG=QRrR`x~VU}=>5;QZ#uQAvo5(IbyRAAiy3=N z5}WRl%8OmaJ$*qwy+2YKL~Zhq7nATk)}PofBY3f#i1c{BMS-=pCM!7}5dWI|Lvr!I z(L4Lnen{3vRNvppOJi(4qvq_PjJ-d!_vm~k!2g>%U~105*iy%Fkoec$Kg12de6Y`W zC{8OER2Ta@<*4S) zK4Y?_xNGX{ti{LtX1$-m0=kINIt+ZGS&Ve+rzDveUwU&)$g6Gr+BvvWnb%2P)REby z*n&eNMkkOhs7j;8KXtq)(zXj@c2`%MQ(X^|)w#m8$d%_B=SqkD=@L%Bn{zyrthiFn zB{9B4#qOgyzY_gQ-aN9<)YU=PiymU^PyEy5Ik6He`ltS21b3Qh?r6DHwks&NUZWMR*bbUU5`>106 zj#1hC2wN^c(pGWoMR2S5QI{YMVTB_@Nb^d2Ec~Nk_H-_{#HN?m?8)ZmB5$FM9x5szl`Rbk}iB^GR>RBM)+e=J3v{embfW9<(Hb3mNI%V>6a3lF(lgu7d_H#&A@_ytB_rHB2zD(puNxZ^Wwf$PgDV zDIEGIo@RwPuJ*%sOK3S}VwOK2>bMdva;M1es`9e>lo#ng8(85_hL4eBX4p?9mrKG+ z2bPv!trazzn)_es6&ey7LURbq{}DX8KWr^VLax-<|6H%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