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@9:86dd65b94dca, 2013-02-25 (annotated)
- 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?
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 | 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 | } |