StarBoard Orange - Example application No.1 GoogleChartLogger with StarBoard Orange

Dependencies:   EthernetNetIf mbed

main.cpp

Committer:
shintamainjp
Date:
2010-08-11
Revision:
1:123eff9ba7b2
Parent:
0:77d8b45a8f42

File content as of revision 1:123eff9ba7b2:

/**
 * StarBoard Orange - Example application No.1 (Version 0.0.1)
 * GoogleChartLogger with StarBoard Orange
 * See also ... http://mbed.org/users/shintamainjp/notebook/starboard_example1_ja/
 * See also ... http://mbed.org/users/shintamainjp/notebook/starboard_example1_en/
 *
 * Copyright (C) 2010 Shinichiro Nakamura (CuBeatSystems)
 * http://shinta.main.jp/
 */
#include "mbed.h"
#include "SDFileSystem.h"
#include "TextLCD.h"
#include "EthernetNetIf.h"
#include "HTTPClient.h"
#include "SensorLM60.h"
#include "SensorLM35.h"
#include "SensorMCP9700.h"
#include "SensorDummy.h"
#include "GoogleChartLineChart.h"

#define SUPERTWEET_ACCOUNT  "YourAccount"
#define SUPERTWEET_PASSWORD "YourPassword"

#if 1
/*
 * Use "DHCP"
 */
EthernetNetIf eth;
#else
/*
 * Use "static IP address"
 *
 * -> IP
 * -> Subnet mask
 * -> Gateway
 * -> DNS
 */
EthernetNetIf eth(
    IpAddr(xxx,xxx,xxx,xxx),
    IpAddr(xxx,xxx,xxx,xxx),
    IpAddr(xxx,xxx,xxx,xxx),
    IpAddr(xxx,xxx,xxx,xxx));
#endif
TextLCD lcd(p24, p25, p26, p27, p28, p29, p30);
SDFileSystem sd(p5, p6, p7, p8, "sd");
BusOut led(LED4, LED3, LED2, LED1);
SensorMCP9700 sensor1(p20);
SensorMCP9700 sensor2(p19);

void splash(void);
void getDateTime(char *buf, int siz);
int main(void);

/**
 * Display a splash screen.
 */
void splash(void) {
    lcd.cls();
    lcd.locate(0, 0);
    lcd.printf("StarBoard Orange");
    lcd.locate(0, 1);
    lcd.printf("mbed NXP LPC1768");
    wait(3);

    lcd.cls();
    lcd.locate(0, 0);
    lcd.printf("Example app No.1");
    lcd.locate(0, 1);
    lcd.printf("with GoogleChart");
    wait(3);
}

/**
 * Set current date and time.
 *
 * @param year Year.
 * @param month Month.
 * @param day Day.
 * @param hour Hour.
 * @param min Minutes.
 * @param sec Seconds.
 */
void setDateTime(int year, int month, int day, int hour, int min, int sec) {
    struct tm t;
    t.tm_sec = sec;
    t.tm_min = min;
    t.tm_hour = hour;
    t.tm_mday = day;
    t.tm_mon = month - 1;
    t.tm_year = year - 1900;
    time_t seconds = mktime(&t);
    set_time(seconds);
}

/**
 * Get current date and time.
 *
 * @param buf Pointer to buffer.
 * @param siz Size of buffer.
 */
void getDateTime(char *buf, int siz) {
    time_t seconds = time(NULL);
    struct tm *t = localtime(&seconds);
    strftime(buf, siz, "%b/%d/%Y %H:%M:%S", t);
}

/**
 * Entry point.
 */
