Digital Photo Frame using FTP Client
Dependencies: FTPClient SDFileSystem SeeedStudioTFTv2 TFT_fonts WIZnetInterface mbed
Overview
This program is smart Digital Photo Frame remotely controlled by FTP protocol.
Demo
<iframe src="https://player.vimeo.com/video/137345478" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> <p><a href="https://vimeo.com/137345478">Digital Photo Frame controlled remotely by using FTP protocol.</a> from <a href="https://vimeo.com/midnightcow">MidnightCow</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
For more detail
http://midnightcow.tistory.com/entry/Digital-Photo-Frame-controlled-remotely-by-using-FTP-protocol
Diff: main.cpp
- Revision:
- 1:72700c87f8d5
- Parent:
- 0:583a42b8d940
--- a/main.cpp Sat Aug 15 08:45:28 2015 +0000 +++ b/main.cpp Wed Aug 26 13:43:34 2015 +0000 @@ -24,15 +24,15 @@ #define PIN_CS_SD D4 #define MAC "\x00\x08\xDC\x11\x34\x78" -#define IP "192.168.77.100" +#define IP "192.168.1.100" #define MASK "255.255.255.0" -#define GATEWAY "192.168.77.1" +#define GATEWAY "192.168.1.1" -#define HTTPD_SERVER_PORT 80 -#define HTTPD_MAX_REQ_LENGTH 1023 -#define HTTPD_MAX_HDR_LENGTH 255 -#define HTTPD_MAX_FNAME_LENGTH 127 -#define HTTPD_MAX_DNAME_LENGTH 127 +#define FTP_SERVER_IP "192.168.1.200" + +#define _MAX_FNAME_LEN_ 127 +#define _FTP_UPDATE_TIME_ 20 + Serial uart(USBTX, USBRX); @@ -43,24 +43,10 @@ EthernetInterface eth; -/* -char buffer[HTTPD_MAX_REQ_LENGTH+1]; -char httpHeader[HTTPD_MAX_HDR_LENGTH+1]; -char fileName[HTTPD_MAX_FNAME_LENGTH+1]; -char dirName[HTTPD_MAX_DNAME_LENGTH+1]; -char *uristr; -char *eou; -char *qrystr; - -FILE *fp; -int rdCnt; -*/ - DigitalOut led1(LED1); //server listning status DigitalOut led2(LED2); //socket connecting status - MySeeedStudioTFTv2 TFT(PIN_XP, PIN_XM, PIN_YP, PIN_YM, PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, PIN_DC_TFT, PIN_BL_TFT, PIN_CS_SD); @@ -68,12 +54,17 @@ Ticker ledTick; +uint32_t ftp_time_1s = 0; char myfilelist[MAX_SS] = {0,}; void ledTickfunc() { led1 = !led1; + if(ftp_time_1s) + { + if(ftp_time_1s++ > _FTP_UPDATE_TIME_) ftp_time_1s = 0; + } } @@ -82,109 +73,125 @@ int ret; char* tok = NULL; char* lasts = NULL; - char filename[20]; + char filename[_MAX_FNAME_LEN_]; FILE* fp; - - - ledTick.attach(&ledTickfunc,0.5); - + // Serial Interface eth; uart.baud(115200); uart.printf("Initializing\n"); -// Check File System - uart.printf("Checking File System\n"); - DIR *d = opendir("/sdc/"); - if (d != NULL) { - uart.printf("SD Card Present\n"); - } else { - uart.printf("SD Card Root Directory Not Found\n"); - } - // EthernetInterface eth; uart.printf("Initializing Ethernet\n"); + //eth.init(); //Use DHCP eth.init((uint8_t*)MAC,IP,MASK,GATEWAY); //IP,mask,Gateway uart.printf("Connecting\n"); eth.connect(); uart.printf("IP Address is %s\n", eth.getIPAddress()); - //Configure the display driver - TFT.background(Black); - TFT.foreground(White); - TFT.set_font((unsigned char*) Arial12x12); - TFT.cls(); +// Check File System + uart.printf("Checking File System\n"); + DIR *d = opendir("/sdc/"); + if (d != NULL) { + uart.printf("SD Card Present\n"); + closedir(d); + } else { + uart.printf("SD Card Root Directory Not Found\n"); + } + ledTick.attach(&ledTickfunc,1); - if(myFTP.open("192.168.77.210", 21, "user", "pass")) + while(1) { - printf("Connect Success to FTPServer\r\n"); - } - myFTP.ls(myfilelist); - - - if(*myfilelist !=0) - { - tok = myfilelist; - while(tok) + if(ftp_time_1s == 0) { - tok = strtok_r(tok,"\r\n",&lasts); - if(tok != NULL) + //Configure the display driver + ftp_time_1s = 1; + TFT.background(Black); + TFT.foreground(White); + TFT.set_font((unsigned char*) Arial12x12); + TFT.cls(); + + TFT.locate(0,0); + TFT.printf(" UPDATING PHOTO\n"); + TFT.printf("==================\n\n"); + + if(myFTP.open("192.168.77.210", 21, "user", "pass")) { - printf("tok=%s\r\n",tok); - if(strstr(tok,"bmp")) + printf("Connect Success to FTPServer\r\n"); + TFT.printf("Connected to FTP Server\n"); + + myFTP.ls(myfilelist); + + if(*myfilelist !=0) { - sprintf(filename,"/sdc/%s",tok); + tok = myfilelist; + while(tok) + { + tok = strtok_r(tok,"\r\n",&lasts); + if(tok != NULL) + { + printf("tok=%s\r\n",tok); + if(strstr(tok,"bmp")) + { + sprintf(filename,"/sdc/%s",tok); + fp = fopen(filename, "r"); + printf("fp=%d\r\n",fp); + if(fp==NULL) + { + myFTP.getfile(tok); + printf("Get File : %s\r\n",tok); + TFT.printf(" New file : %s\n", tok); + } + else fclose(fp); + } + tok = lasts; + } + } + } + else TFT.printf(" Empty FTP Server\n"); + TFT.printf("\n UPDATE DONE\n"); + myFTP.quit(); + } + else + { + TFT.printf(" Can't connect to FTP Server\n\n"); + TFT.printf(" UPDATE FAIL\n"); + } + TFT.printf("==================\n"); + } + + d = opendir("/sdc/"); + if(d != NULL) + { + struct dirent *p; + while((p = readdir(d)) != NULL) + { + sprintf(filename, "/sdc/%s", p->d_name); + uart.printf("%s\n", filename); + DIR *subDir = opendir(filename); + if (subDir != NULL) uart.printf("Skip a sub-directory\r\n"); + else + { fp = fopen(filename, "r"); - printf("fp=%d\r\n",fp); - if(fp==NULL) + if(fp) { - myFTP.getfile(tok); - printf("Get File : %s\r\n",tok); + TFT.DrawBitmapFile(fp); + TFT.locate(1,1); + TFT.printf("%s", filename); + fclose(fp); } - else fclose(fp); + else uart.printf("Can't open file %s\r\n", filename); } - tok = lasts; } - + } + else + { + TFT.cls(); + TFT.locate(0,0); + TFT.printf(" No SD Card !!!\n"); + TFT.printf(" Insert a SD card\n"); } } - myFTP.quit(); - -/* - struct dirent *p; - while((p = readdir(d)) != NULL) { - sprintf(dirName, "%s/%s", fileName, p->d_name); - uart.printf("%s\n", dirName); - DIR *subDir = opendir(dirName); - if (subDir != NULL) { - sprintf(httpHeader,"<li><a href=\"./%s/\">%s/</a></li>", p->d_name, p->d_name); - } else { - sprintf(httpHeader,"<li><a href=\"./%s\">%s</a></li>", p->d_name, p->d_name); - } - client.send(httpHeader,strlen(httpHeader)); - } -*/ - - for(int i=0; i < 4; i++) - { - TFT.set_orientation(i); - fp = fopen("/sdc/island.bmp", "r"); - if((ret = TFT.DrawBitmapFile(fp)) < 0) - { - printf("error : %d\r\n",ret); - } - fclose(fp); - TFT.locate(120-6*strlen("islasn.bmp"),308); - TFT.printf("red24.bmp"); - fp = fopen("/sdc/tiger24.bmp", "r"); - if((ret = TFT.DrawBitmapFile(fp)) < 0) - { - printf("error : %d\r\n",ret); - } - fclose(fp); - TFT.locate(120-6*strlen("tiger24.bmp"),308); - TFT.printf("tiger24.bmp"); - printf("press key");getchar(); - } + }