IISEC / Mbed 2 deprecated ESP8266-demo

Dependencies:   mbed

Committer:
titanium
Date:
Wed Apr 10 02:47:18 2019 +0000
Revision:
3:01b3fe95a585
Parent:
2:eaf4e7fa577e
Child:
4:6d3ca9d6109e
final for hands-on practice

Who changed what in which revision?

UserRevisionLine numberNew contents of line
titanium 2:eaf4e7fa577e 1 /* Simple embedded web server on LPC1768 with the WROOM2 WiFi module. */
titanium 2:eaf4e7fa577e 2 // Copyright Toshihiro Matsui, IISEC, March, 2019
titanium 2:eaf4e7fa577e 3 // Any form of use of this program is fully granted to anyone.
titanium 2:eaf4e7fa577e 4 //
titanium 0:bc0e1a75926f 5
titanium 0:bc0e1a75926f 6 #include "mbed.h"
titanium 0:bc0e1a75926f 7
titanium 0:bc0e1a75926f 8 #define MAXRECVBUF 2048
titanium 0:bc0e1a75926f 9 #define WEBFILE "webfile.htm"
titanium 0:bc0e1a75926f 10 #define debug 0
titanium 0:bc0e1a75926f 11
titanium 0:bc0e1a75926f 12 class KBline
titanium 0:bc0e1a75926f 13 { char line[100];
titanium 0:bc0e1a75926f 14 Serial *term;
titanium 0:bc0e1a75926f 15
titanium 0:bc0e1a75926f 16 public:
titanium 0:bc0e1a75926f 17 int index, receiving;
titanium 0:bc0e1a75926f 18 private:
titanium 0:bc0e1a75926f 19 void serialirq()
titanium 0:bc0e1a75926f 20 { char ch;
titanium 0:bc0e1a75926f 21 if (term->readable()) {
titanium 0:bc0e1a75926f 22 ch=term->getc();
titanium 0:bc0e1a75926f 23 switch(ch) { //simple line editing
titanium 0:bc0e1a75926f 24 case '\n':
titanium 0:bc0e1a75926f 25 case '\r': //LF and CR terminate reading
titanium 0:bc0e1a75926f 26 line[index++]=ch; line[index++]=0;
titanium 0:bc0e1a75926f 27 term->printf("\r\n");
titanium 0:bc0e1a75926f 28 receiving=0;
titanium 0:bc0e1a75926f 29 break;
titanium 0:bc0e1a75926f 30 case 21: /* control-U cancels entire line*/
titanium 0:bc0e1a75926f 31 term->printf("\n\r"); index=0; break;
titanium 0:bc0e1a75926f 32 case 0x08:
titanium 0:bc0e1a75926f 33 case 0x7f: /*BS and DEL delete the last character*/
titanium 0:bc0e1a75926f 34 if (index>0) { index--;
titanium 0:bc0e1a75926f 35 term->putc(0x08); term->putc(0x20); term->putc(0x08);}
titanium 0:bc0e1a75926f 36 break;
titanium 0:bc0e1a75926f 37 default:
titanium 0:bc0e1a75926f 38 receiving=2; line[index++]=ch; term->putc(ch); break;
titanium 0:bc0e1a75926f 39 } } }
titanium 0:bc0e1a75926f 40 public:
titanium 0:bc0e1a75926f 41 KBline(Serial *pc) { term=pc; }; //constructor
titanium 0:bc0e1a75926f 42 void start_getline() {
titanium 0:bc0e1a75926f 43 index=0; receiving=1;
titanium 0:bc0e1a75926f 44 term->attach(this, &KBline::serialirq); }
titanium 0:bc0e1a75926f 45 char *getline() {
titanium 0:bc0e1a75926f 46 while (receiving) wait(0.1);
titanium 3:01b3fe95a585 47 return(line); } } ;
titanium 0:bc0e1a75926f 48
titanium 0:bc0e1a75926f 49 class Wroom //tried to extend Serial but failed ...
titanium 3:01b3fe95a585 50 { char sendbuf[256];
titanium 0:bc0e1a75926f 51 char recvbuf[MAXRECVBUF]; /* 1024 */
titanium 0:bc0e1a75926f 52 Serial *port, *pc;
titanium 0:bc0e1a75926f 53 Timeout tmout;
titanium 0:bc0e1a75926f 54 int recvindex;
titanium 0:bc0e1a75926f 55
titanium 0:bc0e1a75926f 56 public:
titanium 0:bc0e1a75926f 57 int receiving;
titanium 0:bc0e1a75926f 58 Wroom(Serial *p) { port=p;} ;
titanium 0:bc0e1a75926f 59 void printf(char *s) { port->printf(s); }
titanium 0:bc0e1a75926f 60 void recvtimeout() {
titanium 0:bc0e1a75926f 61 tmout.detach();
titanium 0:bc0e1a75926f 62 recvbuf[recvindex++]=0; /*NULL at the end*/
titanium 0:bc0e1a75926f 63 receiving=0; } /* receiving finished*/
titanium 0:bc0e1a75926f 64 void recvirq() {
titanium 0:bc0e1a75926f 65 while (port->readable()) {
titanium 0:bc0e1a75926f 66 recvbuf[recvindex++]=port->getc();
titanium 0:bc0e1a75926f 67 if (recvindex>=MAXRECVBUF) recvindex=0; }
titanium 0:bc0e1a75926f 68 receiving=2;
titanium 0:bc0e1a75926f 69 tmout.detach();
titanium 3:01b3fe95a585 70 tmout.attach(this, &Wroom::recvtimeout, 1.0); }
titanium 0:bc0e1a75926f 71 void start_receiving() {
titanium 3:01b3fe95a585 72 recvindex=0; receiving=1; }
titanium 0:bc0e1a75926f 73 char *getreply() {
titanium 0:bc0e1a75926f 74 /* tmout.attach(this, &Wroom::recvtimeout, 7.0);*/
titanium 0:bc0e1a75926f 75 while (receiving) { wait(0.1); }
titanium 0:bc0e1a75926f 76 return(recvbuf); }
titanium 0:bc0e1a75926f 77 char *getmessage() { //get http request
titanium 0:bc0e1a75926f 78 this->start_receiving();
titanium 0:bc0e1a75926f 79 return(this->getreply()); }
titanium 0:bc0e1a75926f 80
titanium 0:bc0e1a75926f 81 char *atcom(char *com) {
titanium 0:bc0e1a75926f 82 this->start_receiving();
titanium 0:bc0e1a75926f 83 port->printf("%s\r\n", com); //pc->printf("atcom: %s\n", com);
titanium 0:bc0e1a75926f 84 return(this->getreply());}
titanium 0:bc0e1a75926f 85 char *atcom(char *com, int mode) {
titanium 0:bc0e1a75926f 86 sprintf(sendbuf, "%s=%d", com, mode);
titanium 0:bc0e1a75926f 87 return(this->atcom(sendbuf)); }
titanium 0:bc0e1a75926f 88 char *atcom(char *com, int param1, int param2) {
titanium 0:bc0e1a75926f 89 sprintf(sendbuf, "%s=%d,%d", com, param1, param2);
titanium 0:bc0e1a75926f 90 pc->printf("atcom2 -->%s\r\n", sendbuf);
titanium 0:bc0e1a75926f 91 return(this->atcom(sendbuf)); }
titanium 0:bc0e1a75926f 92 void configure(Serial *p) { //first set up of WROOM2
titanium 0:bc0e1a75926f 93 pc=p; port->baud(115200); wait(2.0);
titanium 0:bc0e1a75926f 94 recvindex=0; port->attach(this, &Wroom::recvirq);
titanium 0:bc0e1a75926f 95 this->atcom("AT"); pc->printf("AT-->%s\n", this->getreply());
titanium 0:bc0e1a75926f 96 this->atcom("ATE0"); //turn off echo
titanium 0:bc0e1a75926f 97 this->getreply(); pc->printf("ATE0-->%s\n", recvbuf);
titanium 0:bc0e1a75926f 98 this->atcom("AT+CWMODE", 1); //1=station, 2=AP, 3=both
titanium 0:bc0e1a75926f 99 this->getreply(); pc->printf("CWMODE-->%s\n", recvbuf);
titanium 0:bc0e1a75926f 100 this->atcom("AT+CIPMUX", 1); //0=single, 1=multi
titanium 0:bc0e1a75926f 101 this->getreply(); pc->printf("CIPMUX-->%s\n", recvbuf);
titanium 0:bc0e1a75926f 102 this->atcom("AT+CIPSTO", 120);
titanium 0:bc0e1a75926f 103 pc->printf("CIPSTO-->%s\n", this->getreply());
titanium 0:bc0e1a75926f 104 this->atcom("AT+CWLAP"); //AP list
titanium 0:bc0e1a75926f 105 pc->printf("CWLAP-->%s\n", this->getreply());
titanium 0:bc0e1a75926f 106 // connection to AP giving SSID and PASS is not programmed.
titanium 3:01b3fe95a585 107 } };
titanium 0:bc0e1a75926f 108
titanium 0:bc0e1a75926f 109 DigitalOut myled(LED4), led1(LED1), led2(LED2), led3(LED3);
titanium 0:bc0e1a75926f 110 AnalogIn adc(p20);
titanium 0:bc0e1a75926f 111 Serial pc(USBTX, USBRX), ser_wroom(p28, p27);
titanium 0:bc0e1a75926f 112 KBline kbline(&pc);
titanium 0:bc0e1a75926f 113 Wroom wroom(&ser_wroom);
titanium 0:bc0e1a75926f 114 LocalFileSystem local("local");
titanium 0:bc0e1a75926f 115 char webbuf[2000];
titanium 0:bc0e1a75926f 116
titanium 0:bc0e1a75926f 117 void strsubst(char *current, char *pat, char *subst, char *news)
titanium 0:bc0e1a75926f 118 //substitute pat in current with subst and generate in news
titanium 0:bc0e1a75926f 119 { char *s;
titanium 0:bc0e1a75926f 120 int i;
titanium 0:bc0e1a75926f 121 s=strstr(current, pat);
titanium 0:bc0e1a75926f 122 i=s-current;
titanium 0:bc0e1a75926f 123 if (s) {
titanium 0:bc0e1a75926f 124 strncpy(news, current, i);
titanium 0:bc0e1a75926f 125 strncpy(news+i, subst, strlen(subst));
titanium 0:bc0e1a75926f 126 strncpy(news+i+strlen(subst), current+i+strlen(pat), strlen(current)-i-strlen(pat));
titanium 0:bc0e1a75926f 127 news[strlen(current)-strlen(pat)+strlen(subst)]=NULL;
titanium 0:bc0e1a75926f 128 }
titanium 0:bc0e1a75926f 129 }
titanium 0:bc0e1a75926f 130
titanium 0:bc0e1a75926f 131 char *readfile(char *fname, char *buf)
titanium 0:bc0e1a75926f 132 { int rdfd, filelen;
titanium 0:bc0e1a75926f 133 char fullfname[128];
titanium 0:bc0e1a75926f 134 sprintf(fullfname, "/local/%s", fname);
titanium 0:bc0e1a75926f 135 rdfd=open(fullfname,O_RDONLY);
titanium 0:bc0e1a75926f 136 if (rdfd<0) {
titanium 0:bc0e1a75926f 137 pc.printf("%s not found\r\n", fullfname);
titanium 0:bc0e1a75926f 138 return(NULL); }
titanium 0:bc0e1a75926f 139 else {
titanium 0:bc0e1a75926f 140 filelen=read(rdfd, buf, 2000);
titanium 0:bc0e1a75926f 141 if (0<filelen && filelen<2000) buf[filelen]=0;
titanium 0:bc0e1a75926f 142 pc.printf("%d bytes read from %s\r\n", filelen, fullfname);
titanium 0:bc0e1a75926f 143 return(buf);}
titanium 0:bc0e1a75926f 144 }
titanium 0:bc0e1a75926f 145
titanium 0:bc0e1a75926f 146 char *makepage()
titanium 0:bc0e1a75926f 147 { char altwebbuf[2000], adval[16];
titanium 0:bc0e1a75926f 148 readfile(WEBFILE, webbuf);
titanium 0:bc0e1a75926f 149 if (led1) {
titanium 0:bc0e1a75926f 150 strsubst(webbuf, "$LED1ON$", "checked", altwebbuf);
titanium 0:bc0e1a75926f 151 strsubst(altwebbuf, "$LED1OFF$", " ", webbuf); }
titanium 0:bc0e1a75926f 152 else {
titanium 0:bc0e1a75926f 153 strsubst(webbuf, "$LED1OFF$", "checked", altwebbuf);
titanium 0:bc0e1a75926f 154 strsubst(altwebbuf, "$LED1ON$", " ", webbuf); }
titanium 0:bc0e1a75926f 155 if (led2) {
titanium 0:bc0e1a75926f 156 strsubst(webbuf, "$LED2ON$", "checked", altwebbuf);
titanium 0:bc0e1a75926f 157 strsubst(altwebbuf, "$LED2OFF$", " ", webbuf); }
titanium 0:bc0e1a75926f 158 else {
titanium 0:bc0e1a75926f 159 strsubst(webbuf, "$LED2OFF$", "checked", altwebbuf);
titanium 0:bc0e1a75926f 160 strsubst(altwebbuf, "$LED2ON$", " ", webbuf); }
titanium 0:bc0e1a75926f 161 sprintf(adval, "%6.3f", adc.read());
titanium 0:bc0e1a75926f 162 strsubst(webbuf, "$ADVAL$", adval, altwebbuf);
titanium 0:bc0e1a75926f 163 strcpy(webbuf, altwebbuf);
titanium 0:bc0e1a75926f 164 return(webbuf); }
titanium 0:bc0e1a75926f 165
titanium 0:bc0e1a75926f 166 void change_led(char *request)
titanium 0:bc0e1a75926f 167 {
titanium 0:bc0e1a75926f 168 if (strstr(request, "led1=1")) led1=1;
titanium 0:bc0e1a75926f 169 if (strstr(request, "led1=0")) led1=0;
titanium 0:bc0e1a75926f 170 if (strstr(request, "led2=1")) led2=1;
titanium 0:bc0e1a75926f 171 if (strstr(request, "led2=0")) led2=0;
titanium 0:bc0e1a75926f 172 }
titanium 0:bc0e1a75926f 173
titanium 0:bc0e1a75926f 174 int main() {
titanium 0:bc0e1a75926f 175 char *line, *page;
titanium 0:bc0e1a75926f 176 pc.baud(9600);
titanium 0:bc0e1a75926f 177 pc.printf("\r\nWROOM AT commander.\r\n");
titanium 0:bc0e1a75926f 178 wroom.configure(&pc);
titanium 0:bc0e1a75926f 179 pc.printf("\r\nWROOM is configured.\r\n");
titanium 0:bc0e1a75926f 180 pc.printf(">");
titanium 0:bc0e1a75926f 181 kbline.start_getline();
titanium 0:bc0e1a75926f 182 wroom.start_receiving();
titanium 0:bc0e1a75926f 183 while(1) {
titanium 0:bc0e1a75926f 184 myled=1; //prompt
titanium 0:bc0e1a75926f 185 if (kbline.receiving==0) { //kb input completed
titanium 0:bc0e1a75926f 186 line=kbline.getline(); /*pc.printf(line);*/
titanium 0:bc0e1a75926f 187 myled=0;
titanium 0:bc0e1a75926f 188 if (line[0] == 'r') { //receive http request
titanium 0:bc0e1a75926f 189 line=wroom.getmessage();
titanium 0:bc0e1a75926f 190 change_led(line); }
titanium 0:bc0e1a75926f 191 else if (*line == 's') { //send http message
titanium 0:bc0e1a75926f 192 page=makepage();
titanium 0:bc0e1a75926f 193 wroom.atcom("AT+CIPSEND",0,strlen(page));
titanium 0:bc0e1a75926f 194 pc.printf(wroom.getreply());
titanium 0:bc0e1a75926f 195 wroom.atcom(page); //send html document
titanium 0:bc0e1a75926f 196 pc.printf(wroom.getreply());
titanium 0:bc0e1a75926f 197 wroom.atcom("AT+CIPCLOSE", 0);
titanium 0:bc0e1a75926f 198 line=wroom.getreply(); }
titanium 0:bc0e1a75926f 199 else { //AT command
titanium 0:bc0e1a75926f 200 if(debug) pc.printf(line);
titanium 0:bc0e1a75926f 201 wroom.atcom(line); line=wroom.getreply(); }
titanium 0:bc0e1a75926f 202 pc.printf(line);
titanium 0:bc0e1a75926f 203 wroom.receiving=1;
titanium 0:bc0e1a75926f 204 pc.printf(">"); kbline.start_getline(); }
titanium 0:bc0e1a75926f 205 if (wroom.receiving==0) {
titanium 2:eaf4e7fa577e 206 pc.printf(wroom.getreply());
titanium 0:bc0e1a75926f 207 /* */
titanium 0:bc0e1a75926f 208 wroom.start_receiving(); }
titanium 0:bc0e1a75926f 209 wait(0.1);
titanium 0:bc0e1a75926f 210 }
titanium 0:bc0e1a75926f 211 } ;
titanium 0:bc0e1a75926f 212