Download NHK English news podcast automatically. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/

Dependencies:   BlinkLed HTTPClient EthernetInterface FatFileSystemCpp MSCFileSystem mbed-rtos mbed

Download NHK English news podcast automatically. This application requires mpod mother board. See also http://mbed.org/users/geodenx/notebook/mpod/

Revision:
2:0da3a4508b46
Parent:
1:1637e625b21b
Child:
3:07562878d3c3
--- a/main.cpp	Fri Aug 17 12:49:12 2012 +0000
+++ b/main.cpp	Sat Aug 18 16:46:40 2012 +0000
@@ -5,7 +5,12 @@
 #include "HTTPFile.h"
 #include "BlinkLed.h"
 #include "tinyxml2.h"
+#include <string>
+#include <iostream>
 
+using std::string;
+using std::cout;
+using std::endl;
 using namespace tinyxml2;
 
 int GetFile(const char *path, const char *url);
@@ -13,7 +18,8 @@
 EthernetInterface eth;
 HTTPClient http;
 MSCFileSystem usb("usb");
-BlinkLed led1(LED1, 4);
+BlinkLed led1(LED1, 6);
+BlinkLed led2(LED2, 1);
 DigitalOut fsusb30s(p9);
 Timer timer;
 
@@ -37,77 +43,101 @@
     eth.connect();
     
     // Obtain original lastBuildDate
-    const char* lastBuildDateOriginal;
-    XMLDocument docOriginal;
-    if(XML_SUCCESS != docOriginal.LoadFile(rssPath))
+    string lastBuildDateOriginal;
     {
-        lastBuildDateOriginal = "No english.xml in USB memory";
+        XMLDocument docOriginal;
+        if(XML_SUCCESS != docOriginal.LoadFile(rssPath))
+        {
+            lastBuildDateOriginal = "No original english.xml in USB memory";
+        }
+        else
+        {
+            XMLElement* lastBuildDateOriginalElement = docOriginal.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("lastBuildDate");
+            if(NULL == lastBuildDateOriginalElement)
+            {
+                lastBuildDateOriginal = "No \"lastBuildDate\" element in original RSS";
+            }
+            else
+            {
+                lastBuildDateOriginal = lastBuildDateOriginalElement->GetText();
+            }
+        }
     }
-    XMLElement* lastBuildDateOriginalElement = docOriginal.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("lastBuildDate");
-    if(NULL == lastBuildDateOriginalElement)
-    {
-        lastBuildDateOriginal = "No \"lastBuildDate\" element in RSS";
-    }
-    else
-    {
-        lastBuildDateOriginal = lastBuildDateOriginalElement->GetText();
-    }
+    cout << endl << "lastBuildDate (original): " << lastBuildDateOriginal << endl;
     
     // Download RSS
     GetFile(rssPath, rssUrl);
     
     // Obtain current lastBuildDate 
-    const char* lastBuildDateCurrent;
-    XMLDocument docCurrent;
-    if(XML_SUCCESS != docCurrent.LoadFile(rssPath))
+    string lastBuildDateCurrent;
+    string mp3Url;
+    string mp3Length;
     {
-        lastBuildDateCurrent = "No english.xml in USB memory";
-    }
-    XMLElement* lastBuildDateCurrentElement = docCurrent.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("lastBuildDate");
-    if(NULL == lastBuildDateCurrentElement)
-    {
-        lastBuildDateCurrent = "No \"lastBuildDate\" element in RSS";
+        XMLDocument docCurrent;
+        if(XML_SUCCESS != docCurrent.LoadFile(rssPath))
+        {
+            fsusb30s = 1; // HSD2
+            error("No current english.xml in USB memory.\n");
+        }
+        
+        XMLElement* lastBuildDateCurrentElement = docCurrent.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("lastBuildDate");
+        if(NULL == lastBuildDateCurrentElement)
+        {
+            fsusb30s = 1; // HSD2
+            error("No \"lastBuildDate\" element in current RSS.\n");
+        }
+        lastBuildDateCurrent = lastBuildDateCurrentElement->GetText();
+        
+        XMLElement* enclosureElement = docCurrent.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("item")->FirstChildElement("enclosure");
+        if(NULL == enclosureElement)
+        {
+            fsusb30s = 1; // HSD2
+            error("No \"enclosure\" element in current RSS.\n");
+        }
+        mp3Url = enclosureElement->Attribute( "url" );
+        mp3Length = enclosureElement->Attribute( "length" );
     }
