]> oss.titaniummirror.com Git - tinyos-2.x.git/commitdiff
Add new app to test xmts310 sensor driver.
authorpipeng <pipeng>
Thu, 15 Feb 2007 10:23:30 +0000 (10:23 +0000)
committerpipeng <pipeng>
Thu, 15 Feb 2007 10:23:30 +0000 (10:23 +0000)
apps/tests/mica2/mts300/Makefile
apps/tests/mica2/mts300/TestMts300C.nc
apps/tests/mica2/mts300/TestMts300P.nc
apps/tests/mica2/mts300/XMTS300.h [new file with mode: 0644]

index c96ba58dec52a165f726e4f9da7b9c0949152020..3a7dc907d4642e92f7b897fd2d69d4d53777f9f6 100644 (file)
@@ -1,4 +1,4 @@
 COMPONENT=TestMts300C
 SENSORBOARD=mts300
-#CFLAGS += -I%T/sensorboards/mts300
 include $(MAKERULES)
+
index 42c78527422d3d13438bcc5bd3f13cc5570b8d3e..c08f06f9cbad451955e043cef93fe5b8e0a69bba 100644 (file)
@@ -1,55 +1,86 @@
-/**
- *  Copyright (c) 2004-2005 Crossbow Technology, Inc.
- *  All rights reserved.
- *
- *  Permission to use, copy, modify, and distribute this software and its
- *  documentation for any purpose, without fee, and without written
- *  agreement is hereby granted, provided that the above copyright
- *  notice, the (updated) modification history and the author appear in
- *  all copies of this source code.
- *
- *  Permission is also granted to distribute this software under the
- *  standard BSD license as contained in the TinyOS distribution.
- *
- *  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 HOLDERS OR CONTRIBUTORS 
- *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, 
- *  OR PROFITS) 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.
- *
- *  @author Martin Turon <mturon@xbow.com>
- *
- *  $Id$
- */
-
-/**
- * This application tests the mts300 sensorboard.
- * Specifically, this handles the thermistor and light sensors.
- * 
- * @author  Martin Turon
- * @date    October 19, 2005
- */
-configuration TestMts300C {
-}
-implementation
-{
-  components MainC, TestMts300P, LedsC, new OskiTimerMilliC(),
-      SensorMts300C;
-
-  
-  MainC.SoftwareInit -> SensorMts300C;
-
-  TestMts300P -> MainC.Boot;
-  TestMts300P.Leds -> LedsC;
-  TestMts300P.AppTimer -> OskiTimerMilliC;
-
-  TestMts300P.SensorControl -> SensorMts300C;
-  TestMts300P.Temp -> SensorMts300C.Temp;
-  TestMts300P.Light -> SensorMts300C.Light;
-}
-
+// $Id$\r
+\r
+/*\r
+ *  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.\r
+ *  downloading, copying, installing or using the software you agree to\r
+ *  this license.  If you do not agree to this license, do not download,\r
+ *  install, copy or use the software.\r
+ *\r
+ *  Copyright (c) 2004-2006 Crossbow Technology, Inc.\r
+ *  All rights reserved.\r
+ *\r
+ *  Permission to use, copy, modify, and distribute this software and its\r
+ *  documentation for any purpose, without fee, and without written\r
+ *  agreement is hereby granted, provided that the above copyright\r
+ *  notice, the (updated) modification history and the author appear in\r
+ *  all copies of this source code.\r
+ *\r
+ *  Permission is also granted to distribute this software under the\r
+ *  standard BSD license as contained in the TinyOS distribution.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+ *  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\r
+ *  PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE INTEL OR ITS\r
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+ *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
+ *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+/**\r
+ *  TinyOS 1.x to TinyOS 2.x translation layer.\r
+ *\r
+ *  @author Alif <rlchen@xbow.com.cn>  \r
+ */\r
+\r
+#include "XMTS300.h"\r
+#include "mts300.h"\r
+\r
+configuration TestMts300C\r
+{\r
+}\r
+implementation\r
+{\r
+  components MainC, TestMts300P, LedsC, NoLedsC;\r
+  components new TimerMilliC() as MTS300Timer;\r
+\r
+  components ActiveMessageC as Radio;\r
+  components SerialActiveMessageC as Serial;\r
+\r
+// sensorboard devices\r
+  components new SensorMts300C();\r
+  components SounderC;\r
+\r
+  TestMts300P -> MainC.Boot;\r
+\r
+  TestMts300P.MTS300Timer -> MTS300Timer;\r
+  TestMts300P.Leds -> NoLedsC;\r
+\r
+  // communication\r
+  TestMts300P.RadioControl -> Radio;\r
+  TestMts300P.RadioSend -> Radio.AMSend[AM_MTS300MSG];\r
+  TestMts300P.RadioPacket -> Radio;\r
+\r
+  TestMts300P.UartControl -> Serial;\r
+  TestMts300P.UartSend -> Serial.AMSend[AM_MTS300MSG];\r
+  TestMts300P.UartPacket -> Serial;\r
+\r
+  // sensor components\r
+  MainC.SoftwareInit -> SensorMts300C;\r
+  TestMts300P.MTS300Control -> SensorMts300C.StdControl;\r
+  TestMts300P.Vref -> SensorMts300C.Vref;\r
+  TestMts300P.Light -> SensorMts300C.Light;\r
+  TestMts300P.Temp -> SensorMts300C.Temp;\r
+  TestMts300P.Microphone -> SensorMts300C.Microphone;\r
+  TestMts300P.AccelX -> SensorMts300C.AccelX;\r
+  TestMts300P.AccelY -> SensorMts300C.AccelY;\r
+  TestMts300P.MagX -> SensorMts300C.MagX;\r
+  TestMts300P.MagY -> SensorMts300C.MagY;\r
+\r
+  MainC.SoftwareInit -> SounderC;\r
+  TestMts300P.Sounder -> SounderC;\r
+}\r
index ac3ece11cfb683cd0c2029481092f97891cb72ab..2f46d90e27c00fe3641b9ad19ceb1b2f7649405d 100644 (file)
-/**
- *  Copyright (c) 2004-2005 Crossbow Technology, Inc.
- *  All rights reserved.
- *
- *  Permission to use, copy, modify, and distribute this software and its
- *  documentation for any purpose, without fee, and without written
- *  agreement is hereby granted, provided that the above copyright
- *  notice, the (updated) modification history and the author appear in
- *  all copies of this source code.
- *
- *  Permission is also granted to distribute this software under the
- *  standard BSD license as contained in the TinyOS distribution.
- *
- *  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 HOLDERS OR CONTRIBUTORS 
- *  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA, 
- *  OR PROFITS) 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.
- *
- *  @author Martin Turon <mturon@xbow.com>
- *
- *  $Id$
- */
-
-#include "Timer.h"
-
-/**
- * This application tests the mts300 sensorboard.
- * Specifically, this handles the thermistor and light sensors.
- * 
- * @author  Martin Turon
- * @date    October 19, 2005
- */
-module TestMts300P
-{
-    uses {
-       interface Boot;
-       interface Leds;
-       interface Timer<TMilli> as AppTimer;
-
-       interface StdControl as SensorControl;
-       interface AcquireData as Temp;
-       interface AcquireData as Light;
-    }
-}
-implementation
-{
-    event void Boot.booted() {
-       call Leds.led0On();
-       call Leds.led1On();        // power led
-       call SensorControl.start();
-    }
-    
-    event void AppTimer.fired() {
-       call Leds.led0Toggle();    // heartbeat indicator 
-       call Light.getData();
-       call Temp.getData();
-    }
-
-    event void Light.dataReady(uint16_t data) {
-       call Leds.led1Toggle();
-    }
-
-    event void Temp.dataReady(uint16_t data) {
-       call Leds.led2Toggle();
-    }
-
-    event void Light.error(uint16_t info) {
-    }
-
-    event void Temp.error(uint16_t info) {
-    }
-}
-
+// $Id$\r
+\r
+/*\r
+ *  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.\r
+ *  downloading, copying, installing or using the software you agree to\r
+ *  this license.  If you do not agree to this license, do not download,\r
+ *  install, copy or use the software.\r
+ *\r
+ *  Copyright (c) 2004-2006 Crossbow Technology, Inc.\r
+ *  All rights reserved.\r
+ *\r
+ *  Permission to use, copy, modify, and distribute this software and its\r
+ *  documentation for any purpose, without fee, and without written\r
+ *  agreement is hereby granted, provided that the above copyright\r
+ *  notice, the (updated) modification history and the author appear in\r
+ *  all copies of this source code.\r
+ *\r
+ *  Permission is also granted to distribute this software under the\r
+ *  standard BSD license as contained in the TinyOS distribution.\r
+ *\r
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+ *  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\r
+ *  PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE INTEL OR ITS\r
+ *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
+ *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+ *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
+ *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+ *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
+ *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
+ *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+\r
+/**\r
+ *  TinyOS 1.x to TinyOS 2.x translation layer.\r
+ *\r
+ *  @author Alif <rlchen@xbow.com.cn>  \r
+ */\r
\r
+#include "Timer.h"\r
+#include "XMTS300.h"\r
+#include "mts300.h"\r
+\r
+module TestMts300P\r
+{\r
+  uses\r
+  {\r
+    interface Leds;\r
+    interface Boot;\r
+    interface Timer<TMilli> as MTS300Timer;\r
+    // communication\r
+    interface SplitControl as RadioControl;\r
+    interface Packet as RadioPacket;\r
+    interface AMSend as RadioSend;\r
+\r
+    interface SplitControl as UartControl;\r
+    interface Packet as UartPacket;\r
+    interface AMSend as UartSend;\r
+    // sensor components\r
+    interface StdControl as MTS300Control;\r
+    interface StdControl as Sounder;\r
+       interface Read<uint16_t> as Vref; //!< voltage\r
+    interface Read<uint16_t> as Light;\r
+    interface Read<uint16_t> as Temp;\r
+       interface Read<uint16_t> as Microphone; //!< Mic sensor\r
+       interface Read<uint16_t> as AccelX; //!< Accelerometer sensor\r
+       interface Read<uint16_t> as AccelY; //!< Accelerometer sensor\r
+       interface Read<uint16_t> as MagX; //!< magnetometer sensor\r
+       interface Read<uint16_t> as MagY; //!< magnetometer sensor\r
+\r
+  }\r
+}\r
+implementation\r
+{\r
+\r
+  enum\r
+  {\r
+       STATE_IDLE = 0,\r
+       STATE_VREF_START,\r
+       STATE_VREF_READY,      //!< smaple complete\r
+       STATE_LIGHT_START,\r
+       STATE_LIGHT_READY,     //!< smaple complete\r
+       STATE_TEMP_START,\r
+       STATE_TEMP_READY,      //!< smaple complete\r
+       STATE_MIC_START,\r
+       STATE_MIC_READY,      //!< smaple complete\r
+       STATE_ACCELX_START,\r
+       STATE_ACCELX_READY,      //!< smaple complete\r
+       STATE_ACCELY_START,\r
+       STATE_ACCELy_READY,      //!< smaple complete\r
+       STATE_MAGX_START,\r
+       STATE_MAGX_READY,      //!< smaple complete\r
+       STATE_MAGY_START,\r
+       STATE_MAGY_READY,      //!< smaple complete\r
+  };\r
+\r
+  bool sending_packet;\r
+  bool packet_ready;\r
+  uint8_t state;\r
+  uint16_t counter = 0;\r
+  message_t packet;\r
+  Mts300Msg* pMsg;\r
+\r
+  // Zero out the accelerometer, chrl@20070213\r
+  norace uint16_t accel_ave_x, accel_ave_y;\r
+  norace uint8_t accel_ave_points;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  basic control routines\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+  event void Boot.booted()\r
+  {\r
+    sending_packet = FALSE;\r
+    packet_ready = FALSE;\r
+    state = STATE_IDLE;\r
+    pMsg = (Mts300Msg*)call RadioPacket.getPayload(&packet, NULL);\r
+\r
+    // Zero out the accelerometer, chrl@20070213\r
+    accel_ave_x = 0;\r
+    accel_ave_y = 0;\r
+    accel_ave_points = ACCEL_AVERAGE_POINTS;\r
+\r
+    call RadioControl.start();\r
+    call UartControl.start();\r
+  }\r
+\r
+  event void RadioControl.startDone(error_t err)\r
+  {\r
+    if (err != SUCCESS)\r
+    {\r
+      call RadioControl.start();\r
+    }\r
+  }\r
+\r
+  event void RadioControl.stopDone(error_t err)\r
+  {\r
+    // do nothing\r
+  }\r
+\r
+  event void UartControl.startDone(error_t err)\r
+  {\r
+    if (err == SUCCESS)\r
+    {\r
+      call MTS300Control.start();\r
+      call Sounder.start();\r
+      call MTS300Timer.startPeriodic( 300 );\r
+    }\r
+    else\r
+    {\r
+      call UartControl.start();\r
+    }\r
+  }\r
+\r
+  event void UartControl.stopDone(error_t err)\r
+  {\r
+    // do nothing\r
+  }\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//  timer control routines\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+  event void MTS300Timer.fired()\r
+  {\r
+    uint8_t l_state;\r
+    atomic l_state = state;\r
+\r
+    // Zero out the accelerometer, chrl@20070213\r
+    if (accel_ave_points >0)\r
+    {\r
+      if (accel_ave_points == 1)\r
+      {\r
+        call MTS300Timer.stop();\r
+        call MTS300Timer.startPeriodic(1000);\r
+      }\r
+      atomic state = STATE_ACCELX_START;\r
+      call AccelX.read();\r
+      return ;\r
+    }\r
+\r
+    call Leds.led1Toggle();\r
+    counter++;\r
+\r
+    if(counter==1)\r
+    {\r
+      call Sounder.stop();\r
+    }\r
+\r
+    if (sending_packet) return ;\r
+\r
+    if (l_state == STATE_IDLE)\r
+    {\r
+      atomic state = STATE_VREF_START;\r
+      call Vref.read();\r
+      return ;\r
+    }\r
+\r
+    if (packet_ready)\r
+    {\r
+      atomic packet_ready = FALSE;\r
+      // check length of the allocated buffer to see if it is enough for our packet\r
+      if (call RadioPacket.maxPayloadLength() < sizeof(Mts300Msg))\r
+      {\r
+        return ;\r
+      }\r
+      // OK, the buffer is large enough\r
+      //pMsg->vref = counter;\r
+      if (call UartSend.send(AM_BROADCAST_ADDR, &packet, sizeof(Mts300Msg)) == SUCCESS)\r
+      {\r
+        sending_packet = TRUE;\r
+        call Leds.led2On();\r
+      }\r
+    }\r
+  }\r
+\r
+  /**\r
+   * reference voltage data read\r
+   *\r
+   */\r
+  event void Vref.readDone(error_t result, uint16_t data)\r
+  {\r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->vref = data;\r
+    }\r
+    else\r
+    {\r
+      pMsg->vref = 0;\r
+    }\r
+//    atomic packet_ready = TRUE;\r
+      atomic state = STATE_LIGHT_START;\r
+      call Light.read();\r
+  }\r
+\r
+  /**\r
+   * Light data read\r
+   *\r
+   */\r
+  event void Light.readDone(error_t result, uint16_t data)\r
+  {\r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->light = data;\r
+    }\r
+    else\r
+    {\r
+      pMsg->light = 0;\r
+    }\r
+    atomic state = STATE_TEMP_START;\r
+    call Temp.read();\r
+  }\r
+\r
+\r
+  /**\r
+   * Temperature data read\r
+   *\r
+   */\r
+  event void Temp.readDone(error_t result, uint16_t data)\r
+  {\r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->thermistor = data;\r
+    }\r
+    else\r
+    {\r
+      pMsg->thermistor = 0;\r
+    }\r
+    atomic state = STATE_MIC_START;\r
+    call Microphone.read();\r
+  }\r
+\r
+  /**\r
+   * Microphone data read\r
+   *\r
+   */\r
+  event void Microphone.readDone(error_t result, uint16_t data)\r
+  {\r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->mic = data;\r
+    }\r
+    else\r
+    {\r
+      pMsg->mic = 0;\r
+    }\r
+//    atomic packet_ready = TRUE;\r
+    atomic state = STATE_ACCELX_START;\r
+    call AccelX.read();\r
+  }\r
+\r
+  /**\r
+   * AccelX data read\r
+   *\r
+   */\r
+  event void AccelX.readDone(error_t result, uint16_t data)\r
+  {\r
+    // Zero out the accelerometer, chrl@20061207\r
+    if (accel_ave_points>0)\r
+    {\r
+      accel_ave_x = accel_ave_x + data;\r
+      call AccelY.read();\r
+      return ;\r
+    }\r
+      \r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->accelX = data - accel_ave_x;\r
+    }\r
+    else\r
+    {\r
+      pMsg->accelX = 0;\r
+    }\r
+    atomic state = STATE_ACCELY_START;\r
+    call AccelY.read();\r
+  }\r
+\r
+  /**\r
+   * AccelY data read\r
+   *\r
+   */\r
+  event void AccelY.readDone(error_t result, uint16_t data)\r
+  {\r
+    // Zero out the accelerometer, chrl@20061207\r
+    if (accel_ave_points>0)\r
+    {\r
+      accel_ave_y = accel_ave_y + data;\r
+      accel_ave_points--;\r
+      if(accel_ave_points == 0)\r
+      {\r
+        accel_ave_x = accel_ave_x / ACCEL_AVERAGE_POINTS - 450;\r
+        accel_ave_y = accel_ave_y / ACCEL_AVERAGE_POINTS - 450;\r
+      }\r
+      atomic state = STATE_IDLE;\r
+      return ;\r
+    }\r
+\r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->accelY = data - accel_ave_y;\r
+    }\r
+    else\r
+    {\r
+      pMsg->accelY = 0;\r
+    }\r
+//    atomic packet_ready = TRUE;\r
+    atomic state = STATE_MAGX_START;\r
+    call MagX.read();\r
+  }\r
+\r
+  /**\r
+   * MagX data read\r
+   *\r
+   */\r
+  event void MagX.readDone(error_t result, uint16_t data)\r
+  {\r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->magX = data;\r
+    }\r
+    else\r
+    {\r
+      pMsg->magX = 0;\r
+    }\r
+    atomic state = STATE_MAGY_START;\r
+    call MagY.read();\r
+  }\r
+\r
+  /**\r
+   * MagY data read\r
+   *\r
+   */\r
+  event void MagY.readDone(error_t result, uint16_t data)\r
+  {\r
+    if (result == SUCCESS)\r
+    {\r
+      pMsg->magY = data;\r
+    }\r
+    else\r
+    {\r
+      pMsg->magY = 0;\r
+    }\r
+    atomic packet_ready = TRUE;\r
+  }\r
+\r
+  /**\r
+   * Data packet sent to RADIO\r
+   *\r
+   */\r
+  event void RadioSend.sendDone(message_t* bufPtr, error_t error)\r
+  {\r
+    if (&packet == bufPtr)\r
+    {\r
+      call Leds.led2Off();\r
+    }\r
+    else\r
+    {\r
+      call Leds.led0On();\r
+    }\r
+    sending_packet = FALSE;\r
+    atomic state = STATE_IDLE;\r
+  }\r
+\r
+  /**\r
+   * Data packet sent to UART\r
+   *\r
+   */\r
+  event void UartSend.sendDone(message_t* bufPtr, error_t error)\r
+  {\r
+    if (&packet == bufPtr)\r
+    {\r
+      if (call RadioSend.send(AM_BROADCAST_ADDR, &packet, sizeof(Mts300Msg)) != SUCCESS)\r
+      {\r
+        call Leds.led0On();\r
+        sending_packet = FALSE;\r
+        atomic state = STATE_IDLE;\r
+      }\r
+    }\r
+    else\r
+    {\r
+      call Leds.led0On();\r
+      sending_packet = FALSE;\r
+      atomic state = STATE_IDLE;\r
+    }\r
+  }\r
+\r
+// end of the implementation\r
+}\r
diff --git a/apps/tests/mica2/mts300/XMTS300.h b/apps/tests/mica2/mts300/XMTS300.h
new file mode 100644 (file)
index 0000000..a4259dd
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef MTS_300_H\r
+#define MTS_300_H\r
+\r
+// data pacet struct\r
+typedef struct Mts300Msg {\r
+  uint16_t vref;\r
+  uint16_t thermistor;\r
+  uint16_t light;\r
+  uint16_t mic;\r
+  uint16_t accelX;\r
+  uint16_t accelY;\r
+  uint16_t magX;\r
+  uint16_t magY;\r
+} Mts300Msg;\r
+\r
+enum {\r
+  AM_MTS300MSG = 6,\r
+};\r
+\r
+#define ACCEL_AVERAGE_POINTS 3\r
+\r
+#endif\r