I made Digital Camera using Arducam & WIZwiki-W7500
Dependencies: Arduino Arducam_OV5642 SDFileSystem Arducam_UTFT_SPI WIZnetInterface_Ricky mbed
Diff: main.cpp
- Revision:
- 4:63042b865304
- Parent:
- 3:23d439c8526b
--- a/main.cpp Thu Oct 29 10:09:41 2015 +0000 +++ b/main.cpp Thu Oct 29 23:31:53 2015 +0000 @@ -4,51 +4,111 @@ #include "OV5642_regs.h" #include "SDFileSystem.h" #include "Arduino.h" - -void setup(); -void loop(); -void itoa( unsigned long long int value, char *str); +#include "EthernetInterface.h" +#include <stdio.h> +#include <string.h> ArduCAM myCAM(D11, D12, D13, D10, D14, D15); ArduLCD myGLCD(D11, D12, D13, D10); SDFileSystem sd(D11, D12, D13, D9, "sd"); + Serial pc(USBTX, USBRX); bool isShowFlag = true; +char fnamecamera[32]; +char fnamecntcamera=0; + +/* FTP */ +#define USER "user " +#define PASS "pass " +#define PASV "pasv " +#define PORT "port " +#define LIST "list " +#define STOR "stor " +#define RETR "retr " +#define END "\r\n" +#define FTP_SERVER_PORT 21 +#define MAX_SS 256 +bool gDataSockReady = false; +bool gDataPutGetStart = false; +bool ftpclientrun = false; +int remote_port; +char ftpServer_data_ip_addr[4]={0,}; +char ftpServer_data_ip_addr_str[20]={0,}; +static char buf[256]; +static char ID[]={"abc"}; //Set FTPServer Login ID +static char PASSWORD[]={"123"}; //Set FTPServer Login Password +enum CommandFirst { + f_nocmd, + f_put, +}; +enum CommandSecond { + s_nocmd, + s_put, +}; +enum ftpc_datasock_state{ + DATASOCK_IDLE, + DATASOCK_READY, + DATASOCK_START +}; +struct Command { + enum CommandFirst First; + enum CommandSecond Second; +}; +struct ftpc { + enum ftpc_datasock_state dsock_state; +}; +struct ftpc FTPClient; +struct Command FTPCommand; + +/* SD Card filesystem */ +static FILE *fp_jpeg; char fname[32]; +char fname_server[16]; char fnamecnt=0; +char gMsgBuf[10]; +char User_Keyboard_MSG_Cnt; +/* Function*/ +char* User_Keyboard_MSG(void); +int pportc(char * arg); +void FTP_server_uploader(); +void setup(); +void loop(); +void itoa( unsigned long long int value, char *str); int main() { - *(volatile uint32_t *)(0x41001014) = 0x0060200; //clock 48MHz + *(volatile uint32_t *)(0x41001014) = 0x0060200; //clock 24MHz setup(); + //FTP_server_uploader(); while(1) { - loop(); - } + loop(); + } } void setup() { - uint8_t vid,pid; - uint8_t temp; - - pc.baud(115200); - pc.printf("ArduCAM Start!\r\n"); + uint8_t vid,pid; + uint8_t temp; - uint8_t temp1,temp2; - myCAM.write_reg(ARDUCHIP_TEST1, 0x55); //Write to test1 register by 0x55 - myCAM.write_reg(ARDUCHIP_TEST2, 0xAA); //Write to test1 register by 0xaa - wait_ms(1000); - temp1 = myCAM.read_reg(ARDUCHIP_TEST1); //Read from test1 register - temp2 = myCAM.read_reg(ARDUCHIP_TEST2); //Read from test1 register - pc.printf("temp1 : %d\r\n",temp1); - pc.printf("temp2 : %d\r\n",temp2); - wait_ms(1000); - - myCAM.write_reg(ARDUCHIP_TEST1, 0x55); - temp = myCAM.read_reg(ARDUCHIP_TEST1); + pc.baud(115200); + + pc.printf("ArduCAM Start!\r\n"); + + uint8_t temp1,temp2; + myCAM.write_reg(ARDUCHIP_TEST1, 0x55); //Write to test1 register by 0x55 + myCAM.write_reg(ARDUCHIP_TEST2, 0xAA); //Write to test1 register by 0xaa + wait_ms(1000); + temp1 = myCAM.read_reg(ARDUCHIP_TEST1); //Read from test1 register + temp2 = myCAM.read_reg(ARDUCHIP_TEST2); //Read from test1 register + pc.printf("temp1 : %d\r\n",temp1); + pc.printf("temp2 : %d\r\n",temp2); + wait_ms(1000); + + myCAM.write_reg(ARDUCHIP_TEST1, 0x55); + temp = myCAM.read_reg(ARDUCHIP_TEST1); if(temp != 0x55) { @@ -91,7 +151,7 @@ myCAM.set_mode(MCU2LCD_MODE); myCAM.set_format(JPEG); myCAM.InitCAM(); - myCAM.OV5642_set_JPEG_size(); + myCAM.OV5642_set_JPEG_size(OV5642_1920x1080); myCAM.write_reg(ARDUCHIP_TIM, VSYNC_LEVEL_MASK); //VSYNC is active HIGH //Wait until buttom released @@ -129,10 +189,10 @@ pc.printf("Capture Done!\r\n"); //Construct a file name - snprintf(fname, sizeof(fname), "/sd/jpss%04d.jpg", fnamecnt); - fnamecnt++; + snprintf(fnamecamera, sizeof(fnamecamera), "/sd/jpss%04d.jpg", fnamecntcamera); + fnamecntcamera++; //Open the new file - outFile = fopen(fname,"w"); + outFile = fopen(fnamecamera,"w"); if (! outFile) { pc.printf("open file failed\r\n"); @@ -195,3 +255,197 @@ str[i]=temp[i]; } } + +void FTP_server_uploader(){ + + char Msg_c; + int remain_filesize; + int send_byte; + + pc.printf("Hello FTP Camera!\r\n"); + + uint8_t mac_addr[6] = {0x00, 0x08, 0xdc, 0x12, 0x34, 0x45}; + const char ip_addr[] = "192.168.0.123"; // WIZwiki-W7500 IP-address + const char mask_addr[] = "255.255.255.0"; + const char gateway_addr[] = "192.168.0.1"; + const char ftpServer_control_ip_addr[] = "192.168.0.209"; // my IP address + + + EthernetInterface eth; + eth.init(mac_addr, ip_addr, mask_addr, gateway_addr); //Use Static + eth.connect(); + + TCPSocketConnection FTP_CONTROL_SOCK; + TCPSocketConnection FTP_DATA_SOCK; + + + pc.printf("\r\n----------------------------------------\r\n"); + pc.printf("Press menu key\r\n"); + pc.printf("----------------------------------------\r\n"); + pc.printf("1> Snapshot Picture and Send to FTPServer\r\n"); + pc.printf("----------------------------------------\r\n"); + Msg_c = pc.getc(); + if(Msg_c==0x31){ + + ftpclientrun = true; + while(ftpclientrun){ + //while 2 + while(!FTP_CONTROL_SOCK.is_connected()){ + pc.printf("Connecting...FTPServer\r\nIP:%s, PORT:%d\r\n", ftpServer_control_ip_addr, FTP_SERVER_PORT); + FTP_CONTROL_SOCK.connect(ftpServer_control_ip_addr, FTP_SERVER_PORT); + FTP_CONTROL_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s + }//end of while 2 + + //while 3 + while(true) + { + //gDataSockReady if + if(gDataSockReady){ + gDataSockReady = false; + //FTPCommand.First switch case + switch(FTPCommand.First){ + case f_put: + FTP_CONTROL_SOCK.send(STOR, sizeof(STOR)-1); + FTP_CONTROL_SOCK.send(fname_server, sizeof(fname_server)); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + break; + }//end of FTPCommand.First switch case + }//end of gDataSockReady if + /* received from FTPServer */ + int n = FTP_CONTROL_SOCK.receive(buf, sizeof(buf)); + if (n <= 0) break; + buf[n] = '\0'; + pc.printf("\r\nReceived message from server: '%s'\r\n", buf); + + //buf if + if (!strncmp(buf, "220", 3)){ + FTP_CONTROL_SOCK.send(USER, sizeof(USER)-1); + FTP_CONTROL_SOCK.send(ID, sizeof(ID)); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + } + else if(!strncmp(buf, "331", 3)){ + FTP_CONTROL_SOCK.send(PASS, sizeof(PASS)-1); + FTP_CONTROL_SOCK.send(PASSWORD, sizeof(PASSWORD)); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + } + else if(!strncmp(buf, "230", 3)){ + FTP_CONTROL_SOCK.send(PASV, sizeof(PASV)-1); + FTP_CONTROL_SOCK.send(END, sizeof(END)-1); + FTPCommand.First = f_put; + } + else if(!strncmp(buf, "227", 3)){ + if (pportc(buf) == -1){ + pc.printf("Bad port syntax\r\n"); + } + else{ + pc.printf("Go Open Data Sock...\r\n "); + FTPClient.dsock_state = DATASOCK_READY; + } + } + else if(!strncmp(buf, "150", 3)){ + switch(FTPCommand.First){ + case f_put: + FTPCommand.First = f_nocmd; + FTPCommand.Second = s_put; + gDataPutGetStart = true; + break; + } + } + else if(!strncmp(buf, "226", 3)){ + ftpclientrun = false; + FTP_CONTROL_SOCK.close(); + }//end of buf if + + + //DATASOCK_READY if + if(FTPClient.dsock_state == DATASOCK_READY){ + while(!FTP_DATA_SOCK.is_connected()){ + pc.printf("Connecting...FTPServer Data sock\r\nIP:%s, PORT:%d\r\n", ftpServer_data_ip_addr_str, remote_port); + FTP_DATA_SOCK.connect(ftpServer_control_ip_addr, remote_port); + FTP_DATA_SOCK.set_blocking(false, 15000); // Timeout after (1.5)s + } + FTPClient.dsock_state = DATASOCK_IDLE; + gDataSockReady = true; + }//end of DATASOCK_READY if + + //gDataPutGetStart if + if(gDataPutGetStart){ + //FTPCommand.Second switch case + switch(FTPCommand.Second){ + case s_put: + pc.printf("put waiting...\r\n"); + snprintf(fname, sizeof(fname), "/sd/jpss0000.jpg"); + fp_jpeg = fopen(fname, "r"); + fseek(fp_jpeg, 0, SEEK_END); // seek to end of file + remain_filesize = ftell(fp_jpeg); // get current file pointer + fseek(fp_jpeg, 0, SEEK_SET); // seek back to beginning of file + do{ + memset(buf, 0, sizeof(buf)); + if(remain_filesize > MAX_SS) + send_byte = MAX_SS; + else + send_byte = remain_filesize; + fread (buf, 1, send_byte, fp_jpeg); + FTP_DATA_SOCK.send(buf, send_byte); + remain_filesize -= send_byte; + pc.printf("#"); + }while(remain_filesize!=0); + fclose(fp_jpeg); + gDataPutGetStart = false; + FTPCommand.Second = s_nocmd; + FTP_DATA_SOCK.close(); + break; + + }//end of FTPCommand.Second switch case + }//end of gDataPutGetStart if + }//end of while 3 + } + } +} + +char* User_Keyboard_MSG(void) +{ + User_Keyboard_MSG_Cnt = 0; + memset(gMsgBuf, 0, sizeof(gMsgBuf)); + do{ + gMsgBuf[User_Keyboard_MSG_Cnt] = pc.getc(); + if(gMsgBuf[User_Keyboard_MSG_Cnt]==0x08){ + User_Keyboard_MSG_Cnt--; + } + else{ + User_Keyboard_MSG_Cnt++; + } + }while(gMsgBuf[User_Keyboard_MSG_Cnt-1]!=0x0d); + return gMsgBuf; +} + +int pportc(char * arg) +{ + int i; + char* tok=0; + strtok(arg,"("); + for (i = 0; i < 4; i++) + { + if(i==0) tok = strtok(NULL,",\r\n"); + else tok = strtok(NULL,","); + ftpServer_data_ip_addr[i] = (uint8_t)atoi(tok); + if (!tok){ + pc.printf("bad pport : %s\r\n", arg); + return -1; + } + } + remote_port = 0; + for (i = 0; i < 2; i++){ + tok = strtok(NULL,",\r\n"); + remote_port <<= 8; + remote_port += atoi(tok); + if (!tok){ + pc.printf("bad pport : %s\r\n", arg); + return -1; + } + } + 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); + 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]); + return 0; +} +