this camera C328 http sdcard file server example is for academy
Dependencies: CameraC328 SDFileSystem WIZnetInterface mbed
Insert below jpg file in your SDcard to take a picture in Web Server /media/uploads/IOP/take_a_picture.zip
main.cpp
- Committer:
- IOP
- Date:
- 2015-08-05
- Revision:
- 2:4dfa60f33178
- Parent:
- 1:a878f7545221
- Child:
- 3:e6025c5b25e4
File content as of revision 2:4dfa60f33178:
#include "mbed.h"
#include "EthernetInterface.h"
#include "SDFileSystem.h"
#include "CameraC328.h"
#define EnDebugMSG false //true-> print debug message to PC USB terminal, false->not print
#include "filelib.h"
/*
* Set IP
*/
#define IP "192.168.240.100"
#define MASK "255.255.255.0"
#define GATEWAY "192.168.240.1"
#define PORT 80
Serial pc (USBTX,USBRX); // tx, rx
SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "wfs"); // the pinout on the mbed
CameraC328 camera(PA_13, PA_14, CameraC328::Baud115200); // camera pin set
char sMethod[7];
char sURL[250];
char sProtocol[8];
/*
* Camera C328 define
*/
#define USE_JPEG_HIGH_RESOLUTION 1
int take_picture = 0;
/*
* Camera C328 Variables.
*/
static const int CAPTURE_FRAMES = 2;
static FILE *fp_jpeg;
/**
* A callback function for jpeg images.
* You can block this function until saving the image datas.
*
* @param buf A pointer to the image buffer.
* @param siz A size of the image buffer.
*/
void jpeg_callback(char *buf, size_t siz) {
for (int i = 0; i < (int)siz; i++) {
fprintf(fp_jpeg, "%c", buf[i]);
}
}
/**
* Camera C328 Synchronizing.
*/
void sync(void) {
CameraC328::ErrorNumber err = CameraC328::NoError;
err = camera.sync();
if (CameraC328::NoError == err) {
printf("[Camera Initializing..]\r\n");
printf("[ OK ] : CameraC328::sync\r\n");
} else {
printf("[Camera Initializing..]\r\n");
printf("[FAIL] : CameraC328::sync (Error=%02X)\r\n", (int)err);
}
}
/**
* Camera C328 function for jpeg snapshot picture.
*/
void test_jpeg_snapshot_picture(void) {
CameraC328::ErrorNumber err = CameraC328::NoError;
#if USE_JPEG_HIGH_RESOLUTION
err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
#else
err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution320x240);
#endif
if (CameraC328::NoError == err) {
printf("[ OK ] : CameraC328::init\r\n");
printf("\r\n[Start taking a picture]\r\n");
} else {
printf("[FAIL] : CameraC328::init (Error=%02X)\r\n", (int)err);
}
for (int i = 0; i < CAPTURE_FRAMES; i++) {
char fname[64];
snprintf(fname, sizeof(fname), "/wfs/Snapshot%02d.jpg",i);
fp_jpeg = fopen(fname, "w");
err = camera.getJpegSnapshotPicture(jpeg_callback); // call the snapshot function
if (CameraC328::NoError == err) {
printf("[ OK ] : CameraC328::getJpegSnapshotPicture[%d]\r\n",i);
} else {
printf("[FAIL] : CameraC328::getJpegSnapshotPicture[%d] (Error=%02X)\r\n",i, (int)err);
}
fclose(fp_jpeg);
}
}
EthernetInterface eth;
TCPSocketServer svr;
bool serverIsListened = false;
TCPSocketConnection client;
bool clientIsConnected = false;
char sentBuffer[1608] = {}; // 2*536=1072, 3*536=1608, 4*536=2144 !1500
char line_response[256]= {0};
char file_path[256] = {0};
DigitalOut led1(LED1); //server listning status
DigitalOut led2(LED2); //socket connecting status
Ticker ledTick;
void ledTickfunc()
{
if(serverIsListened) {
led1 = !led1;
} else {
led1 = false;
}
}
void send_HTTP_header(char* protocol, int code, char* title, char* mime_type, long long lengthBody)
{
snprintf(line_response, sizeof(line_response),"%s %d %s\r\n", protocol, code, title );
snprintf(sentBuffer, sizeof(sentBuffer),"%s",line_response);
if ( mime_type != NULL ) {
snprintf(line_response, sizeof(line_response), "Content-Type: %s\r\n", mime_type );
snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer
}
if ( lengthBody >= 0 ) {
snprintf(line_response, sizeof(line_response), "Content-Length: %lld\r\n", lengthBody );
snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer
}
snprintf(line_response, sizeof(line_response), "Connection: close\r\n" );
snprintf(sentBuffer, sizeof(sentBuffer),"%s%s\r\n",sentBuffer,line_response); //append to sentBuffer
if (EnDebugMSG)
printf("\r\n-->sent Header--\r\n");
client.send_all(sentBuffer,strlen(sentBuffer));
if (EnDebugMSG) {
printf(sentBuffer);
printf("\r\n--end Header-- bytes:%d",strlen(sentBuffer));
}
wait(0.2); //200ms important for browser!
}
void send_HTML_line(char* line, unsigned int length_line)
{
client.send_all(line,length_line);
if (EnDebugMSG)
printf("\r\n-->send HTML line:\r\n%s ...Ok!",line);
wait(0.01);
}
void send_HTML_error( int status_code, char* title, char* body_text)
{
send_HTTP_header("HTTP/1.1", status_code, title, "text/html", -1);
if (EnDebugMSG)
printf("\r\n-->send_error...\r\n");
sentBuffer[0]=NULL; //clear buffer
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);
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sprintf(line_response, "<body><center><h2><center>%d %s</center></h2>\r\n",status_code, title );
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sprintf(line_response, "%s\r\n", body_text );
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sprintf(line_response, "<p>mbed HTTP File Server</p>\r\n</center></body></html>\r\n");
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
send_HTML_line(sentBuffer, strlen(sentBuffer));
}
int send_file(char *path_file)
{
char *mime_type = {0};
unsigned int bytes_for_send=0;
long long filesize, all_send_bytes = 0;
mime_type = get_mime_type( path_file );
snprintf(file_path, sizeof(file_path),"/wfs/%s",path_file);
if (strcmp(file_path,"/wfs//take_a_picture.jpg") == 0){
take_picture = 1;
}
else take_picture = 0;
if (EnDebugMSG) {
printf("\r\n-->from send_file:%s",file_path);
printf("\r\n-->from send_file mime type:%s",mime_type);
}
if (Mystat(path_file, &myStatBuf)) { //fault with file
send_HTML_error( 403, "Forbidden", "403 - File access forbidden.");
return 403;
}
FILE* fp = NULL;
fp = fopen(file_path,"r");
if (fp==NULL ) {
send_HTML_error( 403, "Forbidden", "403 - File access forbidden.");
return 403;
}
filesize = myStatBuf.st_size;
send_HTTP_header("HTTP/1.1", 200, "Ok", mime_type, myStatBuf.st_size);
//binary send
all_send_bytes=0;
while(filesize) { //check for EOF !feof(fp)
bytes_for_send = filesize;
if (bytes_for_send > sizeof(sentBuffer)) {
bytes_for_send = sizeof(sentBuffer);
}
fread (sentBuffer,1,bytes_for_send,fp);
filesize -= bytes_for_send;
if (EnDebugMSG)
printf("\r\n---bytes_for_send...%d",bytes_for_send);
client.send_all(sentBuffer,bytes_for_send);
//Thread::wait(10);
all_send_bytes += bytes_for_send;
}
if (EnDebugMSG)
printf("\r\n---buffer fill end - all ...%lld", all_send_bytes);
//binary send
sprintf(line_response, "\r\n");
client.send_all(line_response,strlen(line_response));
if ( fp != NULL )
fclose(fp);
//Thread::wait(10);
return 0;
}
int send_directory(char *path)
{
char process_name[64]= {0};
char posOfLastSlash;
char *pLS;
struct dirent *p;
struct sMystat sb;
struct tm *timeinfo;
char timeBuf[40];
if (EnDebugMSG)
printf("\r\n-->from send_directory:%s",path);
snprintf(file_path,sizeof(file_path),"/wfs%s",path);
DIR *d = opendir(file_path);
if (EnDebugMSG && d!=NULL)
printf("\r\n-->from send_directory:%s ...open OK",file_path);
if (d==NULL) { //error open dir
send_HTML_error( 403, "Forbidden", "403 - Directory access forbidden.");
return -1;
}
send_HTTP_header("HTTP/1.1", 200, "Ok",NULL, -1);
sentBuffer[0]=NULL;
sprintf(line_response,"<!DOCTYPE html>\r\n<html>\n<head><title>Index of %s</title>\n",path);
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sprintf(line_response,"<meta content=\"text/html; charset=iso-8859-1\" http-equiv=\"Content-Type\"></head>\n");
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sprintf(line_response,"<body><center>\n<h3>Index of %s</h3>\n", path);
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
send_HTML_line(sentBuffer, strlen(sentBuffer));
//begin table
sentBuffer[0]=NULL; //clear buffer
sprintf(line_response,"<table border=\"0\">\n");
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
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");
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
//begin table
pLS=strrchr(path,'/');
posOfLastSlash=pLS-path+1;
if (EnDebugMSG)
printf("\r\n>>posOfLastSlash=%d",posOfLastSlash);
snprintf(process_name,posOfLastSlash+1,"%s",path);
if (EnDebugMSG)
printf("\r\n>>process_name=%s",process_name);
sprintf(line_response,"<tr><td align=\"left\"><a href=\"%s\">../</a></td></tr>\n",process_name);
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
while((p = readdir(d)) != NULL) {
if (EnDebugMSG)
printf("\r\n :%s",p->d_name);
sprintf(file_path,"%s/%s",path,p->d_name);
Mystat( file_path, &sb );
if (get_dirInfo(file_path)==0 ) { //this is directory path
if (EnDebugMSG)
printf("\r\nDIR");
sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">%s</a><br></td></tr>\n",file_path,p->d_name);
if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent
send_HTML_line(sentBuffer, strlen(sentBuffer));
sentBuffer[0]=NULL; //clear buffer
}
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
} else { //this is file
if (EnDebugMSG)
printf("\r\nFILE");
timeinfo = localtime (&sb.st_mtime);
//strftime(timeBuf,40, "%I:%M:%S %p (%Y/%m/%d)\r\n", localtime(&sb.st_mtime));
strftime(timeBuf, 40, "%c", timeinfo);
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) );
if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent
send_HTML_line(sentBuffer, strlen(sentBuffer));
sentBuffer[0]=NULL; //clear buffer
}
snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
}
}
send_HTML_line(sentBuffer, strlen(sentBuffer));
closedir(d);
sprintf(line_response, "</table>\n<br><h4>mbed HTTP File Server</h4>\n</center></body></html>\n");
send_HTML_line(line_response, strlen(line_response));
return 0;
}
void parseHTTPRequest(char* buffer)
{
char spacePos;
char *tmpBuffer;
spacePos = strcspn(buffer, " ") + 1; //position of first space character
snprintf(sMethod, spacePos,"%s", buffer);
//get Protocol
tmpBuffer=&(buffer[spacePos]); //move pointer to buffer (delete Method)
spacePos = strcspn(tmpBuffer, "\r\n") + 1;
tmpBuffer[spacePos]='\0'; //set end of string ...cut
sprintf(sProtocol, "%s", strrchr(tmpBuffer,' ')); //get string after last (space )
printf("\r\nsProtocol:%s", tmpBuffer);
buffer = &(sProtocol[1]); //cut first character (space)
sprintf(sProtocol, "%s", buffer);
//get URL
snprintf(sURL,strlen(tmpBuffer)-strlen(sProtocol),"%s\r\n", tmpBuffer); //URL is between Method and Protocol
printf("\r\nParse Method:%s",sMethod);
printf("\r\nParse URL:%s",sURL);
printf("\r\nParse PROTOCOL:%s",sProtocol);
printf("\n\r\n");
}
int processHTTP(char* sMethod, char* sURL, char* sProtocol)
{
int gdi, gfi; //status of get_dir_info(xxx), and get_file_info(xxx)
if (strcmp(sMethod,"GET")!=0) {
send_HTML_error( 501, "501 Not Implemented", "501 - The server either does not recognize the request method");
return 501;
}
if (sURL[0]!= '/') {
send_HTML_error( 400, "Bad Request", "400 - The request cannot be fulfilled due to bad syntax.");
return 400;
}
if (sURL[strlen(sURL)-1]=='/') {
sURL[strlen(sURL)-1]=sURL[strlen(sURL)]; //delete last symbol
if (EnDebugMSG)
printf("\r\n delete last:%s",sURL);
}
gdi= get_dirInfo(sURL);
gfi= get_fileInfo(sURL);
if (gfi!=0) { //!=0 file not found
if (gdi==0) { //0-ok this is directory
return send_directory(sURL);
}
if (EnDebugMSG)
printf("\r\n404-br File not found or...(Fresult is:%d)",gfi);
send_HTML_error( 404, "Not Found","404 - The requested resource could not be found.");
return 404;
} else { //==0 found
if (gdi==0) //0-ok this is directory
return send_directory(sURL);
else
return send_file(sURL);
}
}
int main()
{
*(volatile uint32_t *)(0x41001014) = 0x0060100; //clock setting 48MHz
uint8_t MAC_Addr[6] = {0x00, 0x08, 0xDC, 0x00, 0x01, 0x02};
ledTick.attach(&ledTickfunc,0.5);
//ledTick.detach();
//setup ethernet interface
//eth.init(); //Use DHCP
eth.init(MAC_Addr,IP,MASK,GATEWAY); //MAC,IP,mask,Gateway
eth.connect();
printf("IP Address is %s\n\r", eth.getIPAddress());
//setup tcp socket
if(svr.bind(PORT)< 0) {
printf("tcp server bind failed.\n\r");
return -1;
} else {
printf("tcp server bind successed.\n\r");
serverIsListened = true;
}
if(svr.listen(1) < 0) {
printf("tcp server listen failed.\n\r");
return -1;
} else {
printf("tcp server is listening...\n\r");
}
//listening for http GET request
while (serverIsListened) {
//blocking mode(never timeout)
if(svr.accept(client)<0) {
printf("failed to accept connection.\n\r");
}
else {
//client.set_blocking(false,5000); //5000=5sec
printf("connection success!\n\rIP: %s\n\r",client.get_address());
clientIsConnected = true;
led2 = true;
while(clientIsConnected) {
char buffer[1024] = {};
switch(client.receive(buffer, 1023)) {
case 0:
printf("recieved buffer is empty.\n\r");
clientIsConnected = false;
break;
case -1:
printf("failed to read data from client.\n\r");
clientIsConnected = false;
break;
default:
printf("Recieved Data: %d\n\r\n\r%.*s\n\r",strlen(buffer),strlen(buffer),buffer);
parseHTTPRequest(buffer);
//if(buffer[0] == 'G' && buffer[1] == 'E' && buffer[2] == 'T' ) {
if (strcmp(sMethod, "GET" ) == 0 ) {
printf("GET request incomming.\n\r");
processHTTP(sMethod, sURL, sProtocol);
clientIsConnected = false;
}//if get
break;
} //switch
//ledTick.attach(&ledTickfunc,0.5);
}//while
printf("close connection.\n\rHTTP server is listening...\n\r\n");
client.close();
wait(0.05);
// take a picture function
if (take_picture) {
sync();
test_jpeg_snapshot_picture();
take_picture = 0;
}
led2 = false;
}
}
}
IOP