HTTP SD Card File Server
Dependencies: SDFileSystem WIZnetInterface mbed
Fork of HTTP_SD_Server_K64F by
Prerequisite
This Program is the example how to show SD card file list with web-browser for WIZwiki-W7500.
To implement this function, you need a Platform board, network Interface board and SD card. Below are what we used.
- WIZwiki-W7500 from WIZnet (Platform board and Ethernet I/F board)
- SD card
Hardware Configuration
WIZwiki-W7500 Pin map

Software
SPI Initialization
main.cpp
SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd");
Refer to ....
- Wiki : /teams/WIZnet/code/HTTP_SDCard_File_Server_WIZwiki-W7500/wiki/HTTP_SDCard_File_Server_WIZwiki-W7500
- Korean Version : http://midnightcow.tistory.com/category/위즈네트/WIZwiki-W7500
Revision 3:4f71a37a1ed2, committed 2014-04-19
- Comitter:
- gsteiert
- Date:
- Sat Apr 19 05:26:40 2014 +0000
- Parent:
- 2:5c9ce3b50de6
- Child:
- 4:6e648db29edf
- Commit message:
- Initial Release of HTTP SD Card File Server
Changed in this revision
--- a/SDFileSystem.lib Fri Dec 06 03:59:01 2013 +0000 +++ b/SDFileSystem.lib Sat Apr 19 05:26:40 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/SDFileSystem/#c8f66dc765d4 +http://mbed.org/users/mbed_official/code/SDFileSystem/#7b35d1709458
--- 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);
}
}
}
--- a/mbed-rtos.lib Fri Dec 06 03:59:01 2013 +0000 +++ b/mbed-rtos.lib Sat Apr 19 05:26:40 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed-rtos/#869ef732a8a2 +http://mbed.org/users/mbed_official/code/mbed-rtos/#4ef72665e2c8
--- a/mbed.bld Fri Dec 06 03:59:01 2013 +0000 +++ b/mbed.bld Sat Apr 19 05:26:40 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/9c8f0e3462fb \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/6473597d706e \ No newline at end of file
--- a/muri.cpp Fri Dec 06 03:59:01 2013 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,327 +0,0 @@
-#include "mbed.h"
-#include "rtos.h"
-#include "muri.h"
-
-I2C i2c(p28, p27);
-//PwmOut pwm1(p26);
-PwmOut pwm(p25);
-DigitalInOut pmd1(p14);
-DigitalInOut pmd2(p11);
-DigitalInOut pmd3(p12);
-DigitalInOut pmd4(p13);
-DigitalInOut pmd7(p24);
-DigitalInOut pmd8(p23);
-DigitalInOut pmd9(p22);
-DigitalInOut pmd10(p21);
-
-osTimerDef(poff, pwm_off);
-osTimerId off_timer;
-
-void init_dio()
-{
- pmd1.mode(PullNone);
- pmd1.mode(OpenDrain);
- pmd1.write(1);
- pmd1.output();
- pmd2.mode(PullNone);
- pmd2.mode(OpenDrain);
- pmd2.write(1);
- pmd2.output();
- pmd3.mode(PullNone);
- pmd3.mode(OpenDrain);
- pmd3.write(1);
- pmd3.output();
- pmd4.mode(PullNone);
- pmd4.mode(OpenDrain);
- pmd4.write(1);
- pmd4.output();
- pmd7.mode(PullNone);
- pmd7.mode(OpenDrain);
- pmd7.write(1);
- pmd7.output();
- pmd8.mode(PullNone);
- pmd8.mode(OpenDrain);
- pmd8.write(1);
- pmd8.output();
- pmd9.mode(PullNone);
- pmd9.mode(OpenDrain);
- pmd9.write(1);
- pmd9.output();
- pmd10.mode(PullNone);
- pmd10.mode(OpenDrain);
- pmd10.write(1);
- pmd10.output();
- off_timer = osTimerCreate(osTimer(poff), osTimerOnce, NULL);
-}
-
-void cmd_i2c_write(char* qry, char* data, char* resp)
-{
- int addr = 0;
- int dlen = 0;
- int dtmp = 0;
- if (sscanf(qry, "?%2x", &addr) == 1) {
- qry += 3;
- while (sscanf(qry, "&%2x", &dtmp) == 1) {
- data[dlen] = dtmp;
- qry +=3;
- dlen +=1;
- }
- } else {
- dlen = -1;
- }
- if (dlen > 0 ) {
- i2c.write(addr, data, dlen);
- sprintf(resp,"200 %d\r\n", dlen);
- } else {
- if (dlen == 0) {
- sprintf(resp,"204 No data to write: %s\r\n", qry);
- } else {
- sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
-
- }
- }
-}
-
-void cmd_i2c_read(char* qry, char* data, char* resp)
-{
- int addr = 0;
- int dlen = 0;
- int dcnt = 0;
- if (sscanf(qry, "?%2x", &addr) == 1) {
- qry += 3;
- if (sscanf(qry, "&%2x", &dlen) == 1) {
- if (i2c.read(addr, data, dlen)!=0) {
- dlen = -1;
- sprintf(resp, "500 I2C read failed\r\n");
- }
- } else {
- sprintf(resp, "400 Invalid data length: %s\r\n", qry);
- }
- } else {
- dlen = -1;
- sprintf(resp, "400 Invalid address: %s\r\n", qry);
- }
- if (dlen > 0) {
- sprintf(resp,"200");
- resp += 3;
- for (dcnt = 0; dcnt < dlen; dcnt++) {
- sprintf(resp," %02x", data[dcnt]);
- resp +=3;
- }
- }
-}
-
-void cmd_i2c_addr_read(char* qry, char* data, char* resp)
-{
- int addr = 0;
- int radd = 0;
- int dlen = 0;
- int dcnt = 0;
- if (sscanf(qry, "?%2x", &addr) == 1) {
- qry += 3;
- if (sscanf(qry, "&%2x", &radd) == 1) {
- qry += 3;
- if (sscanf(qry, "&%2x", &dlen) == 1) {
- data[0] = radd;
- i2c.write(addr, data, 1, false);
- if (i2c.read(addr, data, dlen)!=0) {
- dlen = -1;
- sprintf(resp, "500 I2C read failed\r\n");
- }
- } else {
- sprintf(resp, "400 Invalid data length: %s\r\n", qry);
- }
- } else {
- dlen = -1;
- sprintf(resp, "400 Invalid register address: %s\r\n", qry);
- }
- } else {
- dlen = -1;
- sprintf(resp, "400 Invalid address: %s\r\n", qry);
- }
- if (dlen > 0) {
- sprintf(resp,"200");
- resp += 3;
- for (dcnt = 0; dcnt < dlen; dcnt++) {
- sprintf(resp," %02x", data[dcnt]);
- resp +=3;
- }
- }
-}
-
-void cmd_pmd_setio(char* qry, char* data, char* resp)
-{
- int pdir = -1;
- int pdata = -1;
- if (sscanf(qry, "?%2x", &pdir) == 1) {
- if (pdir == 0) {
- pmd1.mode(PullNone);
- pmd2.mode(PullNone);
- pmd3.mode(PullNone);
- pmd4.mode(PullNone);
- pmd7.mode(PullNone);
- pmd8.mode(PullNone);
- pmd9.mode(PullNone);
- pmd10.mode(PullNone);
- } else {
- if (sscanf(qry+3, "&%2x", &pdata) == 1) {
- if (pdir & (1 << 0)) {
- if (pdata & (1 << 0)) pmd1.mode(PullUp);
- else pmd1.mode(PullDown);
- } else {
- pmd1.mode(PullNone);
- }
- if (pdir & (1 << 1)) {
- if (pdata & (1 << 1)) pmd2.mode(PullUp);
- else pmd2.mode(PullDown);
- } else {
- pmd2.mode(PullNone);
- }
- if (pdir & (1 << 2)) {
- if (pdata & (1 << 2)) pmd3.mode(PullUp);
- else pmd3.mode(PullDown);
- } else {
- pmd3.mode(PullNone);
- }
- if (pdir & (1 << 3)) {
- if (pdata & (1 << 3)) pmd4.mode(PullUp);
- else pmd4.mode(PullDown);
- } else {
- pmd4.mode(PullNone);
- }
- if (pdir & (1 << 4)) {
- if (pdata & (1 << 4)) pmd7.mode(PullUp);
- else pmd7.mode(PullDown);
- } else {
- pmd7.mode(PullNone);
- }
- if (pdir & (1 << 5)) {
- if (pdata & (1 << 5)) pmd8.mode(PullUp);
- else pmd8.mode(PullDown);
- } else {
- pmd8.mode(PullNone);
- }
- if (pdir & (1 << 6)) {
- if (pdata & (1 << 6)) pmd9.mode(PullUp);
- else pmd9.mode(PullDown);
- } else {
- pmd9.mode(PullNone);
- }
- if (pdir & (1 << 7)) {
- if (pdata & (1 << 7)) pmd10.mode(PullUp);
- else pmd10.mode(PullDown);
- } else {
- pmd10.mode(PullNone);
- }
- }
- }
-
- pdata = 0;
- pdata += (pmd1 << 0);
- pdata += (pmd2 << 1);
- pdata += (pmd3 << 2);
- pdata += (pmd4 << 3);
- pdata += (pmd7 << 4);
- pdata += (pmd8 << 5);
- pdata += (pmd9 << 6);
- pdata += (pmd10 << 7);
- sprintf(resp,"200 %02x", pdata);
- } else {
- sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
- }
-}
-
-void cmd_pmd_write(char* qry, char* data, char* resp)
-{
- int pdata = -1;
- if (sscanf(qry, "?%2x", &pdata) == 1) {
- pmd1 = pdata & (1 << 0);
- pmd2 = pdata & (1 << 1);
- pmd3 = pdata & (1 << 2);
- pmd4 = pdata & (1 << 3);
- pmd7 = pdata & (1 << 4);
- pmd8 = pdata & (1 << 5);
- pmd9 = pdata & (1 << 6);
- pmd10 = pdata & (1 << 7);
- pdata = 0;
- pdata += (pmd1 << 0);
- pdata += (pmd2 << 1);
- pdata += (pmd3 << 2);
- pdata += (pmd4 << 3);
- pdata += (pmd7 << 4);
- pdata += (pmd8 << 5);
- pdata += (pmd9 << 6);
- pdata += (pmd10 << 7);
- sprintf(resp,"200 %02x", pdata);
- } else {
- sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
-
- }
-}
-
-void cmd_pmd_read(char* qry, char* data, char* resp)
-{
- int pdata = 0;
- pdata += (pmd1 << 0);
- pdata += (pmd2 << 1);
- pdata += (pmd3 << 2);
- pdata += (pmd4 << 3);
- pdata += (pmd7 << 4);
- pdata += (pmd8 << 5);
- pdata += (pmd9 << 6);
- pdata += (pmd10 << 7);
- sprintf(resp,"200 %02x", pdata);
-}
-
-void pwm_off(void const *arg)
-{
-// pwm.period_us(0);
- pwm.pulsewidth_us(0);
-}
-
-void cmd_pwm_set(char* qry, char* data, char* resp)
-{
- int pwmP = 0;
- int pwmW = 0;
- int pwmD = 0;
- if (sscanf(qry, "?%4x&%4x&%4x", &pwmP, &pwmW, &pwmD) == 3) {
- pwm.period_us(pwmP);
- pwm.pulsewidth_us(pwmW);
- osTimerStart(off_timer, pwmD);
- sprintf(resp,"200 %04x %04x %04x", pwmP, pwmW, pwmD);
- } else {
- sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
-
- }
-}
-
-void muri(char* uri, char* data, char* resp)
-{
-// sprintf(resp, "501 %s", uri);
-//}
-//void get_cgi(char* uri, char* qry)
-//{
- char *qry;
- printf("muri uri: %s\n", uri);
- qry = strstr(uri, "?");
- if (!strncmp(uri, "i2cw?", 5)) { // i2cw [addr] [data] [data] [data] ...
- cmd_i2c_write(qry, data, resp);
- } else if (!strncmp(uri, "i2cr?", 5)) { // i2cr [addr] [count]
- cmd_i2c_read(qry, data, resp);
- } else if (!strncmp(uri, "i2car?", 6)) { // i2car [addr] [radd] [count]
- cmd_i2c_addr_read(qry, data, resp);
- } else if (!strncmp(uri, "pmdio?", 6)) { // pmdio [dir] [data]
- cmd_pmd_setio(qry, data, resp);
- } else if (!strncmp(uri, "pmdw?", 5)) { // pmdw [data]
- cmd_pmd_write(qry, data, resp);
- } else if (!strncmp(uri, "pmdr", 4)) { // pmdr
- cmd_pmd_read(qry, data, resp);
- } else if (!strncmp(uri, "pwmd?", 5)) { // pwmd [period] [width] [duration]
- cmd_pwm_set(qry, data, resp);
- } else {
- sprintf(resp, "501 %s", uri);
- }
- printf("muri resp: %s\n", resp);
-}
-
-
--- a/muri.h Fri Dec 06 03:59:01 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ - -//I2C i2c(p28, p27); - -void init_dio(); -void pwm_off(void const *arg); - -void cmd_i2c_write(char* qry, char* data, char* resp); -void cmd_i2c_read(char* qry, char* data, char* resp); -void cmd_i2c_addr_read(char* qry, char* data, char* resp); -void cmd_pmd_setio(char* qry, char* data, char* resp); -void cmd_pmd_write(char* qry, char* data, char* resp); -void cmd_pmd_read(char* qry, char* data, char* resp); -void cmd_pwm_set(char* qry, char* data, char* resp); -void muri(char* uri, char* data, char* resp); -
