]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - apps/tests/mica2/mts300/TestMts300P.nc
The big interface switchover for Packet, Send, Receive, and AMSend.
[tinyos-2.x.git] / apps / tests / mica2 / mts300 / TestMts300P.nc
index 65992a919622c3e07a805a47adaddd011e5523c2..f0d011da0fd4fc96564f33fdba3ffe62008eb313 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$
- */
-
-includes Timer;
-
-/**
- * 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) {
-    }
-}
-
+#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 Mts300Sounder 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
+//\r
+//  packet sending\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+  task void send_msg()\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
+//  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, sizeof(Mts300Msg));\r
+    if (pMsg == NULL) {\r
+      call Leds.led0On();\r
+      return;\r
+    }\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 Sounder.beep(1000);\r
+      call MTS300Timer.startPeriodic( 1000 );\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
+\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
+\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 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
+//    atomic state = STATE_MIC_START;\r
+//    call Microphone.read();\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 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
+    post send_msg();\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