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:
Mon Dec 13 15:28:59 2010 +0000
Revision:
1:86d4b7431fbe
Child:
2:4125fe2283ef

        

Who changed what in which revision?

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