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.

/media/uploads/MidnightCow/dpf_logo.jpg


Demo

https://vimeo.com/137345478

<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

Files at this revision

API Documentation at this revision

Comitter:
MidnightCow
Date:
Wed Aug 26 13:43:34 2015 +0000
Parent:
0:583a42b8d940
Child:
2:c069ab35d315
Commit message:
Enhance Program

Changed in this revision

FTPClient.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/FTPClient.lib	Sat Aug 15 08:45:28 2015 +0000
+++ b/FTPClient.lib	Wed Aug 26 13:43:34 2015 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/users/MidnightCow/code/FTPClient/#4bef734cc93e
+https://developer.mbed.org/users/MidnightCow/code/FTPClient/#f748d78bba4e
--- 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();
-    }
+    
 }