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@10:94f45d37174f, 2013-04-28 (annotated)
- Committer:
- kazushi2008
- Date:
- Sun Apr 28 10:05:28 2013 +0000
- Revision:
- 10:94f45d37174f
- Parent:
- 9:86dd65b94dca
major change from Gainspan to WiFly
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kazushi2008 | 10:94f45d37174f | 1 | // Twitter Mbed with WiFly RN-XV |
kazushi2008 | 1:6b495e0f3b0c | 2 | // |
kazushi2008 | 1:6b495e0f3b0c | 3 | // coded by Kazushi Mukaiyama (http://www.kazushi.info/) |
kazushi2008 | 10:94f45d37174f | 4 | // refer to cookbook of WiFly(https://mbed.org/cookbook/wifly) |
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 | 10:94f45d37174f | 10 | #include "WiflyInterface.h" |
kazushi2008 | 10:94f45d37174f | 11 | #include "HTTPClient.h" |
kazushi2008 | 1:6b495e0f3b0c | 12 | #include "sjis_utf16.h" |
kazushi2008 | 2:56a2ab00e743 | 13 | #include "s_Lcd.h" |
kazushi2008 | 1:6b495e0f3b0c | 14 | |
kazushi2008 | 1:6b495e0f3b0c | 15 | #define countof(x) ( sizeof(x) / sizeof(x[0]) ) |
kazushi2008 | 1:6b495e0f3b0c | 16 | |
kazushi2008 | 10:94f45d37174f | 17 | #define SSID "your_ssid" |
kazushi2008 | 10:94f45d37174f | 18 | #define PASS "your_pass" |
kazushi2008 | 1:6b495e0f3b0c | 19 | |
kazushi2008 | 10:94f45d37174f | 20 | #define HTTP_URI "http://api.supertweet.net/1.1/statuses/user_timeline.json?screen_name=pla3c&count=1" |
kazushi2008 | 10:94f45d37174f | 21 | #define HTTP_USER "your_id" |
kazushi2008 | 10:94f45d37174f | 22 | #define HTTP_PASS "your_pass" |
kazushi2008 | 10:94f45d37174f | 23 | |
kazushi2008 | 10:94f45d37174f | 24 | #define INTERVAL_SEC 90.0 |
kazushi2008 | 1:6b495e0f3b0c | 25 | |
kazushi2008 | 1:6b495e0f3b0c | 26 | //#define _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 27 | |
kazushi2008 | 10:94f45d37174f | 28 | WiflyInterface wifly(p13, p14, p15, p16, SSID, PASS, WPA); // TX, RX, reset, connection_status |
kazushi2008 | 10:94f45d37174f | 29 | HTTPClient http; |
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 | 10:94f45d37174f | 35 | char buf[512]; |
kazushi2008 | 10:94f45d37174f | 36 | |
kazushi2008 | 2:56a2ab00e743 | 37 | unsigned char kstatus = 0; |
kazushi2008 | 1:6b495e0f3b0c | 38 | bool estate = false; |
kazushi2008 | 2:56a2ab00e743 | 39 | unsigned char unibuf[4]; |
kazushi2008 | 9:86dd65b94dca | 40 | unsigned char codes[512]; |
kazushi2008 | 1:6b495e0f3b0c | 41 | |
kazushi2008 | 1:6b495e0f3b0c | 42 | unsigned short convert(unsigned short utf){ |
kazushi2008 | 1:6b495e0f3b0c | 43 | unsigned short sjis = NULL; |
kazushi2008 | 1:6b495e0f3b0c | 44 | for(int i=0; i<countof(sjis2utf16)/2; i++){ |
kazushi2008 | 1:6b495e0f3b0c | 45 | if(utf==sjis2utf16[i*2+1]){ |
kazushi2008 | 1:6b495e0f3b0c | 46 | sjis = sjis2utf16[i*2]; |
kazushi2008 | 1:6b495e0f3b0c | 47 | break; |
kazushi2008 | 1:6b495e0f3b0c | 48 | } |
kazushi2008 | 1:6b495e0f3b0c | 49 | } |
kazushi2008 | 1:6b495e0f3b0c | 50 | return sjis; |
kazushi2008 | 1:6b495e0f3b0c | 51 | } |
kazushi2008 | 1:6b495e0f3b0c | 52 | |
kazushi2008 | 10:94f45d37174f | 53 | bool parseCode(const unsigned char* s){ |
kazushi2008 | 9:86dd65b94dca | 54 | unsigned int i = 0; |
kazushi2008 | 9:86dd65b94dca | 55 | unsigned char c; |
kazushi2008 | 9:86dd65b94dca | 56 | |
kazushi2008 | 10:94f45d37174f | 57 | bool em = false; |
kazushi2008 | 9:86dd65b94dca | 58 | while((c = *s++) != '\0') { |
kazushi2008 | 9:86dd65b94dca | 59 | if(estate && kstatus==4){ // 1st digit of utf-16 |
kazushi2008 | 9:86dd65b94dca | 60 | unibuf[3] = c; |
kazushi2008 | 9:86dd65b94dca | 61 | char *endptr; |
kazushi2008 | 9:86dd65b94dca | 62 | unsigned short code = convert(strtol((char*)unibuf, &endptr, 16)); |
kazushi2008 | 9:86dd65b94dca | 63 | codes[i] = code>>8 & 0xFF; |
kazushi2008 | 9:86dd65b94dca | 64 | i++; |
kazushi2008 | 9:86dd65b94dca | 65 | codes[i] = code & 0xFF; |
kazushi2008 | 9:86dd65b94dca | 66 | i++; |
kazushi2008 | 10:94f45d37174f | 67 | if(code==0x8149) em = true; |
kazushi2008 | 9:86dd65b94dca | 68 | #ifdef _DEBUG |
kazushi2008 | 9:86dd65b94dca | 69 | pc.printf("%s, %x\r\n", unibuf, code); |
kazushi2008 | 9:86dd65b94dca | 70 | #endif |
kazushi2008 | 9:86dd65b94dca | 71 | kstatus = 0; |
kazushi2008 | 9:86dd65b94dca | 72 | estate = false; |
kazushi2008 | 9:86dd65b94dca | 73 | } else if(estate && kstatus==3){ // 2nd digit of utf-16 |
kazushi2008 | 9:86dd65b94dca | 74 | unibuf[2] = c; |
kazushi2008 | 9:86dd65b94dca | 75 | kstatus = 4; |
kazushi2008 | 9:86dd65b94dca | 76 | } else if(estate && kstatus==2){ // 3rd digit of utf-16 |
kazushi2008 | 9:86dd65b94dca | 77 | unibuf[1] = c; |
kazushi2008 | 9:86dd65b94dca | 78 | kstatus = 3; |
kazushi2008 | 9:86dd65b94dca | 79 | } else if(estate && kstatus==1){ // 4th digit of utf-16 |
kazushi2008 | 9:86dd65b94dca | 80 | unibuf[0] = c; |
kazushi2008 | 9:86dd65b94dca | 81 | kstatus = 2; |
kazushi2008 | 9:86dd65b94dca | 82 | } else if(estate && c=='u'){ |
kazushi2008 | 9:86dd65b94dca | 83 | kstatus = 1; |
kazushi2008 | 9:86dd65b94dca | 84 | } else if(estate && !c=='u'){ |
kazushi2008 | 9:86dd65b94dca | 85 | drawc(c); |
kazushi2008 | 9:86dd65b94dca | 86 | kstatus = 0; |
kazushi2008 | 9:86dd65b94dca | 87 | estate = false; |
kazushi2008 | 9:86dd65b94dca | 88 | } else if(c=='\\'){ // escape code |
kazushi2008 | 9:86dd65b94dca | 89 | estate = true; |
kazushi2008 | 9:86dd65b94dca | 90 | } else { // 4x8font |
kazushi2008 | 9:86dd65b94dca | 91 | codes[i] = c; |
kazushi2008 | 9:86dd65b94dca | 92 | i++; |
kazushi2008 | 10:94f45d37174f | 93 | if(c=='!') em = true; |
kazushi2008 | 9:86dd65b94dca | 94 | } |
kazushi2008 | 1:6b495e0f3b0c | 95 | } |
kazushi2008 | 9:86dd65b94dca | 96 | |
kazushi2008 | 9:86dd65b94dca | 97 | codes[i]= '\0'; |
kazushi2008 | 10:94f45d37174f | 98 | |
kazushi2008 | 10:94f45d37174f | 99 | return em; |
kazushi2008 | 1:6b495e0f3b0c | 100 | } |
kazushi2008 | 1:6b495e0f3b0c | 101 | |
kazushi2008 | 2:56a2ab00e743 | 102 | void drawString(const unsigned char *s){ |
kazushi2008 | 1:6b495e0f3b0c | 103 | unsigned char c; |
kazushi2008 | 9:86dd65b94dca | 104 | while((c = *s++) != '\0') drawc(c); |
kazushi2008 | 2:56a2ab00e743 | 105 | } |
kazushi2008 | 2:56a2ab00e743 | 106 | |
kazushi2008 | 2:56a2ab00e743 | 107 | int connect(){ |
kazushi2008 | 10:94f45d37174f | 108 | char localip[20]; |
kazushi2008 | 6:5aa67ed9ae43 | 109 | |
kazushi2008 | 10:94f45d37174f | 110 | wifly.init(); //Use DHCP |
kazushi2008 | 10:94f45d37174f | 111 | while (!wifly.connect()); |
kazushi2008 | 2:56a2ab00e743 | 112 | |
kazushi2008 | 2:56a2ab00e743 | 113 | #ifdef _DEBUG |
kazushi2008 | 10:94f45d37174f | 114 | pc.printf("ip %s\r\n", wifly.getIPAddress()); |
kazushi2008 | 2:56a2ab00e743 | 115 | #endif |
kazushi2008 | 10:94f45d37174f | 116 | |
kazushi2008 | 10:94f45d37174f | 117 | sprintf(localip, "ip %s", wifly.getIPAddress()); |
kazushi2008 | 2:56a2ab00e743 | 118 | drawString((unsigned char*)localip); newline(); |
kazushi2008 | 10:94f45d37174f | 119 | |
kazushi2008 | 3:cce58539833e | 120 | return 0; |
kazushi2008 | 1:6b495e0f3b0c | 121 | } |
kazushi2008 | 1:6b495e0f3b0c | 122 | |
kazushi2008 | 10:94f45d37174f | 123 | void parseBuffer () { |
kazushi2008 | 1:6b495e0f3b0c | 124 | led2 = 1; |
kazushi2008 | 1:6b495e0f3b0c | 125 | |
kazushi2008 | 1:6b495e0f3b0c | 126 | // parse buffer |
kazushi2008 | 10:94f45d37174f | 127 | char* c = strtok(buf, "\""); |
kazushi2008 | 10:94f45d37174f | 128 | while(c!=NULL){ |
kazushi2008 | 10:94f45d37174f | 129 | char* c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 130 | char key[4]; |
kazushi2008 | 1:6b495e0f3b0c | 131 | sprintf(key, "%.4s", c); |
kazushi2008 | 1:6b495e0f3b0c | 132 | if(strcmp(key, "text")==0){ |
kazushi2008 | 1:6b495e0f3b0c | 133 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 134 | c = strtok(NULL, "\""); |
kazushi2008 | 1:6b495e0f3b0c | 135 | #ifdef _DEBUG |
kazushi2008 | 1:6b495e0f3b0c | 136 | pc.printf("%s\r\n", c); |
kazushi2008 | 1:6b495e0f3b0c | 137 | #endif |
kazushi2008 | 10:94f45d37174f | 138 | bool emergency = parseCode((unsigned char*)c); |
kazushi2008 | 9:86dd65b94dca | 139 | if(emergency) color(0xf800); else color(0x001f); |
kazushi2008 | 2:56a2ab00e743 | 140 | cls(); |
kazushi2008 | 2:56a2ab00e743 | 141 | color(0xffff); |
kazushi2008 | 9:86dd65b94dca | 142 | drawString(codes); newline(); |
kazushi2008 | 10:94f45d37174f | 143 | if(emergency) bmp(0,80,1); else bmp(0,80,0); // comment out if you don't use on-memory images |
kazushi2008 | 1:6b495e0f3b0c | 144 | break; |
kazushi2008 | 1:6b495e0f3b0c | 145 | } |
kazushi2008 | 1:6b495e0f3b0c | 146 | } |
kazushi2008 | 1:6b495e0f3b0c | 147 | |
kazushi2008 | 1:6b495e0f3b0c | 148 | led2 = 0; |
kazushi2008 | 1:6b495e0f3b0c | 149 | } |
kazushi2008 | 1:6b495e0f3b0c | 150 | |
kazushi2008 | 1:6b495e0f3b0c | 151 | int main() { |
kazushi2008 | 1:6b495e0f3b0c | 152 | int r; |
kazushi2008 | 2:56a2ab00e743 | 153 | char* msg; |
kazushi2008 | 6:5aa67ed9ae43 | 154 | led1 = 0; |
kazushi2008 | 6:5aa67ed9ae43 | 155 | |
kazushi2008 | 6:5aa67ed9ae43 | 156 | PHY_PowerDown(); |
kazushi2008 | 6:5aa67ed9ae43 | 157 | Peripheral_PowerDown(0x7D7F6FE1); |
kazushi2008 | 10:94f45d37174f | 158 | |
kazushi2008 | 1:6b495e0f3b0c | 159 | #ifdef _DEBUG |
kazushi2008 | 10:94f45d37174f | 160 | pc.baud(9600); |
kazushi2008 | 1:6b495e0f3b0c | 161 | #endif |
kazushi2008 | 1:6b495e0f3b0c | 162 | |
kazushi2008 | 2:56a2ab00e743 | 163 | s_Lcdinit(); |
kazushi2008 | 2:56a2ab00e743 | 164 | |
kazushi2008 | 2:56a2ab00e743 | 165 | color(0x001f); |
kazushi2008 | 2:56a2ab00e743 | 166 | cls(); |
kazushi2008 | 2:56a2ab00e743 | 167 | color(0xffff); |
kazushi2008 | 2:56a2ab00e743 | 168 | |
kazushi2008 | 1:6b495e0f3b0c | 169 | msg = "connect"; |
kazushi2008 | 2:56a2ab00e743 | 170 | drawString((unsigned char*)msg); newline(); |
kazushi2008 | 2:56a2ab00e743 | 171 | r = connect(); |
kazushi2008 | 2:56a2ab00e743 | 172 | if(r<0){ |
kazushi2008 | 6:5aa67ed9ae43 | 173 | NVIC_SystemReset(); |
kazushi2008 | 1:6b495e0f3b0c | 174 | } |
kazushi2008 | 1:6b495e0f3b0c | 175 | |
kazushi2008 | 10:94f45d37174f | 176 | wait_ms(1000); |
kazushi2008 | 10:94f45d37174f | 177 | |
kazushi2008 | 1:6b495e0f3b0c | 178 | msg = "start twitter"; |
kazushi2008 | 2:56a2ab00e743 | 179 | drawString((unsigned char*)msg); newline(); |
kazushi2008 | 10:94f45d37174f | 180 | |
kazushi2008 | 10:94f45d37174f | 181 | http.basicAuth(HTTP_USER, HTTP_PASS); |
kazushi2008 | 10:94f45d37174f | 182 | |
kazushi2008 | 10:94f45d37174f | 183 | wait_ms(1000); |
kazushi2008 | 1:6b495e0f3b0c | 184 | |
kazushi2008 | 3:cce58539833e | 185 | while(1) { |
kazushi2008 | 2:56a2ab00e743 | 186 | led1 = !led1; wait_ms(500); led1 = !led1; // blink |
kazushi2008 | 1:6b495e0f3b0c | 187 | |
kazushi2008 | 10:94f45d37174f | 188 | int ret = http.get(HTTP_URI, buf, 351); // out put only 40 zenkaku characters |
kazushi2008 | 10:94f45d37174f | 189 | if(!ret){ |
kazushi2008 | 10:94f45d37174f | 190 | parseBuffer(); |
kazushi2008 | 10:94f45d37174f | 191 | }else{ |
kazushi2008 | 10:94f45d37174f | 192 | sprintf((char*)codes, "Error - ret = %d - HTTP return code = %d", ret, http.getHTTPResponseCode()); |
kazushi2008 | 2:56a2ab00e743 | 193 | color(0x001f); |
kazushi2008 | 2:56a2ab00e743 | 194 | cls(); |
kazushi2008 | 10:94f45d37174f | 195 | color(0xffff); |
kazushi2008 | 10:94f45d37174f | 196 | drawString(codes); newline(); |
kazushi2008 | 10:94f45d37174f | 197 | if(ret==8){ |
kazushi2008 | 10:94f45d37174f | 198 | drawString("disconnect..."); newline(); |
kazushi2008 | 10:94f45d37174f | 199 | wifly.disconnect(); |
kazushi2008 | 10:94f45d37174f | 200 | wifly.init(); |
kazushi2008 | 10:94f45d37174f | 201 | drawString("reconnect..."); newline(); |
kazushi2008 | 10:94f45d37174f | 202 | while (!wifly.connect()); |
kazushi2008 | 10:94f45d37174f | 203 | drawString("done"); newline(); |
kazushi2008 | 10:94f45d37174f | 204 | } |
kazushi2008 | 2:56a2ab00e743 | 205 | } |
kazushi2008 | 10:94f45d37174f | 206 | |
kazushi2008 | 10:94f45d37174f | 207 | #ifdef _DEBUG |
kazushi2008 | 10:94f45d37174f | 208 | if(!ret){ |
kazushi2008 | 10:94f45d37174f | 209 | pc.printf("Page fetched successfully - read %d characters\r\n", strlen(buf)); |
kazushi2008 | 10:94f45d37174f | 210 | pc.printf("Result: %s\r\n", buf); |
kazushi2008 | 10:94f45d37174f | 211 | }else{ |
kazushi2008 | 10:94f45d37174f | 212 | pc.printf("Error - ret = %d - HTTP return code = %d\r\n", ret, http.getHTTPResponseCode()); |
kazushi2008 | 10:94f45d37174f | 213 | } |
kazushi2008 | 10:94f45d37174f | 214 | #endif |
kazushi2008 | 1:6b495e0f3b0c | 215 | wait(INTERVAL_SEC); |
kazushi2008 | 3:cce58539833e | 216 | } |
kazushi2008 | 1:6b495e0f3b0c | 217 | } |