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:
Sun Feb 27 13:39:45 2011 +0000
Revision:
10:848a2205aed1
Parent:
9:8c63e4f3edab
Child:
11:c6356e5949cd

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 9:8c63e4f3edab 1 /** @file
okini3939 9:8c63e4f3edab 2 * @brief mbed Weather Platform
okini3939 9:8c63e4f3edab 3 */
okini3939 9:8c63e4f3edab 4 #include "mbed.h"
okini3939 9:8c63e4f3edab 5 #include "conf.h"
okini3939 9:8c63e4f3edab 6 #include "ConfigFile.h"
okini3939 10:848a2205aed1 7 #include "I2CLEDDisp.h"
okini3939 10:848a2205aed1 8 #include "I2CLCD.h"
okini3939 9:8c63e4f3edab 9
okini3939 10:848a2205aed1 10 extern Serial xbee;
okini3939 10:848a2205aed1 11 extern Config conf;
okini3939 9:8c63e4f3edab 12 extern float pres, temp, humi, light, anemo, vane, rain, uv, moist, temp2;
okini3939 10:848a2205aed1 13 extern I2C i2c;
okini3939 10:848a2205aed1 14 extern I2CLCD *lcd;
okini3939 10:848a2205aed1 15 extern I2CLEDDisp *leddisp;
okini3939 9:8c63e4f3edab 16
okini3939 9:8c63e4f3edab 17 char* chop (char *s) {
okini3939 9:8c63e4f3edab 18 int i;
okini3939 9:8c63e4f3edab 19
okini3939 9:8c63e4f3edab 20 for (i = strlen(s) - 1; i >= 0; i --) {
okini3939 9:8c63e4f3edab 21 if (s[i] == ' ' || s[i] == '\n' || s[i] == '\r') {
okini3939 9:8c63e4f3edab 22 s[i] = 0;
okini3939 9:8c63e4f3edab 23 } else {
okini3939 9:8c63e4f3edab 24 break;
okini3939 9:8c63e4f3edab 25 }
okini3939 9:8c63e4f3edab 26 }
okini3939 9:8c63e4f3edab 27 return s;
okini3939 9:8c63e4f3edab 28 }
okini3939 9:8c63e4f3edab 29
okini3939 9:8c63e4f3edab 30 int check_action (char type) {
okini3939 9:8c63e4f3edab 31 int i, j, count;
okini3939 9:8c63e4f3edab 32 float value;
okini3939 9:8c63e4f3edab 33 time_t sec = time(NULL) + (60 * 60 * 9);
okini3939 9:8c63e4f3edab 34 struct tm *tim = localtime(&sec);
okini3939 9:8c63e4f3edab 35
okini3939 9:8c63e4f3edab 36 for(i = 0; i < conf.actionscount; i ++) {
okini3939 9:8c63e4f3edab 37 if (conf.actions[i].action != type) continue;
okini3939 9:8c63e4f3edab 38
okini3939 9:8c63e4f3edab 39 count = 0;
okini3939 9:8c63e4f3edab 40 for (j = 0; j < conf.actions[i].count; j ++) {
okini3939 9:8c63e4f3edab 41 switch (conf.actions[i].exps[j].key) {
okini3939 9:8c63e4f3edab 42 case 'P':
okini3939 9:8c63e4f3edab 43 value = pres;
okini3939 9:8c63e4f3edab 44 break;
okini3939 9:8c63e4f3edab 45 case 'T':
okini3939 9:8c63e4f3edab 46 value = temp;
okini3939 9:8c63e4f3edab 47 break;
okini3939 9:8c63e4f3edab 48 case 'H':
okini3939 9:8c63e4f3edab 49 value = humi;
okini3939 9:8c63e4f3edab 50 break;
okini3939 9:8c63e4f3edab 51 case 'A':
okini3939 9:8c63e4f3edab 52 value = anemo;
okini3939 9:8c63e4f3edab 53 break;
okini3939 9:8c63e4f3edab 54 case 'V':
okini3939 9:8c63e4f3edab 55 value = vane;
okini3939 9:8c63e4f3edab 56 break;
okini3939 9:8c63e4f3edab 57 case 'R':
okini3939 9:8c63e4f3edab 58 value = rain;
okini3939 9:8c63e4f3edab 59 break;
okini3939 9:8c63e4f3edab 60
okini3939 9:8c63e4f3edab 61 case 'y':
okini3939 9:8c63e4f3edab 62 value = tim->tm_year + 1900;
okini3939 9:8c63e4f3edab 63 break;
okini3939 9:8c63e4f3edab 64 case 'm':
okini3939 9:8c63e4f3edab 65 value = tim->tm_mon;
okini3939 9:8c63e4f3edab 66 break;
okini3939 9:8c63e4f3edab 67 case 'd':
okini3939 9:8c63e4f3edab 68 value = tim->tm_mday;
okini3939 9:8c63e4f3edab 69 break;
okini3939 9:8c63e4f3edab 70 case 'h':
okini3939 9:8c63e4f3edab 71 value = tim->tm_hour;
okini3939 9:8c63e4f3edab 72 break;
okini3939 9:8c63e4f3edab 73 case 'i':
okini3939 9:8c63e4f3edab 74 value = tim->tm_min;
okini3939 9:8c63e4f3edab 75 break;
okini3939 9:8c63e4f3edab 76 case 's':
okini3939 9:8c63e4f3edab 77 value = tim->tm_sec;
okini3939 9:8c63e4f3edab 78 break;
okini3939 9:8c63e4f3edab 79
okini3939 9:8c63e4f3edab 80 default:
okini3939 9:8c63e4f3edab 81 value = 0;
okini3939 9:8c63e4f3edab 82 break;
okini3939 9:8c63e4f3edab 83 }
okini3939 9:8c63e4f3edab 84
okini3939 9:8c63e4f3edab 85 switch (conf.actions[i].exps[j].expression) {
okini3939 9:8c63e4f3edab 86 case EXP_EQ:
okini3939 9:8c63e4f3edab 87 if (value == conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 88 count ++;
okini3939 9:8c63e4f3edab 89 }
okini3939 9:8c63e4f3edab 90 break;
okini3939 9:8c63e4f3edab 91 case EXP_NE:
okini3939 9:8c63e4f3edab 92 if (value != conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 93 count ++;
okini3939 9:8c63e4f3edab 94 }
okini3939 9:8c63e4f3edab 95 break;
okini3939 9:8c63e4f3edab 96 case EXP_LE:
okini3939 9:8c63e4f3edab 97 if (value <= conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 98 count ++;
okini3939 9:8c63e4f3edab 99 }
okini3939 9:8c63e4f3edab 100 break;
okini3939 9:8c63e4f3edab 101 case EXP_LT:
okini3939 9:8c63e4f3edab 102 if (value < conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 103 count ++;
okini3939 9:8c63e4f3edab 104 }
okini3939 9:8c63e4f3edab 105 break;
okini3939 9:8c63e4f3edab 106 case EXP_GE:
okini3939 9:8c63e4f3edab 107 if (value >= conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 108 count ++;
okini3939 9:8c63e4f3edab 109 }
okini3939 9:8c63e4f3edab 110 break;
okini3939 9:8c63e4f3edab 111 case EXP_GT:
okini3939 9:8c63e4f3edab 112 if (value > conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 113 count ++;
okini3939 9:8c63e4f3edab 114 }
okini3939 9:8c63e4f3edab 115 break;
okini3939 9:8c63e4f3edab 116 case EXP_MOD:
okini3939 9:8c63e4f3edab 117 if ((int)value % (int)conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 118 count ++;
okini3939 9:8c63e4f3edab 119 }
okini3939 9:8c63e4f3edab 120 break;
okini3939 9:8c63e4f3edab 121 case EXP_NMOD:
okini3939 9:8c63e4f3edab 122 if (! (int)value % (int)conf.actions[i].exps[j].value) {
okini3939 9:8c63e4f3edab 123 count ++;
okini3939 9:8c63e4f3edab 124 }
okini3939 9:8c63e4f3edab 125 break;
okini3939 9:8c63e4f3edab 126
okini3939 9:8c63e4f3edab 127 default:
okini3939 9:8c63e4f3edab 128 count ++;
okini3939 9:8c63e4f3edab 129 break;
okini3939 9:8c63e4f3edab 130 }
okini3939 9:8c63e4f3edab 131 }
okini3939 9:8c63e4f3edab 132 if (count == conf.actions[i].count) {
okini3939 9:8c63e4f3edab 133 return 1;
okini3939 9:8c63e4f3edab 134 }
okini3939 9:8c63e4f3edab 135 }
okini3939 9:8c63e4f3edab 136 return 0;
okini3939 9:8c63e4f3edab 137 }
okini3939 9:8c63e4f3edab 138
okini3939 9:8c63e4f3edab 139 void add_actionsub (struct tExpression *exp, char *buf) {
okini3939 9:8c63e4f3edab 140
okini3939 9:8c63e4f3edab 141 exp->key = buf[0];
okini3939 9:8c63e4f3edab 142
okini3939 9:8c63e4f3edab 143 switch (buf[1]) {
okini3939 9:8c63e4f3edab 144 case '=':
okini3939 9:8c63e4f3edab 145 if (buf[2] == '=') {
okini3939 9:8c63e4f3edab 146 exp->expression = EXP_EQ;
okini3939 9:8c63e4f3edab 147 exp->value = atof(&buf[3]);
okini3939 9:8c63e4f3edab 148 }
okini3939 9:8c63e4f3edab 149 break;
okini3939 9:8c63e4f3edab 150
okini3939 9:8c63e4f3edab 151 case '!':
okini3939 9:8c63e4f3edab 152 if (buf[2] == '=') {
okini3939 9:8c63e4f3edab 153 exp->expression = EXP_NE;
okini3939 9:8c63e4f3edab 154 exp->value = atof(&buf[3]);
okini3939 9:8c63e4f3edab 155 } else
okini3939 9:8c63e4f3edab 156 if (buf[2] == '%') {
okini3939 9:8c63e4f3edab 157 exp->expression = EXP_NMOD;
okini3939 9:8c63e4f3edab 158 exp->value = atof(&buf[3]);
okini3939 9:8c63e4f3edab 159 }
okini3939 9:8c63e4f3edab 160 break;
okini3939 9:8c63e4f3edab 161
okini3939 9:8c63e4f3edab 162 case '<':
okini3939 9:8c63e4f3edab 163 if (buf[2] == '=') {
okini3939 9:8c63e4f3edab 164 exp->expression = EXP_LE;
okini3939 9:8c63e4f3edab 165 exp->value = atof(&buf[3]);
okini3939 9:8c63e4f3edab 166 } else {
okini3939 9:8c63e4f3edab 167 exp->expression = EXP_LT;
okini3939 9:8c63e4f3edab 168 exp->value = atof(&buf[2]);
okini3939 9:8c63e4f3edab 169 }
okini3939 9:8c63e4f3edab 170 break;
okini3939 9:8c63e4f3edab 171
okini3939 9:8c63e4f3edab 172 case '>':
okini3939 9:8c63e4f3edab 173 if (buf[2] == '=') {
okini3939 9:8c63e4f3edab 174 exp->expression = EXP_GE;
okini3939 9:8c63e4f3edab 175 exp->value = atof(&buf[3]);
okini3939 9:8c63e4f3edab 176 } else {
okini3939 9:8c63e4f3edab 177 exp->expression = EXP_GT;
okini3939 9:8c63e4f3edab 178 exp->value = atof(&buf[2]);
okini3939 9:8c63e4f3edab 179 }
okini3939 9:8c63e4f3edab 180 break;
okini3939 9:8c63e4f3edab 181
okini3939 9:8c63e4f3edab 182 case '%':
okini3939 9:8c63e4f3edab 183 exp->expression = EXP_MOD;
okini3939 9:8c63e4f3edab 184 exp->value = atof(&buf[2]);
okini3939 9:8c63e4f3edab 185 break;
okini3939 9:8c63e4f3edab 186
okini3939 9:8c63e4f3edab 187 default:
okini3939 9:8c63e4f3edab 188 exp->expression = EXP_NULL;
okini3939 9:8c63e4f3edab 189 break;
okini3939 9:8c63e4f3edab 190 }
okini3939 9:8c63e4f3edab 191 }
okini3939 9:8c63e4f3edab 192
okini3939 9:8c63e4f3edab 193 void add_action (char *buf) {
okini3939 9:8c63e4f3edab 194 int i, len, count;
okini3939 9:8c63e4f3edab 195 char c;
okini3939 9:8c63e4f3edab 196 char *tmp = NULL;
okini3939 9:8c63e4f3edab 197
okini3939 9:8c63e4f3edab 198 if (conf.actionscount >= CF_ACTION_NUM) return;
okini3939 9:8c63e4f3edab 199
okini3939 9:8c63e4f3edab 200 // conf.actions[conf.actionscount].action = atoi(&buf[0]);
okini3939 9:8c63e4f3edab 201 conf.actions[conf.actionscount].action = buf[0];
okini3939 9:8c63e4f3edab 202
okini3939 9:8c63e4f3edab 203 count = 0;
okini3939 9:8c63e4f3edab 204 strcat(buf, "\n");
okini3939 9:8c63e4f3edab 205 len = strlen(buf);
okini3939 9:8c63e4f3edab 206 for (i = 0; i < len; i ++) {
okini3939 9:8c63e4f3edab 207 c = buf[i];
okini3939 9:8c63e4f3edab 208 if (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
okini3939 9:8c63e4f3edab 209 buf[i] = 0;
okini3939 9:8c63e4f3edab 210 if (count) {
okini3939 9:8c63e4f3edab 211 add_actionsub(&conf.actions[conf.actionscount].exps[count - 1], tmp);
okini3939 9:8c63e4f3edab 212 }
okini3939 9:8c63e4f3edab 213 if (count >= CF_ACTION_EXPS || c == '\n') break;
okini3939 9:8c63e4f3edab 214 tmp = &buf[i + 1];
okini3939 9:8c63e4f3edab 215 count ++;
okini3939 9:8c63e4f3edab 216 }
okini3939 9:8c63e4f3edab 217 }
okini3939 9:8c63e4f3edab 218
okini3939 9:8c63e4f3edab 219 conf.actions[conf.actionscount].count = count;
okini3939 9:8c63e4f3edab 220 conf.actionscount ++;
okini3939 9:8c63e4f3edab 221 }
okini3939 9:8c63e4f3edab 222
okini3939 9:8c63e4f3edab 223 int config (char *file) {
okini3939 9:8c63e4f3edab 224 int i;
okini3939 9:8c63e4f3edab 225 ConfigFile cfg;
okini3939 9:8c63e4f3edab 226 char buf[80], key[20];
okini3939 9:8c63e4f3edab 227 int ip0, ip1, ip2, ip3;
okini3939 10:848a2205aed1 228 enum I2CLCDType lcdtype = LCD16x2;
okini3939 10:848a2205aed1 229 enum I2CLCDConfig lcdconf = LCDCFG_3V;
okini3939 10:848a2205aed1 230
okini3939 9:8c63e4f3edab 231 conf.ipaddr = IpAddr(0, 0, 0, 0);
okini3939 9:8c63e4f3edab 232 conf.netmask = IpAddr(255, 255, 255, 0);
okini3939 9:8c63e4f3edab 233 conf.gateway = IpAddr(0, 0, 0, 0);
okini3939 9:8c63e4f3edab 234 conf.nameserver = IpAddr(0, 0, 0, 0);
okini3939 9:8c63e4f3edab 235 conf.interval = 60;
okini3939 9:8c63e4f3edab 236 conf.ntpserver[0] = 0;
okini3939 9:8c63e4f3edab 237 conf.filetype = 0;
okini3939 9:8c63e4f3edab 238 conf.actionscount = 0;
okini3939 9:8c63e4f3edab 239 conf.pachube_apikey[0] = 0;
okini3939 9:8c63e4f3edab 240 conf.pachube_feedid[0] = 0;
okini3939 9:8c63e4f3edab 241 conf.twitter_user[0] = 0;
okini3939 9:8c63e4f3edab 242 conf.twitter_pwd[0] = 0;
okini3939 9:8c63e4f3edab 243 conf.twitter_mesg[0] = 0;
okini3939 9:8c63e4f3edab 244 conf.stations_id[0] = 0;
okini3939 9:8c63e4f3edab 245 conf.stations_pin[0] = 0;
okini3939 9:8c63e4f3edab 246 conf.snmp_commname[0] = 0;
okini3939 10:848a2205aed1 247 conf.leddisp_mesg[0] = 0;
okini3939 10:848a2205aed1 248 conf.lcd_mesg[0] = 0;
okini3939 9:8c63e4f3edab 249
okini3939 9:8c63e4f3edab 250 if (! cfg.read(file)) {
okini3939 9:8c63e4f3edab 251 return -1;
okini3939 9:8c63e4f3edab 252 }
okini3939 9:8c63e4f3edab 253
okini3939 9:8c63e4f3edab 254 if (cfg.getValue("INTERVAL", buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 255 conf.interval = atoi(chop(buf));
okini3939 9:8c63e4f3edab 256 }
okini3939 9:8c63e4f3edab 257 if (cfg.getValue("FILE", buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 258 chop(buf);
okini3939 9:8c63e4f3edab 259 if (strcmp(buf, "SD") == 0) {
okini3939 9:8c63e4f3edab 260 conf.filetype = 1;
okini3939 9:8c63e4f3edab 261 } else
okini3939 9:8c63e4f3edab 262 if (strcmp(buf, "USB") == 0) {
okini3939 9:8c63e4f3edab 263 conf.filetype = 2;
okini3939 9:8c63e4f3edab 264 }
okini3939 9:8c63e4f3edab 265 }
okini3939 9:8c63e4f3edab 266
okini3939 9:8c63e4f3edab 267 if (cfg.getValue("IPADDRESS", buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 268 chop(buf);
okini3939 9:8c63e4f3edab 269 if (strcmp(buf, "DHCP") == 0) {
okini3939 9:8c63e4f3edab 270 conf.ipaddr = IpAddr(255, 255, 255, 255);
okini3939 9:8c63e4f3edab 271 } else {
okini3939 9:8c63e4f3edab 272 sscanf(buf, "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 9:8c63e4f3edab 273 conf.ipaddr = IpAddr(ip0, ip1, ip2, ip3);
okini3939 9:8c63e4f3edab 274 }
okini3939 9:8c63e4f3edab 275 }
okini3939 9:8c63e4f3edab 276 if (cfg.getValue("NETMASK", buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 277 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 9:8c63e4f3edab 278 conf.netmask = IpAddr(ip0, ip1, ip2, ip3);
okini3939 9:8c63e4f3edab 279 }
okini3939 9:8c63e4f3edab 280 if (cfg.getValue("GATEWAY", buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 281 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 9:8c63e4f3edab 282 conf.gateway = IpAddr(ip0, ip1, ip2, ip3);
okini3939 9:8c63e4f3edab 283 }
okini3939 9:8c63e4f3edab 284 if (cfg.getValue("NAMESERVER", buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 285 sscanf(chop(buf), "%d.%d.%d.%d", &ip0, &ip1, &ip2, &ip3);
okini3939 9:8c63e4f3edab 286 conf.nameserver = IpAddr(ip0, ip1, ip2, ip3);
okini3939 9:8c63e4f3edab 287 }
okini3939 9:8c63e4f3edab 288
okini3939 9:8c63e4f3edab 289 cfg.getValue("NTPSERVER", conf.ntpserver, sizeof(conf.ntpserver));
okini3939 9:8c63e4f3edab 290 chop(conf.ntpserver);
okini3939 9:8c63e4f3edab 291 cfg.getValue("PACHUBE_APIKEY", conf.pachube_apikey, sizeof(conf.pachube_apikey));
okini3939 9:8c63e4f3edab 292 chop(conf.pachube_apikey);
okini3939 9:8c63e4f3edab 293 cfg.getValue("PACHUBE_FEEDID", conf.pachube_feedid, sizeof(conf.pachube_feedid));
okini3939 9:8c63e4f3edab 294 chop(conf.pachube_feedid);
okini3939 9:8c63e4f3edab 295 cfg.getValue("TWITTER_USER", conf.twitter_user, sizeof(conf.twitter_user));
okini3939 9:8c63e4f3edab 296 chop(conf.twitter_user);
okini3939 9:8c63e4f3edab 297 cfg.getValue("TWITTER_PWD", conf.twitter_pwd, sizeof(conf.twitter_pwd));
okini3939 9:8c63e4f3edab 298 chop(conf.twitter_pwd);
okini3939 9:8c63e4f3edab 299 cfg.getValue("TWITTER_MESG", conf.twitter_mesg, sizeof(conf.twitter_mesg));
okini3939 9:8c63e4f3edab 300 chop(conf.twitter_mesg);
okini3939 9:8c63e4f3edab 301 cfg.getValue("STATIONS_ID", conf.stations_id, sizeof(conf.stations_id));
okini3939 9:8c63e4f3edab 302 chop(conf.stations_id);
okini3939 9:8c63e4f3edab 303 cfg.getValue("STATIONS_PIN", conf.stations_pin, sizeof(conf.stations_pin));
okini3939 9:8c63e4f3edab 304 chop(conf.stations_pin);
okini3939 9:8c63e4f3edab 305 cfg.getValue("SNMP_COMMNAME", conf.snmp_commname, sizeof(conf.snmp_commname));
okini3939 9:8c63e4f3edab 306 chop(conf.snmp_commname);
okini3939 9:8c63e4f3edab 307
okini3939 10:848a2205aed1 308 if (cfg.getValue("LCD_TYPE", buf, sizeof(buf))) {
okini3939 10:848a2205aed1 309 lcdtype = (enum I2CLCDType)atoi(chop(buf));
okini3939 10:848a2205aed1 310 }
okini3939 10:848a2205aed1 311 if (cfg.getValue("LCD_CONF", buf, sizeof(buf))) {
okini3939 10:848a2205aed1 312 lcdconf = (enum I2CLCDConfig)atoi(chop(buf));
okini3939 10:848a2205aed1 313 }
okini3939 10:848a2205aed1 314 if (cfg.getValue("LCD_MESG", conf.lcd_mesg, sizeof(conf.lcd_mesg))) {
okini3939 10:848a2205aed1 315 chop(conf.lcd_mesg);
okini3939 10:848a2205aed1 316 lcd = new I2CLCD(i2c, lcdtype, lcdconf);
okini3939 10:848a2205aed1 317 }
okini3939 10:848a2205aed1 318 if (cfg.getValue("LEDDISP_MESG", conf.leddisp_mesg, sizeof(conf.leddisp_mesg))) {
okini3939 10:848a2205aed1 319 chop(conf.leddisp_mesg);
okini3939 10:848a2205aed1 320 leddisp = new I2CLEDDisp(i2c);
okini3939 10:848a2205aed1 321 }
okini3939 10:848a2205aed1 322
okini3939 9:8c63e4f3edab 323 if (cfg.getValue("XBEE", buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 324 xbee.baud(atoi(chop(buf)));
okini3939 9:8c63e4f3edab 325 }
okini3939 9:8c63e4f3edab 326
okini3939 9:8c63e4f3edab 327 for (i = 0; i < CF_ACTION_NUM; i ++) {
okini3939 9:8c63e4f3edab 328 sprintf(key, "ACTION[%d]", i);
okini3939 9:8c63e4f3edab 329 if (cfg.getValue(key, buf, sizeof(buf))) {
okini3939 9:8c63e4f3edab 330 add_action(chop(buf));
okini3939 9:8c63e4f3edab 331 }
okini3939 9:8c63e4f3edab 332 }
okini3939 9:8c63e4f3edab 333
okini3939 9:8c63e4f3edab 334 return 0;
okini3939 9:8c63e4f3edab 335 }