ARD2PMD Web Server Web Server using the ARD2PMD adapter and the SPI2SD adapter with the Seeeduino Arch Pro to serve files from the micro SD card and provide RESTful access to the Pmod connector
Dependencies: ARD2PMD EthernetInterface MAX14661 PmodInterface SDFileSystem mbed-rtos mbed
Fork of ARD2PMD_WebServer by
main.cpp@7:2c61deb7c2db, 2014-05-10 (annotated)
- Committer:
- gsteiert
- Date:
- Sat May 10 02:24:56 2014 +0000
- Revision:
- 7:2c61deb7c2db
- Parent:
- 6:cff87a23b6bd
Replaced old copy of ethernet library with official library.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gsteiert | 0:28bc7ce77e20 | 1 | #include "mbed.h" |
gsteiert | 0:28bc7ce77e20 | 2 | #include "EthernetInterface.h" |
gsteiert | 6:cff87a23b6bd | 3 | #include "SDFileSystem.h" |
gsteiert | 6:cff87a23b6bd | 4 | #include "ARD2PMD.h" |
gsteiert | 4:7fdb64fe6419 | 5 | #include "PmodInterface.h" |
gsteiert | 0:28bc7ce77e20 | 6 | #include <stdio.h> |
gsteiert | 0:28bc7ce77e20 | 7 | #include <string.h> |
gsteiert | 0:28bc7ce77e20 | 8 | |
gsteiert | 0:28bc7ce77e20 | 9 | #define HTTPD_SERVER_PORT 80 |
gsteiert | 0:28bc7ce77e20 | 10 | #define HTTPD_MAX_REQ_LENGTH 1023 |
gsteiert | 0:28bc7ce77e20 | 11 | #define HTTPD_MAX_HDR_LENGTH 255 |
gsteiert | 0:28bc7ce77e20 | 12 | #define HTTPD_MAX_FNAME_LENGTH 127 |
gsteiert | 3:4f71a37a1ed2 | 13 | #define HTTPD_MAX_DNAME_LENGTH 127 |
gsteiert | 6:cff87a23b6bd | 14 | #define CGI_MAX_RESP_LENGTH 255 |
gsteiert | 4:7fdb64fe6419 | 15 | #define UART_MAX_CMD_LENGTH 127 |
gsteiert | 3:4f71a37a1ed2 | 16 | |
gsteiert | 3:4f71a37a1ed2 | 17 | Serial uart(USBTX, USBRX); |
gsteiert | 6:cff87a23b6bd | 18 | I2C i2c(D14, D15); |
gsteiert | 6:cff87a23b6bd | 19 | ARD2PMD a2p; |
gsteiert | 4:7fdb64fe6419 | 20 | PmodInterface pInt; |
gsteiert | 6:cff87a23b6bd | 21 | SDFileSystem sd(P0_18, P0_17, P0_15, P0_16, "sd"); // Seeeduino Arch Pro SPI2SD |
gsteiert | 3:4f71a37a1ed2 | 22 | |
gsteiert | 0:28bc7ce77e20 | 23 | EthernetInterface eth; |
gsteiert | 0:28bc7ce77e20 | 24 | TCPSocketServer server; |
gsteiert | 0:28bc7ce77e20 | 25 | TCPSocketConnection client; |
gsteiert | 0:28bc7ce77e20 | 26 | |
gsteiert | 0:28bc7ce77e20 | 27 | char buffer[HTTPD_MAX_REQ_LENGTH+1]; |
gsteiert | 0:28bc7ce77e20 | 28 | char httpHeader[HTTPD_MAX_HDR_LENGTH+1]; |
gsteiert | 3:4f71a37a1ed2 | 29 | char fileName[HTTPD_MAX_FNAME_LENGTH+1]; |
gsteiert | 3:4f71a37a1ed2 | 30 | char dirName[HTTPD_MAX_DNAME_LENGTH+1]; |
gsteiert | 4:7fdb64fe6419 | 31 | char obuf[CGI_MAX_RESP_LENGTH+1]; |
gsteiert | 4:7fdb64fe6419 | 32 | char ibuf[UART_MAX_CMD_LENGTH+1]; |
gsteiert | 0:28bc7ce77e20 | 33 | char *uristr; |
gsteiert | 0:28bc7ce77e20 | 34 | char *eou; |
gsteiert | 0:28bc7ce77e20 | 35 | char *qrystr; |
gsteiert | 0:28bc7ce77e20 | 36 | |
gsteiert | 0:28bc7ce77e20 | 37 | FILE *fp; |
gsteiert | 0:28bc7ce77e20 | 38 | int rdCnt; |
gsteiert | 0:28bc7ce77e20 | 39 | |
gsteiert | 0:28bc7ce77e20 | 40 | void get_file(char* uri) |
gsteiert | 0:28bc7ce77e20 | 41 | { |
gsteiert | 3:4f71a37a1ed2 | 42 | uart.printf("get_file %s\n", uri); |
gsteiert | 0:28bc7ce77e20 | 43 | char *lstchr = strrchr(uri, NULL) -1; |
gsteiert | 0:28bc7ce77e20 | 44 | if ('/' == *lstchr) { |
gsteiert | 3:4f71a37a1ed2 | 45 | uart.printf("Open directory /sd%s\n", uri); |
gsteiert | 0:28bc7ce77e20 | 46 | *lstchr = 0; |
gsteiert | 3:4f71a37a1ed2 | 47 | sprintf(fileName, "/sd%s", uri); |
gsteiert | 3:4f71a37a1ed2 | 48 | DIR *d = opendir(fileName); |
gsteiert | 0:28bc7ce77e20 | 49 | if (d != NULL) { |
gsteiert | 0:28bc7ce77e20 | 50 | sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); |
gsteiert | 0:28bc7ce77e20 | 51 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 3:4f71a37a1ed2 | 52 | sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s Directory Listing</h1><ul>", uri); |
gsteiert | 0:28bc7ce77e20 | 53 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 0:28bc7ce77e20 | 54 | struct dirent *p; |
gsteiert | 0:28bc7ce77e20 | 55 | while((p = readdir(d)) != NULL) { |
gsteiert | 3:4f71a37a1ed2 | 56 | sprintf(dirName, "%s/%s", fileName, p->d_name); |
gsteiert | 3:4f71a37a1ed2 | 57 | uart.printf("%s\n", dirName); |
gsteiert | 3:4f71a37a1ed2 | 58 | DIR *subDir = opendir(dirName); |
gsteiert | 3:4f71a37a1ed2 | 59 | if (subDir != NULL) { |
gsteiert | 3:4f71a37a1ed2 | 60 | sprintf(httpHeader,"<li><a href=\"./%s/\">%s/</a></li>", p->d_name, p->d_name); |
gsteiert | 3:4f71a37a1ed2 | 61 | } else { |
gsteiert | 3:4f71a37a1ed2 | 62 | sprintf(httpHeader,"<li><a href=\"./%s\">%s</a></li>", p->d_name, p->d_name); |
gsteiert | 3:4f71a37a1ed2 | 63 | } |
gsteiert | 0:28bc7ce77e20 | 64 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 0:28bc7ce77e20 | 65 | } |
gsteiert | 0:28bc7ce77e20 | 66 | } |
gsteiert | 0:28bc7ce77e20 | 67 | closedir(d); |
gsteiert | 3:4f71a37a1ed2 | 68 | uart.printf("Directory closed\n"); |
gsteiert | 0:28bc7ce77e20 | 69 | sprintf(httpHeader,"</ul></body></html>"); |
gsteiert | 0:28bc7ce77e20 | 70 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 0:28bc7ce77e20 | 71 | } else { |
gsteiert | 3:4f71a37a1ed2 | 72 | sprintf(fileName, "/sd%s", uri); |
gsteiert | 3:4f71a37a1ed2 | 73 | fp = fopen(fileName, "r"); |
gsteiert | 0:28bc7ce77e20 | 74 | if (fp == NULL) { |
gsteiert | 0:28bc7ce77e20 | 75 | sprintf(httpHeader,"HTTP/1.1 404 Not Found \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
gsteiert | 0:28bc7ce77e20 | 76 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 0:28bc7ce77e20 | 77 | client.send(uri,strlen(uri)); |
gsteiert | 0:28bc7ce77e20 | 78 | } else { |
gsteiert | 0:28bc7ce77e20 | 79 | sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); |
gsteiert | 0:28bc7ce77e20 | 80 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 0:28bc7ce77e20 | 81 | while ((rdCnt = fread(buffer, sizeof( char ), 1024, fp)) == 1024) { |
gsteiert | 0:28bc7ce77e20 | 82 | client.send(buffer, rdCnt); |
gsteiert | 0:28bc7ce77e20 | 83 | } |
gsteiert | 0:28bc7ce77e20 | 84 | client.send(buffer, rdCnt); |
gsteiert | 0:28bc7ce77e20 | 85 | fclose(fp); |
gsteiert | 0:28bc7ce77e20 | 86 | } |
gsteiert | 0:28bc7ce77e20 | 87 | } |
gsteiert | 0:28bc7ce77e20 | 88 | } |
gsteiert | 0:28bc7ce77e20 | 89 | |
gsteiert | 4:7fdb64fe6419 | 90 | void get_cgi(char* uri) |
gsteiert | 4:7fdb64fe6419 | 91 | { |
gsteiert | 4:7fdb64fe6419 | 92 | pInt.call(uri, obuf); |
gsteiert | 4:7fdb64fe6419 | 93 | sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); |
gsteiert | 4:7fdb64fe6419 | 94 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 4:7fdb64fe6419 | 95 | client.send(obuf,strlen(obuf)); |
gsteiert | 4:7fdb64fe6419 | 96 | uart.printf("resp: %s", obuf); |
gsteiert | 4:7fdb64fe6419 | 97 | } |
gsteiert | 4:7fdb64fe6419 | 98 | |
gsteiert | 4:7fdb64fe6419 | 99 | void uart_cmd_thread(void const *args) |
gsteiert | 4:7fdb64fe6419 | 100 | { |
gsteiert | 4:7fdb64fe6419 | 101 | int i = 0; |
gsteiert | 4:7fdb64fe6419 | 102 | while(true) { |
gsteiert | 4:7fdb64fe6419 | 103 | if (uart.readable()) { |
gsteiert | 4:7fdb64fe6419 | 104 | ibuf[i]=uart.getc(); |
gsteiert | 4:7fdb64fe6419 | 105 | if (ibuf[i]!='\r') { |
gsteiert | 4:7fdb64fe6419 | 106 | if (i < 255) { |
gsteiert | 4:7fdb64fe6419 | 107 | i += 1; |
gsteiert | 4:7fdb64fe6419 | 108 | } |
gsteiert | 4:7fdb64fe6419 | 109 | } else { |
gsteiert | 4:7fdb64fe6419 | 110 | if (i < 255) { |
gsteiert | 4:7fdb64fe6419 | 111 | ibuf[i]=0; |
gsteiert | 4:7fdb64fe6419 | 112 | uart.printf("UART CMD: %s=", ibuf); |
gsteiert | 4:7fdb64fe6419 | 113 | pInt.call(ibuf, obuf); |
gsteiert | 4:7fdb64fe6419 | 114 | uart.printf("%s\n", obuf); |
gsteiert | 4:7fdb64fe6419 | 115 | } else { |
gsteiert | 4:7fdb64fe6419 | 116 | uart.printf("UART Input Command Too Long\n"); |
gsteiert | 4:7fdb64fe6419 | 117 | } |
gsteiert | 4:7fdb64fe6419 | 118 | i=0; |
gsteiert | 4:7fdb64fe6419 | 119 | } |
gsteiert | 4:7fdb64fe6419 | 120 | } |
gsteiert | 4:7fdb64fe6419 | 121 | } |
gsteiert | 4:7fdb64fe6419 | 122 | } |
gsteiert | 4:7fdb64fe6419 | 123 | |
gsteiert | 0:28bc7ce77e20 | 124 | int main (void) |
gsteiert | 0:28bc7ce77e20 | 125 | { |
gsteiert | 4:7fdb64fe6419 | 126 | // Serial Interface Setup; |
gsteiert | 3:4f71a37a1ed2 | 127 | uart.baud(115200); |
gsteiert | 4:7fdb64fe6419 | 128 | uart.printf("mbd2pmd Serial Started\n"); |
gsteiert | 4:7fdb64fe6419 | 129 | |
gsteiert | 4:7fdb64fe6419 | 130 | // Mbed to Pmod Initialization; |
gsteiert | 6:cff87a23b6bd | 131 | a2p.init(); |
gsteiert | 4:7fdb64fe6419 | 132 | |
gsteiert | 4:7fdb64fe6419 | 133 | // Pmod Interface Setup |
gsteiert | 6:cff87a23b6bd | 134 | pInt.init(&a2p.pmd[0], &i2c, &a2p.mux, a2p.mux_a, a2p.mux_p); |
gsteiert | 3:4f71a37a1ed2 | 135 | |
gsteiert | 3:4f71a37a1ed2 | 136 | // Check File System |
gsteiert | 3:4f71a37a1ed2 | 137 | DIR *d = opendir("/sd/"); |
gsteiert | 3:4f71a37a1ed2 | 138 | if (d != NULL) { |
gsteiert | 3:4f71a37a1ed2 | 139 | uart.printf("SD Card Present\n"); |
gsteiert | 3:4f71a37a1ed2 | 140 | } else { |
gsteiert | 3:4f71a37a1ed2 | 141 | uart.printf("SD Card Root Directory Not Found\n"); |
gsteiert | 3:4f71a37a1ed2 | 142 | } |
gsteiert | 3:4f71a37a1ed2 | 143 | |
gsteiert | 0:28bc7ce77e20 | 144 | // EthernetInterface eth; |
gsteiert | 0:28bc7ce77e20 | 145 | eth.init(); //Use DHCP |
gsteiert | 0:28bc7ce77e20 | 146 | eth.connect(); |
gsteiert | 3:4f71a37a1ed2 | 147 | uart.printf("IP Address is %s\n", eth.getIPAddress()); |
gsteiert | 0:28bc7ce77e20 | 148 | |
gsteiert | 0:28bc7ce77e20 | 149 | // TCPSocketServer server; |
gsteiert | 0:28bc7ce77e20 | 150 | server.bind(HTTPD_SERVER_PORT); |
gsteiert | 0:28bc7ce77e20 | 151 | server.listen(); |
gsteiert | 4:7fdb64fe6419 | 152 | uart.printf("mbd2pmd Server Listening\n"); |
gsteiert | 4:7fdb64fe6419 | 153 | |
gsteiert | 4:7fdb64fe6419 | 154 | // Start UART Command Thread |
gsteiert | 4:7fdb64fe6419 | 155 | Thread thread(uart_cmd_thread); |
gsteiert | 4:7fdb64fe6419 | 156 | uart.printf("UART Commands Listening\n"); |
gsteiert | 0:28bc7ce77e20 | 157 | |
gsteiert | 0:28bc7ce77e20 | 158 | while (true) { |
gsteiert | 3:4f71a37a1ed2 | 159 | uart.printf("\nWait for new connection...\r\n"); |
gsteiert | 0:28bc7ce77e20 | 160 | server.accept(client); |
gsteiert | 0:28bc7ce77e20 | 161 | client.set_blocking(false, 1500); // Timeout after (1.5)s |
gsteiert | 0:28bc7ce77e20 | 162 | |
gsteiert | 3:4f71a37a1ed2 | 163 | uart.printf("Connection from: %s\r\n", client.get_address()); |
gsteiert | 0:28bc7ce77e20 | 164 | while (true) { |
gsteiert | 0:28bc7ce77e20 | 165 | int n = client.receive(buffer, sizeof(buffer)); |
gsteiert | 0:28bc7ce77e20 | 166 | if (n <= 0) break; |
gsteiert | 3:4f71a37a1ed2 | 167 | uart.printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer); |
gsteiert | 0:28bc7ce77e20 | 168 | if (n >= 1024) { |
gsteiert | 0:28bc7ce77e20 | 169 | sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
gsteiert | 0:28bc7ce77e20 | 170 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 0:28bc7ce77e20 | 171 | client.send(buffer,n); |
gsteiert | 0:28bc7ce77e20 | 172 | break; |
gsteiert | 0:28bc7ce77e20 | 173 | } else { |
gsteiert | 0:28bc7ce77e20 | 174 | buffer[n]=0; |
gsteiert | 0:28bc7ce77e20 | 175 | } |
gsteiert | 0:28bc7ce77e20 | 176 | if (!strncmp(buffer, "GET ", 4)) { |
gsteiert | 0:28bc7ce77e20 | 177 | uristr = buffer + 4; |
gsteiert | 0:28bc7ce77e20 | 178 | eou = strstr(uristr, " "); |
gsteiert | 0:28bc7ce77e20 | 179 | if (eou == NULL) { |
gsteiert | 0:28bc7ce77e20 | 180 | sprintf(httpHeader,"HTTP/1.1 400 Bad Request \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
gsteiert | 0:28bc7ce77e20 | 181 | client.send(httpHeader,strlen(httpHeader)); |
gsteiert | 0:28bc7ce77e20 | 182 | client.send(buffer,n); |
gsteiert | 0:28bc7ce77e20 | 183 | } else { |
gsteiert | 0:28bc7ce77e20 | 184 | *eou = 0; |
gsteiert | 5:892b329134ca | 185 | if (!strncmp(uristr, "/pmd/", 5)) { |
gsteiert | 4:7fdb64fe6419 | 186 | get_cgi(uristr+4); |
gsteiert | 4:7fdb64fe6419 | 187 | } else { |
gsteiert | 4:7fdb64fe6419 | 188 | get_file(uristr); |
gsteiert | 4:7fdb64fe6419 | 189 | } |
gsteiert | 0:28bc7ce77e20 | 190 | } |
gsteiert | 0:28bc7ce77e20 | 191 | } |
gsteiert | 0:28bc7ce77e20 | 192 | } |
gsteiert | 0:28bc7ce77e20 | 193 | |
gsteiert | 0:28bc7ce77e20 | 194 | client.close(); |
gsteiert | 0:28bc7ce77e20 | 195 | } |
gsteiert | 0:28bc7ce77e20 | 196 | } |