Improve:SD card event.

This commit is contained in:
Fancy code 2024-05-06 21:00:58 +08:00
parent d11518383a
commit 7abf2d7a76
17 changed files with 146 additions and 17 deletions

View File

@ -23,6 +23,7 @@ using DataProcessingFunc = std::function<bool(VStateMachineData *)>;
enum class InternalStateEvent enum class InternalStateEvent
{ {
STORAGE_HANDLE_STATE_INIT = static_cast<int>(MissionEvent::END), STORAGE_HANDLE_STATE_INIT = static_cast<int>(MissionEvent::END),
SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED,
MEDIA_REPORT_EVENT, MEDIA_REPORT_EVENT,
END END
}; };

View File

@ -19,6 +19,8 @@
MissionState::MissionState(const std::string &name) : State(name) MissionState::MissionState(const std::string &name) : State(name)
{ {
mEventHandle[InternalStateEvent::MEDIA_REPORT_EVENT] = std::bind(&MissionState::MediaReportHandle, this, _1); 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() void MissionState::GoInState()
{ {
@ -38,3 +40,9 @@ bool MissionState::MediaReportHandle(VStateMachineData *msg)
MissionStateMachine::GetInstance()->SwitchState(SystemState::STORAGE_HANDLE_STATE); MissionStateMachine::GetInstance()->SwitchState(SystemState::STORAGE_HANDLE_STATE);
return EXECUTED; return EXECUTED;
} }
bool MissionState::SdCardEventReportHandle(VStateMachineData *msg)
{
MissionStateMachine::GetInstance()->DelayMessage(msg);
MissionStateMachine::GetInstance()->SwitchState(SystemState::SD_CARD_HANDLE_STATE);
return EXECUTED;
}

View File

@ -27,5 +27,6 @@ public:
private: private:
bool MediaReportHandle(VStateMachineData *msg); bool MediaReportHandle(VStateMachineData *msg);
bool SdCardEventReportHandle(VStateMachineData *msg);
}; };
#endif #endif

View File

@ -99,6 +99,10 @@ void MissionStateMachine::RunStateMachine(const IpcMission &mission)
mStateTree[SystemState::STORAGE_HANDLE_STATE].get()); mStateTree[SystemState::STORAGE_HANDLE_STATE].get());
mStateMachine->SetCurrentState(mStateTree[SystemState::TOP_STATE].get()); mStateMachine->SetCurrentState(mStateTree[SystemState::TOP_STATE].get());
mStateMachine->StartStateMachine(); mStateMachine->StartStateMachine();
/**
* @brief The business can only be processed after the state machine is started.
*
*/
std::shared_ptr<VMissionData> message = std::shared_ptr<VMissionData> message =
std::make_shared<VMissionData>(static_cast<MissionEvent>(InternalStateEvent::STORAGE_HANDLE_STATE_INIT)); std::make_shared<VMissionData>(static_cast<MissionEvent>(InternalStateEvent::STORAGE_HANDLE_STATE_INIT));
SendStateMessage(message); SendStateMessage(message);

View File

