Add:FormattingState.
This commit is contained in:
parent
0b49e1a2ec
commit
dd0f1b0895
|
@ -21,8 +21,9 @@ stateDiagram-v2
|
||||||
[*] --> TopState
|
[*] --> TopState
|
||||||
TopState --> PowerOff
|
TopState --> PowerOff
|
||||||
TopState --> MSDCState
|
TopState --> MSDCState
|
||||||
TopState --> DeviceAbnormal
|
|
||||||
TopState --> MissionState
|
TopState --> MissionState
|
||||||
|
TopState --> DeviceAbnormal
|
||||||
|
TopState --> FormattingSDCard
|
||||||
MissionState --> 空闲
|
MissionState --> 空闲
|
||||||
MissionState --> 存储管理
|
MissionState --> 存储管理
|
||||||
存储管理 --> EMMC
|
存储管理 --> EMMC
|
||||||
|
|
70
application/MissionManager/src/FormattingState.cpp
Normal file
70
application/MissionManager/src/FormattingState.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Fancy Code.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
#include "FormattingState.h"
|
||||||
|
#include "DataProcessing.h"
|
||||||
|
#include "IFilesManager.h"
|
||||||
|
#include "ILog.h"
|
||||||
|
#include "IStateMachine.h"
|
||||||
|
#include "IStorageManager.h"
|
||||||
|
#include "MissionStateMachine.h"
|
||||||
|
#include <functional>
|
||||||
|
#include <memory>
|
||||||
|
using std::placeholders::_1;
|
||||||
|
FormattingState::FormattingState() : State("FormattingState")
|
||||||
|
{
|
||||||
|
mEventHandle[InternalStateEvent::FORMAT_KEY_FORMAT_SD_CARD] =
|
||||||
|
std::bind(&FormattingState::FormatKeyFormattingSDCardHandle, this, _1);
|
||||||
|
}
|
||||||
|
void FormattingState::GoInState()
|
||||||
|
{
|
||||||
|
LogInfo(" ========== FormattingState::GoInState.\n");
|
||||||
|
}
|
||||||
|
void FormattingState::GoOutState()
|
||||||
|
{
|
||||||
|
LogInfo(" ========== FormattingState::GoOutState.\n");
|
||||||
|
if (mFormattingThread.joinable()) {
|
||||||
|
mFormattingThread.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool FormattingState::ExecuteStateMsg(VStateMachineData *msg)
|
||||||
|
{
|
||||||
|
return DataProcessing::EventHandle(msg);
|
||||||
|
}
|
||||||
|
void FormattingState::StateInit(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void FormattingState::StateUnInit(void)
|
||||||
|
{
|
||||||
|
if (mFormattingThread.joinable()) {
|
||||||
|
mFormattingThread.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool FormattingState::FormatKeyFormattingSDCardHandle(VStateMachineData *msg)
|
||||||
|
{
|
||||||
|
LogInfo("Now formatting SD card.\n");
|
||||||
|
auto formatting = [](std::shared_ptr<FormattingState> impl) {
|
||||||
|
impl->FormattingThread();
|
||||||
|
};
|
||||||
|
mFormattingThread = std::thread(formatting, shared_from_this());
|
||||||
|
return EXECUTED;
|
||||||
|
}
|
||||||
|
void FormattingState::FormattingThread(void)
|
||||||
|
{
|
||||||
|
IFilesManager::GetInstance()->UnInit();
|
||||||
|
IStorageManager::GetInstance()->FormatSDCardNow();
|
||||||
|
// IFilesManager::GetInstance()->Init();
|
||||||
|
MissionStateMachine::GetInstance()->SwitchState(SystemState::STORAGE_HANDLE_STATE);
|
||||||
|
LogInfo("Formatting SD card done.\n");
|
||||||
|
}
|
46
application/MissionManager/src/FormattingState.h
Normal file
46
application/MissionManager/src/FormattingState.h
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 Fancy Code.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
#ifndef FORMATTING_STATE_H
|
||||||
|
#define FORMATTING_STATE_H
|
||||||
|
#include "DataProcessing.h"
|
||||||
|
#include "IFilesManager.h"
|
||||||
|
#include "IMediaManager.h"
|
||||||
|
#include "IStateMachine.h"
|
||||||
|
#include "IStorageManager.h"
|
||||||
|
#include "VStateBase.h"
|
||||||
|
#include <thread>
|
||||||
|
class FormattingState : public State,
|
||||||
|
public DataProcessing,
|
||||||
|
public VStateBase,
|
||||||
|
public std::enable_shared_from_this<FormattingState>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FormattingState();
|
||||||
|
virtual ~FormattingState() = default;
|
||||||
|
void GoInState() override;
|
||||||
|
void GoOutState() override;
|
||||||
|
bool ExecuteStateMsg(VStateMachineData *msg) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void StateInit(void) override;
|
||||||
|
void StateUnInit(void) override;
|
||||||
|
bool FormatKeyFormattingSDCardHandle(VStateMachineData *msg);
|
||||||
|
void FormattingThread(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::thread mFormattingThread;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -13,6 +13,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
#include "MissionManagerMakePtr.h"
|
#include "MissionManagerMakePtr.h"
|
||||||
|
#include "FormattingState.h"
|
||||||
#include "ILog.h"
|
#include "ILog.h"
|
||||||
#include "IMcuManager.h"
|
#include "IMcuManager.h"
|
||||||
#include "IMissionManager.h"
|
#include "IMissionManager.h"
|
||||||
|
@ -121,3 +122,8 @@ std::shared_ptr<State> MissionManagerMakePtr::CreateIdleState(void)
|
||||||
std::shared_ptr<State> state = std::make_shared<IdleState>();
|
std::shared_ptr<State> state = std::make_shared<IdleState>();
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
std::shared_ptr<State> MissionManagerMakePtr::CreateFormattingState(void)
|
||||||
|
{
|
||||||
|
std::shared_ptr<State> state = std::make_shared<FormattingState>();
|
||||||
|
return state;
|
||||||
|
}
|
|
@ -33,5 +33,6 @@ public:
|
||||||
virtual std::shared_ptr<State> CreateUpgradeState(void);
|
virtual std::shared_ptr<State> CreateUpgradeState(void);
|
||||||
virtual std::shared_ptr<State> CreateMediaHandleState(void);
|
virtual std::shared_ptr<State> CreateMediaHandleState(void);
|
||||||
virtual std::shared_ptr<State> CreateIdleState(void);
|
virtual std::shared_ptr<State> CreateIdleState(void);
|
||||||
|
virtual std::shared_ptr<State> CreateFormattingState(void);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
|
@ -108,8 +108,10 @@ void MissionStateMachine::RunStateMachine(const IpcMission &mission)
|
||||||
mStateTree[SystemState::UPGRADE_STATE] = MissionManagerMakePtr::GetInstance()->CreateUpgradeState();
|
mStateTree[SystemState::UPGRADE_STATE] = MissionManagerMakePtr::GetInstance()->CreateUpgradeState();
|
||||||
mStateTree[SystemState::MEDIA_HANDLE_STATE] = MissionManagerMakePtr::GetInstance()->CreateMediaHandleState();
|
mStateTree[SystemState::MEDIA_HANDLE_STATE] = MissionManagerMakePtr::GetInstance()->CreateMediaHandleState();
|
||||||
mStateTree[SystemState::IDLE_STATE] = MissionManagerMakePtr::GetInstance()->CreateIdleState();
|
mStateTree[SystemState::IDLE_STATE] = MissionManagerMakePtr::GetInstance()->CreateIdleState();
|
||||||
|
mStateTree[SystemState::FORMATTING_STATE] = MissionManagerMakePtr::GetInstance()->CreateFormattingState();
|
||||||
mStateMachine->StatePlus(mStateTree[SystemState::TOP_STATE].get(), nullptr);
|
mStateMachine->StatePlus(mStateTree[SystemState::TOP_STATE].get(), nullptr);
|
||||||
mStateMachine->StatePlus(mStateTree[SystemState::MISSION_STATE].get(), mStateTree[SystemState::TOP_STATE].get());
|
mStateMachine->StatePlus(mStateTree[SystemState::MISSION_STATE].get(), mStateTree[SystemState::TOP_STATE].get());
|
||||||
|
mStateMachine->StatePlus(mStateTree[SystemState::FORMATTING_STATE].get(), mStateTree[SystemState::TOP_STATE].get());
|
||||||
mStateMachine->StatePlus(mStateTree[SystemState::STORAGE_HANDLE_STATE].get(),
|
mStateMachine->StatePlus(mStateTree[SystemState::STORAGE_HANDLE_STATE].get(),
|
||||||
mStateTree[SystemState::MISSION_STATE].get());
|
mStateTree[SystemState::MISSION_STATE].get());
|
||||||
mStateMachine->StatePlus(mStateTree[SystemState::SD_CARD_HANDLE_STATE].get(),
|
mStateMachine->StatePlus(mStateTree[SystemState::SD_CARD_HANDLE_STATE].get(),
|
||||||
|
@ -121,13 +123,6 @@ void MissionStateMachine::RunStateMachine(const IpcMission &mission)
|
||||||
mStateMachine->StatePlus(mStateTree[SystemState::IDLE_STATE].get(), mStateTree[SystemState::MISSION_STATE].get());
|
mStateMachine->StatePlus(mStateTree[SystemState::IDLE_STATE].get(), mStateTree[SystemState::MISSION_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::make_shared<VMissionData>(static_cast<MissionEvent>(InternalStateEvent::STORAGE_HANDLE_STATE_INIT));
|
|
||||||
// SendStateMessage(message);
|
|
||||||
InitAllState();
|
InitAllState();
|
||||||
}
|
}
|
||||||
void MissionStateMachine::InitAllState(void)
|
void MissionStateMachine::InitAllState(void)
|
||||||
|
|
|
@ -33,6 +33,7 @@ enum class SystemState
|
||||||
UPGRADE_STATE,
|
UPGRADE_STATE,
|
||||||
MEDIA_HANDLE_STATE,
|
MEDIA_HANDLE_STATE,
|
||||||
IDLE_STATE,
|
IDLE_STATE,
|
||||||
|
FORMATTING_STATE,
|
||||||
END
|
END
|
||||||
};
|
};
|
||||||
class MissionStateMachine
|
class MissionStateMachine
|
||||||
|
|
|
@ -112,11 +112,20 @@ bool SdCardHandleState::ResetKeyMediaTaskHandle(VStateMachineData *msg)
|
||||||
LogWarning("Sd card is not inserted, ignore reset key media task.\n");
|
LogWarning("Sd card is not inserted, ignore reset key media task.\n");
|
||||||
return HANDLE_HELPESS;
|
return HANDLE_HELPESS;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @brief Why do we need to switch status and go through the formatting process here?
|
||||||
|
* This is because the guarantee business requires that the SD card be formatted safely under the condition that the SD
|
||||||
|
* card is not occupied.
|
||||||
|
* @param msg
|
||||||
|
* @return true
|
||||||
|
* @return false
|
||||||
|
*/
|
||||||
bool SdCardHandleState::FormatKeyFormattingSDCardHandle(VStateMachineData *msg)
|
bool SdCardHandleState::FormatKeyFormattingSDCardHandle(VStateMachineData *msg)
|
||||||
{
|
{
|
||||||
if (StorageEvent::SD_CARD_INSERT == mSdCardStatus) {
|
if (StorageEvent::SD_CARD_INSERT == mSdCardStatus) {
|
||||||
LogInfo("FormatKeyFormattingSDCardHandle.\n");
|
LogInfo("FormatKeyFormattingSDCardHandle.\n");
|
||||||
IStorageManager::GetInstance()->FormatSDCardNow();
|
MissionStateMachine::GetInstance()->DelayMessage(msg);
|
||||||
|
MissionStateMachine::GetInstance()->SwitchState(SystemState::FORMATTING_STATE);
|
||||||
return EXECUTED;
|
return EXECUTED;
|
||||||
}
|
}
|
||||||
LogWarning("Sd card is not inserted, ignore format key.\n");
|
LogWarning("Sd card is not inserted, ignore format key.\n");
|
||||||
|
|
|
@ -47,6 +47,7 @@ void TestMissionState::GoInState()
|
||||||
}
|
}
|
||||||
void TestMissionState::GoOutState()
|
void TestMissionState::GoOutState()
|
||||||
{
|
{
|
||||||
|
IAppManager::GetInstance()->UnInit();
|
||||||
MissionState::GoOutState();
|
MissionState::GoOutState();
|
||||||
LogInfo(" ========== TestMissionState::GoOutState.\n");
|
LogInfo(" ========== TestMissionState::GoOutState.\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,7 @@ GOAHEAD:
|
||||||
std::shared_ptr<IAppProtocolHandle> protocolHandle = std::make_shared<IAppProtocolHandle>();
|
std::shared_ptr<IAppProtocolHandle> protocolHandle = std::make_shared<IAppProtocolHandle>();
|
||||||
IAppProtocolHandle::GetInstance(&protocolHandle);
|
IAppProtocolHandle::GetInstance(&protocolHandle);
|
||||||
mAppMonitor.reset();
|
mAppMonitor.reset();
|
||||||
|
LogInfo("AppManager uninit success.\n");
|
||||||
return CreateStatusCode(STATUS_CODE_OK);
|
return CreateStatusCode(STATUS_CODE_OK);
|
||||||
}
|
}
|
||||||
const StatusCode AppManager::SetAppMonitor(std::shared_ptr<VAppMonitor> &monitor)
|
const StatusCode AppManager::SetAppMonitor(std::shared_ptr<VAppMonitor> &monitor)
|
||||||
|
@ -198,6 +199,7 @@ void AppManager::TcpServerStop(void)
|
||||||
{
|
{
|
||||||
if (nullptr != mTcpServer) {
|
if (nullptr != mTcpServer) {
|
||||||
FreeTcpServer(mTcpServer);
|
FreeTcpServer(mTcpServer);
|
||||||
|
mTcpServer = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void AppManager::WifiApModeInit(const AppParam ¶m)
|
void AppManager::WifiApModeInit(const AppParam ¶m)
|
||||||
|
|
|
@ -249,4 +249,20 @@ TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_AUTO_AppPlayback)
|
||||||
MockAppPlayback();
|
MockAppPlayback();
|
||||||
MainThread::GetInstance()->Runing();
|
MainThread::GetInstance()->Runing();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @brief Construct a new test f object
|
||||||
|
* ../output_files/test/bin/HuntingCameraTest
|
||||||
|
* --gtest_filter=HuntingCameraTest.HS_INTEGRATION_HunttingCamera_EXAMPLE_ReInitAppManager
|
||||||
|
*/
|
||||||
|
TEST_F(HuntingCameraTest, HS_INTEGRATION_HunttingCamera_EXAMPLE_ReInitAppManager)
|
||||||
|
{
|
||||||
|
SetAllCamerasResult(mAllCamerasMock);
|
||||||
|
MockOtherSideIpcMissionReply(IpcMission::TEST);
|
||||||
|
MainThread::GetInstance()->Init();
|
||||||
|
TestManager::ResetTimeOut(1000 * 20);
|
||||||
|
HalTestTool::MockKeyClick("format", 1000 * 18); // Simulate pressing a button.
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 17));
|
||||||
|
MockGetSdCardInfo();
|
||||||
|
MainThread::GetInstance()->Runing();
|
||||||
|
}
|
||||||
} // namespace AppMonitor_Mock_Test
|
} // namespace AppMonitor_Mock_Test
|
|
@ -76,7 +76,7 @@ TEST_F(HuntingCameraTest, HS_INTEGRATION_HunttingCamera_EXAMPLE_FormatSDCard)
|
||||||
MockOtherSideIpcMissionReply(IpcMission::TEST);
|
MockOtherSideIpcMissionReply(IpcMission::TEST);
|
||||||
MainThread::GetInstance()->Init();
|
MainThread::GetInstance()->Init();
|
||||||
TestManager::ResetTimeOut(1000 * 17);
|
TestManager::ResetTimeOut(1000 * 17);
|
||||||
HalTestTool::MockKeyClick("format", 1000 * 16); // Simulate pressing a button.
|
HalTestTool::MockKeyClick("format", 1000 * 18); // Simulate pressing a button.
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
MainThread::GetInstance()->Runing();
|
MainThread::GetInstance()->Runing();
|
||||||
}
|
}
|
||||||
|
|
|
@ -322,8 +322,9 @@ void AppManagerTestTool::AppManagerMockInit(std::shared_ptr<IAppManager> &vMock)
|
||||||
AppManagerTestTool::AppMonitorInit(mAppMonitorMock);
|
AppManagerTestTool::AppMonitorInit(mAppMonitorMock);
|
||||||
};
|
};
|
||||||
EXPECT_CALL(*mock.get(), SetAppMonitorTrace(_))
|
EXPECT_CALL(*mock.get(), SetAppMonitorTrace(_))
|
||||||
.Times(Between(0, 1))
|
.Times(AtLeast(1))
|
||||||
.WillOnce(DoAll(WithArgs<0>(Invoke(getAppMonitor)), Return(CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION))));
|
.WillRepeatedly(
|
||||||
|
DoAll(WithArgs<0>(Invoke(getAppMonitor)), Return(CreateStatusCode(STATUS_CODE_VIRTUAL_FUNCTION))));
|
||||||
}
|
}
|
||||||
std::shared_ptr<VAppMonitor> AppManagerTestTool::MakeMonitorMock(void)
|
std::shared_ptr<VAppMonitor> AppManagerTestTool::MakeMonitorMock(void)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user