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
main.cpp
- Committer:
- okini3939
- Date:
- 2012-03-15
- Revision:
- 7:f7c98d836f81
- Parent:
- 6:898c306f7990
File content as of revision 7:f7c98d836f81:
/* * Weather Station - mbed Weather Platform * Copyright (c) 2011 Hiroshi Suga * Released under the MIT License: http://mbed.org/license/mit */ /** @file * @brief Weather Station */ #include "mbed.h" #include <new> #include "weather.h" #include "EthernetPowerControl.h" const char VERSION[] = "mbed Weather Platform 0.4.0 (C) 2011 Suga koubou"; Serial pc(USBTX, USBRX); PwmOut led1(LED1); DigitalOut led2(LED2), led3(LED3), led4(LED4); #ifdef USE_3LED DigitalOut led_red(p28), led_yellow(p23); #endif volatile uint32_t locUpTime = 0; char csv[FORMAT_STR_SIZE]; void no_memory () { printf("panic: can't allocate to memory!\r\n"); exit(-1); } // Interrupt 10Hz void isr_timer () { // uptime locUpTime = locUpTime + 10; pool_ilip(); pool_display(); LED_NET_ACT_OFF; } void init () { init_conf(); if (conf.baud) { pc.baud(conf.baud); } if (time(NULL) == -1) { time_t sec; if (! fstime(conf.dir, &sec)) { set_time(sec); } } init_sensor(); init_ilip(conf.dir); init_log(); init_display(); if (init_net()) { pc.printf("Power down: ethernet\r\n"); PHY_PowerDown(); } pc.printf("Interval: %d sec.\r\n", conf.interval); } int main() { Timer timer; Ticker ticker; int ledlevel = 0, ledflg = 0; set_new_handler(no_memory); // new handler function LED_BUSY_ON; init(); LED_BUSY_OFF; ticker.attach(&isr_timer, 0.1); // Interrupt 10Hz timer.start(); while(1) { // main loop LED_BUSY_ON; pool_net(); __disable_irq(); update_sensor(); __enable_irq(); // create CSV format_str(conf.csv_mesg, csv, sizeof_1(csv)); pc.printf(csv); pc.printf("\r\n"); if (write_log(csv)) { pc.printf("error: can't open file.\r\n"); } // I2C LCD or LED update_display(); // in/out exec_ilip(1); LED_BUSY_OFF; while (locUpTime % 100 != 0) { pool_net(); wait_ms(100); } // interval (wait) while (timer.read() < conf.interval) { ledlevel = ledlevel + (ledflg ? -5 : 5); if (ledlevel > 100) { ledlevel = 100; ledflg = 1; } else if (ledlevel < 0) { ledlevel = 0; ledflg = 0; } led1 = ledlevel / 100.0; pool_net(); wait_ms(100); // in/out (timer) 1s if (locUpTime % 100 == 0) { exec_ilip(0); } // for debug if (pc.readable()) { int i; i = pc.getc(); if (i == ' ') { break; } else { pc.printf("( %d )\r\n", (int)timer.read()); } } } timer.reset(); } }