hunting/application/MissionManager/src/MissionStateMachine.cpp
2024-03-26 18:46:17 +08:00

86 lines
3.2 KiB
C++

/*
* 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 "MissionStateMachine.h"
#include "ILog.h"
#include "McuAskBase.h"
#include "MissionManagerMakePtr.h"
#include "TopState.h"
std::shared_ptr<MissionStateMachine> &MissionStateMachine::GetInstance(std::shared_ptr<MissionStateMachine> *impl)
{
static auto instance = std::make_shared<MissionStateMachine>();
if (impl) {
instance = *impl;
}
return instance;
}
MissionStateMachine::MissionStateMachine()
{
//
mStartMission = IpcMission::END;
}
void MissionStateMachine::Init(void)
{
mStateMachine = std::make_shared<VStateMachineHandle>();
auto code = IStateMachine::GetInstance()->CreateStateMachine(mStateMachine);
if (!IsCodeOK(code)) {
LogError("Create state machine failed[%s].\n", code.mPrintStringCode(code));
return;
}
if (!mStateMachine->InitialStateMachine()) {
LogError("State machine init failed.\n");
return;
}
mStartMission = GetStartMission();
if (mStartMission == IpcMission::END) {
LogError("ipcmission error, will start test mode.\n");
mStartMission = IpcMission::TEST;
}
RunStateMachine(mStartMission);
}
void MissionStateMachine::UnInit(void)
{
mStateMachine->StopHandlerThread();
mStateTree.clear();
}
void MissionStateMachine::SwitchState(const MissionState &state)
{
mStateMachine->SwitchState(mStateTree[state].get());
}
IpcMission MissionStateMachine::GetStartMission(void)
{
class McuAskIpcMission : public McuAsk<IpcMission>, public McuAskBase
{
public:
McuAskIpcMission() : McuAskBase(McuAskBlock::BLOCK, McuAskReply::NEED_REPLY)
{
mDataReply = IpcMission::END;
}
virtual ~McuAskIpcMission() = default;
};
std::shared_ptr<VMcuAsk> ask = std::make_shared<McuAskIpcMission>();
IMcuManager::GetInstance()->GetIpcMission(ask);
return std::dynamic_pointer_cast<McuAskIpcMission>(ask)->mDataReply;
}
void MissionStateMachine::RunStateMachine(const IpcMission &mission)
{
LogInfo("Make all states and start the state machine.\n");
mStateTree[MissionState::TOP_STATE] = MissionManagerMakePtr::GetInstance()->CreateTopState();
mStateTree[MissionState::MISSION_STATE] = MissionManagerMakePtr::GetInstance()->CreateMissionState(mission);
mStateMachine->StatePlus(mStateTree[MissionState::TOP_STATE].get(), nullptr);
mStateMachine->StatePlus(mStateTree[MissionState::MISSION_STATE].get(), mStateTree[MissionState::TOP_STATE].get());
mStateMachine->SetCurrentState(mStateTree[MissionState::TOP_STATE].get());
mStateMachine->StartStateMachine();
}