From 5aacc2a245bd5fc6ce99545d0a4773869d87ba5b Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Sun, 28 Apr 2024 21:13:31 +0800 Subject: [PATCH] Backup. --- .../build/huntting_camera.cmake | 3 +- application/HunttingCamera/src/MainThread.cpp | 5 ++ .../MissionManager/src/StorageHandleState.cpp | 1 + build/cmake/toolchain/linux.toolchain.cmake | 2 +- hal/abstract/IHalCpp.cpp | 4 ++ hal/include/IHalCpp.h | 1 + hal/src/SdCardHal.cpp | 61 +++++++++++++------ hal/src/SdCardHal.h | 3 + middleware/StorageManager/CMakeLists.txt | 2 + .../StorageManager/include/IStorageManager.h | 1 + .../StorageManager/src/IStorageManager.cpp | 1 - .../StorageManager/src/SdCardHandle.cpp | 42 +++++++++++++ middleware/StorageManager/src/SdCardHandle.h | 7 +++ middleware/StorageManager/src/StorageBase.cpp | 42 ++++++++++++- middleware/StorageManager/src/StorageBase.h | 1 + .../StorageManager/src/StorageManagerImpl.cpp | 7 +-- 16 files changed, 157 insertions(+), 26 deletions(-) diff --git a/application/HunttingCamera/build/huntting_camera.cmake b/application/HunttingCamera/build/huntting_camera.cmake index aac28580..ad2b6b1e 100644 --- a/application/HunttingCamera/build/huntting_camera.cmake +++ b/application/HunttingCamera/build/huntting_camera.cmake @@ -5,8 +5,9 @@ set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${MIDDLEWARE_S set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${MIDDLEWARE_SOURCE_PATH}/AppManager/include") set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${MIDDLEWARE_SOURCE_PATH}/MediaManager/include") set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${MIDDLEWARE_SOURCE_PATH}/FilesManager/include") +set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${MIDDLEWARE_SOURCE_PATH}/StorageManager/include") set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${UTILS_SOURCE_PATH}/StatusCode/include") set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${UTILS_SOURCE_PATH}/Log/include") set(HUNTTING_MAIN_INCLUDE_PATH "${HUNTTING_MAIN_INCLUDE_PATH};${HAL_SOURCE_PATH}/include") -set(HUNTTING_LINK_LIB McuManager MissionManager StateMachine AppManager FilesManager StatusCode Log Hal pthread dl) \ No newline at end of file +set(HUNTTING_LINK_LIB McuManager MissionManager StateMachine AppManager FilesManager StorageManager StatusCode Log Hal pthread dl) \ No newline at end of file diff --git a/application/HunttingCamera/src/MainThread.cpp b/application/HunttingCamera/src/MainThread.cpp index 8b3b9a72..464219af 100644 --- a/application/HunttingCamera/src/MainThread.cpp +++ b/application/HunttingCamera/src/MainThread.cpp @@ -21,6 +21,7 @@ #include "IMediaManager.h" #include "IMissionManager.h" #include "IStateMachine.h" +#include "IStorageManager.h" #include #include static void sigHandler(int signo) @@ -63,6 +64,7 @@ StatusCode MainThread::Init(void) CreateAllModules(); IHalCpp::GetInstance()->Init(); IMcuManager::GetInstance()->Init(); + IStorageManager::GetInstance()->Init(); IMediaManager::GetInstance()->Init(); IMissionManager::GetInstance()->Init(); return CreateStatusCode(STATUS_CODE_OK); @@ -71,6 +73,7 @@ StatusCode MainThread::UnInit(void) { IMissionManager::GetInstance()->UnInit(); IMediaManager::GetInstance()->UnInit(); + IStorageManager::GetInstance()->UnInit(); IMcuManager::GetInstance()->UnInit(); IHalCpp::GetInstance()->UnInit(); DestoryAllModules(); @@ -81,6 +84,7 @@ StatusCode MainThread::CreateAllModules(void) { CreateHalCppModule(); CreateMcuManager(); + CreateStorageManagerModule(); CreateFilesManagerModule(); CreateMissionManagerModule(); CreateStateMachine(); @@ -95,6 +99,7 @@ void MainThread::DestoryAllModules(void) DestroyStateMachine(); DestroyMissionManagerModule(); DestroyFilesManagerModule(); + DestroyStorageManagerModule(); DestroyMcuManager(); DestroyHalCppModule(); } diff --git a/application/MissionManager/src/StorageHandleState.cpp b/application/MissionManager/src/StorageHandleState.cpp index 6c39ce78..7bd52201 100644 --- a/application/MissionManager/src/StorageHandleState.cpp +++ b/application/MissionManager/src/StorageHandleState.cpp @@ -42,4 +42,5 @@ void StorageHandleState::UnInit(void) } void StorageHandleState::ReportEvent(const StorageEvent &event) { + LogInfo("StorageHandleState::ReportEvent.\n"); } \ No newline at end of file diff --git a/build/cmake/toolchain/linux.toolchain.cmake b/build/cmake/toolchain/linux.toolchain.cmake index 615b736a..1206dc1a 100755 --- a/build/cmake/toolchain/linux.toolchain.cmake +++ b/build/cmake/toolchain/linux.toolchain.cmake @@ -76,5 +76,5 @@ set(APP_MANAGER_TCP_SERVER_PORT "9876") # ------------ build sd card ------------ # set(SD_CARD_DEV "/dev/test") -set(SD_CARD_MOUNT_PATH "/mnt/test") +set(SD_CARD_MOUNT_PATH "./sdcard") # ------------ build sd card end ------------ # \ No newline at end of file diff --git a/hal/abstract/IHalCpp.cpp b/hal/abstract/IHalCpp.cpp index a80354e9..e930988b 100644 --- a/hal/abstract/IHalCpp.cpp +++ b/hal/abstract/IHalCpp.cpp @@ -64,6 +64,10 @@ std::shared_ptr &IHalCpp::GetInstance(std::shared_ptr *impl) void VSdCardHal::SetSdCardMonitor(std::shared_ptr &monitor) { } +SdCardHalStatus VSdCardHal::GetSdCardStatus(void) +{ + return SdCardHalStatus::END; +} StatusCode IHalCpp::Init(void) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); diff --git a/hal/include/IHalCpp.h b/hal/include/IHalCpp.h index 2197df09..81ecb170 100644 --- a/hal/include/IHalCpp.h +++ b/hal/include/IHalCpp.h @@ -112,6 +112,7 @@ public: VSdCardHal() = default; virtual ~VSdCardHal() = default; virtual void SetSdCardMonitor(std::shared_ptr &monitor); + virtual SdCardHalStatus GetSdCardStatus(void); }; class IHalCpp { diff --git a/hal/src/SdCardHal.cpp b/hal/src/SdCardHal.cpp index 5dbd01b6..db518275 100644 --- a/hal/src/SdCardHal.cpp +++ b/hal/src/SdCardHal.cpp @@ -27,10 +27,17 @@ const char *SD_CARD_DEVICE = SD_CARD_DEV; SdCardHal::SdCardHal() { mThreadRuning = false; + mStatus = SdCardHalStatus::END; } void SdCardHal::SetSdCardMonitor(std::shared_ptr &monitor) { + LogInfo("SetSdCardMonitor.\n"); mMonitor = monitor; + monitor->ReportEvent(mStatus); +} +SdCardHalStatus SdCardHal::GetSdCardStatus(void) +{ + return mStatus; } void SdCardHal::Init(void) { @@ -49,42 +56,42 @@ void SdCardHal::UnInit(void) } void SdCardHal::DevDetectingThread(void) { - constexpr int SLEEP_TIME_MS = 1000; - SdCardHalStatus status = SdCardHalStatus::END; + constexpr int SLEEP_TIME_MS = 100; + // SdCardHalStatus status = SdCardHalStatus::END; int fd = -1; // const char *SD_CARD_DEVICE = "/SD_CARD_DEVICE/mmcblk1p1"; mThreadRuning = true; while (mThreadRuning) { fd = fx_open(SD_CARD_DEVICE, O_RDONLY); if (fd < 0) { - LogInfo("sdCardHal: %s open failed.\n", SD_CARD_DEVICE); - if (SdCardHalStatus::PULL_OUT != status) { - status = SdCardHalStatus::PULL_OUT; - ReportDetecedChangedResult(status); + // LogInfo("sdCardHal: %s open failed.\n", SD_CARD_DEVICE); + if (SdCardHalStatus::PULL_OUT != mStatus) { + mStatus = SdCardHalStatus::PULL_OUT; + ReportDetecedChangedResult(mStatus); } goto CONTINUE; } struct stat sdStat; if (fx_fstat(fd, &sdStat) < 0) { - LogInfo("sdCardHal: %s fstat failed.\n", SD_CARD_DEVICE); - if (SdCardHalStatus::ERROR != status) { - status = SdCardHalStatus::ERROR; - ReportDetecedChangedResult(status); + // LogInfo("sdCardHal: %s fstat failed.\n", SD_CARD_DEVICE); + if (SdCardHalStatus::ERROR != mStatus) { + mStatus = SdCardHalStatus::ERROR; + ReportDetecedChangedResult(mStatus); } goto CONTINUE; } if (!S_ISBLK(sdStat.st_mode)) { - LogInfo("sdCardHal: %s is not block device.\n", SD_CARD_DEVICE); - if (SdCardHalStatus::PULL_OUT != status) { - status = SdCardHalStatus::PULL_OUT; - ReportDetecedChangedResult(status); + // LogInfo("sdCardHal: %s is not block device.\n", SD_CARD_DEVICE); + if (SdCardHalStatus::PULL_OUT != mStatus) { + mStatus = SdCardHalStatus::PULL_OUT; + ReportDetecedChangedResult(mStatus); } } else { - LogInfo("sdCardHal: %s is inserted.\n", SD_CARD_DEVICE); - if (SdCardHalStatus::INSERTED != status) { - status = SdCardHalStatus::INSERTED; - ReportDetecedChangedResult(status); + // LogInfo("sdCardHal: %s is inserted.\n", SD_CARD_DEVICE); + if (SdCardHalStatus::INSERTED != mStatus) { + mStatus = SdCardHalStatus::INSERTED; + ReportDetecedChangedResult(mStatus); } } CONTINUE: @@ -93,6 +100,7 @@ void SdCardHal::DevDetectingThread(void) } void SdCardHal::ReportDetecedChangedResult(const SdCardHalStatus &status) { + LogInfo("SdCardHalStatus changed: %s.\n", PrintfStatusString(status)); auto monitor = mMonitor.lock(); if (mMonitor.expired()) { LogWarning("SdCardHal: monitor is expired.\n"); @@ -106,4 +114,21 @@ void SdCardHal::ReportDetecedChangedResult(const SdCardHalStatus &status) snprintf(cmd, BUF_LENGTH, "mount %s %s", SD_CARD_DEV, SD_CARD_MOUNT_PATH); fx_system(cmd); } +} +const char *SdCardHal::PrintfStatusString(const SdCardHalStatus &status) +{ + switch (status) { + case SdCardHalStatus::MOUNTED: + return "MOUNTE\n"; + case SdCardHalStatus::UNMOUNTED: + return "UNMOUNTED."; + case SdCardHalStatus::INSERTED: + return "INSERTED."; + case SdCardHalStatus::PULL_OUT: + return "PULL_OUT."; + case SdCardHalStatus::END: + return "END."; + default: + return "UNDEFINE."; + } } \ No newline at end of file diff --git a/hal/src/SdCardHal.h b/hal/src/SdCardHal.h index 91d0ebbe..6d34710e 100644 --- a/hal/src/SdCardHal.h +++ b/hal/src/SdCardHal.h @@ -22,14 +22,17 @@ public: SdCardHal(); virtual ~SdCardHal() = default; void SetSdCardMonitor(std::shared_ptr &monitor) override; + SdCardHalStatus GetSdCardStatus(void) override; void Init(void); void UnInit(void); void DevDetectingThread(void); private: void ReportDetecedChangedResult(const SdCardHalStatus &status); + const char *PrintfStatusString(const SdCardHalStatus &status); private: + SdCardHalStatus mStatus; bool mThreadRuning; std::thread mDevDetectingThread; std::weak_ptr mMonitor; diff --git a/middleware/StorageManager/CMakeLists.txt b/middleware/StorageManager/CMakeLists.txt index 1c85a8db..85a63795 100644 --- a/middleware/StorageManager/CMakeLists.txt +++ b/middleware/StorageManager/CMakeLists.txt @@ -1,5 +1,6 @@ include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) +include(${HAL_SOURCE_PATH}/build/hal.cmake) set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) @@ -12,6 +13,7 @@ include_directories( ${UTILS_SOURCE_PATH}/Log/include ${UTILS_SOURCE_PATH}/McuProtocol/include ${UTILS_SOURCE_PATH}/UartDevice/include + ${UTILS_SOURCE_PATH}/LinuxApi/include ) #do not rely on any other library #link_directories( diff --git a/middleware/StorageManager/include/IStorageManager.h b/middleware/StorageManager/include/IStorageManager.h index ea7df6cd..bc38271a 100644 --- a/middleware/StorageManager/include/IStorageManager.h +++ b/middleware/StorageManager/include/IStorageManager.h @@ -22,6 +22,7 @@ enum class StorageEvent { SD_CARD_INSERT = 0, SD_CARD_REMOVE, + SD_ABNORMAL, EMMC_NORMAL, END }; diff --git a/middleware/StorageManager/src/IStorageManager.cpp b/middleware/StorageManager/src/IStorageManager.cpp index 3635c7b8..b45bd02f 100644 --- a/middleware/StorageManager/src/IStorageManager.cpp +++ b/middleware/StorageManager/src/IStorageManager.cpp @@ -45,6 +45,5 @@ StatusCode IStorageManager::SetMonitor(std::shared_ptr &monitor } StatusCode IStorageManager::SaveFile(const std::string &sourceFile, const std::string &savePaht) { - LogInfo("SaveFile: %s to %s\n", sourceFile.c_str(), savePaht.c_str()); return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); } \ No newline at end of file diff --git a/middleware/StorageManager/src/SdCardHandle.cpp b/middleware/StorageManager/src/SdCardHandle.cpp index 8701a203..097e8c39 100644 --- a/middleware/StorageManager/src/SdCardHandle.cpp +++ b/middleware/StorageManager/src/SdCardHandle.cpp @@ -14,6 +14,17 @@ */ #include "SdCardHandle.h" #include "ILog.h" +#include "LinuxApi.h" +void SdCardHandle::ReportEvent(const SdCardHalStatus &status) +{ + LogInfo("SdCardHal: ReportEvent.\n"); + auto monitor = mStorageMonitor.lock(); + if (mStorageMonitor.expired()) { + LogWarning("SdCardHal: monitor is expired.\n"); + return; + } + monitor->ReportEvent(StorageEventConvert(status)); +} void SdCardHandle::Init(void) { IHalCpp::GetInstance()->GetSdCardHal(mSdCardHal); @@ -32,4 +43,35 @@ void SdCardHandle::Init(void) void SdCardHandle::UnInit(void) { mSdCardHal.reset(); +} +StatusCode SdCardHandle::SdSaveFile(const std::string &sourceFile, const std::string &savePaht) +{ + LogInfo("SaveFile: %s -> %s", sourceFile.c_str(), savePaht.c_str()); + constexpr int CMD_BUF_SIZE = 128; + char cmd[CMD_BUF_SIZE] = {0}; + bool directoryExist = StorageBase::CheckDirectory((SD_CARD_MOUNT_PATH + savePaht).c_str()); + if (false == directoryExist) { + LogInfo("Directory not exist.\n"); + return CreateStatusCode(STATUS_CODE_NOT_OK); + } + snprintf(cmd, CMD_BUF_SIZE, "cp %s %s", sourceFile.c_str(), savePaht.c_str()); + fx_system(cmd); + return CreateStatusCode(STATUS_CODE_OK); +} +StorageEvent SdCardHandle::StorageEventConvert(const SdCardHalStatus &status) +{ + switch (status) { + case SdCardHalStatus::MOUNTED: + return StorageEvent::SD_CARD_INSERT; + case SdCardHalStatus::UNMOUNTED: + return StorageEvent::SD_CARD_REMOVE; + case SdCardHalStatus::INSERTED: + return StorageEvent::SD_ABNORMAL; + case SdCardHalStatus::PULL_OUT: + return StorageEvent::SD_CARD_REMOVE; + case SdCardHalStatus::ERROR: + return StorageEvent::SD_ABNORMAL; + default: + return StorageEvent::SD_ABNORMAL; + } } \ No newline at end of file diff --git a/middleware/StorageManager/src/SdCardHandle.h b/middleware/StorageManager/src/SdCardHandle.h index b5bae96b..590ce68e 100644 --- a/middleware/StorageManager/src/SdCardHandle.h +++ b/middleware/StorageManager/src/SdCardHandle.h @@ -23,9 +23,16 @@ class SdCardHandle : public VSdCardHalMonitor, virtual public StorageBase public: SdCardHandle() = default; virtual ~SdCardHandle() = default; + void ReportEvent(const SdCardHalStatus &status) override; void Init(void); void UnInit(void); +protected: + StatusCode SdSaveFile(const std::string &sourceFile, const std::string &savePaht); + +private: + StorageEvent StorageEventConvert(const SdCardHalStatus &status); + protected: std::shared_ptr mSdCardHal; }; diff --git a/middleware/StorageManager/src/StorageBase.cpp b/middleware/StorageManager/src/StorageBase.cpp index 6c97811e..ec3976d7 100644 --- a/middleware/StorageManager/src/StorageBase.cpp +++ b/middleware/StorageManager/src/StorageBase.cpp @@ -12,4 +12,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "StorageBase.h" \ No newline at end of file +#include "StorageBase.h" +#include "ILog.h" +#include +#include +#include +#include +#include +bool StorageBase::CheckDirectory(const char *filepath) +{ + char *path = nullptr; + char *sep = nullptr; + struct stat st = {0}; + + path = strdup(filepath); + if (!path) { + LogError("strdup\n"); + return false; + } + + for (sep = strchr(path, '/'); sep != NULL; sep = strchr(sep + 1, '/')) { + *sep = '\0'; + if (stat(path, &st) == -1) { + if (errno == ENOENT) { + if (mkdir(path, 0755) == -1) { + LogError("mkdir\n"); + free(path); + return false; + } + } + else { + LogError("stat\n"); + free(path); + return false; + } + } + + *sep = '/'; + } + free(path); + return true; +} \ No newline at end of file diff --git a/middleware/StorageManager/src/StorageBase.h b/middleware/StorageManager/src/StorageBase.h index 4bcef2de..e0cc99b6 100644 --- a/middleware/StorageManager/src/StorageBase.h +++ b/middleware/StorageManager/src/StorageBase.h @@ -21,6 +21,7 @@ class StorageBase : public std::enable_shared_from_this public: StorageBase() = default; virtual ~StorageBase() = default; + bool CheckDirectory(const char *filepath); protected: std::weak_ptr mStorageMonitor; diff --git a/middleware/StorageManager/src/StorageManagerImpl.cpp b/middleware/StorageManager/src/StorageManagerImpl.cpp index 2b1a9254..ae061785 100644 --- a/middleware/StorageManager/src/StorageManagerImpl.cpp +++ b/middleware/StorageManager/src/StorageManagerImpl.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ #include "StorageManagerImpl.h" +#include "ILog.h" StatusCode StorageManagerImpl::Init(void) { SdCardHandle::Init(); @@ -26,12 +27,10 @@ StatusCode StorageManagerImpl::UnInit(void) StatusCode StorageManagerImpl::SetMonitor(std::shared_ptr &monitor) { mStorageMonitor = monitor; + SdCardHandle::ReportEvent(mSdCardHal->GetSdCardStatus()); return CreateStatusCode(STATUS_CODE_OK); } StatusCode StorageManagerImpl::SaveFile(const std::string &sourceFile, const std::string &savePaht) { - constexpr int CMD_BUF_SIZE = 128; - char cmd[CMD_BUF_SIZE] = {0}; - snprintf(cmd, CMD_BUF_SIZE, "cp %s %s", sourceFile.c_str(), savePaht.c_str()); - return CreateStatusCode(STATUS_CODE_OK); + return SdCardHandle::SdSaveFile(sourceFile, savePaht); } \ No newline at end of file