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
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
- 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
main.cpp@2:f2d70f552a3e, 2015-06-29 (annotated)
- Committer:
- WizLeo
- Date:
- Mon Jun 29 07:36:30 2015 +0000
- Revision:
- 2:f2d70f552a3e
- Parent:
- 1:7d3ed406dd3d
- Child:
- 4:d645de922ae6
SD card file server with ethernet camera
Who changed what in which revision?
User | Revision | Line number | New 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 | |
WizLeo | 2:f2d70f552a3e | 22 | #define IP "192.168.217.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 | } |