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

Revision:
0:d7b4484099bf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/func.cpp	Wed May 18 15:01:56 2011 +0000
@@ -0,0 +1,274 @@
+#include "mbed.h"
+#include "ConfigFile.h"
+#include "SDHCFileSystem.h"
+#include "EthernetNetIf.h"
+#include "NTPClient.h"
+#include "HTTPClient.h"
+#include "conf.h"
+
+#define TIMEZONE 9
+//#define NONBLOCKING
+/** @file
+ * @brief mbed Weather Platform
+ */
+
+#define STATION_URL "http://weather.sugakoubou.com/p"
+#define TWITTER_URL "http://api.supertweet.net/1/statuses/update.xml"
+
+extern Serial pc;
+extern int seq;
+extern char filename[];
+extern Config conf;
+extern DigitalOut led_y, led2;
+
+extern EthernetNetIf *eth; 
+extern NTPClient *ntp;
+extern HTTPClient *clientP, *clientT;
+extern Sensor sensor;
+
+void writefile (char *buf) {
+    FILE *fp;
+
+    fp = fopen(filename, "a");
+    if (fp) {
+        fprintf(fp, buf);
+        fclose(fp);
+    } else {
+        led2 = 0;
+        conf.filetype = 0;
+    }
+}
+
+void weatherstations () {
+    char post_data[200];
+    HTTPResult ret;
+    HTTPText postContent("application/x-www-form-urlencoded");
+
+    led_y = 0;
+    strcpy(post_data, "fcd=");
+    strcat(post_data, conf.stations_id);
+    strcat(post_data, "&pin=");
+    strcat(post_data, conf.stations_pin);
+    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",
+      sensor.pres, sensor.temp, sensor.humi, sensor.anemo, sensor.vane, sensor.rain, sensor.light, sensor.uv, sensor.moist, sensor.temp2);
+    postContent.puts(post_data);
+
+#ifdef NONBLOCKING
+    Net::poll();
+    ret = clientP->post(STATION_URL, postContent, NULL, &cb_clientP);
+    Net::poll();
+#else
+    ret = clientP->post(STATION_URL, postContent, NULL);
+#endif
+
+    if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
+        pc.printf("error: Weather Statuons %d\r\n", ret);
+    }
+}
+
+void pachube (char *buf) {
+    char uri[100];
+    HTTPResult ret;
+    HTTPText csvContent("text/csv");
+
+    led_y = 0;
+    clientP->setRequestHeader("X-PachubeApiKey", conf.pachube_apikey);
+    csvContent.set(buf);
+    strcpy(uri, "http://api.pachube.com/v1/feeds/");
+    strcat(uri, conf.pachube_feedid);
+    strcat(uri, ".csv?_method=put");
+#ifdef NONBLOCKING
+    Net::poll();
+    ret = clientP->post(uri, csvContent, NULL, &cb_clientP);
+    Net::poll();
+#else
+    ret = clientP->post(uri, csvContent, NULL);
+#endif
+
+    if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
+        pc.printf("error: Pachube %d\r\n", ret);
+    }
+}
+
+void cb_clientP (HTTPResult status) {
+    if (status != HTTP_OK) {
+        pc.printf("Pachube failure (%d)\r\n", status);
+//        pc.printf("Pachube failure (%d, %d)\r\n", status, clientP->getHTTPResponseCode());
+    }
+}
+
+char *fmtstr (char *fmt, char *buf, int len) {
+    int i, j, flg;
+    char c;
+    float value;
+    time_t sec = time(NULL);
+    struct tm *tim = localtime(&sec);
+
+    j = 0;
+    for (i = 0; i < strlen(fmt) && j < len; i ++) {
+        c = fmt[i];
+        if (c == '%') {
+            flg = 0;
+            i ++;
+            c = fmt[i];
+            
+            if (c == '.') {
+                // float format
+                if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') {
+                    flg = fmt[i + 1] - '0';
+                    i ++;
+
+                    c = fmt[i + 1];
+                    i ++;
+                }
+            }
+
+            switch (c) {
+            case 'P':
+                value = sensor.pres;
+                break;
+            case 'T':
+                value = sensor.temp;
+                break;
+            case 'H':
+                value = sensor.humi;
+                break;
+            case 'A':
+                value = sensor.anemo;
+                break;
+            case 'V':
+                value = sensor.vane;
+                break;
+            case 'R':
+                value = sensor.rain;
+                break;
+            case 'L':
+                value = sensor.light;
+                break;
+            case 'U':
+                value = sensor.uv;
+                break;
+            case 'M':
+                value = sensor.moist;
+                break;
+
+            case 'y':
+                value = tim->tm_year + 1900;
+                break;
+            case 'm':
+                value = tim->tm_mon;
+                break;
+            case 'd':
+                value = tim->tm_mday;
+                break;
+            case 'h':
+                value = tim->tm_hour;
+                break;
+            case 'i':
+                value = tim->tm_min;
+                break;
+            case 's':
+                value = tim->tm_sec;
+                break;
+
+            case '0':
+            case '1':
+            case '2':
+            case '3':
+            case '4':
+            case '5':
+            case '6':
+            case '7':
+            case '8':
+            case '9':
+                // Ascii
+                c = c - '0';
+                if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') {
+                    c = (c << 3) | (fmt[i + 1] - '0');
+                    i ++;
+                    if (fmt[i + 1] >= '0' && fmt[i + 1] <= '9') {
+                        c = (c << 3) | (fmt[i + 1] - '0');
+                        i ++;
+                    }
+                }
+                buf[j] = c;
+                j ++;
+                continue;
+
+            default:
+                buf[j] = c;
+                j ++;
+                continue;
+            }
+
+            switch (flg) {
+            case 1:
+                sprintf(&buf[j], "%.1f", value);
+                break;
+            case 2:
+                sprintf(&buf[j], "%.2f", value);
+                break;
+            default:
+                sprintf(&buf[j], "%02d", (int)value);
+                break;
+            }
+            j = strlen(buf);
+        } else {
+            buf[j] = c;
+            j ++;
+        }
+    }
+    buf[j] = 0;
+    return buf;
+}
+
+void twitter (int num) {
+    HTTPMap msg;
+    HTTPResult ret;
+    char buf[170];
+
+    led_y = 0;
+    fmtstr(conf.twitter_mesg[num], buf, sizeof(buf));
+    msg["status"] = buf;
+
+    clientT->basicAuth(conf.twitter_user, conf.twitter_pwd);
+#ifdef NONBLOCKING
+    Net::poll();
+    ret = clientT->post(TWITTER_URL, msg, NULL, &cb_clientT); 
+    Net::poll();
+#else
+    ret = clientT->post(TWITTER_URL, msg, NULL); 
+#endif
+
+    if (ret != HTTP_OK && ret != HTTP_PROCESSING) {
+        pc.printf("error: Twitter %d\r\n", ret);
+    }
+}
+
+void ntpdate () {
+    ntp = new NTPClient;
+    Host ntpserver(IpAddr(), 123, conf.ntpserver);
+
+    led_y = 0;
+#ifdef NONBLOCKING
+    Net::poll();
+    ntp->setTime(ntpserver, &cb_settime);
+    Net::poll();
+#else
+    ntp->setTime(ntpserver);
+    time_t sec = time(NULL) + (60 * 60 * TIMEZONE);
+    set_time(sec);
+#endif
+}
+
+void cb_settime (NTPResult status) {
+    if (status == NTP_OK) {
+        led_y = 0;
+        time_t sec = time(NULL) + (60 * 60 * TIMEZONE);
+        set_time(sec);
+        pc.printf("Ntp success: %s\r\n", ctime(&sec));
+    } else {
+        pc.printf("Ntp failure (%d)\r\n", status);
+    }
+//    ntp->close();
+}