display your latest tweet with WiFly RN-XV and AD128160-UART

Dependencies:   AD128160_kazushi_branch HTTPClient mbed PowerControl WiflyInterface

Fork of FontTest3 by Sim mbed

/media/uploads/kazushi2008/_scaled_twittermbed_scene.jpg /media/uploads/kazushi2008/_scaled_twittermbed.jpg

Please see at http://kazushi-lab.c.fun.ac.jp/pukiwiki/index.php?TwitterMbed

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?

UserRevisionLine numberNew 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 }