Camera_WebStreaming with WIZwiki-W7500

Dependencies:   CameraC328 SDFileSystem WIZnetInterface_Ricky mbed-src

main.cpp

Committer:
Ricky_Kwon
Date:
2015-11-24
Revision:
0:38ea06c1e14a

File content as of revision 0:38ea06c1e14a:

#include "mbed.h"
#include "SDFileSystem.h"
#include "EthernetInterface.h"
#include "CameraC328.h"


#define EnDebugMSG  true
#define NEWLINE()   printf("\r\n")
/* CAMERA */
#define USE_JPEG_HIGH_RESOLUTION    2//1=80x64 <--- not working -_-;;, 2=160x128, 3=320x240, 4=640x480
SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "fs"); // the pinout on the mbed Cool Components workshop board
CameraC328 camera(PA_13, PA_14, CameraC328::Baud115200);
static FILE *fp_jpeg;
/* TCP/IP */
#define WEB_SERVER_PORT   80
char echoHeader[512] = {0,};
char line_response[8]= {0};
char sentBuffer[512] = {0,}; 
char recv_buffer[1024] = {0,};

uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x12, 0x34, 0x45};
const char ip_addr[] = "192.168.0.123"; 
const char mask_addr[] = "255.255.255.0"; 
const char gateway_addr[] = "192.168.0.1"; 

EthernetInterface eth;
TCPSocketServer server;


/* UART */
Serial pc(USBTX, USBRX);

/* Function*/ 
void jpeg_callback(char *buf, size_t siz);
void sync(void);
void test_jpeg_snapshot_picture(void);
void init(void);

int main() {

    unsigned int bytes_for_send=0;
    long long filesize, all_send_bytes = 0;
    
    printf("Hello WIZwiki-W7500 Camera WebStreaming World!\r\n"); 
      
    eth.init(mac_addr, ip_addr, mask_addr, gateway_addr); //Use Static
    eth.connect();
    
    sync();
    init();
    
    printf("WIZwiki-W7500 IP Address is %s\r\n", eth.getIPAddress());
    
    server.bind(WEB_SERVER_PORT);
    printf("bind complete\r\n");
    server.listen();
    printf("listen complete\r\n");
    
    while(true)
    {
        TCPSocketConnection Streaming;
        printf("Wait for new connection...\r\n");
        server.accept(Streaming);
        Streaming.set_blocking(false, 15000); // Timeout after (1.5)s
        
        if (EnDebugMSG)
        printf("Connection from: %s\r\n", Streaming.get_address());
        
        while (true) {        
            test_jpeg_snapshot_picture();    
            int n = Streaming.receive(recv_buffer, sizeof(recv_buffer));
            if (n <= 0) break; // n = n < 0
            
            // print received message to terminal
            recv_buffer[n] = '\0';
            if (EnDebugMSG)
            printf("Received message from Client :'%s'\r\n",recv_buffer);
            if(recv_buffer[0] == 'G' && recv_buffer[1] == 'E' && recv_buffer[2] == 'T')
            {
                char fname[64];
                snprintf(fname, sizeof(fname), "/fs/Stream.jpg");
                fp_jpeg = fopen(fname, "r");
                fseek(fp_jpeg, 0, SEEK_END);            // seek to end of file
                filesize = ftell(fp_jpeg);              // get current file pointer
                fseek(fp_jpeg, 0, SEEK_SET);            // seek back to beginning of file  
                
                sprintf(echoHeader,"HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\nContent-Length: %lld\r\nConnection: close\r\nRefresh: 0.5\r\n\r\n", filesize);
                if (EnDebugMSG)
                printf("%s\r\n", echoHeader);
                Streaming.send_all(echoHeader,strlen(echoHeader));
                
                //wait(0.2);  //200ms important for browser!
                if (EnDebugMSG)
                printf("---filesize = %lld\r\n",filesize);
                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_jpeg);
                    filesize -= bytes_for_send;
                    
                    if (EnDebugMSG)
                    printf("\r\n---bytes_for_send...%d",bytes_for_send);
                    
                    Streaming.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\r\n", all_send_bytes);
                //binary send
                
                sprintf(line_response, "\r\n");
                Streaming.send_all(line_response,strlen(line_response));
                if ( fp_jpeg != NULL )
                fclose(fp_jpeg);       
            }
        }
    }
}

void jpeg_callback(char *buf, size_t siz) {
    for (int i = 0; i < (int)siz; i++) {
        fprintf(fp_jpeg, "%c", buf[i]);
    }
}
void sync(void) {
    CameraC328::ErrorNumber err = CameraC328::NoError;

    err = camera.sync();
    if (CameraC328::NoError == err) {
        if (EnDebugMSG)
        printf("[ OK ] : CameraC328::sync\r\n");
    } else {
        if (EnDebugMSG)
        printf("[FAIL] : CameraC328::sync (Error=%02X)\r\n", (int)err);
    }
}
void init() {
    CameraC328::ErrorNumber err = CameraC328::NoError;

#if (USE_JPEG_HIGH_RESOLUTION==1)
    err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64);
#elif (USE_JPEG_HIGH_RESOLUTION==2)
    err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution160x128);
#elif (USE_JPEG_HIGH_RESOLUTION==3)
    err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution320x240);
#elif (USE_JPEG_HIGH_RESOLUTION==4)
    err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
#endif
    if (CameraC328::NoError == err) {
        if (EnDebugMSG)
        printf("[ OK ] : CameraC328::init\r\n");
    } else {
        if (EnDebugMSG)
        printf("[FAIL] : CameraC328::init (Error=%02X)\r\n", (int)err);
    }
}
void test_jpeg_snapshot_picture() {
    CameraC328::ErrorNumber err = CameraC328::NoError;
      
    char fname[64];
    snprintf(fname, sizeof(fname), "/fs/Stream.jpg");
    fp_jpeg = fopen(fname, "w");

    err = camera.getJpegSnapshotPicture(jpeg_callback);
    if (CameraC328::NoError == err) {
        if (EnDebugMSG)
        printf("[ OK ] : CameraC328::getJpegSnapshotPicture\n");
    } else {
        if (EnDebugMSG)
        printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\n", (int)err);
    }

    fclose(fp_jpeg);
}