class project main.cpp publish

Dependencies:   mbed C12832_lcd USBHost USBHostPTP LCD_Menu

You are viewing an older revision! See the latest version

Homepage

Table of Contents

    Example of using the USBHostPTP class

    Import program

    Go to the documentation of this file.
    00001 /**
    00002 *  @file main.cpp
    00003 *  @brief Function to call USBHostPTP Library
    00004 *  @author Dwayne Dilbeck
    00005 *  @date 8/23/2013
    00006 * 
    00007 * mbed USBHostPTP Library
    00008 *
    00009 * @par Copyright:
    00010 *  Copyright (c) 2013 Dwayne Dilbeck
    00011 * @par License:
    00012 *  This software is distributed under the terms of the GNU Lesser General Public License
    00013 */
    00014 #include "mbed.h"
    00015 #include "C12832_lcd.h"
    00016 #include "USBHostMSD.h"
    00017 #include "USBHostPTP.h"
    00018 #include "Selection.h"
    00019 #include "Menu.h"
    00020 #include "Navigator.h"
    00021 
    00022 /**
    00023 * Define codes to represent Test Functions
    00024 */
    00025 #define GETALLJPG       0x01
    00026 #define GETALLJPGTHUMB  0x02
    00027 #define GETNUMJPG       0x03
    00028 #define GETNUMOBJ       0x04
    00029 #define DUMPDEVICEINFO  0x05
    00030 #define CLOSESESSION    0xFF
    00031 
    00032 /**
    00033 * Initiate Global variables
    00034 */
    00035 DigitalOut led(LED1);
    00036 FILE * fp2;
    00037 C12832_LCD lcd;
    00038 USBHostPTP *ptpdev = NULL;
    00039 USBHostMSD *msddev = NULL;
    00040 char fname[256];
    00041 uint8_t command=0x00;
    00042 bool commandActive=false;
    00043 void (*statusFunction)(void);
    00044 
    00045 /**
    00046 * This function is used to handle the raw data recieved via the bulk pipes
    00047 *
    00048 * @param ptp Pointer to the PTP device
    00049 * @param buffer Pointer to the data recieved
    00050 * @param length Total data received to be processed
    00051 * 
    00052 * @return Void
    00053 */
    00054 void WriteObjectHandles(void *ptp,uint8_t *buffer,uint16_t length){
    00055    int writeResult,errorcode;
    00056    uint16_t transferLength=length;
    00057    uint8_t *dataPtr=buffer;
    00058    
    00059    writeResult=fwrite(dataPtr,sizeof(uint8_t),transferLength,fp2);
    00060    if( writeResult != transferLength) {
    00061        errorcode=ferror(fp2);
    00062        if( errorcode )
    00063        {
    00064           printf("\r\nError in writing to file %d\n",errorcode);
    00065           error("Yucky@!");
    00066        }
    00067    }
    00068 }
    00069 
    00070 /**
    00071 * Test function 0x01
    00072 *
    00073 * @param numberOfImages A pointer to where to write the images on the device
    00074 * @param numberOfThumbs A pointer to where to write the images on the device
    00075 * @return void
    00076 */
    00077 void GetNumberOfThumbsAndImages(int *numberOfImages,int *numberOfThumbs){
    00078     uint32_t fileHandle=0,numImages=0;
    00079     int internalNumberOfImages=0;
    00080     int internalNumberOfThumbs=0;
    00081     
    00082     FILE *fp = fopen("/usb2/objHandles.bin", "rb");
    00083     fread(&numImages,sizeof(uint32_t),1,fp);
    00084     while(numImages>0){
    00085        fread(&fileHandle,sizeof(uint32_t),1,fp);
    00086        ptpdev->GetObjectInfo(fileHandle);
    00087        
    00088        if (ptpdev->objectInfo.thumbFormat == 0x3801 ) {
    00089           internalNumberOfThumbs++;
    00090        }
    00091        if (ptpdev->objectInfo.objectFormat == 0x3801 ) {
    00092           internalNumberOfImages++;
    00093        }
    00094         numImages--;
    00095     }
    00096     fclose(fp);
    00097     *numberOfImages = internalNumberOfImages;
    00098     *numberOfThumbs = internalNumberOfThumbs;
    00099 
    00100 }
    00101 
    00102 /**
    00103 * Retrieve all thumbnail images and real images that are JPG files.
    00104 */
    00105 void GetAllImagesAndThumbs(void) {
    00106     FILE *fp;
    00107         
    00108     uint32_t fileHandle=0,numImages=0;
    00109     
    00110             printf("objectid,objectinfosize,imagetype,thumbtype\r\n");
    00111             fp = fopen("/usb2/objHandles.bin", "rb");
    00112             
    00113             fread(&numImages,sizeof(uint32_t),1,fp);
    00114             while(numImages>0){
    00115                fread(&fileHandle,sizeof(uint32_t),1,fp);
    00116                ptpdev->GetObjectInfo(fileHandle);
    00117                printf("%ld,%x,%x,%x\r\n",numImages,fileHandle,ptpdev->objectInfo.objectFormat,ptpdev->objectInfo.thumbFormat);
    00118 
    00119                if (ptpdev->objectInfo.thumbFormat == 0x3801 && numImages < 864 ) {
    00120                    sprintf(fname,"/usb2/thumb_%s",ptpdev->objectInfo.filename.getString());
    00121                     fp2 = fopen(fname, "wb");                    
    00122                     printf("Starting transfer of %s\r\n",fname);
    00123                     ptpdev->GetThumb(fileHandle,(void *)&WriteObjectHandles);
    00124                     fclose(fp2);
    00125                     printf("GetThumb Transaction Complete\r\n");
    00126                }
    00127                            
    00128                if (ptpdev->objectInfo.objectFormat == 0x3801 && numImages < 864 ) {
    00129                    sprintf(fname,"/usb2/%s",ptpdev->objectInfo.filename.getString());
    00130                    printf("%s -Type: 0x%04x\r\n",fname,ptpdev->objectInfo.objectFormat);
    00131                     printf("Starting transfer of %s\r\n",fname);
    00132                     fp2 = fopen(fname, "wb");   
    00133                     ptpdev->GetObject(fileHandle,(void *)&WriteObjectHandles);
    00134                     fclose(fp2);
    00135                     printf("GetObject Transaction Complete\r\n");
    00136                 }
    00137                 numImages--;
    00138             }
    00139             fclose(fp);
    00140 }
    00141 
    00142 /**
    00143 * Thread to Watch for MSD image
    00144 */
    00145 void msd_task(void const *) {
    00146     USBHostMSD msd2("usb2");
    00147     
    00148     msddev=&msd2;
    00149     while(true) {
    00150         while(!msd2.connect()) {
    00151                 Thread::wait(500);
    00152             }
    00153             
    00154         DIR *dp;
    00155         struct dirent *ep;     
    00156         dp = opendir ("/usb2");
    00157 
    00158         if (dp != NULL)
    00159         {
    00160             ep = readdir (dp);
    00161             while (ep!=NULL) {
    00162               printf("%s\r\n",ep->d_name);
    00163               ep = readdir (dp);
    00164             }
    00165            (void) closedir (dp);
    00166          }
    00167          
    00168          while(msd2.connect()) {
    00169                 Thread::wait(500);
    00170          }
    00171     }
    00172 }
    00173 
    00174 /**
    00175 * Function TO  be called by the menu system to start the execution thread to execute the call.
    00176 */ 
    00177 void SetCommandGETALLJPG(void) {
    00178    command=GETALLJPG;
    00179 }
    00180 
    00181 /**
    00182 * Function to display status during image transfers
    00183 */
    00184 void GetAllJPGStatus(void) {
    00185     led=!led;
    00186     lcd.cls();
    00187     if(ptpdev->dataLeftToTransfer>0) {
    00188         lcd.locate(10,0);
    00189         lcd.printf("%ld/%ld", ptpdev->dataLeftToTransfer, ptpdev->totalDataToTransfer);
    00190         lcd.locate(0,10);
    00191         lcd.printf("%s",fname); 
    00192     }               
    00193 }
    00194 
    00195 /**
    00196 * Thread to watch for the PTP device connected, and commands that need to be executed.
    00197 */
    00198 void ptp_task2(void const *) {
    00199     USBHostPTP ptp;
    00200     ptpdev=&ptp;
    00201         
    00202     int numi,numt;
    00203     uint32_t objCount=0;
    00204     
    00205     while(true) {
    00206         while(!ptpdev->connect()) {
    00207             Thread::wait(500);
    00208         }
    00209         
    00210         while(!msddev->connected()){
    00211             Thread::wait(500);
    00212         }
    00213         
    00214         /* after device connected open a session, get device information, and object handles
    00215         */    
    00216         ptp.OpenSession();
    00217         printf("OpenSession Transaction Complete\r\n\r\n");
    00218         ptp.GetDeviceInfo();
    00219         printf("GetDeviceInfo Transaction Complete\r\n");
    00220         fp2 = fopen("/usb2/objHandles.bin", "wb");
    00221         ptp.GetObjectHandles(0xffffffff,0x0000,0x0000,(void *)&WriteObjectHandles);
    00222         fclose(fp2);
    00223         printf("GetObjecthandles Transaction Complete\r\n");
    00224         
    00225         //While ptp device connected watch for commands.
    00226         while(ptpdev->connected()) {
    00227             commandActive=true;
    00228             switch(command) {
    00229             case GETALLJPG:
    00230                 statusFunction=&GetAllJPGStatus;
    00231                 GetAllImagesAndThumbs();
    00232                 statusFunction=NULL;
    00233                 break;
    00234             case GETALLJPGTHUMB:
    00235                 break;
    00236             case GETNUMJPG:
    00237                 GetNumberOfThumbsAndImages(&numi,&numt);
    00238                 printf("images: %d, thumbs:%d\r\n",numi,numt);
    00239                 break;
    00240             case GETNUMOBJ:
    00241                 ptp.GetNumObjects(&objCount);
    00242                 printf("GetNumObjects Transaction Complete - Count:%ld\r\n",objCount);
    00243                 break;
    00244             case DUMPDEVICEINFO:
    00245                 ptp.DumpDeviceInfo();
    00246                 break;
    00247             case CLOSESESSION:
    00248                 ptpdev->CloseSession();
    00249                 printf("CloseSession Transaction Complete\r\n");
    00250                 break;
    00251             default:
    00252                 commandActive=false;
    00253                 break;
    00254             }
    00255             command=0x00;
    00256             Thread::wait(100);
    00257         }
    00258     }
    00259 }
    00260 
    00261 ///Menu function to set the Command to be executed. 
    00262 void SetCommandGETNUMJPG(void) {
    00263    command=GETNUMJPG;
    00264 }
    00265 
    00266 ///Menu function to set the Command to be executed. 
    00267 void SetCommandGETNUMOBJ(void) {
    00268    command=GETNUMOBJ;
    00269 }
    00270 
    00271 ///Menu function to set the Command to be executed. 
    00272 void SetCommandDUMPDEVICEINFO(void) {
    00273    command=DUMPDEVICEINFO;
    00274 }
    00275 
    00276 ///Menu function to set the Command to be executed. 
    00277 void SetCommandCLOSESESSION(void) {
    00278    command=CLOSESESSION;
    00279 }
    00280 
    00281 ///Main fuction to display the Status of the application.
    00282 int main() {
    00283     lcd.cls();
    00284     lcd.locate(10,3);
    00285     lcd.printf("Initializing");
    00286     Thread ptpTask2(ptp_task2, NULL, osPriorityNormal, 1024 * 4);
    00287     Thread msdTask2(msd_task, NULL, osPriorityNormal,  1024 * 4);
    00288     Menu rootMenu("root"); 
    00289     Menu testMenu("Test menu"); 
    00290     testMenu.add(Selection(&SetCommandDUMPDEVICEINFO, 2, NULL, "Dump Device Info")); // The function argument of selection can be added directly
    00291     testMenu.add(Selection(&SetCommandGETALLJPG, 2, NULL, "Get All Images")); // The function argument of selection can be added directly
    00292     testMenu.add(Selection(&SetCommandGETNUMOBJ, 1, NULL, "Get Number of Objects"));
    00293     testMenu.add(Selection(&SetCommandGETNUMJPG, 3, NULL, "Get Number of Images"));
    00294     //testMenu.add(Selection(NULL, 4, NULL, "Get Number of Thumbnails"));
    00295     //testMenu.add(Selection(NULL, 5, NULL, "Get Number of Thumbnails"));
    00296     testMenu.add(Selection(&SetCommandCLOSESESSION, 4, NULL, "Close Session"));
    00297     testMenu.add(Selection(NULL, 5, &rootMenu, "  Go back"));  // always add a Selection at the end to point to the parent
    00298     Menu aboutMenu("About Menu"); // about menu
    00299     aboutMenu.add(Selection(NULL, 0, NULL, "Author:"));
    00300     aboutMenu.add(Selection(NULL, 1, NULL, " Dwayne S Dilbeck"));
    00301     aboutMenu.add(Selection(NULL, 2, NULL, " 8/29/2013"));
    00302     aboutMenu.add(Selection(NULL, 3, NULL, " USB Device Interface:"));
    00303     aboutMenu.add(Selection(NULL, 4, NULL, " Architecture,"));
    00304     aboutMenu.add(Selection(NULL, 5, NULL, " Protocols,"));
    00305     aboutMenu.add(Selection(NULL, 6, NULL, " and programming."));
    00306     aboutMenu.add(Selection(NULL, 7, &rootMenu, "  Go back"));
    00307     rootMenu.add(Selection(NULL, 0, &testMenu, "TEST MENU"));
    00308     rootMenu.add(Selection(NULL, 1, &aboutMenu, "About menu"));   
    00309     Navigator navigator(&rootMenu, &lcd);
    00310     
    00311     while(1) {
    00312         if(ptpdev != NULL) {
    00313             if(ptpdev->connected()) {
    00314                 if(!commandActive) {
    00315                     navigator.poll(); 
    00316                 } else {
    00317                     if(statusFunction != NULL)
    00318                        (*statusFunction)();
    00319                     else {
    00320                         lcd.cls();
    00321                         wait_ms(20);
    00322                     }
    00323                 }
    00324                 
    00325             } else {
    00326                lcd.cls();
    00327                lcd.locate(10,3);
    00328                lcd.printf("Please connect PTP device.");
    00329             }            
    00330         }
    00331         Thread::wait(200);
    00332     }
    00333 }
    00334 
    00335 
    00336 
    00337 
    

    All wikipages