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

Revision:
0:bdb53686c194
Child:
1:6c7141895545
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/net.cpp	Mon Jul 04 15:16:45 2011 +0000
@@ -0,0 +1,321 @@
+#include "mbed.h"
+#include "weather.h"
+#include "EthernetNetIf.h"
+#ifdef USE_NTP
+#include "NTPClient.h"
+#endif
+#include "HTTPClient.h"
+#ifdef USE_EMAIL
+#include "SMTPClient.h"
+#endif
+
+#define STATION_URL "http://weather.sugakoubou.com/p"
+#define TWITTER_URL "http://api.supertweet.net/1/statuses/update.xml"
+#define PACHUBE_URL "http://api.pachube.com/v1/feeds/"
+
+EthernetNetIf *eth; 
+DigitalOut led_g2(p24),led_g(p25), led_y(p26);
+static DigitalIn eth_link(P1_25), eth_speed(P1_26);
+static volatile int ethernet_flg = 0;
+static HTTPClient *http;
+
+int weatherstations () {
+    char post_data[200];
+    char id[10], pin[40];
+//    HTTPClient http;
+    HTTPResult ret;
+    HTTPText postContent("application/x-www-form-urlencoded");
+
+    if (! ethernet_flg) return 0;
+    if (! cfg.getValue("STATIONS_ID", id, sizeof(id)) ||
+      ! cfg.getValue("STATIONS_PIN", pin, sizeof(pin))) {
+        return -1;
+    }
+#ifdef DEBUG
+    pc.printf("S: %s %s\r\n", id, pin);
+#endif
+
+    LED_NET_ON;
+    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));
+    strcat(post_data, "&fcd=");
+    strcat(post_data, chop(id));
+    strcat(post_data, "&pin=");
+    strcat(post_data, chop(pin));
+    postContent.puts(post_data);
+
+    http->resetRequestHeaders();
+    http->basicAuth(NULL, NULL);
+    http->setTimeout(NET_TIMEOUT);
+    ret = http->post(STATION_URL, postContent, NULL);
+
+    if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
+        pc.printf("Weather Statuons failure: %d\r\n", ret);
+        return -1;
+#ifdef DEBUG
+    } else {
+        pc.printf("Weather Stations success: %d\r\n", ret);
+#endif
+    }
+    return 0;
+}
+
+int pachube (char *csv) {
+    char uri[100];
+    char apikey[70], feedid[10];
+//    HTTPClient http;
+    HTTPResult ret;
+    HTTPText csvContent("text/csv");
+
+    if (! ethernet_flg) return 0;
+    if (! cfg.getValue("PACHUBE_APIKEY", apikey, sizeof(apikey)) ||
+      ! cfg.getValue("PACHUBE_FEEDID", feedid, sizeof(feedid))) {
+        return -1;
+    }
+#ifdef DEBUG
+    pc.printf("P: %s %s\r\n", apikey, feedid);
+#endif
+
+    LED_NET_ON;
+    csvContent.set(csv);
+    strcpy(uri, PACHUBE_URL);
+    strcat(uri, chop(feedid));
+    strcat(uri, ".csv?_method=put");
+
+    http->resetRequestHeaders();
+    http->basicAuth(NULL, NULL);
+    http->setTimeout(NET_TIMEOUT);
+    http->setRequestHeader("X-PachubeApiKey", chop(apikey));
+    ret = http->post(uri, csvContent, NULL);
+
+    if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
+        pc.printf("Pachube failure: %d\r\n", ret);
+        return -1;
+#ifdef DEBUG
+    } else {
+        pc.printf("Pachube success: %d\r\n", ret);
+#endif
+    }
+    return 0;
+}
+
+int twitter (int num) {
+    char buf[170], tmp[128];
+    char user[20], pwd[20], key[20];
+//    HTTPClient http;
+    HTTPMap msg;
+    HTTPResult ret;
+
+    if (! ethernet_flg || num >= CF_TWITTER_NUM) return 0;
+    sprintf(key, "TWITTER_MESG[%d]", num);
+    if (! cfg.getValue("TWITTER_USER", user, sizeof(user)) ||
+      ! cfg.getValue("TWITTER_PWD", pwd, sizeof(pwd)) ||
+      ! cfg.getValue(key, tmp, sizeof(tmp))) {
+        return -1;
+    }
+#ifdef DEBUG
+    pc.printf("T: %s %s %s\r\n", user, pwd, tmp);
+#endif
+
+    LED_NET_ON;
+    format_str(tmp, buf, sizeof(buf));
+    msg["status"] = buf;
+
+    http->resetRequestHeaders();
+    http->setTimeout(NET_TIMEOUT);
+    http->basicAuth(chop(user), chop(pwd));
+    ret = http->post(TWITTER_URL, msg, NULL); 
+
+    if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
+        pc.printf("Twitter failure: %d\r\n", ret);
+        return -1;
+#ifdef DEBUG
+    } else {
+        pc.printf("Twitter success: %d\r\n", ret);
+#endif
+    }
+    return 0;
+}
+
+int email (int num) {
+#ifdef USE_EMAIL
+    int port = 25;
+    char buf[170], smtphost[40], from[40], to[40], tmp[128];
+    char key[40], key2[40];
+    static SMTPClient smtp;
+    Host smtpserver;
+    EmailMessage msg;
+    SMTPResult ret;
+
+    if (! ethernet_flg || num >= CF_MAIL_NUM) return 0;
+    sprintf(key, "MAIL_MESG[%d]", num);
+    sprintf(key2, "MAIL_TO[%d]", num);
+    if (! cfg.getValue("SMTPSERVER", smtphost, sizeof(smtphost)) ||
+      ! cfg.getValue("MAIL_FROM", from, sizeof(from)) ||
+      ! cfg.getValue(key2, to, sizeof(to)) ||
+      ! cfg.getValue(key, tmp, sizeof(tmp))) {
+        return -1;
+    }
+
+    LED_NET_ON;
+    if (cfg.getValue("SMTPPORT", buf, sizeof(buf))) {
+        port = atoi(buf);
+    }
+    smtpserver.setName(chop(smtphost));
+    smtpserver.setPort(port);
+    smtp.setServer(smtpserver);
+    smtp.setHeloDomain("mbed");
+
+    msg.setFrom(chop(from));
+    msg.addTo(chop(to));
+#ifdef DEBUG
+    pc.printf("SMTP %s %s %s\r\n", smtphost, from, to);
+#endif
+/*
+    msg.printf("Content-Type: text/plain; charset=UTF-8\n");
+    msg.printf("Content-Transfer-Encoding: 8bit\n");
+    msg.printf("From: %s\n", from);
+    msg.printf("To: %s\n", to);
+*/
+    msg.printf("Subject: Message from weather\n");
+    format_str(tmp, buf, sizeof(buf));
+    msg.printf("\n%s\n", buf);
+
+    if (cfg.getValue("SMTPUSER", key, sizeof(key)) &&
+      cfg.getValue("SMTPPWD", key2, sizeof(key2))) {
+        // SMTP auth
+        smtp.setAuth(chop(key), chop(key2));
+    }
+    smtp.setTimeout(NET_TIMEOUT);
+    ret = smtp.send(&msg);
+
+    if (ret != HTTP_OK) {
+        pc.printf("Mail failure: %d\r\n", ret);
+        return -1;
+#ifdef DEBUG
+    } else {
+        pc.printf("Mail success: %d\r\n", ret);
+        pc.printf("SMTP response %s", smtp.getLastResponse().c_str());
+#endif
+    }
+#endif
+    return 0;
+}
+
+int ntpdate (char *hostname) {
+#ifdef USE_NTP
+    static NTPClient ntp;
+    Host ntpserver;
+    NTPResult ret;
+    time_t sec;
+
+    if (! ethernet_flg) return 0;
+
+    LED_NET_ON;
+    ntpserver.setName(hostname);
+    ntpserver.setPort(123);
+
+    ret = ntp.setTime(ntpserver);
+    if (ret == NTP_OK) {
+        sec = time(NULL) + (60 * 60 * TIMEZONE);
+        set_time(sec);
+    }
+//    ntp.close();
+
+    if (ret != NTP_OK) {
+        pc.printf("NTP failure: %d\r\n", ret);
+        return -1;
+#ifdef DEBUG
+    } else {
+        pc.printf("NTP success %s\r\n", ctime(&sec));
+#endif
+    }
+#endif
+    return 0;
+}
+
+int init_net () {
+    char buf[128];
+    int ip0, ip1, ip2, ip3;
+    IpAddr ipaddr, netmask, gateway, nameserver;
+    EthernetErr ethErr;
+    
+    eth_link.mode(PullUp);
+    eth_speed.mode(PullUp);
+    led_g = eth_link ? 1 : 0;
+    led_g2 = 1;
+    LED_NET_ON;
+
+    if (cfg.getValue("IPADDRESS", buf, sizeof(buf))) {
+
+        if (strncmp(buf, "DHCP", 4) == 0) {
+            // dhcp ip address
+            
+            eth = new EthernetNetIf;
+            
+        } else {
+            // static ip address
+            
+            sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+            ipaddr = IpAddr(ip0, ip1, ip2, ip3);
+            
+            if (cfg.getValue("NETMASK", buf, sizeof(buf))) {
+                sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+                netmask = IpAddr(ip0, ip1, ip2, ip3);
+            }
+            
+            if (cfg.getValue("GATEWAY", buf, sizeof(buf))) {
+                sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+                gateway = IpAddr(ip0, ip1, ip2, ip3);
+            }
+            
+            if (cfg.getValue("NAMESERVER", buf, sizeof(buf))) {
+                sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+                nameserver = IpAddr(ip0, ip1, ip2, ip3);
+            }
+            
+            eth = new EthernetNetIf(ipaddr, netmask, gateway, nameserver);
+       
+        }
+        if (eth == NULL) return -1;
+
+        ethErr = eth->setup();
+        if (ethErr) {
+            // error
+            return -1;
+        }
+
+        pc.printf("\r\nEthernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]);
+        ethernet_flg = 1;
+        pool_net();
+
+        http = new HTTPClient;
+        if (http == NULL) return -1;
+    }
+
+    if (cfg.getValue("NTPSERVER", buf, sizeof(buf))) {
+        pc.printf("NTP: %s\r\n", buf);
+        ntpdate(chop(buf));
+    }
+
+    if (cfg.getValue("SNMP_COMMNAME", buf, sizeof(buf))) {
+        snmp_init(chop(buf));
+        pc.printf("SNMP community name: %s\r\n", buf);
+    }
+
+    return 0;
+}
+
+void pool_net () {
+
+    if (ethernet_flg) {
+        Net::poll();
+
+        // ethernet LED green
+        led_g = eth_link ? 1 : 0;
+        led_g2 = 1;
+    } else {
+        // ethernet LED orange
+        led_g = eth_link ? 0 : 1;
+        led_g2 = 0;
+    }
+}