int main(void) {

    /*
     * Splash.
     */
    splash();

    /*
     * Initialize ethernet interface.
     */
    lcd.cls();
    lcd.locate(0, 0);
    lcd.printf("Initializing.   ");
    lcd.locate(0, 1);
    lcd.printf("Ethernet:       ");

    EthernetErr ethErr = eth.setup();
    if (ethErr) {
        lcd.locate(0, 1);
        lcd.printf("Ethernet:NG     ");
    } else {
        lcd.locate(0, 1);
        lcd.printf("Ethernet:OK     ");
    }
    wait(3);

    /*
     * Check your SD card.
     */
    lcd.cls();
    lcd.locate(0, 0);
    lcd.printf("Checking SD card");
    lcd.locate(0, 1);
    lcd.printf("SD card:        ");
    wait(1);
    FILE *fp = fopen("/sd/log_test.txt", "w");
    if (NULL != fp) {
        fprintf(fp, "This is a test file for SD card.");
        fclose(fp);
        lcd.locate(0, 1);
        lcd.printf("SD card:OK      ");
    } else {
        lcd.locate(0, 1);
        lcd.printf("SD card:NG      ");
    }
    wait(1);

    /*
     * Setup http client object.
     *
     * Please replace this information by your account.
     */
    HTTPClient twitter;
    twitter.basicAuth(SUPERTWEET_ACCOUNT, SUPERTWEET_PASSWORD);

    /*
     * Setup GoogleChart objects.
     */
    static const int SAMPLES = 60;
    static const int INTERVAL = 1;

    GoogleChartLineChart chart;
    const int axs1 = chart.addNewAxis(Axis::Left);
    const int axs2 = chart.addNewAxis(Axis::Bottom);
    const int dsn1 = chart.addNewDataSet("Ch.1", SAMPLES);
    const int dsn2 = chart.addNewDataSet("Ch.2", SAMPLES);

    static const int TEMP_HIGH = 50;
    static const int TEMP_LOW = -10;

    chart.setAxisRange(axs1, TEMP_LOW, TEMP_HIGH);
    chart.setAxisRange(axs2, 0, SAMPLES);
    chart.setDataScale(dsn1, TEMP_LOW, TEMP_HIGH);
    chart.setDataScale(dsn2, TEMP_LOW, TEMP_HIGH);

    /*
     * Set date and time. (If you want.)
     *
     * -> Year.
     * -> Month.
     * -> Day.
     * -> Hour.
     * -> Minutes.
     * -> Seconds.
     */
#if 0
    setDateTime(2012, 1, 1, 0, 0, 0);
#endif

    /*
     * Start logging.
     */
    uint16_t count = 0;
    static const int WAIT_FOR_USER = 1;
    while (1) {
        /*
         * Get date and time
         */
        if (0 == (count % SAMPLES)) {
            char dt[64];
            getDateTime(dt, sizeof(dt));
            chart.setTitle(std::string(dt));
        }
        count++;

        /*
         * Status on LED.
         */
        led = count & 0x0f;

        /*
         * Logging current status.
         */
        double sample1 = sensor1.read();
        double sample2 = sensor2.read();
        chart.addData(dsn1, sample1);
        chart.addData(dsn2, sample2);

        /*
         * Display the information.
         */
        lcd.cls();
        lcd.locate(0, 0);
        lcd.printf("Data=[%4.1f,%4.1f]", sample1, sample2);
        lcd.locate(0, 1);
        lcd.printf("Stat=[%4d/%4d]", count, SAMPLES);

        /*
         * Write to storages if the data filled the chart.
         */
        if (0 == (count % SAMPLES)) {
            /*
             * Write to a SD card.
             */
            static int fcnt = 0;
            fcnt++;
            char fname[64];
            snprintf(fname, sizeof(fname), "/sd/log%05d.txt", fcnt);
            lcd.locate(0, 1);
            lcd.printf("SD card:        ");
            FILE *fp = fopen(fname, "w");
            if (NULL != fp) {
                fprintf(fp, "%s\n", chart.toString().c_str());
                fclose(fp);
                lcd.locate(0, 1);
                lcd.printf("SD card:OK      ");
            } else {
                lcd.locate(0, 1);
                lcd.printf("SD card:NG      ");
            }
            wait(WAIT_FOR_USER);

            /*
             * Write to twitter.
             */
            lcd.locate(0, 1);
            lcd.printf("Tweet:          ");
            HTTPMap msg;
            msg["status"] = chart.toString();
            HTTPResult r = twitter.post("http://api.supertweet.net/1/statuses/update.xml", msg, NULL);
            if (r == HTTP_OK) {
                lcd.locate(0, 1);
                lcd.printf("Tweet:OK        ");
            } else {
                lcd.locate(0, 1);
                lcd.printf("Tweet:NG(%02d)    ", r);
            }
            wait(WAIT_FOR_USER);

            /*
             * Clear the logged data.
             */
            chart.clearAllData(dsn1);
            chart.clearAllData(dsn2);
            count = 0;
        }
        wait(INTERVAL);
    }

    return 0;
}