Dependencies: EthernetNetIf TextLCD mbed HTTPClient
main.cpp@0:d73b14dd8351, 2011-06-01 (annotated)
- Committer:
- blmarket
- Date:
- Wed Jun 01 00:49:54 2011 +0000
- Revision:
- 0:d73b14dd8351
Who changed what in which revision?
User | Revision | Line number | New 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 | } |