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/conf.cpp	Wed May 18 15:01:56 2011 +0000
@@ -0,0 +1,392 @@
+/** @file
+ * @brief mbed Weather Platform
+ */
+#include "mbed.h"
+#include "conf.h"
+#include "ConfigFile.h"
+
+extern Serial xbee;
+extern Config conf;
+extern Sensor sensor, offset, sensor_old;
+
+void int_counter();
+
+char* chop (char *s) {
+    int i;
+
+    for (i = strlen(s) - 1; i >= 0; i --) {
+        if (s[i] == ' ' || s[i] == '\n' || s[i] == '\r') {
+            s[i] = 0;
+        } else {
+            break;
+        }
+    }
+    return s;
+}
+
+int check_action (char type) {
+    int i, j, count;
+    float value, vold;
+    time_t sec = time(NULL) + (60 * 60 * 9);
+    struct tm *tim = localtime(&sec);
+
+    for(i = 0; i < conf.actionscount; i ++) {
+        if (conf.actions[i].action != type) continue;
+        
+        count = 0;
+        for (j = 0; j < conf.actions[i].count; j ++) {
+            switch (conf.actions[i].exps[j].key) {
+            case 'P':
+                value = sensor.pres;
+                vold = sensor_old.pres;
+                break;
+            case 'T':
+                value = sensor.temp;
+                vold = sensor_old.temp;
+                break;
+            case 'H':
+                value = sensor.humi;
+                vold = sensor_old.humi;
+                break;
+            case 'A':
+                value = sensor.anemo;
+                vold = sensor_old.anemo;
+                break;
+            case 'V':
+                value = sensor.vane;
+                vold = sensor_old.vane;
+                break;
+            case 'R':
+                value = sensor.rain;
+                vold = sensor_old.rain;
+                break;
+            case 'L':
+                value = sensor.light;
+                vold = sensor_old.light;
+                break;
+            case 'U':
+                value = sensor.uv;
+                vold = sensor_old.uv;
+                break;
+            case 'M':
+                value = sensor.moist;
+                vold = sensor_old.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;
+
+            default:
+                value = 0;
+                break;
+            }
+
+            switch (conf.actions[i].exps[j].expression) {
+            case EXP_EQ:
+                if (value == conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_NE:
+                if (value != conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_LE:
+                if (value <= conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_LT:
+                if (value < conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_GE:
+                if (value >= conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_GT:
+                if (value > conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_MOD:
+                if ((int)value % (int)conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_NMOD:
+                if (! (int)value % (int)conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_FALL:
+                if (value < conf.actions[i].exps[j].value && vold >= conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+            case EXP_RISE:
+                if (value > conf.actions[i].exps[j].value && vold <= conf.actions[i].exps[j].value) {
+                    count ++;
+                }
+                break;
+
+            default:
+                count ++;
+                break;
+            }
+        }
+        if (count == conf.actions[i].count) {
+            return conf.actions[i].sub ? conf.actions[i].sub : ' ';
+        }
+    }
+    return 0;
+}
+
+void add_actionsub (struct tExpression *exp, char *buf) {
+
+    exp->key = buf[0];
+
+    switch (buf[1]) {
+    case '=':
+        if (buf[2] == '=') {
+            exp->expression = EXP_EQ;
+            exp->value = atof(&buf[3]);
+        }
+        break;
+
+    case '!':
+        if (buf[2] == '=') {
+            exp->expression = EXP_NE;
+            exp->value = atof(&buf[3]);
+        } else
+        if (buf[2] == '%') {
+            exp->expression = EXP_NMOD;
+            exp->value = atof(&buf[3]);
+        }
+        break;
+
+    case '<':
+        if (buf[2] == '=') {
+            exp->expression = EXP_LE;
+            exp->value = atof(&buf[3]);
+        } else {
+            exp->expression = EXP_LT;
+            exp->value = atof(&buf[2]);
+        }
+        break;
+
+    case '>':
+        if (buf[2] == '=') {
+            exp->expression = EXP_GE;
+            exp->value = atof(&buf[3]);
+        } else {
+            exp->expression = EXP_GT;
+            exp->value = atof(&buf[2]);
+        }
+        break;
+        
+    case '%':
+        exp->expression = EXP_MOD;
+        exp->value = atof(&buf[2]);
+        break;
+
+    case '_':
+        exp->expression = EXP_FALL;
+        exp->value = atof(&buf[2]);
+        break;
+    case '^':
+        exp->expression = EXP_RISE;
+        exp->value = atof(&buf[2]);
+        break;
+       
+    default:
+        exp->expression = EXP_NULL;
+        break;
+    }
+}
+
+void add_action (char *buf) {
+    int i, len, count;
+    char c;
+    char *tmp = NULL;
+
+    if (conf.actionscount >= CF_ACTION_NUM) return;
+
+//    conf.actions[conf.actionscount].action = atoi(&buf[0]);
+    conf.actions[conf.actionscount].action = buf[0];
+    conf.actions[conf.actionscount].sub = buf[1];
+
+    count = 0;
+    strcat(buf, "\n");
+    len = strlen(buf);
+    for (i = 1; i < len; i ++) {
+        c = buf[i];
+        if (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
+            buf[i] = 0;
+            if (count) {
+                add_actionsub(&conf.actions[conf.actionscount].exps[count - 1], tmp);
+            }
+            if (count >= CF_ACTION_EXPS || c == '\n') break;
+            tmp = &buf[i + 1];
+            count ++;
+        }
+    }
+
+    conf.actions[conf.actionscount].count = count;
+    conf.actionscount ++;
+}
+
+int config (char *file) {
+    int i;
+    ConfigFile cfg;
+    char buf[80], key[20];
+    int ip0, ip1, ip2, ip3;
+    
+    conf.ipaddr = IpAddr(0, 0, 0, 0);
+    conf.netmask = IpAddr(255, 255, 255, 0);
+    conf.gateway = IpAddr(0, 0, 0, 0);
+    conf.nameserver = IpAddr(0, 0, 0, 0);
+    conf.interval = 60;
+    conf.ntpserver[0] = 0;
+    conf.filetype = 0;
+    conf.actionscount = 0;
+    conf.pachube_apikey[0] = 0;
+    conf.pachube_feedid[0] = 0;
+    conf.twitter_user[0] = 0;
+    conf.twitter_pwd[0] = 0;
+    for (i = 0; i < CF_TWITTER_NUM; i ++) {
+        conf.twitter_mesg[i][0] = 0;
+    }
+    conf.stations_id[0] = 0;
+    conf.stations_pin[0] = 0;
+    conf.snmp_commname[0] = 0;
+    conf.leddisp_mesg[0] = 0;
+    conf.lcd_mesg[0] = 0;
+    conf.lcdtype = LCD16x2;
+    conf.lcdconf = LCDCFG_3V;
+    memset(&offset, 0, sizeof(offset));
+    memset(&sensor_old, 0, sizeof(sensor_old));
+
+    if (! cfg.read(file)) {
+        return -1;
+    }
+
+    if (cfg.getValue("INTERVAL", buf, sizeof(buf))) {
+        conf.interval = atoi(chop(buf));
+    }
+    if (cfg.getValue("FILE", buf, sizeof(buf))) {
+        chop(buf);
+        if (strcmp(buf, "SD") == 0) {
+            conf.filetype = 1;
+        } else
+        if (strcmp(buf, "USB") == 0) {
+            conf.filetype = 2;
+        }
+    }
+
+    if (cfg.getValue("IPADDRESS", buf, sizeof(buf))) {
+        chop(buf);
+        if (strcmp(buf, "DHCP") == 0) {
+            conf.ipaddr = IpAddr(255, 255, 255, 255);
+        } else {
+            sscanf(buf, "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+            conf.ipaddr = IpAddr(ip0, ip1, ip2, ip3);
+        }
+    }
+    if (cfg.getValue("NETMASK", buf, sizeof(buf))) {
+        sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+        conf.netmask = IpAddr(ip0, ip1, ip2, ip3);
+    }
+    if (cfg.getValue("GATEWAY", buf, sizeof(buf))) {
+        sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+        conf.gateway = IpAddr(ip0, ip1, ip2, ip3);
+    }
+    if (cfg.getValue("NAMESERVER", buf, sizeof(buf))) {
+        sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
+        conf.nameserver = IpAddr(ip0, ip1, ip2, ip3);
+    }
+
+    cfg.getValue("NTPSERVER", conf.ntpserver, sizeof(conf.ntpserver));
+    chop(conf.ntpserver);
+    cfg.getValue("PACHUBE_APIKEY", conf.pachube_apikey, sizeof(conf.pachube_apikey));
+    chop(conf.pachube_apikey);
+    cfg.getValue("PACHUBE_FEEDID", conf.pachube_feedid, sizeof(conf.pachube_feedid));
+    chop(conf.pachube_feedid);
+    cfg.getValue("TWITTER_USER", conf.twitter_user, sizeof(conf.twitter_user));
+    chop(conf.twitter_user);
+    cfg.getValue("TWITTER_PWD", conf.twitter_pwd, sizeof(conf.twitter_pwd));
+    chop(conf.twitter_pwd);
+    cfg.getValue("TWITTER_MESG", conf.twitter_mesg[0], sizeof(conf.twitter_mesg[0]));
+    chop(conf.twitter_mesg[0]);
+    for (i = 0; i < CF_TWITTER_NUM; i ++) {
+        sprintf(key, "TWITTER_MESG[%d]", i);
+        cfg.getValue(key, conf.twitter_mesg[i], sizeof(conf.twitter_mesg[i]));
+        chop(conf.twitter_mesg[i]);
+    }
+
+    cfg.getValue("STATIONS_ID", conf.stations_id, sizeof(conf.stations_id));
+    chop(conf.stations_id);
+    cfg.getValue("STATIONS_PIN", conf.stations_pin, sizeof(conf.stations_pin));
+    chop(conf.stations_pin);
+    cfg.getValue("SNMP_COMMNAME", conf.snmp_commname, sizeof(conf.snmp_commname));
+    chop(conf.snmp_commname);
+
+    if (cfg.getValue("LCD_TYPE", buf, sizeof(buf))) {
+        conf.lcdtype = (enum I2CLCDType)atoi(chop(buf));
+    }
+    if (cfg.getValue("LCD_CONF", buf, sizeof(buf))) {
+        conf.lcdconf = (enum I2CLCDConfig)atoi(chop(buf));
+    }
+    if (cfg.getValue("LCD_MESG", conf.lcd_mesg, sizeof(conf.lcd_mesg))) {
+        chop(conf.lcd_mesg);
+    }
+    if (cfg.getValue("LEDDISP_MESG", conf.leddisp_mesg, sizeof(conf.leddisp_mesg))) {
+        chop(conf.leddisp_mesg);
+    }
+
+    if (cfg.getValue("XBEE", buf, sizeof(buf))) {
+        xbee.baud(atoi(chop(buf)));
+    }
+
+    if (cfg.getValue("INPUT", buf, sizeof(buf))) {
+        conf.inputtype = (enum eINPUTTYPE)atoi(chop(buf));
+    }
+
+    for (i = 0; i < CF_ACTION_NUM; i ++) {
+        sprintf(key, "ACTION[%d]", i);
+        if (cfg.getValue(key, buf, sizeof(buf))) {
+            add_action(chop(buf));
+        }
+    }
+
+    if (cfg.getValue("OFFSET[P]", buf, sizeof(buf))) {
+        offset.pres = atof(chop(buf));
+    }
+    if (cfg.getValue("OFFSET[T]", buf, sizeof(buf))) {
+        offset.temp = atof(chop(buf));
+    }
+    if (cfg.getValue("OFFSET[H]", buf, sizeof(buf))) {
+        offset.humi = atof(chop(buf));
+    }
+
+    return 0;
+}