Camera_WebStreaming with WIZwiki-W7500
Dependencies: CameraC328 SDFileSystem WIZnetInterface_Ricky mbed-src
main.cpp@0:38ea06c1e14a, 2015-11-24 (annotated)
- 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?
User | Revision | Line number | New 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 | } |