Camera_WebStreaming with WIZwiki-W7500

Dependencies:   CameraC328 SDFileSystem WIZnetInterface_Ricky mbed-src

Files at this revision

API Documentation at this revision

Comitter:
Ricky_Kwon
Date:
Tue Nov 24 03:59:10 2015 +0000
Commit message:
Camera_WebStreaming with WIZwiki-W7500

Changed in this revision

CameraC328.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
WIZnetInterface.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-src.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CameraC328.lib	Tue Nov 24 03:59:10 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/shintamainjp/code/CameraC328/#49cfda6c547f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Tue Nov 24 03:59:10 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/mbed_official/code/SDFileSystem/#7b35d1709458
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WIZnetInterface.lib	Tue Nov 24 03:59:10 2015 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/WIZnet/code/WIZnetInterface_Ricky/#5a1969320666
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Nov 24 03:59:10 2015 +0000
@@ -0,0 +1,181 @@
+#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);
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-src.lib	Tue Nov 24 03:59:10 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-src/#523654f2b367