%T/platforms/tmirws/chips/scp1000
%T/platforms/tmirws/chips/sht11
%T/platforms/tmirws/chips/oww
- %T/platforms/tmirws/sensors
%T/platforms/tmicore
%T/platforms/tmicore/chips/bq2403x
%T/platforms/tmicore/chips/cp210x
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Anemometer definitions
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#ifndef AEROVANE_H
-#define AEROVANE_H
-
-enum {
- AEROVANE_VECTOR_NULL = 65535U, /* Null vector has this value as dir */
-};
-
-typedef struct {
- uint16_t dir; /* Vane position. 0...1023; 360 degrees = 1024 */
- uint16_t speed; /* Anemometer revolutions over reading period. */
-} aerovector_t;
-
-typedef struct {
- aerovector_t avg; /* average wind vector, taking into acct dir & speed */
- uint8_t ccw; /* most counter-clockwise vane position seen */
- uint8_t cw; /* most clockwise vane position seen */
- uint8_t min; /* minimum speed seen */
- uint8_t max; /* max speed seen */
-} aerovane_t;
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Aerovane sensor, measuring wind speed and direction
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h"
-
-configuration AeroVaneC {
- provides interface ReadRef<aerovane_t>;
-}
-implementation {
- components AeroVaneP;
- ReadRef = AeroVaneP;
-
- components SoftwareRtcC as RtcC;
- AeroVaneP.Second -> RtcC;
-
- components HalAeroVaneC;
- AeroVaneP.CPSA -> HalAeroVaneC.CPSA;
- AeroVaneP.CPSB -> HalAeroVaneC.CPSB;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Aerovane sensor, measuring wind speed and direction
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h"
-
-module AeroVaneP {
- provides interface ReadRef<aerovane_t>;
- uses {
- interface Tick as Second;
- interface AsyncGet<uint8_t> as CPSA;
- interface AsyncGet<uint8_t> as CPSB;
- }
-}
-implementation {
- aerovane_t* m_data;
- uint8_t minSpeed = 255;
- uint8_t maxSpeed;
-
-
- /*** Support functions ***/
-
-
- /* Convert counts per second to mph */
- uint8_t toMph(uint8_t cps)
- {
- return 2.25 * cps + 0.5;
- }
-
-
- /*** Method implementations ***/
-
-
- async event void Second.fired()
- {
- uint8_t speed = call CPSA.get();
-
- if (speed < minSpeed)
- minSpeed = speed;
- if (speed > maxSpeed)
- maxSpeed = speed;
- }
-
- task void readSpeed();
-
- command error_t ReadRef.read(aerovane_t* data)
- {
- if (!data)
- return EINVAL;
- else if (m_data)
- return EBUSY;
- else {
- m_data = data;
- post readSpeed();
- return SUCCESS;
- }
- }
-
- void signalDone(error_t);
-
- task void readSpeed()
- {
- atomic {
- m_data->min = toMph(minSpeed);
- m_data->avg = toMph(call CPSB.get());
- m_data->max = toMph(maxSpeed);
- minSpeed = 255;
- maxSpeed = 0;
- }
- signalDone(SUCCESS);
- }
-
- void signalDone(error_t error)
- {
- aerovane_t* tmp = m_data;
-
- m_data = 0;
- signal ReadRef.readDone(error, tmp);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Reads the physical sensors and notifies every read period an aerovane average
- * vector.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h"
-
-configuration AeroVaneReadC {
- provides interface Notify<aerovector_t>;
-}
-implementation {
- components new AeroVaneReadP(900); /* 28800 clocks on 32768 Hz crystal */
- Notify = AeroVaneReadP;
-
- components new TimerMilliC();
- AeroVaneReadP.Timer -> TimerMilliC;
-
- components WindVaneReadC;
- AeroVaneReadP.Read -> WindVaneReadC;
-
- components AnemometerReadC;
- AeroVaneReadP.AnemometerControl -> AnemometerReadC.StdControl;
- AeroVaneReadP.Revolutions -> AnemometerReadC;
-
- components new AverageAngleC();
- AeroVaneReadP.Average -> AverageAngleC;
-
- components new StateC();
- AeroVaneReadP.State -> StateC;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Reads the physical sensors and notifies every read period an aerovane average
- * vector.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h"
-
-generic module AeroVaneReadP(uint16_t period) {
- provides interface Notify<aerovector_t>;
- uses {
- interface Timer<TMilli>;
- interface Read<uint16_t>;
- interface StdControl as AnemometerControl;
- interface Get<uint16_t> as Revolutions;
- interface Average<uint16_t>;
- interface State;
- }
-}
-implementation {
- enum {
- S_IDLE,
- S_RUN,
-
- PHYS_PER_READ = 4, /* # of physical reads per reading */
- };
-
- uint8_t m_count;
- uint16_t m_speed;
-
- inline void init()
- {
- m_count = 0;
- call Average.reset();
- }
-
- command error_t Notify.enable()
- {
- if (call State.requestState(S_RUN) != SUCCESS)
- return EBUSY;
-
- init();
- call AnemometerControl.start();
- /* FIXME: How to get first Timer.fired() synced with top of hour? */
- call Timer.startPeriodic(period);
- return SUCCESS;
- }
-
- command error_t Notify.disable()
- {
- call State.toIdle();
- call Timer.stop();
- call AnemometerControl.stop();
- return SUCCESS;
- }
-
- event void Timer.fired()
- {
- if (++m_count == PHYS_PER_READ) {
- /* Get anemometer revolutions for the period */
- m_speed = call Revolutions.get();
- }
-
- if (!(call State.isIdle())) {
- /* Avoid notifying if the user has disabled */
- call Read.read();
- }
- }
-
- event void Read.readDone(error_t error, uint16_t result)
- {
- if (error == SUCCESS)
- call Average.submit(result);
-
- if (m_count == PHYS_PER_READ) {
- if (call State.isIdle()) {
- /* Avoid notifying if the user has disabled */
- init();
- } else {
- aerovector_t vector;
-
- vector.dir = call Average.average();
- vector.speed = m_speed;
- init();
- signal Notify.notify(vector);
- }
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Anemometer definitions
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#ifndef ANEMOMETER_H
-#define ANEMOMETER_H
-
-typedef struct {
- uint8_t min;
- uint8_t avg;
- uint8_t max;
-} anemometer_t;
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Anemometer sensor, measuring wind speed
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Anemometer.h"
-
-configuration AnemometerC {
- provides interface ReadRef<anemometer_t>;
-}
-implementation {
- components AnemometerP;
- ReadRef = AnemometerP;
-
- components SoftwareRtcC as RtcC;
- AnemometerP.Second -> RtcC;
-
- components HalAnemometerC;
- AnemometerP.CPSA -> HalAnemometerC.CPSA;
- AnemometerP.CPSB -> HalAnemometerC.CPSB;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Anemometer sensor, measuring wind speed
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Anemometer.h"
-
-module AnemometerP {
- provides interface ReadRef<anemometer_t>;
- uses {
- interface Tick as Second;
- interface AsyncGet<uint8_t> as CPSA;
- interface AsyncGet<uint8_t> as CPSB;
- }
-}
-implementation {
- anemometer_t* m_data;
- uint8_t minSpeed = 255;
- uint8_t maxSpeed;
-
-
- /*** Support functions ***/
-
-
- /* Convert counts per second to mph */
- uint8_t toMph(uint8_t cps)
- {
- return 2.25 * cps + 0.5;
- }
-
-
- /*** Method implementations ***/
-
-
- async event void Second.fired()
- {
- uint8_t speed = call CPSA.get();
-
- if (speed < minSpeed)
- minSpeed = speed;
- if (speed > maxSpeed)
- maxSpeed = speed;
- }
-
- task void readSpeed();
-
- command error_t ReadRef.read(anemometer_t* data)
- {
- if (!data)
- return EINVAL;
- else if (m_data)
- return EBUSY;
- else {
- m_data = data;
- post readSpeed();
- return SUCCESS;
- }
- }
-
- void signalDone(error_t);
-
- task void readSpeed()
- {
- atomic {
- m_data->min = toMph(minSpeed);
- m_data->avg = toMph(call CPSB.get());
- m_data->max = toMph(maxSpeed);
- minSpeed = 255;
- maxSpeed = 0;
- }
- signalDone(SUCCESS);
- }
-
- void signalDone(error_t error)
- {
- anemometer_t* tmp = m_data;
-
- m_data = 0;
- signal ReadRef.readDone(error, tmp);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Returns the number of anemometer revolutions since the last read.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Anemometer.h"
-
-configuration AnemometerReadC {
- provides {
- interface StdControl;
- interface Get<uint16_t> as Revolutions;
- }
-}
-implementation {
- components AnemometerReadP;
- StdControl = AnemometerReadP;
- Revolutions = AnemometerReadP;
-
- components MainC;
- MainC.SoftwareInit -> AnemometerReadP.Init;
-
- components Msp430CounterMicroC;
- AnemometerReadP.SpinCounter -> Msp430CounterMicroC;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Returns the number of anemometer revolutions since the last read.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Anemometer.h"
-
-module AnemometerReadP {
- provides {
- interface Init;
- interface StdControl;
- interface Get<uint16_t> as Revolutions;
- }
- uses
- interface Counter<TMicro,uint16_t> as SpinCounter;
-}
-implementation {
- uint16_t m_count;
-
- command error_t Init.init()
- {
- atomic {
- /* Initialize Timer A, clock source is IO pin P1.0. SpinCounter's clock
- * is Timer A.
- */
- TACTL = 0;
- TACTL = TACLR | ID_0 | TASSEL_0;
- P1SEL |= 1;
- }
- return SUCCESS;
- }
-
- command error_t StdControl.start()
- {
- atomic {
- TACTL |= MC_2;
- m_count = call SpinCounter.get();
- }
- return SUCCESS;
- }
-
- command error_t StdControl.stop()
- {
- atomic TACTL &= ~(MC1|MC0);
- }
-
- command uint16_t Revolutions.get()
- {
- atomic {
- uint16_t newCount;
- uint16_t speed;
-
- newCount = call SpinCounter.get();
- speed = newCount - m_count;
- m_count = newCount;
- return speed;
- }
- }
-
- async event void SpinCounter.overflow() {}
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * An interface used by averagers.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-interface Average<val_t> {
- /* Reset the averager. Any samples submitted since the last average was
- * signalled, or all samples submitted if average was not signalled, are
- * discarded.
- */
- command void reset();
-
- /* Submit a value to the averager, to be averaged into the next average. */
- command void submit(val_t value);
-
- /* Return the number of values submitted since the last
- * <code>reset()</code> or <code>average()</code>.
- */
- command uint16_t count();
-
- /* Ask for the average of the values submitted since the last
- * <code>reset()</code> or <code>average()</code>. <code>average()</code>
- * also performs a <code>reset()</code>.
- */
- command val_t average();
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Average angles representing positions on a circle. 360 degrees represented
- * as a 10 bit unsigned value.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h" /* For AEROVANE_VECTOR_NULL */
-
-generic module AverageAngleC() {
- provides interface Average<uint16_t>;
-}
-implementation {
- uint8_t m_count;
- int16_t m_angle;
- uint16_t m_lastAngle;
-
- inline void init()
- {
- m_count = 0;
- m_angle = 0;
- }
-
- command void Average.reset()
- {
- init();
- }
-
- int distance(int angle1, int angle2)
- {
- int d = angle2 - angle1;
-
- if (d <= -512)
- d += 1024;
- else if (d > 512)
- d -= 1024;
- return d;
- }
-
- command void Average.submit(uint16_t angle)
- {
- if (m_count++ == 0)
- m_lastAngle = angle;
- else
- m_lastAngle += distance(m_lastAngle, angle);
- m_angle += m_lastAngle;
- }
-
- command uint16_t Average.average()
- {
- uint16_t angle;
-
- if (m_count == 0)
- angle = AEROVANE_VECTOR_NULL;
- else {
- angle = m_angle;
-
- if (angle > 0)
- angle = (angle + (m_count / 2)) / m_count;
- else if (angle < 0) {
- angle = (angle - (m_count / 2)) / m_count;
- while (angle < 0)
- angle += 1024;
- }
- angle &= 0x03ff; /* %= 1024 */
- }
- init();
- return angle;
- }
-
- command uint16_t Average.count()
- {
- return m_count;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Average vectors in polar coordinate space. This is not a true vector
- * average, but instead creates an resultant polar coordinate that has an
- * independent average of theta and magnitude (speed).
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h"
-
-generic configuration AveragePolarC(uint16_t samples) {
- provides interface Average<aerovector_t>;
-}
-implementation {
- components new AveragePolarP(samples) as AverageP;
- Average = AverageP;
-
- components new AverageAngleC(samples);
- AverageP.AverageAngle -> AverageAngleC.Average;
-
- components new AveragePolarC(samples);
- AverageP.AverageSpeed -> AverageU16C.Average;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Average vectors in polar coordinate space. This is not a true vector
- * average, but instead creates an resultant polar coordinate that has an
- * independent average of theta and magnitude (speed).
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h"
-
-generic module AveragePolarC(uint16_t samples) {
- provides interface Average<aerovector_t>;
- uses {
- interface Average<uint16_t> as AverageAngle;
- interface Average<uint16_t> as AverageSpeed;
- }
-}
-implementation {
- int m_count;
-
- command void Average.reset()
- {
- AverageAngle.init();
- AverageSpeed.init();
- }
-
- command uint16_t Average.submit(aerovector_t vector)
- {
- call AverageAngle.submit(vector.dir);
- call AverageSpeed.submit(vector.speed);
- }
-
- command aerovector_t Average.average()
- {
- aerovector_t vector;
-
- vector.dir = call AverageAngle.average();
- vector.speed = call AverageSpeed.average();
- init();
- return vector;
- }
-
- command uint16_t Average.count()
- {
- return call AverageAngle.count();
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Average scalar values.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "AeroVane.h"
-
-generic module AverageU16() {
- provides interface Average<uint16_t>;
-}
-implementation {
- uint16_t m_count;
- uint16_t m_value;
-
- inline void init()
- {
- m_count = 0;
- m_value = 0;
- }
-
- command void Average.reset()
- {
- init();
- }
-
- command Average.submit(uint16_t value)
- {
- m_count++;
- m_value += value;
- }
-
- command uint16_t Average.average()
- {
- uint16_t value = 0;
-
- if (m_count) {
- value = (m_value + (m_count / 2)) / m_count;
- init();
- }
- return value;
- }
-
- command uint16_t Average.count()
- {
- return m_count;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Reads the ADC pin connected to the LiPoly battery. The connection is made
- * via a resistor divider where the battery voltage is 3x that read by the ADC.
- * Therefore, BattV = ADC / 4096 * 1.5 * 3.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-generic configuration BatteryAdcC() {
- provides interface Read<uint16_t>;
- provides interface ReadStream<uint16_t>;
-
- provides interface Resource;
- provides interface ReadNow<uint16_t>;
-}
-implementation {
- components new AdcReadClientC();
- Read = AdcReadClientC;
-
- components new AdcReadStreamClientC();
- ReadStream = AdcReadStreamClientC;
-
- components BatteryAdcP;
- AdcReadClientC.AdcConfigure -> BatteryAdcP;
- AdcReadStreamClientC.AdcConfigure -> BatteryAdcP;
-
- components new AdcReadNowClientC();
- Resource = AdcReadNowClientC;
- ReadNow = AdcReadNowClientC;
-
- AdcReadNowClientC.AdcConfigure -> BatteryAdcP;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Battery ADC reading.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Msp430Adc12.h"
-
-module BatteryAdcP {
- provides interface AdcConfigure<const msp430adc12_channel_config_t*>;
-}
-implementation {
- /* TODO: The internal references are unsable, varying by more than 0.1V and
- * jumping around. The external reference of 2.50V seems stable.
- */
- const msp430adc12_channel_config_t config = {
- inch: INPUT_CHANNEL_A0,
-#if 0 /* internal references unstable */
- sref: REFERENCE_VREFplus_AVss,
- ref2_5v: REFVOLT_LEVEL_1_5, /* REFVOLT_LEVEL_2_5, */
-#else /* external reference is stable */
- sref: REFERENCE_VeREFplus_AVss,
- ref2_5v: REFVOLT_LEVEL_1_5,
-#endif
-#if 0 /* clock source doesn't seem to affect stability */
- adc12ssel: SHT_SOURCE_ADC12OSC,
- adc12div: SHT_CLOCK_DIV_8,
-#else
- adc12ssel: SHT_SOURCE_ACLK,
- adc12div: SHT_CLOCK_DIV_1,
-#endif
- sht: SAMPLE_HOLD_8_CYCLES,
- sampcon_ssel: SAMPCON_SOURCE_ACLK,
- sampcon_id: SAMPCON_CLOCK_DIV_1
- };
-
- async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration()
- {
- return &config;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * HAL layer for the Anemometer sensor. CPSA and CPSB are independent services
- * that each provide a counts per second value via its get() command that
- * represents the average CPS since the last call to its get() command. The
- * first call to CPSx.get() uses the initialization of the HalAnemometerP
- * component during MainC.SoftwareInit as the start time for calculating the
- * counts per second value.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Anemometer.h"
-
-configuration HalAnemometerC {
- provides interface AsyncGet<uint8_t> as CPSA;
- provides interface AsyncGet<uint8_t> as CPSB;
-}
-implementation {
- components HalAnemometerP;
- CPSA = HalAnemometerP.CPSA;
- CPSB = HalAnemometerP.CPSB;
-
- components MainC;
- MainC.SoftwareInit -> HalAnemometerP.Init;
-
- components Counter32khz32C;
- HalAnemometerP.TimeCounter -> Counter32khz32C;
-
- components Msp430CounterMicroC;
- HalAnemometerP.SpinCounter -> Msp430CounterMicroC;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * HAL layer for the Anemometer sensor.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Anemometer.h"
-
-module HalAnemometerP {
- provides {
- interface Init;
- interface AsyncGet<uint8_t> as CPSA;
- interface AsyncGet<uint8_t> as CPSB;
- }
- uses {
- interface Counter<T32khz,uint32_t> as TimeCounter;
- interface Counter<TMicro,uint16_t> as SpinCounter;
- }
-}
-implementation {
- uint32_t prevATime;
- uint16_t prevASpin;
- uint32_t prevBTime;
- uint16_t prevBSpin;
-
- command error_t Init.init()
- {
- atomic {
- /* Initialize Timer A, clock source is io pin P1.0. Timer A provides the
- * clock for the SpinCounter component.
- */
- TACTL = 0;
- TACTL = TACLR | MC_2 | ID_0 | TASSEL_0;
- P1SEL |= 1;
- }
- prevATime = call TimeCounter.get();
- prevASpin = call SpinCounter.get();
- prevBTime = prevATime;
- prevBSpin = prevASpin;
- return SUCCESS;
- }
-
- async command uint8_t CPSA.get()
- {
- uint32_t currTime;
- uint16_t currSpin;
- uint32_t deltaT;
- uint8_t cps;
-
- atomic {
- currTime = call TimeCounter.get();
- currSpin = call SpinCounter.get();
- }
- deltaT = (currTime - prevATime);
- cps = ((uint32_t)(currSpin - prevASpin) * 32768U + (deltaT >> 1)) / deltaT;
- prevATime = currTime;
- prevASpin = currSpin;
- return cps;
- }
-
- async command uint8_t CPSB.get()
- {
- uint32_t currTime;
- uint16_t currSpin;
- uint32_t deltaT;
- uint8_t cps;
-
- atomic {
- currTime = call TimeCounter.get();
- currSpin = call SpinCounter.get();
- }
- deltaT = (currTime - prevBTime);
- cps = ((uint32_t)(currSpin - prevBSpin) * 32768U + (deltaT >> 1)) / deltaT;
- prevBTime = currTime;
- prevBSpin = currSpin;
- return cps;
- }
-
- async event void TimeCounter.overflow() {}
- async event void SpinCounter.overflow() {}
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * HAL/HPL layers for the OwwVane sensor.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "OwwVane.h"
-
-configuration HalOwwVaneC {
- provides interface AsyncGet<uint8_t>;
-}
-implementation {
- components HalOwwVaneP;
- AsyncGet = HalOwwVaneP;
-
- components MainC;
- MainC.SoftwareInit -> HalOwwVaneP.Init;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * HAL/HPL layers for the OwwVane sensor.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "OwwVane.h"
-
-module HalOwwVaneP {
- provides {
- interface Init;
- interface AsyncGet<uint8_t> as Vane;
- }
-}
-implementation {
-#define WIND_IN (*TCAST(volatile uint8_t* ONE, P5IN_))
-#define WIND_DIR (*TCAST(volatile uint8_t* ONE, P5DIR_))
-#define WIND_SEL (*TCAST(volatile uint8_t* ONE, P5SEL_))
-#define WIND_REN (*TCAST(volatile uint8_t* ONE, P5REN_))
-
- command error_t Init.init()
- {
- /* Initialize the port providing wind direction information */
- WIND_DIR = 0;
- WIND_SEL = 0;
- WIND_REN = 0;
- return SUCCESS;
- }
-
- async command uint8_t Vane.get()
- {
- atomic return ~WIND_IN;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * HAL layer for the wind vane sensor provides a power control.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-configuration HalWindVaneC {
- provides {
- interface GeneralIO as WPower;
- interface GeneralIO as WDead;
- }
-}
-implementation {
- components new Msp430GpioC() as WPowerM;
- components new Msp430GpioC() as WDeadM;
- WPower = WPowerM;
- WDead = WDeadM;
-
- components HplMsp430GeneralIOC;
- WPowerM -> HplMsp430GeneralIOC.Port57;
- WDeadM -> HplMsp430GeneralIOC.Port56;
-
- components MainC, HalWindVaneP;
- MainC.SoftwareInit -> HalWindVaneP;
- HalWindVaneP.WPower -> HplMsp430GeneralIOC.Port57;
- HalWindVaneP.WDead -> HplMsp430GeneralIOC.Port56;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * HAL layer for the wind vane sensor provides a power control.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-module HalWindVaneP {
- provides interface Init;
- uses {
- interface HplMsp430GeneralIO as WPower;
- interface HplMsp430GeneralIO as WDead;
- }
-}
-implementation {
- command error_t Init.init()
- {
- call WPower.makeOutput();
- call WPower.clr();
- call WPower.disableRen();
-
- call WDead.makeInput();
- call WDead.set();
- call WDead.disableRen();
-
- return SUCCESS;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * A generic component that multiply samples via the ADC, returning an array
- * of ADC results.
- *
- * @author R. Steve McKown <smckown@gmail.com>
- */
-
-#include <Msp430Adc12.h>
-
-generic configuration MultiSampleC(uint16_t count) {
- provides {
- interface Get<uint16_t> as Count;
- interface ReadRef<uint16_t>;
- }
- uses interface AdcConfigure<const msp430adc12_channel_config_t*>;
-}
-implementation {
- components new MultiSampleP(count);
- Count = MultiSampleP;
- ReadRef = MultiSampleP;
-
- components new AdcReadStreamClientC();
- AdcConfigure = AdcReadStreamClientC;
- MultiSampleP.ReadStream -> AdcReadStreamClientC;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * A generic component that multiply samples via the ADC, returning an array
- * of ADC results.
- *
- * @author R. Steve McKown <smckown@gmail.com>
- */
-
-generic module MultiSampleP(uint16_t count) @safe()
-{
- provides {
- interface Get<uint16_t> as Count;
- interface ReadRef<uint16_t>;
- }
- uses interface ReadStream<uint16_t>;
-}
-implementation
-{
- uint16_t* m_array;
-
- command uint16_t Count.get()
- {
- return count;
- }
-
- command error_t ReadRef.read(uint16_t* array)
- {
- if (m_array)
- return EBUSY;
-
- m_array = array;
- if (call ReadStream.postBuffer(m_array, count) != SUCCESS ||
- call ReadStream.read(0) != SUCCESS) {
- m_array = NULL;
- return FAIL;
- }
- return SUCCESS;
- }
-
- void signalReadDone(error_t error)
- {
- uint16_t* tmp = m_array;
-
- m_array = NULL;
- signal ReadRef.readDone(error, tmp);
- }
-
- event void ReadStream.bufferDone(error_t error, uint16_t* buf,
- uint16_t _count)
- {
- /* FIXME: count comes back as zero, so ignore it. Up to 16 reads work. */
- if (error != SUCCESS /*|| _count != count*/)
- signalReadDone(FAIL);
- }
-
- event void ReadStream.readDone(error_t error, uint32_t usActualPeriod)
- {
- signalReadDone(error);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Reads the ADC pin connected to the LiPoly battery. The connection is made
- * via a resistor divider where the battery voltage is 3x that read by the ADC.
- * Therefore, PyranometerV = ADC / 4096 * 1.5 * 3.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-generic configuration PyranometerAdcC() {
- provides interface Read<uint16_t>;
- provides interface ReadStream<uint16_t>;
-
- provides interface Resource;
- provides interface ReadNow<uint16_t>;
-}
-implementation {
- components new AdcReadClientC();
- Read = AdcReadClientC;
-
- components new AdcReadStreamClientC();
- ReadStream = AdcReadStreamClientC;
-
- components PyranometerAdcP;
- AdcReadClientC.AdcConfigure -> PyranometerAdcP;
- AdcReadStreamClientC.AdcConfigure -> PyranometerAdcP;
-
- components new AdcReadNowClientC();
- Resource = AdcReadNowClientC;
- ReadNow = AdcReadNowClientC;
-
- AdcReadNowClientC.AdcConfigure -> PyranometerAdcP;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Pyranometerery ADC reading.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Msp430Adc12.h"
-
-module PyranometerAdcP {
- provides interface AdcConfigure<const msp430adc12_channel_config_t*>;
-}
-implementation {
- const msp430adc12_channel_config_t config = {
- inch: INPUT_CHANNEL_A3,
-#if 0 /* internal references unstable */
- sref: REFERENCE_VREFplus_AVss,
- ref2_5v: REFVOLT_LEVEL_1_5, /* REFVOLT_LEVEL_2_5, */
-#else /* external reference is stable */
- sref: REFERENCE_VeREFplus_AVss,
- ref2_5v: REFVOLT_LEVEL_1_5,
-#endif
-#if 0 /* stability affected by clock source? */
- adc12ssel: SHT_SOURCE_ADC12OSC,
- adc12div: SHT_CLOCK_DIV_8,
-#else
- adc12ssel: SHT_SOURCE_ACLK,
- adc12div: SHT_CLOCK_DIV_1,
-#endif
- sht: SAMPLE_HOLD_8_CYCLES,
- sampcon_ssel: SAMPCON_SOURCE_ACLK,
- sampcon_id: SAMPCON_CLOCK_DIV_1
- };
-
- async command const msp430adc12_channel_config_t* AdcConfigure.getConfiguration()
- {
- return &config;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Wind Vane (direction) definitions
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#ifndef WIND_VANE_H
-#define WIND_VANE_H
-
-#define WINDVANE_OVERFLOW 255
-#define WINDVANE_NO_HEADING 254
-
-/* Units are degrees/2, so 90 degrees is 45 units. This allows a full
- * circle of degrees to be represented in a single byte. Resolution reduction
- * is not a problem, as the OWW's native resolution is 22.5 degrees.
- */
-typedef struct {
- uint8_t left;
- uint8_t avg;
- uint8_t right;
-} wind_vane_t;
-
-#endif
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Reads the ADC pin connected to the Davis Instruments anemometer. The
- * connection is made via a resistor divider. The voltage seen by the ADC
- * is related to VREF, the maximum voltage presented to the ADC.
- * 0V or VREF means North
- * VREF*1/4 means East
- * VREF*2/4 means South
- * VREF*3/4 means West
- *
- * We assume a 12-bit ADC, so VREF reads as 4095 and 0V reads as 0.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-generic configuration WindVaneAdcC() {
- provides interface Read<uint16_t>;
- provides interface ReadStream<uint16_t>;
-
- provides interface Resource;
- provides interface ReadNow<uint16_t>;
-}
-implementation {
- components new AdcReadClientC();
- Read = AdcReadClientC;
-
- components new AdcReadStreamClientC();
- ReadStream = AdcReadStreamClientC;
-
- components WindVaneAdcP;
- AdcReadClientC.AdcConfigure -> WindVaneAdcP;
- AdcReadStreamClientC.AdcConfigure -> WindVaneAdcP;
-
- components new AdcReadNowClientC();
- Resource = AdcReadNowClientC;
- ReadNow = AdcReadNowClientC;
-
- AdcReadNowClientC.AdcConfigure -> WindVaneAdcP;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Reads the ADC pin connected to the Davis Instruments anemometer. The
- * connection is made via a resistor divider. The voltage seen by the ADC
- * is related to VREF, the maximum voltage presented to the ADC.
- * 0V or VREF means North
- * VREF*1/4 means East
- * VREF*2/4 means South
- * VREF*3/4 means West
- *
- * We assume a 12-bit ADC, so VREF reads as 4095 and 0V reads as 0.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "Msp430Adc12.h"
-
-module WindVaneAdcP {
- provides interface AdcConfigure<const msp430adc12_channel_config_t*>;
-}
-implementation {
- /* We use the external reference because it is probably more accurate (see
- * the circuit), and there is no arbitration for the voltage reference. With
- * the external reference, we can ReadStream 4 data points in 420 us. Using
- * the internal reference, this time increases significantly to over 18 ms.
- */
- const msp430adc12_channel_config_t config = {
- inch: INPUT_CHANNEL_A2,
- sref: REFERENCE_VeREFplus_AVss,
- ref2_5v: REFVOLT_LEVEL_1_5, /* doesn't matter since external ref used */
- adc12ssel: SHT_SOURCE_ADC12OSC,
- adc12div: SHT_CLOCK_DIV_8,
- sht: SAMPLE_HOLD_8_CYCLES,
- sampcon_ssel: SAMPCON_SOURCE_ACLK,
- sampcon_id: SAMPCON_CLOCK_DIV_1
- };
-
- async command const msp430adc12_channel_config_t*
- AdcConfigure.getConfiguration()
- {
- return &config;
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * WindVane sensor. The compass is a number of sectors, 0...(sectors - 1).
- * Sector zero is North, and sectors/2 is South. Like any compass, the heading
- * increases as one traverses the compass clockwise. The number of sectors are
- * contrained by the uint8_t data members of wind_vane_t to no more than 255.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "WindVane.h"
-
-generic configuration WindVaneC(uint8_t sectors) {
- provides {
- interface Get<uint8_t> as Sectors;
- interface ReadRef<wind_vane_t>;
- }
-}
-implementation {
- components new WindVaneP(sectors);
- Sectors = WindVaneP;
- ReadRef = WindVaneP;
-
- components SoftwareRtcC as RtcC;
- WindVaneP.Second -> RtcC;
-
- components WindVaneReadC;
- WindVaneP.Vane -> WindVaneReadC.Read;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * WindVane sensor. The compass is a number of sectors, 0...(sectors - 1).
- * Sector zero is North, and sectors/2 is South. Like any compass, the heading
- * increases as one traverses the compass clockwise. The number of sectors are
- * contrained by the uint8_t data members of wind_vane_t to no more than 255.
- *
- * @author R. Steve McKown <rsmckown@gmail.com>
- */
-
-#include "WindVane.h"
-
-generic module WindVaneP(uint8_t sectors) {
- provides {
- interface Get<uint8_t> as Sectors;
- interface ReadRef<wind_vane_t>;
- }
- uses {
- interface Read<uint16_t> as Vane;
- interface Tick as Second;
- }
-}
-implementation {
- uint8_t m_compass[sectors];
- bool m_overflow;
- wind_vane_t* m_data;
-
-
- /*** Support functions ***/
-
-
- /* Convert a sector number into a degree heading. We use the degree value
- * that is in the center of the sector to represent that sector. For example,
- * with 32 sectors, each sector is 11.25 degrees. Sector 4 represents all
- * degree headings between 39.375 and 50.624 and is represented on the whole
- * the degree heading of 45 degrees.
- */
- uint16_t sectorToDegree(uint8_t sector)
- {
- return (360.0 / sectors) * sector;
- }
-
- /* Convert a degree heading into a sector */
- uint8_t degreeToSector(uint16_t degree)
- {
- return ((degree * sectors + 180) / 360) % sectors;
- }
-
- /* Return the # of sectors clockwise along the compass from start to end. */
- uint8_t distance(uint8_t start, uint8_t end)
- {
- return (end > start) ? end - start : (end + sectors) - start;
- }
-
- /* circularly examine compass, starting with pos + 1, for the next compass
- * position having a value of zero.
- */
- uint8_t nextNonZero(uint8_t* compass, uint8_t pos)
- {
- do {
- pos = (pos + 1) % sectors;
- } while (compass[pos] == 0);
- return pos;
- }
-
- bool isCompassEmpty(uint8_t* compass)
- {
- int i;
-
- for (i = 0; i < sectors; i++) {
- if (compass[i])
- break;
- }
- return (i == sectors) ? TRUE : FALSE;
- }
-
- /* Reduce all compass headings equally until a compass heading has a value
- * of zero.
- */
- void minimizeCompass(uint8_t* compass)
- {
- uint8_t min = 255;
- int i;
-
- for (i = 0; i < sectors; i++) {
- if (compass[i] < min)
- min = compass[i];
- }
- if (min > 0) {
- for (i = 0; i < sectors; i++)
- compass[i] -= min;
- }
- }
-
- /* Locate the arc in which the m_compass[] has been constrained, defining
- * that arc in m_data's left and right fields. The compass arc is always
- * defined clockwise, from left to right.
- */
- void findArc(uint8_t* compass)
- {
- uint8_t begin;
- uint8_t save = 255;
- uint8_t dist = 0;
-
- begin = m_data->left = nextNonZero(compass, sectors - 1);
- do {
- uint8_t d;
-
- m_data->right = nextNonZero(compass, m_data->left);
- d = distance(m_data->left, m_data->right);
- if (d > dist) {
- dist = d;
- save = m_data->left;
- }
- m_data->left = m_data->right;
- } while (m_data->left != begin);
- m_data->right = save;
- m_data->left = (save + dist) % sectors;
- }
-
- void calcAvg(uint8_t* compass)
- {
- /* Find the average compass heading */
- uint32_t sum = 0;
- uint32_t count = 0;
- uint32_t tmp = (m_data->right >= m_data->left) ? m_data->right :
- m_data->right + sectors;
- int i;
-
- for (i = m_data->left; i <= tmp; i++) {
- uint8_t p = i % sectors;
-
- sum += compass[p] * i;
- count += compass[p];
- }
- m_data->avg = ((sum + count - 1) / count) % sectors;
- }
-
-
- /*** Method implementations ***/
-
- command uint8_t Sectors.get()
- {
- return sectors;
- }
-
- task void startRead()
- {
- call Vane.read();
- }
-
- async event void Second.fired()
- {
- post startRead();
- }
-
- event void Vane.readDone(error_t error, uint16_t value)
- {
- if (error == SUCCESS) {
- if (++m_compass[degreeToSector(value)] == 0)
- m_overflow = TRUE;
- }
- }
-
- task void readCompass();
-
- command error_t ReadRef.read(wind_vane_t* data)
- {
- if (!data)
- return EINVAL;
- else if (m_data)
- return EBUSY;
- else {
- m_data = data;
- post readCompass();
- return SUCCESS;
- }
- }
-
- task void readCompass()
- {
- bool overflow;
- uint8_t compass[sectors];
- wind_vane_t* data = m_data;
-
- atomic {
- overflow = m_overflow;
- m_overflow = FALSE;
- if (!overflow)
- memcpy(compass, m_compass, sizeof(m_compass));
- memset(m_compass, 0, sizeof(m_compass));
- }
-
- if (overflow)
- m_data->left = m_data->avg = m_data->right = WINDVANE_OVERFLOW;
- else {
- minimizeCompass(compass);
- if (isCompassEmpty(compass)) {
- /* If there were no readings in the compass, or each compass heading has
- * a number of readings equal to all other compass headings, we have an
- * indeterminate wind direction.
- */
- m_data->left = m_data->avg = m_data->right = WINDVANE_NO_HEADING;
- } else {
- findArc(compass);
- calcAvg(compass);
- }
-
- m_data = 0;
- signal ReadRef.readDone(SUCCESS, data);
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Take an instantaneous reading of the wind vane position as a 10 bit unsigned
- * value.
- *
- * @author R. Steve McKown <smckown@gmail.com>
- */
-
-configuration WindVaneReadC {
- provides interface Read<uint16_t>;
-}
-implementation {
- enum { SAMPLES_PER_READ = 4, };
-
- components new WindVaneReadP(SAMPLES_PER_READ);
- Read = WindVaneReadP;
-
- components new MultiSampleC(SAMPLES_PER_READ);
- WindVaneReadP.ReadRef -> MultiSampleC;
-
- components WindVaneAdcP;
- MultiSampleC.AdcConfigure -> WindVaneAdcP;
-
- components HalWindVaneC;
- WindVaneReadP.WPower -> HalWindVaneC.WPower;
- WindVaneReadP.WDead -> HalWindVaneC.WDead;
-
- components new StateC();
- WindVaneReadP.State -> StateC;
-}
+++ /dev/null
-/*
- * Copyright (c) 2008, Titanium Mirror, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * - Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * - Neither the name of Titanium Mirror, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
- * OR PROFITS; OR BUSINESS INTERRUPTION) 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.
- */
-
-/**
- * Take an instantaneous reading of the wind vane position as a 10 bit unsigned
- * value. In this case, the instantaneous reading is 4 very fast 12-bit samples
- * plus the possibility of an additional four to deal with the dead band.
- *
- * @author R. Steve McKown <smckown@gmail.com>
- */
-
-generic module WindVaneReadP(uint16_t count) @safe()
-{
- provides interface Read<uint16_t>;
- uses {
- interface ReadRef<uint16_t>;
- interface GeneralIO as WPower;
- interface GeneralIO as WDead;
- interface State;
- }
-}
-implementation
-{
- enum {
- S_IDLE = 0,
- S_READ,
- S_CHECK,
- S_OUTPUT,
-
- /* The wind vane has a dead zone where it returns an ADC value that also
- * represents another angular location. Therefore, we implement special
- * dead zone checking over a certain range of return values from the
- * wind vane, with hardware assistance (WDead).
- *
- * Note: the wind vane's dead zone is probably 5-10 degrees. We would be
- * more accurate if we took the ADC range over 350 or 355 degrees, then
- * added 1/2 of the dead zone as an offset. However, without this logic,
- * the wind vane appears more than accurate enough. It is less accurate
- * within the dead zone, of course, but would be even if we did implement
- * the extra logic.
- */
- DEAD_BEGIN = 1500 * count, /* About 132 degrees */
- DEAD_END = 2500 * count, /* About 220 degrees */
- DEAD_THRESH = 3618 * count, /* > when checking means in dead zone */
-
- /* If we assume the greatest angular velocity of the wind vane is 4 full
- * rotations in a second, then in the 460us it takes to read the vane 4
- * times, it could move over 6 degrees. This means that the vane could
- * cross into, out of, or over the dead band, causing readings that can
- * not be averaged. If we see a delta from min reading to max reading
- * suggesting a large enough deflection, we can assume the reading is
- * invalid.
- */
- MAX_DEFLECT = 1024, /* 90 degrees */
- };
-
- uint16_t m_value;
- uint16_t m_samples[count];
-
- command error_t Read.read()
- {
- if (!(call State.isIdle()))
- return EBUSY;
-
- call WPower.set();
- if (call ReadRef.read(m_samples) == SUCCESS) {
- call State.forceState(S_READ);
- return SUCCESS;
- } else {
- call WPower.clr();
- return FAIL;
- }
- }
-
- void signalReadDone(error_t error, uint16_t value)
- {
- call WDead.makeInput();
- call WPower.clr();
-
- call State.toIdle();
- /* Read has returned a value that is count * 12-bit ADC values. Convert
- * this to a 10-bit value, with rounding.
- */
- value = (value + (count / 2)) / count / 4;
- signal Read.readDone(error, value);
- }
-
- bool badReading(uint16_t* result)
- {
- unsigned i;
- uint16_t min = result[0];
- uint16_t max = result[0];
-
- for (i = 1; i < count; i++) {
- if (result[i] < min)
- min = result[i];
- if (result[i] > max)
- max = result[i];
- }
- return (max - min) > MAX_DEFLECT;
- }
-
- event void ReadRef.readDone(error_t error, uint16_t* result)
- {
- if (error != SUCCESS || badReading(result))
- signalReadDone(error, 0);
- else {
- unsigned i;
- uint16_t value = result[0];
-
- for (i = 1; i < count; i++)
- value += result[i];
-
- switch (call State.getState()) {
- case S_READ:
- if (value < DEAD_BEGIN || value > DEAD_END)
- signalReadDone(SUCCESS, value);
- else {
- m_value = value;
- call WDead.makeOutput();
- if (call ReadRef.read(m_samples) == SUCCESS)
- call State.forceState(S_CHECK);
- else
- signalReadDone(FAIL, 0);
- }
- break;
- case S_CHECK:
- signalReadDone(SUCCESS, (value > DEAD_THRESH) ? 0 : m_value);
- break;
- }
- }
- }
-}