Station API

Dependents:   GMCStation

Committer:
yamaguch
Date:
Mon Dec 12 11:41:24 2011 +0000
Revision:
2:a9d1a9c92927
Parent:
1:a22e390c70b3
Child:
4:ed5993d82ceb

        

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