Camera_WebStreaming with WIZwiki-W7500

Dependencies:   CameraC328 SDFileSystem WIZnetInterface_Ricky mbed-src

Committer:
Ricky_Kwon
Date:
Tue Nov 24 03:59:10 2015 +0000
Revision:
0:38ea06c1e14a
Camera_WebStreaming with WIZwiki-W7500

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ricky_Kwon 0:38ea06c1e14a 1 #include "mbed.h"
Ricky_Kwon 0:38ea06c1e14a 2 #include "SDFileSystem.h"
Ricky_Kwon 0:38ea06c1e14a 3 #include "EthernetInterface.h"
Ricky_Kwon 0:38ea06c1e14a 4 #include "CameraC328.h"
Ricky_Kwon 0:38ea06c1e14a 5
Ricky_Kwon 0:38ea06c1e14a 6
Ricky_Kwon 0:38ea06c1e14a 7 #define EnDebugMSG true
Ricky_Kwon 0:38ea06c1e14a 8 #define NEWLINE() printf("\r\n")
Ricky_Kwon 0:38ea06c1e14a 9 /* CAMERA */
Ricky_Kwon 0:38ea06c1e14a 10 #define USE_JPEG_HIGH_RESOLUTION 2//1=80x64 <--- not working -_-;;, 2=160x128, 3=320x240, 4=640x480
Ricky_Kwon 0:38ea06c1e14a 11 SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "fs"); // the pinout on the mbed Cool Components workshop board
Ricky_Kwon 0:38ea06c1e14a 12 CameraC328 camera(PA_13, PA_14, CameraC328::Baud115200);
Ricky_Kwon 0:38ea06c1e14a 13 static FILE *fp_jpeg;
Ricky_Kwon 0:38ea06c1e14a 14 /* TCP/IP */
Ricky_Kwon 0:38ea06c1e14a 15 #define WEB_SERVER_PORT 80
Ricky_Kwon 0:38ea06c1e14a 16 char echoHeader[512] = {0,};
Ricky_Kwon 0:38ea06c1e14a 17 char line_response[8]= {0};
Ricky_Kwon 0:38ea06c1e14a 18 char sentBuffer[512] = {0,};
Ricky_Kwon 0:38ea06c1e14a 19 char recv_buffer[1024] = {0,};
Ricky_Kwon 0:38ea06c1e14a 20
Ricky_Kwon 0:38ea06c1e14a 21 uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x12, 0x34, 0x45};
Ricky_Kwon 0:38ea06c1e14a 22 const char ip_addr[] = "192.168.0.123";
Ricky_Kwon 0:38ea06c1e14a 23 const char mask_addr[] = "255.255.255.0";
Ricky_Kwon 0:38ea06c1e14a 24 const char gateway_addr[] = "192.168.0.1";
Ricky_Kwon 0:38ea06c1e14a 25
Ricky_Kwon 0:38ea06c1e14a 26 EthernetInterface eth;
Ricky_Kwon 0:38ea06c1e14a 27 TCPSocketServer server;
Ricky_Kwon 0:38ea06c1e14a 28
Ricky_Kwon 0:38ea06c1e14a 29
Ricky_Kwon 0:38ea06c1e14a 30 /* UART */
Ricky_Kwon 0:38ea06c1e14a 31 Serial pc(USBTX, USBRX);
Ricky_Kwon 0:38ea06c1e14a 32
Ricky_Kwon 0:38ea06c1e14a 33 /* Function*/
Ricky_Kwon 0:38ea06c1e14a 34 void jpeg_callback(char *buf, size_t siz);
Ricky_Kwon 0:38ea06c1e14a 35 void sync(void);
Ricky_Kwon 0:38ea06c1e14a 36 void test_jpeg_snapshot_picture(void);
Ricky_Kwon 0:38ea06c1e14a 37 void init(void);
Ricky_Kwon 0:38ea06c1e14a 38
Ricky_Kwon 0:38ea06c1e14a 39 int main() {
Ricky_Kwon 0:38ea06c1e14a 40
Ricky_Kwon 0:38ea06c1e14a 41 unsigned int bytes_for_send=0;
Ricky_Kwon 0:38ea06c1e14a 42 long long filesize, all_send_bytes = 0;
Ricky_Kwon 0:38ea06c1e14a 43
Ricky_Kwon 0:38ea06c1e14a 44 printf("Hello WIZwiki-W7500 Camera WebStreaming World!\r\n");
Ricky_Kwon 0:38ea06c1e14a 45
Ricky_Kwon 0:38ea06c1e14a 46 eth.init(mac_addr, ip_addr, mask_addr, gateway_addr); //Use Static
Ricky_Kwon 0:38ea06c1e14a 47 eth.connect();
Ricky_Kwon 0:38ea06c1e14a 48
Ricky_Kwon 0:38ea06c1e14a 49 sync();
Ricky_Kwon 0:38ea06c1e14a 50 init();
Ricky_Kwon 0:38ea06c1e14a 51
Ricky_Kwon 0:38ea06c1e14a 52 printf("WIZwiki-W7500 IP Address is %s\r\n", eth.getIPAddress());
Ricky_Kwon 0:38ea06c1e14a 53
Ricky_Kwon 0:38ea06c1e14a 54 server.bind(WEB_SERVER_PORT);
Ricky_Kwon 0:38ea06c1e14a 55 printf("bind complete\r\n");
Ricky_Kwon 0:38ea06c1e14a 56 server.listen();
Ricky_Kwon 0:38ea06c1e14a 57 printf("listen complete\r\n");
Ricky_Kwon 0:38ea06c1e14a 58
Ricky_Kwon 0:38ea06c1e14a 59 while(true)
Ricky_Kwon 0:38ea06c1e14a 60 {
Ricky_Kwon 0:38ea06c1e14a 61 TCPSocketConnection Streaming;
Ricky_Kwon 0:38ea06c1e14a 62 printf("Wait for new connection...\r\n");
Ricky_Kwon 0:38ea06c1e14a 63 server.accept(Streaming);
Ricky_Kwon 0:38ea06c1e14a 64 Streaming.set_blocking(false, 15000); // Timeout after (1.5)s
Ricky_Kwon 0:38ea06c1e14a 65
Ricky_Kwon 0:38ea06c1e14a 66 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 67 printf("Connection from: %s\r\n", Streaming.get_address());
Ricky_Kwon 0:38ea06c1e14a 68
Ricky_Kwon 0:38ea06c1e14a 69 while (true) {
Ricky_Kwon 0:38ea06c1e14a 70 test_jpeg_snapshot_picture();
Ricky_Kwon 0:38ea06c1e14a 71 int n = Streaming.receive(recv_buffer, sizeof(recv_buffer));
Ricky_Kwon 0:38ea06c1e14a 72 if (n <= 0) break; // n = n < 0
Ricky_Kwon 0:38ea06c1e14a 73
Ricky_Kwon 0:38ea06c1e14a 74 // print received message to terminal
Ricky_Kwon 0:38ea06c1e14a 75 recv_buffer[n] = '\0';
Ricky_Kwon 0:38ea06c1e14a 76 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 77 printf("Received message from Client :'%s'\r\n",recv_buffer);
Ricky_Kwon 0:38ea06c1e14a 78 if(recv_buffer[0] == 'G' && recv_buffer[1] == 'E' && recv_buffer[2] == 'T')
Ricky_Kwon 0:38ea06c1e14a 79 {
Ricky_Kwon 0:38ea06c1e14a 80 char fname[64];
Ricky_Kwon 0:38ea06c1e14a 81 snprintf(fname, sizeof(fname), "/fs/Stream.jpg");
Ricky_Kwon 0:38ea06c1e14a 82 fp_jpeg = fopen(fname, "r");
Ricky_Kwon 0:38ea06c1e14a 83 fseek(fp_jpeg, 0, SEEK_END); // seek to end of file
Ricky_Kwon 0:38ea06c1e14a 84 filesize = ftell(fp_jpeg); // get current file pointer
Ricky_Kwon 0:38ea06c1e14a 85 fseek(fp_jpeg, 0, SEEK_SET); // seek back to beginning of file
Ricky_Kwon 0:38ea06c1e14a 86
Ricky_Kwon 0:38ea06c1e14a 87 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);
Ricky_Kwon 0:38ea06c1e14a 88 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 89 printf("%s\r\n", echoHeader);
Ricky_Kwon 0:38ea06c1e14a 90 Streaming.send_all(echoHeader,strlen(echoHeader));
Ricky_Kwon 0:38ea06c1e14a 91
Ricky_Kwon 0:38ea06c1e14a 92 //wait(0.2); //200ms important for browser!
Ricky_Kwon 0:38ea06c1e14a 93 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 94 printf("---filesize = %lld\r\n",filesize);
Ricky_Kwon 0:38ea06c1e14a 95 all_send_bytes = 0;
Ricky_Kwon 0:38ea06c1e14a 96 while(filesize)
Ricky_Kwon 0:38ea06c1e14a 97 { //check for EOF !feof(fp)
Ricky_Kwon 0:38ea06c1e14a 98
Ricky_Kwon 0:38ea06c1e14a 99 bytes_for_send = filesize;
Ricky_Kwon 0:38ea06c1e14a 100 if (bytes_for_send > sizeof(sentBuffer))
Ricky_Kwon 0:38ea06c1e14a 101 {
Ricky_Kwon 0:38ea06c1e14a 102 bytes_for_send = sizeof(sentBuffer);
Ricky_Kwon 0:38ea06c1e14a 103 }
Ricky_Kwon 0:38ea06c1e14a 104 fread (sentBuffer,1,bytes_for_send,fp_jpeg);
Ricky_Kwon 0:38ea06c1e14a 105 filesize -= bytes_for_send;
Ricky_Kwon 0:38ea06c1e14a 106
Ricky_Kwon 0:38ea06c1e14a 107 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 108 printf("\r\n---bytes_for_send...%d",bytes_for_send);
Ricky_Kwon 0:38ea06c1e14a 109
Ricky_Kwon 0:38ea06c1e14a 110 Streaming.send_all(sentBuffer,bytes_for_send);
Ricky_Kwon 0:38ea06c1e14a 111 //Thread::wait(10);
Ricky_Kwon 0:38ea06c1e14a 112 all_send_bytes += bytes_for_send;
Ricky_Kwon 0:38ea06c1e14a 113 }
Ricky_Kwon 0:38ea06c1e14a 114 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 115 printf("\r\n---buffer fill end - all ...%lld\r\n", all_send_bytes);
Ricky_Kwon 0:38ea06c1e14a 116 //binary send
Ricky_Kwon 0:38ea06c1e14a 117
Ricky_Kwon 0:38ea06c1e14a 118 sprintf(line_response, "\r\n");
Ricky_Kwon 0:38ea06c1e14a 119 Streaming.send_all(line_response,strlen(line_response));
Ricky_Kwon 0:38ea06c1e14a 120 if ( fp_jpeg != NULL )
Ricky_Kwon 0:38ea06c1e14a 121 fclose(fp_jpeg);
Ricky_Kwon 0:38ea06c1e14a 122 }
Ricky_Kwon 0:38ea06c1e14a 123 }
Ricky_Kwon 0:38ea06c1e14a 124 }
Ricky_Kwon 0:38ea06c1e14a 125 }
Ricky_Kwon 0:38ea06c1e14a 126
Ricky_Kwon 0:38ea06c1e14a 127 void jpeg_callback(char *buf, size_t siz) {
Ricky_Kwon 0:38ea06c1e14a 128 for (int i = 0; i < (int)siz; i++) {
Ricky_Kwon 0:38ea06c1e14a 129 fprintf(fp_jpeg, "%c", buf[i]);
Ricky_Kwon 0:38ea06c1e14a 130 }
Ricky_Kwon 0:38ea06c1e14a 131 }
Ricky_Kwon 0:38ea06c1e14a 132 void sync(void) {
Ricky_Kwon 0:38ea06c1e14a 133 CameraC328::ErrorNumber err = CameraC328::NoError;
Ricky_Kwon 0:38ea06c1e14a 134
Ricky_Kwon 0:38ea06c1e14a 135 err = camera.sync();
Ricky_Kwon 0:38ea06c1e14a 136 if (CameraC328::NoError == err) {
Ricky_Kwon 0:38ea06c1e14a 137 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 138 printf("[ OK ] : CameraC328::sync\r\n");
Ricky_Kwon 0:38ea06c1e14a 139 } else {
Ricky_Kwon 0:38ea06c1e14a 140 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 141 printf("[FAIL] : CameraC328::sync (Error=%02X)\r\n", (int)err);
Ricky_Kwon 0:38ea06c1e14a 142 }
Ricky_Kwon 0:38ea06c1e14a 143 }
Ricky_Kwon 0:38ea06c1e14a 144 void init() {
Ricky_Kwon 0:38ea06c1e14a 145 CameraC328::ErrorNumber err = CameraC328::NoError;
Ricky_Kwon 0:38ea06c1e14a 146
Ricky_Kwon 0:38ea06c1e14a 147 #if (USE_JPEG_HIGH_RESOLUTION==1)
Ricky_Kwon 0:38ea06c1e14a 148 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution80x64);
Ricky_Kwon 0:38ea06c1e14a 149 #elif (USE_JPEG_HIGH_RESOLUTION==2)
Ricky_Kwon 0:38ea06c1e14a 150 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution160x128);
Ricky_Kwon 0:38ea06c1e14a 151 #elif (USE_JPEG_HIGH_RESOLUTION==3)
Ricky_Kwon 0:38ea06c1e14a 152 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution320x240);
Ricky_Kwon 0:38ea06c1e14a 153 #elif (USE_JPEG_HIGH_RESOLUTION==4)
Ricky_Kwon 0:38ea06c1e14a 154 err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480);
Ricky_Kwon 0:38ea06c1e14a 155 #endif
Ricky_Kwon 0:38ea06c1e14a 156 if (CameraC328::NoError == err) {
Ricky_Kwon 0:38ea06c1e14a 157 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 158 printf("[ OK ] : CameraC328::init\r\n");
Ricky_Kwon 0:38ea06c1e14a 159 } else {
Ricky_Kwon 0:38ea06c1e14a 160 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 161 printf("[FAIL] : CameraC328::init (Error=%02X)\r\n", (int)err);
Ricky_Kwon 0:38ea06c1e14a 162 }
Ricky_Kwon 0:38ea06c1e14a 163 }
Ricky_Kwon 0:38ea06c1e14a 164 void test_jpeg_snapshot_picture() {
Ricky_Kwon 0:38ea06c1e14a 165 CameraC328::ErrorNumber err = CameraC328::NoError;
Ricky_Kwon 0:38ea06c1e14a 166
Ricky_Kwon 0:38ea06c1e14a 167 char fname[64];
Ricky_Kwon 0:38ea06c1e14a 168 snprintf(fname, sizeof(fname), "/fs/Stream.jpg");
Ricky_Kwon 0:38ea06c1e14a 169 fp_jpeg = fopen(fname, "w");
Ricky_Kwon 0:38ea06c1e14a 170
Ricky_Kwon 0:38ea06c1e14a 171 err = camera.getJpegSnapshotPicture(jpeg_callback);
Ricky_Kwon 0:38ea06c1e14a 172 if (CameraC328::NoError == err) {
Ricky_Kwon 0:38ea06c1e14a 173 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 174 printf("[ OK ] : CameraC328::getJpegSnapshotPicture\n");
Ricky_Kwon 0:38ea06c1e14a 175 } else {
Ricky_Kwon 0:38ea06c1e14a 176 if (EnDebugMSG)
Ricky_Kwon 0:38ea06c1e14a 177 printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\n", (int)err);
Ricky_Kwon 0:38ea06c1e14a 178 }
Ricky_Kwon 0:38ea06c1e14a 179
Ricky_Kwon 0:38ea06c1e14a 180 fclose(fp_jpeg);
Ricky_Kwon 0:38ea06c1e14a 181 }