diff --git a/osdk-core/api/inc/dji_camera_manager.hpp b/osdk-core/api/inc/dji_camera_manager.hpp index 0381f849..98466c5b 100644 --- a/osdk-core/api/inc/dji_camera_manager.hpp +++ b/osdk-core/api/inc/dji_camera_manager.hpp @@ -1738,6 +1738,22 @@ class CameraManager { */ ErrorCode::ErrorCodeType startReqFileList(PayloadIndexType index, FileMgr::FileListReqCBType cb, void *userData); + /*! @brief start to requeset the filelist data of camera by slices, non-blocking calls + * + * @platforms M300 + * @param index Camera module index, input limit see enum + * DJI::OSDK::PayloadIndexType + * @param startFileIndex: the index of the file list to start downloading, from 0-N + * @param count: the number of file lists downloaded at a time + * @param cb The download result will be called by this cb. The detail + * of the callback ref to the DJI::OSDK::FileMgr::FileListReqCBType + * @param userData The parameter to pass user data into the cb + * @return ErrorCode::ErrorCodeType error code + */ + ErrorCode::ErrorCodeType startReqFileListbySlices(PayloadIndexType index, + uint32_t startFileIndex, uint16_t count, + FileMgr::FileListReqCBType cb, void *userData); + /*! @brief start to requeset the files of camera, non-blocking calls * * @platforms M300 diff --git a/osdk-core/api/src/dji_camera_manager.cpp b/osdk-core/api/src/dji_camera_manager.cpp index a70c92df..714e804e 100644 --- a/osdk-core/api/src/dji_camera_manager.cpp +++ b/osdk-core/api/src/dji_camera_manager.cpp @@ -1190,6 +1190,15 @@ ErrorCode::ErrorCodeType CameraManager::startReqFileList(PayloadIndexType index, return ret; } +ErrorCode::ErrorCodeType CameraManager::startReqFileListbySlices(PayloadIndexType index, + uint32_t startFileIndex, uint16_t count, + FileMgr::FileListReqCBType cb, void *userData) { + ErrorCode::ErrorCodeType ret; + ret = fileMgr->startReqFileListBySlices(OSDK_COMMAND_DEVICE_TYPE_CAMERA, + PAYLOAD_INDEX_TO_DEVICE_ID(index), startFileIndex, count, cb, userData); + return ret; +} + ErrorCode::ErrorCodeType CameraManager::startReqFileData(PayloadIndexType index, int fileIndex, std::string localPath, FileMgr::FileDataReqCBType cb, void *userData) { ErrorCode::ErrorCodeType ret; ret = fileMgr->startReqFileData(OSDK_COMMAND_DEVICE_TYPE_CAMERA, diff --git a/osdk-core/modules/inc/filemgr/dji_file_mgr.hpp b/osdk-core/modules/inc/filemgr/dji_file_mgr.hpp index a73d3871..6c4cdd0e 100644 --- a/osdk-core/modules/inc/filemgr/dji_file_mgr.hpp +++ b/osdk-core/modules/inc/filemgr/dji_file_mgr.hpp @@ -50,6 +50,8 @@ class FileMgr { typedef void (*FileDataReqCBType)(E_OsdkStat ret_code, void* userData); ErrorCode::ErrorCodeType startReqFileList(E_OSDKCommandDeiveType type, uint8_t index, FileListReqCBType cb, void* userData); + ErrorCode::ErrorCodeType startReqFileListBySlices(E_OSDKCommandDeiveType type, uint8_t index, uint32_t startFileIndex, + uint16_t count, FileListReqCBType cb, void* userData); ErrorCode::ErrorCodeType startReqFileData(E_OSDKCommandDeiveType type, uint8_t index, int fileIndex, std::string localPath, FileDataReqCBType cb, void* userData); private: diff --git a/osdk-core/modules/inc/filemgr/impl/dji_file_mgr_impl.hpp b/osdk-core/modules/inc/filemgr/impl/dji_file_mgr_impl.hpp index 81f9cda6..0c3e05cc 100644 --- a/osdk-core/modules/inc/filemgr/impl/dji_file_mgr_impl.hpp +++ b/osdk-core/modules/inc/filemgr/impl/dji_file_mgr_impl.hpp @@ -98,11 +98,14 @@ class FileMgrImpl { void setTargetDevice(E_OSDKCommandDeiveType type, uint8_t index); - ErrorCode::ErrorCodeType startReqFileList(FileMgr::FileListReqCBType cb, void* userData); + ErrorCode::ErrorCodeType startReqFileList(FileMgr::FileListReqCBType cb, + uint32_t startFileIndex, + uint16_t count, + void* userData); ErrorCode::ErrorCodeType startReqFileData(int fileIndex, std::string localPath, FileMgr::FileDataReqCBType cb, void* userData); void HandlePushPack(dji_general_transfer_msg_ack *rsp); - ErrorCode::ErrorCodeType SendReqFileListPack(); + ErrorCode::ErrorCodeType SendReqFileListPack(uint32_t index, uint32_t count); ErrorCode::ErrorCodeType SendReqFileDataPack(int fileIndex) ; private: @@ -126,6 +129,7 @@ class FileMgrImpl { uint8_t index; FileNameRule nameRule; FileNameRule getNameRule(); + uint16_t sessionId; private: //typedef void (*FileDataReqCBType)(E_OsdkStat ret_code, dji_general_transfer_msg_ack* ackData); diff --git a/osdk-core/modules/src/filemgr/dji_file_mgr.cpp b/osdk-core/modules/src/filemgr/dji_file_mgr.cpp index 68d1c680..55be42c6 100644 --- a/osdk-core/modules/src/filemgr/dji_file_mgr.cpp +++ b/osdk-core/modules/src/filemgr/dji_file_mgr.cpp @@ -50,7 +50,17 @@ FileMgr::~FileMgr(){ ErrorCode::ErrorCodeType FileMgr::startReqFileList(E_OSDKCommandDeiveType type, uint8_t index, FileListReqCBType cb, void* userData) { impl->setTargetDevice(type, index); - return impl->startReqFileList(cb, userData); + return impl->startReqFileList(cb, 0, 0xFFFF, userData); +} + +ErrorCode::ErrorCodeType FileMgr::startReqFileListBySlices(E_OSDKCommandDeiveType type, + uint8_t index, + uint32_t startFileIndex, + uint16_t count, + FileListReqCBType cb, + void* userData) { + impl->setTargetDevice(type, index); + return impl->startReqFileList(cb, startFileIndex, count, userData); } ErrorCode::ErrorCodeType FileMgr::startReqFileData(E_OSDKCommandDeiveType type, diff --git a/osdk-core/modules/src/filemgr/impl/dji_file_mgr_impl.cpp b/osdk-core/modules/src/filemgr/impl/dji_file_mgr_impl.cpp index 89d1641c..bcb94b5e 100644 --- a/osdk-core/modules/src/filemgr/impl/dji_file_mgr_impl.cpp +++ b/osdk-core/modules/src/filemgr/impl/dji_file_mgr_impl.cpp @@ -234,6 +234,7 @@ void FileMgrImpl::fileDataMonitorTask(void *arg) { FileMgrImpl::FileMgrImpl(Linker *linker) : linker(linker) { type = OSDK_COMMAND_DEVICE_TYPE_NONE; index = 0; + sessionId = 999; fileListHandler = new DownloadListHandler(); fileDataHandler = new DownloadDataHandler(); localSenderId = OSDK_COMMAND_DEVICE_ID(OSDK_COMMAND_DEVICE_TYPE_APP, 0); @@ -256,6 +257,7 @@ FileMgrImpl::FileMgrImpl(Linker *linker) : linker(linker) { } FileMgrImpl::~FileMgrImpl(){ + sessionId = 999; if (fileListHandler) { delete fileListHandler; } @@ -265,7 +267,7 @@ FileMgrImpl::~FileMgrImpl(){ } -ErrorCode::ErrorCodeType FileMgrImpl::SendReqFileListPack() { +ErrorCode::ErrorCodeType FileMgrImpl::SendReqFileListPack(uint32_t index, uint32_t count) { uint8_t reqBuf[1024] = {0}; dji_general_transfer_msg_req *setting = (dji_general_transfer_msg_req *) reqBuf; @@ -274,13 +276,13 @@ ErrorCode::ErrorCodeType FileMgrImpl::SendReqFileListPack() { setting->task_id = DJI_GENERAL_DOWNLOAD_FILE_TASK_TYPE_LIST; setting->func_id = DJI_GENERAL_DOWNLOAD_FILE_FUNC_TYPE_REQ; setting->msg_flag = 0; - setting->session_id = 999; + setting->session_id = sessionId++; setting->seq = 0; dji_file_list_download_req reqData = {0}; reqData.index.drive = 0; - reqData.index.index = 1; - reqData.count = 0xffff; + reqData.index.index = index + 1; + reqData.count = count; reqData.type = DJI_MEDIA; uint32_t reqDataLen = sizeof(reqData) - sizeof(reqData.filter_enable) @@ -329,7 +331,7 @@ ErrorCode::ErrorCodeType FileMgrImpl::SendReqFileDataPack(int fileIndex) { setting->task_id = DJI_GENERAL_DOWNLOAD_FILE_TASK_TYPE_FILE; setting->func_id = DJI_GENERAL_DOWNLOAD_FILE_FUNC_TYPE_REQ; setting->msg_flag = 0; - setting->session_id = 999; + setting->session_id = sessionId++; setting->seq = 0; dji_file_download_req reqData = {0}; @@ -405,7 +407,10 @@ FileMgrImpl::FileNameRule FileMgrImpl::getNameRule() { } } -ErrorCode::ErrorCodeType FileMgrImpl::startReqFileList(FileMgr::FileListReqCBType cb, void* userData) { +ErrorCode::ErrorCodeType FileMgrImpl::startReqFileList(FileMgr::FileListReqCBType cb, + uint32_t startFileIndex, + uint16_t count, + void* userData) { if ((fileListHandler->downloadState == DOWNLOAD_IDLE) && (fileDataHandler->downloadState == DOWNLOAD_IDLE)) { nameRule = getNameRule(); @@ -426,7 +431,7 @@ ErrorCode::ErrorCodeType FileMgrImpl::startReqFileList(FileMgr::FileListReqCBTyp fileListHandler->reqCB = cb; fileListHandler->reqCBUserData = userData; - return SendReqFileListPack(); + return SendReqFileListPack(startFileIndex, count); } else { DERROR("Current state cannot support to do downloading ..."); return ErrorCode::CameraCommonErr::InvalidState; diff --git a/sample/platform/linux/payloads/download_sample.cpp b/sample/platform/linux/payloads/download_sample.cpp index 652f8051..15c7a316 100755 --- a/sample/platform/linux/payloads/download_sample.cpp +++ b/sample/platform/linux/payloads/download_sample.cpp @@ -74,6 +74,10 @@ int main(int argc, char **argv) { << std::endl << "| [b] Download main camera filedata from case a |" << std::endl + << "| [c] Download main camera filelist by slices |" + << std::endl + << "| [d] Download main camera filedata from case c |" + << std::endl << "| [q] Quit |" << std::endl; char inputChar = 0; @@ -98,7 +102,27 @@ int main(int argc, char **argv) { ErrorCode::printErrorCodeMsg(ret); break; } - case 'b': { + case 'c': + ErrorCode::ErrorCodeType ret; + DSTATUS("Play back mode setting......"); + vehicle->cameraManager->setModeSync(PAYLOAD_INDEX_0, + CameraModule::WorkMode::PLAYBACK, + 2); + DSTATUS("Get liveview right......"); + ret = vehicle->cameraManager->obtainDownloadRightSync(PAYLOAD_INDEX_0, + true, 2); + ErrorCode::printErrorCodeMsg(ret); + DSTATUS("Try to download file list by slices ......."); + ret = vehicle->cameraManager->startReqFileListbySlices( + PAYLOAD_INDEX_0, + 0, + 100, + fileListReqCB, + (void*)("Download main camera file list by slices.")); + ErrorCode::printErrorCodeMsg(ret); + break; + case 'b': + case 'd': { ErrorCode::ErrorCodeType ret; DSTATUS("Download file number : %d", cur_file_list.media.size()); uint32_t downloadCnt = cur_file_list.media.size();