From 4f0def622af5baa14e297eac8f3fb695b0a25bb7 Mon Sep 17 00:00:00 2001 From: smckown Date: Wed, 5 Aug 2009 02:57:07 +0000 Subject: [PATCH] Move weather instrument sensors code out of TOSDIR/chips, as they aren't. For now, we'll place them in TOSDIR/platforms/tmirws/sensors. Also, renamed are the OwwSpeed files, to Anemometer, and OwwVane files to WindVane, as these names better reflect the fact that the code isn't all that OWW or Davis specific. --- tos/chips/davis/OwwSpeed.h | 45 ---- tos/chips/davis/OwwSpeedP.nc | 111 --------- tos/chips/davis/OwwVane.h | 56 ----- tos/chips/davis/OwwVaneC.nc | 50 ---- tos/chips/davis/OwwVaneP.nc | 231 ------------------ .../tmirws/sensors/Anemometer.h} | 8 +- .../tmirws/sensors/AnemometerC.nc} | 22 +- .../tmirws/sensors/AnemometerP.nc} | 20 +- .../HalAnemometerC.nc} | 27 +- .../HalAnemometerP.nc} | 10 +- .../{chips/oww => sensors}/HalOwwVaneC.nc | 0 .../{chips/oww => sensors}/HalOwwVaneP.nc | 0 .../tmirws/sensors/HalWindVaneC.nc} | 20 +- tos/platforms/tmirws/sensors/HalWindVaneP.nc | 63 +++++ .../tmirws/sensors/WindVane.h} | 21 +- tos/platforms/tmirws/sensors/WindVaneAdcC.nc | 61 +++++ tos/platforms/tmirws/sensors/WindVaneAdcP.nc | 70 ++++++ .../tmirws/sensors/WindVaneC.nc} | 18 +- .../tmirws/sensors/WindVaneP.nc} | 76 +++--- 19 files changed, 299 insertions(+), 610 deletions(-) delete mode 100644 tos/chips/davis/OwwSpeed.h delete mode 100644 tos/chips/davis/OwwSpeedP.nc delete mode 100644 tos/chips/davis/OwwVane.h delete mode 100644 tos/chips/davis/OwwVaneC.nc delete mode 100644 tos/chips/davis/OwwVaneP.nc rename tos/{chips/oww/OwwSpeed.h => platforms/tmirws/sensors/Anemometer.h} (95%) rename tos/{chips/davis/OwwSpeedC.nc => platforms/tmirws/sensors/AnemometerC.nc} (81%) rename tos/{chips/oww/OwwSpeedP.nc => platforms/tmirws/sensors/AnemometerP.nc} (88%) rename tos/platforms/tmirws/{chips/oww/HalOwwSpeedC.nc => sensors/HalAnemometerC.nc} (72%) rename tos/platforms/tmirws/{chips/oww/HalOwwSpeedP.nc => sensors/HalAnemometerP.nc} (93%) rename tos/platforms/tmirws/{chips/oww => sensors}/HalOwwVaneC.nc (100%) rename tos/platforms/tmirws/{chips/oww => sensors}/HalOwwVaneP.nc (100%) rename tos/{chips/oww/OwwSpeedC.nc => platforms/tmirws/sensors/HalWindVaneC.nc} (83%) create mode 100644 tos/platforms/tmirws/sensors/HalWindVaneP.nc rename tos/{chips/oww/OwwVane.h => platforms/tmirws/sensors/WindVane.h} (84%) create mode 100644 tos/platforms/tmirws/sensors/WindVaneAdcC.nc create mode 100644 tos/platforms/tmirws/sensors/WindVaneAdcP.nc rename tos/{chips/oww/OwwVaneC.nc => platforms/tmirws/sensors/WindVaneC.nc} (86%) rename tos/{chips/oww/OwwVaneP.nc => platforms/tmirws/sensors/WindVaneP.nc} (80%) diff --git a/tos/chips/davis/OwwSpeed.h b/tos/chips/davis/OwwSpeed.h deleted file mode 100644 index 9c9c9b97..00000000 --- a/tos/chips/davis/OwwSpeed.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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. - */ - -/** - * OWW speed definitions - * - * @author R. Steve McKown - */ - -#ifndef OWW_SPEED_H -#define OWW_SPEED_H - -typedef struct { - uint8_t min; - uint8_t avg; - uint8_t max; -} oww_speed_t; - -#endif diff --git a/tos/chips/davis/OwwSpeedP.nc b/tos/chips/davis/OwwSpeedP.nc deleted file mode 100644 index 7f1870ff..00000000 --- a/tos/chips/davis/OwwSpeedP.nc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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. - */ - -/** - * OwwSpeed sensor - * - * @author R. Steve McKown - */ - -#include "OwwSpeed.h" - -module OwwSpeedP { - provides interface ReadRef; - uses { - interface Tick as Second; - interface AsyncGet as CPSA; - interface AsyncGet as CPSB; - } -} -implementation { - oww_speed_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 (uint8_t)(2.453 * (cps >> 1) + 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(oww_speed_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 = minSpeed; - m_data->avg = call CPSB.get(); - m_data->max = maxSpeed; - minSpeed = 255; - maxSpeed = 0; - } - signalDone(SUCCESS); - } - - void signalDone(error_t error) - { - oww_speed_t* tmp = m_data; - - m_data = 0; - signal ReadRef.readDone(error, tmp); - } -} diff --git a/tos/chips/davis/OwwVane.h b/tos/chips/davis/OwwVane.h deleted file mode 100644 index c1ae5d71..00000000 --- a/tos/chips/davis/OwwVane.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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. - */ - -/** - * OWW vane (wind direction) definitions - * - * @author R. Steve McKown - */ - -#ifndef OWW_VANE_H -#define OWW_VANE_H - -/* Units are degrees/2, so 90 degrees is 45 units. This allows a full - * circle of degrees to be represented in a single byte for small storage. - * Resolution reduction is fine, since the OWW's native resolution is - * 22.5 degrees. - */ -typedef struct { -#if 0 - uint8_t left; - uint8_t avg; - uint8_t right; -#else - uint16_t left; - uint16_t avg; - uint16_t right; -#endif -} oww_vane_t; - -#endif diff --git a/tos/chips/davis/OwwVaneC.nc b/tos/chips/davis/OwwVaneC.nc deleted file mode 100644 index f4ee4c15..00000000 --- a/tos/chips/davis/OwwVaneC.nc +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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. - */ - -/** - * OwwVane sensor - * - * @author R. Steve McKown - */ - -#include "OwwVane.h" - -configuration OwwVaneC { - provides interface ReadRef; -} -implementation { - components OwwVaneP; - ReadRef = OwwVaneP; - - components SoftwareRtcC as RtcC; - OwwVaneP.Second -> RtcC; - - components HalOwwVaneC; - OwwVaneP.Vane -> HalOwwVaneC.AsyncGet; -} diff --git a/tos/chips/davis/OwwVaneP.nc b/tos/chips/davis/OwwVaneP.nc deleted file mode 100644 index 35ee7d67..00000000 --- a/tos/chips/davis/OwwVaneP.nc +++ /dev/null @@ -1,231 +0,0 @@ -/* - * 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. - */ - -/** - * OwwVane sensor - * - * @author R. Steve McKown - */ - -#include "OwwVane.h" - -module OwwVaneP { - provides interface ReadRef; - uses { - interface Tick as Second; - interface AsyncGet as Vane; - } -} -implementation { -#define COMPASS_COUNT 16 - - oww_vane_t* m_data; - /* compass[0] = North, 0 degrees, - * compass(COMPASS_COUNT/2) = South, 180 degrees. - */ - uint16_t compass[COMPASS_COUNT]; - - - /*** Support functions ***/ - - - /* return the number of positions clockwise along the compass from start - * to end. - */ - uint8_t distance(uint8_t start, uint8_t end) - { - return (end > start) ? end - start : (end + COMPASS_COUNT) - start; - } - - /* circularly examine compass, starting with pos+1, for the next compass - * position having a value of zero. - */ - uint8_t nextNonZero(uint16_t* tc, uint8_t pos) - { - do { - pos = (pos + 1) % COMPASS_COUNT; - } while (tc[pos] == 0); - return pos; - } - - bool isCompassEmpty(uint16_t* tc) - { - int i; - - for (i = 0; i < COMPASS_COUNT; i++) { - if (tc[i]) - break; - } - return (i == COMPASS_COUNT) ? TRUE : FALSE; - } - - /* Reduce all compass headings equally until a compass heading has a value - * of zero. - */ - void minimizeCompass(uint16_t* tc) - { - uint8_t min = 255; - - do { - int i; - - for (i = 0; i < COMPASS_COUNT; i++) { - if (tc[i] < min) - min = tc[i]; - } - if (min > 0) { - for (i = 0; i < COMPASS_COUNT; i++) - tc[i] -= min; - } - } while (min); - } - - /* Locate the arc in which the 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(uint16_t* tc) - { - uint8_t begin; - uint8_t save = 255; - uint8_t dist = 0; - - begin = m_data->left = nextNonZero(tc, COMPASS_COUNT - 1); - do { - uint8_t d; - - m_data->right = nextNonZero(tc, 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) % COMPASS_COUNT; - } - - void calcAvg(uint16_t* tc) - { - /* 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 + COMPASS_COUNT; - int i; - - for (i = m_data->left; i <= tmp; i++) { - uint8_t p = i % COMPASS_COUNT; - - sum += tc[p] * i; - count += tc[p]; - } - /* Reduce the sum by whole compass arcs, since only the remaining - * partial arc is of relevance. - */ - tmp = COMPASS_COUNT * count; - while (sum >= tmp) - sum -= tmp; - m_data->avg = (sum == 0) ? 0 : (3600 / COMPASS_COUNT) * sum / count / 10; - } - - - /*** Method implementations ***/ - - - async event void Second.fired() - { - const static uint8_t lookup[] = { - 0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x18, - 0x10, 0x30, 0x20, 0x60, 0x40, 0xc0, 0x80, 0x81 - }; - uint8_t wind; - uint8_t i = 0; - - wind = call Vane.get(); - for (i = 0; i < sizeof(lookup); i++) { - if (lookup[i] == wind) { - compass[i]++; - return; - } - } - } - - task void readCompass(); - - command error_t ReadRef.read(oww_vane_t* data) - { - if (!data) - return EINVAL; - else if (m_data) - return EBUSY; - else { - m_data = data; - post readCompass(); - return SUCCESS; - } - } - - void signalDone(error_t); - - task void readCompass() - { - uint16_t tc[COMPASS_COUNT]; - - atomic { - memcpy(tc, compass, sizeof(compass)); - memset(compass, 0, sizeof(compass)); - } - - if (isCompassEmpty(tc)) { - signalDone(FAIL); - return; - } - minimizeCompass(tc); - findArc(tc); - calcAvg(tc); - - /* m_data's left, avg and right fields are currently represented in - * compass positions. We must now convert those fields into units of - * angular degrees. - */ - m_data->left = 3600U / COMPASS_COUNT * m_data->left / 10; - m_data->right = 3600U / COMPASS_COUNT * m_data->right / 10; - signalDone(SUCCESS); - } - - void signalDone(error_t error) - { - oww_vane_t* tmp = m_data; - - m_data = 0; - signal ReadRef.readDone(error, tmp); - } -} diff --git a/tos/chips/oww/OwwSpeed.h b/tos/platforms/tmirws/sensors/Anemometer.h similarity index 95% rename from tos/chips/oww/OwwSpeed.h rename to tos/platforms/tmirws/sensors/Anemometer.h index b47d05dd..936a4445 100644 --- a/tos/chips/oww/OwwSpeed.h +++ b/tos/platforms/tmirws/sensors/Anemometer.h @@ -28,18 +28,18 @@ */ /** - * OWW speed definitions + * Anemometer definitions * * @author R. Steve McKown */ -#ifndef OWW_SPEED_H -#define OWW_SPEED_H +#ifndef ANEMOMETER_H +#define ANEMOMETER_H typedef struct { uint8_t min; uint8_t avg; uint8_t max; -} oww_speed_t; +} anemometer_t; #endif diff --git a/tos/chips/davis/OwwSpeedC.nc b/tos/platforms/tmirws/sensors/AnemometerC.nc similarity index 81% rename from tos/chips/davis/OwwSpeedC.nc rename to tos/platforms/tmirws/sensors/AnemometerC.nc index 4bd255fa..b141ca78 100644 --- a/tos/chips/davis/OwwSpeedC.nc +++ b/tos/platforms/tmirws/sensors/AnemometerC.nc @@ -28,24 +28,24 @@ */ /** - * OwwSpeed sensor + * Anemometer sensor, measuring wind speed * - * @author R. Steve McKown + * @author R. Steve McKown */ -#include "OwwSpeed.h" +#include "Anemometer.h" -configuration OwwSpeedC { - provides interface ReadRef; +configuration AnemometerC { + provides interface ReadRef; } implementation { - components OwwSpeedP; - ReadRef = OwwSpeedP; + components AnemometerP; + ReadRef = AnemometerP; components SoftwareRtcC as RtcC; - OwwSpeedP.Second -> RtcC; + AnemometerP.Second -> RtcC; - components HalOwwSpeedC; - OwwSpeedP.CPSA -> HalOwwSpeedC.CPSA; - OwwSpeedP.CPSB -> HalOwwSpeedC.CPSB; + components HalAnemometerC; + AnemometerP.CPSA -> HalAnemometerC.CPSA; + AnemometerP.CPSB -> HalAnemometerC.CPSB; } diff --git a/tos/chips/oww/OwwSpeedP.nc b/tos/platforms/tmirws/sensors/AnemometerP.nc similarity index 88% rename from tos/chips/oww/OwwSpeedP.nc rename to tos/platforms/tmirws/sensors/AnemometerP.nc index 6d7437e1..40f8fc3f 100644 --- a/tos/chips/oww/OwwSpeedP.nc +++ b/tos/platforms/tmirws/sensors/AnemometerP.nc @@ -28,15 +28,15 @@ */ /** - * OwwSpeed sensor + * Anemometer sensor, measuring wind speed * * @author R. Steve McKown */ -#include "OwwSpeed.h" +#include "Anemometer.h" -module OwwSpeedP { - provides interface ReadRef; +module AnemometerP { + provides interface ReadRef; uses { interface Tick as Second; interface AsyncGet as CPSA; @@ -44,7 +44,7 @@ module OwwSpeedP { } } implementation { - oww_speed_t* m_data; + anemometer_t* m_data; uint8_t minSpeed = 255; uint8_t maxSpeed; @@ -74,7 +74,7 @@ implementation { task void readSpeed(); - command error_t ReadRef.read(oww_speed_t* data) + command error_t ReadRef.read(anemometer_t* data) { if (!data) return EINVAL; @@ -92,9 +92,9 @@ implementation { task void readSpeed() { atomic { - m_data->min = minSpeed; - m_data->avg = call CPSB.get(); - m_data->max = maxSpeed; + m_data->min = toMph(minSpeed); + m_data->avg = toMph(call CPSB.get()); + m_data->max = toMph(maxSpeed); minSpeed = 255; maxSpeed = 0; } @@ -103,7 +103,7 @@ implementation { void signalDone(error_t error) { - oww_speed_t* tmp = m_data; + anemometer_t* tmp = m_data; m_data = 0; signal ReadRef.readDone(error, tmp); diff --git a/tos/platforms/tmirws/chips/oww/HalOwwSpeedC.nc b/tos/platforms/tmirws/sensors/HalAnemometerC.nc similarity index 72% rename from tos/platforms/tmirws/chips/oww/HalOwwSpeedC.nc rename to tos/platforms/tmirws/sensors/HalAnemometerC.nc index de0e6637..f5ada625 100644 --- a/tos/platforms/tmirws/chips/oww/HalOwwSpeedC.nc +++ b/tos/platforms/tmirws/sensors/HalAnemometerC.nc @@ -28,32 +28,33 @@ */ /** - * HAL/HPL layers for the OwwSpeed sensor. CPSA and CPSB are independent - * services that each provide a counts per second value that represents the - * average CPS since the last call to CPSx.get(). The first call to - * CPSx.get() is derived from a start time of initialization of the - * HalOwwSpeedP component. + * 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 */ -#include "OwwSpeed.h" +#include "Anemometer.h" -configuration HalOwwSpeedC { +configuration HalAnemometerC { provides interface AsyncGet as CPSA; provides interface AsyncGet as CPSB; } implementation { - components HalOwwSpeedP; - CPSA = HalOwwSpeedP.CPSA; - CPSB = HalOwwSpeedP.CPSB; + components HalAnemometerP; + CPSA = HalAnemometerP.CPSA; + CPSB = HalAnemometerP.CPSB; components MainC; - MainC.SoftwareInit -> HalOwwSpeedP.Init; + MainC.SoftwareInit -> HalAnemometerP.Init; components Counter32khz32C; - HalOwwSpeedP.TimeCounter -> Counter32khz32C; + HalAnemometerP.TimeCounter -> Counter32khz32C; components Msp430CounterMicroC; - HalOwwSpeedP.SpinCounter -> Msp430CounterMicroC; + HalAnemometerP.SpinCounter -> Msp430CounterMicroC; } diff --git a/tos/platforms/tmirws/chips/oww/HalOwwSpeedP.nc b/tos/platforms/tmirws/sensors/HalAnemometerP.nc similarity index 93% rename from tos/platforms/tmirws/chips/oww/HalOwwSpeedP.nc rename to tos/platforms/tmirws/sensors/HalAnemometerP.nc index fb3ed6bc..89e5928a 100644 --- a/tos/platforms/tmirws/chips/oww/HalOwwSpeedP.nc +++ b/tos/platforms/tmirws/sensors/HalAnemometerP.nc @@ -28,14 +28,14 @@ */ /** - * HAL/HPL layers for the OwwSpeed sensor. + * HAL layer for the Anemometer sensor. * * @author R. Steve McKown */ -#include "OwwSpeed.h" +#include "Anemometer.h" -module HalOwwSpeedP { +module HalAnemometerP { provides { interface Init; interface AsyncGet as CPSA; @@ -55,7 +55,9 @@ implementation { command error_t Init.init() { atomic { - /* Initialize Timer A, clock source is io pin P1.0 */ + /* 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; diff --git a/tos/platforms/tmirws/chips/oww/HalOwwVaneC.nc b/tos/platforms/tmirws/sensors/HalOwwVaneC.nc similarity index 100% rename from tos/platforms/tmirws/chips/oww/HalOwwVaneC.nc rename to tos/platforms/tmirws/sensors/HalOwwVaneC.nc diff --git a/tos/platforms/tmirws/chips/oww/HalOwwVaneP.nc b/tos/platforms/tmirws/sensors/HalOwwVaneP.nc similarity index 100% rename from tos/platforms/tmirws/chips/oww/HalOwwVaneP.nc rename to tos/platforms/tmirws/sensors/HalOwwVaneP.nc diff --git a/tos/chips/oww/OwwSpeedC.nc b/tos/platforms/tmirws/sensors/HalWindVaneC.nc similarity index 83% rename from tos/chips/oww/OwwSpeedC.nc rename to tos/platforms/tmirws/sensors/HalWindVaneC.nc index 97adadb8..21322ae1 100644 --- a/tos/chips/oww/OwwSpeedC.nc +++ b/tos/platforms/tmirws/sensors/HalWindVaneC.nc @@ -28,24 +28,20 @@ */ /** - * OwwSpeed sensor + * HAL layer for the wind vane sensor. * * @author R. Steve McKown */ -#include "OwwSpeed.h" +#include "WindVane.h" -configuration OwwSpeedC { - provides interface ReadRef; +configuration HalWindVaneC { + provides interface AsyncGet; } implementation { - components OwwSpeedP; - ReadRef = OwwSpeedP; + components HalWindVaneP; + AsyncGet = HalWindVaneP; - components SoftwareRtcC as RtcC; - OwwSpeedP.Second -> RtcC; - - components HalOwwSpeedC; - OwwSpeedP.CPSA -> HalOwwSpeedC.CPSA; - OwwSpeedP.CPSB -> HalOwwSpeedC.CPSB; + components MainC; + MainC.SoftwareInit -> HalWindVaneP.Init; } diff --git a/tos/platforms/tmirws/sensors/HalWindVaneP.nc b/tos/platforms/tmirws/sensors/HalWindVaneP.nc new file mode 100644 index 00000000..92bd42a1 --- /dev/null +++ b/tos/platforms/tmirws/sensors/HalWindVaneP.nc @@ -0,0 +1,63 @@ +/* + * 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 WindVane sensor. + * + * @author R. Steve McKown + */ + +#include "WindVane.h" + +module HalWindVaneP { + provides { + interface Init; + interface AsyncGet 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; + } +} diff --git a/tos/chips/oww/OwwVane.h b/tos/platforms/tmirws/sensors/WindVane.h similarity index 84% rename from tos/chips/oww/OwwVane.h rename to tos/platforms/tmirws/sensors/WindVane.h index 3eab9534..20afde75 100644 --- a/tos/chips/oww/OwwVane.h +++ b/tos/platforms/tmirws/sensors/WindVane.h @@ -28,29 +28,24 @@ */ /** - * OWW vane (wind direction) definitions + * Wind Vane (direction) definitions * * @author R. Steve McKown */ -#ifndef OWW_VANE_H -#define OWW_VANE_H +#ifndef WIND_VANE_H +#define WIND_VANE_H + +#define WINDVANE_NO_HEADING 255 /* Units are degrees/2, so 90 degrees is 45 units. This allows a full - * circle of degrees to be represented in a single byte for small storage. - * Resolution reduction is fine, since the OWW's native resolution is - * 22.5 degrees. + * 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 { -#if 0 uint8_t left; uint8_t avg; uint8_t right; -#else - uint16_t left; - uint16_t avg; - uint16_t right; -#endif -} oww_vane_t; +} wind_vane_t; #endif diff --git a/tos/platforms/tmirws/sensors/WindVaneAdcC.nc b/tos/platforms/tmirws/sensors/WindVaneAdcC.nc new file mode 100644 index 00000000..472f9ec7 --- /dev/null +++ b/tos/platforms/tmirws/sensors/WindVaneAdcC.nc @@ -0,0 +1,61 @@ +/* + * 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 + */ + +generic configuration BatteryAdcC() { + provides interface Read; + provides interface ReadStream; + + provides interface Resource; + provides interface ReadNow; +} +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; +} diff --git a/tos/platforms/tmirws/sensors/WindVaneAdcP.nc b/tos/platforms/tmirws/sensors/WindVaneAdcP.nc new file mode 100644 index 00000000..a80362ba --- /dev/null +++ b/tos/platforms/tmirws/sensors/WindVaneAdcP.nc @@ -0,0 +1,70 @@ +/* + * 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 + */ + +#include "Msp430Adc12.h" + +module BatteryAdcP { + provides interface AdcConfigure; +} +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; + } +} diff --git a/tos/chips/oww/OwwVaneC.nc b/tos/platforms/tmirws/sensors/WindVaneC.nc similarity index 86% rename from tos/chips/oww/OwwVaneC.nc rename to tos/platforms/tmirws/sensors/WindVaneC.nc index 82d23cd7..1ce247fa 100644 --- a/tos/chips/oww/OwwVaneC.nc +++ b/tos/platforms/tmirws/sensors/WindVaneC.nc @@ -28,23 +28,23 @@ */ /** - * OwwVane sensor + * WindVane sensor * * @author R. Steve McKown */ -#include "OwwVane.h" +#include "WindVane.h" -configuration OwwVaneC { - provides interface ReadRef; +configuration WindVaneC { + provides interface ReadRef; } implementation { - components OwwVaneP; - ReadRef = OwwVaneP; + components WindVaneP; + ReadRef = WindVaneP; components SoftwareRtcC as RtcC; - OwwVaneP.Second -> RtcC; + WindVaneP.Second -> RtcC; - components HalOwwVaneC; - OwwVaneP.Vane -> HalOwwVaneC.AsyncGet; + components HalWindVaneC; + WindVaneP.Vane -> HalWindVaneC.AsyncGet; } diff --git a/tos/chips/oww/OwwVaneP.nc b/tos/platforms/tmirws/sensors/WindVaneP.nc similarity index 80% rename from tos/chips/oww/OwwVaneP.nc rename to tos/platforms/tmirws/sensors/WindVaneP.nc index 9755db11..a6976e95 100644 --- a/tos/chips/oww/OwwVaneP.nc +++ b/tos/platforms/tmirws/sensors/WindVaneP.nc @@ -28,24 +28,24 @@ */ /** - * OwwVane sensor + * WindVane sensor * * @author R. Steve McKown */ -#include "OwwVane.h" +#include "WindVane.h" -module OwwVaneP { - provides interface ReadRef; +module WindVaneP { + provides interface ReadRef; uses { interface Tick as Second; interface AsyncGet as Vane; } } implementation { -#define COMPASS_COUNT 16 +#define COMPASS_COUNT 32 - oww_vane_t* m_data; + wind_vane_t* m_data; /* compass[0] = North, 0 degrees, * compass(COMPASS_COUNT/2) = South, 180 degrees. */ @@ -91,19 +91,16 @@ implementation { void minimizeCompass(uint16_t* tc) { uint8_t min = 255; + int i; - do { - int i; - - for (i = 0; i < COMPASS_COUNT; i++) { - if (tc[i] < min) - min = tc[i]; - } - if (min > 0) { - for (i = 0; i < COMPASS_COUNT; i++) - tc[i] -= min; - } - } while (min); + for (i = 0; i < COMPASS_COUNT; i++) { + if (tc[i] < min) + min = tc[i]; + } + if (min > 0) { + for (i = 0; i < COMPASS_COUNT; i++) + tc[i] -= min; + } } /* Locate the arc in which the compass[] has been constrained, defining @@ -153,7 +150,7 @@ implementation { tmp = COMPASS_COUNT * count; while (sum >= tmp) sum -= tmp; - m_data->avg = (sum == 0) ? 0 : (3600 / COMPASS_COUNT) * sum / count / 10; + m_data->avg = (sum == 0) ? 0 : (1800 / COMPASS_COUNT) * sum / count / 10; } @@ -180,7 +177,7 @@ implementation { task void readCompass(); - command error_t ReadRef.read(oww_vane_t* data) + command error_t ReadRef.read(wind_vane_t* data) { if (!data) return EINVAL; @@ -193,39 +190,36 @@ implementation { } } - void signalDone(error_t); - task void readCompass() { uint16_t tc[COMPASS_COUNT]; + wind_vane_t* data = m_data; atomic { memcpy(tc, compass, sizeof(compass)); memset(compass, 0, sizeof(compass)); } + minimizeCompass(tc); if (isCompassEmpty(tc)) { - signalDone(FAIL); - return; + /* 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(tc); + calcAvg(tc); + + /* m_data's left, avg and right fields are currently represented in + * compass positions. We must now convert those fields into units of + * angular degrees. + */ + m_data->left = 1800U / COMPASS_COUNT * m_data->left / 10; + m_data->right = 1800U / COMPASS_COUNT * m_data->right / 10; } - minimizeCompass(tc); - findArc(tc); - calcAvg(tc); - - /* m_data's left, avg and right fields are currently represented in - * compass positions. We must now convert those fields into units of - * angular degrees. - */ - m_data->left = 3600U / COMPASS_COUNT * m_data->left / 10; - m_data->right = 3600U / COMPASS_COUNT * m_data->right / 10; - signalDone(SUCCESS); - } - - void signalDone(error_t error) - { - oww_vane_t* tmp = m_data; m_data = 0; - signal ReadRef.readDone(error, tmp); + signal ReadRef.readDone(SUCCESS, data); } } -- 2.39.2