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 Greg Steiert

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?

UserRevisionLine numberNew 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 }