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@6:5aa67ed9ae43, 2013-02-10 (annotated)
- Committer:
- kazushi2008
- Date:
- Sun Feb 10 06:02:51 2013 +0000
- Revision:
- 6:5aa67ed9ae43
- Parent:
- 4:d7a5f6fe7987
- Child:
- 8:22eb078985b1
fix a bug overloading electric current
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 | 6:5aa67ed9ae43 | 17 | #define SSID "mima-lab" |
kazushi2008 | 6:5aa67ed9ae43 | 18 | #define PASS "ikaika5656" |
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 | 6:5aa67ed9ae43 | 23 | #define HTTP_USER "pla3c" |
kazushi2008 | 6:5aa67ed9ae43 | 24 | #define HTTP_PASS "pla3c" |
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 | 1:6b495e0f3b0c | 38 | |
kazushi2008 | 1:6b495e0f3b0c | 39 | unsigned short convert(unsigned short utf){ |
kazushi2008 | 1:6b495e0f3b0c | 40 | unsigned short sjis = NULL; |
kazushi2008 | 1:6b495e0f3b0c | 41 | for(int i=0; i<countof(sjis2utf16)/2; i++){ |
kazushi2008 | 1:6b495e0f3b0c | 42 | if(utf==sjis2utf16[i*2+1]){ |
kazushi2008 | 1:6b495e0f3b0c | 43 | sjis = sjis2utf16[i*2]; |
kazushi2008 | 1:6b495e0f3b0c | 44 | break; |
kazushi2008 | 1:6b495e0f3b0c | 45 | } |
kazushi2008 | 1:6b495e0f3b0c | 46 | } |
kazushi2008 | 1:6b495e0f3b0c | 47 | return sjis; |
kazushi2008 | 1:6b495e0f3b0c | 48 | } |
kazushi2008 | 1:6b495e0f3b0c | 49 | |
kazushi2008 | 2:56a2ab00e743 | 50 | void drawChar(unsigned char c){ |
kazushi2008 | 2:56a2ab00e743 | 51 | if(estate && kstatus==4){ // 1st digit of utf-16 |
kazushi2008 | 2:56a2ab00e743 | 52 | unibuf[3] = c; |
kazushi2008 | 1:6b495e0f3b0c | 53 | char *endptr; |
kazushi2008 | 2:56a2ab00e743 | 54 | unsigned short code = convert(strtol((char*)unibuf, &endptr, 16)); |
kazushi2008 | 2:56a2ab00e743 | 55 | //kanji_init(); |
kazushi2008 | 2:56a2ab00e743 | 56 | color(0xffff); |
kazushi2008 | 2:56a2ab00e743 | 57 | k_puts(code); |
kazushi2008 | 2:56a2ab00e743 | 58 | //kanji_end(); |
kazushi2008 | 1:6b495e0f3b0c | 59 | #ifdef _DEBUG |
kazushi2008 | 2:56a2ab00e743 | 60 | pc.printf("%s, %x\r\n", unibuf, code); |
kazushi2008 | 1:6b495e0f3b0c | 61 | #endif |
kazushi2008 | 2:56a2ab00e743 | 62 | kstatus = 0; |
kazushi2008 | 1:6b495e0f3b0c | 63 | estate = false; |
kazushi2008 | 2:56a2ab00e743 | 64 | } else if(estate && kstatus==3){ // 2nd digit of utf-16 |
kazushi2008 | 2:56a2ab00e743 | 65 | unibuf[2] = c; |
kazushi2008 | 2:56a2ab00e743 | 66 | kstatus = 4; |
kazushi2008 | 2:56a2ab00e743 | 67 | } else if(estate && kstatus==2){ // 3rd digit of utf-16 |
kazushi2008 | 2:56a2ab00e743 | 68 | unibuf[1] = c; |
kazushi2008 | 2:56a2ab00e743 | 69 | kstatus = 3; |
kazushi2008 | 2:56a2ab00e743 | 70 | } else if(estate && kstatus==1){ // 4th digit of utf-16 |
kazushi2008 | 2:56a2ab00e743 | 71 | unibuf[0] = c; |
kazushi2008 | 2:56a2ab00e743 | 72 | kstatus = 2; |
kazushi2008 | 2:56a2ab00e743 | 73 | } else if(estate && c=='u'){ |
kazushi2008 | 2:56a2ab00e743 | 74 | kstatus = 1; |
kazushi2008 | 2:56a2ab00e743 | 75 | } else if(estate && !c=='u'){ |
kazushi2008 | 2:56a2ab00e743 | 76 | drawc(c); |
kazushi2008 | 2:56a2ab00e743 | 77 | kstatus = 0; |
kazushi2008 | 1:6b495e0f3b0c | 78 | estate = false; |
kazushi2008 | 1:6b495e0f3b0c | 79 | } else if(c=='\\'){ // escape code |
kazushi2008 | 1:6b495e0f3b0c | 80 | estate = true; |
kazushi2008 | 1:6b495e0f3b0c | 81 | } else { // 4x8font |
kazushi2008 | 2:56a2ab00e743 | 82 | drawc(c); |
kazushi2008 | 1:6b495e0f3b0c | 83 | } |
kazushi2008 | 1:6b495e0f3b0c | 84 | } |
kazushi2008 | 1:6b495e0f3b0c | 85 | |
kazushi2008 | 2:56a2ab00e743 | 86 | void drawString(const unsigned char *s){ |
kazushi2008 | 1:6b495e0f3b0c | 87 | unsigned char c; |
kazushi2008 | 2:56a2ab00e743 | 88 | while((c = *s++) != '\0') drawChar(c); |
kazushi2008 | 2:56a2ab00e743 | 89 | } |
kazushi2008 | 2:56a2ab00e743 | 90 | |
kazushi2008 | 2:56a2ab00e743 | 91 | int connect(){ |
kazushi2008 | 2:56a2ab00e743 | 92 | IpAddr ipaddr, netmask, gateway, nameserver; |
kazushi2008 | 2:56a2ab00e743 | 93 | |
kazushi2008 | 6:5aa67ed9ae43 | 94 | //gs.command("AT&F", GSRES_NORMAL); |
kazushi2008 | 6:5aa67ed9ae43 | 95 | |
kazushi2008 | 6:5aa67ed9ae43 | 96 | if (gs.connect(SECURE, SSID, PASS, 1, 5)) { |
kazushi2008 | 2:56a2ab00e743 | 97 | drawString("WiFi connection error"); newline(); |
kazushi2008 | 2:56a2ab00e743 | 98 | #ifdef _DEBUG |
kazushi2008 | 2:56a2ab00e743 | 99 | pc.printf("WiFi connection error\r\n"); |
kazushi2008 | 2:56a2ab00e743 | 100 | #endif |
kazushi2008 | 2:56a2ab00e743 | 101 | return -1; |
kazushi2008 | 2:56a2ab00e743 | 102 | } |
kazushi2008 | 2:56a2ab00e743 | 103 | |
kazushi2008 | 2:56a2ab00e743 | 104 | gs.getAddress(ipaddr, netmask, gateway, nameserver); |
kazushi2008 | 2:56a2ab00e743 | 105 | if(nameserver.isNull()) { |
kazushi2008 | 2:56a2ab00e743 | 106 | nameserver = IpAddr(192,168,1,1); |
kazushi2008 | 2:56a2ab00e743 | 107 | gs.setAddress(ipaddr, netmask, gateway, nameserver); |
kazushi2008 | 2:56a2ab00e743 | 108 | gs.getAddress(ipaddr, netmask, gateway, nameserver); |
kazushi2008 | 2:56a2ab00e743 | 109 | } |
kazushi2008 | 2:56a2ab00e743 | 110 | #ifdef _DEBUG |
kazushi2008 | 2:56a2ab00e743 | 111 | pc.printf("ip %d.%d.%d.%d\r\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); |
kazushi2008 | 2:56a2ab00e743 | 112 | pc.printf("gw %d.%d.%d.%d\r\n", gateway[0], gateway[1], gateway[2], gateway[3]); |
kazushi2008 | 2:56a2ab00e743 | 113 | pc.printf("ns %d.%d.%d.%d\r\n", nameserver[0], nameserver[1], nameserver[2], nameserver[3]); |
kazushi2008 | 2:56a2ab00e743 | 114 | #endif |
kazushi2008 | 2:56a2ab00e743 | 115 | char localip[20]; |
kazushi2008 | 2:56a2ab00e743 | 116 | sprintf(localip, "ip %d.%d.%d.%d", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]); |
kazushi2008 | 2:56a2ab00e743 | 117 | drawString((unsigned char*)localip); newline(); |
kazushi2008 | 2:56a2ab00e743 | 118 | sprintf(localip, "gw %d.%d.%d.%d", gateway[0], gateway[1], gateway[2], gateway[3]); |
kazushi2008 | 2:56a2ab00e743 | 119 | drawString((unsigned char*)localip); newline(); |
kazushi2008 | 2:56a2ab00e743 | 120 | sprintf(localip, "ns %d.%d.%d.%d", nameserver[0], nameserver[1], nameserver[2], nameserver[3]); |
kazushi2008 | 2:56a2ab00e743 | 121 | drawString((unsigned char*)localip); newline(); |
kazushi2008 | 2:56a2ab00e743 | 122 | |
kazushi2008 | 2:56a2ab00e743 | 123 | delete [] localip; |
kazushi2008 | 3:cce58539833e | 124 | |
kazushi2008 | 3:cce58539833e | 125 | return 0; |
kazushi2008 | 1:6b495e0f3b0c | 126 | } |
kazushi2008 | 1:6b495e0f3b0c | 127 | |
kazushi2008 | 1:6b495e0f3b0c | 128 | void onGsReceive (int cid, int len) { |
kazushi2008 | 1:6b495e0f3b0c | 129 | int i; |
kazushi2008 | 1:6b495e0f3b0c | 130 | char buf[GS_DATA_SIZE + 1]; |
kazushi2008 | 1:6b495e0f3b0c | 131 | |
kazushi2008 | 1:6b495e0f3b0c | 132 | led2 = 1; |
kazushi2008 | 1:6b495e0f3b0c | 133 | i = gs.recv(cid, buf, len); |
kazushi2008 | 1:6b495e0f3b0c | 134 | buf[i] = 0; |
kazushi2008 | 1:6b495e0f3b0c | 135 | |
kazushi2008 | 1:6b495e0f3b0c | 136 | // parse buffer |
kazushi2008 | 1:6b495e0f3b0c | 137 | char* c = strtok(buf, "\r\n"); |
kazushi2008 | 1:6b495e0f3b0c | 138 | if(strcmp(c, "200 OK")==0){ |
kazushi2008 | 1:6b495e0f3b0c | 139 | while(c!=NULL){ |
kazushi2008 | 1:6b495e0f3b0c | 140 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 141 | char key[4]; |
kazushi2008 | 1:6b495e0f3b0c | 142 | sprintf(key, "%.4s", c); |
kazushi2008 | 1:6b495e0f3b0c | 143 | if(strcmp(key, "text")==0){ |
kazushi2008 | 1:6b495e0f3b0c | 144 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 145 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 146 | #ifdef _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 147 | pc.printf("%s\r\n", c); |
kazushi2008 | 1:6b495e0f3b0c | 148 | #endif |
kazushi2008 | 2:56a2ab00e743 | 149 | color(0x001f); |
kazushi2008 | 2:56a2ab00e743 | 150 | cls(); |
kazushi2008 | 2:56a2ab00e743 | 151 | color(0xffff); |
kazushi2008 | 2:56a2ab00e743 | 152 | //c = strtok(c, "@"); |
kazushi2008 | 2:56a2ab00e743 | 153 | drawString((unsigned char*)c); newline(); |
kazushi2008 | 2:56a2ab00e743 | 154 | //c = strtok(NULL, "@"); |
kazushi2008 | 2:56a2ab00e743 | 155 | //drawString((unsigned char*)c); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 156 | break; |
kazushi2008 | 1:6b495e0f3b0c | 157 | } |
kazushi2008 | 1:6b495e0f3b0c | 158 | } |
kazushi2008 | 1:6b495e0f3b0c | 159 | } |
kazushi2008 | 1:6b495e0f3b0c | 160 | |
kazushi2008 | 1:6b495e0f3b0c | 161 | led2 = 0; |
kazushi2008 | 2:56a2ab00e743 | 162 | |
kazushi2008 | 3:cce58539833e | 163 | //delete [] buf; |
kazushi2008 | 1:6b495e0f3b0c | 164 | } |
kazushi2008 | 1:6b495e0f3b0c | 165 | |
kazushi2008 | 1:6b495e0f3b0c | 166 | int main() { |
kazushi2008 | 1:6b495e0f3b0c | 167 | int r; |
kazushi2008 | 2:56a2ab00e743 | 168 | char* msg; |
kazushi2008 | 1:6b495e0f3b0c | 169 | Host host; |
kazushi2008 | 6:5aa67ed9ae43 | 170 | led1 = 0; |
kazushi2008 | 6:5aa67ed9ae43 | 171 | |
kazushi2008 | 6:5aa67ed9ae43 | 172 | PHY_PowerDown(); |
kazushi2008 | 6:5aa67ed9ae43 | 173 | Peripheral_PowerDown(0x7D7F6FE1); |
kazushi2008 | 6:5aa67ed9ae43 | 174 | gs.setBaud(115200); |
kazushi2008 | 1:6b495e0f3b0c | 175 | #ifdef _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 176 | pc.baud(115200); |
kazushi2008 | 1:6b495e0f3b0c | 177 | #endif |
kazushi2008 | 1:6b495e0f3b0c | 178 | |
kazushi2008 | 2:56a2ab00e743 | 179 | s_Lcdinit(); |
kazushi2008 | 2:56a2ab00e743 | 180 | |
kazushi2008 | 2:56a2ab00e743 | 181 | color(0x001f); |
kazushi2008 | 2:56a2ab00e743 | 182 | cls(); |
kazushi2008 | 2:56a2ab00e743 | 183 | color(0xffff); |
kazushi2008 | 2:56a2ab00e743 | 184 | |
kazushi2008 | 1:6b495e0f3b0c | 185 | msg = "connect"; |
kazushi2008 | 2:56a2ab00e743 | 186 | drawString((unsigned char*)msg); newline(); |
kazushi2008 | 2:56a2ab00e743 | 187 | r = connect(); |
kazushi2008 | 2:56a2ab00e743 | 188 | if(r<0){ |
kazushi2008 | 6:5aa67ed9ae43 | 189 | NVIC_SystemReset(); |
kazushi2008 | 1:6b495e0f3b0c | 190 | } |
kazushi2008 | 1:6b495e0f3b0c | 191 | |
kazushi2008 | 1:6b495e0f3b0c | 192 | msg = "start twitter"; |
kazushi2008 | 2:56a2ab00e743 | 193 | drawString((unsigned char*)msg); newline(); |
kazushi2008 | 1:6b495e0f3b0c | 194 | |
kazushi2008 | 1:6b495e0f3b0c | 195 | host.setName(HTTP_HOST); |
kazushi2008 | 2:56a2ab00e743 | 196 | |
kazushi2008 | 3:cce58539833e | 197 | while(1) { |
kazushi2008 | 2:56a2ab00e743 | 198 | led1 = !led1; wait_ms(500); led1 = !led1; // blink |
kazushi2008 | 1:6b495e0f3b0c | 199 | |
kazushi2008 | 1:6b495e0f3b0c | 200 | r = gs.httpGet(host, HTTP_URI, HTTP_USER, HTTP_PASS, 0, &onGsReceive); |
kazushi2008 | 3:cce58539833e | 201 | gs.poll(); |
kazushi2008 | 2:56a2ab00e743 | 202 | if (!gs.isConnected(r)) { |
kazushi2008 | 2:56a2ab00e743 | 203 | color(0x001f); |
kazushi2008 | 2:56a2ab00e743 | 204 | cls(); |
kazushi2008 | 2:56a2ab00e743 | 205 | msg = "reconnect"; |
kazushi2008 | 2:56a2ab00e743 | 206 | drawString((unsigned char*)msg); newline(); |
kazushi2008 | 3:cce58539833e | 207 | wait_ms(5); |
kazushi2008 | 6:5aa67ed9ae43 | 208 | r = gs.disconnect(); |
kazushi2008 | 6:5aa67ed9ae43 | 209 | r = connect(); |
kazushi2008 | 2:56a2ab00e743 | 210 | } |
kazushi2008 | 1:6b495e0f3b0c | 211 | |
kazushi2008 | 1:6b495e0f3b0c | 212 | wait(INTERVAL_SEC); |
kazushi2008 | 3:cce58539833e | 213 | } |
kazushi2008 | 6:5aa67ed9ae43 | 214 | |
kazushi2008 | 1:6b495e0f3b0c | 215 | } |