@ -17,9 +17,11 @@
#include "ILog.h" #include "ILog.h"
#include "IMediaManager.h" #include "IMediaManager.h"
#include "MissionStateMachine.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::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() void SdCardHandleState::GoInState()
{ {
@ -43,6 +45,15 @@ bool SdCardHandleState::MediaReportHandle(VStateMachineData *msg)
LogError("nullptr pointer.\n"); LogError("nullptr pointer.\n");
return NOT_EXECUTED; 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<SaveFileInfo>(data->mData.mFileName);
return EXECUTED;
}
LogInfo("file = %s.\n", data->mData.mFileName.c_str()); LogInfo("file = %s.\n", data->mData.mFileName.c_str());
SaveFileInfo saveFileInfo(data->mData.mFileName); SaveFileInfo saveFileInfo(data->mData.mFileName);
StatusCode code = IFilesManager::GetInstance()->SaveFile(saveFileInfo); StatusCode code = IFilesManager::GetInstance()->SaveFile(saveFileInfo);
@ -51,3 +62,20 @@ bool SdCardHandleState::MediaReportHandle(VStateMachineData *msg)
} }
return EXECUTED; return EXECUTED;
} }
bool SdCardHandleState::SdCardEventHandle(VStateMachineData *msg)
{
std::shared_ptr<MissionMessage> message = std::dynamic_pointer_cast<MissionMessage>(msg->GetMessageObj());
std::shared_ptr<VMissionDataV2<StorageEvent>> data =
std::dynamic_pointer_cast<VMissionDataV2<StorageEvent>>(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;
}

View File

@ -17,6 +17,8 @@
#include "DataProcessing.h" #include "DataProcessing.h"
#include "IMediaManager.h" #include "IMediaManager.h"
#include "IStateMachine.h" #include "IStateMachine.h"
#include "IStorageManager.h"
#include "IFilesManager.h"
class SdCardHandleState : public State, public DataProcessing, public std::enable_shared_from_this<SdCardHandleState> class SdCardHandleState : public State, public DataProcessing, public std::enable_shared_from_this<SdCardHandleState>
{ {
public: public:
@ -28,5 +30,10 @@ public:
private: private:
bool MediaReportHandle(VStateMachineData *msg); bool MediaReportHandle(VStateMachineData *msg);
bool SdCardEventHandle(VStateMachineData *msg);
private:
StorageEvent mSdCardStatus;
std::shared_ptr<SaveFileInfo> mFileNeedToSave;
}; };
#endif #endif

View File

@ -45,6 +45,9 @@ void StorageHandleState::UnInit(void)
void StorageHandleState::ReportEvent(const StorageEvent &event) void StorageHandleState::ReportEvent(const StorageEvent &event)
{ {
LogInfo("StorageHandleState::ReportEvent.\n"); LogInfo("StorageHandleState::ReportEvent.\n");
std::shared_ptr<VMissionData> message = std::make_shared<VMissionDataV2<StorageEvent>>(
static_cast<MissionEvent>(InternalStateEvent::SD_CARD_HANDLE_STATE_SD_STATUS_REPORTED), event);
MissionStateMachine::GetInstance()->SendStateMessage(message);
} }
bool StorageHandleState::StorageStartInitHandle(VStateMachineData *msg) bool StorageHandleState::StorageStartInitHandle(VStateMachineData *msg)
{ {

View File

@ -34,7 +34,9 @@ enum class SdCardHalStatus
MOUNTED = 0, MOUNTED = 0,
UNMOUNTED, UNMOUNTED,
INSERTED, INSERTED,
PULL_OUT, PULL_OUT_DEVICE_NOT_EXIST,
PULL_OUT_OPEN_FAILED,
PULL_OUT_NOT_BLOCK_DEVICE,
ERROR, ERROR,
END END
}; };

View File

@ -24,10 +24,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
const char *SD_CARD_DEVICE = SD_CARD_DEV; 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<VSdCardHalMonitor> &monitor) void SdCardHal::SetSdCardMonitor(std::shared_ptr<VSdCardHalMonitor> &monitor)
{ {
@ -57,35 +55,52 @@ void SdCardHal::UnInit(void)
void SdCardHal::DevDetectingThread(void) void SdCardHal::DevDetectingThread(void)
{ {
constexpr int SLEEP_TIME_MS = 100; constexpr int SLEEP_TIME_MS = 100;
constexpr int DEVICE_EXIST = 0;
// SdCardHalStatus status = SdCardHalStatus::END; // SdCardHalStatus status = SdCardHalStatus::END;
int fd = -1;
// const char *SD_CARD_DEVICE = "/SD_CARD_DEVICE/mmcblk1p1"; // const char *SD_CARD_DEVICE = "/SD_CARD_DEVICE/mmcblk1p1";
mThreadRuning = true; mThreadRuning = true;
while (mThreadRuning) { while (mThreadRuning) {
fd = fx_open(SD_CARD_DEVICE, O_RDONLY); if (access(SD_CARD_DEVICE, F_OK) != DEVICE_EXIST) {
if (fd < 0) { 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); // LogInfo("sdCardHal: %s open failed.\n", SD_CARD_DEVICE);
if (SdCardHalStatus::PULL_OUT != mStatus) { if (SdCardHalStatus::PULL_OUT_OPEN_FAILED != mStatus) {
mStatus = SdCardHalStatus::PULL_OUT; mStatus = SdCardHalStatus::PULL_OUT_OPEN_FAILED;
ReportDetecedChangedResult(mStatus); ReportDetecedChangedResult(mStatus);
} }
goto CONTINUE; goto CONTINUE;
} }
}
struct stat sdStat; struct stat sdStat;
if (fx_fstat(fd, &sdStat) < 0) { if (fx_fstat(mDeviceFd, &sdStat) < 0) {
// LogInfo("sdCardHal: %s fstat failed.\n", SD_CARD_DEVICE); // LogInfo("sdCardHal: %s fstat failed.\n", SD_CARD_DEVICE);
if (SdCardHalStatus::ERROR != mStatus) { if (SdCardHalStatus::ERROR != mStatus) {
mStatus = SdCardHalStatus::ERROR; mStatus = SdCardHalStatus::ERROR;
ReportDetecedChangedResult(mStatus); ReportDetecedChangedResult(mStatus);
} }
close(mDeviceFd);
mDeviceFd = -1;
goto CONTINUE; goto CONTINUE;
} }
if (!S_ISBLK(sdStat.st_mode)) { if (!S_ISBLK(sdStat.st_mode)) {
// LogInfo("sdCardHal: %s is not block device.\n", SD_CARD_DEVICE); // LogInfo("sdCardHal: %s is not block device.\n", SD_CARD_DEVICE);
if (SdCardHalStatus::PULL_OUT != mStatus) { if (SdCardHalStatus::PULL_OUT_NOT_BLOCK_DEVICE != mStatus) {
mStatus = SdCardHalStatus::PULL_OUT; mStatus = SdCardHalStatus::PULL_OUT_NOT_BLOCK_DEVICE;
ReportDetecedChangedResult(mStatus); ReportDetecedChangedResult(mStatus);
} }
close(mDeviceFd);
mDeviceFd = -1;
} }
else { else {
// LogInfo("sdCardHal: %s is inserted.\n", SD_CARD_DEVICE); // LogInfo("sdCardHal: %s is inserted.\n", SD_CARD_DEVICE);
@ -97,22 +112,32 @@ void SdCardHal::DevDetectingThread(void)
CONTINUE: CONTINUE:
std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS)); std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS));
} }
if (mDeviceFd > 0) {
close(mDeviceFd);
mDeviceFd = -1;
}
} }
void SdCardHal::ReportDetecedChangedResult(const SdCardHalStatus &status) void SdCardHal::ReportDetecedChangedResult(const SdCardHalStatus &status)
{ {
LogInfo("SdCardHalStatus changed: %s.\n", PrintfStatusString(status)); LogInfo("SdCardHalStatus changed: %s.\n", PrintfStatusString(status));
SdCardHalStatus mountedStatus = SdCardHalStatus::END;
if (SdCardHalStatus::INSERTED == status) { if (SdCardHalStatus::INSERTED == status) {
LogInfo("mount sd SD_CARD_DEVICE %s.\n", SD_CARD_MOUNT_PATH); LogInfo("mount sd SD_CARD_DEVICE %s.\n", SD_CARD_MOUNT_PATH);
constexpr int BUF_LENGTH = 128; constexpr int BUF_LENGTH = 128;
char cmd[BUF_LENGTH] = {0}; char cmd[BUF_LENGTH] = {0};
snprintf(cmd, BUF_LENGTH, "mount %s %s", SD_CARD_DEV, SD_CARD_MOUNT_PATH); snprintf(cmd, BUF_LENGTH, "mount %s %s", SD_CARD_DEV, SD_CARD_MOUNT_PATH);
fx_system(cmd); fx_system(cmd);
mountedStatus = SdCardHalStatus::MOUNTED;
} }
auto monitor = mMonitor.lock(); auto monitor = mMonitor.lock();
if (mMonitor.expired()) { if (mMonitor.expired()) {
LogWarning("SdCardHal: monitor is expired.\n"); LogWarning("SdCardHal: monitor is expired.\n");
return; return;
} }
if (SdCardHalStatus::END != mountedStatus) {
monitor->ReportEvent(mountedStatus);
return;
}
monitor->ReportEvent(status); monitor->ReportEvent(status);
} }
const char *SdCardHal::PrintfStatusString(const SdCardHalStatus &status) const char *SdCardHal::PrintfStatusString(const SdCardHalStatus &status)
@ -124,8 +149,12 @@ const char *SdCardHal::PrintfStatusString(const SdCardHalStatus &status)
return "UNMOUNTED."; return "UNMOUNTED.";
case SdCardHalStatus::INSERTED: case SdCardHalStatus::INSERTED:
return "INSERTED."; return "INSERTED.";
case SdCardHalStatus::PULL_OUT: case SdCardHalStatus::PULL_OUT_DEVICE_NOT_EXIST:
return "PULL_OUT."; 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: case SdCardHalStatus::END:
return "END."; return "END.";
default: default:

