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:
Mon Feb 25 03:26:07 2013 +0000
Revision:
9:86dd65b94dca
Parent:
8:22eb078985b1
Child:
10:94f45d37174f
add the feature to change to red color when "!" appear in Twitter message.

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 2:56a2ab00e743 5 // refer to GingaX's notebook (http://www31.atwiki.jp/gingax/pages/63.html)
kazushi2008 1:6b495e0f3b0c 6
kazushi2008 1:6b495e0f3b0c 7 #include "mbed.h"
kazushi2008 6:5aa67ed9ae43 8 #include "PowerControl/PowerControl.h"
kazushi2008 6:5aa67ed9ae43 9 #include "PowerControl/EthernetPowerControl.h"
kazushi2008 1:6b495e0f3b0c 10 #include "GSwifi.h"
kazushi2008 1:6b495e0f3b0c 11 #include "sjis_utf16.h"
kazushi2008 2:56a2ab00e743 12 #include "s_Lcd.h"
kazushi2008 1:6b495e0f3b0c 13
kazushi2008 1:6b495e0f3b0c 14 #define countof(x) ( sizeof(x) / sizeof(x[0]) )
kazushi2008 1:6b495e0f3b0c 15
kazushi2008 1:6b495e0f3b0c 16 #define SECURE GSSEC_WPA_PSK
kazushi2008 8:22eb078985b1 17 #define SSID "WIFISSID"
kazushi2008 8:22eb078985b1 18 #define PASS "abcdef1234"
kazushi2008 1:6b495e0f3b0c 19
kazushi2008 1:6b495e0f3b0c 20 #define HTTP_HOST "api.supertweet.net" // SuperTweet.net
kazushi2008 1:6b495e0f3b0c 21 //#define HTTP_URI "/1.1/statuses/show.json?id=281639966776369152"
kazushi2008 1:6b495e0f3b0c 22 #define HTTP_URI "/1.1/statuses/user_timeline.json?screen_name=pla3c&count=1"
kazushi2008 8:22eb078985b1 23 #define HTTP_USER "user"
kazushi2008 8:22eb078985b1 24 #define HTTP_PASS "pass"
kazushi2008 1:6b495e0f3b0c 25 #define INTERVAL_SEC 60.0
kazushi2008 1:6b495e0f3b0c 26
kazushi2008 1:6b495e0f3b0c 27 //#define _DEBUG
kazushi2008 1:6b495e0f3b0c 28
kazushi2008 1:6b495e0f3b0c 29 GSwifi gs(p13, p14); // TX, RX (no flow control)
kazushi2008 1:6b495e0f3b0c 30 DigitalOut led1(LED1), led2(LED2);
kazushi2008 1:6b495e0f3b0c 31 #ifdef _DEBUG
kazushi2008 1:6b495e0f3b0c 32 Serial pc(USBTX, USBRX);
kazushi2008 1:6b495e0f3b0c 33 #endif
kazushi2008 1:6b495e0f3b0c 34
kazushi2008 2:56a2ab00e743 35 unsigned char kstatus = 0;
kazushi2008 1:6b495e0f3b0c 36 bool estate = false;
kazushi2008 2:56a2ab00e743 37 unsigned char unibuf[4];
kazushi2008 9:86dd65b94dca 38 unsigned char codes[512];
kazushi2008 9:86dd65b94dca 39 bool emergency = false;
kazushi2008 1:6b495e0f3b0c 40
kazushi2008 1:6b495e0f3b0c 41 unsigned short convert(unsigned short utf){
kazushi2008 1:6b495e0f3b0c 42 unsigned short sjis = NULL;
kazushi2008 1:6b495e0f3b0c 43 for(int i=0; i<countof(sjis2utf16)/2; i++){
kazushi2008 1:6b495e0f3b0c 44 if(utf==sjis2utf16[i*2+1]){
kazushi2008 1:6b495e0f3b0c 45 sjis = sjis2utf16[i*2];
kazushi2008 1:6b495e0f3b0c 46 break;
kazushi2008 1:6b495e0f3b0c 47 }
kazushi2008 1:6b495e0f3b0c 48 }
kazushi2008 1:6b495e0f3b0c 49 return sjis;
kazushi2008 1:6b495e0f3b0c 50 }
kazushi2008 1:6b495e0f3b0c 51
kazushi2008 9:86dd65b94dca 52 void parseCode(const unsigned char* s){
kazushi2008 9:86dd65b94dca 53 unsigned int i = 0;
kazushi2008 9:86dd65b94dca 54 unsigned char c;
kazushi2008 9:86dd65b94dca 55
kazushi2008 9:86dd65b94dca 56 emergency = false;
kazushi2008 9:86dd65b94dca 57 while((c = *s++) != '\0') {
kazushi2008 9:86dd65b94dca 58 if(estate && kstatus==4){ // 1st digit of utf-16
kazushi2008 9:86dd65b94dca 59 unibuf[3] = c;
kazushi2008 9:86dd65b94dca 60 char *endptr;
kazushi2008 9:86dd65b94dca 61 unsigned short code = convert(strtol((char*)unibuf, &endptr, 16));
kazushi2008 9:86dd65b94dca 62 codes[i] = code>>8 & 0xFF;
kazushi2008 9:86dd65b94dca 63 i++;
kazushi2008 9:86dd65b94dca 64 codes[i] = code & 0xFF;
kazushi2008 9:86dd65b94dca 65 i++;
kazushi2008 9:86dd65b94dca 66 if(code==0x8149) emergency = true;
kazushi2008 9:86dd65b94dca 67 #ifdef _DEBUG
kazushi2008 9:86dd65b94dca 68 pc.printf("%s, %x\r\n", unibuf, code);
kazushi2008 9:86dd65b94dca 69 #endif
kazushi2008 9:86dd65b94dca 70 kstatus = 0;
kazushi2008 9:86dd65b94dca 71 estate = false;
kazushi2008 9:86dd65b94dca 72 } else if(estate && kstatus==3){ // 2nd digit of utf-16
kazushi2008 9:86dd65b94dca 73 unibuf[2] = c;
kazushi2008 9:86dd65b94dca 74 kstatus = 4;
kazushi2008 9:86dd65b94dca 75 } else if(estate && kstatus==2){ // 3rd digit of utf-16
kazushi2008 9:86dd65b94dca 76 unibuf[1] = c;
kazushi2008 9:86dd65b94dca 77 kstatus = 3;
kazushi2008 9:86dd65b94dca 78 } else if(estate && kstatus==1){ // 4th digit of utf-16
kazushi2008 9:86dd65b94dca 79 unibuf[0] = c;
kazushi2008 9:86dd65b94dca 80 kstatus = 2;
kazushi2008 9:86dd65b94dca 81 } else if(estate && c=='u'){
kazushi2008 9:86dd65b94dca 82 kstatus = 1;
kazushi2008 9:86dd65b94dca 83 } else if(estate && !c=='u'){
kazushi2008 9:86dd65b94dca 84 drawc(c);
kazushi2008 9:86dd65b94dca 85 kstatus = 0;
kazushi2008 9:86dd65b94dca 86 estate = false;
kazushi2008 9:86dd65b94dca 87 } else if(c=='\\'){ // escape code
kazushi2008 9:86dd65b94dca 88 estate = true;
kazushi2008 9:86dd65b94dca 89 } else { // 4x8font
kazushi2008 9:86dd65b94dca 90 codes[i] = c;
kazushi2008 9:86dd65b94dca 91 i++;
kazushi2008 9:86dd65b94dca 92 if(c=='!') emergency = true;
kazushi2008 9:86dd65b94dca 93 }
kazushi2008 1:6b495e0f3b0c 94 }
kazushi2008 9:86dd65b94dca 95
kazushi2008 9:86dd65b94dca 96 codes[i]= '\0';
kazushi2008 1:6b495e0f3b0c 97 }
kazushi2008 1:6b495e0f3b0c 98
kazushi2008 2:56a2ab00e743 99 void drawString(const unsigned char *s){
kazushi2008 1:6b495e0f3b0c 100 unsigned char c;
kazushi2008 9:86dd65b94dca 101 while((c = *s++) != '\0') drawc(c);
kazushi2008 2:56a2ab00e743 102 }
kazushi2008 2:56a2ab00e743 103
kazushi2008 2:56a2ab00e743 104 int connect(){
kazushi2008 2:56a2ab00e743 105 IpAddr ipaddr, netmask, gateway, nameserver;
kazushi2008 2:56a2ab00e743 106
kazushi2008 6:5aa67ed9ae43 107 //gs.command("AT&F", GSRES_NORMAL);
kazushi2008 6:5aa67ed9ae43 108
kazushi2008 6:5aa67ed9ae43 109 if (gs.connect(SECURE, SSID, PASS, 1, 5)) {
kazushi2008 2:56a2ab00e743 110 drawString("WiFi connection error"); newline();
kazushi2008 2:56a2ab00e743 111 #ifdef _DEBUG
kazushi2008 2:56a2ab00e743 112 pc.printf("WiFi connection error\r\n");
kazushi2008 2:56a2ab00e743 113 #endif
kazushi2008 2:56a2ab00e743 114 return -1;
kazushi2008 2:56a2ab00e743 115 }
kazushi2008 2:56a2ab00e743 116
kazushi2008 2:56a2ab00e743 117 gs.getAddress(ipaddr, netmask, gateway, nameserver);
kazushi2008 2:56a2ab00e743 118 if(nameserver.isNull()) {
kazushi2008 2:56a2ab00e743 119 nameserver = IpAddr(192,168,1,1);
kazushi2008 2:56a2ab00e743 120 gs.setAddress(ipaddr, netmask, gateway, nameserver);
kazushi2008 2:56a2ab00e743 121 gs.getAddress(ipaddr, netmask, gateway, nameserver);
kazushi2008 2:56a2ab00e743 122 }
kazushi2008 2:56a2ab00e743 123 #ifdef _DEBUG
kazushi2008 2:56a2ab00e743 124 pc.printf("ip %d.%d.%d.%d\r\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
kazushi2008 2:56a2ab00e743 125 pc.printf("gw %d.%d.%d.%d\r\n", gateway[0], gateway[1], gateway[2], gateway[3]);
kazushi2008 2:56a2ab00e743 126 pc.printf("ns %d.%d.%d.%d\r\n", nameserver[0], nameserver[1], nameserver[2], nameserver[3]);
kazushi2008 2:56a2ab00e743 127 #endif
kazushi2008 2:56a2ab00e743 128 char localip[20];
kazushi2008 2:56a2ab00e743 129 sprintf(localip, "ip %d.%d.%d.%d", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
kazushi2008 2:56a2ab00e743 130 drawString((unsigned char*)localip); newline();
kazushi2008 2:56a2ab00e743 131 sprintf(localip, "gw %d.%d.%d.%d", gateway[0], gateway[1], gateway[2], gateway[3]);
kazushi2008 2:56a2ab00e743 132 drawString((unsigned char*)localip); newline();
kazushi2008 2:56a2ab00e743 133 sprintf(localip, "ns %d.%d.%d.%d", nameserver[0], nameserver[1], nameserver[2], nameserver[3]);
kazushi2008 2:56a2ab00e743 134 drawString((unsigned char*)localip); newline();
kazushi2008 2:56a2ab00e743 135
kazushi2008 2:56a2ab00e743 136 delete [] localip;
kazushi2008 3:cce58539833e 137
kazushi2008 3:cce58539833e 138 return 0;
kazushi2008 1:6b495e0f3b0c 139 }
kazushi2008 1:6b495e0f3b0c 140
kazushi2008 1:6b495e0f3b0c 141 void onGsReceive (int cid, int len) {
kazushi2008 1:6b495e0f3b0c 142 int i;
kazushi2008 1:6b495e0f3b0c 143 char buf[GS_DATA_SIZE + 1];
kazushi2008 1:6b495e0f3b0c 144
kazushi2008 1:6b495e0f3b0c 145 led2 = 1;
kazushi2008 1:6b495e0f3b0c 146 i = gs.recv(cid, buf, len);
kazushi2008 1:6b495e0f3b0c 147 buf[i] = 0;
kazushi2008 1:6b495e0f3b0c 148
kazushi2008 1:6b495e0f3b0c 149 // parse buffer
kazushi2008 1:6b495e0f3b0c 150 char* c = strtok(buf, "\r\n");
kazushi2008 1:6b495e0f3b0c 151 if(strcmp(c, "200 OK")==0){
kazushi2008 1:6b495e0f3b0c 152 while(c!=NULL){
kazushi2008 1:6b495e0f3b0c 153 c = strtok(NULL, "\"");
kazushi2008 1:6b495e0f3b0c 154 char key[4];
kazushi2008 1:6b495e0f3b0c 155 sprintf(key, "%.4s", c);
kazushi2008 1:6b495e0f3b0c 156 if(strcmp(key, "text")==0){
kazushi2008 1:6b495e0f3b0c 157 c = strtok(NULL, "\"");
kazushi2008 1:6b495e0f3b0c 158 c = strtok(NULL, "\"");
kazushi2008 1:6b495e0f3b0c 159 #ifdef _DEBUG
kazushi2008 1:6b495e0f3b0c 160 pc.printf("%s\r\n", c);
kazushi2008 1:6b495e0f3b0c 161 #endif
kazushi2008 9:86dd65b94dca 162 //c = strtok(c, "@");
kazushi2008 9:86dd65b94dca 163 parseCode((unsigned char*)c);
kazushi2008 9:86dd65b94dca 164 if(emergency) color(0xf800); else color(0x001f);
kazushi2008 2:56a2ab00e743 165 cls();
kazushi2008 2:56a2ab00e743 166 color(0xffff);
kazushi2008 9:86dd65b94dca 167 drawString(codes); newline();
kazushi2008 2:56a2ab00e743 168 //c = strtok(NULL, "@");
kazushi2008 2:56a2ab00e743 169 //drawString((unsigned char*)c); newline();
kazushi2008 1:6b495e0f3b0c 170 break;
kazushi2008 1:6b495e0f3b0c 171 }
kazushi2008 1:6b495e0f3b0c 172 }
kazushi2008 1:6b495e0f3b0c 173 }
kazushi2008 1:6b495e0f3b0c 174
kazushi2008 1:6b495e0f3b0c 175 led2 = 0;
kazushi2008 2:56a2ab00e743 176
kazushi2008 9:86dd65b94dca 177 delete [] buf;
kazushi2008 1:6b495e0f3b0c 178 }
kazushi2008 1:6b495e0f3b0c 179
kazushi2008 1:6b495e0f3b0c 180 int main() {
kazushi2008 1:6b495e0f3b0c 181 int r;
kazushi2008 2:56a2ab00e743 182 char* msg;
kazushi2008 1:6b495e0f3b0c 183 Host host;
kazushi2008 6:5aa67ed9ae43 184 led1 = 0;
kazushi2008 6:5aa67ed9ae43 185
kazushi2008 6:5aa67ed9ae43 186 PHY_PowerDown();
kazushi2008 6:5aa67ed9ae43 187 Peripheral_PowerDown(0x7D7F6FE1);
kazushi2008 6:5aa67ed9ae43 188 gs.setBaud(115200);
kazushi2008 1:6b495e0f3b0c 189 #ifdef _DEBUG
kazushi2008 1:6b495e0f3b0c 190 pc.baud(115200);
kazushi2008 1:6b495e0f3b0c 191 #endif
kazushi2008 1:6b495e0f3b0c 192
kazushi2008 2:56a2ab00e743 193 s_Lcdinit();
kazushi2008 2:56a2ab00e743 194
kazushi2008 2:56a2ab00e743 195 color(0x001f);
kazushi2008 2:56a2ab00e743 196 cls();
kazushi2008 2:56a2ab00e743 197 color(0xffff);
kazushi2008 2:56a2ab00e743 198
kazushi2008 1:6b495e0f3b0c 199 msg = "connect";
kazushi2008 2:56a2ab00e743 200 drawString((unsigned char*)msg); newline();
kazushi2008 2:56a2ab00e743 201 r = connect();
kazushi2008 2:56a2ab00e743 202 if(r<0){
kazushi2008 6:5aa67ed9ae43 203 NVIC_SystemReset();
kazushi2008 1:6b495e0f3b0c 204 }
kazushi2008 1:6b495e0f3b0c 205
kazushi2008 1:6b495e0f3b0c 206 msg = "start twitter";
kazushi2008 2:56a2ab00e743 207 drawString((unsigned char*)msg); newline();
kazushi2008 1:6b495e0f3b0c 208
kazushi2008 1:6b495e0f3b0c 209 host.setName(HTTP_HOST);
kazushi2008 2:56a2ab00e743 210
kazushi2008 3:cce58539833e 211 while(1) {
kazushi2008 2:56a2ab00e743 212 led1 = !led1; wait_ms(500); led1 = !led1; // blink
kazushi2008 1:6b495e0f3b0c 213
kazushi2008 1:6b495e0f3b0c 214 r = gs.httpGet(host, HTTP_URI, HTTP_USER, HTTP_PASS, 0, &onGsReceive);
kazushi2008 3:cce58539833e 215 gs.poll();
kazushi2008 2:56a2ab00e743 216 if (!gs.isConnected(r)) {
kazushi2008 2:56a2ab00e743 217 color(0x001f);
kazushi2008 2:56a2ab00e743 218 cls();
kazushi2008 2:56a2ab00e743 219 msg = "reconnect";
kazushi2008 2:56a2ab00e743 220 drawString((unsigned char*)msg); newline();
kazushi2008 3:cce58539833e 221 wait_ms(5);
kazushi2008 6:5aa67ed9ae43 222 r = gs.disconnect();
kazushi2008 6:5aa67ed9ae43 223 r = connect();
kazushi2008 2:56a2ab00e743 224 }
kazushi2008 1:6b495e0f3b0c 225
kazushi2008 1:6b495e0f3b0c 226 wait(INTERVAL_SEC);
kazushi2008 3:cce58539833e 227 }
kazushi2008 6:5aa67ed9ae43 228
kazushi2008 1:6b495e0f3b0c 229 }