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:
Wed Jan 12 14:16:20 2011 +0000
Revision:
6:060cb9725ce3
Parent:
5:9fa79cb5ec98
Child:
7:0d3484dc13a9

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 2:4125fe2283ef 1 #include "mbed.h"
okini3939 2:4125fe2283ef 2 #include "ConfigFile.h"
okini3939 2:4125fe2283ef 3 #include "SDFileSystem.h"
okini3939 2:4125fe2283ef 4 #include "EthernetNetIf.h"
okini3939 2:4125fe2283ef 5 #include "NTPClient.h"
okini3939 2:4125fe2283ef 6 #include "HTTPClient.h"
okini3939 2:4125fe2283ef 7
okini3939 2:4125fe2283ef 8 #define TIMEZONE 9
okini3939 2:4125fe2283ef 9 //#define NONBLOCKING
okini3939 2:4125fe2283ef 10
okini3939 6:060cb9725ce3 11 #define STATION_URL "http://weather.sugakoubou.com/p"
okini3939 2:4125fe2283ef 12 #define TWITTER_URL "http://api.supertweet.net/1/statuses/update.xml"
okini3939 2:4125fe2283ef 13
okini3939 2:4125fe2283ef 14 extern Serial pc;
okini3939 2:4125fe2283ef 15 extern int seq;
okini3939 2:4125fe2283ef 16 extern char filename[];
okini3939 2:4125fe2283ef 17 extern ConfigFile conf;
okini3939 2:4125fe2283ef 18 extern DigitalOut led1, led2, led3, led4;
okini3939 2:4125fe2283ef 19
okini3939 2:4125fe2283ef 20 extern EthernetNetIf *eth;
okini3939 2:4125fe2283ef 21 extern NTPClient *ntp;
okini3939 2:4125fe2283ef 22 extern HTTPClient *clientP, *clientT;
okini3939 2:4125fe2283ef 23 extern float pres, temp, humi, light, anemo, vane, rain, uv, moist, temp2;
okini3939 2:4125fe2283ef 24
okini3939 2:4125fe2283ef 25
okini3939 2:4125fe2283ef 26 void writefile (char *buf) {
okini3939 2:4125fe2283ef 27 FILE *fp;
okini3939 2:4125fe2283ef 28
okini3939 2:4125fe2283ef 29 led3 = 1;
okini3939 2:4125fe2283ef 30 fp = fopen(filename, "a");
okini3939 2:4125fe2283ef 31 if (fp) {
okini3939 2:4125fe2283ef 32 fprintf(fp, buf);
okini3939 2:4125fe2283ef 33 fclose(fp);
okini3939 2:4125fe2283ef 34 } else {
okini3939 2:4125fe2283ef 35 led2 = 0;
okini3939 2:4125fe2283ef 36 conf.filetype = 0;
okini3939 2:4125fe2283ef 37 }
okini3939 2:4125fe2283ef 38 led3 = 0;
okini3939 2:4125fe2283ef 39 }
okini3939 2:4125fe2283ef 40
okini3939 5:9fa79cb5ec98 41 void weatherstations () {
okini3939 5:9fa79cb5ec98 42 char post_data[200];
okini3939 5:9fa79cb5ec98 43 HTTPText postContent("application/x-www-form-urlencoded");
okini3939 5:9fa79cb5ec98 44
okini3939 5:9fa79cb5ec98 45 led3 = 1;
okini3939 5:9fa79cb5ec98 46 strcpy(post_data, "fcd=");
okini3939 5:9fa79cb5ec98 47 strcat(post_data, conf.stations_id);
okini3939 5:9fa79cb5ec98 48 strcat(post_data, "&pin=");
okini3939 5:9fa79cb5ec98 49 strcat(post_data, conf.stations_pin);
okini3939 6:060cb9725ce3 50 sprintf(&post_data[strlen(post_data)], "&d0=%.2f&d1=%.2f&d2=%.2f&d3=%.2f&d4=%.2f&d5=%.2f&d6=%.2f&d7=%.2f&d8=%.2f&d9=%.2f", pres, temp, humi, anemo, vane, rain, light, uv, moist, temp2);
okini3939 5:9fa79cb5ec98 51 postContent.puts(post_data);
okini3939 5:9fa79cb5ec98 52
okini3939 5:9fa79cb5ec98 53 #ifdef NONBLOCKING
okini3939 5:9fa79cb5ec98 54 Net::poll();
okini3939 6:060cb9725ce3 55 clientP->post(STATION_URL, postContent, NULL, &cb_clientP);
okini3939 5:9fa79cb5ec98 56 Net::poll();
okini3939 5:9fa79cb5ec98 57 #else
okini3939 6:060cb9725ce3 58 clientP->post(STATION_URL, postContent, NULL);
okini3939 5:9fa79cb5ec98 59 #endif
okini3939 5:9fa79cb5ec98 60 led3 = 0;
okini3939 5:9fa79cb5ec98 61 }
okini3939 5:9fa79cb5ec98 62
okini3939 2:4125fe2283ef 63 void pachube (char *buf) {
okini3939 2:4125fe2283ef 64 char uri[100];
okini3939 2:4125fe2283ef 65 HTTPText csvContent("text/csv");
okini3939 2:4125fe2283ef 66
okini3939 2:4125fe2283ef 67 led3 = 1;
okini3939 2:4125fe2283ef 68 clientP->setRequestHeader("X-PachubeApiKey", conf.pachube_apikey);
okini3939 2:4125fe2283ef 69 csvContent.set(buf);
okini3939 2:4125fe2283ef 70 strcpy(uri, "http://api.pachube.com/v1/feeds/");
okini3939 2:4125fe2283ef 71 strcat(uri, conf.pachube_feedid);
okini3939 2:4125fe2283ef 72 strcat(uri, ".csv?_method=put");
okini3939 2:4125fe2283ef 73 #ifdef NONBLOCKING
okini3939 2:4125fe2283ef 74 Net::poll();
okini3939 2:4125fe2283ef 75 clientP->post(uri, csvContent, NULL, &cb_clientP);
okini3939 2:4125fe2283ef 76 Net::poll();
okini3939 2:4125fe2283ef 77 #else
okini3939 2:4125fe2283ef 78 clientP->post(uri, csvContent, NULL);
okini3939 2:4125fe2283ef 79 #endif
okini3939 2:4125fe2283ef 80 led3 = 0;
okini3939 2:4125fe2283ef 81 }
okini3939 2:4125fe2283ef 82
okini3939 2:4125fe2283ef 83 void cb_clientP (HTTPResult status) {
okini3939 2:4125fe2283ef 84 if (status != HTTP_OK) {
okini3939 2:4125fe2283ef 85 pc.printf("Pachube failure (%d)\r\n", status);
okini3939 2:4125fe2283ef 86 // pc.printf("Pachube failure (%d, %d)\r\n", status, clientP->getHTTPResponseCode());
okini3939 2:4125fe2283ef 87 }
okini3939 2:4125fe2283ef 88 }
okini3939 2:4125fe2283ef 89
okini3939 2:4125fe2283ef 90 void twitstr (char *buf, int len) {
okini3939 2:4125fe2283ef 91 int i, j;
okini3939 2:4125fe2283ef 92 char c;
okini3939 2:4125fe2283ef 93 float value;
okini3939 2:4125fe2283ef 94 time_t sec = time(NULL);
okini3939 2:4125fe2283ef 95 struct tm *tim = localtime(&sec);
okini3939 2:4125fe2283ef 96
okini3939 2:4125fe2283ef 97 j = 0;
okini3939 2:4125fe2283ef 98 for (i = 0; i < strlen(conf.twitter_mesg) && j < len; i ++) {
okini3939 2:4125fe2283ef 99 c = conf.twitter_mesg[i];
okini3939 2:4125fe2283ef 100 if (c == '%') {
okini3939 2:4125fe2283ef 101 i ++;
okini3939 2:4125fe2283ef 102 c = conf.twitter_mesg[i];
okini3939 2:4125fe2283ef 103 switch (c) {
okini3939 2:4125fe2283ef 104 case 'P':
okini3939 2:4125fe2283ef 105 value = pres;
okini3939 2:4125fe2283ef 106 break;
okini3939 2:4125fe2283ef 107 case 'T':
okini3939 2:4125fe2283ef 108 value = temp;
okini3939 2:4125fe2283ef 109 break;
okini3939 2:4125fe2283ef 110 case 'H':
okini3939 2:4125fe2283ef 111 value = humi;
okini3939 2:4125fe2283ef 112 break;
okini3939 2:4125fe2283ef 113 case 'A':
okini3939 2:4125fe2283ef 114 value = anemo;
okini3939 2:4125fe2283ef 115 break;
okini3939 2:4125fe2283ef 116 case 'V':
okini3939 2:4125fe2283ef 117 value = vane;
okini3939 2:4125fe2283ef 118 break;
okini3939 2:4125fe2283ef 119 case 'R':
okini3939 2:4125fe2283ef 120 value = rain;
okini3939 2:4125fe2283ef 121 break;
okini3939 2:4125fe2283ef 122 case 'L':
okini3939 2:4125fe2283ef 123 value = light;
okini3939 2:4125fe2283ef 124 break;
okini3939 2:4125fe2283ef 125 case 'U':
okini3939 2:4125fe2283ef 126 value = uv;
okini3939 2:4125fe2283ef 127 break;
okini3939 2:4125fe2283ef 128
okini3939 2:4125fe2283ef 129 case 'y':
okini3939 2:4125fe2283ef 130 value = tim->tm_year + 1900;
okini3939 2:4125fe2283ef 131 break;
okini3939 2:4125fe2283ef 132 case 'm':
okini3939 2:4125fe2283ef 133 value = tim->tm_mon;
okini3939 2:4125fe2283ef 134 break;
okini3939 2:4125fe2283ef 135 case 'd':
okini3939 2:4125fe2283ef 136 value = tim->tm_mday;
okini3939 2:4125fe2283ef 137 break;
okini3939 2:4125fe2283ef 138 case 'h':
okini3939 2:4125fe2283ef 139 value = tim->tm_hour;
okini3939 2:4125fe2283ef 140 break;
okini3939 2:4125fe2283ef 141 case 'i':
okini3939 2:4125fe2283ef 142 value = tim->tm_min;
okini3939 2:4125fe2283ef 143 break;
okini3939 2:4125fe2283ef 144 case 's':
okini3939 2:4125fe2283ef 145 value = tim->tm_sec;
okini3939 2:4125fe2283ef 146 break;
okini3939 2:4125fe2283ef 147
okini3939 2:4125fe2283ef 148 case '%':
okini3939 2:4125fe2283ef 149 buf[j] = c;
okini3939 2:4125fe2283ef 150 j ++;
okini3939 2:4125fe2283ef 151 continue;
okini3939 2:4125fe2283ef 152 default:
okini3939 2:4125fe2283ef 153 continue;
okini3939 2:4125fe2283ef 154 }
okini3939 2:4125fe2283ef 155
okini3939 2:4125fe2283ef 156 if (c < 'a') {
okini3939 2:4125fe2283ef 157 sprintf(&buf[j], "%.2f", value);
okini3939 2:4125fe2283ef 158 } else {
okini3939 2:4125fe2283ef 159 sprintf(&buf[j], "%02d", (int)value);
okini3939 2:4125fe2283ef 160 }
okini3939 2:4125fe2283ef 161 j = strlen(buf);
okini3939 2:4125fe2283ef 162 } else {
okini3939 2:4125fe2283ef 163 buf[j] = c;
okini3939 2:4125fe2283ef 164 j ++;
okini3939 2:4125fe2283ef 165 }
okini3939 2:4125fe2283ef 166 }
okini3939 2:4125fe2283ef 167 buf[j] = 0;
okini3939 2:4125fe2283ef 168 }
okini3939 2:4125fe2283ef 169
okini3939 2:4125fe2283ef 170 void twitter () {
okini3939 2:4125fe2283ef 171 HTTPMap msg;
okini3939 2:4125fe2283ef 172 char buf[170];
okini3939 2:4125fe2283ef 173
okini3939 2:4125fe2283ef 174 led3 = 1;
okini3939 2:4125fe2283ef 175 twitstr(buf, sizeof(buf));
okini3939 2:4125fe2283ef 176 msg["status"] = buf;
okini3939 2:4125fe2283ef 177
okini3939 2:4125fe2283ef 178 clientT->basicAuth(conf.twitter_user, conf.twitter_pwd);
okini3939 2:4125fe2283ef 179 #ifdef NONBLOCKING
okini3939 2:4125fe2283ef 180 Net::poll();
okini3939 2:4125fe2283ef 181 clientT->post(TWITTER_URL, msg, NULL, &cb_clientT);
okini3939 2:4125fe2283ef 182 Net::poll();
okini3939 2:4125fe2283ef 183 #else
okini3939 2:4125fe2283ef 184 clientT->post(TWITTER_URL, msg, NULL);
okini3939 2:4125fe2283ef 185 #endif
okini3939 2:4125fe2283ef 186 led3 = 0;
okini3939 2:4125fe2283ef 187 }
okini3939 2:4125fe2283ef 188
okini3939 2:4125fe2283ef 189 void ntpdate () {
okini3939 2:4125fe2283ef 190 ntp = new NTPClient;
okini3939 2:4125fe2283ef 191 Host ntpserver(IpAddr(), 123, conf.ntpserver);
okini3939 2:4125fe2283ef 192
okini3939 2:4125fe2283ef 193 #ifdef NONBLOCKING
okini3939 2:4125fe2283ef 194 Net::poll();
okini3939 2:4125fe2283ef 195 ntp->setTime(ntpserver, &cb_settime);
okini3939 2:4125fe2283ef 196 Net::poll();
okini3939 2:4125fe2283ef 197 #else
okini3939 2:4125fe2283ef 198 ntp->setTime(ntpserver);
okini3939 2:4125fe2283ef 199 time_t sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 2:4125fe2283ef 200 set_time(sec);
okini3939 2:4125fe2283ef 201 #endif
okini3939 2:4125fe2283ef 202 }
okini3939 2:4125fe2283ef 203
okini3939 2:4125fe2283ef 204 void cb_settime (NTPResult status) {
okini3939 2:4125fe2283ef 205 if (status == NTP_OK) {
okini3939 2:4125fe2283ef 206 time_t sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 2:4125fe2283ef 207 set_time(sec);
okini3939 2:4125fe2283ef 208 pc.printf("Ntp success: %s\r\n", ctime(&sec));
okini3939 2:4125fe2283ef 209 } else {
okini3939 2:4125fe2283ef 210 pc.printf("Ntp failure (%d)\r\n", status);
okini3939 2:4125fe2283ef 211 }
okini3939 2:4125fe2283ef 212 // ntp->close();
okini3939 2:4125fe2283ef 213 }
okini3939 2:4125fe2283ef 214
okini3939 2:4125fe2283ef 215 int check_action (char type) {
okini3939 2:4125fe2283ef 216 int i, j, count;
okini3939 2:4125fe2283ef 217 float value;
okini3939 2:4125fe2283ef 218 time_t sec = time(NULL) + (60 * 60 * 9);
okini3939 2:4125fe2283ef 219 struct tm *tim = localtime(&sec);
okini3939 2:4125fe2283ef 220
okini3939 2:4125fe2283ef 221 for(i = 0; i < conf.actionscount; i ++) {
okini3939 2:4125fe2283ef 222 if (conf.actions[i].action != type) continue;
okini3939 2:4125fe2283ef 223
okini3939 2:4125fe2283ef 224 count = 0;
okini3939 2:4125fe2283ef 225 for (j = 0; j < conf.actions[i].count; j ++) {
okini3939 2:4125fe2283ef 226 switch (conf.actions[i].exps[j].key) {
okini3939 2:4125fe2283ef 227 case 'P':
okini3939 2:4125fe2283ef 228 value = pres;
okini3939 2:4125fe2283ef 229 break;
okini3939 2:4125fe2283ef 230 case 'T':
okini3939 2:4125fe2283ef 231 value = temp;
okini3939 2:4125fe2283ef 232 break;
okini3939 2:4125fe2283ef 233 case 'H':
okini3939 2:4125fe2283ef 234 value = humi;
okini3939 2:4125fe2283ef 235 break;
okini3939 2:4125fe2283ef 236 case 'A':
okini3939 2:4125fe2283ef 237 value = anemo;
okini3939 2:4125fe2283ef 238 break;
okini3939 2:4125fe2283ef 239 case 'V':
okini3939 2:4125fe2283ef 240 value = vane;
okini3939 2:4125fe2283ef 241 break;
okini3939 2:4125fe2283ef 242 case 'R':
okini3939 2:4125fe2283ef 243 value = rain;
okini3939 2:4125fe2283ef 244 break;
okini3939 2:4125fe2283ef 245
okini3939 2:4125fe2283ef 246 case 'y':
okini3939 2:4125fe2283ef 247 value = tim->tm_year + 1900;
okini3939 2:4125fe2283ef 248 break;
okini3939 2:4125fe2283ef 249 case 'm':
okini3939 2:4125fe2283ef 250 value = tim->tm_mon;
okini3939 2:4125fe2283ef 251 break;
okini3939 2:4125fe2283ef 252 case 'd':
okini3939 2:4125fe2283ef 253 value = tim->tm_mday;
okini3939 2:4125fe2283ef 254 break;
okini3939 2:4125fe2283ef 255 case 'h':
okini3939 2:4125fe2283ef 256 value = tim->tm_hour;
okini3939 2:4125fe2283ef 257 break;
okini3939 2:4125fe2283ef 258 case 'i':
okini3939 2:4125fe2283ef 259 value = tim->tm_min;
okini3939 2:4125fe2283ef 260 break;
okini3939 2:4125fe2283ef 261 case 's':
okini3939 2:4125fe2283ef 262 value = tim->tm_sec;
okini3939 2:4125fe2283ef 263 break;
okini3939 2:4125fe2283ef 264
okini3939 2:4125fe2283ef 265 default:
okini3939 2:4125fe2283ef 266 value = 0;
okini3939 2:4125fe2283ef 267 break;
okini3939 2:4125fe2283ef 268 }
okini3939 2:4125fe2283ef 269
okini3939 2:4125fe2283ef 270 switch (conf.actions[i].exps[j].expression) {
okini3939 2:4125fe2283ef 271 case EXP_EQ:
okini3939 2:4125fe2283ef 272 if (value == conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 273 count ++;
okini3939 2:4125fe2283ef 274 }
okini3939 2:4125fe2283ef 275 break;
okini3939 2:4125fe2283ef 276 case EXP_NE:
okini3939 2:4125fe2283ef 277 if (value != conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 278 count ++;
okini3939 2:4125fe2283ef 279 }
okini3939 2:4125fe2283ef 280 break;
okini3939 2:4125fe2283ef 281 case EXP_LE:
okini3939 2:4125fe2283ef 282 if (value <= conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 283 count ++;
okini3939 2:4125fe2283ef 284 }
okini3939 2:4125fe2283ef 285 break;
okini3939 2:4125fe2283ef 286 case EXP_LT:
okini3939 2:4125fe2283ef 287 if (value < conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 288 count ++;
okini3939 2:4125fe2283ef 289 }
okini3939 2:4125fe2283ef 290 break;
okini3939 2:4125fe2283ef 291 case EXP_GE:
okini3939 2:4125fe2283ef 292 if (value >= conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 293 count ++;
okini3939 2:4125fe2283ef 294 }
okini3939 2:4125fe2283ef 295 break;
okini3939 2:4125fe2283ef 296 case EXP_GT:
okini3939 2:4125fe2283ef 297 if (value > conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 298 count ++;
okini3939 2:4125fe2283ef 299 }
okini3939 2:4125fe2283ef 300 break;
okini3939 2:4125fe2283ef 301 case EXP_MOD:
okini3939 2:4125fe2283ef 302 if ((int)value % (int)conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 303 count ++;
okini3939 2:4125fe2283ef 304 }
okini3939 2:4125fe2283ef 305 break;
okini3939 2:4125fe2283ef 306 case EXP_NMOD:
okini3939 2:4125fe2283ef 307 if (! (int)value % (int)conf.actions[i].exps[j].value) {
okini3939 2:4125fe2283ef 308 count ++;
okini3939 2:4125fe2283ef 309 }
okini3939 2:4125fe2283ef 310 break;
okini3939 2:4125fe2283ef 311
okini3939 2:4125fe2283ef 312 default:
okini3939 2:4125fe2283ef 313 count ++;
okini3939 2:4125fe2283ef 314 break;
okini3939 2:4125fe2283ef 315 }
okini3939 2:4125fe2283ef 316 }
okini3939 2:4125fe2283ef 317 if (count == conf.actions[i].count) {
okini3939 2:4125fe2283ef 318 return 1;
okini3939 2:4125fe2283ef 319 }
okini3939 2:4125fe2283ef 320 }
okini3939 2:4125fe2283ef 321 return 0;
okini3939 2:4125fe2283ef 322 }
okini3939 2:4125fe2283ef 323