View File

@ -36,5 +36,6 @@ private:
bool mThreadRuning; bool mThreadRuning;
std::thread mDevDetectingThread; std::thread mDevDetectingThread;
std::weak_ptr<VSdCardHalMonitor> mMonitor; std::weak_ptr<VSdCardHalMonitor> mMonitor;
int mDeviceFd;
}; };
#endif #endif

View File

@ -43,5 +43,6 @@ public:
virtual StatusCode UnInit(void); virtual StatusCode UnInit(void);
virtual StatusCode SetMonitor(std::shared_ptr<VStorageMoniter> &monitor); virtual StatusCode SetMonitor(std::shared_ptr<VStorageMoniter> &monitor);
virtual StatusCode SaveFile(const std::string &sourceFile, const std::string &savePaht); virtual StatusCode SaveFile(const std::string &sourceFile, const std::string &savePaht);
virtual const char *PrintStringStorageEvent(const StorageEvent &event);
}; };
#endif #endif

View File

@ -47,3 +47,7 @@ StatusCode IStorageManager::SaveFile(const std::string &sourceFile, const std::s
{ {
return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION); return CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION);
} }
const char *IStorageManager::PrintStringStorageEvent(const StorageEvent &event)
{
return "STATUS_CODE_VIRTUAL_FUNCTION";
}

