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

Revision:
3:4f71a37a1ed2
Parent:
1:64f023138627
Child:
4:7fdb64fe6419
--- a/main.cpp	Fri Dec 06 03:59:01 2013 +0000
+++ b/main.cpp	Sat Apr 19 05:26:40 2014 +0000
@@ -1,7 +1,6 @@
 #include "mbed.h"
 #include "EthernetInterface.h"
 #include "SDFileSystem.h"
-#include "muri.h"
 #include <stdio.h>
 #include <string.h>
 
@@ -9,20 +8,21 @@
 #define HTTPD_MAX_REQ_LENGTH   1023
 #define HTTPD_MAX_HDR_LENGTH   255
 #define HTTPD_MAX_FNAME_LENGTH   127
-#define MURI_MAX_RESP_LENGTH  127
-#define I2C_BUFFER_SIZE 31
+#define HTTPD_MAX_DNAME_LENGTH   127
+
+Serial uart(USBTX, USBRX);
 
-SDFileSystem sd(p5, p6, p7, p8, "sd"); //
-// I2C i2c(p28, p27);
+//SDFileSystem sd(p5, p6, p7, p8, "sd"); // LPC1768 MBD2PMD
+SDFileSystem sd(P0_18, P0_17, P0_15, P0_16, "sd"); // Seeeduino Arch Pro SPI2SD
+
 EthernetInterface eth;
 TCPSocketServer server;
 TCPSocketConnection client;
 
 char buffer[HTTPD_MAX_REQ_LENGTH+1];
 char httpHeader[HTTPD_MAX_HDR_LENGTH+1];
-char filename[HTTPD_MAX_FNAME_LENGTH+1];
-char obuf[MURI_MAX_RESP_LENGTH+1];
-char data[I2C_BUFFER_SIZE];
+char fileName[HTTPD_MAX_FNAME_LENGTH+1];
+char dirName[HTTPD_MAX_DNAME_LENGTH+1];
 char *uristr;
 char *eou;
 char *qrystr;
@@ -32,32 +32,38 @@
 
 void get_file(char* uri)
 {
-    printf("get_file %s\n", uri);
+    uart.printf("get_file %s\n", uri);
     char *lstchr = strrchr(uri, NULL) -1;
     if ('/' == *lstchr) {
-        printf("Open directory /sd%s\n", uri);
+        uart.printf("Open directory /sd%s\n", uri);
         *lstchr = 0;
-        sprintf(filename, "/sd%s", uri);
-        DIR *d = opendir(filename);
+        sprintf(fileName, "/sd%s", uri);
+        DIR *d = opendir(fileName);
         if (d != NULL) {
             sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
             client.send(httpHeader,strlen(httpHeader));
-            sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s</h1><ul>", uri);
+            sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s Directory Listing</h1><ul>", uri);
             client.send(httpHeader,strlen(httpHeader));
             struct dirent *p;
             while((p = readdir(d)) != NULL) {
-                printf("%s\n", p->d_name);
-                sprintf(httpHeader,"<li>%s</li>", p->d_name);
+                sprintf(dirName, "%s/%s", fileName, p->d_name);
+                uart.printf("%s\n", dirName);
+                DIR *subDir = opendir(dirName);
+                if (subDir != NULL) {
+                    sprintf(httpHeader,"<li><a href=\"./%s/\">%s/</a></li>", p->d_name, p->d_name);
+                } else {
+                    sprintf(httpHeader,"<li><a href=\"./%s\">%s</a></li>", p->d_name, p->d_name);
+                }
                 client.send(httpHeader,strlen(httpHeader));
             }
         }
         closedir(d);
-        printf("Directory closed\n");
+        uart.printf("Directory closed\n");
         sprintf(httpHeader,"</ul></body></html>");
         client.send(httpHeader,strlen(httpHeader));
     } else {
-        sprintf(filename, "/sd%s", uri);
-        fp = fopen(filename, "r");
+        sprintf(fileName, "/sd%s", uri);
+        fp = fopen(fileName, "r");
         if (fp == NULL) {
             sprintf(httpHeader,"HTTP/1.1 404 Not Found \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
             client.send(httpHeader,strlen(httpHeader));
@@ -74,50 +80,40 @@
     }
 }
 
-void get_cgi(char* uri)
-{
-    char *result;
-    muri(uri, data, obuf);
-    if (!strncmp(obuf, "200 ", 4)) {
-        result = obuf +4;
-        sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
-        client.send(httpHeader,strlen(httpHeader));
-        client.send(result,strlen(result));
-        printf("result:  %s", result);
-    } else {
-        sprintf(httpHeader,"HTTP/1.1 ");
-        client.send(httpHeader,strlen(httpHeader));
-        client.send(obuf,strlen(obuf));
-        sprintf(httpHeader,"\r\n");
-        client.send(httpHeader,strlen(httpHeader)); 
-    }
-    
-}
-
-
 int main (void)
 {
+//    Serial Interface eth;
+    uart.baud(115200);
+    uart.printf("RAPM Serial Started\n");
+
+//    Check File System
+    DIR *d = opendir("/sd/");
+    if (d != NULL) {
+        uart.printf("SD Card Present\n");
+    } else {
+        uart.printf("SD Card Root Directory Not Found\n");
+    }
+
 //    EthernetInterface eth;
     eth.init(); //Use DHCP
     eth.connect();
-    printf("IP Address is %s\n", eth.getIPAddress());
+    uart.printf("IP Address is %s\n", eth.getIPAddress());
 
 //    TCPSocketServer server;
     server.bind(HTTPD_SERVER_PORT);
     server.listen();
-    
-    init_dio(); //initialize pmd digital IO
+    uart.printf("RAPM Server Listening\n");
 
     while (true) {
-        printf("\nWait for new connection...\r\n");
+        uart.printf("\nWait for new connection...\r\n");
         server.accept(client);
         client.set_blocking(false, 1500); // Timeout after (1.5)s
 
-        printf("Connection from: %s\r\n", client.get_address());
+        uart.printf("Connection from: %s\r\n", client.get_address());
         while (true) {
             int n = client.receive(buffer, sizeof(buffer));
             if (n <= 0) break;
-            printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer);
+            uart.printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer);
             if (n >= 1024) {
                 sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
                 client.send(httpHeader,strlen(httpHeader));
@@ -135,11 +131,7 @@
                     client.send(buffer,n);
                 } else {
                     *eou = 0;
-                    if (!strncmp(uristr, "/muri/", 6)) {
-                        get_cgi(uristr+6);
-                    } else {
-                        get_file(uristr);
-                    }
+                    get_file(uristr);
                 }
             }
         }