Using Camera module, FTP Client on WIZwiki-W7500, send the image data to FTP Server.
Dependencies: CameraC328 SDFileSystem WIZnetInterface mbed-src
Fork of Camera_FTP_WIZwiki-W7500 by
Prerequisite
This example send the image data acquired from the camera to an FTP Server.
To implement this function, you need a Platform board, network Interface board, camera module.
Available camera modules are C328, LJ-DSC02. Because the cameras listed above all have similar internal protocols.
This example uses LJ-DSC02.
- WIZwiki-W7500 from WIZnet (Platform board and Ethernet I/F board)
- LJ-DSC02 (Camera module)
- FTP Server(AL FTP)
- Micro SD Card
Hardware Configuration
- connect Ethernet Cable & USB Cable
- connect Camera module
Software
Init FTP Server information
static char ID[]={"abc"}; //Set FTPServer Login ID static char PASSWORD[]={"123"}; //Set FTPServer Login Password const char ftpServer_control_ip_addr[] = "192.168.1.2";
Caution
Must fix FTP server ip, id, pass
main.cpp@1:7d428f360a0a, 2015-07-21 (annotated)
- Committer:
- Ricky_Kwon
- Date:
- Tue Jul 21 23:52:52 2015 +0000
- Revision:
- 1:7d428f360a0a
- Parent:
- 0:27fe09e9f405
- Child:
- 2:c469227cb913
optimization
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ricky_Kwon | 0:27fe09e9f405 | 1 | #include "mbed.h" |
Ricky_Kwon | 0:27fe09e9f405 | 2 | #include "SDFileSystem.h" |
Ricky_Kwon | 0:27fe09e9f405 | 3 | #include "EthernetInterface.h" |
Ricky_Kwon | 0:27fe09e9f405 | 4 | #include "CameraC328.h" |
Ricky_Kwon | 0:27fe09e9f405 | 5 | |
Ricky_Kwon | 0:27fe09e9f405 | 6 | /* CAMERA */ |
Ricky_Kwon | 0:27fe09e9f405 | 7 | #define USE_JPEG_HIGH_RESOLUTION 1 |
Ricky_Kwon | 0:27fe09e9f405 | 8 | |
Ricky_Kwon | 0:27fe09e9f405 | 9 | /* FTP */ |
Ricky_Kwon | 0:27fe09e9f405 | 10 | #define USER "user " |
Ricky_Kwon | 0:27fe09e9f405 | 11 | #define PASS "pass " |
Ricky_Kwon | 0:27fe09e9f405 | 12 | #define PASV "pasv " |
Ricky_Kwon | 0:27fe09e9f405 | 13 | #define PORT "port " |
Ricky_Kwon | 0:27fe09e9f405 | 14 | #define LIST "list " |
Ricky_Kwon | 0:27fe09e9f405 | 15 | #define STOR "stor " |
Ricky_Kwon | 0:27fe09e9f405 | 16 | #define RETR "retr " |
Ricky_Kwon | 0:27fe09e9f405 | 17 | #define END "\r\n" |
Ricky_Kwon | 0:27fe09e9f405 | 18 | #define FTP_SERVER_PORT 21 |
Ricky_Kwon | 0:27fe09e9f405 | 19 | #define MAX_SS 256 |
Ricky_Kwon | 0:27fe09e9f405 | 20 | bool gDataSockReady = false; |
Ricky_Kwon | 0:27fe09e9f405 | 21 | bool gDataPutGetStart = false; |
Ricky_Kwon | 0:27fe09e9f405 | 22 | bool ftpclientrun = false; |
Ricky_Kwon | 0:27fe09e9f405 | 23 | int remote_port; |
Ricky_Kwon | 0:27fe09e9f405 | 24 | char ftpServer_data_ip_addr[4]={0,}; |
Ricky_Kwon | 0:27fe09e9f405 | 25 | char ftpServer_data_ip_addr_str[20]={0,}; |
Ricky_Kwon | 0:27fe09e9f405 | 26 | static char buf[256]; |
Ricky_Kwon | 0:27fe09e9f405 | 27 | enum CommandFirst { |
Ricky_Kwon | 0:27fe09e9f405 | 28 | f_nocmd, |
Ricky_Kwon | 0:27fe09e9f405 | 29 | f_dir, |
Ricky_Kwon | 0:27fe09e9f405 | 30 | f_put, |
Ricky_Kwon | 0:27fe09e9f405 | 31 | f_get, |
Ricky_Kwon | 0:27fe09e9f405 | 32 | }; |
Ricky_Kwon | 0:27fe09e9f405 | 33 | enum CommandSecond { |
Ricky_Kwon | 0:27fe09e9f405 | 34 | s_nocmd, |
Ricky_Kwon | 0:27fe09e9f405 | 35 | s_dir, |
Ricky_Kwon | 0:27fe09e9f405 | 36 | s_put, |
Ricky_Kwon | 0:27fe09e9f405 | 37 | s_get, |
Ricky_Kwon | 0:27fe09e9f405 | 38 | }; |
Ricky_Kwon | 0:27fe09e9f405 | 39 | enum ftpc_datasock_state{ |
Ricky_Kwon | 0:27fe09e9f405 | 40 | DATASOCK_IDLE, |
Ricky_Kwon | 0:27fe09e9f405 | 41 | DATASOCK_READY, |
Ricky_Kwon | 0:27fe09e9f405 | 42 | DATASOCK_START |
Ricky_Kwon | 0:27fe09e9f405 | 43 | }; |
Ricky_Kwon | 0:27fe09e9f405 | 44 | struct Command { |
Ricky_Kwon | 0:27fe09e9f405 | 45 | enum CommandFirst First; |
Ricky_Kwon | 0:27fe09e9f405 | 46 | enum CommandSecond Second; |
Ricky_Kwon | 0:27fe09e9f405 | 47 | }; |
Ricky_Kwon | 0:27fe09e9f405 | 48 | struct ftpc { |
Ricky_Kwon | 0:27fe09e9f405 | 49 | enum ftpc_datasock_state dsock_state; |
Ricky_Kwon | 0:27fe09e9f405 | 50 | }; |
Ricky_Kwon | 0:27fe09e9f405 | 51 | struct ftpc FTPClient; |
Ricky_Kwon | 0:27fe09e9f405 | 52 | struct Command FTPCommand; |
Ricky_Kwon | 0:27fe09e9f405 | 53 | |
Ricky_Kwon | 0:27fe09e9f405 | 54 | /* SD Card filesystem */ |
Ricky_Kwon | 0:27fe09e9f405 | 55 | SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500 |
Ricky_Kwon | 0:27fe09e9f405 | 56 | /* UART */ |
Ricky_Kwon | 0:27fe09e9f405 | 57 | Serial pc(USBTX, USBRX); |
Ricky_Kwon | 0:27fe09e9f405 | 58 | char gMsgBuf[10]; |
Ricky_Kwon | 0:27fe09e9f405 | 59 | int User_Keyboard_MSG_Cnt; |
Ricky_Kwon | 0:27fe09e9f405 | 60 | /* CAMERA */ |
Ricky_Kwon | 0:27fe09e9f405 | 61 | static FILE *fp_jpeg; |
Ricky_Kwon | 0:27fe09e9f405 | 62 | char fname[32]; |
Ricky_Kwon | 0:27fe09e9f405 | 63 | char fname_server[16]; |
Ricky_Kwon | 1:7d428f360a0a | 64 | char fnamecnt=0; |
Ricky_Kwon | 0:27fe09e9f405 | 65 | CameraC328 camera(PA_13, PA_14, CameraC328::Baud115200); |
Ricky_Kwon | 1:7d428f360a0a | 66 | /* Function*/ |
Ricky_Kwon | 0:27fe09e9f405 | 67 | char* User_Keyboard_MSG(void); |
Ricky_Kwon | 0:27fe09e9f405 | 68 | int pportc(char * arg); |
Ricky_Kwon | 0:27fe09e9f405 | 69 | void jpeg_callback(char *buf, size_t siz); |
Ricky_Kwon | 0:27fe09e9f405 | 70 | void sync(void); |
Ricky_Kwon | 0:27fe09e9f405 | 71 | void test_jpeg_snapshot_picture(void); |
Ricky_Kwon | 0:27fe09e9f405 | 72 | |
Ricky_Kwon | 0:27fe09e9f405 | 73 | int main() { |
Ricky_Kwon | 0:27fe09e9f405 | 74 | |
Ricky_Kwon | 0:27fe09e9f405 | 75 | char Msg_c; |
Ricky_Kwon | 0:27fe09e9f405 | 76 | int remain_filesize; |
Ricky_Kwon | 0:27fe09e9f405 | 77 | int send_byte; |
Ricky_Kwon | 0:27fe09e9f405 | 78 | |
Ricky_Kwon | 0:27fe09e9f405 | 79 | |
Ricky_Kwon | 0:27fe09e9f405 | 80 | pc.baud(115200); |
Ricky_Kwon | 0:27fe09e9f405 | 81 | |
Ricky_Kwon | 0:27fe09e9f405 | 82 | pc.printf("Hello Home Security World!\r\n"); |
Ricky_Kwon | 0:27fe09e9f405 | 83 | |
Ricky_Kwon | 0:27fe09e9f405 | 84 | uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x12, 0x34, 0x45}; |
Ricky_Kwon | 0:27fe09e9f405 | 85 | const char ip_addr[] = "192.168.0.123"; |
Ricky_Kwon | 0:27fe09e9f405 | 86 | const char mask_addr[] = "255.255.255.0"; |
Ricky_Kwon | 0:27fe09e9f405 | 87 | const char gateway_addr[] = "192.168.0.1"; |
Ricky_Kwon | 0:27fe09e9f405 | 88 | const char ftpServer_control_ip_addr[] = "192.168.0.230"; |
Ricky_Kwon | 0:27fe09e9f405 | 89 | |
Ricky_Kwon | 0:27fe09e9f405 | 90 | |
Ricky_Kwon | 0:27fe09e9f405 | 91 | EthernetInterface eth; |
Ricky_Kwon | 0:27fe09e9f405 | 92 | eth.init(mac_addr, ip_addr, mask_addr, gateway_addr); //Use Static |
Ricky_Kwon | 0:27fe09e9f405 | 93 | eth.connect(); |
Ricky_Kwon | 0:27fe09e9f405 | 94 | |
Ricky_Kwon | 0:27fe09e9f405 | 95 | TCPSocketConnection FTP_CONTROL_SOCK; |
Ricky_Kwon | 0:27fe09e9f405 | 96 | TCPSocketConnection FTP_DATA_SOCK; |
Ricky_Kwon | 0:27fe09e9f405 | 97 | |
Ricky_Kwon | 0:27fe09e9f405 | 98 | sync(); |
Ricky_Kwon | 0:27fe09e9f405 | 99 | //while 1 |
Ricky_Kwon | 0:27fe09e9f405 | 100 | while(true) |
Ricky_Kwon | 0:27fe09e9f405 | 101 | { |
Ricky_Kwon | 1:7d428f360a0a | 102 | Msg_c = pc.getc(); |
Ricky_Kwon | 1:7d428f360a0a | 103 | if(Msg_c==0x31){ |
Ricky_Kwon | 0:27fe09e9f405 | 104 | |
Ricky_Kwon | 0:27fe09e9f405 | 105 | test_jpeg_snapshot_picture(); |
Ricky_Kwon | 0:27fe09e9f405 | 106 | ftpclientrun = true; |
Ricky_Kwon | 0:27fe09e9f405 | 107 | while(ftpclientrun){ |
Ricky_Kwon | 0:27fe09e9f405 | 108 | //while 2 |
Ricky_Kwon | 0:27fe09e9f405 | 109 | while(!FTP_CONTROL_SOCK.is_connected()){ |
Ricky_Kwon | 0:27fe09e9f405 | 110 | pc.printf("Connecting...FTPServer\r\nIP:%s, PORT:%d\r\n", ftpServer_control_ip_addr, FTP_SERVER_PORT); |
Ricky_Kwon | 0:27fe09e9f405 | 111 | FTP_CONTROL_SOCK.connect(ftpServer_control_ip_addr, FTP_SERVER_PORT); |
Ricky_Kwon | 0:27fe09e9f405 | 112 | FTP_CONTROL_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s |
Ricky_Kwon | 0:27fe09e9f405 | 113 | }//end of while 2 |
Ricky_Kwon | 0:27fe09e9f405 | 114 | |
Ricky_Kwon | 0:27fe09e9f405 | 115 | //while 3 |
Ricky_Kwon | 0:27fe09e9f405 | 116 | while(true) |
Ricky_Kwon | 0:27fe09e9f405 | 117 | { |
Ricky_Kwon | 0:27fe09e9f405 | 118 | //gDataSockReady if |
Ricky_Kwon | 0:27fe09e9f405 | 119 | if(gDataSockReady){ |
Ricky_Kwon | 0:27fe09e9f405 | 120 | gDataSockReady = false; |
Ricky_Kwon | 0:27fe09e9f405 | 121 | //FTPCommand.First switch case |
Ricky_Kwon | 0:27fe09e9f405 | 122 | switch(FTPCommand.First){ |
Ricky_Kwon | 0:27fe09e9f405 | 123 | case f_put: |
Ricky_Kwon | 0:27fe09e9f405 | 124 | FTP_CONTROL_SOCK.send(STOR, sizeof(STOR)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 125 | FTP_CONTROL_SOCK.send(fname_server, sizeof(fname_server)); |
Ricky_Kwon | 0:27fe09e9f405 | 126 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 127 | break; |
Ricky_Kwon | 0:27fe09e9f405 | 128 | }//end of FTPCommand.First switch case |
Ricky_Kwon | 0:27fe09e9f405 | 129 | }//end of gDataSockReady if |
Ricky_Kwon | 0:27fe09e9f405 | 130 | /* received from FTPServer */ |
Ricky_Kwon | 0:27fe09e9f405 | 131 | int n = FTP_CONTROL_SOCK.receive(buf, sizeof(buf)); |
Ricky_Kwon | 0:27fe09e9f405 | 132 | if (n <= 0) break; |
Ricky_Kwon | 0:27fe09e9f405 | 133 | buf[n] = '\0'; |
Ricky_Kwon | 1:7d428f360a0a | 134 | pc.printf("\r\nReceived message from server: '%s'\r\n", buf); |
Ricky_Kwon | 0:27fe09e9f405 | 135 | |
Ricky_Kwon | 0:27fe09e9f405 | 136 | //buf if |
Ricky_Kwon | 0:27fe09e9f405 | 137 | if (!strncmp(buf, "220", 3)){ |
Ricky_Kwon | 0:27fe09e9f405 | 138 | FTP_CONTROL_SOCK.send(USER, sizeof(USER)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 139 | //FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); |
Ricky_Kwon | 0:27fe09e9f405 | 140 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 141 | } |
Ricky_Kwon | 0:27fe09e9f405 | 142 | else if(!strncmp(buf, "331", 3)){ |
Ricky_Kwon | 0:27fe09e9f405 | 143 | FTP_CONTROL_SOCK.send(PASS, sizeof(PASS)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 144 | //FTP_CONTROL_SOCK.send(gMsgBuf, User_Keyboard_MSG_Cnt-1); |
Ricky_Kwon | 0:27fe09e9f405 | 145 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 146 | } |
Ricky_Kwon | 0:27fe09e9f405 | 147 | else if(!strncmp(buf, "230", 3)){ |
Ricky_Kwon | 0:27fe09e9f405 | 148 | FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 149 | FTP_CONTROL_SOCK.send(END, sizeof(END)-1); |
Ricky_Kwon | 0:27fe09e9f405 | 150 | FTPCommand.First = f_put; |
Ricky_Kwon | 0:27fe09e9f405 | 151 | } |
Ricky_Kwon | 0:27fe09e9f405 | 152 | else if(!strncmp(buf, "227", 3)){ |
Ricky_Kwon | 0:27fe09e9f405 | 153 | if (pportc(buf) == -1){ |
Ricky_Kwon | 0:27fe09e9f405 | 154 | pc.printf("Bad port syntax\r\n"); |
Ricky_Kwon | 0:27fe09e9f405 | 155 | } |
Ricky_Kwon | 0:27fe09e9f405 | 156 | else{ |
Ricky_Kwon | 0:27fe09e9f405 | 157 | pc.printf("Go Open Data Sock...\r\n "); |
Ricky_Kwon | 0:27fe09e9f405 | 158 | FTPClient.dsock_state = DATASOCK_READY; |
Ricky_Kwon | 0:27fe09e9f405 | 159 | } |
Ricky_Kwon | 0:27fe09e9f405 | 160 | } |
Ricky_Kwon | 0:27fe09e9f405 | 161 | else if(!strncmp(buf, "150", 3)){ |
Ricky_Kwon | 0:27fe09e9f405 | 162 | switch(FTPCommand.First){ |
Ricky_Kwon | 0:27fe09e9f405 | 163 | case f_put: |
Ricky_Kwon | 0:27fe09e9f405 | 164 | FTPCommand.First = f_nocmd; |
Ricky_Kwon | 0:27fe09e9f405 | 165 | FTPCommand.Second = s_put; |
Ricky_Kwon | 0:27fe09e9f405 | 166 | gDataPutGetStart = true; |
Ricky_Kwon | 0:27fe09e9f405 | 167 | break; |
Ricky_Kwon | 0:27fe09e9f405 | 168 | } |
Ricky_Kwon | 0:27fe09e9f405 | 169 | } |
Ricky_Kwon | 0:27fe09e9f405 | 170 | else if(!strncmp(buf, "226", 3)){ |
Ricky_Kwon | 0:27fe09e9f405 | 171 | ftpclientrun = false; |
Ricky_Kwon | 0:27fe09e9f405 | 172 | FTP_CONTROL_SOCK.close(); |
Ricky_Kwon | 0:27fe09e9f405 | 173 | }//end of buf if |
Ricky_Kwon | 0:27fe09e9f405 | 174 | |
Ricky_Kwon | 0:27fe09e9f405 | 175 | |
Ricky_Kwon | 0:27fe09e9f405 | 176 | //DATASOCK_READY if |
Ricky_Kwon | 0:27fe09e9f405 | 177 | if(FTPClient.dsock_state == DATASOCK_READY){ |
Ricky_Kwon | 0:27fe09e9f405 | 178 | while(!FTP_DATA_SOCK.is_connected()){ |
Ricky_Kwon | 0:27fe09e9f405 | 179 | pc.printf("Connecting...FTPServer Data sock\r\nIP:%s, PORT:%d\r\n", ftpServer_data_ip_addr_str, remote_port); |
Ricky_Kwon | 0:27fe09e9f405 | 180 | FTP_DATA_SOCK.connect(ftpServer_control_ip_addr, remote_port); |
Ricky_Kwon | 0:27fe09e9f405 | 181 | FTP_DATA_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s |
Ricky_Kwon | 0:27fe09e9f405 | 182 | } |
Ricky_Kwon | 0:27fe09e9f405 | 183 | FTPClient.dsock_state = DATASOCK_IDLE; |
Ricky_Kwon | 0:27fe09e9f405 | 184 | gDataSockReady = true; |
Ricky_Kwon | 0:27fe09e9f405 | 185 | }//end of DATASOCK_READY if |
Ricky_Kwon | 0:27fe09e9f405 | 186 | |
Ricky_Kwon | 0:27fe09e9f405 | 187 | //gDataPutGetStart if |
Ricky_Kwon | 0:27fe09e9f405 | 188 | if(gDataPutGetStart){ |
Ricky_Kwon | 0:27fe09e9f405 | 189 | //FTPCommand.Second switch case |
Ricky_Kwon | 0:27fe09e9f405 | 190 | switch(FTPCommand.Second){ |
Ricky_Kwon | 0:27fe09e9f405 | 191 | case s_put: |
Ricky_Kwon | 0:27fe09e9f405 | 192 | pc.printf("put waiting...\r\n"); |
Ricky_Kwon | 0:27fe09e9f405 | 193 | fp_jpeg = fopen(fname, "r"); |
Ricky_Kwon | 0:27fe09e9f405 | 194 | fseek(fp_jpeg, 0, SEEK_END); // seek to end of file |
Ricky_Kwon | 0:27fe09e9f405 | 195 | remain_filesize = ftell(fp_jpeg); // get current file pointer |
Ricky_Kwon | 0:27fe09e9f405 | 196 | fseek(fp_jpeg, 0, SEEK_SET); // seek back to beginning of file |
Ricky_Kwon | 0:27fe09e9f405 | 197 | do{ |
Ricky_Kwon | 0:27fe09e9f405 | 198 | memset(buf, 0, sizeof(buf)); |
Ricky_Kwon | 0:27fe09e9f405 | 199 | if(remain_filesize > MAX_SS) |
Ricky_Kwon | 0:27fe09e9f405 | 200 | send_byte = MAX_SS; |
Ricky_Kwon | 0:27fe09e9f405 | 201 | else |
Ricky_Kwon | 0:27fe09e9f405 | 202 | send_byte = remain_filesize; |
Ricky_Kwon | 0:27fe09e9f405 | 203 | fread (buf, 1, send_byte, fp_jpeg); |
Ricky_Kwon | 0:27fe09e9f405 | 204 | FTP_DATA_SOCK.send(buf, send_byte); |
Ricky_Kwon | 0:27fe09e9f405 | 205 | remain_filesize -= send_byte; |
Ricky_Kwon | 0:27fe09e9f405 | 206 | pc.printf("#"); |
Ricky_Kwon | 0:27fe09e9f405 | 207 | }while(remain_filesize!=0); |
Ricky_Kwon | 0:27fe09e9f405 | 208 | fclose(fp_jpeg); |
Ricky_Kwon | 0:27fe09e9f405 | 209 | gDataPutGetStart = false; |
Ricky_Kwon | 0:27fe09e9f405 | 210 | FTPCommand.Second = s_nocmd; |
Ricky_Kwon | 0:27fe09e9f405 | 211 | FTP_DATA_SOCK.close(); |
Ricky_Kwon | 0:27fe09e9f405 | 212 | break; |
Ricky_Kwon | 0:27fe09e9f405 | 213 | |
Ricky_Kwon | 0:27fe09e9f405 | 214 | }//end of FTPCommand.Second switch case |
Ricky_Kwon | 0:27fe09e9f405 | 215 | }//end of gDataPutGetStart if |
Ricky_Kwon | 0:27fe09e9f405 | 216 | }//end of while 3 |
Ricky_Kwon | 0:27fe09e9f405 | 217 | } |
Ricky_Kwon | 0:27fe09e9f405 | 218 | } |
Ricky_Kwon | 0:27fe09e9f405 | 219 | }//end of while 1 |
Ricky_Kwon | 0:27fe09e9f405 | 220 | } |
Ricky_Kwon | 0:27fe09e9f405 | 221 | char* User_Keyboard_MSG(void) |
Ricky_Kwon | 0:27fe09e9f405 | 222 | { |
Ricky_Kwon | 0:27fe09e9f405 | 223 | User_Keyboard_MSG_Cnt = 0; |
Ricky_Kwon | 0:27fe09e9f405 | 224 | memset(gMsgBuf, 0, sizeof(gMsgBuf)); |
Ricky_Kwon | 0:27fe09e9f405 | 225 | do{ |
Ricky_Kwon | 0:27fe09e9f405 | 226 | gMsgBuf[User_Keyboard_MSG_Cnt] = pc.getc(); |
Ricky_Kwon | 0:27fe09e9f405 | 227 | if(gMsgBuf[User_Keyboard_MSG_Cnt]==0x08){ |
Ricky_Kwon | 0:27fe09e9f405 | 228 | User_Keyboard_MSG_Cnt--; |
Ricky_Kwon | 0:27fe09e9f405 | 229 | } |
Ricky_Kwon | 0:27fe09e9f405 | 230 | else{ |
Ricky_Kwon | 0:27fe09e9f405 | 231 | User_Keyboard_MSG_Cnt++; |
Ricky_Kwon | 0:27fe09e9f405 | 232 | } |
Ricky_Kwon | 0:27fe09e9f405 | 233 | }while(gMsgBuf[User_Keyboard_MSG_Cnt-1]!=0x0d); |
Ricky_Kwon | 0:27fe09e9f405 | 234 | return gMsgBuf; |
Ricky_Kwon | 0:27fe09e9f405 | 235 | } |
Ricky_Kwon | 0:27fe09e9f405 | 236 | int pportc(char * arg) |
Ricky_Kwon | 0:27fe09e9f405 | 237 | { |
Ricky_Kwon | 0:27fe09e9f405 | 238 | int i; |
Ricky_Kwon | 0:27fe09e9f405 | 239 | char* tok=0; |
Ricky_Kwon | 0:27fe09e9f405 | 240 | strtok(arg,"("); |
Ricky_Kwon | 0:27fe09e9f405 | 241 | for (i = 0; i < 4; i++) |
Ricky_Kwon | 0:27fe09e9f405 | 242 | { |
Ricky_Kwon | 0:27fe09e9f405 | 243 | if(i==0) tok = strtok(NULL,",\r\n"); |
Ricky_Kwon | 0:27fe09e9f405 | 244 | else tok = strtok(NULL,","); |
Ricky_Kwon | 0:27fe09e9f405 | 245 | ftpServer_data_ip_addr[i] = (uint8_t)atoi(tok); |
Ricky_Kwon | 0:27fe09e9f405 | 246 | if (!tok){ |
Ricky_Kwon | 0:27fe09e9f405 | 247 | pc.printf("bad pport : %s\r\n", arg); |
Ricky_Kwon | 0:27fe09e9f405 | 248 | return -1; |
Ricky_Kwon | 0:27fe09e9f405 | 249 | } |
Ricky_Kwon | 0:27fe09e9f405 | 250 | } |
Ricky_Kwon | 0:27fe09e9f405 | 251 | remote_port = 0; |
Ricky_Kwon | 0:27fe09e9f405 | 252 | for (i = 0; i < 2; i++){ |
Ricky_Kwon | 0:27fe09e9f405 | 253 | tok = strtok(NULL,",\r\n"); |
Ricky_Kwon | 0:27fe09e9f405 | 254 | remote_port <<= 8; |
Ricky_Kwon | 0:27fe09e9f405 | 255 | remote_port += atoi(tok); |
Ricky_Kwon | 0:27fe09e9f405 | 256 | if (!tok){ |
Ricky_Kwon | 0:27fe09e9f405 | 257 | pc.printf("bad pport : %s\r\n", arg); |
Ricky_Kwon | 0:27fe09e9f405 | 258 | return -1; |
Ricky_Kwon | 0:27fe09e9f405 | 259 | } |
Ricky_Kwon | 0:27fe09e9f405 | 260 | } |
Ricky_Kwon | 0:27fe09e9f405 | 261 | pc.printf("ip : %d.%d.%d.%d, port : %d\r\n", ftpServer_data_ip_addr[0], ftpServer_data_ip_addr[1], ftpServer_data_ip_addr[2], ftpServer_data_ip_addr[3], remote_port); |
Ricky_Kwon | 0:27fe09e9f405 | 262 | sprintf(ftpServer_data_ip_addr_str, "%d.%d.%d.%d", ftpServer_data_ip_addr[0], ftpServer_data_ip_addr[1], ftpServer_data_ip_addr[2], ftpServer_data_ip_addr[3]); |
Ricky_Kwon | 0:27fe09e9f405 | 263 | return 0; |
Ricky_Kwon | 0:27fe09e9f405 | 264 | } |
Ricky_Kwon | 0:27fe09e9f405 | 265 | void jpeg_callback(char *buf, size_t siz) { |
Ricky_Kwon | 0:27fe09e9f405 | 266 | for (int i = 0; i < (int)siz; i++) { |
Ricky_Kwon | 0:27fe09e9f405 | 267 | fprintf(fp_jpeg, "%c", buf[i]); |
Ricky_Kwon | 0:27fe09e9f405 | 268 | } |
Ricky_Kwon | 0:27fe09e9f405 | 269 | } |
Ricky_Kwon | 0:27fe09e9f405 | 270 | void sync(void) { |
Ricky_Kwon | 0:27fe09e9f405 | 271 | CameraC328::ErrorNumber err = CameraC328::NoError; |
Ricky_Kwon | 0:27fe09e9f405 | 272 | |
Ricky_Kwon | 0:27fe09e9f405 | 273 | err = camera.sync(); |
Ricky_Kwon | 0:27fe09e9f405 | 274 | if (CameraC328::NoError == err) { |
Ricky_Kwon | 1:7d428f360a0a | 275 | printf("[ OK ] : CameraC328::sync\r\n"); |
Ricky_Kwon | 0:27fe09e9f405 | 276 | } else { |
Ricky_Kwon | 1:7d428f360a0a | 277 | printf("[FAIL] : CameraC328::sync (Error=%02X)\r\n", (int)err); |
Ricky_Kwon | 0:27fe09e9f405 | 278 | } |
Ricky_Kwon | 0:27fe09e9f405 | 279 | } |
Ricky_Kwon | 0:27fe09e9f405 | 280 | void test_jpeg_snapshot_picture(void) { |
Ricky_Kwon | 0:27fe09e9f405 | 281 | CameraC328::ErrorNumber err = CameraC328::NoError; |
Ricky_Kwon | 0:27fe09e9f405 | 282 | |
Ricky_Kwon | 0:27fe09e9f405 | 283 | #if USE_JPEG_HIGH_RESOLUTION |
Ricky_Kwon | 0:27fe09e9f405 | 284 | err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution640x480); |
Ricky_Kwon | 0:27fe09e9f405 | 285 | #else |
Ricky_Kwon | 0:27fe09e9f405 | 286 | err = camera.init(CameraC328::Jpeg, CameraC328::RawResolution80x60, CameraC328::JpegResolution320x240); |
Ricky_Kwon | 0:27fe09e9f405 | 287 | #endif |
Ricky_Kwon | 0:27fe09e9f405 | 288 | if (CameraC328::NoError == err) { |
Ricky_Kwon | 1:7d428f360a0a | 289 | printf("[ OK ] : CameraC328::init\r\n"); |
Ricky_Kwon | 0:27fe09e9f405 | 290 | } else { |
Ricky_Kwon | 1:7d428f360a0a | 291 | printf("[FAIL] : CameraC328::init (Error=%02X)\r\n", (int)err); |
Ricky_Kwon | 0:27fe09e9f405 | 292 | } |
Ricky_Kwon | 0:27fe09e9f405 | 293 | |
Ricky_Kwon | 1:7d428f360a0a | 294 | |
Ricky_Kwon | 1:7d428f360a0a | 295 | snprintf(fname, sizeof(fname), "/sd/jpss%04d.jpg", fnamecnt); |
Ricky_Kwon | 1:7d428f360a0a | 296 | fnamecnt++; |
Ricky_Kwon | 1:7d428f360a0a | 297 | for(int i = 0; i < 12; i++){ |
Ricky_Kwon | 1:7d428f360a0a | 298 | fname_server[0+i] = fname[4+i]; |
Ricky_Kwon | 1:7d428f360a0a | 299 | } |
Ricky_Kwon | 1:7d428f360a0a | 300 | fp_jpeg = fopen(fname, "w"); |
Ricky_Kwon | 0:27fe09e9f405 | 301 | |
Ricky_Kwon | 1:7d428f360a0a | 302 | err = camera.getJpegSnapshotPicture(jpeg_callback); |
Ricky_Kwon | 1:7d428f360a0a | 303 | if (CameraC328::NoError == err) { |
Ricky_Kwon | 1:7d428f360a0a | 304 | printf("[ OK ] : CameraC328::getJpegSnapshotPicture\r\n"); |
Ricky_Kwon | 1:7d428f360a0a | 305 | } else { |
Ricky_Kwon | 1:7d428f360a0a | 306 | printf("[FAIL] : CameraC328::getJpegSnapshotPicture (Error=%02X)\r\n", (int)err); |
Ricky_Kwon | 1:7d428f360a0a | 307 | } |
Ricky_Kwon | 0:27fe09e9f405 | 308 | |
Ricky_Kwon | 1:7d428f360a0a | 309 | fclose(fp_jpeg); |
Ricky_Kwon | 1:7d428f360a0a | 310 | |
Ricky_Kwon | 0:27fe09e9f405 | 311 | } |