Station API

Dependents:   GMCStation

Committer:
yamaguch
Date:
Thu Dec 22 02:08:01 2011 +0000
Revision:
5:3df13e2e928e
Parent:
4:ed5993d82ceb
added #include \"Utils.h\"

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 4:ed5993d82ceb 27 #include "Utils.h"
yamaguch 1:a22e390c70b3 28
yamaguch 1:a22e390c70b3 29 /**
yamaguch 1:a22e390c70b3 30 * class for Geiger Mueller Counter
yamaguch 1:a22e390c70b3 31 */
yamaguch 1:a22e390c70b3 32 class GMCounter {
yamaguch 1:a22e390c70b3 33 public:
yamaguch 1:a22e390c70b3 34 /**
yamaguch 2:a9d1a9c92927 35 * Constructor
yamaguch 1:a22e390c70b3 36 *
yamaguch 1:a22e390c70b3 37 * @param gmcPin pin for GMC input
yamaguch 1:a22e390c70b3 38 * @param buzzerPin pin for buzzer output
yamaguch 1:a22e390c70b3 39 * @param ledPin pin for LED output
yamaguch 2:a9d1a9c92927 40 * @param cpm2usv conversion ratio of CPM to uSv
yamaguch 2:a9d1a9c92927 41 * @param buzzerEnabled if true enable buzzer
yamaguch 2:a9d1a9c92927 42 * @param ledEnabled if true enable LED
yamaguch 1:a22e390c70b3 43 */
yamaguch 2:a9d1a9c92927 44 GMCounter(PinName gmcPin, PinName buzzerPin, PinName ledPin, float cpm2usv = 1.0F / 120, bool buzzerEnabled = true, bool ledEnabled = true)
yamaguch 2:a9d1a9c92927 45 : interrupt(gmcPin), buzzer(buzzerPin), led(ledPin), cpm2usv(cpm2usv), buzzerEnabled(buzzerEnabled), ledEnabled(ledEnabled),
yamaguch 2:a9d1a9c92927 46 counter(0), index(0), index60(0), elapsed(0) {
yamaguch 1:a22e390c70b3 47 memset(count, 0, sizeof(count));
yamaguch 1:a22e390c70b3 48 memset(count60, 0, sizeof(count60));
yamaguch 1:a22e390c70b3 49 ticker.attach(this, &GMCounter::tickerHandler, 1);
yamaguch 1:a22e390c70b3 50 ticker60.attach(this, &GMCounter::ticker60Handler, 60);
yamaguch 1:a22e390c70b3 51 interrupt.rise(this, &GMCounter::interruptHandler);
yamaguch 1:a22e390c70b3 52 }
yamaguch 1:a22e390c70b3 53
yamaguch 1:a22e390c70b3 54 /**
yamaguch 2:a9d1a9c92927 55 * creates an GMCounter object
yamaguch 2:a9d1a9c92927 56 *
yamaguch 2:a9d1a9c92927 57 * @param gmcPin pin for GMC input
yamaguch 2:a9d1a9c92927 58 * @param buzzerPin pin for buzzer output
yamaguch 2:a9d1a9c92927 59 * @param ledPin pin for LED output
yamaguch 2:a9d1a9c92927 60 * @param filename name of the config file
yamaguch 2:a9d1a9c92927 61 * @param verbose if true display debug info
yamaguch 2:a9d1a9c92927 62 *
yamaguch 2:a9d1a9c92927 63 * @returns GMCounter object
yamaguch 2:a9d1a9c92927 64 */
yamaguch 2:a9d1a9c92927 65 static GMCounter create(PinName gmcPin, PinName buzzerPin, PinName ledPin, char *filename, bool verbose = false) {
yamaguch 2:a9d1a9c92927 66 bool buzzerEnabled = true, ledEnabled = true;
yamaguch 2:a9d1a9c92927 67 float cpm2usv = 1.0F / 120;
yamaguch 2:a9d1a9c92927 68
yamaguch 2:a9d1a9c92927 69 if (filename) {
yamaguch 2:a9d1a9c92927 70 char path[32];
yamaguch 2:a9d1a9c92927 71 LocalFileSystem local("local");
yamaguch 2:a9d1a9c92927 72 sprintf(path, "/local/%s", filename);
yamaguch 2:a9d1a9c92927 73 if (FILE *fp = fopen(path, "r")) {
yamaguch 2:a9d1a9c92927 74 Utils::fgetValues(fp, "set-buzzer:%d", &buzzerEnabled);
yamaguch 2:a9d1a9c92927 75 Utils::fgetValues(fp, "set-led:%d", &ledEnabled);
yamaguch 2:a9d1a9c92927 76 Utils::fgetValues(fp, "cpm-to-usv:%f", &cpm2usv);
yamaguch 2:a9d1a9c92927 77 fclose(fp);
yamaguch 2:a9d1a9c92927 78 if (verbose) {
yamaguch 2:a9d1a9c92927 79 printf("set-buzzer:%d\n", buzzerEnabled);
yamaguch 2:a9d1a9c92927 80 printf("set-led:%d\n", ledEnabled);
yamaguch 2:a9d1a9c92927 81 printf("cpm-to-usv:%f\n", cpm2usv);
yamaguch 2:a9d1a9c92927 82 }
yamaguch 2:a9d1a9c92927 83 }
yamaguch 2:a9d1a9c92927 84 }
yamaguch 2:a9d1a9c92927 85
yamaguch 2:a9d1a9c92927 86 return GMCounter(gmcPin, buzzerPin, ledPin, cpm2usv, buzzerEnabled, ledEnabled);
yamaguch 2:a9d1a9c92927 87 }
yamaguch 2:a9d1a9c92927 88
yamaguch 2:a9d1a9c92927 89 /**
yamaguch 1:a22e390c70b3 90 * gets CPM (Counts Per Minute) value
yamaguch 1:a22e390c70b3 91 *
yamaguch 1:a22e390c70b3 92 * @returns counts during the last 60 seconds
yamaguch 1:a22e390c70b3 93 */
yamaguch 1:a22e390c70b3 94 int getCPM() {
yamaguch 1:a22e390c70b3 95 // make sure that no index updated while reading the array entries
yamaguch 1:a22e390c70b3 96 // if there was (interrupt happened!), retry reading.
yamaguch 1:a22e390c70b3 97 int i, cpm;
yamaguch 1:a22e390c70b3 98 do {
yamaguch 1:a22e390c70b3 99 i = index;
yamaguch 1:a22e390c70b3 100 cpm = count[(i - 1 + 61) % 61] - count[i];
yamaguch 1:a22e390c70b3 101 } while (i != index);
yamaguch 1:a22e390c70b3 102
yamaguch 1:a22e390c70b3 103 return cpm;
yamaguch 1:a22e390c70b3 104 }
yamaguch 1:a22e390c70b3 105
yamaguch 1:a22e390c70b3 106 /**
yamaguch 1:a22e390c70b3 107 * gets average CPM (Counts Per Minute)
yamaguch 1:a22e390c70b3 108 *
yamaguch 1:a22e390c70b3 109 * @returns average CPM during the last 60 minutes
yamaguch 1:a22e390c70b3 110 */
yamaguch 1:a22e390c70b3 111 float getAverageCPM() {
yamaguch 1:a22e390c70b3 112 // make sure that no index60 updated while reading the array entries
yamaguch 1:a22e390c70b3 113 // if there was (interrupt happened!), retry reading.
yamaguch 1:a22e390c70b3 114 int i, total;
yamaguch 1:a22e390c70b3 115 do {
yamaguch 1:a22e390c70b3 116 i = index60;
yamaguch 1:a22e390c70b3 117 total = count60[(i - 1 + 61) % 61] - count60[i];
yamaguch 1:a22e390c70b3 118 } while (i != index60);
yamaguch 1:a22e390c70b3 119
yamaguch 1:a22e390c70b3 120 return elapsed == 0 ? 0 : elapsed < 60.0 ? total / elapsed : total / 60.0;
yamaguch 1:a22e390c70b3 121 }
yamaguch 1:a22e390c70b3 122
yamaguch 1:a22e390c70b3 123 /**
yamaguch 2:a9d1a9c92927 124 * Returns radiation
yamaguch 2:a9d1a9c92927 125 *
yamaguch 2:a9d1a9c92927 126 * @returns radiation in uSv
yamaguch 2:a9d1a9c92927 127 */
yamaguch 2:a9d1a9c92927 128 float getRadiation() {
yamaguch 2:a9d1a9c92927 129 return getCPM() * cpm2usv;
yamaguch 2:a9d1a9c92927 130 }
yamaguch 2:a9d1a9c92927 131
yamaguch 2:a9d1a9c92927 132 /**
yamaguch 2:a9d1a9c92927 133 * Returns average radiation
yamaguch 2:a9d1a9c92927 134 *
yamaguch 2:a9d1a9c92927 135 * @returns average radiation during last 60 minutes in uSv
yamaguch 2:a9d1a9c92927 136 */
yamaguch 2:a9d1a9c92927 137 float getAverageRadiation() {
yamaguch 2:a9d1a9c92927 138 return getAverageCPM() * cpm2usv;
yamaguch 2:a9d1a9c92927 139 }
yamaguch 2:a9d1a9c92927 140
yamaguch 2:a9d1a9c92927 141 /**
yamaguch 1:a22e390c70b3 142 * returns buzzer status
yamaguch 1:a22e390c70b3 143 *
yamaguch 1:a22e390c70b3 144 * @returns buzzer status
yamaguch 1:a22e390c70b3 145 */
yamaguch 1:a22e390c70b3 146 bool getBuzzer() {
yamaguch 1:a22e390c70b3 147 return buzzerEnabled;
yamaguch 1:a22e390c70b3 148 }
yamaguch 1:a22e390c70b3 149
yamaguch 1:a22e390c70b3 150 /**
yamaguch 1:a22e390c70b3 151 * sets buzzer enabled or disabled
yamaguch 1:a22e390c70b3 152 */
yamaguch 1:a22e390c70b3 153 void setBuzzer(bool enable = true) {
yamaguch 1:a22e390c70b3 154 buzzerEnabled = enable;
yamaguch 1:a22e390c70b3 155 }
yamaguch 1:a22e390c70b3 156
yamaguch 1:a22e390c70b3 157 /**
yamaguch 1:a22e390c70b3 158 * returns LED status
yamaguch 1:a22e390c70b3 159 *
yamaguch 1:a22e390c70b3 160 * @returns LED status
yamaguch 1:a22e390c70b3 161 */
yamaguch 1:a22e390c70b3 162 bool getLED() {
yamaguch 1:a22e390c70b3 163 return ledEnabled;
yamaguch 1:a22e390c70b3 164 }
yamaguch 1:a22e390c70b3 165
yamaguch 1:a22e390c70b3 166 /**
yamaguch 1:a22e390c70b3 167 * sets LED enabled or disabled
yamaguch 1:a22e390c70b3 168 */
yamaguch 1:a22e390c70b3 169 void setLED(bool enable = true) {
yamaguch 1:a22e390c70b3 170 ledEnabled = enable;
yamaguch 1:a22e390c70b3 171 }
yamaguch 1:a22e390c70b3 172
yamaguch 2:a9d1a9c92927 173 /**
yamaguch 2:a9d1a9c92927 174 * sets CPM to uSv conversion ration
yamaguch 2:a9d1a9c92927 175 *
yamaguch 2:a9d1a9c92927 176 * @param cpm2usv conversion ratio uSv/CPM
yamaguch 2:a9d1a9c92927 177 */
yamaguch 2:a9d1a9c92927 178 void setConversionRatio(float cpm2usv) {
yamaguch 2:a9d1a9c92927 179 this->cpm2usv = cpm2usv;
yamaguch 2:a9d1a9c92927 180 }
yamaguch 2:a9d1a9c92927 181
yamaguch 1:a22e390c70b3 182 private:
yamaguch 1:a22e390c70b3 183 InterruptIn interrupt;
yamaguch 1:a22e390c70b3 184 DigitalOut buzzer;
yamaguch 1:a22e390c70b3 185 DigitalOut led;
yamaguch 1:a22e390c70b3 186 Timeout timeout;
yamaguch 1:a22e390c70b3 187 Ticker ticker, ticker60;
yamaguch 2:a9d1a9c92927 188 float cpm2usv;
yamaguch 2:a9d1a9c92927 189 bool buzzerEnabled;
yamaguch 2:a9d1a9c92927 190 bool ledEnabled;
yamaguch 1:a22e390c70b3 191 unsigned int counter;
yamaguch 1:a22e390c70b3 192 unsigned int count[61];
yamaguch 1:a22e390c70b3 193 unsigned int count60[61];
yamaguch 1:a22e390c70b3 194 int index;
yamaguch 1:a22e390c70b3 195 int index60;
yamaguch 1:a22e390c70b3 196 float elapsed;
yamaguch 1:a22e390c70b3 197
yamaguch 1:a22e390c70b3 198 void interruptHandler() {
yamaguch 1:a22e390c70b3 199 counter++;
yamaguch 1:a22e390c70b3 200 if (buzzerEnabled) buzzer = 1;
yamaguch 1:a22e390c70b3 201 if (ledEnabled) led = 1;
yamaguch 1:a22e390c70b3 202 timeout.attach(this, &GMCounter::timeoutHandler, 0.03);
yamaguch 1:a22e390c70b3 203 }
yamaguch 1:a22e390c70b3 204
yamaguch 1:a22e390c70b3 205 void tickerHandler() {
yamaguch 1:a22e390c70b3 206 count[index] = counter;
yamaguch 1:a22e390c70b3 207 index = (index + 1) % 61;
yamaguch 1:a22e390c70b3 208 }
yamaguch 1:a22e390c70b3 209
yamaguch 1:a22e390c70b3 210 void ticker60Handler() {
yamaguch 1:a22e390c70b3 211 if (elapsed < 60) elapsed++;
yamaguch 1:a22e390c70b3 212 count60[index60] = counter;
yamaguch 1:a22e390c70b3 213 index60 = (index60 + 1) % 61;
yamaguch 1:a22e390c70b3 214 }
yamaguch 1:a22e390c70b3 215
yamaguch 1:a22e390c70b3 216 void timeoutHandler() {
yamaguch 1:a22e390c70b3 217 if (buzzerEnabled) buzzer = 0;
yamaguch 1:a22e390c70b3 218 if (ledEnabled) led = 0;
yamaguch 1:a22e390c70b3 219 }
yamaguch 1:a22e390c70b3 220 };
yamaguch 1:a22e390c70b3 221
yamaguch 1:a22e390c70b3 222 #endif