display your latest tweet with WiFly RN-XV and AD128160-UART
Dependencies: AD128160_kazushi_branch HTTPClient mbed PowerControl WiflyInterface
Fork of FontTest3 by
Please see at http://kazushi-lab.c.fun.ac.jp/pukiwiki/index.php?TwitterMbed
main.cpp@1:6b495e0f3b0c, 2012-12-27 (annotated)
- Committer:
- kazushi2008
- Date:
- Thu Dec 27 09:40:41 2012 +0000
- Revision:
- 1:6b495e0f3b0c
- Parent:
- 0:304c871df0a8
- Child:
- 2:56a2ab00e743
twitter mbed with GainSpan WiFi and AD-12864-SPI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kazushi2008 | 1:6b495e0f3b0c | 1 | // Twitter Mbed with Gain Span WiFi |
kazushi2008 | 1:6b495e0f3b0c | 2 | // |
kazushi2008 | 1:6b495e0f3b0c | 3 | // coded by Kazushi Mukaiyama (http://www.kazushi.info/) |
kazushi2008 | 1:6b495e0f3b0c | 4 | // refer to gs fan's notebook (http://mbed.org/users/gsfan/notebook/gainspan_wifi/) |
kazushi2008 | 1:6b495e0f3b0c | 5 | // refer to Sim's notebook (http://mbed.org/users/Sim/code/FontTest3/) |
kazushi2008 | 1:6b495e0f3b0c | 6 | |
kazushi2008 | 1:6b495e0f3b0c | 7 | #include "mbed.h" |
kazushi2008 | 1:6b495e0f3b0c | 8 | #include "GSwifi.h" |
kazushi2008 | 1:6b495e0f3b0c | 9 | #include "spilcd.h" |
kazushi2008 | 1:6b495e0f3b0c | 10 | #include "kfont8.h" |
kazushi2008 | 1:6b495e0f3b0c | 11 | #include "sjis_utf16.h" |
kazushi2008 | 1:6b495e0f3b0c | 12 | |
kazushi2008 | 1:6b495e0f3b0c | 13 | #define countof(x) ( sizeof(x) / sizeof(x[0]) ) |
kazushi2008 | 1:6b495e0f3b0c | 14 | |
kazushi2008 | 1:6b495e0f3b0c | 15 | #define SECURE GSSEC_WPA_PSK |
kazushi2008 | 1:6b495e0f3b0c | 16 | #define SSID "mima-lab" |
kazushi2008 | 1:6b495e0f3b0c | 17 | #define PASS "ikaika5656" |
kazushi2008 | 1:6b495e0f3b0c | 18 | |
kazushi2008 | 1:6b495e0f3b0c | 19 | #define HTTP_HOST "api.supertweet.net" // SuperTweet.net |
kazushi2008 | 1:6b495e0f3b0c | 20 | //#define HTTP_URI "/1.1/statuses/show.json?id=281639966776369152" |
kazushi2008 | 1:6b495e0f3b0c | 21 | #define HTTP_URI "/1.1/statuses/user_timeline.json?screen_name=pla3c&count=1" |
kazushi2008 | 1:6b495e0f3b0c | 22 | #define HTTP_USER "pla3c" |
kazushi2008 | 1:6b495e0f3b0c | 23 | #define HTTP_PASS "pla3c" |
kazushi2008 | 1:6b495e0f3b0c | 24 | #define INTERVAL_SEC 60.0 |
kazushi2008 | 1:6b495e0f3b0c | 25 | |
kazushi2008 | 1:6b495e0f3b0c | 26 | //#define _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 27 | |
kazushi2008 | 1:6b495e0f3b0c | 28 | SPILCD lcd(p21, p22, p23, p5, p6, p7); |
kazushi2008 | 1:6b495e0f3b0c | 29 | GSwifi gs(p13, p14); // TX, RX (no flow control) |
kazushi2008 | 1:6b495e0f3b0c | 30 | // GSwifi gs(p13, p14, p12, P0_22); // TX, RX, CTS, RTS |
kazushi2008 | 1:6b495e0f3b0c | 31 | DigitalOut led1(LED1), led2(LED2); |
kazushi2008 | 1:6b495e0f3b0c | 32 | #ifdef _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 33 | Serial pc(USBTX, USBRX); |
kazushi2008 | 1:6b495e0f3b0c | 34 | #endif |
kazushi2008 | 1:6b495e0f3b0c | 35 | |
kazushi2008 | 1:6b495e0f3b0c | 36 | int csrx = 0; |
kazushi2008 | 1:6b495e0f3b0c | 37 | int csry = 0; |
kazushi2008 | 1:6b495e0f3b0c | 38 | int offsety = 0; |
kazushi2008 | 1:6b495e0f3b0c | 39 | unsigned char kstate = 0; |
kazushi2008 | 1:6b495e0f3b0c | 40 | bool estate = false; |
kazushi2008 | 1:6b495e0f3b0c | 41 | unsigned char kbuf[4]; |
kazushi2008 | 1:6b495e0f3b0c | 42 | |
kazushi2008 | 1:6b495e0f3b0c | 43 | void locate(int x, int y){ |
kazushi2008 | 1:6b495e0f3b0c | 44 | csrx = x; |
kazushi2008 | 1:6b495e0f3b0c | 45 | csry = y; |
kazushi2008 | 1:6b495e0f3b0c | 46 | if(csrx < 0) csrx = 0; |
kazushi2008 | 1:6b495e0f3b0c | 47 | if(csry < 0) csry = 0; |
kazushi2008 | 1:6b495e0f3b0c | 48 | csrx &= 31; |
kazushi2008 | 1:6b495e0f3b0c | 49 | csry &= 7; |
kazushi2008 | 1:6b495e0f3b0c | 50 | lcd.moveto(csrx << 3, (offsety + csry) & 7); |
kazushi2008 | 1:6b495e0f3b0c | 51 | }; |
kazushi2008 | 1:6b495e0f3b0c | 52 | |
kazushi2008 | 1:6b495e0f3b0c | 53 | void scroll(void){ |
kazushi2008 | 1:6b495e0f3b0c | 54 | int i; |
kazushi2008 | 1:6b495e0f3b0c | 55 | offsety = (offsety + 1) & 7; |
kazushi2008 | 1:6b495e0f3b0c | 56 | lcd.cmd(0x40 | offsety << 3); |
kazushi2008 | 1:6b495e0f3b0c | 57 | lcd.moveto(0, (offsety + 7) & 7); |
kazushi2008 | 1:6b495e0f3b0c | 58 | for(i = 0; i < 128; i++) lcd.write(0); |
kazushi2008 | 1:6b495e0f3b0c | 59 | } |
kazushi2008 | 1:6b495e0f3b0c | 60 | |
kazushi2008 | 1:6b495e0f3b0c | 61 | void newline(void){ |
kazushi2008 | 1:6b495e0f3b0c | 62 | csrx = 0; |
kazushi2008 | 1:6b495e0f3b0c | 63 | if(++csry == 8){ |
kazushi2008 | 1:6b495e0f3b0c | 64 | scroll(); |
kazushi2008 | 1:6b495e0f3b0c | 65 | csry = 7; |
kazushi2008 | 1:6b495e0f3b0c | 66 | } |
kazushi2008 | 1:6b495e0f3b0c | 67 | locate(csrx, csry); |
kazushi2008 | 1:6b495e0f3b0c | 68 | } |
kazushi2008 | 1:6b495e0f3b0c | 69 | |
kazushi2008 | 1:6b495e0f3b0c | 70 | // draw 4x8 font |
kazushi2008 | 1:6b495e0f3b0c | 71 | void drawfont4(unsigned char c){ |
kazushi2008 | 1:6b495e0f3b0c | 72 | const unsigned char *p = &font4[c << 2]; |
kazushi2008 | 1:6b495e0f3b0c | 73 | lcd.write(p[0]); |
kazushi2008 | 1:6b495e0f3b0c | 74 | lcd.write(p[1]); |
kazushi2008 | 1:6b495e0f3b0c | 75 | lcd.write(p[2]); |
kazushi2008 | 1:6b495e0f3b0c | 76 | lcd.write(p[3]); |
kazushi2008 | 1:6b495e0f3b0c | 77 | // cursor control |
kazushi2008 | 1:6b495e0f3b0c | 78 | if(++csrx == 32) newline(); |
kazushi2008 | 1:6b495e0f3b0c | 79 | } |
kazushi2008 | 1:6b495e0f3b0c | 80 | |
kazushi2008 | 1:6b495e0f3b0c | 81 | const unsigned char *findface(unsigned short c){ |
kazushi2008 | 1:6b495e0f3b0c | 82 | const unsigned char *p = NULL; |
kazushi2008 | 1:6b495e0f3b0c | 83 | int i, sum; |
kazushi2008 | 1:6b495e0f3b0c | 84 | for(sum = i = 0; i < countof(font8table); i++){ |
kazushi2008 | 1:6b495e0f3b0c | 85 | if(font8table[i].start <= c && c <= font8table[i].end){ |
kazushi2008 | 1:6b495e0f3b0c | 86 | p = &font8[(sum + c - font8table[i].start) << 3]; |
kazushi2008 | 1:6b495e0f3b0c | 87 | break; |
kazushi2008 | 1:6b495e0f3b0c | 88 | } |
kazushi2008 | 1:6b495e0f3b0c | 89 | sum += font8table[i].end - font8table[i].start + 1; |
kazushi2008 | 1:6b495e0f3b0c | 90 | } |
kazushi2008 | 1:6b495e0f3b0c | 91 | return p; |
kazushi2008 | 1:6b495e0f3b0c | 92 | } |
kazushi2008 | 1:6b495e0f3b0c | 93 | |
kazushi2008 | 1:6b495e0f3b0c | 94 | // draw 8x8 font |
kazushi2008 | 1:6b495e0f3b0c | 95 | void drawkanji(unsigned short c){ |
kazushi2008 | 1:6b495e0f3b0c | 96 | const unsigned char *p = findface(c); |
kazushi2008 | 1:6b495e0f3b0c | 97 | if(p == NULL) return; |
kazushi2008 | 1:6b495e0f3b0c | 98 | |
kazushi2008 | 1:6b495e0f3b0c | 99 | if(csrx >= 31) newline(); |
kazushi2008 | 1:6b495e0f3b0c | 100 | lcd.write(p[0]); |
kazushi2008 | 1:6b495e0f3b0c | 101 | lcd.write(p[1]); |
kazushi2008 | 1:6b495e0f3b0c | 102 | lcd.write(p[2]); |
kazushi2008 | 1:6b495e0f3b0c | 103 | lcd.write(p[3]); |
kazushi2008 | 1:6b495e0f3b0c | 104 | lcd.write(p[4]); |
kazushi2008 | 1:6b495e0f3b0c | 105 | lcd.write(p[5]); |
kazushi2008 | 1:6b495e0f3b0c | 106 | lcd.write(p[6]); |
kazushi2008 | 1:6b495e0f3b0c | 107 | lcd.write(p[7]); |
kazushi2008 | 1:6b495e0f3b0c | 108 | csrx += 2; |
kazushi2008 | 1:6b495e0f3b0c | 109 | if(csrx == 32) newline(); |
kazushi2008 | 1:6b495e0f3b0c | 110 | } |
kazushi2008 | 1:6b495e0f3b0c | 111 | |
kazushi2008 | 1:6b495e0f3b0c | 112 | unsigned short convert(unsigned short utf){ |
kazushi2008 | 1:6b495e0f3b0c | 113 | unsigned short sjis = NULL; |
kazushi2008 | 1:6b495e0f3b0c | 114 | for(int i=0; i<countof(sjis2utf16)/2; i++){ |
kazushi2008 | 1:6b495e0f3b0c | 115 | if(utf==sjis2utf16[i*2+1]){ |
kazushi2008 | 1:6b495e0f3b0c | 116 | sjis = sjis2utf16[i*2]; |
kazushi2008 | 1:6b495e0f3b0c | 117 | break; |
kazushi2008 | 1:6b495e0f3b0c | 118 | } |
kazushi2008 | 1:6b495e0f3b0c | 119 | } |
kazushi2008 | 1:6b495e0f3b0c | 120 | return sjis; |
kazushi2008 | 1:6b495e0f3b0c | 121 | } |
kazushi2008 | 1:6b495e0f3b0c | 122 | |
kazushi2008 | 1:6b495e0f3b0c | 123 | void drawc(unsigned char c){ |
kazushi2008 | 1:6b495e0f3b0c | 124 | if(estate && kstate==4){ // 1st digit of utf-16 |
kazushi2008 | 1:6b495e0f3b0c | 125 | kbuf[3] = c; |
kazushi2008 | 1:6b495e0f3b0c | 126 | char *endptr; |
kazushi2008 | 1:6b495e0f3b0c | 127 | unsigned short code = convert(strtol((char*)kbuf, &endptr, 16)); |
kazushi2008 | 1:6b495e0f3b0c | 128 | drawkanji(code); |
kazushi2008 | 1:6b495e0f3b0c | 129 | #ifdef _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 130 | pc.printf("%s, %x\r\n", kbuf, code); |
kazushi2008 | 1:6b495e0f3b0c | 131 | #endif |
kazushi2008 | 1:6b495e0f3b0c | 132 | kstate = 0; |
kazushi2008 | 1:6b495e0f3b0c | 133 | estate = false; |
kazushi2008 | 1:6b495e0f3b0c | 134 | } else if(estate && kstate==3){ // 2nd digit of utf-16 |
kazushi2008 | 1:6b495e0f3b0c | 135 | kbuf[2] = c; |
kazushi2008 | 1:6b495e0f3b0c | 136 | kstate = 4; |
kazushi2008 | 1:6b495e0f3b0c | 137 | } else if(estate && kstate==2){ // 3rd digit of utf-16 |
kazushi2008 | 1:6b495e0f3b0c | 138 | kbuf[1] = c; |
kazushi2008 | 1:6b495e0f3b0c | 139 | kstate = 3; |
kazushi2008 | 1:6b495e0f3b0c | 140 | } else if(estate && kstate==1){ // 4th digit of utf-16 |
kazushi2008 | 1:6b495e0f3b0c | 141 | kbuf[0] = c; |
kazushi2008 | 1:6b495e0f3b0c | 142 | kstate = 2; |
kazushi2008 | 1:6b495e0f3b0c | 143 | } else if(estate && c=='u'){ // escape code |
kazushi2008 | 1:6b495e0f3b0c | 144 | kstate = 1; |
kazushi2008 | 1:6b495e0f3b0c | 145 | } else if(estate && !c=='u'){ // escape code |
kazushi2008 | 1:6b495e0f3b0c | 146 | drawfont4(c); |
kazushi2008 | 1:6b495e0f3b0c | 147 | kstate = 0; |
kazushi2008 | 1:6b495e0f3b0c | 148 | estate = false; |
kazushi2008 | 1:6b495e0f3b0c | 149 | } else if(c=='\\'){ // escape code |
kazushi2008 | 1:6b495e0f3b0c | 150 | estate = true; |
kazushi2008 | 1:6b495e0f3b0c | 151 | } else { // 4x8font |
kazushi2008 | 1:6b495e0f3b0c | 152 | drawfont4(c); |
kazushi2008 | 1:6b495e0f3b0c | 153 | } |
kazushi2008 | 1:6b495e0f3b0c | 154 | } |
kazushi2008 | 1:6b495e0f3b0c | 155 | |
kazushi2008 | 1:6b495e0f3b0c | 156 | void draws(const unsigned char *s){ |
kazushi2008 | 1:6b495e0f3b0c | 157 | unsigned char c; |
kazushi2008 | 1:6b495e0f3b0c | 158 | while((c = *s++) != '\0') drawc(c); |
kazushi2008 | 1:6b495e0f3b0c | 159 | } |
kazushi2008 | 1:6b495e0f3b0c | 160 | |
kazushi2008 | 1:6b495e0f3b0c | 161 | void onGsReceive (int cid, int len) { |
kazushi2008 | 1:6b495e0f3b0c | 162 | int i; |
kazushi2008 | 1:6b495e0f3b0c | 163 | char buf[GS_DATA_SIZE + 1]; |
kazushi2008 | 1:6b495e0f3b0c | 164 | |
kazushi2008 | 1:6b495e0f3b0c | 165 | led2 = 1; |
kazushi2008 | 1:6b495e0f3b0c | 166 | i = gs.recv(cid, buf, len); |
kazushi2008 | 1:6b495e0f3b0c | 167 | buf[i] = 0; |
kazushi2008 | 1:6b495e0f3b0c | 168 | |
kazushi2008 | 1:6b495e0f3b0c | 169 | // parse buffer |
kazushi2008 | 1:6b495e0f3b0c | 170 | char* c = strtok(buf, "\r\n"); |
kazushi2008 | 1:6b495e0f3b0c | 171 | if(strcmp(c, "200 OK")==0){ |
kazushi2008 | 1:6b495e0f3b0c | 172 | while(c!=NULL){ |
kazushi2008 | 1:6b495e0f3b0c | 173 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 174 | char key[4]; |
kazushi2008 | 1:6b495e0f3b0c | 175 | sprintf(key, "%.4s", c); |
kazushi2008 | 1:6b495e0f3b0c | 176 | if(strcmp(key, "text")==0){ |
kazushi2008 | 1:6b495e0f3b0c | 177 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 178 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 179 | #ifdef _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 180 | pc.printf("%s\r\n", c); |
kazushi2008 | 1:6b495e0f3b0c | 181 | #endif |
kazushi2008 | 1:6b495e0f3b0c | 182 | lcd.cls(); locate(0,0); |
kazushi2008 | 1:6b495e0f3b0c | 183 | c = strtok(c, "@"); |
kazushi2008 | 1:6b495e0f3b0c | 184 | draws((unsigned char*)c); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 185 | c = strtok(NULL, "@"); |
kazushi2008 | 1:6b495e0f3b0c | 186 | draws((unsigned char*)c); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 187 | break; |
kazushi2008 | 1:6b495e0f3b0c | 188 | } |
kazushi2008 | 1:6b495e0f3b0c | 189 | } |
kazushi2008 | 1:6b495e0f3b0c | 190 | } |
kazushi2008 | 1:6b495e0f3b0c | 191 | |
kazushi2008 | 1:6b495e0f3b0c | 192 | led2 = 0; |
kazushi2008 | 1:6b495e0f3b0c | 193 | } |
kazushi2008 | 1:6b495e0f3b0c | 194 | |
kazushi2008 | 1:6b495e0f3b0c | 195 | int main() { |
kazushi2008 | 1:6b495e0f3b0c | 196 | int r; |
kazushi2008 | 1:6b495e0f3b0c | 197 | IpAddr ipaddr, netmask, gateway, nameserver; |
kazushi2008 | 1:6b495e0f3b0c | 198 | Host host; |
kazushi2008 | 1:6b495e0f3b0c | 199 | led1 = 1; |
kazushi2008 | 1:6b495e0f3b0c | 200 | #ifdef _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 201 | pc.baud(115200); |
kazushi2008 | 1:6b495e0f3b0c | 202 | #endif |
kazushi2008 | 1:6b495e0f3b0c | 203 | |
kazushi2008 | 1:6b495e0f3b0c | 204 | char* msg; |
kazushi2008 | 1:6b495e0f3b0c | 205 | msg = "connect"; |
kazushi2008 | 1:6b495e0f3b0c | 206 | draws((unsigned char*)msg); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 207 | if (gs.connect(SECURE, SSID, PASS, 0)) { |
kazushi2008 | 1:6b495e0f3b0c | 208 | return -1; |
kazushi2008 | 1:6b495e0f3b0c | 209 | } |
kazushi2008 | 1:6b495e0f3b0c | 210 | |
kazushi2008 | 1:6b495e0f3b0c | 211 | gs.getAddress(ipaddr, netmask, gateway, nameserver); |
kazushi2008 | 1:6b495e0f3b0c | 212 | if(nameserver.isNull()) { |
kazushi2008 | 1:6b495e0f3b0c | 213 | nameserver = IpAddr(192,168,1,1); |
kazushi2008 | 1:6b495e0f3b0c | 214 | r = gs.setAddress(ipaddr, netmask, gateway, nameserver); |
kazushi2008 | 1:6b495e0f3b0c | 215 | gs.getAddress(ipaddr, netmask, gateway, nameserver); |
kazushi2008 | 1:6b495e0f3b0c | 216 | } |
kazushi2008 | 1:6b495e0f3b0c | 217 | char localip[20]; |
kazushi2008 | 1:6b495e0f3b0c | 218 | sprintf(localip, "ip %d.%d.%d.%d", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); |
kazushi2008 | 1:6b495e0f3b0c | 219 | draws ((unsigned char*)localip); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 220 | sprintf(localip, "gw %d.%d.%d.%d", gateway[0], gateway[1], gateway[2], gateway[3]); |
kazushi2008 | 1:6b495e0f3b0c | 221 | draws ((unsigned char*)localip); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 222 | sprintf(localip, "ns %d.%d.%d.%d", nameserver[0], nameserver[1], nameserver[2], nameserver[3]); |
kazushi2008 | 1:6b495e0f3b0c | 223 | draws ((unsigned char*)localip); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 224 | |
kazushi2008 | 1:6b495e0f3b0c | 225 | msg = "start twitter"; |
kazushi2008 | 1:6b495e0f3b0c | 226 | draws((unsigned char*)msg); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 227 | |
kazushi2008 | 1:6b495e0f3b0c | 228 | host.setName(HTTP_HOST); |
kazushi2008 | 1:6b495e0f3b0c | 229 | //r = gs.httpGet(host, HTTP_URI, HTTP_USER, HTTP_PASS, 0, &onGsReceive); |
kazushi2008 | 1:6b495e0f3b0c | 230 | for (;;) { |
kazushi2008 | 1:6b495e0f3b0c | 231 | led1 = !led1; wait_ms(60); led1 = !led1; // blink |
kazushi2008 | 1:6b495e0f3b0c | 232 | |
kazushi2008 | 1:6b495e0f3b0c | 233 | gs.poll(); |
kazushi2008 | 1:6b495e0f3b0c | 234 | r = gs.httpGet(host, HTTP_URI, HTTP_USER, HTTP_PASS, 0, &onGsReceive); |
kazushi2008 | 1:6b495e0f3b0c | 235 | //if (!gs.isConnected(r)) break; |
kazushi2008 | 1:6b495e0f3b0c | 236 | |
kazushi2008 | 1:6b495e0f3b0c | 237 | wait(INTERVAL_SEC); |
kazushi2008 | 1:6b495e0f3b0c | 238 | } |
kazushi2008 | 1:6b495e0f3b0c | 239 | |
kazushi2008 | 1:6b495e0f3b0c | 240 | //msg = "exit"; |
kazushi2008 | 1:6b495e0f3b0c | 241 | //lcd.cls(); locate(0,0); |
kazushi2008 | 1:6b495e0f3b0c | 242 | //draws((unsigned char*)msg); |
kazushi2008 | 1:6b495e0f3b0c | 243 | } |