mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/

Dependencies:   ChaNFSSD EthernetNetIf I2CLEDDisp Agentbed ChaNFSUSB ILinterpreter mbed BMP085 WeatherMeters ConfigFile ChaNFS I2CLCD

Committer:
okini3939
Date:
Sun Jul 10 15:36:46 2011 +0000
Revision:
1:6c7141895545
Parent:
0:bdb53686c194
Child:
2:a3e5edf84f74

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 1:6c7141895545 1 /*
okini3939 1:6c7141895545 2 * Weather Station - mbed Weather Platform
okini3939 1:6c7141895545 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 1:6c7141895545 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 1:6c7141895545 5 */
okini3939 1:6c7141895545 6
okini3939 0:bdb53686c194 7 /** @file
okini3939 1:6c7141895545 8 * @brief Weather Station
okini3939 0:bdb53686c194 9 */
okini3939 1:6c7141895545 10
okini3939 0:bdb53686c194 11 #include "mbed.h"
okini3939 0:bdb53686c194 12 #include "weather.h"
okini3939 0:bdb53686c194 13 #ifdef USE_IL
okini3939 0:bdb53686c194 14 #include "ILinterpreter.h"
okini3939 0:bdb53686c194 15
okini3939 0:bdb53686c194 16 static ILinterpreter ilip;
okini3939 0:bdb53686c194 17 #endif
okini3939 0:bdb53686c194 18 static Serial xbee(p13, p14);
okini3939 1:6c7141895545 19 static volatile int measure_flg = 0, exinout_flg = 0;
okini3939 1:6c7141895545 20 #ifdef USE_EXINOUT
okini3939 1:6c7141895545 21 static DigitalIn *exin1, *exin2;
okini3939 1:6c7141895545 22 static DigitalOut *exout1, *exout2;
okini3939 1:6c7141895545 23 #endif
okini3939 0:bdb53686c194 24
okini3939 0:bdb53686c194 25 #ifdef USE_IL
okini3939 0:bdb53686c194 26 // input relay
okini3939 0:bdb53686c194 27 float cb_input(char key, int keynum, eEXPRESSION exp, int old) {
okini3939 0:bdb53686c194 28 float value = 0;
okini3939 0:bdb53686c194 29 Sensor *s;
okini3939 0:bdb53686c194 30
okini3939 0:bdb53686c194 31 if (old) {
okini3939 0:bdb53686c194 32 s = &sensor_old;
okini3939 0:bdb53686c194 33 } else {
okini3939 0:bdb53686c194 34 s = &sensor;
okini3939 0:bdb53686c194 35 }
okini3939 0:bdb53686c194 36
okini3939 0:bdb53686c194 37 switch (key) {
okini3939 0:bdb53686c194 38 case 'A': // sensor
okini3939 0:bdb53686c194 39 switch (keynum) {
okini3939 0:bdb53686c194 40 case 0:
okini3939 0:bdb53686c194 41 value = s->pres;
okini3939 0:bdb53686c194 42 break;
okini3939 0:bdb53686c194 43 case 1:
okini3939 0:bdb53686c194 44 value = s->temp;
okini3939 0:bdb53686c194 45 break;
okini3939 0:bdb53686c194 46 case 2:
okini3939 0:bdb53686c194 47 value = s->humi;
okini3939 0:bdb53686c194 48 break;
okini3939 0:bdb53686c194 49 case 3:
okini3939 0:bdb53686c194 50 value = s->anemo;
okini3939 0:bdb53686c194 51 break;
okini3939 0:bdb53686c194 52 case 4:
okini3939 0:bdb53686c194 53 value = s->vane;
okini3939 0:bdb53686c194 54 break;
okini3939 0:bdb53686c194 55 case 5:
okini3939 0:bdb53686c194 56 value = s->rain;
okini3939 0:bdb53686c194 57 break;
okini3939 0:bdb53686c194 58 case 6:
okini3939 0:bdb53686c194 59 value = s->light;
okini3939 0:bdb53686c194 60 break;
okini3939 0:bdb53686c194 61 case 7:
okini3939 0:bdb53686c194 62 value = s->uv;
okini3939 0:bdb53686c194 63 break;
okini3939 0:bdb53686c194 64 case 8:
okini3939 0:bdb53686c194 65 value = s->moist;
okini3939 0:bdb53686c194 66 break;
okini3939 0:bdb53686c194 67 case 99:
okini3939 0:bdb53686c194 68 value = measure_flg;
okini3939 0:bdb53686c194 69 break;
okini3939 0:bdb53686c194 70 }
okini3939 0:bdb53686c194 71 break;
okini3939 0:bdb53686c194 72
okini3939 0:bdb53686c194 73 case 'I': // input
okini3939 0:bdb53686c194 74 if (keynum >= INPUT_NUM) break;
okini3939 0:bdb53686c194 75 value = s->input[keynum];
okini3939 0:bdb53686c194 76 break;
okini3939 0:bdb53686c194 77
okini3939 0:bdb53686c194 78 case 'Q': // output
okini3939 0:bdb53686c194 79 if (keynum >= OUTPUT_NUM) break;
okini3939 0:bdb53686c194 80 value = s->output[keynum];
okini3939 0:bdb53686c194 81 break;
okini3939 0:bdb53686c194 82 }
okini3939 0:bdb53686c194 83
okini3939 0:bdb53686c194 84 return value;
okini3939 0:bdb53686c194 85 }
okini3939 0:bdb53686c194 86
okini3939 0:bdb53686c194 87 // output relay
okini3939 0:bdb53686c194 88 void cb_output(char key, int keynum, int reg, eMNEMONIC mne) {
okini3939 0:bdb53686c194 89
okini3939 0:bdb53686c194 90 #ifdef DEBUG
okini3939 0:bdb53686c194 91 pc.printf("OUT [%c %d] %d %d\r\n", key, keynum, reg, mne);
okini3939 0:bdb53686c194 92 #endif
okini3939 0:bdb53686c194 93 pool_net();
okini3939 0:bdb53686c194 94
okini3939 0:bdb53686c194 95 switch (key) {
okini3939 0:bdb53686c194 96 case 'Q': // output
okini3939 0:bdb53686c194 97 if (keynum >= OUTPUT_NUM) break;
okini3939 0:bdb53686c194 98 if (mne == MNE_OUT) {
okini3939 0:bdb53686c194 99 sensor.output[keynum] = reg;
okini3939 0:bdb53686c194 100 } else
okini3939 0:bdb53686c194 101 if (mne == MNE_SET && reg) {
okini3939 0:bdb53686c194 102 sensor.output[keynum] = 1;
okini3939 0:bdb53686c194 103 } else
okini3939 0:bdb53686c194 104 if (mne == MNE_RST && reg) {
okini3939 0:bdb53686c194 105 sensor.output[keynum] = 0;
okini3939 0:bdb53686c194 106 }
okini3939 0:bdb53686c194 107 break;
okini3939 0:bdb53686c194 108
okini3939 0:bdb53686c194 109 case 'P': // Pachube
okini3939 0:bdb53686c194 110 if (mne == MNE_OUT && reg) {
okini3939 0:bdb53686c194 111 pachube(csv);
okini3939 0:bdb53686c194 112 }
okini3939 0:bdb53686c194 113 break;
okini3939 0:bdb53686c194 114
okini3939 0:bdb53686c194 115 case 'S': // Weather Stations
okini3939 0:bdb53686c194 116 if (mne == MNE_OUT && reg) {
okini3939 0:bdb53686c194 117 weatherstations();
okini3939 0:bdb53686c194 118 }
okini3939 0:bdb53686c194 119 break;
okini3939 0:bdb53686c194 120
okini3939 0:bdb53686c194 121 case 'W': // Twitter
okini3939 0:bdb53686c194 122 if (mne == MNE_OUT && reg) {
okini3939 0:bdb53686c194 123 twitter(keynum);
okini3939 0:bdb53686c194 124 }
okini3939 0:bdb53686c194 125 break;
okini3939 0:bdb53686c194 126
okini3939 1:6c7141895545 127 case 'B': // XBee
okini3939 0:bdb53686c194 128 if (mne == MNE_OUT && reg) {
okini3939 0:bdb53686c194 129 xbee.printf(csv);
okini3939 1:6c7141895545 130 xbee.printf("\r\n");
okini3939 0:bdb53686c194 131 }
okini3939 0:bdb53686c194 132 break;
okini3939 0:bdb53686c194 133
okini3939 0:bdb53686c194 134 case 'E': // E-mail
okini3939 0:bdb53686c194 135 if (mne == MNE_OUT && reg) {
okini3939 0:bdb53686c194 136 email(keynum);
okini3939 0:bdb53686c194 137 }
okini3939 0:bdb53686c194 138 break;
okini3939 0:bdb53686c194 139 }
okini3939 0:bdb53686c194 140
okini3939 0:bdb53686c194 141 pool_net();
okini3939 0:bdb53686c194 142 }
okini3939 0:bdb53686c194 143 #endif
okini3939 0:bdb53686c194 144
okini3939 0:bdb53686c194 145 void pool_ilip () {
okini3939 0:bdb53686c194 146 #ifdef USE_IL
okini3939 0:bdb53686c194 147 ilip.pool();
okini3939 0:bdb53686c194 148 #endif
okini3939 0:bdb53686c194 149 }
okini3939 0:bdb53686c194 150
okini3939 0:bdb53686c194 151 // execute IL
okini3939 0:bdb53686c194 152 void exec_ilip (int enable) {
okini3939 0:bdb53686c194 153 Sensor sensor_tmp;
okini3939 0:bdb53686c194 154
okini3939 0:bdb53686c194 155 measure_flg = enable;
okini3939 0:bdb53686c194 156
okini3939 1:6c7141895545 157 #ifdef USE_EXINOUT
okini3939 0:bdb53686c194 158 // set input
okini3939 1:6c7141895545 159 if (exinout_flg) {
okini3939 1:6c7141895545 160 sensor.input[0] = *exin1 ? 0 : 1;
okini3939 1:6c7141895545 161 sensor.input[1] = *exin2 ? 0 : 1;
okini3939 1:6c7141895545 162 }
okini3939 1:6c7141895545 163 #endif
okini3939 0:bdb53686c194 164
okini3939 0:bdb53686c194 165 sensor_tmp = sensor;
okini3939 0:bdb53686c194 166
okini3939 0:bdb53686c194 167 #ifdef USE_IL
okini3939 0:bdb53686c194 168 // every time
okini3939 0:bdb53686c194 169 if (ilip.exec()) {
okini3939 0:bdb53686c194 170 printf("IL: out of stack\r\n");
okini3939 0:bdb53686c194 171 }
okini3939 0:bdb53686c194 172 #else
okini3939 0:bdb53686c194 173 if (enable) {
okini3939 0:bdb53686c194 174 weatherstations();
okini3939 0:bdb53686c194 175 pachube(csv);
okini3939 0:bdb53686c194 176 email(0);
okini3939 0:bdb53686c194 177 }
okini3939 0:bdb53686c194 178 #endif
okini3939 0:bdb53686c194 179
okini3939 1:6c7141895545 180 #ifdef USE_EXINOUT
okini3939 0:bdb53686c194 181 // set output
okini3939 1:6c7141895545 182 if (exinout_flg) {
okini3939 1:6c7141895545 183 *exout1 = sensor.output[0];
okini3939 1:6c7141895545 184 *exout2 = sensor.output[1];
okini3939 1:6c7141895545 185 }
okini3939 1:6c7141895545 186 #endif
okini3939 0:bdb53686c194 187
okini3939 0:bdb53686c194 188 sensor_old = sensor_tmp;
okini3939 0:bdb53686c194 189 }
okini3939 0:bdb53686c194 190
okini3939 0:bdb53686c194 191 // init IL
okini3939 0:bdb53686c194 192 int init_ilip (char *dir) {
okini3939 1:6c7141895545 193 int r;
okini3939 0:bdb53686c194 194 char buf[40];
okini3939 0:bdb53686c194 195
okini3939 0:bdb53686c194 196 if (cfg.getValue("XBEE", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 197 xbee.baud(atoi(chop(buf)));
okini3939 0:bdb53686c194 198 }
okini3939 0:bdb53686c194 199
okini3939 1:6c7141895545 200 #ifdef USE_EXINOUT
okini3939 1:6c7141895545 201 if (cfg.getValue("INPUT", buf, sizeof(buf))) {
okini3939 1:6c7141895545 202 if (atoi(buf) == INPUT_EXINOUT) {
okini3939 1:6c7141895545 203 exout1 = new DigitalOut(p30);
okini3939 1:6c7141895545 204 exout2 = new DigitalOut(p29);
okini3939 1:6c7141895545 205 exin1 = new DigitalIn(p18);
okini3939 1:6c7141895545 206 exin1->mode(PullUp);
okini3939 1:6c7141895545 207 exin2 = new DigitalIn(p19);
okini3939 1:6c7141895545 208 exin2->mode(PullUp);
okini3939 1:6c7141895545 209 exinout_flg = 1;
okini3939 1:6c7141895545 210 }
okini3939 1:6c7141895545 211 }
okini3939 1:6c7141895545 212 #endif
okini3939 1:6c7141895545 213
okini3939 0:bdb53686c194 214 #ifdef USE_IL
okini3939 0:bdb53686c194 215 strcpy(buf, dir);
okini3939 0:bdb53686c194 216 strcat(buf, IL_FILE);
okini3939 1:6c7141895545 217 r = ilip.load(buf);
okini3939 1:6c7141895545 218 if (r > 0) {
okini3939 1:6c7141895545 219 pc.printf("IL load: %d\r\n", r);
okini3939 0:bdb53686c194 220 ilip.attach(cb_input, cb_output);
okini3939 0:bdb53686c194 221 }
okini3939 0:bdb53686c194 222 #endif
okini3939 0:bdb53686c194 223
okini3939 0:bdb53686c194 224 return 0;
okini3939 0:bdb53686c194 225 }