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