--- /dev/null
+/*
+ * Copyright (c) 2007 Matus Harvan
+ * All rights reserved
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "Timer.h"
+
+#define min(a,b) ( (a>b) ? b : a )
+#define max(a,b) ( (a>b) ? a : b )
+
+module CliC {
+ uses {
+ interface Leds;
+ interface Boot;
+ interface IP;
+ interface UDPClient;
+ interface SplitControl as IPControl;
+#ifdef ENABLE_SOUNDER
+ interface Mts300Sounder as Sounder;
+#endif /* ENABLE_SOUNDER */
+#ifdef ENABLE_TEMP_SENSOR
+ interface Read<uint16_t> as TempSensorC;
+#endif /* ENABLE_TEMP_SENSOR */
+#ifdef ENABLE_LIGHT_SENSOR
+ interface Read<uint16_t> as LightSensorC;
+#endif /* ENABLE_LIGHT_SENSOR */
+ }
+}
+implementation {
+#ifndef MINIMIZE_MEMORY
+ char *help_buf = "6lowpan cli supported commands:\n"
+ "\tset led {0,1,2} {on,off} -- toggle leds\n"
+#ifdef ENABLE_SOUNDER
+ "\tsounder time_in_ms\n"
+#endif /* ENABLE_SOUNDER */
+#ifdef ENABLE_TEMP_SENSOR
+ "\tget temp\n"
+#endif /* ENABLE_TEMP_SENSOR */
+#ifdef ENABLE_LIGHT_SENSOR
+ "\tget light\n"
+#endif /* ENABLE_LIGHT_SENSOR */
+ "\tsend small udp\n"
+ "\tsend large udp\n"
+ "\thelp\n";
+ char *small_udp_buf = "\n";
+ char *large_udp_buf = "\n";
+ /*
+ char *small_udp_buf = "----- SMALL UDP DATA BUFFER -----\n";
+ char *large_udp_buf =
+ "This is a large testing string. It should undergo " \
+ "6lowpan fragmentation\n" \
+ "0............................................................\n" \
+ "1............................................................\n" \
+ "2............................................................\n" \
+ "3............................................................\n" \
+ "4............................................................\n" \
+ "5............................................................\n" \
+ "6............................................................\n" \
+ "7............................................................\n" \
+ "8............................................................\n" \
+ "9............................................................\n" \
+ "A............................................................\n" \
+ "B............................................................\n" \
+ "C............................................................\n" \
+ "D............................................................\n" \
+ "E............................................................\n" \
+ "10...........................................................\n" \
+ "11...........................................................\n" \
+ "12...........................................................\n" \
+ "13(shorter)\n" \
+ "---- END OF THE LARGE UDP DATA ----\n";
+ */
+#if defined(ENABLE_TEMP_SENSOR) || defined(ENABLE_LIGHT_SENSOR)
+ char sensor_buf[15];
+ bool sensor_buf_busy = FALSE;
+ ip6_addr_t sensor_addr;
+ uint16_t sensor_port;
+#endif /* ENABLE_TEMP_SENSOR | ENABLE_LIGHT_SENSOR */
+#endif /* MINIMIZE_MEMORY */
+
+ event void Boot.booted() {
+ /* set an IP address */
+ ip6_addr_t addr = {{0x20, 0x01,
+ 0x06, 0x38,
+ 0x07, 0x09,
+ 0x12, 0x34,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00, 0x00
+ }};
+ //call IP.setAddress(&addr);
+ call IP.setAddressAutoconf(&addr);
+
+ call IPControl.start();
+ }
+
+ event void IPControl.startDone(error_t err) {
+
+ call UDPClient.listen(1234);
+ }
+ event void IPControl.stopDone(error_t err) {}
+
+ event void UDPClient.receive(const ip6_addr_t *addr, const uint16_t port,
+ uint8_t *buf, uint16_t len )
+ {
+#ifndef MINIMIZE_MEMORY
+ if ( strncmp(buf, "set ", min(len, 4)) == 0 && len>0) {
+ buf += 4;
+ len -= 4;
+ if ( strncmp(buf, "led ", min(len, 4)) == 0 && len>0) {
+ buf += 4;
+ len -= 4;
+
+ if ( strncmp(buf, "0 ", min(len, 2)) == 0 && len>0) {
+ buf += 2;
+ len -= 2;
+ if ( strncmp(buf, "on", min(len, 2)) == 0 && len>0) {
+ call Leds.led0On();
+ } else if (strncmp(buf, "off", min(len, 3)) == 0 && len>0){
+ call Leds.led0Off();
+ }
+ } else if ( strncmp(buf, "1 ", min(len, 2)) == 0 && len>0) {
+ buf += 2;
+ len -= 2;
+ if ( strncmp(buf, "on", min(len, 2)) == 0 && len>0) {
+ call Leds.led1On();
+ } else if (strncmp(buf, "off", min(len, 3)) == 0 && len>0){
+ call Leds.led1Off();
+ }
+ } else if ( strncmp(buf, "2 ", min(len, 2)) == 0 && len>0) {
+ buf += 2;
+ len -= 2;
+ if ( strncmp(buf, "on", min(len, 2)) == 0 && len>0) {
+ call Leds.led2On();
+ } else if (strncmp(buf, "off", min(len, 3)) == 0 && len>0){
+ call Leds.led2Off();
+ }
+ }
+ }
+#ifdef ENABLE_SOUNDER
+ } else if ( strncmp(buf, "sounder ", min(len, 8)) == 0
+ && len>0) {
+ buf += 8;
+ len -= 8;
+ call Sounder.beep(atoi(buf));
+#endif /* ENABLE_SOUNDER */
+
+#ifdef ENABLE_TEMP_SENSOR
+ } else if ( strncmp(buf, "get temp", min(len, 8)) == 0
+ && len>0) {
+ memcpy(&sensor_addr, addr, sizeof(*addr));
+ sensor_port = port;
+ //call UDPClient.sendTo(addr, port, "reading temp...\n", 16);
+ call TempSensorC.read();
+#endif /* ENABLE_TEMP_SENSOR */
+
+#ifdef ENABLE_LIGHT_SENSOR
+ } else if ( strncmp(buf, "get light", min(len, 8)) == 0
+ && len>0) {
+ memcpy(&sensor_addr, addr, sizeof(*addr));
+ sensor_port = port;
+ //call UDPClient.sendTo(addr, port, "reading light...\n", 17);
+ call LightSensorC.read();
+#endif /* ENABLE_LIGHT_SENSOR */
+
+ } else if (strncmp(buf, "send large udp", min(len, 14)) == 0
+ && len>0) {
+ call UDPClient.sendTo(addr, port,
+ large_udp_buf, strlen(large_udp_buf));
+ } else if (strncmp(buf, "send small udp", min(len, 14)) == 0
+ && len>0) {
+ call UDPClient.sendTo(addr, port,
+ small_udp_buf, strlen(small_udp_buf));
+ } else if (strncmp(buf, "help", min(len, 14)) == 0
+ && len>0) {
+ call UDPClient.sendTo(addr, port,
+ help_buf, strlen(help_buf));
+ } else {
+ call UDPClient.sendTo(addr, port,
+ help_buf, strlen(help_buf));
+ }
+#endif /* MINIMIZE_MEMORY */
+ }
+
+ event void UDPClient.sendDone(error_t result, void* buf)
+ {
+#if defined(ENABLE_TEMP_SENSOR) || defined(ENABLE_LIGHT_SENSOR)
+ if (buf == sensor_buf) {
+ sensor_buf_busy = FALSE;
+ }
+#endif /* ENABLE_TEMP_SENSOR | ENABLE_LIGHT_SENSOR */
+ }
+
+#ifdef ENABLE_TEMP_SENSOR
+ event void TempSensorC.readDone(error_t result, uint16_t data) {
+ if (sensor_buf_busy == FALSE) {
+ sensor_buf_busy = TRUE;
+ if (result == SUCCESS) {
+ snprintf(sensor_buf, sizeof(sensor_buf), "temp: %d\n", data);
+ } else {
+ snprintf(sensor_buf, sizeof(sensor_buf), "temp: -\n");
+ }
+ call UDPClient.sendTo(&sensor_addr, sensor_port,
+ sensor_buf, strlen(sensor_buf));
+ } else {
+ call UDPClient.sendTo(&sensor_addr, sensor_port,
+ "busy\n", 5);
+ }
+ }
+#endif /* ENABLE_TEMP_SENSOR */
+
+#ifdef ENABLE_LIGHT_SENSOR
+ event void LightSensorC.readDone(error_t result, uint16_t data) {
+ if (sensor_buf_busy == FALSE) {
+ sensor_buf_busy = TRUE;
+ if (result == SUCCESS) {
+ snprintf(sensor_buf, sizeof(sensor_buf), "light: %d\n", data);
+ } else {
+ snprintf(sensor_buf, sizeof(sensor_buf), "light: -\n");
+ }
+ call UDPClient.sendTo(&sensor_addr, sensor_port,
+ sensor_buf, strlen(sensor_buf));
+ } else {
+ call UDPClient.sendTo(&sensor_addr, sensor_port,
+ "busy\n", 5);
+ }
+ }
+#endif /* ENABLE_LIGHT_SENSOR */
+}