#
push( @includes, qw(
%T/sensorboards/mts300
-# %T/chips/atm128/adc
) );
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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;
+ }
+}
--- /dev/null
+configuration AccelReadP
+{
+ provides {
+ interface Read<uint16_t> as ReadX[uint8_t client];
+ interface Read<uint16_t> as ReadY[uint8_t client];
+ }
+}
+implementation
+{
+ components AccelConfigP,
+ new MultiplexedReadC(uint16_t) as MultiplexX,
+ new MultiplexedReadC(uint16_t) as MultiplexY,
+ new AdcReadClientC() as AdcX,
+ new AdcReadClientC() as AdcY;
+
+ ReadX = MultiplexX;
+ MultiplexX.Resource -> AccelConfigP;
+ MultiplexX.Service -> AdcX;
+ AdcX.Atm128AdcConfig -> AccelConfigP.ConfigX;
+
+ ReadY = MultiplexY;
+ MultiplexY.Resource -> AccelConfigP;
+ MultiplexY.Service -> AdcY;
+ AdcY.Atm128AdcConfig -> AccelConfigP.ConfigY;
+}
+
--- /dev/null
+configuration AccelReadStreamP
+{
+ provides {
+ interface ReadStream<uint16_t> as ReadStreamX[uint8_t client];
+ interface ReadStream<uint16_t> as ReadStreamY[uint8_t client];
+ }
+ uses {
+ interface ReadStream<uint16_t> as ActualX[uint8_t client];
+ interface ReadStream<uint16_t> as ActualY[uint8_t client];
+ }
+}
+implementation
+{
+ enum {
+ NACCEL_CLIENTS = uniqueCount(UQ_ACCEL_RESOURCE)
+ };
+ components AccelConfigP,
+ new ArbitratedReadStreamC(NACCEL_CLIENTS, uint16_t) as MultiplexX,
+ new ArbitratedReadStreamC(NACCEL_CLIENTS, uint16_t) as MultiplexY;
+
+ ReadStreamX = MultiplexX;
+ MultiplexX.Resource -> AccelConfigP;
+ MultiplexX.Service = ActualX;
+
+ ReadStreamY = MultiplexY;
+ MultiplexY.Resource -> AccelConfigP;
+ MultiplexY.Service = ActualY;
+}
+
--- /dev/null
+/* $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.
+ */
+/**
+ * Acceldiode of the basicsb sensor board.
+ *
+ * @author David Gay
+ */
+
+#include "mts300.h"
+
+generic configuration AccelXC() {
+ provides interface Read<uint16_t>;
+}
+implementation {
+ components AccelReadP;
+
+ Read = AccelReadP.ReadX[unique(UQ_ACCEL_RESOURCE)];
+}
--- /dev/null
+/* $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.
+ */
+/**
+ * AccelXdiode of the basicsb sensor board.
+ *
+ * @author David Gay
+ */
+
+#include "mts300.h"
+
+generic configuration AccelXStreamC() {
+ provides interface ReadStream<uint16_t>;
+}
+implementation {
+ enum {
+ ID = unique(UQ_ACCEL_RESOURCE)
+ };
+ components AccelReadStreamP, AccelConfigP, new AdcReadStreamClientC();
+
+ ReadStream = AccelReadStreamP.ReadStreamX[ID];
+ AccelReadStreamP.ActualX[ID] -> AdcReadStreamClientC;
+ AdcReadStreamClientC.Atm128AdcConfig -> AccelConfigP.ConfigX;
+}
--- /dev/null
+/* $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.
+ */
+/**
+ * Acceldiode of the basicsb sensor board.
+ *
+ * @author David Gay
+ */
+
+#include "mts300.h"
+
+generic configuration AccelXC() {
+ provides interface Read<uint16_t>;
+}
+implementation {
+ components AccelReadP;
+
+ Read = AccelReadP.ReadY[unique(UQ_ACCEL_RESOURCE)];
+}
--- /dev/null
+/* $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.
+ */
+/**
+ * AccelXdiode of the basicsb sensor board.
+ *
+ * @author David Gay
+ */
+
+#include "mts300.h"
+
+generic configuration AccelYStreamC() {
+ provides interface ReadStream<uint16_t>;
+}
+implementation {
+ enum {
+ ID = unique(UQ_ACCEL_RESOURCE)
+ };
+ components AccelReadStreamP, AccelConfigP, new AdcReadStreamClientC();
+
+ ReadStream = AccelReadStreamP.ReadStreamY[ID];
+ AccelReadStreamP.ActualY[ID] -> AdcReadStreamClientC;
+ AdcReadStreamClientC.Atm128AdcConfig -> AccelConfigP.ConfigY;
+}
--- /dev/null
+configuration ArbitratedPhotoDeviceP
+{
+ provides interface Read<uint16_t>[uint8_t client];
+}
+implementation
+{
+ components PhotoTempDeviceC,
+ new ArbitratedReadC(uint16_t) as ArbitrateRead;
+
+ Read = ArbitrateRead;
+ ArbitrateRead.Service -> PhotoTempDeviceC.ReadPhoto;
+ ArbitrateRead.Resource -> PhotoTempDeviceC.PhotoResource;
+}
--- /dev/null
+/* $Id$
+ * Copyright (c) 2005 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.
+ */
+/**
+ * Demo sensor for basicsb sensorboard.
+ *
+ * @author David Gay
+ */
+
+generic configuration DemoSensorC() {
+ provides interface Read<uint16_t>;
+}
+implementation {
+ components new PhotoC() as Sensor;
+
+ Read = Sensor;
+}
--- /dev/null
+/* $Id$
+ * Copyright (c) 2005 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.
+ */
+/**
+ * Demo sensor for basicsb sensorboard.
+ *
+ * @author David Gay
+ */
+
+generic configuration DemoSensorStreamC() {
+ provides interface ReadStream<uint16_t>;
+}
+implementation {
+ components new PhotoStreamC() as SensorStream;
+
+ ReadStream = SensorStream;
+}
--- /dev/null
+interface Mts300Sounder
+{
+ command void beep(uint16_t length);
+}
--- /dev/null
+/* $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.
+ */
+/**
+ * Photodiode of the mts300 sensor board.
+ *
+ * @author David Gay
+ */
+
+#include "mts300.h"
+
+generic configuration PhotoC() {
+ provides interface Read<uint16_t>;
+}
+implementation {
+ components ArbitratedPhotoDeviceP;
+
+ Read = ArbitratedPhotoDeviceP.Read[unique(UQ_PHOTO_RESOURCE)];
+}
--- /dev/null
+configuration PhotoConfigP
+{
+}
+implementation
+{
+}
--- /dev/null
+generic module PhotoTempControlP()
+{
+ provides {
+ interface SplitControl;
+ interface Read<uint16_t>[uint8_t client];
+ }
+ uses {
+ interface Resource as PhotoTempResource;
+ interface Timer<TMilli>;
+ interface GeneralIO as Power;
+ interface Read<uint16_t> as ActualRead;
+ }
+}
+implementation
+{
+ command error_t SplitControl.start() {
+ call PhotoTempResource.request();
+ return SUCCESS;
+ }
+
+ event void PhotoTempResource.granted() {
+ call Power.makeOutput();
+ call Power.set();
+ call Timer.startOneShot(10);
+ }
+
+ event void Timer.fired() {
+ signal SplitControl.startDone(SUCCESS);
+ }
+
+ task void stopDone() {
+ call PhotoTempResource.release();
+ signal SplitControl.stopDone(SUCCESS);
+ }
+
+ command error_t SplitControl.stop() {
+ call Power.clr();
+ call Power.makeInput();
+ post stopDone();
+ return SUCCESS;
+ }
+
+ uint8_t id;
+
+ command error_t Read.read[uint8_t client]() {
+ id = client;
+ return call ActualRead.read();
+ }
+
+ event void ActualRead.readDone(error_t result, uint16_t val) {
+ signal Read.readDone[id](result, val);
+ }
+
+ default event void Read.readDone[uint8_t x](error_t result, uint16_t val) { }
+}
--- /dev/null
+#include "mts300.h"
+
+configuration PhotoTempDeviceC
+{
+ provides interface Resource as PhotoResource[uint8_t client];
+ provides interface Resource as TempResource[uint8_t client];
+ provides interface Read<uint16_t> as ReadPhoto[uint8_t client];
+ provides interface Read<uint16_t> as ReadTemp[uint8_t client];
+}
+implementation
+{
+ components MicaBusC, PhotoTempP,
+ new RoundRobinArbiterC(UQ_PHOTOTEMP_RESOURCE) as SharingArbiter,
+ new RoundRobinArbiterC(UQ_PHOTO_RESOURCE) as PhotoArbiter,
+ new RoundRobinArbiterC(UQ_TEMP_RESOURCE) as TempArbiter,
+ new SplitControlPowerManagerC() as PhotoPower,
+ new SplitControlPowerManagerC() as TempPower,
+ new PhotoTempControlP() as PhotoControl,
+ new PhotoTempControlP() as TempControl,
+ new TimerMilliC() as WarmupTimer,
+ new AdcReadClientC() as Adc;
+
+ PhotoResource = PhotoArbiter;
+ PhotoPower.ResourceDefaultOwner -> PhotoArbiter;
+ PhotoPower.ArbiterInfo -> PhotoArbiter;
+ PhotoPower.SplitControl -> PhotoControl;
+ PhotoControl.PhotoTempResource -> SharingArbiter.Resource[unique(UQ_PHOTOTEMP_RESOURCE)];
+ PhotoControl.Timer -> WarmupTimer;
+ PhotoControl.Power -> MicaBusC.Int1;
+ ReadPhoto = PhotoControl;
+ PhotoControl.ActualRead -> Adc;
+
+ TempResource = TempArbiter;
+ TempPower.ResourceDefaultOwner -> TempArbiter;
+ TempPower.ArbiterInfo -> TempArbiter;
+ TempPower.SplitControl -> TempControl;
+ TempControl.PhotoTempResource -> SharingArbiter.Resource[unique(UQ_PHOTOTEMP_RESOURCE)];
+ TempControl.Timer -> WarmupTimer;
+ TempControl.Power -> MicaBusC.Int2;
+ ReadTemp = TempControl;
+ TempControl.ActualRead -> Adc;
+
+ Adc.Atm128AdcConfig -> PhotoTempP;
+ PhotoTempP.PhotoTempAdc -> MicaBusC.Adc1;
+}
--- /dev/null
+/* $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;
+ }
+}
--- /dev/null
+generic configuration PhotoTempSetupP(const char *resname)
+{
+ provides interface Resource[uint8_t client];
+ uses {
+ interface Timer;
+ interface Resource as SharingResource;
+ interface GeneralIO as Power;
+ }
+}
+implementation
+{
+ components
+ new RoundRobinArbiterC(resname) as Arbiter,
+ new SplitControlPowerManager() as Power,
+ new PhotoTempControlP() as Control;
+
+ Resource = Arbiter;
+ Power.ResourceDefaultOwner -> Arbiter;
+ Power.ArbiterInfo -> Arbiter;
+ Power.SplitControl -> Control;
+
+ Control.Resource = SharingResource;
+ Control.Power = Power;
+ Control.Timer = Timer;
+}
--- /dev/null
+configuration SounderC
+{
+ provides interface Mts300Sounder;
+}
+implementation
+{
+ components SounderP, new TimerMilliC(), MicaBusC;
+
+ Mts300Sounder = SounderP;
+ SounderP.Timer -> TimerMilliC;
+ SounderP.SounderPin -> MicaBusC.PW2;
+}
--- /dev/null
+module SounderP
+{
+ provides interface Mts300Sounder;
+ uses {
+ interface Timer<TMilli>;
+ 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);
+ call SounderPin.makeOutput();
+ call SounderPin.set();
+ }
+
+ event void Timer.fired() {
+ call SounderPin.clr();
+ }
+}
--- /dev/null
+/* $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 WireAccelP {
+ provides interface Resource[uint8_t client];
+}
+implementation {
+ components AccelP, MicaBusC, new TimerMilliC() as WarmupTimer,
+ new RounRobinArbiterC(UQ_ACCEL_RESOURCE) as Arbiter,
+ new SplitControlPowerManagerC() as PowerManager;
+
+ Resource = Arbiter;
+
+ PowerManager.ResourceDefaultOwner -> Arbiter;
+ PowerManager.ArbiterInfo -> Arbiter;
+ PowerManager.SplitControl -> AccelP;
+
+ AccelP.Timer -> WarmupTimer;
+ AccelP.AccelPin -> MicaBusC.PW4;
+ AccelP.AccelAdcX -> MicaBusC.Adc3;
+ AccelP.AccelAdcY -> MicaBusC.Adc4;
+}