Dependencies: EthernetNetIf TextLCD mbed HTTPClient
main.cpp
- Committer:
- blmarket
- Date:
- 2011-06-01
- Revision:
- 0:d73b14dd8351
File content as of revision 0:d73b14dd8351:
#include "mbed.h" #include "CSVParser.h" #include "EthernetNetIf.h" #include "HTTPClient.h" #include "TextLCD.h" #include <vector> #include <functional> #define ARRAYSIZE(arr) (int)(sizeof(arr) / sizeof(arr[0])) #define min(a,b) (((a)<(b))?(a):(b)) typedef void (*menuftn)(void *); using namespace std; DigitalOut myled(LED1); Serial pc(USBTX, USBRX); EthernetNetIf eth; /* ( IpAddr(110,76,72,244), //IP Address IpAddr(255,255,255,0), //Network Mask IpAddr(110,76,72,1), //Gateway IpAddr(143,248,1,177) //DNS ); */ HTTPClient http; TextLCD lcd(p21, p23, p22, p27, p28, p29, p30); // rs, rw, e, d0-d3 vector<StockData *> stocks; void donothing(void *) {} void fetchStockData(void *) { lcd.cls(); lcd.printf("Fetching..."); stocks.clear(); HTTPText txt; HTTPResult r2 = http.get("http://download.finance.yahoo.com/d/quotes.csv?f=snl1d1c1p2&e=.csv&s=000660.KS,067250.KS", &txt); if(r2 == HTTP_OK) { printf("HTTP_OK\n"); char data[1024]; int len = strlen(txt.gets()); if(len >= 1024) { pc.printf("Result too Long!\n"); return; } strcpy(data, txt.gets()); int prevpos = 0; for(int i=0;i<len;i++) { if(data[i] == 13 && data[i+1] == 10) { data[i]=0; stocks.push_back(CSVParser::parseResult(data + prevpos)); // needs to be freed using delete prevpos = i+2; } } } else { pc.printf("Error %d\n", r2); } } void clearStocks() { for(int i=0;i<stocks.size();i++) delete stocks[i]; stocks.clear(); } void showMenu(int menucnt, const char *menus[], int cursor, int screenpos) { if(menucnt == 0) return; lcd.cls(); lcd.printf("%s\n", menus[screenpos]); lcd.printf("%s\n", menus[(screenpos+1)%menucnt]); lcd.locate(15, cursor==screenpos?0:1); lcd.putc(0); } void showStock(StockData *data) { char menu[20][50]; char *menuptr[20]; int menucnt = min(CSVParser::fields.size(),20); for(int i=0;i<menucnt;i++) { sprintf(menu[i], "%s : %s", CSVParser::fields[i].second.c_str(), data->field[i]); menuptr[i] = menu[i]; } int cursor = 0; while(true) { lcd.cls(); lcd.printf("%s\n", menuptr[cursor]); char ch = getchar(); switch(ch) { case 'i': return; case 'j': cursor = (cursor + 1) % menucnt; break; case 'k': cursor = (cursor - 1 + menucnt) % menucnt; break; } } return; } void listStocks(void *) { const char *menu[20]; int menucnt = stocks.size(); for(int i=0;i<menucnt;i++) menu[i] = stocks[i]->field[1]; if(menucnt == 0) return; int cursor = 0, screenpos = 0; while(true) { showMenu(menucnt, menu, cursor, screenpos); char ch = getchar(); switch(ch) { case 'i': return; case 'j': if(screenpos != cursor) { screenpos = (screenpos + 1) % menucnt; } cursor = (cursor + 1) % menucnt; break; case 'k': if(screenpos == cursor) { cursor = (cursor - 1 + menucnt) % menucnt; screenpos = cursor; } else { cursor = (cursor - 1 + menucnt) % menucnt; } break; case 32: // space showStock(stocks[cursor]); break; } } } void startMenu(void *) { int pattern[8]; pattern[0] = 0x1; pattern[1] = 0x3; pattern[2] = 0x7; pattern[3] = 0xf; pattern[4] = 0xf; pattern[5] = 0x7; pattern[6] = 0x3; pattern[7] = 0x1; lcd.writeCGRAM(0, pattern); //lcd.locate(15,0); //lcd.putc(0); // user pattern 0 const char *menu[] = { "Get Data", "List Data", "Do Some", "Menu Test" }; menuftn ftn[] = { fetchStockData, listStocks, donothing, donothing }; int menucnt = 4; int cursor = 0, screenpos = 0; while(true) { showMenu(menucnt, menu, cursor, screenpos); char ch = getchar(); switch(ch) { case 'j': if(screenpos != cursor) { screenpos = (screenpos + 1) % menucnt; } cursor = (cursor + 1) % menucnt; break; case 'k': if(screenpos == cursor) { cursor = (cursor - 1 + menucnt) % menucnt; screenpos = cursor; } else { cursor = (cursor - 1 + menucnt) % menucnt; } break; case 32: // space ftn[cursor](NULL); break; } } } int main() { lcd.cls(); /* setting fields information of Yahoo! finance */ char *fields[] = { "s", "n", "l1", "d1", "c1", "p2" }; char *desc[] = { "Symbol", "Name", "Last Trade", "Last Trade Date", "Change", "Change in Percent" }; lcd.printf("Init..."); pc.baud(9600); EthernetErr ethErr = eth.setup(); if(ethErr) { pc.printf("Error %d in setup.\n", ethErr); return -1; } pc.printf("\r\nSetup OK\r\n"); pc.printf("CSVParser Fields Input\r\n"); CSVParser::fields.clear(); for(int i=0;i<ARRAYSIZE(fields);i++) { pc.printf("pushing %s %s\n", fields[i], desc[i]); CSVParser::fields.push_back(make_pair(fields[i], desc[i])); } pc.printf("CSVParser Setup OK\r\n"); lcd.cls(); startMenu(NULL); /* for(int i=0;i<min(2, stocks.size());i++) { StockData *data = stocks[stocks.size()-1-i]; lcd.printf("%s\n",data->field[1]); } */ clearStocks(); while(1) {} }