# $Id$
#
push( @includes, qw(
- %T/sensorboards/mts300
+ %T/sensorboards/mts300_me
+ %T/chips/atm128/i2c
+# %T/chips/atm128/adc
) );
-/* $Id$
- * Copyright (c) 2006 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.
- */
-/**
- * Internal component for basicsb photodiode. Arbitrates access to the photo
- * diode and automatically turns it on or off based on user requests.
- *
- * @author David Gay
- */
-
-configuration AccelConfigP {
- provides {
- interface Resource[uint8_t client];
- interface Atm128AdcConfig as ConfigX;
- interface Atm128AdcConfig as ConfigY;
- }
-}
-implementation {
- components AccelP, MicaBusC, new TimerMilliC() as WarmupTimer,
- new RoundRobinArbiterC(UQ_ACCEL_RESOURCE) as Arbiter,
- new SplitControlPowerManagerC() as PowerManager;
-
- Resource = Arbiter;
- ConfigX = AccelP.ConfigX;
- ConfigY = AccelP.ConfigY;
-
- PowerManager.ResourceDefaultOwner -> Arbiter;
- PowerManager.ArbiterInfo -> Arbiter;
- PowerManager.SplitControl -> AccelP;
-
- AccelP.Timer -> WarmupTimer;
- AccelP.AccelPin -> MicaBusC.PW4;
- AccelP.AccelAdcX -> MicaBusC.Adc3;
- AccelP.AccelAdcY -> MicaBusC.Adc4;
-}
+/* $Id$\r
+ * Copyright (c) 2006 Intel Corporation\r
+ * All rights reserved.\r
+ *\r
+ * This file is distributed under the terms in the attached INTEL-LICENSE\r
+ * file. If you do not find these files, copies can be found by writing to\r
+ * Intel Research Berkeley, 2150 Shattuck Avenue, Suite 1300, Berkeley, CA,\r
+ * 94704. Attention: Intel License Inquiry.\r
+ */\r
+/**\r
+ * Internal component for basicsb photodiode. Arbitrates access to the photo\r
+ * diode and automatically turns it on or off based on user requests.\r
+ *\r
+ * @author David Gay\r
+ */\r
+\r
+#include "mts300.h"\r
+\r
+configuration AccelConfigP {\r
+ provides {\r
+ interface Init;\r
+ interface StdControl;\r
+\r
+ interface Atm128AdcConfig as ConfigX;\r
+ interface Atm128AdcConfig as ConfigY;\r
+ interface ResourceConfigure as ResourceX;\r
+ interface ResourceConfigure as ResourceY;\r
+ }\r
+}\r
+implementation {\r
+ components AccelP, MicaBusC;\r
+\r
+ Init = AccelP;\r
+ StdControl = AccelP;\r
+\r
+ ConfigX = AccelP.ConfigX;\r
+ ConfigY = AccelP.ConfigY;\r
+ ResourceX = AccelP.ResourceX;\r
+ ResourceY = AccelP.ResourceY;\r
+\r
+ AccelP.AccelPower -> MicaBusC.PW4;\r
+ AccelP.AccelAdcX -> MicaBusC.Adc3;\r
+ AccelP.AccelAdcY -> MicaBusC.Adc4;\r
+}\r
-/* $Id$
- * Copyright (c) 2006 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.
- */
-/**
- * ADXL202JE accelerometer ADC configuration and power management.
- * @author David Gay <david.e.gay@intel.com>
- */
-module AccelP
-{
- provides {
- interface SplitControl;
- interface Atm128AdcConfig as ConfigX;
- interface Atm128AdcConfig as ConfigY;
- }
- uses {
- interface Timer<TMilli>;
- interface GeneralIO as AccelPin;
- interface MicaBusAdc as AccelAdcX;
- interface MicaBusAdc as AccelAdcY;
- }
-}
-implementation
-{
- async command uint8_t ConfigX.getChannel() {
- return call AccelAdcX.getChannel();
- }
-
- async command uint8_t ConfigX.getRefVoltage() {
- return ATM128_ADC_VREF_OFF;
- }
-
- async command uint8_t ConfigX.getPrescaler() {
- return ATM128_ADC_PRESCALE;
- }
-
- async command uint8_t ConfigY.getChannel() {
- return call AccelAdcY.getChannel();
- }
-
- async command uint8_t ConfigY.getRefVoltage() {
- return ATM128_ADC_VREF_OFF;
- }
-
- async command uint8_t ConfigY.getPrescaler() {
- return ATM128_ADC_PRESCALE;
- }
-
- command error_t SplitControl.start() {
- call AccelPin.makeOutput();
- call AccelPin.set();
- /* Startup time is 16.3ms for 0.1uF capacitors,
- according to the ADXL202E data sheet */
- call Timer.startOneShot(17);
- return SUCCESS;
- }
-
- event void Timer.fired() {
- signal SplitControl.startDone(SUCCESS);
- }
-
- task void stopDone() {
- call AccelPin.clr();
- signal SplitControl.stopDone(SUCCESS);
- }
-
- command error_t SplitControl.stop() {
- post stopDone();
- return SUCCESS;
- }
-}
+#include "mts300.h"\r
+#include "Timer.h"\r
+\r
+module AccelP\r
+{\r
+ provides interface Init;\r
+ provides interface StdControl;\r
+\r
+ provides interface Atm128AdcConfig as ConfigX;\r
+ provides interface Atm128AdcConfig as ConfigY;\r
+ provides interface ResourceConfigure as ResourceX;\r
+ provides interface ResourceConfigure as ResourceY;\r
+\r
+ uses interface GeneralIO as AccelPower;\r
+ uses interface MicaBusAdc as AccelAdcX;\r
+ uses interface MicaBusAdc as AccelAdcY;\r
+}\r
+\r
+implementation\r
+{\r
+ command error_t Init.init()\r
+ {\r
+ call AccelPower.makeOutput();\r
+ call AccelPower.clr();\r
+\r
+ return SUCCESS;\r
+ }\r
+\r
+ command error_t StdControl.start()\r
+ {\r
+ call AccelPower.set();\r
+ return SUCCESS;\r
+ }\r
+\r
+ command error_t StdControl.stop()\r
+ {\r
+ call AccelPower.clr();\r
+ call AccelPower.makeInput();\r
+\r
+ return SUCCESS;\r
+ }\r
+\r
+ async command uint8_t ConfigX.getChannel() {\r
+ return call AccelAdcX.getChannel();\r
+ }\r
+\r
+ async command uint8_t ConfigX.getRefVoltage() {\r
+ return ATM128_ADC_VREF_OFF;\r
+ }\r
+\r
+ async command uint8_t ConfigX.getPrescaler() {\r
+ return ATM128_ADC_PRESCALE;\r
+ }\r
+\r
+ async command uint8_t ConfigY.getChannel() {\r
+ return call AccelAdcY.getChannel();\r
+ }\r
+\r
+ async command uint8_t ConfigY.getRefVoltage() {\r
+ return ATM128_ADC_VREF_OFF;\r
+ }\r
+\r
+ async command uint8_t ConfigY.getPrescaler() {\r
+ return ATM128_ADC_PRESCALE;\r
+ }\r
+\r
+ async command void ResourceX.configure() { } \r
+ async command void ResourceX.unconfigure() { } \r
+ async command void ResourceY.configure() { } \r
+ async command void ResourceY.unconfigure() {}\r
+}
\ No newline at end of file
-/* $Id$
- * Copyright (c) 2006 Intel Corporation
- * All rights reserved.
+/**
+ * Copyright (c) 2005-2006 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 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.
+ * 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.
*/
-/**
- * Photodiode of the mts300 sensor board.
- *
- * @author David Gay
+ /*
+ * @author Hu Siquan <husq@xbow.com>
+ *
+ * $Id$
*/
#include "mts300.h"
-generic configuration PhotoC() {
+generic configuration PhotoC()
+{
provides interface Read<uint16_t>;
+ provides interface StdControl;
+ provides interface Init;
}
-implementation {
- components ArbitratedPhotoDeviceP;
+implementation
+{
+ components new AdcReadClientC(), PhotoTempDeviceP;
+
+ Init = PhotoTempDeviceP;
+ StdControl = PhotoTempDeviceP;
- Read = ArbitratedPhotoDeviceP.Read[unique(UQ_PHOTO_RESOURCE)];
+ Read = AdcReadClientC;
+ AdcReadClientC.Atm128AdcConfig -> PhotoTempDeviceP.PhotoAtm128AdcConfig;
+ AdcReadClientC.ResourceConfigure -> PhotoTempDeviceP.PhotoResourceConfigure;
}
-/* $Id$
- * Copyright (c) 2007 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.
- */
-/**
- * MTS300 photo and temp sensor ADC configuration.
- * @author David Gay <david.e.gay@intel.com>
- */
-module PhotoTempP
-{
- provides interface Atm128AdcConfig;
- uses interface MicaBusAdc as PhotoTempAdc;
-}
-implementation
-{
- async command uint8_t Atm128AdcConfig.getChannel() {
- return call PhotoTempAdc.getChannel();
- }
-
- async command uint8_t Atm128AdcConfig.getRefVoltage() {
- return ATM128_ADC_VREF_OFF;
- }
-
- async command uint8_t Atm128AdcConfig.getPrescaler() {
- return ATM128_ADC_PRESCALE;
- }
-}
+/**\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
+ * @author Hu Siquan <husq@xbow.com>\r
+ *\r
+ * $Id$\r
+ */\r
+\r
+#include "Timer.h"\r
+\r
+module PhotoTempP\r
+{\r
+ provides\r
+ {\r
+ interface Init; //!< Standard Initialization\r
+ interface StdControl; //!< Start/Stop for Temp Sensor's Power Management\r
+ interface ResourceConfigure as TempResourceConfigure;\r
+ interface ResourceConfigure as PhotoResourceConfigure;\r
+ interface Atm128AdcConfig as TempAtm128AdcConfig;\r
+ interface Atm128AdcConfig as PhotoAtm128AdcConfig;\r
+ }\r
+ uses\r
+ {\r
+ interface GeneralIO as TempPower;\r
+ interface GeneralIO as LightPower;\r
+ interface MicaBusAdc as SensorAdc;\r
+ interface Leds as DebugLeds;\r
+ }\r
+}\r
+implementation\r
+{\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
+ };\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
+ void inline TOSH_uwait(int u_sec)\r
+ {\r
+ /* In most cases (constant arg), the test is elided at compile-time */\r
+ if (u_sec)\r
+ /* loop takes 4 cycles, aka 1us */\r
+ asm volatile (\r
+ "1: sbiw %0,1\n"\r
+ " brne 1b" : "+w" (u_sec));\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
+ return SUCCESS;\r
+ }\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 TempPower.makeOutput();\r
+ call TempPower.clr();\r
+ call LightPower.makeOutput();\r
+ call LightPower.clr();\r
+ \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
+ \r
+ return SUCCESS;\r
+ }\r
+\r
+ async command uint8_t TempAtm128AdcConfig.getChannel() \r
+ {\r
+ return call SensorAdc.getChannel();\r
+ }\r
+ \r
+ async command uint8_t TempAtm128AdcConfig.getRefVoltage() \r
+ {\r
+ return ATM128_ADC_VREF_OFF;\r
+ }\r
+ \r
+ async command uint8_t TempAtm128AdcConfig.getPrescaler() \r
+ {\r
+ return ATM128_ADC_PRESCALE;\r
+ }\r
+ \r
+ async command uint8_t PhotoAtm128AdcConfig.getChannel() \r
+ {\r
+ return call SensorAdc.getChannel();\r
+ }\r
+ \r
+ async command uint8_t PhotoAtm128AdcConfig.getRefVoltage() \r
+ {\r
+ return ATM128_ADC_VREF_OFF;\r
+ }\r
+ \r
+ async command uint8_t PhotoAtm128AdcConfig.getPrescaler() \r
+ {\r
+ return ATM128_ADC_PRESCALE;\r
+ }\r
+ \r
+ async command void TempResourceConfigure.configure() \r
+ {\r
+ call DebugLeds.led0On();\r
+ call LightPower.clr();\r
+ call LightPower.makeInput();\r
+ call TempPower.makeOutput();\r
+ call TempPower.set();\r
+ TOSH_uwait(1000);\r
+ }\r
+ \r
+ async command void TempResourceConfigure.unconfigure() \r
+ {\r
+ call DebugLeds.led0Off();\r
+ call TempPower.clr();\r
+ call TempPower.makeInput();\r
+ }\r
+ \r
+ /** Turns on the light sensor and turns the thermistor off. */\r
+ async command void PhotoResourceConfigure.configure() \r
+ {\r
+ call DebugLeds.led1On();\r
+ call TempPower.clr();\r
+ call TempPower.makeInput();\r
+ call LightPower.makeOutput();\r
+ call LightPower.set();\r
+ TOSH_uwait(1000);\r
+ }\r
+ \r
+ async command void PhotoResourceConfigure.unconfigure() \r
+ {\r
+ call DebugLeds.led1Off();\r
+ call LightPower.clr();\r
+ call LightPower.makeInput();\r
+ }\r
+}\r
/**\r
- * Copyright (c) 2004-2005 Crossbow Technology, Inc.\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
* 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
+ * 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
+ * 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
- * @author Miguel Freitas\r
+ * @author Hu Siquan <husq@xbow.com>\r
*\r
* $Id$\r
*/\r
\r
-configuration SensorMts300C\r
+//configuration SensorMts300C\r
+generic configuration SensorMts300C()\r
{\r
- provides {\r
- interface Init; //!< Standard Initialization\r
- interface StdControl; //!< Start/Stop for Power Management\r
- interface Read<uint16_t> as Temp; //!< Thermister\r
- interface Read<uint16_t> as Light; //!< Photo sensor\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
-implementation \r
+implementation\r
{\r
- components \r
- SensorMts300P,\r
- SensorMts300DeviceP,\r
- HplAtm128GeneralIOC as IO,\r
- new AdcReadClientC() as SensorADC,\r
- new TimerMilliC() as WarmUpTimer\r
- ;\r
+ components SensorMts300P, HplAtm128GeneralIOC as IO,\r
+ new VoltageC(),\r
+ new PhotoC(),\r
+ new TempC(),\r
+ new MicC(),\r
+ new MagC(),\r
+ new AccelC(),\r
+ new TimerMilliC() as WarmUpTimer;\r
\r
Init = SensorMts300P.Init;\r
+ Init = PhotoC.Init;\r
+ Init = MicC.Init;\r
StdControl = SensorMts300P.StdControl;\r
+ Vref = SensorMts300P.Vref;\r
Temp = SensorMts300P.Temp;\r
Light = SensorMts300P.Light;\r
+ Microphone = SensorMts300P.Microphone;\r
+ AccelX = SensorMts300P.AccelX;\r
+ AccelY = SensorMts300P.AccelY;\r
+ MagX = SensorMts300P.MagX;\r
+ MagY = SensorMts300P.MagY;\r
\r
- SensorADC.Atm128AdcConfig -> SensorMts300DeviceP;\r
- SensorADC.ResourceConfigure -> SensorMts300DeviceP;\r
+ SensorMts300P.WarmUpTimer -> WarmUpTimer;\r
\r
- SensorMts300P.SensorADC -> SensorADC;\r
- SensorMts300P.TempPower -> IO.PortE6;\r
+ SensorMts300P.VrefRead -> VoltageC.Read;\r
+ SensorMts300P.PhotoControl -> PhotoC.StdControl;\r
+ SensorMts300P.TempRead -> TempC.Read;\r
+ SensorMts300P.LightRead -> PhotoC.Read;\r
SensorMts300P.LightPower -> IO.PortE5;\r
- SensorMts300P.WarmUpTimer -> WarmUpTimer;\r
+ SensorMts300P.TempPower -> IO.PortE6;\r
+\r
+ SensorMts300P.MicControl -> MicC.StdControl;\r
+ SensorMts300P.Mic -> MicC.Mic;\r
+ SensorMts300P.MicRead -> MicC.Read;\r
+\r
+ SensorMts300P.MagControl -> MagC.StdControl;\r
+ SensorMts300P.Mag -> MagC.Mag;\r
+ SensorMts300P.MagXRead -> MagC.MagX;\r
+ SensorMts300P.MagYRead -> MagC.MagY;\r
+\r
+ SensorMts300P.AccelControl -> AccelC.StdControl;\r
+ SensorMts300P.AccelXRead -> AccelC.AccelX;\r
+ SensorMts300P.AccelYRead -> AccelC.AccelY;\r
+ \r
}\r
/**\r
- * Copyright (c) 2004-2005 Crossbow Technology, Inc.\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
* 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
+ * 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
+ * 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
- * @author Miguel Freitas\r
*\r
* $Id$\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
+ * 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
+ *\r
* @author Martin Turon\r
* @date October 19, 2005\r
*/\r
module SensorMts300P\r
{\r
- provides {\r
- interface Init; //!< Standard Initialization\r
- interface StdControl; //!< Start/Stop for Power Management\r
- interface Read<uint16_t> as Temp; //!< Thermister\r
- interface Read<uint16_t> as Light; //!< Photo sensor\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
- interface GeneralIO as TempPower;\r
- interface GeneralIO as LightPower;\r
- interface Read<uint16_t> as SensorADC;\r
- interface Timer<TMilli> as WarmUpTimer;\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
+implementation\r
{\r
- enum {\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
- };\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
- uint8_t flat;\r
- struct {\r
+ union\r
+ {\r
+ uint8_t flat;\r
+ struct\r
+ {\r
uint8_t state : 4; //!< sensorboard state\r
- } bits;\r
- } g_flags;\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
+ * those that initialize other components.\r
*\r
*/\r
- command error_t Init.init() {\r
- g_flags.flat = STATE_IDLE;\r
- return SUCCESS;\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
*\r
* @return SUCCESS if the component was successfully started.\r
*/\r
- command error_t StdControl.start() {\r
- return SUCCESS;\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
/**\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
- call TempPower.clr();\r
- call LightPower.clr();\r
- call TempPower.makeInput();\r
- call LightPower.makeInput();\r
- atomic g_flags.bits.state = STATE_IDLE;\r
- return SUCCESS;\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
- 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
+ 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
- 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
+ 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
- task void getLightSample() {\r
- switch (g_flags.bits.state) {\r
- case STATE_TEMP_WARMING:\r
- case STATE_TEMP_READY:\r
- case STATE_TEMP_SAMPLING:\r
- // If Temperature is busy, repost and try again later.\r
- // This will not let the CPU sleep. Add delay timer.\r
- post getLightSample();\r
- return;\r
-\r
- case STATE_IDLE: \r
- // Okay, grab the sensor.\r
- switchLightOn();\r
- return;\r
- \r
- case STATE_LIGHT_WARMING:\r
- // Warm-up Timer will switch out of this state.\r
- return;\r
-\r
- case STATE_LIGHT_READY:\r
- // Start the sample.\r
- atomic { g_flags.bits.state = STATE_LIGHT_SAMPLING; }\r
- call SensorADC.read();\r
- return;\r
+ void switchMicOn()\r
+ {\r
+ atomic g_flags.bits.state = STATE_MIC_WARMING;\r
+ call WarmUpTimer.startOneShot(10);\r
+ }\r
\r
- case STATE_LIGHT_SAMPLING:\r
- // SensorADC.dataReady will switch out of this state.\r
- return;\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
- switch (g_flags.bits.state) {\r
- case STATE_LIGHT_WARMING:\r
- case STATE_LIGHT_READY:\r
- case STATE_LIGHT_SAMPLING:\r
- // If Temperature is busy, repost and try again later.\r
- // This will not let the CPU sleep. Add delay timer.\r
- post getTempSample();\r
- return;\r
-\r
- case STATE_IDLE: \r
- // Okay, grab the sensor.\r
- switchTempOn();\r
- return;\r
- \r
- case STATE_TEMP_WARMING:\r
- // Warm-up Timer will switch out of this state.\r
- return;\r
-\r
- case STATE_TEMP_READY:\r
- // Start the sample.\r
- atomic { g_flags.bits.state = STATE_TEMP_SAMPLING; }\r
- call SensorADC.read();\r
- return;\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
- case STATE_TEMP_SAMPLING:\r
- // SensorADC.dataReady will switch out of this state.\r
- return;\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
+ * Start Temperature data acquisition.\r
*\r
* This will post a task which will handle sequential states:\r
* WARMING, READY, SAMPLING, DONE (IDLE)\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
- post getTempSample(); \r
- return SUCCESS;\r
+ command error_t Temp.read()\r
+ {\r
+ post getTempSample();\r
+ return SUCCESS;\r
}\r
-\r
- /** \r
- * Start Light 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 Light.read() {\r
- post getLightSample(); \r
- return SUCCESS;\r
+ command error_t Light.read()\r
+ {\r
+ post getLightSample();\r
+ return SUCCESS;\r
}\r
-\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
- switch (g_flags.bits.state) {\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
- default:\r
- //ERROR!!!\r
- signal Light.readDone( FAIL, 0 );\r
- signal Temp.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
+ 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
+ /**\r
* Data has been acquired.\r
- * @param data Acquired value\r
- * Values are "left-justified" within each 16-bit integer, i.e., if\r
- * the data is acquired with n bits of precision, each value is \r
- * shifted left by 16-n bits.\r
+ * @param result Acquired success flag\r
+ * @param val Acquired value\r
*/\r
- event void SensorADC.readDone( error_t result, uint16_t data ) {\r
- switch (g_flags.bits.state) {\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, data);\r
- break;\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, data);\r
- break;\r
-\r
- default:\r
- //ERROR!!!\r
- signal Light.readDone( FAIL, 0 );\r
- signal Temp.readDone( FAIL, 0 );\r
- }\r
- // ADC.dataReady must return to IDLE state so next task can progress !!\r
- atomic { g_flags.bits.state = STATE_IDLE; }\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
+/**
+ * Copyright (c) 2005-2006 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 Hu Siquan <husq@xbow.com>
+ *
+ * $Id$
+ */
+
+#include "mts300.h"
+
configuration SounderC
{
- provides interface Mts300Sounder;
+ provides interface Init;
+ provides interface StdControl;
}
implementation
{
- components SounderP, new TimerMilliC(), MicaBusC;
+ components SounderP, MicaBusC;
- Mts300Sounder = SounderP;
- SounderP.Timer -> TimerMilliC;
+ Init = SounderP;
+ StdControl = SounderP;
SounderP.SounderPin -> MicaBusC.PW2;
}
-module SounderP
+/**
+ * Copyright (c) 2005-2006 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 Hu Siquan <husq@xbow.com>
+ *
+ * $Id$
+ */
+
+#include "mts300.h"
+
+module SounderP
{
- provides interface Mts300Sounder;
- uses {
- interface Timer<TMilli>;
- interface GeneralIO as SounderPin;
- }
+ provides interface Init;
+ provides interface StdControl;
+ uses interface GeneralIO as SounderPin;
}
-implementation
-{
- command void Mts300Sounder.beep(uint16_t length) {
- if (call Timer.isRunning())
- {
- uint32_t remaining = call Timer.getdt(),
- elapsed = call Timer.getNow() - call Timer.gett0();
-
- /* If more time left than we are requesting, just exit */
- if (remaining > elapsed && (remaining - elapsed) > length)
- return;
- /* Override timer with new duration */
- }
- call Timer.startOneShot(length);
+implementation
+{
+ command error_t Init.init()
+ {
+#if SOUNDER
call SounderPin.makeOutput();
+ call SounderPin.clr();
+#endif
+ return SUCCESS;
+ }
+
+ command error_t StdControl.start()
+ {
+#if SOUNDER
call SounderPin.set();
+#endif
+ return SUCCESS;
}
- event void Timer.fired() {
+ command error_t StdControl.stop()
+ {
+#if SOUNDER
call SounderPin.clr();
+#endif
+ return SUCCESS;
}
}
-#ifndef MTS300_H
-#define MTS300_H
+/* $Id$ */
+/*
+ * Copyright (c) 2005-2006 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 following
+ * two paragraphs and the author appear in all copies of this software.
+ *
+ * IN NO EVENT SHALL CROSSBOW TECHNOLOGY OR ANY OF ITS LICENSORS 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 CROSSBOW OR ITS LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * CROSSBOW TECHNOLOGY AND ITS LICENSORS SPECIFICALLY DISCLAIM ALL 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 NEITHER CROSSBOW NOR ANY LICENSOR HAS ANY
+ * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+ * MODIFICATIONS.
+ */
+/**
+ *
+ * @author Hu Siquan <husq@xbow.com>
+ * Revision: $Revision$
+ *
+ */
-#define UQ_ACCEL_RESOURCE "mts300.accel"
-#define UQ_PHOTO_RESOURCE "mts300.photo"
-#define UQ_TEMP_RESOURCE "mts300.temp"
-#define UQ_PHOTOTEMP_RESOURCE "mts300.phototemp"
+#ifndef _MTS300_H
+#define _MTS300_H
+// sounder enable (1) /disable (0)
+#ifndef SOUNDER
+#define SOUNDER 1
#endif
+
+#define MTS3X0_PHOTO_TEMP "mts300.photo.temp"
+#define MTS3X0_MAG_RESOURCE "mts300.mag"
+
+enum
+{
+ TOS_MIC_POT_ADDR = 0x5A,
+ TOS_MAG_POT_ADDR = 0x58,
+};
+
+// debug leds
+//#define _DEBUG_LEDS
+#ifdef _DEBUG_LEDS
+#define DEBUG_LEDS(X) X.DebugLeds -> LedsC
+#else
+#define DEBUG_LEDS(X) X.DebugLeds -> NoLedsC
+#endif
+#endif /* _MTS300_H */
+