//---------------------------------------------------------------------
    bool CanonCameraWrapper::beginLiveView(){
        printf("Begining live view\n");

        preCommand();
	

        EdsError err = EDS_ERR_OK;

		if(evfMode == 0){
			evfMode = 1;
			// Set to the camera.
			err = EdsSetPropertyData(theCamera, kEdsPropID_Evf_Mode, 0, sizeof(evfMode), &evfMode);			
		}

		if( err == EDS_ERR_OK){
			// Set the PC as the current output device.
			device = kEdsEvfOutputDevice_PC;

			// Set to the camera.
			err = EdsSetPropertyData(theCamera, kEdsPropID_Evf_OutputDevice, 0, sizeof(device), &device);
		}

		//Notification of error
		if(err != EDS_ERR_OK){
			// It doesn't retry it at device busy
			if(err == EDS_ERR_DEVICE_BUSY){
				printf("BeginLiveView - device is busy\n");
				//CameraEvent e("DeviceBusy");
				//_model->notifyObservers(&e);
			}else{
				printf("BeginLiveView - device is busy\n");
			}
			return false;
		}
    }
	bool CanonCameraWrapper::sendCommand( EdsCameraCommand inCommand,  EdsInt32 inParam){
      
		EdsError err = EDS_ERR_OK;
		
		if( preCommand() ){
			err = EdsSendCommand(theCamera, inCommand, inParam);
		
			postCommand();
			
			if(err == EDS_ERR_OK){
				return true;
			}
						
			if(err == EDS_ERR_DEVICE_BUSY){
				printf("CanonCameraWrapper::sendCommand - EDS_ERR_DEVICE_BUSY\n");
				return false;
			}
			
		}
		
		return false;
	}
///////////////////////////////////////////////////////////////////////////////
//  PUBLIC FUNCTIONS
//
void MatrixDisplay::initDisplay(uint8_t displayNum, uint8_t pin, bool master)
{        
	// Associate the pin with this display
	pDisplayPins[displayNum] = pin;
	// init the hardware
	pinMode(pin, OUTPUT);
	bitBlast(pin, 1); // Disable chip (pull high)
	
	selectDisplay(displayNum);
	// Send Precommand
	preCommand();
	// Take advantage of successive mode and write the options
	writeDataBE(8,HT1632_CMD_SYSDIS, true);
	//sendOptionCommand(HT1632_CMD_MSTMD);
	writeDataBE(8,HT1632_CMD_SYSON,true);
	writeDataBE(8,HT1632_CMD_COMS10,true);
	writeDataBE(8,HT1632_CMD_LEDON,true);
	writeDataBE(8,HT1632_CMD_BLOFF,true);
	writeDataBE(8,HT1632_CMD_PWM+15,true);
	releaseDisplay(displayNum);
	clear(displayNum,true);
}
    //---------------------------------------------------------------------
    bool CanonCameraWrapper::downloadLastImage(){
        preCommand();

        EdsVolumeRef 		theVolumeRef	    = NULL ;
        EdsDirectoryItemRef	dirItemRef_DCIM	    = NULL;
        EdsDirectoryItemRef	dirItemRef_Sub	    = NULL;
        EdsDirectoryItemRef	dirItemRef_Image    = NULL;

        EdsDirectoryItemInfo dirItemInfo_Image;

        EdsError err    = EDS_ERR_OK;
        EdsUInt32 Count = 0;
        bool success    = false;

        //get the number of memory devices
        err = EdsGetChildCount( theCamera, &Count );
        if( Count == 0 ){
            printf("Memory device not found\n");
            err = EDS_ERR_DEVICE_NOT_FOUND;
            return false;
        }

        // Download Card No.0 contents
        err = EdsGetChildAtIndex( theCamera, 0, &theVolumeRef );
//        if ( err == EDS_ERR_OK ){
//            printf("getting volume info\n");
//            //err = EdsGetVolumeInfo( theVolumeRef, &volumeInfo ) ;
//        }

        //Now lets find out how many Folders the volume has
        if ( err == EDS_ERR_OK ){
            err = EdsGetChildCount( theVolumeRef, &Count );

            if ( err == EDS_ERR_OK ){

                //Lets find the folder called DCIM
                bool bFoundDCIM = false;
                for(int i = 0; i < Count; i++){
                    err = EdsGetChildAtIndex( theVolumeRef, i, &dirItemRef_DCIM ) ;
                    if ( err == EDS_ERR_OK ){
                        EdsDirectoryItemInfo dirItemInfo;
                        err = EdsGetDirectoryItemInfo( dirItemRef_DCIM, &dirItemInfo );
                        if( err == EDS_ERR_OK){
                            string folderName = dirItemInfo.szFileName;
                            if( folderName == "DCIM" ){
                                bFoundDCIM = true;
                                printf("Found the DCIM folder at index %i\n", i);
                                break;
                            }
                        }
                    }
                    //we want to release the directories that don't match
                    easyRelease(dirItemRef_DCIM);
                }

                //This is a bit silly.
                //Essentially we traverse into the DCIM folder, then we go into the last folder in there, then we
                //get the last image in last folder.
                if( bFoundDCIM && dirItemRef_DCIM != NULL){
                    //now we are going to look for the last folder in DCIM
                    Count = 0;
                    err = EdsGetChildCount(dirItemRef_DCIM, &Count);

                    bool foundLastFolder = false;
                    if( Count > 0 ){
                        int lastIndex = Count-1;

                        EdsDirectoryItemInfo dirItemInfo_Sub;

                        err = EdsGetChildAtIndex( dirItemRef_DCIM, lastIndex, &dirItemRef_Sub ) ;
                        err = EdsGetDirectoryItemInfo( dirItemRef_Sub, &dirItemInfo_Sub);

                        printf("Last Folder is %s \n", dirItemInfo_Sub.szFileName);

                        EdsUInt32 jpgCount = 0;
                        err = EdsGetChildCount(dirItemRef_Sub, &jpgCount );

                        if( jpgCount > 0 ){
                            int latestJpg = jpgCount-1;

                            err = EdsGetChildAtIndex(dirItemRef_Sub, latestJpg, &dirItemRef_Image ) ;
                            err = EdsGetDirectoryItemInfo(dirItemRef_Image, &dirItemInfo_Image);

                            printf("Latest image is %s \n", dirItemInfo_Image.szFileName);
                            success = true;
                        }else{
                            printf("Error - No jpegs inside %s\n", dirItemInfo_Image.szFileName);
                        }
                    }else{
                        printf("Error - No subfolders inside DCIM!\n");
                    }
                }
            }
        }
        if( success ){
            success = downloadImage(dirItemRef_Image);
        }

        easyRelease(theVolumeRef);
        easyRelease(dirItemRef_DCIM);
        easyRelease(dirItemRef_Sub);
        easyRelease(dirItemRef_Image);

        postCommand();

        return success;
    }