diff --git a/examples/er-rest-example/er-example-server.c b/examples/er-rest-example/er-example-server.c index ad922000a..41a07a501 100644 --- a/examples/er-rest-example/er-example-server.c +++ b/examples/er-rest-example/er-example-server.c @@ -76,8 +76,23 @@ extern resource_t extern resource_t res_leds, res_toggle; #endif #if PLATFORM_HAS_LIGHT +#include "dev/light-sensor.h" extern resource_t res_light; #endif +/* +#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 +#if PLATFORM_HAS_SHT11 +#include "dev/sht11/sht11-sensor.h" +extern resource_t res_sht11; +#endif +*/ PROCESS(er_example_server, "Erbium Example Server"); AUTOSTART_PROCESSES(&er_example_server); @@ -123,8 +138,23 @@ PROCESS_THREAD(er_example_server, ev, data) rest_activate_resource(&res_toggle, "actuators/toggle"); #endif #if PLATFORM_HAS_LIGHT -/* rest_activate_resource(&res_light, "sensors/light"); */ + rest_activate_resource(&res_light, "sensors/light"); + SENSORS_ACTIVATE(light_sensor); #endif +/* +#if PLATFORM_HAS_BATTERY + rest_activate_resource(&res_battery, "sensors/battery"); + SENSORS_ACTIVATE(battery_sensor); +#endif +#if PLATFORM_HAS_RADIO + rest_activate_resource(&res_radio, "sensors/radio"); + SENSORS_ACTIVATE(radio_sensor); +#endif +#if PLATFORM_HAS_SHT11 + rest_activate_resource(&res_sht11, "sensors/sht11"); + SENSORS_ACTIVATE(sht11_sensor); +#endif +*/ /* Define application-specific events here. */ while(1) { diff --git a/examples/er-rest-example/resources/res-battery.c b/examples/er-rest-example/resources/res-battery.c index 3024246ed..b82523594 100644 --- a/examples/er-rest-example/resources/res-battery.c +++ b/examples/er-rest-example/resources/res-battery.c @@ -47,7 +47,7 @@ static void res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); /* A simple getter example. Returns the reading from light sensor with a simple etag */ -RESOURCE(battery, +RESOURCE(res_battery, "title=\"Battery status\";rt=\"Battery\"", res_get_handler, NULL, diff --git a/examples/er-rest-example/resources/res-sht11.c b/examples/er-rest-example/resources/res-sht11.c new file mode 100644 index 000000000..56ed86c01 --- /dev/null +++ b/examples/er-rest-example/resources/res-sht11.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2014, Nimbus Centre for Embedded Systems Research, Cork Institute of Technology. + * 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 + * SHT11 Sensor Resource + * + * This is a simple GET resource that returns the temperature in Celsius + * and the humidity reading from the SHT11. + * \author + * Pablo Corbalan + */ + +#include "contiki.h" + +#if PLATFORM_HAS_SHT11 + +#include +#include "rest-engine.h" +#include "dev/sht11/sht11-sensor.h" + +static void res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset); + +/* Get Method Example. Returns the reading from temperature and humidity sensors. */ +RESOURCE(res_sht11, + "title=\"Temperature and Humidity\";rt=\"Sht11\"", + res_get_handler, + NULL, + NULL, + NULL); + +static void +res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) +{ + /* Temperature in Celsius (t in 14 bits resolution at 3 Volts) + * T = -39.60 + 0.01*t + */ + uint16_t temperature = ((sht11_sensor.value(SHT11_SENSOR_TEMP) / 10) - 396) / 10; + /* Relative Humidity in percent (h in 12 bits resolution) + * RH = -4 + 0.0405*h - 2.8e-6*(h*h) + */ + uint16_t rh = sht11_sensor.value(SHT11_SENSOR_HUMIDITY); + + unsigned int accept = -1; + REST.get_header_accept(request, &accept); + + if(accept == -1 || accept == REST.type.TEXT_PLAIN) { + REST.set_header_content_type(response, REST.type.TEXT_PLAIN); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;%u", temperature, rh); + + REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); + } else if(accept == REST.type.APPLICATION_XML) { + REST.set_header_content_type(response, REST.type.APPLICATION_XML); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "", temperature, rh); + + REST.set_response_payload(response, buffer, strlen((char *)buffer)); + } else if(accept == REST.type.APPLICATION_JSON) { + REST.set_header_content_type(response, REST.type.APPLICATION_JSON); + snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'Sht11':{'Temperature':%u,'Humidity':%u}}", temperature, rh); + + 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, application/xml, and application/json"; + REST.set_response_payload(response, msg, strlen(msg)); + } +} +#endif /* PLATFORM_HAS_SHT11 */