In this example, the image data acquired from the camera is stored on the Micro SD card and displayed through a web browser.

Dependencies:   Ethernet_Camera_LS_Y201_SDcard SDFileSystem WIZnetInterface mbed

Fork of HTTP_SDcard_file_server_WIZwiki-W7500 by justin kim

Prerequisite

In this example, the image data acquired from the camera is stored on the Micro SD card and displayed through a web browser.

To implement this function, you need a Platform board, network Interface board, camera module.

This example uses LS-Y201 Camera module.

  • WIZwiki-W7500 from WIZnet (Platform board and Ethernet I/F board)
  • LS-Y201 (Camera module)
  • Micro SD Card

Hardware Configuration

/media/uploads/Ricky_Kwon/camera_ls-y201.png

  • connect Ethernet Cable & USB Cable
  • connect Camera module

Software

Init network information

#define IP      "192.168.0.100"
#define MASK    "255.255.255.0"
#define GATEWAY "192.168.0.1"
#define PORT    80

Caution

Must fix network information

Committer:
Ricky_Kwon
Date:
Wed Apr 12 08:38:23 2017 +0000
Revision:
4:d645de922ae6
Parent:
2:f2d70f552a3e
update all library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
azsymaivan 0:fbb29d9ea96b 1 #include "mbed.h"
azsymaivan 0:fbb29d9ea96b 2 #include "EthernetInterface.h"
WizLeo 2:f2d70f552a3e 3 #include "Camera_LS_Y201.h"
azsymaivan 0:fbb29d9ea96b 4 #include "SDFileSystem.h"
azsymaivan 0:fbb29d9ea96b 5
WizLeo 2:f2d70f552a3e 6 #define EnDebugMSG true //true-> print debug message to PC USB terminal, false->not print
azsymaivan 0:fbb29d9ea96b 7 #include "filelib.h"
WizLeo 2:f2d70f552a3e 8 #define DEBMSG printf
WizLeo 2:f2d70f552a3e 9 #define NEWLINE() printf("\r\n")
WizLeo 2:f2d70f552a3e 10
WizLeo 2:f2d70f552a3e 11 #define USE_SDCARD 1
WizLeo 2:f2d70f552a3e 12
WizLeo 2:f2d70f552a3e 13 #if USE_SDCARD
WizLeo 2:f2d70f552a3e 14 #define FILENAME "/wfs/IMG_%04d.jpg"
WizLeo 2:f2d70f552a3e 15 SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "wfs");
WizLeo 2:f2d70f552a3e 16 #else
WizLeo 2:f2d70f552a3e 17 #define FILENAME "/local/IMG_%04d.jpg"
WizLeo 2:f2d70f552a3e 18 LocalFileSystem fs("local");
WizLeo 2:f2d70f552a3e 19 #endif
WizLeo 2:f2d70f552a3e 20 Camera_LS_Y201 cam1(PA_14, PA_13);
azsymaivan 0:fbb29d9ea96b 21
Ricky_Kwon 4:d645de922ae6 22 #define IP "192.168.0.100"
azsymaivan 0:fbb29d9ea96b 23 #define MASK "255.255.255.0"
WizLeo 2:f2d70f552a3e 24 #define GATEWAY "192.168.0.1"
azsymaivan 0:fbb29d9ea96b 25 #define PORT 80
azsymaivan 0:fbb29d9ea96b 26
WizLeo 2:f2d70f552a3e 27 DigitalIn click(PC_1);
azsymaivan 0:fbb29d9ea96b 28 Serial pc (USBTX,USBRX); // tx, rx
azsymaivan 0:fbb29d9ea96b 29
azsymaivan 0:fbb29d9ea96b 30 char sMethod[7];
azsymaivan 0:fbb29d9ea96b 31 char sURL[250];
azsymaivan 0:fbb29d9ea96b 32 char sProtocol[8];
azsymaivan 0:fbb29d9ea96b 33
azsymaivan 0:fbb29d9ea96b 34 EthernetInterface eth;
azsymaivan 0:fbb29d9ea96b 35
azsymaivan 0:fbb29d9ea96b 36 TCPSocketServer svr;
azsymaivan 0:fbb29d9ea96b 37 bool serverIsListened = false;
azsymaivan 0:fbb29d9ea96b 38
azsymaivan 0:fbb29d9ea96b 39 TCPSocketConnection client;
azsymaivan 0:fbb29d9ea96b 40 bool clientIsConnected = false;
azsymaivan 0:fbb29d9ea96b 41
azsymaivan 0:fbb29d9ea96b 42 char sentBuffer[1608] = {}; // 2*536=1072, 3*536=1608, 4*536=2144 !1500
azsymaivan 0:fbb29d9ea96b 43 char line_response[256]= {0};
azsymaivan 0:fbb29d9ea96b 44 char file_path[256] = {0};
azsymaivan 0:fbb29d9ea96b 45
WizLeo 2:f2d70f552a3e 46 DigitalOut lede (PC_8);
WizLeo 2:f2d70f552a3e 47 DigitalOut led1 (PC_9); //server listning status
WizLeo 2:f2d70f552a3e 48 DigitalOut led2 (PC_5); //socket connecting status
azsymaivan 0:fbb29d9ea96b 49
azsymaivan 0:fbb29d9ea96b 50 Ticker ledTick;
azsymaivan 0:fbb29d9ea96b 51
WizLeo 2:f2d70f552a3e 52 typedef struct work {
WizLeo 2:f2d70f552a3e 53 FILE *fp;
WizLeo 2:f2d70f552a3e 54 } work_t;
WizLeo 2:f2d70f552a3e 55
WizLeo 2:f2d70f552a3e 56 work_t work;
WizLeo 2:f2d70f552a3e 57
WizLeo 2:f2d70f552a3e 58 int take_picture = 0;
WizLeo 2:f2d70f552a3e 59
WizLeo 2:f2d70f552a3e 60 /**
WizLeo 2:f2d70f552a3e 61 * Callback function for readJpegFileContent.
WizLeo 2:f2d70f552a3e 62 *
WizLeo 2:f2d70f552a3e 63 * @param buf A pointer to a buffer.
WizLeo 2:f2d70f552a3e 64 * @param siz A size of the buffer.
WizLeo 2:f2d70f552a3e 65 */
WizLeo 2:f2d70f552a3e 66 void callback_func(int done, int total, uint8_t *buf, size_t siz) {
WizLeo 2:f2d70f552a3e 67 fwrite(buf, siz, 1, work.fp);
WizLeo 2:f2d70f552a3e 68
WizLeo 2:f2d70f552a3e 69 static int n = 0;
WizLeo 2:f2d70f552a3e 70 int tmp = done * 100 / total;
WizLeo 2:f2d70f552a3e 71 if (n != tmp) {
WizLeo 2:f2d70f552a3e 72 n = tmp;
WizLeo 2:f2d70f552a3e 73 DEBMSG("Writing...: %3d%%", n);
WizLeo 2:f2d70f552a3e 74 NEWLINE();
WizLeo 2:f2d70f552a3e 75 }
WizLeo 2:f2d70f552a3e 76 }
WizLeo 2:f2d70f552a3e 77
WizLeo 2:f2d70f552a3e 78 /**
WizLeo 2:f2d70f552a3e 79 * Capture.
WizLeo 2:f2d70f552a3e 80 *
WizLeo 2:f2d70f552a3e 81 * @param cam A pointer to a camera object.
WizLeo 2:f2d70f552a3e 82 * @param filename The file name.
WizLeo 2:f2d70f552a3e 83 *
WizLeo 2:f2d70f552a3e 84 * @return Return 0 if it succeed.
WizLeo 2:f2d70f552a3e 85 */
WizLeo 2:f2d70f552a3e 86 int capture(Camera_LS_Y201 *cam, char *filename) {
WizLeo 2:f2d70f552a3e 87 /*
WizLeo 2:f2d70f552a3e 88 * Take a picture.
WizLeo 2:f2d70f552a3e 89 */
WizLeo 2:f2d70f552a3e 90 if (cam->takePicture() != 0) {
WizLeo 2:f2d70f552a3e 91 return -1;
WizLeo 2:f2d70f552a3e 92 }
WizLeo 2:f2d70f552a3e 93 DEBMSG("Captured.");
WizLeo 2:f2d70f552a3e 94 NEWLINE();
WizLeo 2:f2d70f552a3e 95
WizLeo 2:f2d70f552a3e 96 /*
WizLeo 2:f2d70f552a3e 97 * Open file.
WizLeo 2:f2d70f552a3e 98 */
WizLeo 2:f2d70f552a3e 99 work.fp = fopen(filename, "wb");
WizLeo 2:f2d70f552a3e 100 if (work.fp == NULL) {
WizLeo 2:f2d70f552a3e 101 return -2;
WizLeo 2:f2d70f552a3e 102 }
WizLeo 2:f2d70f552a3e 103
WizLeo 2:f2d70f552a3e 104 /*
WizLeo 2:f2d70f552a3e 105 * Read the content.
WizLeo 2:f2d70f552a3e 106 */
WizLeo 2:f2d70f552a3e 107 DEBMSG("%s", filename);
WizLeo 2:f2d70f552a3e 108 NEWLINE();
WizLeo 2:f2d70f552a3e 109 if (cam->readJpegFileContent(callback_func) != 0) {
WizLeo 2:f2d70f552a3e 110 fclose(work.fp);
WizLeo 2:f2d70f552a3e 111 return -3;
WizLeo 2:f2d70f552a3e 112 }
WizLeo 2:f2d70f552a3e 113 fclose(work.fp);
WizLeo 2:f2d70f552a3e 114
WizLeo 2:f2d70f552a3e 115 /*
WizLeo 2:f2d70f552a3e 116 * Stop taking pictures.
WizLeo 2:f2d70f552a3e 117 */
WizLeo 2:f2d70f552a3e 118 cam->stopTakingPictures();
WizLeo 2:f2d70f552a3e 119
WizLeo 2:f2d70f552a3e 120 return 0;
WizLeo 2:f2d70f552a3e 121 }
WizLeo 2:f2d70f552a3e 122
azsymaivan 0:fbb29d9ea96b 123 void ledTickfunc()
azsymaivan 0:fbb29d9ea96b 124 {
azsymaivan 0:fbb29d9ea96b 125 if(serverIsListened) {
azsymaivan 0:fbb29d9ea96b 126 led1 = !led1;
azsymaivan 0:fbb29d9ea96b 127 } else {
azsymaivan 0:fbb29d9ea96b 128 led1 = false;
azsymaivan 0:fbb29d9ea96b 129 }
azsymaivan 0:fbb29d9ea96b 130 }
azsymaivan 0:fbb29d9ea96b 131
azsymaivan 0:fbb29d9ea96b 132 void send_HTTP_header(char* protocol, int code, char* title, char* mime_type, long long lengthBody)
azsymaivan 0:fbb29d9ea96b 133 {
azsymaivan 0:fbb29d9ea96b 134 snprintf(line_response, sizeof(line_response),"%s %d %s\r\n", protocol, code, title );
azsymaivan 0:fbb29d9ea96b 135 snprintf(sentBuffer, sizeof(sentBuffer),"%s",line_response);
azsymaivan 0:fbb29d9ea96b 136
azsymaivan 0:fbb29d9ea96b 137 if ( mime_type != NULL ) {
azsymaivan 0:fbb29d9ea96b 138 snprintf(line_response, sizeof(line_response), "Content-Type: %s\r\n", mime_type );
azsymaivan 0:fbb29d9ea96b 139 snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer
azsymaivan 0:fbb29d9ea96b 140 }
azsymaivan 0:fbb29d9ea96b 141 if ( lengthBody >= 0 ) {
azsymaivan 0:fbb29d9ea96b 142 snprintf(line_response, sizeof(line_response), "Content-Length: %lld\r\n", lengthBody );
azsymaivan 0:fbb29d9ea96b 143 snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer
azsymaivan 0:fbb29d9ea96b 144 }
azsymaivan 0:fbb29d9ea96b 145 snprintf(line_response, sizeof(line_response), "Connection: close\r\n" );
azsymaivan 0:fbb29d9ea96b 146 snprintf(sentBuffer, sizeof(sentBuffer),"%s%s\r\n",sentBuffer,line_response); //append to sentBuffer
azsymaivan 0:fbb29d9ea96b 147
azsymaivan 0:fbb29d9ea96b 148 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 149 printf("\r\n-->sent Header--\r\n");
azsymaivan 0:fbb29d9ea96b 150
azsymaivan 0:fbb29d9ea96b 151 client.send_all(sentBuffer,strlen(sentBuffer));
azsymaivan 0:fbb29d9ea96b 152 if (EnDebugMSG) {
azsymaivan 0:fbb29d9ea96b 153 printf(sentBuffer);
WizLeo 2:f2d70f552a3e 154 printf("\r\n--end Header-- bytes:%d",strlen(sentBuffer));
azsymaivan 0:fbb29d9ea96b 155 }
justinkim 1:7d3ed406dd3d 156 wait(0.2); //200ms important for browser!
azsymaivan 0:fbb29d9ea96b 157 }
azsymaivan 0:fbb29d9ea96b 158
azsymaivan 0:fbb29d9ea96b 159 void send_HTML_line(char* line, unsigned int length_line)
azsymaivan 0:fbb29d9ea96b 160 {
azsymaivan 0:fbb29d9ea96b 161 client.send_all(line,length_line);
azsymaivan 0:fbb29d9ea96b 162 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 163 printf("\r\n-->send HTML line:\r\n%s ...Ok!",line);
justinkim 1:7d3ed406dd3d 164 wait(0.01);
azsymaivan 0:fbb29d9ea96b 165 }
azsymaivan 0:fbb29d9ea96b 166
azsymaivan 0:fbb29d9ea96b 167 void send_HTML_error( int status_code, char* title, char* body_text)
azsymaivan 0:fbb29d9ea96b 168 {
azsymaivan 0:fbb29d9ea96b 169 send_HTTP_header("HTTP/1.1", status_code, title, "text/html", -1);
azsymaivan 0:fbb29d9ea96b 170 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 171 printf("\r\n-->send_error...\r\n");
azsymaivan 0:fbb29d9ea96b 172 sentBuffer[0]=NULL; //clear buffer
azsymaivan 0:fbb29d9ea96b 173 sprintf(line_response, "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<title>%d %s</title>\r\n</head>\r\n", status_code, title);
azsymaivan 0:fbb29d9ea96b 174 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 175 sprintf(line_response, "<body><center><h2><center>%d %s</center></h2>\r\n",status_code, title );
azsymaivan 0:fbb29d9ea96b 176 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 177 sprintf(line_response, "%s\r\n", body_text );
azsymaivan 0:fbb29d9ea96b 178 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 179 sprintf(line_response, "<p>mbed HTTP File Server</p>\r\n</center></body></html>\r\n");
azsymaivan 0:fbb29d9ea96b 180 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 181 send_HTML_line(sentBuffer, strlen(sentBuffer));
azsymaivan 0:fbb29d9ea96b 182 }
azsymaivan 0:fbb29d9ea96b 183
azsymaivan 0:fbb29d9ea96b 184 int send_file(char *path_file)
azsymaivan 0:fbb29d9ea96b 185 {
azsymaivan 0:fbb29d9ea96b 186 char *mime_type = {0};
azsymaivan 0:fbb29d9ea96b 187 unsigned int bytes_for_send=0;
azsymaivan 0:fbb29d9ea96b 188 long long filesize, all_send_bytes = 0;
azsymaivan 0:fbb29d9ea96b 189
azsymaivan 0:fbb29d9ea96b 190 mime_type = get_mime_type( path_file );
azsymaivan 0:fbb29d9ea96b 191 snprintf(file_path, sizeof(file_path),"/wfs/%s",path_file);
WizLeo 2:f2d70f552a3e 192
WizLeo 2:f2d70f552a3e 193 if (strcmp(file_path,"/wfs//take_a_picture.jpg") == 0)
WizLeo 2:f2d70f552a3e 194 take_picture = 1;
WizLeo 2:f2d70f552a3e 195 else take_picture = 0;
WizLeo 2:f2d70f552a3e 196
azsymaivan 0:fbb29d9ea96b 197 if (EnDebugMSG) {
WizLeo 2:f2d70f552a3e 198 printf("\r\n-->from send_file:%s",file_path);
WizLeo 2:f2d70f552a3e 199 printf("\r\n-->from send_file mime type:%s",mime_type);
azsymaivan 0:fbb29d9ea96b 200 }
azsymaivan 0:fbb29d9ea96b 201
azsymaivan 0:fbb29d9ea96b 202 if (Mystat(path_file, &myStatBuf)) { //fault with file
azsymaivan 0:fbb29d9ea96b 203 send_HTML_error( 403, "Forbidden", "403 - File access forbidden.");
azsymaivan 0:fbb29d9ea96b 204 return 403;
azsymaivan 0:fbb29d9ea96b 205 }
azsymaivan 0:fbb29d9ea96b 206 FILE* fp = NULL;
azsymaivan 0:fbb29d9ea96b 207 fp = fopen(file_path,"r");
azsymaivan 0:fbb29d9ea96b 208 if (fp==NULL ) {
azsymaivan 0:fbb29d9ea96b 209 send_HTML_error( 403, "Forbidden", "403 - File access forbidden.");
azsymaivan 0:fbb29d9ea96b 210 return 403;
azsymaivan 0:fbb29d9ea96b 211 }
azsymaivan 0:fbb29d9ea96b 212
azsymaivan 0:fbb29d9ea96b 213 filesize = myStatBuf.st_size;
azsymaivan 0:fbb29d9ea96b 214 send_HTTP_header("HTTP/1.1", 200, "Ok", mime_type, myStatBuf.st_size);
azsymaivan 0:fbb29d9ea96b 215 //binary send
azsymaivan 0:fbb29d9ea96b 216 all_send_bytes=0;
azsymaivan 0:fbb29d9ea96b 217 while(filesize) { //check for EOF !feof(fp)
azsymaivan 0:fbb29d9ea96b 218 bytes_for_send = filesize;
azsymaivan 0:fbb29d9ea96b 219 if (bytes_for_send > sizeof(sentBuffer)) {
azsymaivan 0:fbb29d9ea96b 220 bytes_for_send = sizeof(sentBuffer);
azsymaivan 0:fbb29d9ea96b 221 }
azsymaivan 0:fbb29d9ea96b 222 fread (sentBuffer,1,bytes_for_send,fp);
azsymaivan 0:fbb29d9ea96b 223 filesize -= bytes_for_send;
azsymaivan 0:fbb29d9ea96b 224 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 225 printf("\r\n---bytes_for_send...%d",bytes_for_send);
azsymaivan 0:fbb29d9ea96b 226 client.send_all(sentBuffer,bytes_for_send);
azsymaivan 0:fbb29d9ea96b 227 //Thread::wait(10);
azsymaivan 0:fbb29d9ea96b 228 all_send_bytes += bytes_for_send;
azsymaivan 0:fbb29d9ea96b 229 }
azsymaivan 0:fbb29d9ea96b 230 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 231 printf("\r\n---buffer fill end - all ...%lld", all_send_bytes);
azsymaivan 0:fbb29d9ea96b 232 //binary send
azsymaivan 0:fbb29d9ea96b 233
azsymaivan 0:fbb29d9ea96b 234 sprintf(line_response, "\r\n");
azsymaivan 0:fbb29d9ea96b 235 client.send_all(line_response,strlen(line_response));
azsymaivan 0:fbb29d9ea96b 236 if ( fp != NULL )
azsymaivan 0:fbb29d9ea96b 237 fclose(fp);
azsymaivan 0:fbb29d9ea96b 238 //Thread::wait(10);
azsymaivan 0:fbb29d9ea96b 239 return 0;
azsymaivan 0:fbb29d9ea96b 240 }
azsymaivan 0:fbb29d9ea96b 241
azsymaivan 0:fbb29d9ea96b 242 int send_directory(char *path)
azsymaivan 0:fbb29d9ea96b 243 {
azsymaivan 0:fbb29d9ea96b 244 char process_name[64]= {0};
azsymaivan 0:fbb29d9ea96b 245
azsymaivan 0:fbb29d9ea96b 246 char posOfLastSlash;
azsymaivan 0:fbb29d9ea96b 247 char *pLS;
azsymaivan 0:fbb29d9ea96b 248
azsymaivan 0:fbb29d9ea96b 249 struct dirent *p;
azsymaivan 0:fbb29d9ea96b 250 struct sMystat sb;
azsymaivan 0:fbb29d9ea96b 251 struct tm *timeinfo;
azsymaivan 0:fbb29d9ea96b 252 char timeBuf[40];
azsymaivan 0:fbb29d9ea96b 253
azsymaivan 0:fbb29d9ea96b 254 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 255 printf("\r\n-->from send_directory:%s",path);
azsymaivan 0:fbb29d9ea96b 256 snprintf(file_path,sizeof(file_path),"/wfs%s",path);
azsymaivan 0:fbb29d9ea96b 257 DIR *d = opendir(file_path);
azsymaivan 0:fbb29d9ea96b 258 if (EnDebugMSG && d!=NULL)
WizLeo 2:f2d70f552a3e 259 printf("\r\n-->from send_directory:%s ...open OK",file_path);
azsymaivan 0:fbb29d9ea96b 260 if (d==NULL) { //error open dir
azsymaivan 0:fbb29d9ea96b 261 send_HTML_error( 403, "Forbidden", "403 - Directory access forbidden.");
azsymaivan 0:fbb29d9ea96b 262 return -1;
azsymaivan 0:fbb29d9ea96b 263 }
azsymaivan 0:fbb29d9ea96b 264 send_HTTP_header("HTTP/1.1", 200, "Ok",NULL, -1);
azsymaivan 0:fbb29d9ea96b 265 sentBuffer[0]=NULL;
azsymaivan 0:fbb29d9ea96b 266 sprintf(line_response,"<!DOCTYPE html>\r\n<html>\n<head><title>Index of %s</title>\n",path);
azsymaivan 0:fbb29d9ea96b 267 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 268
azsymaivan 0:fbb29d9ea96b 269 sprintf(line_response,"<meta content=\"text/html; charset=iso-8859-1\" http-equiv=\"Content-Type\"></head>\n");
azsymaivan 0:fbb29d9ea96b 270 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 271
azsymaivan 0:fbb29d9ea96b 272
azsymaivan 0:fbb29d9ea96b 273 sprintf(line_response,"<body><center>\n<h3>Index of %s</h3>\n", path);
azsymaivan 0:fbb29d9ea96b 274 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 275 send_HTML_line(sentBuffer, strlen(sentBuffer));
azsymaivan 0:fbb29d9ea96b 276 //begin table
azsymaivan 0:fbb29d9ea96b 277 sentBuffer[0]=NULL; //clear buffer
azsymaivan 0:fbb29d9ea96b 278 sprintf(line_response,"<table border=\"0\">\n");
azsymaivan 0:fbb29d9ea96b 279 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 280 sprintf(line_response,"<tr><th align=\"left\" width=\"200\">Name</th><th align=\"right\" width=\"100\">Size(bytes)</th><th align=\"right\" width=\"200\">Date/Time</th></tr>\n");
azsymaivan 0:fbb29d9ea96b 281 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 282 //begin table
azsymaivan 0:fbb29d9ea96b 283
azsymaivan 0:fbb29d9ea96b 284 pLS=strrchr(path,'/');
azsymaivan 0:fbb29d9ea96b 285 posOfLastSlash=pLS-path+1;
azsymaivan 0:fbb29d9ea96b 286 if (EnDebugMSG)
azsymaivan 0:fbb29d9ea96b 287 printf("\r\n>>posOfLastSlash=%d",posOfLastSlash);
azsymaivan 0:fbb29d9ea96b 288 snprintf(process_name,posOfLastSlash+1,"%s",path);
azsymaivan 0:fbb29d9ea96b 289 if (EnDebugMSG)
azsymaivan 0:fbb29d9ea96b 290 printf("\r\n>>process_name=%s",process_name);
azsymaivan 0:fbb29d9ea96b 291 sprintf(line_response,"<tr><td align=\"left\"><a href=\"%s\">../</a></td></tr>\n",process_name);
azsymaivan 0:fbb29d9ea96b 292 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 293 while((p = readdir(d)) != NULL) {
azsymaivan 0:fbb29d9ea96b 294 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 295 printf("\r\n :%s",p->d_name);
azsymaivan 0:fbb29d9ea96b 296 sprintf(file_path,"%s/%s",path,p->d_name);
azsymaivan 0:fbb29d9ea96b 297 Mystat( file_path, &sb );
azsymaivan 0:fbb29d9ea96b 298 if (get_dirInfo(file_path)==0 ) { //this is directory path
azsymaivan 0:fbb29d9ea96b 299 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 300 printf("\r\nDIR");
azsymaivan 0:fbb29d9ea96b 301 sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">%s</a><br></td></tr>\n",file_path,p->d_name);
azsymaivan 0:fbb29d9ea96b 302 if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent
azsymaivan 0:fbb29d9ea96b 303 send_HTML_line(sentBuffer, strlen(sentBuffer));
azsymaivan 0:fbb29d9ea96b 304 sentBuffer[0]=NULL; //clear buffer
azsymaivan 0:fbb29d9ea96b 305 }
azsymaivan 0:fbb29d9ea96b 306 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 307
azsymaivan 0:fbb29d9ea96b 308 } else { //this is file
azsymaivan 0:fbb29d9ea96b 309 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 310 printf("\r\nFILE");
azsymaivan 0:fbb29d9ea96b 311 timeinfo = localtime (&sb.st_mtime);
azsymaivan 0:fbb29d9ea96b 312 //strftime(timeBuf,40, "%I:%M:%S %p (%Y/%m/%d)\r\n", localtime(&sb.st_mtime));
azsymaivan 0:fbb29d9ea96b 313 strftime(timeBuf, 40, "%c", timeinfo);
azsymaivan 0:fbb29d9ea96b 314 sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">%s</a></td><td align=\"right\">%lld</td><td align=\"right\">%s</td></tr>\n", file_path, p->d_name,(long long) sb.st_size,timeBuf); // asctime(timeinfo) );
azsymaivan 0:fbb29d9ea96b 315
azsymaivan 0:fbb29d9ea96b 316 if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent
azsymaivan 0:fbb29d9ea96b 317 send_HTML_line(sentBuffer, strlen(sentBuffer));
azsymaivan 0:fbb29d9ea96b 318 sentBuffer[0]=NULL; //clear buffer
azsymaivan 0:fbb29d9ea96b 319 }
azsymaivan 0:fbb29d9ea96b 320 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
azsymaivan 0:fbb29d9ea96b 321 }
azsymaivan 0:fbb29d9ea96b 322 }
azsymaivan 0:fbb29d9ea96b 323 send_HTML_line(sentBuffer, strlen(sentBuffer));
azsymaivan 0:fbb29d9ea96b 324 closedir(d);
azsymaivan 0:fbb29d9ea96b 325
azsymaivan 0:fbb29d9ea96b 326 sprintf(line_response, "</table>\n<br><h4>mbed HTTP File Server</h4>\n</center></body></html>\n");
azsymaivan 0:fbb29d9ea96b 327 send_HTML_line(line_response, strlen(line_response));
azsymaivan 0:fbb29d9ea96b 328
azsymaivan 0:fbb29d9ea96b 329 return 0;
azsymaivan 0:fbb29d9ea96b 330 }
azsymaivan 0:fbb29d9ea96b 331
azsymaivan 0:fbb29d9ea96b 332 void parseHTTPRequest(char* buffer)
azsymaivan 0:fbb29d9ea96b 333 {
azsymaivan 0:fbb29d9ea96b 334 char spacePos;
azsymaivan 0:fbb29d9ea96b 335 char *tmpBuffer;
azsymaivan 0:fbb29d9ea96b 336 spacePos = strcspn(buffer, " ") + 1; //position of first space character
azsymaivan 0:fbb29d9ea96b 337 snprintf(sMethod, spacePos,"%s", buffer);
azsymaivan 0:fbb29d9ea96b 338
azsymaivan 0:fbb29d9ea96b 339 //get Protocol
azsymaivan 0:fbb29d9ea96b 340 tmpBuffer=&(buffer[spacePos]); //move pointer to buffer (delete Method)
azsymaivan 0:fbb29d9ea96b 341 spacePos = strcspn(tmpBuffer, "\r\n") + 1;
azsymaivan 0:fbb29d9ea96b 342 tmpBuffer[spacePos]='\0'; //set end of string ...cut
azsymaivan 0:fbb29d9ea96b 343 sprintf(sProtocol, "%s", strrchr(tmpBuffer,' ')); //get string after last (space )
azsymaivan 0:fbb29d9ea96b 344 printf("\r\nsProtocol:%s", tmpBuffer);
azsymaivan 0:fbb29d9ea96b 345 buffer = &(sProtocol[1]); //cut first character (space)
azsymaivan 0:fbb29d9ea96b 346 sprintf(sProtocol, "%s", buffer);
azsymaivan 0:fbb29d9ea96b 347
azsymaivan 0:fbb29d9ea96b 348 //get URL
azsymaivan 0:fbb29d9ea96b 349 snprintf(sURL,strlen(tmpBuffer)-strlen(sProtocol),"%s\r\n", tmpBuffer); //URL is between Method and Protocol
azsymaivan 0:fbb29d9ea96b 350
WizLeo 2:f2d70f552a3e 351 printf("\r\nParse Method:%s",sMethod);
WizLeo 2:f2d70f552a3e 352 printf("\r\nParse URL:%s",sURL);
WizLeo 2:f2d70f552a3e 353 printf("\r\nParse PROTOCOL:%s",sProtocol);
azsymaivan 0:fbb29d9ea96b 354 printf("\n\r\n");
azsymaivan 0:fbb29d9ea96b 355 }
azsymaivan 0:fbb29d9ea96b 356
azsymaivan 0:fbb29d9ea96b 357 int processHTTP(char* sMethod, char* sURL, char* sProtocol)
azsymaivan 0:fbb29d9ea96b 358 {
azsymaivan 0:fbb29d9ea96b 359 int gdi, gfi; //status of get_dir_info(xxx), and get_file_info(xxx)
azsymaivan 0:fbb29d9ea96b 360
azsymaivan 0:fbb29d9ea96b 361 if (strcmp(sMethod,"GET")!=0) {
azsymaivan 0:fbb29d9ea96b 362 send_HTML_error( 501, "501 Not Implemented", "501 - The server either does not recognize the request method");
azsymaivan 0:fbb29d9ea96b 363 return 501;
azsymaivan 0:fbb29d9ea96b 364 }
azsymaivan 0:fbb29d9ea96b 365 if (sURL[0]!= '/') {
azsymaivan 0:fbb29d9ea96b 366 send_HTML_error( 400, "Bad Request", "400 - The request cannot be fulfilled due to bad syntax.");
azsymaivan 0:fbb29d9ea96b 367 return 400;
azsymaivan 0:fbb29d9ea96b 368 }
azsymaivan 0:fbb29d9ea96b 369 if (sURL[strlen(sURL)-1]=='/') {
azsymaivan 0:fbb29d9ea96b 370 sURL[strlen(sURL)-1]=sURL[strlen(sURL)]; //delete last symbol
azsymaivan 0:fbb29d9ea96b 371 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 372 printf("\r\n delete last:%s",sURL);
azsymaivan 0:fbb29d9ea96b 373 }
azsymaivan 0:fbb29d9ea96b 374 gdi= get_dirInfo(sURL);
azsymaivan 0:fbb29d9ea96b 375 gfi= get_fileInfo(sURL);
azsymaivan 0:fbb29d9ea96b 376 if (gfi!=0) { //!=0 file not found
azsymaivan 0:fbb29d9ea96b 377 if (gdi==0) { //0-ok this is directory
azsymaivan 0:fbb29d9ea96b 378 return send_directory(sURL);
azsymaivan 0:fbb29d9ea96b 379 }
azsymaivan 0:fbb29d9ea96b 380 if (EnDebugMSG)
WizLeo 2:f2d70f552a3e 381 printf("\r\n404-br File not found or...(Fresult is:%d)",gfi);
azsymaivan 0:fbb29d9ea96b 382 send_HTML_error( 404, "Not Found","404 - The requested resource could not be found.");
azsymaivan 0:fbb29d9ea96b 383 return 404;
azsymaivan 0:fbb29d9ea96b 384 } else { //==0 found
azsymaivan 0:fbb29d9ea96b 385 if (gdi==0) //0-ok this is directory
azsymaivan 0:fbb29d9ea96b 386 return send_directory(sURL);
azsymaivan 0:fbb29d9ea96b 387 else
azsymaivan 0:fbb29d9ea96b 388 return send_file(sURL);
azsymaivan 0:fbb29d9ea96b 389 }
azsymaivan 0:fbb29d9ea96b 390 }
azsymaivan 0:fbb29d9ea96b 391
azsymaivan 0:fbb29d9ea96b 392 int main()
azsymaivan 0:fbb29d9ea96b 393 {
WizLeo 2:f2d70f552a3e 394 DEBMSG("Camera module");
WizLeo 2:f2d70f552a3e 395 NEWLINE();
WizLeo 2:f2d70f552a3e 396 DEBMSG("Resetting...");
WizLeo 2:f2d70f552a3e 397 NEWLINE();
WizLeo 2:f2d70f552a3e 398 lede = true;
WizLeo 2:f2d70f552a3e 399 if (cam1.reset() == 0) {
WizLeo 2:f2d70f552a3e 400 DEBMSG("Reset OK.");
WizLeo 2:f2d70f552a3e 401 NEWLINE();
WizLeo 2:f2d70f552a3e 402 } else {
WizLeo 2:f2d70f552a3e 403 DEBMSG("Reset fail.");
WizLeo 2:f2d70f552a3e 404 NEWLINE();
WizLeo 2:f2d70f552a3e 405 error("Reset fail.");
WizLeo 2:f2d70f552a3e 406 lede = false;
WizLeo 2:f2d70f552a3e 407 }
azsymaivan 0:fbb29d9ea96b 408
WizLeo 2:f2d70f552a3e 409 if (cam1.setImageSize() == 0) {
WizLeo 2:f2d70f552a3e 410 DEBMSG("Set image OK.");
WizLeo 2:f2d70f552a3e 411 NEWLINE();
WizLeo 2:f2d70f552a3e 412 } else {
WizLeo 2:f2d70f552a3e 413 DEBMSG("Set image fail.");
WizLeo 2:f2d70f552a3e 414 NEWLINE();
WizLeo 2:f2d70f552a3e 415 error("Set image fail.");
WizLeo 2:f2d70f552a3e 416 lede = false;
WizLeo 2:f2d70f552a3e 417 }
WizLeo 2:f2d70f552a3e 418 wait(1);
WizLeo 2:f2d70f552a3e 419
WizLeo 2:f2d70f552a3e 420 int cnt = 0;
WizLeo 2:f2d70f552a3e 421 while (cnt < 2) {
WizLeo 2:f2d70f552a3e 422 lede = false;
WizLeo 2:f2d70f552a3e 423 char fname[64];
WizLeo 2:f2d70f552a3e 424 snprintf(fname, sizeof(fname) - 1, FILENAME, cnt);
WizLeo 2:f2d70f552a3e 425 int r = capture(&cam1, fname);
WizLeo 2:f2d70f552a3e 426 if (r == 0) {
WizLeo 2:f2d70f552a3e 427 DEBMSG("[%04d]:OK.", cnt);
WizLeo 2:f2d70f552a3e 428 NEWLINE();
WizLeo 2:f2d70f552a3e 429 } else {
WizLeo 2:f2d70f552a3e 430 DEBMSG("[%04d]:NG. (code=%d)", cnt, r);
WizLeo 2:f2d70f552a3e 431 NEWLINE();
WizLeo 2:f2d70f552a3e 432 error("Failure.");
WizLeo 2:f2d70f552a3e 433 }
WizLeo 2:f2d70f552a3e 434 cnt++;
WizLeo 2:f2d70f552a3e 435 }
WizLeo 2:f2d70f552a3e 436 lede = true;
justinkim 1:7d3ed406dd3d 437 uint8_t MAC_Addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0x02};
azsymaivan 0:fbb29d9ea96b 438 ledTick.attach(&ledTickfunc,0.5);
azsymaivan 0:fbb29d9ea96b 439 //ledTick.detach();
azsymaivan 0:fbb29d9ea96b 440 //setup ethernet interface
azsymaivan 0:fbb29d9ea96b 441 //eth.init(); //Use DHCP
justinkim 1:7d3ed406dd3d 442 eth.init(MAC_Addr,IP,MASK,GATEWAY); //MAC,IP,mask,Gateway
azsymaivan 0:fbb29d9ea96b 443 eth.connect();
azsymaivan 0:fbb29d9ea96b 444 printf("IP Address is %s\n\r", eth.getIPAddress());
azsymaivan 0:fbb29d9ea96b 445
azsymaivan 0:fbb29d9ea96b 446 //setup tcp socket
azsymaivan 0:fbb29d9ea96b 447 if(svr.bind(PORT)< 0) {
azsymaivan 0:fbb29d9ea96b 448 printf("tcp server bind failed.\n\r");
azsymaivan 0:fbb29d9ea96b 449 return -1;
azsymaivan 0:fbb29d9ea96b 450 } else {
azsymaivan 0:fbb29d9ea96b 451 printf("tcp server bind successed.\n\r");
azsymaivan 0:fbb29d9ea96b 452 serverIsListened = true;
azsymaivan 0:fbb29d9ea96b 453 }
azsymaivan 0:fbb29d9ea96b 454
azsymaivan 0:fbb29d9ea96b 455 if(svr.listen(1) < 0) {
azsymaivan 0:fbb29d9ea96b 456 printf("tcp server listen failed.\n\r");
azsymaivan 0:fbb29d9ea96b 457 return -1;
azsymaivan 0:fbb29d9ea96b 458 } else {
azsymaivan 0:fbb29d9ea96b 459 printf("tcp server is listening...\n\r");
azsymaivan 0:fbb29d9ea96b 460 }
azsymaivan 0:fbb29d9ea96b 461
azsymaivan 0:fbb29d9ea96b 462 //listening for http GET request
azsymaivan 0:fbb29d9ea96b 463 while (serverIsListened) {
azsymaivan 0:fbb29d9ea96b 464 //blocking mode(never timeout)
azsymaivan 0:fbb29d9ea96b 465 if(svr.accept(client)<0) {
azsymaivan 0:fbb29d9ea96b 466 printf("failed to accept connection.\n\r");
azsymaivan 0:fbb29d9ea96b 467 } else {
azsymaivan 0:fbb29d9ea96b 468 //client.set_blocking(false,5000); //5000=5sec
WizLeo 2:f2d70f552a3e 469
WizLeo 2:f2d70f552a3e 470 lede = true;
azsymaivan 0:fbb29d9ea96b 471 printf("connection success!\n\rIP: %s\n\r",client.get_address());
azsymaivan 0:fbb29d9ea96b 472 clientIsConnected = true;
azsymaivan 0:fbb29d9ea96b 473 led2 = true;
azsymaivan 0:fbb29d9ea96b 474 while(clientIsConnected) {
azsymaivan 0:fbb29d9ea96b 475 char buffer[1024] = {};
azsymaivan 0:fbb29d9ea96b 476 switch(client.receive(buffer, 1023)) {
azsymaivan 0:fbb29d9ea96b 477 case 0:
azsymaivan 0:fbb29d9ea96b 478 printf("recieved buffer is empty.\n\r");
azsymaivan 0:fbb29d9ea96b 479 clientIsConnected = false;
azsymaivan 0:fbb29d9ea96b 480 break;
azsymaivan 0:fbb29d9ea96b 481 case -1:
azsymaivan 0:fbb29d9ea96b 482 printf("failed to read data from client.\n\r");
azsymaivan 0:fbb29d9ea96b 483 clientIsConnected = false;
azsymaivan 0:fbb29d9ea96b 484 break;
azsymaivan 0:fbb29d9ea96b 485 default:
azsymaivan 0:fbb29d9ea96b 486 printf("Recieved Data: %d\n\r\n\r%.*s\n\r",strlen(buffer),strlen(buffer),buffer);
azsymaivan 0:fbb29d9ea96b 487 parseHTTPRequest(buffer);
azsymaivan 0:fbb29d9ea96b 488 //if(buffer[0] == 'G' && buffer[1] == 'E' && buffer[2] == 'T' ) {
azsymaivan 0:fbb29d9ea96b 489 if (strcmp(sMethod, "GET" ) == 0 ) {
azsymaivan 0:fbb29d9ea96b 490 printf("GET request incomming.\n\r");
azsymaivan 0:fbb29d9ea96b 491 processHTTP(sMethod, sURL, sProtocol);
azsymaivan 0:fbb29d9ea96b 492 clientIsConnected = false;
azsymaivan 0:fbb29d9ea96b 493 }//if get
azsymaivan 0:fbb29d9ea96b 494 break;
azsymaivan 0:fbb29d9ea96b 495 } //switch
azsymaivan 0:fbb29d9ea96b 496 //ledTick.attach(&ledTickfunc,0.5);
azsymaivan 0:fbb29d9ea96b 497 }//while
azsymaivan 0:fbb29d9ea96b 498 printf("close connection.\n\rHTTP server is listening...\n\r\n");
azsymaivan 0:fbb29d9ea96b 499 client.close();
justinkim 1:7d3ed406dd3d 500 wait(0.05);
WizLeo 2:f2d70f552a3e 501
WizLeo 2:f2d70f552a3e 502 if (take_picture) {
WizLeo 2:f2d70f552a3e 503 ledTick.detach();
WizLeo 2:f2d70f552a3e 504 lede = false;
WizLeo 2:f2d70f552a3e 505 char fname[64];
WizLeo 2:f2d70f552a3e 506 snprintf(fname, sizeof(fname) - 1, FILENAME, cnt);
WizLeo 2:f2d70f552a3e 507 int r = capture(&cam1, fname);
WizLeo 2:f2d70f552a3e 508 if (r == 0) {
WizLeo 2:f2d70f552a3e 509 DEBMSG("[%04d]:OK.", cnt); NEWLINE();
WizLeo 2:f2d70f552a3e 510 } else {
WizLeo 2:f2d70f552a3e 511 DEBMSG("[%04d]:NG. (code=%d)", cnt, r); NEWLINE();
WizLeo 2:f2d70f552a3e 512 error("Failure.");
WizLeo 2:f2d70f552a3e 513 }
WizLeo 2:f2d70f552a3e 514 cnt++;
WizLeo 2:f2d70f552a3e 515 ledTick.attach(&ledTickfunc,0.5);
WizLeo 2:f2d70f552a3e 516 take_picture = 0;
WizLeo 2:f2d70f552a3e 517 }
WizLeo 2:f2d70f552a3e 518
azsymaivan 0:fbb29d9ea96b 519 led2 = false;
azsymaivan 0:fbb29d9ea96b 520 }
WizLeo 2:f2d70f552a3e 521
azsymaivan 0:fbb29d9ea96b 522 }
azsymaivan 0:fbb29d9ea96b 523 }