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:
Tue Feb 22 14:40:11 2011 +0000
Revision:
9:8c63e4f3edab
Parent:
8:bab92fb7ef97
Child:
10:848a2205aed1

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:4265d973a98f 1 /*
okini3939 0:4265d973a98f 2 * mbed Weather Platform
okini3939 6:060cb9725ce3 3 * Copyright (c) 2011 Hiroshi Suga
okini3939 0:4265d973a98f 4 * Released under the MIT License: http://mbed.org/license/mit
okini3939 0:4265d973a98f 5 */
okini3939 1:86d4b7431fbe 6
okini3939 1:86d4b7431fbe 7 /** @file
okini3939 1:86d4b7431fbe 8 * @brief mbed Weather Platform
okini3939 0:4265d973a98f 9 */
okini3939 3:60f5f6d5f765 10
okini3939 9:8c63e4f3edab 11 #define VERSION "mbed Weather Platform 0.1.4 (C) 2011 Suga koubou Co.,Ltd."
okini3939 9:8c63e4f3edab 12 //#define USE_I2CLEDDISP // I2C LED Display
okini3939 3:60f5f6d5f765 13 //#define NONBLOCKING // ethernet function non-bloking
okini3939 3:60f5f6d5f765 14
okini3939 0:4265d973a98f 15 #include "mbed.h"
okini3939 0:4265d973a98f 16 #include "BMP085.h"
okini3939 0:4265d973a98f 17 #include "SHT.h"
okini3939 0:4265d973a98f 18 #include "WeatherMeters.h"
okini3939 0:4265d973a98f 19 #include "SDFileSystem.h"
okini3939 2:4125fe2283ef 20 #include "MSCFileSystem.h"
okini3939 0:4265d973a98f 21 #include "EthernetNetIf.h"
okini3939 0:4265d973a98f 22 #include "NTPClient.h"
okini3939 0:4265d973a98f 23 #include "HTTPClient.h"
okini3939 5:9fa79cb5ec98 24 #include "Agentbed.h"
okini3939 7:0d3484dc13a9 25 #include "conf.h"
okini3939 0:4265d973a98f 26
okini3939 3:60f5f6d5f765 27 #ifdef USE_I2CLEDDISP
okini3939 3:60f5f6d5f765 28 #include "I2CLEDDisp.h"
okini3939 3:60f5f6d5f765 29 #endif
okini3939 0:4265d973a98f 30
okini3939 9:8c63e4f3edab 31 Serial pc(USBTX, USBRX), xbee(p13, p14);
okini3939 0:4265d973a98f 32 int seq = 0;
okini3939 0:4265d973a98f 33 char filename[20];
okini3939 7:0d3484dc13a9 34 Config conf;
okini3939 1:86d4b7431fbe 35 DigitalOut led1(LED1), led2(LED2), led3(LED3), led4(LED4);
okini3939 0:4265d973a98f 36 SDFileSystem sd(p5, p6, p7, p8, "sd");
okini3939 2:4125fe2283ef 37 MSCFileSystem *usb;
okini3939 0:4265d973a98f 38
okini3939 0:4265d973a98f 39 // Sensors
okini3939 0:4265d973a98f 40 float pres, temp, humi, light, anemo, vane, rain, uv, moist, temp2;
okini3939 0:4265d973a98f 41 I2C i2c(p9, p10);
okini3939 0:4265d973a98f 42 BMP085 bmp085(i2c, BMP085_oss4);
okini3939 0:4265d973a98f 43 SHT sht15(p12, p11, SHT_high); // sclock, data
okini3939 0:4265d973a98f 44 WeatherMeters wmeters(p21, p15, p22); // anemo, vane, rain
okini3939 0:4265d973a98f 45 AnalogIn ailight(p16), aimoist(p18), aiuv(p17);
okini3939 0:4265d973a98f 46
okini3939 8:bab92fb7ef97 47 DigitalOut swout1(p29), swout2(p30);
okini3939 8:bab92fb7ef97 48 Ticker ticker;
okini3939 8:bab92fb7ef97 49
okini3939 3:60f5f6d5f765 50 #ifdef USE_I2CLEDDISP
okini3939 3:60f5f6d5f765 51 I2CLEDDisp leddisp(i2c);
okini3939 3:60f5f6d5f765 52 int ledpos, ledflg;
okini3939 3:60f5f6d5f765 53 char ledbuf[100];
okini3939 3:60f5f6d5f765 54 #endif
okini3939 3:60f5f6d5f765 55
okini3939 0:4265d973a98f 56 // Ethernet
okini3939 0:4265d973a98f 57 EthernetNetIf *eth;
okini3939 0:4265d973a98f 58 NTPClient *ntp;
okini3939 1:86d4b7431fbe 59 HTTPClient *clientP, *clientT;
okini3939 0:4265d973a98f 60 DigitalOut led_g(p25), led_y(p26);
okini3939 0:4265d973a98f 61 DigitalIn eth_link(P1_25), eth_speed(P1_26);
okini3939 0:4265d973a98f 62
okini3939 5:9fa79cb5ec98 63 extern AgentbedClass Agentbed;
okini3939 5:9fa79cb5ec98 64 extern uint32_t locUpTime;
okini3939 5:9fa79cb5ec98 65
okini3939 1:86d4b7431fbe 66 void writefile (char *);
okini3939 1:86d4b7431fbe 67 void pachube (char *);
okini3939 1:86d4b7431fbe 68 void twitter ();
okini3939 5:9fa79cb5ec98 69 void weatherstations ();
okini3939 1:86d4b7431fbe 70 void ntpdate ();
okini3939 1:86d4b7431fbe 71 int check_action (char);
okini3939 5:9fa79cb5ec98 72 void pduReceived ();
okini3939 0:4265d973a98f 73
okini3939 0:4265d973a98f 74 float get_photo (AnalogIn &ain) {
okini3939 0:4265d973a98f 75 float f;
okini3939 0:4265d973a98f 76
okini3939 0:4265d973a98f 77 f = ain * 5.0 / 1000; // A
okini3939 0:4265d973a98f 78 return f / 0.0000026; // lx
okini3939 0:4265d973a98f 79 }
okini3939 0:4265d973a98f 80
okini3939 0:4265d973a98f 81 float get_moist (AnalogIn &ain) {
okini3939 0:4265d973a98f 82 float f;
okini3939 0:4265d973a98f 83
okini3939 0:4265d973a98f 84 f = ain * 5.0; // V
okini3939 2:4125fe2283ef 85 f = f / ((3.3 - f) / 10.0); // k ohm
okini3939 2:4125fe2283ef 86 if (f < 0) f = 0;
okini3939 2:4125fe2283ef 87 return f;
okini3939 0:4265d973a98f 88 }
okini3939 0:4265d973a98f 89
okini3939 0:4265d973a98f 90 float get_uv (AnalogIn &ain) {
okini3939 0:4265d973a98f 91 float f;
okini3939 0:4265d973a98f 92
okini3939 0:4265d973a98f 93 f = ain * 5.0 / 100000; // A
okini3939 2:4125fe2283ef 94 f = f / 0.000384; // mW/cm2
okini3939 2:4125fe2283ef 95 if (f < 0) f = 0;
okini3939 2:4125fe2283ef 96 return f;
okini3939 0:4265d973a98f 97 }
okini3939 0:4265d973a98f 98
okini3939 8:bab92fb7ef97 99 void ledscroll () {
okini3939 3:60f5f6d5f765 100 #ifdef USE_I2CLEDDISP
okini3939 3:60f5f6d5f765 101 int i, addr, len;
okini3939 3:60f5f6d5f765 102
okini3939 3:60f5f6d5f765 103 len = strlen(ledbuf);
okini3939 3:60f5f6d5f765 104 leddisp.locate(0, 0);
okini3939 3:60f5f6d5f765 105 for (i = 0; i < 4; i ++) {
okini3939 3:60f5f6d5f765 106 addr = ledpos + i;
okini3939 3:60f5f6d5f765 107 if (addr >= 0 && addr < len) {
okini3939 3:60f5f6d5f765 108 leddisp.putc(ledbuf[addr]);
okini3939 3:60f5f6d5f765 109 } else {
okini3939 3:60f5f6d5f765 110 leddisp.putc(' ');
okini3939 3:60f5f6d5f765 111 }
okini3939 3:60f5f6d5f765 112 }
okini3939 3:60f5f6d5f765 113 ledpos ++;
okini3939 3:60f5f6d5f765 114 if (ledpos >= len + 4) {
okini3939 3:60f5f6d5f765 115 ledpos = -4;
okini3939 3:60f5f6d5f765 116 }
okini3939 3:60f5f6d5f765 117 #endif
okini3939 3:60f5f6d5f765 118
okini3939 8:bab92fb7ef97 119 locUpTime = locUpTime + 40; // 0.4s
okini3939 9:8c63e4f3edab 120 led_y = 1;
okini3939 8:bab92fb7ef97 121 }
okini3939 8:bab92fb7ef97 122
okini3939 1:86d4b7431fbe 123 void action (char *buf) {
okini3939 8:bab92fb7ef97 124 if (check_action('h')) {
okini3939 8:bab92fb7ef97 125 swout1 = 1;
okini3939 9:8c63e4f3edab 126 led3 = 1;
okini3939 8:bab92fb7ef97 127 }
okini3939 8:bab92fb7ef97 128 if (check_action('l')) {
okini3939 8:bab92fb7ef97 129 swout1 = 0;
okini3939 9:8c63e4f3edab 130 led3 = 0;
okini3939 8:bab92fb7ef97 131 }
okini3939 1:86d4b7431fbe 132 if (check_action('H')) {
okini3939 8:bab92fb7ef97 133 swout2 = 1;
okini3939 1:86d4b7431fbe 134 led4 = 1;
okini3939 0:4265d973a98f 135 }
okini3939 1:86d4b7431fbe 136 if (check_action('L')) {
okini3939 8:bab92fb7ef97 137 swout2 = 0;
okini3939 1:86d4b7431fbe 138 led4 = 0;
okini3939 0:4265d973a98f 139 }
okini3939 1:86d4b7431fbe 140 if (check_action('P')) {
okini3939 1:86d4b7431fbe 141 if (conf.ipaddr[0] && conf.pachube_apikey[0] && conf.pachube_feedid[0]) {
okini3939 1:86d4b7431fbe 142 pachube(buf);
okini3939 1:86d4b7431fbe 143 }
okini3939 0:4265d973a98f 144 }
okini3939 1:86d4b7431fbe 145 if (check_action('T')) {
okini3939 1:86d4b7431fbe 146 if (conf.ipaddr[0] && conf.twitter_user[0] && conf.twitter_pwd[0]) {
okini3939 1:86d4b7431fbe 147 twitter();
okini3939 1:86d4b7431fbe 148 }
okini3939 1:86d4b7431fbe 149 }
okini3939 5:9fa79cb5ec98 150 if (check_action('S')) {
okini3939 5:9fa79cb5ec98 151 if (conf.ipaddr[0] && conf.stations_id[0] && conf.stations_pin[0]) {
okini3939 5:9fa79cb5ec98 152 weatherstations();
okini3939 5:9fa79cb5ec98 153 }
okini3939 5:9fa79cb5ec98 154 }
okini3939 9:8c63e4f3edab 155 if (check_action('X')) {
okini3939 9:8c63e4f3edab 156 xbee.printf(buf);
okini3939 9:8c63e4f3edab 157 }
okini3939 0:4265d973a98f 158 }
okini3939 0:4265d973a98f 159
okini3939 0:4265d973a98f 160 void init () {
okini3939 0:4265d973a98f 161 FILE *fp;
okini3939 0:4265d973a98f 162
okini3939 7:0d3484dc13a9 163 config(CONFIG_FILE);
okini3939 0:4265d973a98f 164
okini3939 2:4125fe2283ef 165 pc.printf("Interval: %d sec\r\n", conf.interval);
okini3939 2:4125fe2283ef 166
okini3939 0:4265d973a98f 167 if (conf.ipaddr[0]) {
okini3939 0:4265d973a98f 168 // use ethernet
okini3939 0:4265d973a98f 169
okini3939 0:4265d973a98f 170 eth_link.mode(PullUp);
okini3939 0:4265d973a98f 171 eth_speed.mode(PullUp);
okini3939 0:4265d973a98f 172 led_g = eth_link ? 1 : 0;
okini3939 9:8c63e4f3edab 173 led_y = 0;
okini3939 0:4265d973a98f 174 if (conf.ipaddr[0] == 255) {
okini3939 0:4265d973a98f 175 // dhcp
okini3939 0:4265d973a98f 176 eth = new EthernetNetIf;
okini3939 0:4265d973a98f 177 } else {
okini3939 0:4265d973a98f 178 // static
okini3939 0:4265d973a98f 179 eth = new EthernetNetIf(conf.ipaddr, conf.netmask, conf.gateway, conf.nameserver);
okini3939 0:4265d973a98f 180 }
okini3939 0:4265d973a98f 181
okini3939 0:4265d973a98f 182 EthernetErr ethErr = eth->setup();
okini3939 0:4265d973a98f 183 if(ethErr) {
okini3939 0:4265d973a98f 184 // error
okini3939 0:4265d973a98f 185 conf.ipaddr = IpAddr(0, 0, 0, 0);
okini3939 0:4265d973a98f 186 } else
okini3939 0:4265d973a98f 187 if (conf.ipaddr[0] == 255) {
okini3939 0:4265d973a98f 188 // succeed dhcp
okini3939 0:4265d973a98f 189 conf.ipaddr = eth->getIp();
okini3939 0:4265d973a98f 190 }
okini3939 0:4265d973a98f 191 pc.printf("Ethernet: %d.%d.%d.%d\r\n", eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]);
okini3939 0:4265d973a98f 192
okini3939 5:9fa79cb5ec98 193 if (conf.ipaddr[0]) {
okini3939 5:9fa79cb5ec98 194
okini3939 5:9fa79cb5ec98 195 if (conf.ntpserver[0]) {
okini3939 5:9fa79cb5ec98 196 // ntp
okini3939 5:9fa79cb5ec98 197 pc.printf("Ntp: %s\r\n", conf.ntpserver);
okini3939 5:9fa79cb5ec98 198 ntpdate();
okini3939 5:9fa79cb5ec98 199 }
okini3939 0:4265d973a98f 200
okini3939 0:4265d973a98f 201 clientP = new HTTPClient;
okini3939 1:86d4b7431fbe 202 clientT = new HTTPClient;
okini3939 5:9fa79cb5ec98 203
okini3939 5:9fa79cb5ec98 204 if (conf.snmp_commname[0]) {
okini3939 5:9fa79cb5ec98 205 Agentbed.begin(conf.snmp_commname, "None", SNMP_DEFAULT_PORT, eth);
okini3939 5:9fa79cb5ec98 206 Agentbed.onPduReceive(pduReceived);
okini3939 5:9fa79cb5ec98 207 pc.printf("Snmp community name: %s\r\n", conf.snmp_commname);
okini3939 5:9fa79cb5ec98 208 }
okini3939 0:4265d973a98f 209 }
okini3939 0:4265d973a98f 210 }
okini3939 0:4265d973a98f 211
okini3939 0:4265d973a98f 212 if (conf.filetype) {
okini3939 0:4265d973a98f 213 // seq num
okini3939 2:4125fe2283ef 214
okini3939 2:4125fe2283ef 215 if (conf.filetype == 1) {
okini3939 2:4125fe2283ef 216 strcpy(filename, "/sd");
okini3939 2:4125fe2283ef 217 } else
okini3939 2:4125fe2283ef 218 if (conf.filetype == 2) {
okini3939 2:4125fe2283ef 219 usb = new MSCFileSystem("usb");
okini3939 2:4125fe2283ef 220 strcpy(filename, "/usb");
okini3939 2:4125fe2283ef 221 }
okini3939 2:4125fe2283ef 222 strcat(filename, "/weather.seq");
okini3939 2:4125fe2283ef 223
okini3939 2:4125fe2283ef 224 // load
okini3939 2:4125fe2283ef 225 fp = fopen(filename, "r");
okini3939 0:4265d973a98f 226 if (fp) {
okini3939 0:4265d973a98f 227 fscanf(fp, "%d", &seq);
okini3939 0:4265d973a98f 228 fclose(fp);
okini3939 0:4265d973a98f 229 }
okini3939 0:4265d973a98f 230 seq ++;
okini3939 2:4125fe2283ef 231 // save
okini3939 2:4125fe2283ef 232 fp = fopen(filename, "w");
okini3939 0:4265d973a98f 233 if (fp) {
okini3939 0:4265d973a98f 234 fprintf(fp, "%d", seq);
okini3939 0:4265d973a98f 235 fclose(fp);
okini3939 2:4125fe2283ef 236 // csv filename
okini3939 0:4265d973a98f 237 if (conf.filetype == 1) {
okini3939 0:4265d973a98f 238 sprintf(filename, "/sd/w%05d.csv", seq);
okini3939 0:4265d973a98f 239 } else
okini3939 0:4265d973a98f 240 if (conf.filetype == 2) {
okini3939 0:4265d973a98f 241 sprintf(filename, "/usb/w%05d.csv", seq);
okini3939 0:4265d973a98f 242 }
okini3939 0:4265d973a98f 243 pc.printf("Filename: %s\r\n", filename);
okini3939 0:4265d973a98f 244 led2 = 1;
okini3939 0:4265d973a98f 245 }
okini3939 0:4265d973a98f 246 }
okini3939 0:4265d973a98f 247 }
okini3939 0:4265d973a98f 248
okini3939 0:4265d973a98f 249 int main () {
okini3939 0:4265d973a98f 250 Timer timer;
okini3939 0:4265d973a98f 251 time_t sec;
okini3939 0:4265d973a98f 252 char buf[100];
okini3939 0:4265d973a98f 253
okini3939 8:bab92fb7ef97 254 swout1 = 0;
okini3939 8:bab92fb7ef97 255 swout2 = 0;
okini3939 0:4265d973a98f 256 led1 = 1;
okini3939 3:60f5f6d5f765 257 #ifdef USE_I2CLEDDISP
okini3939 3:60f5f6d5f765 258 ledflg = 0;
okini3939 3:60f5f6d5f765 259 ledpos = -4;
okini3939 3:60f5f6d5f765 260 strcpy(ledbuf, VERSION);
okini3939 8:bab92fb7ef97 261 #endif
okini3939 3:60f5f6d5f765 262 ticker.attach(&ledscroll, 0.4);
okini3939 0:4265d973a98f 263 init();
okini3939 0:4265d973a98f 264 pc.printf(VERSION "\r\n\r\n");
okini3939 0:4265d973a98f 265
okini3939 0:4265d973a98f 266 if (conf.filetype) {
okini3939 0:4265d973a98f 267 strcpy(buf, "date,pres(hPa),temp(`C),humi(%%),anemo(m/s),vane(`),rain(mm),light(lx),uv(mW/cm2),moist(kohm),\r\n");
okini3939 0:4265d973a98f 268 writefile(buf);
okini3939 0:4265d973a98f 269 }
okini3939 0:4265d973a98f 270
okini3939 3:60f5f6d5f765 271 #ifdef USE_I2CLEDDISP
okini3939 3:60f5f6d5f765 272 ledpos = -4;
okini3939 3:60f5f6d5f765 273 sec = time(NULL);
okini3939 3:60f5f6d5f765 274 strftime(ledbuf, sizeof(ledbuf), "%H:%M", localtime(&sec));
okini3939 3:60f5f6d5f765 275 sprintf(&ledbuf[5], " %ds %s", conf.interval, filename);
okini3939 3:60f5f6d5f765 276 if (conf.ipaddr[0]) {
okini3939 3:60f5f6d5f765 277 sprintf(&ledbuf[strlen(ledbuf)], " %d.%d.%d.%d", conf.ipaddr[0], conf.ipaddr[1], conf.ipaddr[2], conf.ipaddr[3]);
okini3939 3:60f5f6d5f765 278 if (conf.pachube_apikey[0] && conf.pachube_feedid[0]) {
okini3939 3:60f5f6d5f765 279 strcat(ledbuf, " P");
okini3939 3:60f5f6d5f765 280 }
okini3939 3:60f5f6d5f765 281 if (conf.twitter_user[0] && conf.twitter_pwd[0]) {
okini3939 3:60f5f6d5f765 282 strcat(ledbuf, " T");
okini3939 3:60f5f6d5f765 283 }
okini3939 3:60f5f6d5f765 284 }
okini3939 3:60f5f6d5f765 285 #endif
okini3939 3:60f5f6d5f765 286
okini3939 0:4265d973a98f 287 timer.start();
okini3939 0:4265d973a98f 288 #ifdef NONBLOCKING
okini3939 0:4265d973a98f 289 while (timer.read() < 5) {
okini3939 0:4265d973a98f 290 Net::poll();
okini3939 0:4265d973a98f 291 }
okini3939 0:4265d973a98f 292 timer.reset();
okini3939 0:4265d973a98f 293 #endif
okini3939 3:60f5f6d5f765 294
okini3939 0:4265d973a98f 295 while(1) {
okini3939 0:4265d973a98f 296 led1 = 0;
okini3939 0:4265d973a98f 297
okini3939 0:4265d973a98f 298 sec = time(NULL);
okini3939 0:4265d973a98f 299 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&sec));
okini3939 0:4265d973a98f 300
okini3939 0:4265d973a98f 301 // sensors
okini3939 9:8c63e4f3edab 302 __disable_irq();
okini3939 0:4265d973a98f 303 bmp085.update();
okini3939 0:4265d973a98f 304 pres = bmp085.get_pressure();
okini3939 0:4265d973a98f 305 temp2 = bmp085.get_temperature();
okini3939 0:4265d973a98f 306
okini3939 0:4265d973a98f 307 sht15.update(SHT_high);
okini3939 0:4265d973a98f 308 temp = sht15.get_temperature();
okini3939 0:4265d973a98f 309 humi = sht15.get_humidity();
okini3939 0:4265d973a98f 310
okini3939 0:4265d973a98f 311 anemo = wmeters.get_windspeed();
okini3939 0:4265d973a98f 312 vane = wmeters.get_windvane();
okini3939 0:4265d973a98f 313 rain = wmeters.get_raingauge();
okini3939 0:4265d973a98f 314
okini3939 0:4265d973a98f 315 light = get_photo(ailight);
okini3939 0:4265d973a98f 316 moist = get_moist(aimoist);
okini3939 0:4265d973a98f 317 uv = get_uv(aiuv);
okini3939 0:4265d973a98f 318
okini3939 0:4265d973a98f 319 sprintf(&buf[strlen(buf)], ",%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n", pres, temp, humi, anemo, vane, rain, light, uv, moist, temp2);
okini3939 0:4265d973a98f 320 if (conf.filetype) {
okini3939 0:4265d973a98f 321 // csv
okini3939 0:4265d973a98f 322 writefile(buf);
okini3939 0:4265d973a98f 323 }
okini3939 9:8c63e4f3edab 324 __enable_irq();
okini3939 9:8c63e4f3edab 325 pc.printf(buf);
okini3939 3:60f5f6d5f765 326
okini3939 1:86d4b7431fbe 327 action(&buf[20]);
okini3939 3:60f5f6d5f765 328
okini3939 3:60f5f6d5f765 329 #ifdef USE_I2CLEDDISP
okini3939 3:60f5f6d5f765 330 if (ledflg) {
okini3939 3:60f5f6d5f765 331 ledpos = -4;
okini3939 3:60f5f6d5f765 332 strftime(ledbuf, sizeof(ledbuf), "%H:%M", localtime(&sec));
okini3939 3:60f5f6d5f765 333 sprintf(&ledbuf[5], " %dhPa %d\x1b %d%% %dm/s %d' %dmm/h", (int)pres, (int)temp, (int)humi, (int)anemo, (int)vane, (int)rain);
okini3939 0:4265d973a98f 334 }
okini3939 3:60f5f6d5f765 335 ledflg = 1;
okini3939 3:60f5f6d5f765 336 #endif
okini3939 0:4265d973a98f 337 led1 = 1;
okini3939 0:4265d973a98f 338
okini3939 0:4265d973a98f 339 while (timer.read() < conf.interval) {
okini3939 0:4265d973a98f 340 // wait(1);
okini3939 0:4265d973a98f 341 // pc.putc('.');
okini3939 0:4265d973a98f 342 led_g = eth_link ? 1 : 0;
okini3939 0:4265d973a98f 343 Net::poll();
okini3939 0:4265d973a98f 344 }
okini3939 0:4265d973a98f 345 timer.reset();
okini3939 0:4265d973a98f 346 }
okini3939 0:4265d973a98f 347 }