From 6a107520f776f8ec9af053c0738b7295981cdfc9 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Sat, 20 Jul 2024 20:41:55 +0800 Subject: [PATCH] Improve:Leds handle. --- application/MissionManager/src/LedsHandle.cpp | 14 +++++++------- application/MissionManager/src/LedsHandle.h | 11 ++++++++++- .../MissionManager/src/MediaHandleState.cpp | 5 +++++ application/MissionManager/src/MediaHandleState.h | 2 ++ .../MissionManager/src/SdCardHandleState.cpp | 5 ++++- hal/src/SdCardHal.cpp | 13 ++++++++++--- utils/LedControl/include/LedControl.h | 1 + 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/application/MissionManager/src/LedsHandle.cpp b/application/MissionManager/src/LedsHandle.cpp index c430d56..af0f312 100644 --- a/application/MissionManager/src/LedsHandle.cpp +++ b/application/MissionManager/src/LedsHandle.cpp @@ -19,6 +19,7 @@ void LedsHandle::ControlDeviceStatusLed(const DeviceStatus &status, const long int &keepAliveTime, const unsigned int &blinkPeriod) { + DeleteDeviceStatusLed(); switch (status) { case DeviceStatus::NORMAL: mDeviceStatus = SetLedState::ControlLed("device_status", LedState::GREEN, keepAliveTime, blinkPeriod); @@ -29,12 +30,11 @@ void LedsHandle::ControlDeviceStatusLed(const DeviceStatus &status, const long i case DeviceStatus::SD_CARD_REMOVE: mDeviceStatus = SetLedState::ControlLed("device_status", LedState::GREEN, keepAliveTime, blinkPeriod); break; - case DeviceStatus::SD_CARD_INSERT: - /** - * @brief When the SD card is normal, there is no need to change the state of the status light, but the status - * light resources need to be released and the status light needs to be restored to its proper state. - */ - mDeviceStatus.reset(); + case DeviceStatus::SD_CARD_ABNORMAL: + mDeviceStatus = SetLedState::ControlLed("device_status", LedState::RED, keepAliveTime, blinkPeriod); + break; + case DeviceStatus::TAKING_PICTURE_OR_VIDEO: + mDeviceStatus = SetLedState::ControlLed("device_status", LedState::GREEN, keepAliveTime, blinkPeriod); break; default: @@ -42,7 +42,7 @@ void LedsHandle::ControlDeviceStatusLed(const DeviceStatus &status, const long i break; } } -void inline LedsHandle::DeleteDeviceStatusLed(void) +void LedsHandle::DeleteDeviceStatusLed(void) { if (mDeviceStatus) { mDeviceStatus->DeleteState(); diff --git a/application/MissionManager/src/LedsHandle.h b/application/MissionManager/src/LedsHandle.h index d28a3f2..d38ff75 100644 --- a/application/MissionManager/src/LedsHandle.h +++ b/application/MissionManager/src/LedsHandle.h @@ -22,8 +22,12 @@ enum class DeviceStatus FORMATTING, SD_CARD_REMOVE, SD_CARD_INSERT, + SD_CARD_ABNORMAL, END }; +/** + * @brief LedsHandle-LED light control class, mainly used to inherit LED light control functions in different states. + */ class LedsHandle { public: @@ -44,6 +48,11 @@ protected: void DeleteAllLeds(void); private: - std::shared_ptr mDeviceStatus; + /** + * @brief Definitions of various LED indicators. + * NOTE: When indicator lights with different functions switch states, the previous light state should be cleared by + * calling the DeleteState function. + */ + std::shared_ptr mDeviceStatus; ///< Device status indicator. }; #endif \ No newline at end of file diff --git a/application/MissionManager/src/MediaHandleState.cpp b/application/MissionManager/src/MediaHandleState.cpp index deb30bd..4c5767f 100644 --- a/application/MissionManager/src/MediaHandleState.cpp +++ b/application/MissionManager/src/MediaHandleState.cpp @@ -43,6 +43,7 @@ void MediaHandleState::GoInState() void MediaHandleState::GoOutState() { LogInfo(" ========== MediaHandleState::GoOutState.\n"); + LedsHandle::DeleteAllLeds(); } bool MediaHandleState::ExecuteStateMsg(VStateMachineData *msg) { @@ -57,6 +58,8 @@ void MediaHandleState::TaskResponse(const MediaTaskInfo &taskinfo) bool MediaHandleState::ResetKeyMediaTaskHandle(VStateMachineData *msg) { MediaTaskHandle::MakeSingleTask(InternalStateEvent::RESET_KEY_MEDIA_TASK, shared_from_this()); + LedsHandle::ControlDeviceStatusLed( + DeviceStatus::TAKING_PICTURE_OR_VIDEO, KEEP_ALIVE_FOREVER, BLINKING_SUPER_FAST_MS); return EXECUTED; } bool MediaHandleState::MediaTaskFinishedHandle(VStateMachineData *msg) @@ -78,6 +81,8 @@ bool MediaHandleState::MediaTaskFinishedHandle(VStateMachineData *msg) files.push_back(file); } IFilesManager::GetInstance()->SaveFiles(files); + LedsHandle::DeleteDeviceStatusLed(); + MissionStateMachine::GetInstance()->SwitchState(SystemState::IDLE_STATE); return EXECUTED; } int MediaHandleState::GetFileSize_KB(const char *filePath) diff --git a/application/MissionManager/src/MediaHandleState.h b/application/MissionManager/src/MediaHandleState.h index 2fe1ab4..792129e 100644 --- a/application/MissionManager/src/MediaHandleState.h +++ b/application/MissionManager/src/MediaHandleState.h @@ -16,12 +16,14 @@ #define MEDIA_HANDLE_STATE_H #include "DataProcessing.h" #include "IStateMachine.h" +#include "LedsHandle.h" #include "MediaTaskHandle.h" constexpr int FILE_SIZE_ERROR = -1; class MediaHandleState : public State, public DataProcessing, public MediaTaskHandle, public VMediaTaskIniator, + public LedsHandle, public std::enable_shared_from_this { public: diff --git a/application/MissionManager/src/SdCardHandleState.cpp b/application/MissionManager/src/SdCardHandleState.cpp index 63e0298..42a8e85 100644 --- a/application/MissionManager/src/SdCardHandleState.cpp +++ b/application/MissionManager/src/SdCardHandleState.cpp @@ -142,7 +142,10 @@ void SdCardHandleState::SetSdCardLedsStatus(const StorageEvent &event) LedsHandle::ControlDeviceStatusLed(DeviceStatus::SD_CARD_REMOVE, KEEP_ALIVE_FOREVER, BLINKING_SLOW_MS); break; case StorageEvent::SD_CARD_INSERT: - LedsHandle::ControlDeviceStatusLed(DeviceStatus::SD_CARD_INSERT); + LedsHandle::DeleteDeviceStatusLed(); + break; + case StorageEvent::SD_ABNORMAL: + LedsHandle::ControlDeviceStatusLed(DeviceStatus::SD_CARD_ABNORMAL, KEEP_ALIVE_FOREVER, BLINKING_SUPER_FAST_MS); break; default: diff --git a/hal/src/SdCardHal.cpp b/hal/src/SdCardHal.cpp index f6050a3..cae3b19 100644 --- a/hal/src/SdCardHal.cpp +++ b/hal/src/SdCardHal.cpp @@ -170,9 +170,16 @@ void SdCardHal::ReportDetecedChangedResult(const SdCardHalStatus &status) 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; - mStatus = SdCardHalStatus::MOUNTED; + int ret = fx_system(cmd); + constexpr int SYSTEM_SUCCESS = 0; + if (SYSTEM_SUCCESS == ret) { + LogInfo("mount sd card SUCCESS.\n"); + mountedStatus = SdCardHalStatus::MOUNTED; + mStatus = SdCardHalStatus::MOUNTED; + } + else { + LogError("mount sd card failed.\n"); + } } auto monitor = mMonitor.lock(); if (mMonitor.expired()) { diff --git a/utils/LedControl/include/LedControl.h b/utils/LedControl/include/LedControl.h index af95786..d62af5f 100644 --- a/utils/LedControl/include/LedControl.h +++ b/utils/LedControl/include/LedControl.h @@ -19,6 +19,7 @@ #include constexpr unsigned int NEW_TOP_LED_STATE = 0; constexpr unsigned int LED_NOT_BLINK = 0; +constexpr unsigned int BLINKING_SUPER_FAST_MS = 200; constexpr unsigned int BLINKING_FAST_MS = 500; constexpr unsigned int BLINKING_SLOW_MS = 1000; constexpr long int KEEP_ALIVE_FOREVER = 0;