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

Revision:
1:6b495e0f3b0c
Parent:
0:304c871df0a8
Child:
2:56a2ab00e743
--- a/main.cpp	Sun Dec 06 16:28:01 2009 +0000
+++ b/main.cpp	Thu Dec 27 09:40:41 2012 +0000
@@ -1,115 +1,243 @@
-#include "mbed.h"
-#include "spilcd.h"
-#include "kfont8.h"
-
-#define countof(x) ( sizeof(x) / sizeof(x[0]) )
-
-SPILCD lcd(p21, p22, p23, p11, p12, p13);
-
-int csrx = 0;
-int csry = 0;
-int offsety = 0;
-bool kstate = false;
-unsigned char kbuf;
-
-void locate(int x, int y){
-    csrx = x;
-    csry = y;
-    if(csrx < 0) csrx = 0;
-    if(csry < 0) csry = 0;
-    csrx &= 31;
-    csry &= 7;
-    lcd.moveto(csrx << 3, (offsety + csry) & 7);
-};
-
-void scroll(void){
-    int i;
-    offsety = (offsety + 1) & 7;
-    lcd.cmd(0x40 | offsety << 3);
-    lcd.moveto(0, (offsety + 7) & 7);
-    for(i = 0; i < 128; i++) lcd.write(0);
-}
-
-void newline(void){
-    csrx = 0;
-    if(++csry == 8){
-        scroll();
-        csry = 7;
-    }
-    locate(csrx, csry);
-}
-
-// draw 4x8 font
-void drawfont4(unsigned char c){
-    const unsigned char *p = &font4[c << 2];
-    lcd.write(p[0]);
-    lcd.write(p[1]);
-    lcd.write(p[2]);
-    lcd.write(p[3]);
-    // cursor control
-    if(++csrx == 32) newline();
-}
-
-const unsigned char *findface(unsigned short c){
-    const unsigned char *p = NULL;
-    int i, sum;
-    for(sum = i = 0; i < countof(font8table); i++){
-        if(font8table[i].start <= c && c <= font8table[i].end){
-            p = &font8[(sum + c - font8table[i].start) << 3];
-            break;
-        }
-        sum += font8table[i].end - font8table[i].start + 1;
-    }
-    return p;
-}
-
-// draw 8x8 font
-void drawkanji(unsigned short c){
-    const unsigned char *p = findface(c);
-    if(p == NULL) return;
-
-    if(csrx >= 31) newline();
-    lcd.write(p[0]);
-    lcd.write(p[1]);
-    lcd.write(p[2]);
-    lcd.write(p[3]);
-    lcd.write(p[4]);
-    lcd.write(p[5]);
-    lcd.write(p[6]);
-    lcd.write(p[7]);
-    csrx += 2;
-    if(csrx == 32) newline();
-}
-
-void drawc(unsigned char c){
-    if(kstate){ // 2nd byte of shift-jis
-        kstate = false;
-        drawkanji(kbuf << 8 | c);
-    } else if((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)){ // 1st byte of shift-jis
-        kstate = true;
-        kbuf = c;
-    } else { // 4x8font
-        drawfont4(c);
-    }
-}
-
-void draws(const unsigned char *s){
-    unsigned char c;
-    while((c = *s++) != '\0') drawc(c);
-}
-
-Serial sio(USBTX, USBRX);
-
-int main() {
-    unsigned char c;
-
-    sio.baud(115200);
-    while(1){
-        c = sio.getc();
-        if(c == 0x0d){
-            newline();
-        } else {
-            drawc(c);
-        }
-    }
-}
+// Twitter Mbed with Gain Span WiFi
+// 
+// coded by Kazushi Mukaiyama (http://www.kazushi.info/)
+// refer to gs fan's notebook (http://mbed.org/users/gsfan/notebook/gainspan_wifi/)
+// refer to Sim's notebook (http://mbed.org/users/Sim/code/FontTest3/)
+
+#include "mbed.h"
+#include "GSwifi.h"
+#include "spilcd.h"
+#include "kfont8.h"
+#include "sjis_utf16.h"
+
+#define countof(x) ( sizeof(x) / sizeof(x[0]) )
+
+#define SECURE GSSEC_WPA_PSK
+#define SSID "mima-lab"
+#define PASS "ikaika5656"
+
+#define HTTP_HOST "api.supertweet.net" // SuperTweet.net
+//#define HTTP_URI "/1.1/statuses/show.json?id=281639966776369152"
+#define HTTP_URI "/1.1/statuses/user_timeline.json?screen_name=pla3c&count=1"
+#define HTTP_USER "pla3c"
+#define HTTP_PASS "pla3c"
+#define INTERVAL_SEC 60.0
+
+//#define _DEBUG
+
+SPILCD lcd(p21, p22, p23, p5, p6, p7);
+GSwifi gs(p13, p14); // TX, RX (no flow control)
+// GSwifi gs(p13, p14, p12, P0_22); // TX, RX, CTS, RTS
+DigitalOut led1(LED1), led2(LED2);
+#ifdef _DEBUG
+    Serial pc(USBTX, USBRX);
+#endif
+
+int csrx = 0;
+int csry = 0;
+int offsety = 0;
+unsigned char kstate = 0;
+bool estate = false;
+unsigned char kbuf[4];
+
+void locate(int x, int y){
+    csrx = x;
+    csry = y;
+    if(csrx < 0) csrx = 0;
+    if(csry < 0) csry = 0;
+    csrx &= 31;
+    csry &= 7;
+    lcd.moveto(csrx << 3, (offsety + csry) & 7);
+};
+
+void scroll(void){
+    int i;
+    offsety = (offsety + 1) & 7;
+    lcd.cmd(0x40 | offsety << 3);
+    lcd.moveto(0, (offsety + 7) & 7);
+    for(i = 0; i < 128; i++) lcd.write(0);
+}
+
+void newline(void){
+    csrx = 0;
+    if(++csry == 8){
+        scroll();
+        csry = 7;
+    }
+    locate(csrx, csry);
+}
+
+// draw 4x8 font
+void drawfont4(unsigned char c){
+    const unsigned char *p = &font4[c << 2];
+    lcd.write(p[0]);
+    lcd.write(p[1]);
+    lcd.write(p[2]);
+    lcd.write(p[3]);
+    // cursor control
+    if(++csrx == 32) newline();
+}
+
+const unsigned char *findface(unsigned short c){
+    const unsigned char *p = NULL;
+    int i, sum;
+    for(sum = i = 0; i < countof(font8table); i++){
+        if(font8table[i].start <= c && c <= font8table[i].end){
+            p = &font8[(sum + c - font8table[i].start) << 3];
+            break;
+        }
+        sum += font8table[i].end - font8table[i].start + 1;
+    }
+    return p;
+}
+
+// draw 8x8 font
+void drawkanji(unsigned short c){
+    const unsigned char *p = findface(c);
+    if(p == NULL) return;
+
+    if(csrx >= 31) newline();
+    lcd.write(p[0]);
+    lcd.write(p[1]);
+    lcd.write(p[2]);
+    lcd.write(p[3]);
+    lcd.write(p[4]);
+    lcd.write(p[5]);
+    lcd.write(p[6]);
+    lcd.write(p[7]);
+    csrx += 2;
+    if(csrx == 32) newline();
+}
+
+unsigned short convert(unsigned short utf){
+    unsigned short sjis = NULL; 
+    for(int i=0; i<countof(sjis2utf16)/2; i++){
+        if(utf==sjis2utf16[i*2+1]){
+            sjis = sjis2utf16[i*2];
+            break;
+        }
+    }
+    return sjis;
+}
+
+void drawc(unsigned char c){
+    if(estate && kstate==4){ // 1st digit of utf-16
+        kbuf[3] = c;
+        char *endptr;
+        unsigned short code = convert(strtol((char*)kbuf, &endptr, 16));
+        drawkanji(code);
+#ifdef _DEBUG
+        pc.printf("%s, %x\r\n", kbuf, code);
+#endif
+        kstate = 0;
+        estate = false;
+    } else if(estate && kstate==3){ // 2nd digit of utf-16
+        kbuf[2] = c;
+        kstate = 4;
+    } else if(estate && kstate==2){ // 3rd digit of utf-16
+        kbuf[1] = c;
+        kstate = 3;
+    } else if(estate && kstate==1){ // 4th digit of utf-16
+        kbuf[0] = c;
+        kstate = 2;
+    } else if(estate && c=='u'){ // escape code
+        kstate = 1;
+    } else if(estate && !c=='u'){ // escape code
+        drawfont4(c);
+        kstate = 0;
+        estate = false;
+    } else if(c=='\\'){ // escape code
+        estate = true;
+    } else { // 4x8font
+        drawfont4(c);
+    }
+}
+
+void draws(const unsigned char *s){
+    unsigned char c;
+    while((c = *s++) != '\0') drawc(c);
+}
+
+void onGsReceive (int cid, int len) {
+    int i;
+    char buf[GS_DATA_SIZE + 1];
+    
+    led2 = 1;
+    i = gs.recv(cid, buf, len);
+    buf[i] = 0;
+    
+    // parse buffer    
+    char* c = strtok(buf, "\r\n");
+    if(strcmp(c, "200 OK")==0){
+        while(c!=NULL){
+            c = strtok(NULL, "\"");
+            char key[4];
+            sprintf(key, "%.4s", c);
+            if(strcmp(key, "text")==0){
+                c = strtok(NULL, "\"");
+                c = strtok(NULL, "\"");
+#ifdef _DEBUG
+                pc.printf("%s\r\n", c);
+#endif
+                lcd.cls(); locate(0,0);
+                c = strtok(c, "@");
+                draws((unsigned char*)c); newline();
+                c = strtok(NULL, "@");
+                draws((unsigned char*)c); newline();
+                break;
+            }
+        }
+    }
+    
+    led2 = 0;
+}
+
+int main() {
+    int r;
+    IpAddr ipaddr, netmask, gateway, nameserver;
+    Host host;
+    led1 = 1;
+#ifdef _DEBUG
+    pc.baud(115200);
+#endif
+    
+    char* msg;
+    msg = "connect";
+    draws((unsigned char*)msg); newline();
+    if (gs.connect(SECURE, SSID, PASS, 0)) {
+        return -1;
+    }
+    
+    gs.getAddress(ipaddr, netmask, gateway, nameserver);
+    if(nameserver.isNull()) {
+        nameserver = IpAddr(192,168,1,1);
+        r = gs.setAddress(ipaddr, netmask, gateway, nameserver);
+        gs.getAddress(ipaddr, netmask, gateway, nameserver);
+    }
+    char localip[20];
+    sprintf(localip, "ip %d.%d.%d.%d", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
+    draws ((unsigned char*)localip); newline();
+    sprintf(localip, "gw %d.%d.%d.%d", gateway[0], gateway[1], gateway[2], gateway[3]);
+    draws ((unsigned char*)localip); newline();
+    sprintf(localip, "ns %d.%d.%d.%d", nameserver[0], nameserver[1], nameserver[2], nameserver[3]);
+    draws ((unsigned char*)localip); newline();
+    
+    msg = "start twitter";
+    draws((unsigned char*)msg); newline();
+    
+    host.setName(HTTP_HOST);
+    //r = gs.httpGet(host, HTTP_URI, HTTP_USER, HTTP_PASS, 0, &onGsReceive);
+    for (;;) {
+        led1 = !led1; wait_ms(60); led1 = !led1; // blink
+        
+        gs.poll();
+        r = gs.httpGet(host, HTTP_URI, HTTP_USER, HTTP_PASS, 0, &onGsReceive);
+        //if (!gs.isConnected(r)) break;
+
+        wait(INTERVAL_SEC);
+    }
+
+    //msg = "exit";
+    //lcd.cls(); locate(0,0);
+    //draws((unsigned char*)msg);
+}