Dependencies:   EthernetNetIf TextLCD mbed HTTPClient

Committer:
blmarket
Date:
Wed Jun 01 00:49:54 2011 +0000
Revision:
0:d73b14dd8351

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
blmarket 0:d73b14dd8351 1 #include "mbed.h"
blmarket 0:d73b14dd8351 2 #include "CSVParser.h"
blmarket 0:d73b14dd8351 3 #include "EthernetNetIf.h"
blmarket 0:d73b14dd8351 4 #include "HTTPClient.h"
blmarket 0:d73b14dd8351 5 #include "TextLCD.h"
blmarket 0:d73b14dd8351 6 #include <vector>
blmarket 0:d73b14dd8351 7 #include <functional>
blmarket 0:d73b14dd8351 8
blmarket 0:d73b14dd8351 9 #define ARRAYSIZE(arr) (int)(sizeof(arr) / sizeof(arr[0]))
blmarket 0:d73b14dd8351 10 #define min(a,b) (((a)<(b))?(a):(b))
blmarket 0:d73b14dd8351 11
blmarket 0:d73b14dd8351 12 typedef void (*menuftn)(void *);
blmarket 0:d73b14dd8351 13
blmarket 0:d73b14dd8351 14 using namespace std;
blmarket 0:d73b14dd8351 15
blmarket 0:d73b14dd8351 16 DigitalOut myled(LED1);
blmarket 0:d73b14dd8351 17 Serial pc(USBTX, USBRX);
blmarket 0:d73b14dd8351 18 EthernetNetIf eth;
blmarket 0:d73b14dd8351 19 /*
blmarket 0:d73b14dd8351 20 (
blmarket 0:d73b14dd8351 21 IpAddr(110,76,72,244), //IP Address
blmarket 0:d73b14dd8351 22 IpAddr(255,255,255,0), //Network Mask
blmarket 0:d73b14dd8351 23 IpAddr(110,76,72,1), //Gateway
blmarket 0:d73b14dd8351 24 IpAddr(143,248,1,177) //DNS
blmarket 0:d73b14dd8351 25 );
blmarket 0:d73b14dd8351 26 */
blmarket 0:d73b14dd8351 27 HTTPClient http;
blmarket 0:d73b14dd8351 28 TextLCD lcd(p21, p23, p22, p27, p28, p29, p30); // rs, rw, e, d0-d3
blmarket 0:d73b14dd8351 29
blmarket 0:d73b14dd8351 30 vector<StockData *> stocks;
blmarket 0:d73b14dd8351 31
blmarket 0:d73b14dd8351 32 void donothing(void *) {}
blmarket 0:d73b14dd8351 33
blmarket 0:d73b14dd8351 34 void fetchStockData(void *)
blmarket 0:d73b14dd8351 35 {
blmarket 0:d73b14dd8351 36 lcd.cls();
blmarket 0:d73b14dd8351 37 lcd.printf("Fetching...");
blmarket 0:d73b14dd8351 38 stocks.clear();
blmarket 0:d73b14dd8351 39
blmarket 0:d73b14dd8351 40 HTTPText txt;
blmarket 0:d73b14dd8351 41 HTTPResult r2 = http.get("http://download.finance.yahoo.com/d/quotes.csv?f=snl1d1c1p2&e=.csv&s=000660.KS,067250.KS", &txt);
blmarket 0:d73b14dd8351 42 if(r2 == HTTP_OK)
blmarket 0:d73b14dd8351 43 {
blmarket 0:d73b14dd8351 44 printf("HTTP_OK\n");
blmarket 0:d73b14dd8351 45
blmarket 0:d73b14dd8351 46 char data[1024];
blmarket 0:d73b14dd8351 47 int len = strlen(txt.gets());
blmarket 0:d73b14dd8351 48
blmarket 0:d73b14dd8351 49 if(len >= 1024)
blmarket 0:d73b14dd8351 50 {
blmarket 0:d73b14dd8351 51 pc.printf("Result too Long!\n");
blmarket 0:d73b14dd8351 52 return;
blmarket 0:d73b14dd8351 53 }
blmarket 0:d73b14dd8351 54
blmarket 0:d73b14dd8351 55 strcpy(data, txt.gets());
blmarket 0:d73b14dd8351 56 int prevpos = 0;
blmarket 0:d73b14dd8351 57 for(int i=0;i<len;i++)
blmarket 0:d73b14dd8351 58 {
blmarket 0:d73b14dd8351 59 if(data[i] == 13 && data[i+1] == 10)
blmarket 0:d73b14dd8351 60 {
blmarket 0:d73b14dd8351 61 data[i]=0;
blmarket 0:d73b14dd8351 62 stocks.push_back(CSVParser::parseResult(data + prevpos)); // needs to be freed using delete
blmarket 0:d73b14dd8351 63 prevpos = i+2;
blmarket 0:d73b14dd8351 64 }
blmarket 0:d73b14dd8351 65 }
blmarket 0:d73b14dd8351 66 }
blmarket 0:d73b14dd8351 67 else
blmarket 0:d73b14dd8351 68 {
blmarket 0:d73b14dd8351 69 pc.printf("Error %d\n", r2);
blmarket 0:d73b14dd8351 70 }
blmarket 0:d73b14dd8351 71 }
blmarket 0:d73b14dd8351 72
blmarket 0:d73b14dd8351 73 void clearStocks() { for(int i=0;i<stocks.size();i++) delete stocks[i]; stocks.clear(); }
blmarket 0:d73b14dd8351 74
blmarket 0:d73b14dd8351 75 void showMenu(int menucnt, const char *menus[], int cursor, int screenpos)
blmarket 0:d73b14dd8351 76 {
blmarket 0:d73b14dd8351 77 if(menucnt == 0) return;
blmarket 0:d73b14dd8351 78 lcd.cls();
blmarket 0:d73b14dd8351 79 lcd.printf("%s\n", menus[screenpos]);
blmarket 0:d73b14dd8351 80 lcd.printf("%s\n", menus[(screenpos+1)%menucnt]);
blmarket 0:d73b14dd8351 81 lcd.locate(15, cursor==screenpos?0:1);
blmarket 0:d73b14dd8351 82 lcd.putc(0);
blmarket 0:d73b14dd8351 83 }
blmarket 0:d73b14dd8351 84
blmarket 0:d73b14dd8351 85 void showStock(StockData *data)
blmarket 0:d73b14dd8351 86 {
blmarket 0:d73b14dd8351 87 char menu[20][50];
blmarket 0:d73b14dd8351 88 char *menuptr[20];
blmarket 0:d73b14dd8351 89
blmarket 0:d73b14dd8351 90 int menucnt = min(CSVParser::fields.size(),20);
blmarket 0:d73b14dd8351 91
blmarket 0:d73b14dd8351 92 for(int i=0;i<menucnt;i++)
blmarket 0:d73b14dd8351 93 {
blmarket 0:d73b14dd8351 94 sprintf(menu[i], "%s : %s", CSVParser::fields[i].second.c_str(), data->field[i]);
blmarket 0:d73b14dd8351 95 menuptr[i] = menu[i];
blmarket 0:d73b14dd8351 96 }
blmarket 0:d73b14dd8351 97
blmarket 0:d73b14dd8351 98 int cursor = 0;
blmarket 0:d73b14dd8351 99 while(true)
blmarket 0:d73b14dd8351 100 {
blmarket 0:d73b14dd8351 101 lcd.cls();
blmarket 0:d73b14dd8351 102 lcd.printf("%s\n", menuptr[cursor]);
blmarket 0:d73b14dd8351 103 char ch = getchar();
blmarket 0:d73b14dd8351 104 switch(ch)
blmarket 0:d73b14dd8351 105 {
blmarket 0:d73b14dd8351 106 case 'i':
blmarket 0:d73b14dd8351 107 return;
blmarket 0:d73b14dd8351 108 case 'j':
blmarket 0:d73b14dd8351 109 cursor = (cursor + 1) % menucnt;
blmarket 0:d73b14dd8351 110 break;
blmarket 0:d73b14dd8351 111 case 'k':
blmarket 0:d73b14dd8351 112 cursor = (cursor - 1 + menucnt) % menucnt;
blmarket 0:d73b14dd8351 113 break;
blmarket 0:d73b14dd8351 114 }
blmarket 0:d73b14dd8351 115 }
blmarket 0:d73b14dd8351 116 return;
blmarket 0:d73b14dd8351 117 }
blmarket 0:d73b14dd8351 118
blmarket 0:d73b14dd8351 119 void listStocks(void *)
blmarket 0:d73b14dd8351 120 {
blmarket 0:d73b14dd8351 121 const char *menu[20];
blmarket 0:d73b14dd8351 122 int menucnt = stocks.size();
blmarket 0:d73b14dd8351 123 for(int i=0;i<menucnt;i++)
blmarket 0:d73b14dd8351 124 menu[i] = stocks[i]->field[1];
blmarket 0:d73b14dd8351 125
blmarket 0:d73b14dd8351 126 if(menucnt == 0) return;
blmarket 0:d73b14dd8351 127
blmarket 0:d73b14dd8351 128 int cursor = 0, screenpos = 0;
blmarket 0:d73b14dd8351 129 while(true)
blmarket 0:d73b14dd8351 130 {
blmarket 0:d73b14dd8351 131 showMenu(menucnt, menu, cursor, screenpos);
blmarket 0:d73b14dd8351 132 char ch = getchar();
blmarket 0:d73b14dd8351 133 switch(ch)
blmarket 0:d73b14dd8351 134 {
blmarket 0:d73b14dd8351 135 case 'i':
blmarket 0:d73b14dd8351 136 return;
blmarket 0:d73b14dd8351 137 case 'j':
blmarket 0:d73b14dd8351 138 if(screenpos != cursor)
blmarket 0:d73b14dd8351 139 {
blmarket 0:d73b14dd8351 140 screenpos = (screenpos + 1) % menucnt;
blmarket 0:d73b14dd8351 141 }
blmarket 0:d73b14dd8351 142 cursor = (cursor + 1) % menucnt;
blmarket 0:d73b14dd8351 143 break;
blmarket 0:d73b14dd8351 144 case 'k':
blmarket 0:d73b14dd8351 145 if(screenpos == cursor)
blmarket 0:d73b14dd8351 146 {
blmarket 0:d73b14dd8351 147 cursor = (cursor - 1 + menucnt) % menucnt;
blmarket 0:d73b14dd8351 148 screenpos = cursor;
blmarket 0:d73b14dd8351 149 }
blmarket 0:d73b14dd8351 150 else
blmarket 0:d73b14dd8351 151 {
blmarket 0:d73b14dd8351 152 cursor = (cursor - 1 + menucnt) % menucnt;
blmarket 0:d73b14dd8351 153 }
blmarket 0:d73b14dd8351 154 break;
blmarket 0:d73b14dd8351 155 case 32: // space
blmarket 0:d73b14dd8351 156 showStock(stocks[cursor]);
blmarket 0:d73b14dd8351 157 break;
blmarket 0:d73b14dd8351 158 }
blmarket 0:d73b14dd8351 159 }
blmarket 0:d73b14dd8351 160 }
blmarket 0:d73b14dd8351 161
blmarket 0:d73b14dd8351 162 void startMenu(void *)
blmarket 0:d73b14dd8351 163 {
blmarket 0:d73b14dd8351 164 int pattern[8];
blmarket 0:d73b14dd8351 165 pattern[0] = 0x1;
blmarket 0:d73b14dd8351 166 pattern[1] = 0x3;
blmarket 0:d73b14dd8351 167 pattern[2] = 0x7;
blmarket 0:d73b14dd8351 168 pattern[3] = 0xf;
blmarket 0:d73b14dd8351 169 pattern[4] = 0xf;
blmarket 0:d73b14dd8351 170 pattern[5] = 0x7;
blmarket 0:d73b14dd8351 171 pattern[6] = 0x3;
blmarket 0:d73b14dd8351 172 pattern[7] = 0x1;
blmarket 0:d73b14dd8351 173
blmarket 0:d73b14dd8351 174 lcd.writeCGRAM(0, pattern);
blmarket 0:d73b14dd8351 175
blmarket 0:d73b14dd8351 176 //lcd.locate(15,0);
blmarket 0:d73b14dd8351 177 //lcd.putc(0); // user pattern 0
blmarket 0:d73b14dd8351 178
blmarket 0:d73b14dd8351 179 const char *menu[] = { "Get Data", "List Data", "Do Some", "Menu Test" };
blmarket 0:d73b14dd8351 180 menuftn ftn[] = { fetchStockData, listStocks, donothing, donothing };
blmarket 0:d73b14dd8351 181 int menucnt = 4;
blmarket 0:d73b14dd8351 182
blmarket 0:d73b14dd8351 183 int cursor = 0, screenpos = 0;
blmarket 0:d73b14dd8351 184
blmarket 0:d73b14dd8351 185 while(true)
blmarket 0:d73b14dd8351 186 {
blmarket 0:d73b14dd8351 187 showMenu(menucnt, menu, cursor, screenpos);
blmarket 0:d73b14dd8351 188
blmarket 0:d73b14dd8351 189 char ch = getchar();
blmarket 0:d73b14dd8351 190 switch(ch)
blmarket 0:d73b14dd8351 191 {
blmarket 0:d73b14dd8351 192 case 'j':
blmarket 0:d73b14dd8351 193 if(screenpos != cursor)
blmarket 0:d73b14dd8351 194 {
blmarket 0:d73b14dd8351 195 screenpos = (screenpos + 1) % menucnt;
blmarket 0:d73b14dd8351 196 }
blmarket 0:d73b14dd8351 197 cursor = (cursor + 1) % menucnt;
blmarket 0:d73b14dd8351 198 break;
blmarket 0:d73b14dd8351 199 case 'k':
blmarket 0:d73b14dd8351 200 if(screenpos == cursor)
blmarket 0:d73b14dd8351 201 {
blmarket 0:d73b14dd8351 202 cursor = (cursor - 1 + menucnt) % menucnt;
blmarket 0:d73b14dd8351 203 screenpos = cursor;
blmarket 0:d73b14dd8351 204 }
blmarket 0:d73b14dd8351 205 else
blmarket 0:d73b14dd8351 206 {
blmarket 0:d73b14dd8351 207 cursor = (cursor - 1 + menucnt) % menucnt;
blmarket 0:d73b14dd8351 208 }
blmarket 0:d73b14dd8351 209 break;
blmarket 0:d73b14dd8351 210 case 32: // space
blmarket 0:d73b14dd8351 211 ftn[cursor](NULL);
blmarket 0:d73b14dd8351 212 break;
blmarket 0:d73b14dd8351 213 }
blmarket 0:d73b14dd8351 214 }
blmarket 0:d73b14dd8351 215 }
blmarket 0:d73b14dd8351 216
blmarket 0:d73b14dd8351 217 int main()
blmarket 0:d73b14dd8351 218 {
blmarket 0:d73b14dd8351 219 lcd.cls();
blmarket 0:d73b14dd8351 220 /* setting fields information of Yahoo! finance */
blmarket 0:d73b14dd8351 221 char *fields[] = { "s", "n", "l1", "d1", "c1", "p2" };
blmarket 0:d73b14dd8351 222 char *desc[] = { "Symbol", "Name", "Last Trade", "Last Trade Date", "Change", "Change in Percent" };
blmarket 0:d73b14dd8351 223
blmarket 0:d73b14dd8351 224 lcd.printf("Init...");
blmarket 0:d73b14dd8351 225
blmarket 0:d73b14dd8351 226 pc.baud(9600);
blmarket 0:d73b14dd8351 227 EthernetErr ethErr = eth.setup();
blmarket 0:d73b14dd8351 228 if(ethErr)
blmarket 0:d73b14dd8351 229 {
blmarket 0:d73b14dd8351 230 pc.printf("Error %d in setup.\n", ethErr);
blmarket 0:d73b14dd8351 231 return -1;
blmarket 0:d73b14dd8351 232 }
blmarket 0:d73b14dd8351 233 pc.printf("\r\nSetup OK\r\n");
blmarket 0:d73b14dd8351 234
blmarket 0:d73b14dd8351 235 pc.printf("CSVParser Fields Input\r\n");
blmarket 0:d73b14dd8351 236
blmarket 0:d73b14dd8351 237 CSVParser::fields.clear();
blmarket 0:d73b14dd8351 238
blmarket 0:d73b14dd8351 239 for(int i=0;i<ARRAYSIZE(fields);i++)
blmarket 0:d73b14dd8351 240 {
blmarket 0:d73b14dd8351 241 pc.printf("pushing %s %s\n", fields[i], desc[i]);
blmarket 0:d73b14dd8351 242 CSVParser::fields.push_back(make_pair(fields[i], desc[i]));
blmarket 0:d73b14dd8351 243 }
blmarket 0:d73b14dd8351 244
blmarket 0:d73b14dd8351 245 pc.printf("CSVParser Setup OK\r\n");
blmarket 0:d73b14dd8351 246
blmarket 0:d73b14dd8351 247 lcd.cls();
blmarket 0:d73b14dd8351 248
blmarket 0:d73b14dd8351 249 startMenu(NULL);
blmarket 0:d73b14dd8351 250
blmarket 0:d73b14dd8351 251 /*
blmarket 0:d73b14dd8351 252 for(int i=0;i<min(2, stocks.size());i++)
blmarket 0:d73b14dd8351 253 {
blmarket 0:d73b14dd8351 254 StockData *data = stocks[stocks.size()-1-i];
blmarket 0:d73b14dd8351 255 lcd.printf("%s\n",data->field[1]);
blmarket 0:d73b14dd8351 256 }
blmarket 0:d73b14dd8351 257 */
blmarket 0:d73b14dd8351 258
blmarket 0:d73b14dd8351 259 clearStocks();
blmarket 0:d73b14dd8351 260
blmarket 0:d73b14dd8351 261 while(1) {}
blmarket 0:d73b14dd8351 262 }