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

Dependencies:   EthernetNetIf SDHCFileSystem I2CLEDDisp Agentbed NTPClient_NetServices mbed BMP085 HTTPClient ConfigFile I2CLCD

Committer:
okini3939
Date:
Thu Jan 13 12:35:51 2011 +0000
Revision:
7:0d3484dc13a9
Child:
9:8c63e4f3edab

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 7:0d3484dc13a9 1 /** @file
okini3939 7:0d3484dc13a9 2 * @brief mbed Weather Platform
okini3939 7:0d3484dc13a9 3 */
okini3939 7:0d3484dc13a9 4 #include "mbed.h"
okini3939 7:0d3484dc13a9 5 #include "conf.h"
okini3939 7:0d3484dc13a9 6 #include "ConfigFile.h"
okini3939 7:0d3484dc13a9 7
okini3939 7:0d3484dc13a9 8 extern struct Config conf;
okini3939 7:0d3484dc13a9 9 extern float pres, temp, humi, light, anemo, vane, rain, uv, moist, temp2;
okini3939 7:0d3484dc13a9 10
okini3939 7:0d3484dc13a9 11 char* chop (char *s) {
okini3939 7:0d3484dc13a9 12 int i;
okini3939 7:0d3484dc13a9 13
okini3939 7:0d3484dc13a9 14 for (i = strlen(s) - 1; i >= 0; i --) {
okini3939 7:0d3484dc13a9 15 if (s[i] == ' ' || s[i] == '\n' || s[i] == '\r') {
okini3939 7:0d3484dc13a9 16 s[i] = 0;
okini3939 7:0d3484dc13a9 17 } else {
okini3939 7:0d3484dc13a9 18 break;
okini3939 7:0d3484dc13a9 19 }
okini3939 7:0d3484dc13a9 20 }
okini3939 7:0d3484dc13a9 21 return s;
okini3939 7:0d3484dc13a9 22 }
okini3939 7:0d3484dc13a9 23
okini3939 7:0d3484dc13a9 24 int check_action (char type) {
okini3939 7:0d3484dc13a9 25 int i, j, count;
okini3939 7:0d3484dc13a9 26 float value;
okini3939 7:0d3484dc13a9 27 time_t sec = time(NULL) + (60 * 60 * 9);
okini3939 7:0d3484dc13a9 28 struct tm *tim = localtime(&sec);
okini3939 7:0d3484dc13a9 29
okini3939 7:0d3484dc13a9 30 for(i = 0; i < conf.actionscount; i ++) {
okini3939 7:0d3484dc13a9 31 if (conf.actions[i].action != type) continue;
okini3939 7:0d3484dc13a9 32
okini3939 7:0d3484dc13a9 33 count = 0;
okini3939 7:0d3484dc13a9 34 for (j = 0; j < conf.actions[i].count; j ++) {
okini3939 7:0d3484dc13a9 35 switch (conf.actions[i].exps[j].key) {
okini3939 7:0d3484dc13a9 36 case 'P':
okini3939 7:0d3484dc13a9 37 value = pres;
okini3939 7:0d3484dc13a9 38 break;
okini3939 7:0d3484dc13a9 39 case 'T':
okini3939 7:0d3484dc13a9 40 value = temp;
okini3939 7:0d3484dc13a9 41 break;
okini3939 7:0d3484dc13a9 42 case 'H':
okini3939 7:0d3484dc13a9 43 value = humi;
okini3939 7:0d3484dc13a9 44 break;
okini3939 7:0d3484dc13a9 45 case 'A':
okini3939 7:0d3484dc13a9 46 value = anemo;
okini3939 7:0d3484dc13a9 47 break;
okini3939 7:0d3484dc13a9 48 case 'V':
okini3939 7:0d3484dc13a9 49 value = vane;
okini3939 7:0d3484dc13a9 50 break;
okini3939 7:0d3484dc13a9 51 case 'R':
okini3939 7:0d3484dc13a9 52 value = rain;
okini3939 7:0d3484dc13a9 53 break;
okini3939 7:0d3484dc13a9 54
okini3939 7:0d3484dc13a9 55 case 'y':
okini3939 7:0d3484dc13a9 56 value = tim->tm_year + 1900;
okini3939 7:0d3484dc13a9 57 break;
okini3939 7:0d3484dc13a9 58 case 'm':
okini3939 7:0d3484dc13a9 59 value = tim->tm_mon;
okini3939 7:0d3484dc13a9 60 break;
okini3939 7:0d3484dc13a9 61 case 'd':
okini3939 7:0d3484dc13a9 62 value = tim->tm_mday;
okini3939 7:0d3484dc13a9 63 break;
okini3939 7:0d3484dc13a9 64 case 'h':
okini3939 7:0d3484dc13a9 65 value = tim->tm_hour;
okini3939 7:0d3484dc13a9 66 break;
okini3939 7:0d3484dc13a9 67 case 'i':
okini3939 7:0d3484dc13a9 68 value = tim->tm_min;
okini3939 7:0d3484dc13a9 69 break;
okini3939 7:0d3484dc13a9 70 case 's':
okini3939 7:0d3484dc13a9 71 value = tim->tm_sec;
okini3939 7:0d3484dc13a9 72 break;
okini3939 7:0d3484dc13a9 73
okini3939 7:0d3484dc13a9 74 default:
okini3939 7:0d3484dc13a9 75 value = 0;
okini3939 7:0d3484dc13a9 76 break;
okini3939 7:0d3484dc13a9 77 }
okini3939 7:0d3484dc13a9 78
okini3939 7:0d3484dc13a9 79 switch (conf.actions[i].exps[j].expression) {
okini3939 7:0d3484dc13a9 80 case EXP_EQ:
okini3939 7:0d3484dc13a9 81 if (value == conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 82 count ++;
okini3939 7:0d3484dc13a9 83 }
okini3939 7:0d3484dc13a9 84 break;
okini3939 7:0d3484dc13a9 85 case EXP_NE:
okini3939 7:0d3484dc13a9 86 if (value != conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 87 count ++;
okini3939 7:0d3484dc13a9 88 }
okini3939 7:0d3484dc13a9 89 break;
okini3939 7:0d3484dc13a9 90 case EXP_LE:
okini3939 7:0d3484dc13a9 91 if (value <= conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 92 count ++;
okini3939 7:0d3484dc13a9 93 }
okini3939 7:0d3484dc13a9 94 break;
okini3939 7:0d3484dc13a9 95 case EXP_LT:
okini3939 7:0d3484dc13a9 96 if (value < conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 97 count ++;
okini3939 7:0d3484dc13a9 98 }
okini3939 7:0d3484dc13a9 99 break;
okini3939 7:0d3484dc13a9 100 case EXP_GE:
okini3939 7:0d3484dc13a9 101 if (value >= conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 102 count ++;
okini3939 7:0d3484dc13a9 103 }
okini3939 7:0d3484dc13a9 104 break;
okini3939 7:0d3484dc13a9 105 case EXP_GT:
okini3939 7:0d3484dc13a9 106 if (value > conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 107 count ++;
okini3939 7:0d3484dc13a9 108 }
okini3939 7:0d3484dc13a9 109 break;
okini3939 7:0d3484dc13a9 110 case EXP_MOD:
okini3939 7:0d3484dc13a9 111 if ((int)value % (int)conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 112 count ++;
okini3939 7:0d3484dc13a9 113 }
okini3939 7:0d3484dc13a9 114 break;
okini3939 7:0d3484dc13a9 115 case EXP_NMOD:
okini3939 7:0d3484dc13a9 116 if (! (int)value % (int)conf.actions[i].exps[j].value) {
okini3939 7:0d3484dc13a9 117 count ++;
okini3939 7:0d3484dc13a9 118 }
okini3939 7:0d3484dc13a9 119 break;
okini3939 7:0d3484dc13a9 120
okini3939 7:0d3484dc13a9 121 default:
okini3939 7:0d3484dc13a9 122 count ++;
okini3939 7:0d3484dc13a9 123 break;
okini3939 7:0d3484dc13a9 124 }
okini3939 7:0d3484dc13a9 125 }
okini3939 7:0d3484dc13a9 126 if (count == conf.actions[i].count) {
okini3939 7:0d3484dc13a9 127 return 1;
okini3939 7:0d3484dc13a9 128 }
okini3939 7:0d3484dc13a9 129 }
okini3939 7:0d3484dc13a9 130 return 0;
okini3939 7:0d3484dc13a9 131 }
okini3939 7:0d3484dc13a9 132
okini3939 7:0d3484dc13a9 133 void add_actionsub (struct tExpression *exp, char *buf) {
okini3939 7:0d3484dc13a9 134
okini3939 7:0d3484dc13a9 135 exp->key = buf[0];
okini3939 7:0d3484dc13a9 136
okini3939 7:0d3484dc13a9 137 switch (buf[1]) {
okini3939 7:0d3484dc13a9 138 case '=':
okini3939 7:0d3484dc13a9 139 if (buf[2] == '=') {
okini3939 7:0d3484dc13a9 140 exp->expression = EXP_EQ;
okini3939 7:0d3484dc13a9 141 exp->value = atof(&buf[3]);
okini3939 7:0d3484dc13a9 142 }
okini3939 7:0d3484dc13a9 143 break;
okini3939 7:0d3484dc13a9 144
okini3939 7:0d3484dc13a9 145 case '!':
okini3939 7:0d3484dc13a9 146 if (buf[2] == '=') {
okini3939 7:0d3484dc13a9 147 exp->expression = EXP_NE;
okini3939 7:0d3484dc13a9 148 exp->value = atof(&buf[3]);
okini3939 7:0d3484dc13a9 149 } else
okini3939 7:0d3484dc13a9 150 if (buf[2] == '%') {
okini3939 7:0d3484dc13a9 151 exp->expression = EXP_NMOD;
okini3939 7:0d3484dc13a9 152 exp->value = atof(&buf[3]);
okini3939 7:0d3484dc13a9 153 }
okini3939 7:0d3484dc13a9 154 break;
okini3939 7:0d3484dc13a9 155
okini3939 7:0d3484dc13a9 156 case '<':
okini3939 7:0d3484dc13a9 157 if (buf[2] == '=') {
okini3939 7:0d3484dc13a9 158 exp->expression = EXP_LE;
okini3939 7:0d3484dc13a9 159 exp->value = atof(&buf[3]);
okini3939 7:0d3484dc13a9 160 } else {
okini3939 7:0d3484dc13a9 161 exp->expression = EXP_LT;
okini3939 7:0d3484dc13a9 162 exp->value = atof(&buf[2]);
okini3939 7:0d3484dc13a9 163 }
okini3939 7:0d3484dc13a9 164 break;
okini3939 7:0d3484dc13a9 165
okini3939 7:0d3484dc13a9 166 case '>':
okini3939 7:0d3484dc13a9 167 if (buf[2] == '=') {
okini3939 7:0d3484dc13a9 168 exp->expression = EXP_GE;
okini3939 7:0d3484dc13a9 169 exp->value = atof(&buf[3]);
okini3939 7:0d3484dc13a9 170 } else {
okini3939 7:0d3484dc13a9 171 exp->expression = EXP_GT;
okini3939 7:0d3484dc13a9 172 exp->value = atof(&buf[2]);
okini3939 7:0d3484dc13a9 173 }
okini3939 7:0d3484dc13a9 174 break;
okini3939 7:0d3484dc13a9 175
okini3939 7:0d3484dc13a9 176 case '%':
okini3939 7:0d3484dc13a9 177 exp->expression = EXP_MOD;
okini3939 7:0d3484dc13a9 178 exp->value = atof(&buf[2]);
okini3939 7:0d3484dc13a9 179 break;
okini3939 7:0d3484dc13a9 180
okini3939 7:0d3484dc13a9 181 default:
okini3939 7:0d3484dc13a9 182 exp->expression = EXP_NULL;
okini3939 7:0d3484dc13a9 183 break;
okini3939 7:0d3484dc13a9 184 }
okini3939 7:0d3484dc13a9 185 }
okini3939 7:0d3484dc13a9 186
okini3939 7:0d3484dc13a9 187 void add_action (char *buf) {
okini3939 7:0d3484dc13a9 188 int i, len, count;
okini3939 7:0d3484dc13a9 189 char c;
okini3939 7:0d3484dc13a9 190 char *tmp = NULL;
okini3939 7:0d3484dc13a9 191
okini3939 7:0d3484dc13a9 192 if (conf.actionscount >= CF_ACTION_NUM) return;
okini3939 7:0d3484dc13a9 193
okini3939 7:0d3484dc13a9 194 // conf.actions[conf.actionscount].action = atoi(&buf[0]);
okini3939 7:0d3484dc13a9 195 conf.actions[conf.actionscount].action = buf[0];
okini3939 7:0d3484dc13a9 196
okini3939 7:0d3484dc13a9 197 count = 0;
okini3939 7:0d3484dc13a9 198 strcat(buf, "\n");
okini3939 7:0d3484dc13a9 199 len = strlen(buf);
okini3939 7:0d3484dc13a9 200 for (i = 0; i < len; i ++) {
okini3939 7:0d3484dc13a9 201 c = buf[i];
okini3939 7:0d3484dc13a9 202 if (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
okini3939 7:0d3484dc13a9 203 buf[i] = 0;
okini3939 7:0d3484dc13a9 204 if (count) {
okini3939 7:0d3484dc13a9 205 add_actionsub(&conf.actions[conf.actionscount].exps[count - 1], tmp);
okini3939 7:0d3484dc13a9 206 }
okini3939 7:0d3484dc13a9 207 if (count >= CF_ACTION_EXPS || c == '\n') break;
okini3939 7:0d3484dc13a9 208 tmp = &buf[i + 1];
okini3939 7:0d3484dc13a9 209 count ++;
okini3939 7:0d3484dc13a9 210 }
okini3939 7:0d3484dc13a9 211 }
okini3939 7:0d3484dc13a9 212
okini3939 7:0d3484dc13a9 213 conf.actions[conf.actionscount].count = count;
okini3939 7:0d3484dc13a9 214 conf.actionscount ++;
okini3939 7:0d3484dc13a9 215 }
okini3939 7:0d3484dc13a9 216
okini3939 7:0d3484dc13a9 217 int config (char *file) {
okini3939 7:0d3484dc13a9 218 int i;
okini3939 7:0d3484dc13a9 219 ConfigFile cfg;
okini3939 7:0d3484dc13a9 220 char buf[80], key[20];
okini3939 7:0d3484dc13a9 221 int ip0, ip1, ip2, ip3;
okini3939 7:0d3484dc13a9 222
okini3939 7:0d3484dc13a9 223 conf.ipaddr = IpAddr(0, 0, 0, 0);
okini3939 7:0d3484dc13a9 224 conf.netmask = IpAddr(255, 255, 255, 0);
okini3939 7:0d3484dc13a9 225 conf.gateway = IpAddr(0, 0, 0, 0);
okini3939 7:0d3484dc13a9 226 conf.nameserver = IpAddr(0, 0, 0, 0);
okini3939 7:0d3484dc13a9 227 conf.interval = 60;
okini3939 7:0d3484dc13a9 228 conf.ntpserver[0] = 0;
okini3939 7:0d3484dc13a9 229 conf.filetype = 0;
okini3939 7:0d3484dc13a9 230 conf.actionscount = 0;
okini3939 7:0d3484dc13a9 231 conf.pachube_apikey[0] = 0;
okini3939 7:0d3484dc13a9 232 conf.pachube_feedid[0] = 0;
okini3939 7:0d3484dc13a9 233 conf.twitter_user[0] = 0;
okini3939 7:0d3484dc13a9 234 conf.twitter_pwd[0] = 0;
okini3939 7:0d3484dc13a9 235 conf.twitter_mesg[0] = 0;
okini3939 7:0d3484dc13a9 236 conf.stations_id[0] = 0;
okini3939 7:0d3484dc13a9 237 conf.stations_pin[0] = 0;
okini3939 7:0d3484dc13a9 238 conf.snmp_commname[0] = 0;
okini3939 7:0d3484dc13a9 239
okini3939 7:0d3484dc13a9 240 if (! cfg.read(file)) {
okini3939 7:0d3484dc13a9 241 return -1;
okini3939 7:0d3484dc13a9 242 }
okini3939 7:0d3484dc13a9 243
okini3939 7:0d3484dc13a9 244 if (cfg.getValue("INTERVAL", buf, sizeof(buf))) {
okini3939 7:0d3484dc13a9 245 conf.interval = atoi(chop(buf));
okini3939 7:0d3484dc13a9 246 }
okini3939 7:0d3484dc13a9 247 if (cfg.getValue("FILE", buf, sizeof(buf))) {
okini3939 7:0d3484dc13a9 248 chop(buf);
okini3939 7:0d3484dc13a9 249 if (strcmp(buf, "SD") == 0) {
okini3939 7:0d3484dc13a9 250 conf.filetype = 1;
okini3939 7:0d3484dc13a9 251 } else
okini3939 7:0d3484dc13a9 252 if (strcmp(buf, "USB") == 0) {
okini3939 7:0d3484dc13a9 253 conf.filetype = 2;
okini3939 7:0d3484dc13a9 254 }
okini3939 7:0d3484dc13a9 255 }
okini3939 7:0d3484dc13a9 256
okini3939 7:0d3484dc13a9 257 if (cfg.getValue("IPADDRESS", buf, sizeof(buf))) {
okini3939 7:0d3484dc13a9 258 chop(buf);
okini3939 7:0d3484dc13a9 259 if (strcmp(buf, "DHCP") == 0) {
okini3939 7:0d3484dc13a9 260 conf.ipaddr = IpAddr(255, 255, 255, 255);
okini3939 7:0d3484dc13a9 261 } else {
okini3939 7:0d3484dc13a9 262 sscanf(buf, "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 7:0d3484dc13a9 263 conf.ipaddr = IpAddr(ip0, ip1, ip2, ip3);
okini3939 7:0d3484dc13a9 264 }
okini3939 7:0d3484dc13a9 265 }
okini3939 7:0d3484dc13a9 266 if (cfg.getValue("NETMASK", buf, sizeof(buf))) {
okini3939 7:0d3484dc13a9 267 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 7:0d3484dc13a9 268 conf.netmask = IpAddr(ip0, ip1, ip2, ip3);
okini3939 7:0d3484dc13a9 269 }
okini3939 7:0d3484dc13a9 270 if (cfg.getValue("GATEWAY", buf, sizeof(buf))) {
okini3939 7:0d3484dc13a9 271 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 7:0d3484dc13a9 272 conf.gateway = IpAddr(ip0, ip1, ip2, ip3);
okini3939 7:0d3484dc13a9 273 }
okini3939 7:0d3484dc13a9 274 if (cfg.getValue("NAMESERVER", buf, sizeof(buf))) {
okini3939 7:0d3484dc13a9 275 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 7:0d3484dc13a9 276 conf.nameserver = IpAddr(ip0, ip1, ip2, ip3);
okini3939 7:0d3484dc13a9 277 }
okini3939 7:0d3484dc13a9 278
okini3939 7:0d3484dc13a9 279 cfg.getValue("NTPSERVER", conf.ntpserver, sizeof(conf.ntpserver));
okini3939 7:0d3484dc13a9 280 chop(conf.ntpserver);
okini3939 7:0d3484dc13a9 281 cfg.getValue("PACHUBE_APIKEY", conf.pachube_apikey, sizeof(conf.pachube_apikey));
okini3939 7:0d3484dc13a9 282 chop(conf.pachube_apikey);
okini3939 7:0d3484dc13a9 283 cfg.getValue("PACHUBE_FEEDID", conf.pachube_feedid, sizeof(conf.pachube_feedid));
okini3939 7:0d3484dc13a9 284 chop(conf.pachube_feedid);
okini3939 7:0d3484dc13a9 285 cfg.getValue("TWITTER_USER", conf.twitter_user, sizeof(conf.twitter_user));
okini3939 7:0d3484dc13a9 286 chop(conf.twitter_user);
okini3939 7:0d3484dc13a9 287 cfg.getValue("TWITTER_PWD", conf.twitter_pwd, sizeof(conf.twitter_pwd));
okini3939 7:0d3484dc13a9 288 chop(conf.twitter_pwd);
okini3939 7:0d3484dc13a9 289 cfg.getValue("TWITTER_MESG", conf.twitter_mesg, sizeof(conf.twitter_mesg));
okini3939 7:0d3484dc13a9 290 chop(conf.twitter_mesg);
okini3939 7:0d3484dc13a9 291 cfg.getValue("STATIONS_ID", conf.stations_id, sizeof(conf.stations_id));
okini3939 7:0d3484dc13a9 292 chop(conf.stations_id);
okini3939 7:0d3484dc13a9 293 cfg.getValue("STATIONS_PIN", conf.stations_pin, sizeof(conf.stations_pin));
okini3939 7:0d3484dc13a9 294 chop(conf.stations_pin);
okini3939 7:0d3484dc13a9 295 cfg.getValue("SNMP_COMMNAME", conf.snmp_commname, sizeof(conf.snmp_commname));
okini3939 7:0d3484dc13a9 296 chop(conf.snmp_commname);
okini3939 7:0d3484dc13a9 297
okini3939 7:0d3484dc13a9 298 for (i = 0; i < CF_ACTION_NUM; i ++) {
okini3939 7:0d3484dc13a9 299 sprintf(key, "ACTION[%d]", i);
okini3939 7:0d3484dc13a9 300 if (cfg.getValue(key, buf, sizeof(buf))) {
okini3939 7:0d3484dc13a9 301 add_action(chop(buf));
okini3939 7:0d3484dc13a9 302 }
okini3939 7:0d3484dc13a9 303 }
okini3939 7:0d3484dc13a9 304
okini3939 7:0d3484dc13a9 305 return 0;
okini3939 7:0d3484dc13a9 306 }