From 0f60695c1438e10e6b49e0467d8ac0edf4be7c1a Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Tue, 16 Jul 2024 22:40:07 +0800 Subject: [PATCH] Improve:Format sd card. --- .../MissionManager/src/DataProcessing.h | 4 ++-- .../MissionManager/src/FormattingState.cpp | 23 ++++++++++++++++++- .../MissionManager/src/FormattingState.h | 4 ++++ application/MissionManager/src/IdleState.cpp | 3 --- application/MissionManager/src/LedsHandle.cpp | 3 +++ application/MissionManager/src/LedsHandle.h | 1 + .../MissionManager/src/OnMissionState.cpp | 2 -- .../src/PirTrggeredMissionState.cpp | 2 -- .../MissionManager/src/TestMissionState.cpp | 2 +- 9 files changed, 33 insertions(+), 11 deletions(-) diff --git a/application/MissionManager/src/DataProcessing.h b/application/MissionManager/src/DataProcessing.h index ef37b50..63941d2 100644 --- a/application/MissionManager/src/DataProcessing.h +++ b/application/MissionManager/src/DataProcessing.h @@ -24,8 +24,8 @@ using DataProcessingFunc = std::function; enum class InternalStateEvent { STORAGE_HANDLE_STATE_INIT = static_cast(MissionEvent::END), - SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED, - ANY_STATE_SD_STATUS_PERORIED, + SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED, ///< Only SdCardHandleState can process this message. + ANY_STATE_SD_STATUS_PERORIED, ///< Use it to notify other statuses. CHECK_UPGRADE_FILE, MEDIA_REPORT_EVENT, KEY_EVENT_HANDLE, diff --git a/application/MissionManager/src/FormattingState.cpp b/application/MissionManager/src/FormattingState.cpp index 4f6ad9b..d24205f 100644 --- a/application/MissionManager/src/FormattingState.cpp +++ b/application/MissionManager/src/FormattingState.cpp @@ -16,16 +16,21 @@ #include "DataProcessing.h" #include "IFilesManager.h" #include "ILog.h" +#include "IMissionManager.h" #include "IStateMachine.h" #include "IStorageManager.h" +#include "LedControl.h" +#include "LedsHandle.h" #include "MissionStateMachine.h" #include #include using std::placeholders::_1; -FormattingState::FormattingState() : State("FormattingState") +FormattingState::FormattingState() : State("FormattingState"), mFormatting(false) { mEventHandle[InternalStateEvent::FORMAT_KEY_FORMAT_SD_CARD] = std::bind(&FormattingState::FormatKeyFormattingSDCardHandle, this, _1); + mEventHandle[InternalStateEvent::ANY_STATE_SD_STATUS_PERORIED] = + std::bind(&FormattingState::ComfirmFormatResult, this, _1); } void FormattingState::GoInState() { @@ -37,6 +42,8 @@ void FormattingState::GoOutState() if (mFormattingThread.joinable()) { mFormattingThread.join(); } + mFormatting = false; + LedsHandle::DeleteAllLeds(); } bool FormattingState::ExecuteStateMsg(VStateMachineData *msg) { @@ -57,11 +64,25 @@ bool FormattingState::FormatKeyFormattingSDCardHandle(VStateMachineData *msg) auto formatting = [](std::shared_ptr impl) { impl->FormattingThread(); }; + mFormatting = true; mFormattingThread = std::thread(formatting, shared_from_this()); return EXECUTED; } +bool FormattingState::ComfirmFormatResult(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 (StorageEvent::SD_CARD_INSERT == data->mData) { + LogInfo(" SD card inserted. Format sd card final finished.\n"); + MissionStateMachine::GetInstance()->SwitchState(SystemState::IDLE_STATE); + } + return EXECUTED; +} void FormattingState::FormattingThread(void) { + LedsHandle::ControlDeviceStatusLed(DeviceStatus::FORMATTING, KEEP_ALIVE_FOREVER, BLINKING_FAST_MS); IFilesManager::GetInstance()->UnInit(); IStorageManager::GetInstance()->FormatSDCardNow(); // IFilesManager::GetInstance()->Init(); diff --git a/application/MissionManager/src/FormattingState.h b/application/MissionManager/src/FormattingState.h index cf5da93..fa0dcda 100644 --- a/application/MissionManager/src/FormattingState.h +++ b/application/MissionManager/src/FormattingState.h @@ -19,11 +19,13 @@ #include "IMediaManager.h" #include "IStateMachine.h" #include "IStorageManager.h" +#include "LedsHandle.h" #include "VStateBase.h" #include class FormattingState : public State, public DataProcessing, public VStateBase, + public LedsHandle, public std::enable_shared_from_this { public: @@ -37,9 +39,11 @@ protected: void StateInit(void) override; void StateUnInit(void) override; bool FormatKeyFormattingSDCardHandle(VStateMachineData *msg); + bool ComfirmFormatResult(VStateMachineData *msg); void FormattingThread(void); private: + bool mFormatting; std::thread mFormattingThread; }; diff --git a/application/MissionManager/src/IdleState.cpp b/application/MissionManager/src/IdleState.cpp index dcc5d04..e6508a1 100644 --- a/application/MissionManager/src/IdleState.cpp +++ b/application/MissionManager/src/IdleState.cpp @@ -20,9 +20,6 @@ #include IdleState::IdleState() : State("IdleState") { - // mEventHandle[InternalStateEvent::MEDIA_REPORT_EVENT] = std::bind(&IdleState::MediaReportHandle, this, _1); - // mEventHandle[InternalStateEvent::SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED] = - // std::bind(&IdleState::SdCardEventHandle, this, _1); mEventHandle[InternalStateEvent::RESET_KEY_MEDIA_TASK] = std::bind(&IdleState::ResetKeyMediaTaskHandle, this, _1); mEventHandle[InternalStateEvent::FORMAT_KEY_FORMAT_SD_CARD] = std::bind(&IdleState::FormatKeyFormattingSDCardHandle, this, _1); diff --git a/application/MissionManager/src/LedsHandle.cpp b/application/MissionManager/src/LedsHandle.cpp index 3f9eb0f..c447852 100644 --- a/application/MissionManager/src/LedsHandle.cpp +++ b/application/MissionManager/src/LedsHandle.cpp @@ -23,6 +23,9 @@ void LedsHandle::ControlDeviceStatusLed(const DeviceStatus &status, const long i case DeviceStatus::NORMAL: mDeviceStatus = SetLedState::ControlLed("device_status", LedState::GREEN, keepAliveTime, blinkPeriod); break; + case DeviceStatus::FORMATTING: + mDeviceStatus = SetLedState::ControlLed("device_status", LedState::YELLOW, keepAliveTime, blinkPeriod); + break; default: LogWarning("unknow device status.\n"); diff --git a/application/MissionManager/src/LedsHandle.h b/application/MissionManager/src/LedsHandle.h index e394d5b..56a9584 100644 --- a/application/MissionManager/src/LedsHandle.h +++ b/application/MissionManager/src/LedsHandle.h @@ -19,6 +19,7 @@ enum class DeviceStatus { NORMAL = 0, TAKING_PICTURE_OR_VIDEO, + FORMATTING, END }; class LedsHandle diff --git a/application/MissionManager/src/OnMissionState.cpp b/application/MissionManager/src/OnMissionState.cpp index 7e497b9..1f52925 100644 --- a/application/MissionManager/src/OnMissionState.cpp +++ b/application/MissionManager/src/OnMissionState.cpp @@ -19,8 +19,6 @@ #include "MissionStateMachine.h" OnMissionState::OnMissionState() : MissionState("OnMissionState") { - // mEventHandle[InternalStateEvent::ANY_STATE_SD_STATUS_PERORIED] = - // std::bind(&OnMissionState::SdCardEventReportSendToApp, this, _1); } void OnMissionState::GoInState() { diff --git a/application/MissionManager/src/PirTrggeredMissionState.cpp b/application/MissionManager/src/PirTrggeredMissionState.cpp index 7ab21f9..4d5190b 100644 --- a/application/MissionManager/src/PirTrggeredMissionState.cpp +++ b/application/MissionManager/src/PirTrggeredMissionState.cpp @@ -19,8 +19,6 @@ #include "PirTriggeredMissionState.h" PirTriggeredMissionState::PirTriggeredMissionState() : MissionState("PirTriggeredMissionState") { - // mEventHandle[InternalStateEvent::ANY_STATE_SD_STATUS_PERORIED] = - // std::bind(&PirTriggeredMissionState::SdCardEventReportSendToApp, this, _1); } void PirTriggeredMissionState::GoInState() { diff --git a/application/MissionManager/src/TestMissionState.cpp b/application/MissionManager/src/TestMissionState.cpp index eacf40c..04dd26b 100644 --- a/application/MissionManager/src/TestMissionState.cpp +++ b/application/MissionManager/src/TestMissionState.cpp @@ -43,7 +43,7 @@ void TestMissionState::GoInState() std::shared_ptr monitor = std::dynamic_pointer_cast(MissionState::shared_from_this()); IAppManager::GetInstance()->SetAppMonitor(monitor); - ControlDeviceStatusLed(DeviceStatus::NORMAL); + LedsHandle::ControlDeviceStatusLed(DeviceStatus::NORMAL); } void TestMissionState::GoOutState() {