Station API

Dependents:   GMCStation

Committer:
yamaguch
Date:
Mon Dec 12 02:33:21 2011 +0000
Revision:
1:a22e390c70b3
Child:
2:a9d1a9c92927
0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 1:a22e390c70b3 1 /*
yamaguch 1:a22e390c70b3 2 Copyright (c) 2011, Senio Networks, Inc.
yamaguch 1:a22e390c70b3 3
yamaguch 1:a22e390c70b3 4 Permission is hereby granted, free of charge, to any person obtaining a copy
yamaguch 1:a22e390c70b3 5 of this software and associated documentation files (the "Software"), to deal
yamaguch 1:a22e390c70b3 6 in the Software without restriction, including without limitation the rights
yamaguch 1:a22e390c70b3 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
yamaguch 1:a22e390c70b3 8 copies of the Software, and to permit persons to whom the Software is
yamaguch 1:a22e390c70b3 9 furnished to do so, subject to the following conditions:
yamaguch 1:a22e390c70b3 10
yamaguch 1:a22e390c70b3 11 The above copyright notice and this permission notice shall be included in
yamaguch 1:a22e390c70b3 12 all copies or substantial portions of the Software.
yamaguch 1:a22e390c70b3 13
yamaguch 1:a22e390c70b3 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
yamaguch 1:a22e390c70b3 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
yamaguch 1:a22e390c70b3 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
yamaguch 1:a22e390c70b3 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
yamaguch 1:a22e390c70b3 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
yamaguch 1:a22e390c70b3 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
yamaguch 1:a22e390c70b3 20 THE SOFTWARE.
yamaguch 1:a22e390c70b3 21 */
yamaguch 1:a22e390c70b3 22
yamaguch 1:a22e390c70b3 23 #ifndef GMCOUNTER_H
yamaguch 1:a22e390c70b3 24 #define GMCOUNTER_H
yamaguch 1:a22e390c70b3 25
yamaguch 1:a22e390c70b3 26 #include "mbed.h"
yamaguch 1:a22e390c70b3 27
yamaguch 1:a22e390c70b3 28 /**
yamaguch 1:a22e390c70b3 29 * class for Geiger Mueller Counter
yamaguch 1:a22e390c70b3 30 */
yamaguch 1:a22e390c70b3 31 class GMCounter {
yamaguch 1:a22e390c70b3 32 public:
yamaguch 1:a22e390c70b3 33 /**
yamaguch 1:a22e390c70b3 34 * creates GM Counter object
yamaguch 1:a22e390c70b3 35 *
yamaguch 1:a22e390c70b3 36 * @param gmcPin pin for GMC input
yamaguch 1:a22e390c70b3 37 * @param buzzerPin pin for buzzer output
yamaguch 1:a22e390c70b3 38 * @param ledPin pin for LED output
yamaguch 1:a22e390c70b3 39 */
yamaguch 1:a22e390c70b3 40 GMCounter(PinName gmcPin, PinName buzzerPin = NC, PinName ledPin = NC) :
yamaguch 1:a22e390c70b3 41 interrupt(gmcPin), buzzer(buzzerPin), led(ledPin),
yamaguch 1:a22e390c70b3 42 counter(0), index(0), index60(0),
yamaguch 1:a22e390c70b3 43 elapsed(0), buzzerEnabled(buzzerPin != NC), ledEnabled(ledPin != NC) {
yamaguch 1:a22e390c70b3 44 memset(count, 0, sizeof(count));
yamaguch 1:a22e390c70b3 45 memset(count60, 0, sizeof(count60));
yamaguch 1:a22e390c70b3 46 ticker.attach(this, &GMCounter::tickerHandler, 1);
yamaguch 1:a22e390c70b3 47 ticker60.attach(this, &GMCounter::ticker60Handler, 60);
yamaguch 1:a22e390c70b3 48 interrupt.rise(this, &GMCounter::interruptHandler);
yamaguch 1:a22e390c70b3 49 }
yamaguch 1:a22e390c70b3 50
yamaguch 1:a22e390c70b3 51 /**
yamaguch 1:a22e390c70b3 52 * gets CPM (Counts Per Minute) value
yamaguch 1:a22e390c70b3 53 *
yamaguch 1:a22e390c70b3 54 * @returns counts during the last 60 seconds
yamaguch 1:a22e390c70b3 55 */
yamaguch 1:a22e390c70b3 56 int getCPM() {
yamaguch 1:a22e390c70b3 57 // make sure that no index updated while reading the array entries
yamaguch 1:a22e390c70b3 58 // if there was (interrupt happened!), retry reading.
yamaguch 1:a22e390c70b3 59 int i, cpm;
yamaguch 1:a22e390c70b3 60 do {
yamaguch 1:a22e390c70b3 61 i = index;
yamaguch 1:a22e390c70b3 62 cpm = count[(i - 1 + 61) % 61] - count[i];
yamaguch 1:a22e390c70b3 63 } while (i != index);
yamaguch 1:a22e390c70b3 64
yamaguch 1:a22e390c70b3 65 return cpm;
yamaguch 1:a22e390c70b3 66 }
yamaguch 1:a22e390c70b3 67
yamaguch 1:a22e390c70b3 68 /**
yamaguch 1:a22e390c70b3 69 * gets average CPM (Counts Per Minute)
yamaguch 1:a22e390c70b3 70 *
yamaguch 1:a22e390c70b3 71 * @returns average CPM during the last 60 minutes
yamaguch 1:a22e390c70b3 72 */
yamaguch 1:a22e390c70b3 73 float getAverageCPM() {
yamaguch 1:a22e390c70b3 74 // make sure that no index60 updated while reading the array entries
yamaguch 1:a22e390c70b3 75 // if there was (interrupt happened!), retry reading.
yamaguch 1:a22e390c70b3 76 int i, total;
yamaguch 1:a22e390c70b3 77 do {
yamaguch 1:a22e390c70b3 78 i = index60;
yamaguch 1:a22e390c70b3 79 total = count60[(i - 1 + 61) % 61] - count60[i];
yamaguch 1:a22e390c70b3 80 } while (i != index60);
yamaguch 1:a22e390c70b3 81
yamaguch 1:a22e390c70b3 82 return elapsed == 0 ? 0 : elapsed < 60.0 ? total / elapsed : total / 60.0;
yamaguch 1:a22e390c70b3 83 }
yamaguch 1:a22e390c70b3 84
yamaguch 1:a22e390c70b3 85 /**
yamaguch 1:a22e390c70b3 86 * returns buzzer status
yamaguch 1:a22e390c70b3 87 *
yamaguch 1:a22e390c70b3 88 * @returns buzzer status
yamaguch 1:a22e390c70b3 89 */
yamaguch 1:a22e390c70b3 90 bool getBuzzer() {
yamaguch 1:a22e390c70b3 91 return buzzerEnabled;
yamaguch 1:a22e390c70b3 92 }
yamaguch 1:a22e390c70b3 93
yamaguch 1:a22e390c70b3 94 /**
yamaguch 1:a22e390c70b3 95 * sets buzzer enabled or disabled
yamaguch 1:a22e390c70b3 96 */
yamaguch 1:a22e390c70b3 97 void setBuzzer(bool enable = true) {
yamaguch 1:a22e390c70b3 98 buzzerEnabled = enable;
yamaguch 1:a22e390c70b3 99 }
yamaguch 1:a22e390c70b3 100
yamaguch 1:a22e390c70b3 101 /**
yamaguch 1:a22e390c70b3 102 * returns LED status
yamaguch 1:a22e390c70b3 103 *
yamaguch 1:a22e390c70b3 104 * @returns LED status
yamaguch 1:a22e390c70b3 105 */
yamaguch 1:a22e390c70b3 106 bool getLED() {
yamaguch 1:a22e390c70b3 107 return ledEnabled;
yamaguch 1:a22e390c70b3 108 }
yamaguch 1:a22e390c70b3 109
yamaguch 1:a22e390c70b3 110 /**
yamaguch 1:a22e390c70b3 111 * sets LED enabled or disabled
yamaguch 1:a22e390c70b3 112 */
yamaguch 1:a22e390c70b3 113 void setLED(bool enable = true) {
yamaguch 1:a22e390c70b3 114 ledEnabled = enable;
yamaguch 1:a22e390c70b3 115 }
yamaguch 1:a22e390c70b3 116
yamaguch 1:a22e390c70b3 117 private:
yamaguch 1:a22e390c70b3 118 InterruptIn interrupt;
yamaguch 1:a22e390c70b3 119 DigitalOut buzzer;
yamaguch 1:a22e390c70b3 120 DigitalOut led;
yamaguch 1:a22e390c70b3 121 Timeout timeout;
yamaguch 1:a22e390c70b3 122 Ticker ticker, ticker60;
yamaguch 1:a22e390c70b3 123 unsigned int counter;
yamaguch 1:a22e390c70b3 124 unsigned int count[61];
yamaguch 1:a22e390c70b3 125 unsigned int count60[61];
yamaguch 1:a22e390c70b3 126 int index;
yamaguch 1:a22e390c70b3 127 int index60;
yamaguch 1:a22e390c70b3 128 float elapsed;
yamaguch 1:a22e390c70b3 129 bool buzzerEnabled;
yamaguch 1:a22e390c70b3 130 bool ledEnabled;
yamaguch 1:a22e390c70b3 131
yamaguch 1:a22e390c70b3 132 void interruptHandler() {
yamaguch 1:a22e390c70b3 133 counter++;
yamaguch 1:a22e390c70b3 134 if (buzzerEnabled) buzzer = 1;
yamaguch 1:a22e390c70b3 135 if (ledEnabled) led = 1;
yamaguch 1:a22e390c70b3 136 timeout.attach(this, &GMCounter::timeoutHandler, 0.03);
yamaguch 1:a22e390c70b3 137 }
yamaguch 1:a22e390c70b3 138
yamaguch 1:a22e390c70b3 139 void tickerHandler() {
yamaguch 1:a22e390c70b3 140 count[index] = counter;
yamaguch 1:a22e390c70b3 141 index = (index + 1) % 61;
yamaguch 1:a22e390c70b3 142 }
yamaguch 1:a22e390c70b3 143
yamaguch 1:a22e390c70b3 144 void ticker60Handler() {
yamaguch 1:a22e390c70b3 145 if (elapsed < 60) elapsed++;
yamaguch 1:a22e390c70b3 146 count60[index60] = counter;
yamaguch 1:a22e390c70b3 147 index60 = (index60 + 1) % 61;
yamaguch 1:a22e390c70b3 148 }
yamaguch 1:a22e390c70b3 149
yamaguch 1:a22e390c70b3 150 void timeoutHandler() {
yamaguch 1:a22e390c70b3 151 if (buzzerEnabled) buzzer = 0;
yamaguch 1:a22e390c70b3 152 if (ledEnabled) led = 0;
yamaguch 1:a22e390c70b3 153 }
yamaguch 1:a22e390c70b3 154 };
yamaguch 1:a22e390c70b3 155
yamaguch 1:a22e390c70b3 156 #endif