-/**
- * 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