+++ /dev/null
-// $Id$
-
-/* tab:4
- * "Copyright (c) 2000-2003 The Regents of the University of California.
- * 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 following
- * two paragraphs and the author appear in all copies of this software.
- *
- * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
- * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
- * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
- *
- * Copyright (c) 2002-2003 Intel Corporation
- * All rights reserved.
- *
- * This file is distributed under the terms in the attached INTEL-LICENSE
- * file. If you do not find these files, copies can be found by writing to
- * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA,
- * 94704. Attention: Intel License Inquiry.
- */
-
-/*
- * Authors: Alec Woo
- * Date last modified: 8/20/02
- *
- * The microphone on the mica sensor board has two methods for control and
- * one method to read the binary output of the tone detector. (Note: The tone
- * detector's binary output can be configured as an interrupt. Please see MicInterrupt.ti)
- *
- * muxSel allows users to switch the ADC to sample from phase lock loop output of
- * the tone detector (by setting the value to 0 (default)) or the raw voice-band output
- * of the micrphone (by setting the value to 1).
- *
- * gainAdjust allows users to adjust the amplification gain on the microphone. The range
- * is 0 to 255 with 0 being the minmum and 255 being the maximum amplification. Note that
- * setting amplification too high can result in clipping (signal distortion).
- *
- * If an audio signal at 4.3kHz is picked up by the microphone, the tone
- * detect will decode it and generate a binary ouput (0 meaning tone is detected, 1 meaning
- * tone is not detected). Users can read this output simply by calling readToneDetector().
- *
- */
-
-/**
- * @author Alec Woo
- */
-
-interface Mic {
- /* Effect: Set the multiplexer's setting on the microphone
- * Return: returns SUCCESS or FAIL
- */
- command error_t muxSel(uint8_t sel);
- /* Effect: Set the amplificatoin gain on the microphone
- * Return: returns SUCCESS or FAIL
- */
- command error_t gainAdjust(uint8_t val);
-
- /* Effect: returns the binary tone detector's output
- * Return: 0 meaning tone is detected, 1 meanning tone is not detected
- */
- command uint8_t readToneDetector();
-}
+++ /dev/null
-/**\r
- * Copyright (c) 2005-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 `AS IS'\r
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS\r
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, LOSS OF USE, DATA,\r
- * OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r
- * THE POSSIBILITY OF SUCH DAMAGE.\r
- *\r
- * @author Martin Turon <mturon@xbow.com>\r
- *\r
- * $Id$\r
- */\r
-\r
-#include "Timer.h"\r
-\r
-/**\r
- * This component is the "platform" of the sensorboard space.\r
- * It handles particulars of initialization, and glues all the\r
- * member sensor "chips" into one place. The current implementation\r
- * is overly monolithic, and should be divided into smaller\r
- * components that handle each individual sensor. The temperature\r
- * and light sensors are tightly coupled however and in the case\r
- * of the micaz, interfere with the radio (INT2), so more can\r
- * be done to clean up the design here.\r
- *\r
- * @author Martin Turon\r
- * @date October 19, 2005\r
- */\r
-module SensorMts300P\r
-{\r
- provides\r
- {\r
- interface Init; //!< Standard Initialization\r
- interface StdControl; //!< Start/Stop for Power Management\r
- interface Read<uint16_t> as Vref; //!< voltage\r
- interface Read<uint16_t> as Temp; //!< Thermister\r
- interface Read<uint16_t> as Light; //!< Photo sensor\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
- uses\r
- {\r
- interface GeneralIO as TempPower;\r
- interface GeneralIO as LightPower;\r
- interface StdControl as PhotoControl;\r
- interface StdControl as MicControl;\r
- interface Mic;\r
- interface StdControl as MagControl;\r
- interface Mag;\r
- interface StdControl as AccelControl;\r
-\r
- interface Read<uint16_t> as VrefRead;\r
- interface Read<uint16_t> as TempRead; //!< Thermister\r
- interface Read<uint16_t> as LightRead; //!< Photo sensor\r
- interface Read<uint16_t> as MicRead; //!< Mic sensor\r
- interface Read<uint16_t> as AccelXRead; //!< Magnetometer sensor\r
- interface Read<uint16_t> as AccelYRead; //!< Magnetometer sensor\r
- interface Read<uint16_t> as MagXRead; //!< Magnetometer sensor\r
- interface Read<uint16_t> as MagYRead; //!< Magnetometer sensor\r
- interface Timer<TMilli> as WarmUpTimer;\r
- }\r
-}\r
-implementation\r
-{\r
- enum\r
- {\r
- STATE_IDLE = 0,\r
- STATE_LIGHT_WARMING, //!< Powering on sensor\r
- STATE_LIGHT_READY, //!< Power up of sensor complete\r
- STATE_LIGHT_SAMPLING, //!< Sampling sensor\r
- STATE_TEMP_WARMING, //!< Powering on sensor\r
- STATE_TEMP_READY, //!< Power up of sensor complete\r
- STATE_TEMP_SAMPLING, //!< Sampling sensor\r
- STATE_MIC_WARMING, //!< Powering on sensor\r
- STATE_MIC_READY, //!< Power up of sensor complete\r
- STATE_MIC_SAMPLING, //!< Sampling sensor\r
- };\r
-\r
- /// Yes, this could be a simple uint8_t. There used to be more bits here,\r
- /// but they were optimized out and removed.\r
- union\r
- {\r
- uint8_t flat;\r
- struct\r
- {\r
- uint8_t state : 4; //!< sensorboard state\r
- } bits;\r
- } g_flags;\r
-\r
- /**\r
- * Initialize this component. Initialization should not assume that\r
- * any component is running: init() cannot call any commands besides\r
- * those that initialize other components.\r
- *\r
- */\r
- command error_t Init.init()\r
- {\r
- g_flags.flat = STATE_IDLE;\r
- call Mic.muxSel(1); // Set the mux so that raw microhpone output is selected\r
- call Mic.gainAdjust(64); // Set the gain of the microphone.\r
-\r
- return SUCCESS;\r
- }\r
-\r
- /**\r
- * Start the component and its subcomponents.\r
- *\r
- * @return SUCCESS if the component was successfully started.\r
- */\r
- command error_t StdControl.start()\r
- {\r
- call PhotoControl.start();\r
- call MicControl.start();\r
- call MagControl.start();\r
- call AccelControl.start();\r
- return SUCCESS;\r
- }\r
-\r
- /**\r
- * Stop the component and pertinent subcomponents (not all\r
- * subcomponents may be turned off due to wakeup timers, etc.).\r
- *\r
- * @return SUCCESS if the component was successfully stopped.\r
- */\r
- command error_t StdControl.stop()\r
- {\r
- call TempPower.clr();\r
- call LightPower.clr();\r
- call TempPower.makeInput();\r
- call LightPower.makeInput();\r
- atomic g_flags.bits.state = STATE_IDLE;\r
-\r
- call PhotoControl.stop();\r
- call MicControl.stop();\r
- call MagControl.stop();\r
- call AccelControl.stop();\r
-\r
- return SUCCESS;\r
- }\r
-\r
- /** Turns on the light sensor and turns the thermistor off. */\r
- void switchLightOn()\r
- {\r
- atomic g_flags.bits.state = STATE_LIGHT_WARMING;\r
- call TempPower.clr();\r
- call TempPower.makeInput();\r
- call LightPower.makeOutput();\r
- call LightPower.set();\r
- call WarmUpTimer.startOneShot(10);\r
- }\r
-\r
- /** Turns on the thermistor and turns the light sensor off. */\r
- void switchTempOn()\r
- {\r
- atomic g_flags.bits.state = STATE_TEMP_WARMING;\r
- call LightPower.clr();\r
- call LightPower.makeInput();\r
- call TempPower.makeOutput();\r
- call TempPower.set();\r
- call WarmUpTimer.startOneShot(10);\r
- }\r
-\r
- void switchMicOn()\r
- {\r
- atomic g_flags.bits.state = STATE_MIC_WARMING;\r
- call WarmUpTimer.startOneShot(10);\r
- }\r
-\r
- task void getLightSample()\r
- {\r
- switch (g_flags.bits.state)\r
- {\r
- case STATE_IDLE:\r
- // Okay, grab the sensor.\r
- switchLightOn();\r
- return;\r
- case STATE_LIGHT_READY:\r
- // Start the sample.\r
- atomic { g_flags.bits.state = STATE_LIGHT_SAMPLING; }\r
- call LightRead.read();\r
- return;\r
- case STATE_LIGHT_WARMING:\r
- // Warm-up Timer will switch out of this state.\r
- case STATE_LIGHT_SAMPLING:\r
- // LightRead.readDone will switch out of this state.\r
- return;\r
- }\r
- }\r
-\r
- task void getTempSample()\r
- {\r
- switch (g_flags.bits.state)\r
- {\r
- case STATE_IDLE:\r
- // Okay, grab the sensor.\r
- switchTempOn();\r
- return;\r
- case STATE_TEMP_READY:\r
- // Start the sample.\r
- atomic { g_flags.bits.state = STATE_TEMP_SAMPLING; }\r
- call TempRead.read();\r
- return;\r
- case STATE_TEMP_WARMING:\r
- // Warm-up Timer will switch out of this state.\r
- case STATE_TEMP_SAMPLING:\r
- // TempRead.readDone will switch out of this state.\r
- return;\r
- }\r
- }\r
-\r
- task void getMicSample()\r
- {\r
- switch (g_flags.bits.state)\r
- {\r
- case STATE_IDLE:\r
- // Okay, grab the sensor.\r
- switchMicOn();\r
- return;\r
- case STATE_MIC_READY:\r
- // Start the sample.\r
- atomic { g_flags.bits.state = STATE_MIC_SAMPLING; }\r
- call MicRead.read();\r
- return;\r
- case STATE_MIC_WARMING:\r
- // Warm-up Timer will switch out of this state.\r
- case STATE_MIC_SAMPLING:\r
- // MicRead.readDone will switch out of this state.\r
- return;\r
- }\r
- }\r
-\r
- /**\r
- * Start Temperature data acquisition.\r
- *\r
- * This will post a task which will handle sequential states:\r
- * WARMING, READY, SAMPLING, DONE (IDLE)\r
- * and repost itself until it is completed.\r
- *\r
- * @return SUCCESS if request accepted, EBUSY if it is refused\r
- * 'dataReady' or 'error' will be signaled if SUCCESS is returned\r
- */\r
- command error_t Temp.read()\r
- {\r
- post getTempSample();\r
- return SUCCESS;\r
- }\r
- command error_t Light.read()\r
- {\r
- post getLightSample();\r
- return SUCCESS;\r
- }\r
- command error_t Microphone.read()\r
- {\r
- post getMicSample();\r
- return SUCCESS;\r
- }\r
- command error_t Vref.read()\r
- {\r
- call VrefRead.read();\r
- return SUCCESS;\r
- }\r
- command error_t AccelX.read()\r
- {\r
- //signal AccelX.readDone(SUCCESS,0x1);\r
- call AccelXRead.read();\r
- return SUCCESS;\r
- }\r
- command error_t AccelY.read()\r
- {\r
- //signal AccelY.readDone(SUCCESS,0x2);\r
- call AccelYRead.read();\r
- return SUCCESS;\r
- }\r
- command error_t MagX.read()\r
- {\r
- //signal MagX.readDone(SUCCESS,0x3);\r
- call MagXRead.read();\r
- return SUCCESS;\r
- }\r
- command error_t MagY.read()\r
- {\r
- //signal MagY.readDone(SUCCESS,0x4);\r
- call MagYRead.read();\r
- return SUCCESS;\r
- }\r
- /**\r
- * Timer to allow either thermistor or light sensor to warm up for 10 msec.\r
- */\r
- event void WarmUpTimer.fired()\r
- {\r
- switch (g_flags.bits.state)\r
- {\r
- case STATE_LIGHT_WARMING:\r
- atomic { g_flags.bits.state = STATE_LIGHT_READY; }\r
- post getLightSample();\r
- return;\r
-\r
- case STATE_TEMP_WARMING:\r
- atomic { g_flags.bits.state = STATE_TEMP_READY; }\r
- post getTempSample();\r
- return;\r
-\r
- case STATE_MIC_WARMING:\r
- atomic { g_flags.bits.state = STATE_MIC_READY; }\r
- post getMicSample();\r
- return;\r
-\r
- default:\r
- //ERROR!!!\r
- signal Light.readDone(FAIL,0);\r
- signal Temp.readDone(FAIL,0);\r
- signal Microphone.readDone(FAIL,0);\r
- }\r
- // Worst case -- return to the IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- /**\r
- * Data has been acquired.\r
- * @param result Acquired success flag\r
- * @param val Acquired value\r
- */\r
- event void LightRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- switch (g_flags.bits.state)\r
- {\r
- case STATE_LIGHT_SAMPLING:\r
- signal Light.readDone(result,val);\r
- break;\r
- default: //ERROR!!!\r
- signal Light.readDone(FAIL,0);\r
- }\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event void TempRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- switch (g_flags.bits.state)\r
- {\r
- case STATE_TEMP_SAMPLING:\r
- signal Temp.readDone(result,val);\r
- break;\r
- default: //ERROR!!!\r
- signal Temp.readDone(FAIL,0);\r
- }\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event void MicRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- switch (g_flags.bits.state)\r
- {\r
- case STATE_MIC_SAMPLING:\r
- signal Microphone.readDone(result,val);\r
- break;\r
- default: //ERROR!!!\r
- signal Microphone.readDone(FAIL,0);\r
- }\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event void VrefRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- signal Vref.readDone(result,val);\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event void AccelXRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- signal AccelX.readDone(result,val);\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event void AccelYRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- signal AccelY.readDone(result,val);\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event void MagXRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- signal MagX.readDone(result,val);\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event void MagYRead.readDone( error_t result, uint16_t val )\r
- {\r
- //val = (val >>6);\r
- val &= 0x3ff;\r
- signal MagY.readDone(result,val);\r
- // state must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\r
- }\r
-\r
- event error_t Mag.gainAdjustXDone(bool result)\r
- {\r
- return result;\r
- }\r
- event error_t Mag.gainAdjustYDone(bool result)\r
- {\r
- return result;\r
- }\r
-}\r
-\r
-\r
-\r
-\r
-\r