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:
Mon Jul 04 15:16:45 2011 +0000
Revision:
0:bdb53686c194
Child:
1:6c7141895545

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:bdb53686c194 1 #include "mbed.h"
okini3939 0:bdb53686c194 2 #include "weather.h"
okini3939 0:bdb53686c194 3 #include "EthernetNetIf.h"
okini3939 0:bdb53686c194 4 #ifdef USE_NTP
okini3939 0:bdb53686c194 5 #include "NTPClient.h"
okini3939 0:bdb53686c194 6 #endif
okini3939 0:bdb53686c194 7 #include "HTTPClient.h"
okini3939 0:bdb53686c194 8 #ifdef USE_EMAIL
okini3939 0:bdb53686c194 9 #include "SMTPClient.h"
okini3939 0:bdb53686c194 10 #endif
okini3939 0:bdb53686c194 11
okini3939 0:bdb53686c194 12 #define STATION_URL "http://weather.sugakoubou.com/p"
okini3939 0:bdb53686c194 13 #define TWITTER_URL "http://api.supertweet.net/1/statuses/update.xml"
okini3939 0:bdb53686c194 14 #define PACHUBE_URL "http://api.pachube.com/v1/feeds/"
okini3939 0:bdb53686c194 15
okini3939 0:bdb53686c194 16 EthernetNetIf *eth;
okini3939 0:bdb53686c194 17 DigitalOut led_g2(p24),led_g(p25), led_y(p26);
okini3939 0:bdb53686c194 18 static DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:bdb53686c194 19 static volatile int ethernet_flg = 0;
okini3939 0:bdb53686c194 20 static HTTPClient *http;
okini3939 0:bdb53686c194 21
okini3939 0:bdb53686c194 22 int weatherstations () {
okini3939 0:bdb53686c194 23 char post_data[200];
okini3939 0:bdb53686c194 24 char id[10], pin[40];
okini3939 0:bdb53686c194 25 // HTTPClient http;
okini3939 0:bdb53686c194 26 HTTPResult ret;
okini3939 0:bdb53686c194 27 HTTPText postContent("application/x-www-form-urlencoded");
okini3939 0:bdb53686c194 28
okini3939 0:bdb53686c194 29 if (! ethernet_flg) return 0;
okini3939 0:bdb53686c194 30 if (! cfg.getValue("STATIONS_ID", id, sizeof(id)) ||
okini3939 0:bdb53686c194 31 ! cfg.getValue("STATIONS_PIN", pin, sizeof(pin))) {
okini3939 0:bdb53686c194 32 return -1;
okini3939 0:bdb53686c194 33 }
okini3939 0:bdb53686c194 34 #ifdef DEBUG
okini3939 0:bdb53686c194 35 pc.printf("S: %s %s\r\n", id, pin);
okini3939 0:bdb53686c194 36 #endif
okini3939 0:bdb53686c194 37
okini3939 0:bdb53686c194 38 LED_NET_ON;
okini3939 0:bdb53686c194 39 format_str("d0=%.2P&d1=%.2T&d2=%.2H&d3=%.2A&d4=%.2V&d5=%.2R&d6=%.2L&d7=%.2U&d8=%.2M&d9=%.2p", post_data, sizeof(post_data));
okini3939 0:bdb53686c194 40 strcat(post_data, "&fcd=");
okini3939 0:bdb53686c194 41 strcat(post_data, chop(id));
okini3939 0:bdb53686c194 42 strcat(post_data, "&pin=");
okini3939 0:bdb53686c194 43 strcat(post_data, chop(pin));
okini3939 0:bdb53686c194 44 postContent.puts(post_data);
okini3939 0:bdb53686c194 45
okini3939 0:bdb53686c194 46 http->resetRequestHeaders();
okini3939 0:bdb53686c194 47 http->basicAuth(NULL, NULL);
okini3939 0:bdb53686c194 48 http->setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 49 ret = http->post(STATION_URL, postContent, NULL);
okini3939 0:bdb53686c194 50
okini3939 0:bdb53686c194 51 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 52 pc.printf("Weather Statuons failure: %d\r\n", ret);
okini3939 0:bdb53686c194 53 return -1;
okini3939 0:bdb53686c194 54 #ifdef DEBUG
okini3939 0:bdb53686c194 55 } else {
okini3939 0:bdb53686c194 56 pc.printf("Weather Stations success: %d\r\n", ret);
okini3939 0:bdb53686c194 57 #endif
okini3939 0:bdb53686c194 58 }
okini3939 0:bdb53686c194 59 return 0;
okini3939 0:bdb53686c194 60 }
okini3939 0:bdb53686c194 61
okini3939 0:bdb53686c194 62 int pachube (char *csv) {
okini3939 0:bdb53686c194 63 char uri[100];
okini3939 0:bdb53686c194 64 char apikey[70], feedid[10];
okini3939 0:bdb53686c194 65 // HTTPClient http;
okini3939 0:bdb53686c194 66 HTTPResult ret;
okini3939 0:bdb53686c194 67 HTTPText csvContent("text/csv");
okini3939 0:bdb53686c194 68
okini3939 0:bdb53686c194 69 if (! ethernet_flg) return 0;
okini3939 0:bdb53686c194 70 if (! cfg.getValue("PACHUBE_APIKEY", apikey, sizeof(apikey)) ||
okini3939 0:bdb53686c194 71 ! cfg.getValue("PACHUBE_FEEDID", feedid, sizeof(feedid))) {
okini3939 0:bdb53686c194 72 return -1;
okini3939 0:bdb53686c194 73 }
okini3939 0:bdb53686c194 74 #ifdef DEBUG
okini3939 0:bdb53686c194 75 pc.printf("P: %s %s\r\n", apikey, feedid);
okini3939 0:bdb53686c194 76 #endif
okini3939 0:bdb53686c194 77
okini3939 0:bdb53686c194 78 LED_NET_ON;
okini3939 0:bdb53686c194 79 csvContent.set(csv);
okini3939 0:bdb53686c194 80 strcpy(uri, PACHUBE_URL);
okini3939 0:bdb53686c194 81 strcat(uri, chop(feedid));
okini3939 0:bdb53686c194 82 strcat(uri, ".csv?_method=put");
okini3939 0:bdb53686c194 83
okini3939 0:bdb53686c194 84 http->resetRequestHeaders();
okini3939 0:bdb53686c194 85 http->basicAuth(NULL, NULL);
okini3939 0:bdb53686c194 86 http->setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 87 http->setRequestHeader("X-PachubeApiKey", chop(apikey));
okini3939 0:bdb53686c194 88 ret = http->post(uri, csvContent, NULL);
okini3939 0:bdb53686c194 89
okini3939 0:bdb53686c194 90 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 91 pc.printf("Pachube failure: %d\r\n", ret);
okini3939 0:bdb53686c194 92 return -1;
okini3939 0:bdb53686c194 93 #ifdef DEBUG
okini3939 0:bdb53686c194 94 } else {
okini3939 0:bdb53686c194 95 pc.printf("Pachube success: %d\r\n", ret);
okini3939 0:bdb53686c194 96 #endif
okini3939 0:bdb53686c194 97 }
okini3939 0:bdb53686c194 98 return 0;
okini3939 0:bdb53686c194 99 }
okini3939 0:bdb53686c194 100
okini3939 0:bdb53686c194 101 int twitter (int num) {
okini3939 0:bdb53686c194 102 char buf[170], tmp[128];
okini3939 0:bdb53686c194 103 char user[20], pwd[20], key[20];
okini3939 0:bdb53686c194 104 // HTTPClient http;
okini3939 0:bdb53686c194 105 HTTPMap msg;
okini3939 0:bdb53686c194 106 HTTPResult ret;
okini3939 0:bdb53686c194 107
okini3939 0:bdb53686c194 108 if (! ethernet_flg || num >= CF_TWITTER_NUM) return 0;
okini3939 0:bdb53686c194 109 sprintf(key, "TWITTER_MESG[%d]", num);
okini3939 0:bdb53686c194 110 if (! cfg.getValue("TWITTER_USER", user, sizeof(user)) ||
okini3939 0:bdb53686c194 111 ! cfg.getValue("TWITTER_PWD", pwd, sizeof(pwd)) ||
okini3939 0:bdb53686c194 112 ! cfg.getValue(key, tmp, sizeof(tmp))) {
okini3939 0:bdb53686c194 113 return -1;
okini3939 0:bdb53686c194 114 }
okini3939 0:bdb53686c194 115 #ifdef DEBUG
okini3939 0:bdb53686c194 116 pc.printf("T: %s %s %s\r\n", user, pwd, tmp);
okini3939 0:bdb53686c194 117 #endif
okini3939 0:bdb53686c194 118
okini3939 0:bdb53686c194 119 LED_NET_ON;
okini3939 0:bdb53686c194 120 format_str(tmp, buf, sizeof(buf));
okini3939 0:bdb53686c194 121 msg["status"] = buf;
okini3939 0:bdb53686c194 122
okini3939 0:bdb53686c194 123 http->resetRequestHeaders();
okini3939 0:bdb53686c194 124 http->setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 125 http->basicAuth(chop(user), chop(pwd));
okini3939 0:bdb53686c194 126 ret = http->post(TWITTER_URL, msg, NULL);
okini3939 0:bdb53686c194 127
okini3939 0:bdb53686c194 128 if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
okini3939 0:bdb53686c194 129 pc.printf("Twitter failure: %d\r\n", ret);
okini3939 0:bdb53686c194 130 return -1;
okini3939 0:bdb53686c194 131 #ifdef DEBUG
okini3939 0:bdb53686c194 132 } else {
okini3939 0:bdb53686c194 133 pc.printf("Twitter success: %d\r\n", ret);
okini3939 0:bdb53686c194 134 #endif
okini3939 0:bdb53686c194 135 }
okini3939 0:bdb53686c194 136 return 0;
okini3939 0:bdb53686c194 137 }
okini3939 0:bdb53686c194 138
okini3939 0:bdb53686c194 139 int email (int num) {
okini3939 0:bdb53686c194 140 #ifdef USE_EMAIL
okini3939 0:bdb53686c194 141 int port = 25;
okini3939 0:bdb53686c194 142 char buf[170], smtphost[40], from[40], to[40], tmp[128];
okini3939 0:bdb53686c194 143 char key[40], key2[40];
okini3939 0:bdb53686c194 144 static SMTPClient smtp;
okini3939 0:bdb53686c194 145 Host smtpserver;
okini3939 0:bdb53686c194 146 EmailMessage msg;
okini3939 0:bdb53686c194 147 SMTPResult ret;
okini3939 0:bdb53686c194 148
okini3939 0:bdb53686c194 149 if (! ethernet_flg || num >= CF_MAIL_NUM) return 0;
okini3939 0:bdb53686c194 150 sprintf(key, "MAIL_MESG[%d]", num);
okini3939 0:bdb53686c194 151 sprintf(key2, "MAIL_TO[%d]", num);
okini3939 0:bdb53686c194 152 if (! cfg.getValue("SMTPSERVER", smtphost, sizeof(smtphost)) ||
okini3939 0:bdb53686c194 153 ! cfg.getValue("MAIL_FROM", from, sizeof(from)) ||
okini3939 0:bdb53686c194 154 ! cfg.getValue(key2, to, sizeof(to)) ||
okini3939 0:bdb53686c194 155 ! cfg.getValue(key, tmp, sizeof(tmp))) {
okini3939 0:bdb53686c194 156 return -1;
okini3939 0:bdb53686c194 157 }
okini3939 0:bdb53686c194 158
okini3939 0:bdb53686c194 159 LED_NET_ON;
okini3939 0:bdb53686c194 160 if (cfg.getValue("SMTPPORT", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 161 port = atoi(buf);
okini3939 0:bdb53686c194 162 }
okini3939 0:bdb53686c194 163 smtpserver.setName(chop(smtphost));
okini3939 0:bdb53686c194 164 smtpserver.setPort(port);
okini3939 0:bdb53686c194 165 smtp.setServer(smtpserver);
okini3939 0:bdb53686c194 166 smtp.setHeloDomain("mbed");
okini3939 0:bdb53686c194 167
okini3939 0:bdb53686c194 168 msg.setFrom(chop(from));
okini3939 0:bdb53686c194 169 msg.addTo(chop(to));
okini3939 0:bdb53686c194 170 #ifdef DEBUG
okini3939 0:bdb53686c194 171 pc.printf("SMTP %s %s %s\r\n", smtphost, from, to);
okini3939 0:bdb53686c194 172 #endif
okini3939 0:bdb53686c194 173 /*
okini3939 0:bdb53686c194 174 msg.printf("Content-Type: text/plain; charset=UTF-8\n");
okini3939 0:bdb53686c194 175 msg.printf("Content-Transfer-Encoding: 8bit\n");
okini3939 0:bdb53686c194 176 msg.printf("From: %s\n", from);
okini3939 0:bdb53686c194 177 msg.printf("To: %s\n", to);
okini3939 0:bdb53686c194 178 */
okini3939 0:bdb53686c194 179 msg.printf("Subject: Message from weather\n");
okini3939 0:bdb53686c194 180 format_str(tmp, buf, sizeof(buf));
okini3939 0:bdb53686c194 181 msg.printf("\n%s\n", buf);
okini3939 0:bdb53686c194 182
okini3939 0:bdb53686c194 183 if (cfg.getValue("SMTPUSER", key, sizeof(key)) &&
okini3939 0:bdb53686c194 184 cfg.getValue("SMTPPWD", key2, sizeof(key2))) {
okini3939 0:bdb53686c194 185 // SMTP auth
okini3939 0:bdb53686c194 186 smtp.setAuth(chop(key), chop(key2));
okini3939 0:bdb53686c194 187 }
okini3939 0:bdb53686c194 188 smtp.setTimeout(NET_TIMEOUT);
okini3939 0:bdb53686c194 189 ret = smtp.send(&msg);
okini3939 0:bdb53686c194 190
okini3939 0:bdb53686c194 191 if (ret != HTTP_OK) {
okini3939 0:bdb53686c194 192 pc.printf("Mail failure: %d\r\n", ret);
okini3939 0:bdb53686c194 193 return -1;
okini3939 0:bdb53686c194 194 #ifdef DEBUG
okini3939 0:bdb53686c194 195 } else {
okini3939 0:bdb53686c194 196 pc.printf("Mail success: %d\r\n", ret);
okini3939 0:bdb53686c194 197 pc.printf("SMTP response %s", smtp.getLastResponse().c_str());
okini3939 0:bdb53686c194 198 #endif
okini3939 0:bdb53686c194 199 }
okini3939 0:bdb53686c194 200 #endif
okini3939 0:bdb53686c194 201 return 0;
okini3939 0:bdb53686c194 202 }
okini3939 0:bdb53686c194 203
okini3939 0:bdb53686c194 204 int ntpdate (char *hostname) {
okini3939 0:bdb53686c194 205 #ifdef USE_NTP
okini3939 0:bdb53686c194 206 static NTPClient ntp;
okini3939 0:bdb53686c194 207 Host ntpserver;
okini3939 0:bdb53686c194 208 NTPResult ret;
okini3939 0:bdb53686c194 209 time_t sec;
okini3939 0:bdb53686c194 210
okini3939 0:bdb53686c194 211 if (! ethernet_flg) return 0;
okini3939 0:bdb53686c194 212
okini3939 0:bdb53686c194 213 LED_NET_ON;
okini3939 0:bdb53686c194 214 ntpserver.setName(hostname);
okini3939 0:bdb53686c194 215 ntpserver.setPort(123);
okini3939 0:bdb53686c194 216
okini3939 0:bdb53686c194 217 ret = ntp.setTime(ntpserver);
okini3939 0:bdb53686c194 218 if (ret == NTP_OK) {
okini3939 0:bdb53686c194 219 sec = time(NULL) + (60 * 60 * TIMEZONE);
okini3939 0:bdb53686c194 220 set_time(sec);
okini3939 0:bdb53686c194 221 }
okini3939 0:bdb53686c194 222 // ntp.close();
okini3939 0:bdb53686c194 223
okini3939 0:bdb53686c194 224 if (ret != NTP_OK) {
okini3939 0:bdb53686c194 225 pc.printf("NTP failure: %d\r\n", ret);
okini3939 0:bdb53686c194 226 return -1;
okini3939 0:bdb53686c194 227 #ifdef DEBUG
okini3939 0:bdb53686c194 228 } else {
okini3939 0:bdb53686c194 229 pc.printf("NTP success %s\r\n", ctime(&sec));
okini3939 0:bdb53686c194 230 #endif
okini3939 0:bdb53686c194 231 }
okini3939 0:bdb53686c194 232 #endif
okini3939 0:bdb53686c194 233 return 0;
okini3939 0:bdb53686c194 234 }
okini3939 0:bdb53686c194 235
okini3939 0:bdb53686c194 236 int init_net () {
okini3939 0:bdb53686c194 237 char buf[128];
okini3939 0:bdb53686c194 238 int ip0, ip1, ip2, ip3;
okini3939 0:bdb53686c194 239 IpAddr ipaddr, netmask, gateway, nameserver;
okini3939 0:bdb53686c194 240 EthernetErr ethErr;
okini3939 0:bdb53686c194 241
okini3939 0:bdb53686c194 242 eth_link.mode(PullUp);
okini3939 0:bdb53686c194 243 eth_speed.mode(PullUp);
okini3939 0:bdb53686c194 244 led_g = eth_link ? 1 : 0;
okini3939 0:bdb53686c194 245 led_g2 = 1;
okini3939 0:bdb53686c194 246 LED_NET_ON;
okini3939 0:bdb53686c194 247
okini3939 0:bdb53686c194 248 if (cfg.getValue("IPADDRESS", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 249
okini3939 0:bdb53686c194 250 if (strncmp(buf, "DHCP", 4) == 0) {
okini3939 0:bdb53686c194 251 // dhcp ip address
okini3939 0:bdb53686c194 252
okini3939 0:bdb53686c194 253 eth = new EthernetNetIf;
okini3939 0:bdb53686c194 254
okini3939 0:bdb53686c194 255 } else {
okini3939 0:bdb53686c194 256 // static ip address
okini3939 0:bdb53686c194 257
okini3939 0:bdb53686c194 258 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 259 ipaddr = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 260
okini3939 0:bdb53686c194 261 if (cfg.getValue("NETMASK", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 262 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 263 netmask = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 264 }
okini3939 0:bdb53686c194 265
okini3939 0:bdb53686c194 266 if (cfg.getValue("GATEWAY", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 267 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 268 gateway = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 269 }
okini3939 0:bdb53686c194 270
okini3939 0:bdb53686c194 271 if (cfg.getValue("NAMESERVER", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 272 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 0:bdb53686c194 273 nameserver = IpAddr(ip0, ip1, ip2, ip3);
okini3939 0:bdb53686c194 274 }
okini3939 0:bdb53686c194 275
okini3939 0:bdb53686c194 276 eth = new EthernetNetIf(ipaddr, netmask, gateway, nameserver);
okini3939 0:bdb53686c194 277
okini3939 0:bdb53686c194 278 }
okini3939 0:bdb53686c194 279 if (eth == NULL) return -1;
okini3939 0:bdb53686c194 280
okini3939 0:bdb53686c194 281 ethErr = eth->setup();
okini3939 0:bdb53686c194 282 if (ethErr) {
okini3939 0:bdb53686c194 283 // error
okini3939 0:bdb53686c194 284 return -1;
okini3939 0:bdb53686c194 285 }
okini3939 0:bdb53686c194 286
okini3939 0:bdb53686c194 287 pc.printf("\r\nEthernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]);
okini3939 0:bdb53686c194 288 ethernet_flg = 1;
okini3939 0:bdb53686c194 289 pool_net();
okini3939 0:bdb53686c194 290
okini3939 0:bdb53686c194 291 http = new HTTPClient;
okini3939 0:bdb53686c194 292 if (http == NULL) return -1;
okini3939 0:bdb53686c194 293 }
okini3939 0:bdb53686c194 294
okini3939 0:bdb53686c194 295 if (cfg.getValue("NTPSERVER", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 296 pc.printf("NTP: %s\r\n", buf);
okini3939 0:bdb53686c194 297 ntpdate(chop(buf));
okini3939 0:bdb53686c194 298 }
okini3939 0:bdb53686c194 299
okini3939 0:bdb53686c194 300 if (cfg.getValue("SNMP_COMMNAME", buf, sizeof(buf))) {
okini3939 0:bdb53686c194 301 snmp_init(chop(buf));
okini3939 0:bdb53686c194 302 pc.printf("SNMP community name: %s\r\n", buf);
okini3939 0:bdb53686c194 303 }
okini3939 0:bdb53686c194 304
okini3939 0:bdb53686c194 305 return 0;
okini3939 0:bdb53686c194 306 }
okini3939 0:bdb53686c194 307
okini3939 0:bdb53686c194 308 void pool_net () {
okini3939 0:bdb53686c194 309
okini3939 0:bdb53686c194 310 if (ethernet_flg) {
okini3939 0:bdb53686c194 311 Net::poll();
okini3939 0:bdb53686c194 312
okini3939 0:bdb53686c194 313 // ethernet LED green
okini3939 0:bdb53686c194 314 led_g = eth_link ? 1 : 0;
okini3939 0:bdb53686c194 315 led_g2 = 1;
okini3939 0:bdb53686c194 316 } else {
okini3939 0:bdb53686c194 317 // ethernet LED orange
okini3939 0:bdb53686c194 318 led_g = eth_link ? 0 : 1;
okini3939 0:bdb53686c194 319 led_g2 = 0;
okini3939 0:bdb53686c194 320 }
okini3939 0:bdb53686c194 321 }