-    else
-    {
-        lastBuildDateCurrent = lastBuildDateCurrentElement->GetText();
-    }
+    cout << endl << "lastBuildDate (current) : " << lastBuildDateCurrent << endl;
     
-    printf("\n");
-    printf("lastBuildDate (original): %s\n", lastBuildDateOriginal);
-    printf("lastBuildDate (current) : %s\n", lastBuildDateCurrent);
-    
-    // Download new MP3
-    if (strcmp(lastBuildDateOriginal, lastBuildDateCurrent) == 0)
+    // Determine the necessity of downloading new MP3.
+    bool flgDownloadMp3 = false;
+    if (lastBuildDateOriginal == lastBuildDateCurrent)
     {
-        printf("lastBuildDate (original) == lastBuildDate (current)\n");
+        cout << "lastBuildDate (original) == lastBuildDate (current)" << endl;
         FILE* mp3fp = fopen(mp3Path, "r"); // check an existance of english.mp3
         if (mp3fp != NULL)
         {
+            fseek(mp3fp, 0, SEEK_END); // seek to end of file
+            if (ftell(mp3fp) != atol(mp3Length.c_str()))
+            {
+                cout << "MP3 file size is invalid." << endl;
+                flgDownloadMp3 = true;
+            }
             fclose(mp3fp);
         }
         else
         {
-            printf("However, no enlish.mp3 in USB memory\n");
+            cout << "However, no enlish.mp3 in USB memory" << endl;
+            flgDownloadMp3 = true;
         }
     }
     else
     {
-        printf("lastBuildDate (original) != lastBuildDate (current)\n");
-        XMLElement* enclosureElement = docCurrent.FirstChildElement("rss")->FirstChildElement("channel")->FirstChildElement("item")->FirstChildElement("enclosure");
-        if(NULL == enclosureElement)
-        {
-            printf("No \"enclosure\" element in RSS");
-        }
-        else
-        {
-            const char* mp3Url = enclosureElement->Attribute( "url" );
-            GetFile(mp3Path, mp3Url);
-        }
+        cout << "lastBuildDate (original) != lastBuildDate (current)" << endl;
+        flgDownloadMp3 = true;
     }
     
+    // Download new MP3
+    if(flgDownloadMp3 == true)
+    {
+        GetFile(mp3Path, mp3Url.c_str());
+    }
+    
+    // Wait for the completion of writing to USB Mass Storage Device.
+    wait(1);
+    
     // FSUSB30 switches to HSD2 (External Device)
-    printf("\nUSB host was switched to HSD2(External Device).\n");
+    cout << endl << "USB host was switched to HSD2(External Device)." << endl;
     fsusb30s = 1; // HSD2
 
     // blink LED
@@ -118,24 +148,27 @@
 
 int GetFile(const char *path, const char *url)
 {
-    HTTPFile file(path);
-    printf("\nGetting %s\n", url);
+    led2.startBlink();
+    cout << endl << "Getting " << url << endl;
     
     timer.stop();
     timer.reset();
     timer.start();
     
+    HTTPFile file(path);
     HTTPResult retGet = http.get(url, &file);
-    if (retGet != HTTP_OK) {
+    if (retGet != HTTP_OK)
+    {
         // FSUSB30 switches to HSD2 (External Device)
-        printf("USB host was switched to HSD2(External Device).\n");
+        cout << "USB host was switched to HSD2(External Device)." << endl;
         fsusb30s = 1; // HSD2
         error("Error in http.get in GetFile(): %d\n", retGet);
     }
     file.clear();
     
     timer.stop();
-    printf("timer.read_ms(): %d\n", timer.read_ms());
-
+    cout << "timer.read_ms(): " << timer.read_ms() << endl;
+    
+    led2.finishBlink();
     return (0);
 }