From 7abf2d7a76a90454c834394d47adf089b8ed8b2e Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Mon, 6 May 2024 21:00:58 +0800 Subject: [PATCH] Improve:SD card event. --- .../MissionManager/src/DataProcessing.h | 1 + .../MissionManager/src/MissionState.cpp | 8 +++ application/MissionManager/src/MissionState.h | 1 + .../src/MissionStateMachine.cpp | 4 ++ .../MissionManager/src/SdCardHandleState.cpp | 30 +++++++++- .../MissionManager/src/SdCardHandleState.h | 7 +++ .../MissionManager/src/StorageHandleState.cpp | 3 + hal/include/IHalCpp.h | 4 +- hal/src/SdCardHal.cpp | 57 ++++++++++++++----- hal/src/SdCardHal.h | 1 + .../StorageManager/include/IStorageManager.h | 1 + .../StorageManager/src/IStorageManager.cpp | 4 ++ .../StorageManager/src/SdCardHandle.cpp | 4 +- middleware/StorageManager/src/StorageBase.cpp | 30 ++++++++++ middleware/StorageManager/src/StorageBase.h | 3 + .../StorageManager/src/StorageManagerImpl.cpp | 4 ++ .../StorageManager/src/StorageManagerImpl.h | 1 + 17 files changed, 146 insertions(+), 17 deletions(-) diff --git a/application/MissionManager/src/DataProcessing.h b/application/MissionManager/src/DataProcessing.h index 3a5d5bc..9a4a7e1 100644 --- a/application/MissionManager/src/DataProcessing.h +++ b/application/MissionManager/src/DataProcessing.h @@ -23,6 +23,7 @@ using DataProcessingFunc = std::function; enum class InternalStateEvent { STORAGE_HANDLE_STATE_INIT = static_cast(MissionEvent::END), + SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED, MEDIA_REPORT_EVENT, END }; diff --git a/application/MissionManager/src/MissionState.cpp b/application/MissionManager/src/MissionState.cpp index 554a102..5a0c37f 100644 --- a/application/MissionManager/src/MissionState.cpp +++ b/application/MissionManager/src/MissionState.cpp @@ -19,6 +19,8 @@ MissionState::MissionState(const std::string &name) : State(name) { mEventHandle[InternalStateEvent::MEDIA_REPORT_EVENT] = std::bind(&MissionState::MediaReportHandle, this, _1); + mEventHandle[InternalStateEvent::SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED] = + std::bind(&MissionState::SdCardEventReportHandle, this, _1); } void MissionState::GoInState() { @@ -37,4 +39,10 @@ bool MissionState::MediaReportHandle(VStateMachineData *msg) MissionStateMachine::GetInstance()->DelayMessage(msg); MissionStateMachine::GetInstance()->SwitchState(SystemState::STORAGE_HANDLE_STATE); return EXECUTED; +} +bool MissionState::SdCardEventReportHandle(VStateMachineData *msg) +{ + MissionStateMachine::GetInstance()->DelayMessage(msg); + MissionStateMachine::GetInstance()->SwitchState(SystemState::SD_CARD_HANDLE_STATE); + return EXECUTED; } \ No newline at end of file diff --git a/application/MissionManager/src/MissionState.h b/application/MissionManager/src/MissionState.h index 880df8d..21d2037 100644 --- a/application/MissionManager/src/MissionState.h +++ b/application/MissionManager/src/MissionState.h @@ -27,5 +27,6 @@ public: private: bool MediaReportHandle(VStateMachineData *msg); + bool SdCardEventReportHandle(VStateMachineData *msg); }; #endif \ No newline at end of file diff --git a/application/MissionManager/src/MissionStateMachine.cpp b/application/MissionManager/src/MissionStateMachine.cpp index 4a3959f..2777520 100644 --- a/application/MissionManager/src/MissionStateMachine.cpp +++ b/application/MissionManager/src/MissionStateMachine.cpp @@ -99,6 +99,10 @@ void MissionStateMachine::RunStateMachine(const IpcMission &mission) mStateTree[SystemState::STORAGE_HANDLE_STATE].get()); mStateMachine->SetCurrentState(mStateTree[SystemState::TOP_STATE].get()); mStateMachine->StartStateMachine(); + /** + * @brief The business can only be processed after the state machine is started. + * + */ std::shared_ptr message = std::make_shared(static_cast(InternalStateEvent::STORAGE_HANDLE_STATE_INIT)); SendStateMessage(message); diff --git a/application/MissionManager/src/SdCardHandleState.cpp b/application/MissionManager/src/SdCardHandleState.cpp index 94c56ae..39c0385 100644 --- a/application/MissionManager/src/SdCardHandleState.cpp +++ b/application/MissionManager/src/SdCardHandleState.cpp @@ -17,9 +17,11 @@ #include "ILog.h" #include "IMediaManager.h" #include "MissionStateMachine.h" -SdCardHandleState::SdCardHandleState() : State("SdCardHandleState") +SdCardHandleState::SdCardHandleState() : State("SdCardHandleState"), mSdCardStatus(StorageEvent::END) { mEventHandle[InternalStateEvent::MEDIA_REPORT_EVENT] = std::bind(&SdCardHandleState::MediaReportHandle, this, _1); + mEventHandle[InternalStateEvent::SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED] = + std::bind(&SdCardHandleState::SdCardEventHandle, this, _1); } void SdCardHandleState::GoInState() { @@ -43,6 +45,15 @@ bool SdCardHandleState::MediaReportHandle(VStateMachineData *msg) LogError("nullptr pointer.\n"); return NOT_EXECUTED; } + if (StorageEvent::SD_CARD_INSERT != mSdCardStatus) { + /** + * @brief The SD card has not been mounted yet, cache the data for the quick start first. + * + */ + LogWarning("Sd card is not inserted, cache data.\n"); + mFileNeedToSave = std::make_shared(data->mData.mFileName); + return EXECUTED; + } LogInfo("file = %s.\n", data->mData.mFileName.c_str()); SaveFileInfo saveFileInfo(data->mData.mFileName); StatusCode code = IFilesManager::GetInstance()->SaveFile(saveFileInfo); @@ -50,4 +61,21 @@ bool SdCardHandleState::MediaReportHandle(VStateMachineData *msg) LogError("SaveFile failed.\n"); } return EXECUTED; +} +bool SdCardHandleState::SdCardEventHandle(VStateMachineData *msg) +{ + std::shared_ptr message = std::dynamic_pointer_cast(msg->GetMessageObj()); + std::shared_ptr> data = + std::dynamic_pointer_cast>(message->mMissionData); + LogInfo(" SdCardEventHandle event:%s.\n", IStorageManager::GetInstance()->PrintStringStorageEvent(data->mData)); + if (mFileNeedToSave && StorageEvent::SD_CARD_INSERT == data->mData) { + LogInfo("Sd card is inserted for the first time.\n"); + StatusCode code = IFilesManager::GetInstance()->SaveFile(*(mFileNeedToSave.get())); + if (IsCodeOK(code) == false) { + LogError("SaveFile failed.\n"); + } + mFileNeedToSave.reset(); + } + mSdCardStatus = data->mData; + return EXECUTED; } \ No newline at end of file diff --git a/application/MissionManager/src/SdCardHandleState.h b/application/MissionManager/src/SdCardHandleState.h index b0798b3..d8a0c98 100644 --- a/application/MissionManager/src/SdCardHandleState.h +++ b/application/MissionManager/src/SdCardHandleState.h @@ -17,6 +17,8 @@ #include "DataProcessing.h" #include "IMediaManager.h" #include "IStateMachine.h" +#include "IStorageManager.h" +#include "IFilesManager.h" class SdCardHandleState : public State, public DataProcessing, public std::enable_shared_from_this { public: @@ -28,5 +30,10 @@ public: private: bool MediaReportHandle(VStateMachineData *msg); + bool SdCardEventHandle(VStateMachineData *msg); + +private: + StorageEvent mSdCardStatus; + std::shared_ptr mFileNeedToSave; }; #endif \ No newline at end of file diff --git a/application/MissionManager/src/StorageHandleState.cpp b/application/MissionManager/src/StorageHandleState.cpp index 2e07b98..be53762 100644 --- a/application/MissionManager/src/StorageHandleState.cpp +++ b/application/MissionManager/src/StorageHandleState.cpp @@ -45,6 +45,9 @@ void StorageHandleState::UnInit(void) void StorageHandleState::ReportEvent(const StorageEvent &event) { LogInfo("StorageHandleState::ReportEvent.\n"); + std::shared_ptr message = std::make_shared>( + static_cast(InternalStateEvent::SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED), event); + MissionStateMachine::GetInstance()->SendStateMessage(message); } bool StorageHandleState::StorageStartInitHandle(VStateMachineData *msg) { diff --git a/hal/include/IHalCpp.h b/hal/include/IHalCpp.h index f7f27c4..972d6b3 100644 --- a/hal/include/IHalCpp.h +++ b/hal/include/IHalCpp.h @@ -34,7 +34,9 @@ enum class SdCardHalStatus MOUNTED = 0, UNMOUNTED, INSERTED, - PULL_OUT, + PULL_OUT_DEVICE_NOT_EXIST, + PULL_OUT_OPEN_FAILED, + PULL_OUT_NOT_BLOCK_DEVICE, ERROR, END }; diff --git a/hal/src/SdCardHal.cpp b/hal/src/SdCardHal.cpp index c054b0c..8c4e99d 100644 --- a/hal/src/SdCardHal.cpp +++ b/hal/src/SdCardHal.cpp @@ -24,10 +24,8 @@ #include #include const char *SD_CARD_DEVICE = SD_CARD_DEV; -SdCardHal::SdCardHal() +SdCardHal::SdCardHal() : mStatus(SdCardHalStatus::END), mThreadRuning(false), mDeviceFd(-1) { - mThreadRuning = false; - mStatus = SdCardHalStatus::END; } void SdCardHal::SetSdCardMonitor(std::shared_ptr &monitor) { @@ -57,35 +55,52 @@ void SdCardHal::UnInit(void) void SdCardHal::DevDetectingThread(void) { constexpr int SLEEP_TIME_MS = 100; + constexpr int DEVICE_EXIST = 0; // 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 != mStatus) { - mStatus = SdCardHalStatus::PULL_OUT; + if (access(SD_CARD_DEVICE, F_OK) != DEVICE_EXIST) { + if (SdCardHalStatus::PULL_OUT_DEVICE_NOT_EXIST != mStatus) { + mStatus = SdCardHalStatus::PULL_OUT_DEVICE_NOT_EXIST; ReportDetecedChangedResult(mStatus); } + if (mDeviceFd > 0) { + close(mDeviceFd); + mDeviceFd = -1; + } goto CONTINUE; } + if (mDeviceFd < 0) { + mDeviceFd = fx_open(SD_CARD_DEVICE, O_RDONLY); + if (mDeviceFd < 0) { + // LogInfo("sdCardHal: %s open failed.\n", SD_CARD_DEVICE); + if (SdCardHalStatus::PULL_OUT_OPEN_FAILED != mStatus) { + mStatus = SdCardHalStatus::PULL_OUT_OPEN_FAILED; + ReportDetecedChangedResult(mStatus); + } + goto CONTINUE; + } + } struct stat sdStat; - if (fx_fstat(fd, &sdStat) < 0) { + if (fx_fstat(mDeviceFd, &sdStat) < 0) { // LogInfo("sdCardHal: %s fstat failed.\n", SD_CARD_DEVICE); if (SdCardHalStatus::ERROR != mStatus) { mStatus = SdCardHalStatus::ERROR; ReportDetecedChangedResult(mStatus); } + close(mDeviceFd); + mDeviceFd = -1; goto CONTINUE; } if (!S_ISBLK(sdStat.st_mode)) { // LogInfo("sdCardHal: %s is not block device.\n", SD_CARD_DEVICE); - if (SdCardHalStatus::PULL_OUT != mStatus) { - mStatus = SdCardHalStatus::PULL_OUT; + if (SdCardHalStatus::PULL_OUT_NOT_BLOCK_DEVICE != mStatus) { + mStatus = SdCardHalStatus::PULL_OUT_NOT_BLOCK_DEVICE; ReportDetecedChangedResult(mStatus); } + close(mDeviceFd); + mDeviceFd = -1; } else { // LogInfo("sdCardHal: %s is inserted.\n", SD_CARD_DEVICE); @@ -97,22 +112,32 @@ void SdCardHal::DevDetectingThread(void) CONTINUE: std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS)); } + if (mDeviceFd > 0) { + close(mDeviceFd); + mDeviceFd = -1; + } } void SdCardHal::ReportDetecedChangedResult(const SdCardHalStatus &status) { LogInfo("SdCardHalStatus changed: %s.\n", PrintfStatusString(status)); + SdCardHalStatus mountedStatus = SdCardHalStatus::END; if (SdCardHalStatus::INSERTED == status) { LogInfo("mount sd SD_CARD_DEVICE %s.\n", SD_CARD_MOUNT_PATH); constexpr int BUF_LENGTH = 128; char cmd[BUF_LENGTH] = {0}; snprintf(cmd, BUF_LENGTH, "mount %s %s", SD_CARD_DEV, SD_CARD_MOUNT_PATH); fx_system(cmd); + mountedStatus = SdCardHalStatus::MOUNTED; } auto monitor = mMonitor.lock(); if (mMonitor.expired()) { LogWarning("SdCardHal: monitor is expired.\n"); return; } + if (SdCardHalStatus::END != mountedStatus) { + monitor->ReportEvent(mountedStatus); + return; + } monitor->ReportEvent(status); } const char *SdCardHal::PrintfStatusString(const SdCardHalStatus &status) @@ -124,8 +149,12 @@ const char *SdCardHal::PrintfStatusString(const SdCardHalStatus &status) return "UNMOUNTED."; case SdCardHalStatus::INSERTED: return "INSERTED."; - case SdCardHalStatus::PULL_OUT: - return "PULL_OUT."; + case SdCardHalStatus::PULL_OUT_DEVICE_NOT_EXIST: + return "PULL_OUT_DEVICE_NOT_EXIST."; + case SdCardHalStatus::PULL_OUT_OPEN_FAILED: + return "PULL_OUT_OPEN_FAILED."; + case SdCardHalStatus::PULL_OUT_NOT_BLOCK_DEVICE: + return "PULL_OUT_NOT_BLOCK_DEVICE."; case SdCardHalStatus::END: return "END."; default: diff --git a/hal/src/SdCardHal.h b/hal/src/SdCardHal.h index 6d34710..fc42e62 100644 --- a/hal/src/SdCardHal.h +++ b/hal/src/SdCardHal.h @@ -36,5 +36,6 @@ private: bool mThreadRuning; std::thread mDevDetectingThread; std::weak_ptr mMonitor; + int mDeviceFd; }; #endif \ No newline at end of file diff --git a/middleware/StorageManager/include/IStorageManager.h b/middleware/StorageManager/include/IStorageManager.h index bc38271..a55ddbf 100644 --- a/middleware/StorageManager/include/IStorageManager.h +++ b/middleware/StorageManager/include/IStorageManager.h @@ -43,5 +43,6 @@ public: virtual StatusCode UnInit(void); virtual StatusCode SetMonitor(std::shared_ptr &monitor); virtual StatusCode SaveFile(const std::string &sourceFile, const std::string &savePaht); + virtual const char *PrintStringStorageEvent(const StorageEvent &event); }; #endif \ No newline at end of file diff --git a/middleware/StorageManager/src/IStorageManager.cpp b/middleware/StorageManager/src/IStorageManager.cpp index b45bd02..b6705ca 100644 --- a/middleware/StorageManager/src/IStorageManager.cpp +++ b/middleware/StorageManager/src/IStorageManager.cpp @@ -46,4 +46,8 @@ StatusCode IStorageManager::SetMonitor(std::shared_ptr &monitor StatusCode IStorageManager::SaveFile(const std::string &sourceFile, const std::string &savePaht) { return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); +} +const char *IStorageManager::PrintStringStorageEvent(const StorageEvent &event) +{ + return "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 e9ec509..c1e694a 100644 --- a/middleware/StorageManager/src/SdCardHandle.cpp +++ b/middleware/StorageManager/src/SdCardHandle.cpp @@ -69,7 +69,9 @@ StorageEvent SdCardHandle::StorageEventConvert(const SdCardHalStatus &status) return StorageEvent::SD_CARD_REMOVE; case SdCardHalStatus::INSERTED: return StorageEvent::SD_ABNORMAL; - case SdCardHalStatus::PULL_OUT: + case SdCardHalStatus::PULL_OUT_DEVICE_NOT_EXIST: + case SdCardHalStatus::PULL_OUT_OPEN_FAILED: + case SdCardHalStatus::PULL_OUT_NOT_BLOCK_DEVICE: return StorageEvent::SD_CARD_REMOVE; case SdCardHalStatus::ERROR: return StorageEvent::SD_ABNORMAL; diff --git a/middleware/StorageManager/src/StorageBase.cpp b/middleware/StorageManager/src/StorageBase.cpp index e8faf60..d94ee1c 100644 --- a/middleware/StorageManager/src/StorageBase.cpp +++ b/middleware/StorageManager/src/StorageBase.cpp @@ -58,4 +58,34 @@ bool StorageBase::CheckDirectory(const char *filepath) // TODO: check if files exist finally here. free(path); return true; +} +const char *StorageBase::PrintStringStorageEvent(const StorageEvent &event) +{ + switch (event) { + case StorageEvent::SD_CARD_INSERT: { + return "SD_CARD_INSERT"; + break; + } + case StorageEvent::SD_CARD_REMOVE: { + return "SD_CARD_REMOVE"; + break; + } + case StorageEvent::SD_ABNORMAL: { + return "SD_ABNORMAL"; + break; + } + case StorageEvent::EMMC_NORMAL: { + return "EMMC_NORMAL"; + break; + } + case StorageEvent::END: { + return "END"; + break; + } + + default: { + return "UNDEFINE"; + break; + } + } } \ No newline at end of file diff --git a/middleware/StorageManager/src/StorageBase.h b/middleware/StorageManager/src/StorageBase.h index e0cc99b..524d1a7 100644 --- a/middleware/StorageManager/src/StorageBase.h +++ b/middleware/StorageManager/src/StorageBase.h @@ -23,6 +23,9 @@ public: virtual ~StorageBase() = default; bool CheckDirectory(const char *filepath); +protected: + const char *PrintStringStorageEvent(const StorageEvent &event); + protected: std::weak_ptr mStorageMonitor; }; diff --git a/middleware/StorageManager/src/StorageManagerImpl.cpp b/middleware/StorageManager/src/StorageManagerImpl.cpp index ae06178..5d85df5 100644 --- a/middleware/StorageManager/src/StorageManagerImpl.cpp +++ b/middleware/StorageManager/src/StorageManagerImpl.cpp @@ -33,4 +33,8 @@ StatusCode StorageManagerImpl::SetMonitor(std::shared_ptr &moni StatusCode StorageManagerImpl::SaveFile(const std::string &sourceFile, const std::string &savePaht) { return SdCardHandle::SdSaveFile(sourceFile, savePaht); +} +const char *StorageManagerImpl::PrintStringStorageEvent(const StorageEvent &event) +{ + return StorageBase::PrintStringStorageEvent(event); } \ No newline at end of file diff --git a/middleware/StorageManager/src/StorageManagerImpl.h b/middleware/StorageManager/src/StorageManagerImpl.h index 95e0ee6..49e7643 100644 --- a/middleware/StorageManager/src/StorageManagerImpl.h +++ b/middleware/StorageManager/src/StorageManagerImpl.h @@ -27,5 +27,6 @@ public: StatusCode UnInit(void) override; StatusCode SetMonitor(std::shared_ptr &monitor) override; StatusCode SaveFile(const std::string &sourceFile, const std::string &savePaht) override; + const char *PrintStringStorageEvent(const StorageEvent &event) override; }; #endif \ No newline at end of file