View File

@ -69,7 +69,9 @@ StorageEvent SdCardHandle::StorageEventConvert(const SdCardHalStatus &status)
return StorageEvent::SD_CARD_REMOVE; return StorageEvent::SD_CARD_REMOVE;
case SdCardHalStatus::INSERTED: case SdCardHalStatus::INSERTED:
return StorageEvent::SD_ABNORMAL; 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; return StorageEvent::SD_CARD_REMOVE;
case SdCardHalStatus::ERROR: case SdCardHalStatus::ERROR:
return StorageEvent::SD_ABNORMAL; return StorageEvent::SD_ABNORMAL;

View File

@ -59,3 +59,33 @@ bool StorageBase::CheckDirectory(const char *filepath)
free(path); free(path);
return true; 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;
}
}
}

View File

@ -23,6 +23,9 @@ public:
virtual ~StorageBase() = default; virtual ~StorageBase() = default;
bool CheckDirectory(const char *filepath); bool CheckDirectory(const char *filepath);
protected:
const char *PrintStringStorageEvent(const StorageEvent &event);
protected: protected:
std::weak_ptr<VStorageMoniter> mStorageMonitor; std::weak_ptr<VStorageMoniter> mStorageMonitor;
}; };

View File

@ -34,3 +34,7 @@ StatusCode StorageManagerImpl::SaveFile(const std::string &sourceFile, const std
{ {
return SdCardHandle::SdSaveFile(sourceFile, savePaht); return SdCardHandle::SdSaveFile(sourceFile, savePaht);
} }
const char *StorageManagerImpl::PrintStringStorageEvent(const StorageEvent &event)
{
return StorageBase::PrintStringStorageEvent(event);
}

View File

@ -27,5 +27,6 @@ public:
StatusCode UnInit(void) override; StatusCode UnInit(void) override;
StatusCode SetMonitor(std::shared_ptr<VStorageMoniter> &monitor) override; StatusCode SetMonitor(std::shared_ptr<VStorageMoniter> &monitor) override;
StatusCode SaveFile(const std::string &sourceFile, const std::string &savePaht) override; StatusCode SaveFile(const std::string &sourceFile, const std::string &savePaht) override;
const char *PrintStringStorageEvent(const StorageEvent &event) override;
}; };
#endif #endif