From 5a8aa3d6578bce8d9692bcac0a73bc2ab25a7ef4 Mon Sep 17 00:00:00 2001 From: Nav Date: Thu, 28 Apr 2022 21:02:45 +0100 Subject: [PATCH] New GetTargetState TargetController command --- .../Commands/CommandTypes.hpp | 1 + .../Commands/GetTargetState.hpp | 20 ++++++++++++++++ .../Responses/ResponseTypes.hpp | 1 + .../Responses/TargetState.hpp | 24 +++++++++++++++++++ .../TargetControllerComponent.cpp | 14 +++++++---- .../TargetControllerComponent.hpp | 3 +++ .../TargetControllerConsole.cpp | 9 +++++++ .../TargetControllerConsole.hpp | 9 ++++++- 8 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/TargetController/Commands/GetTargetState.hpp create mode 100644 src/TargetController/Responses/TargetState.hpp diff --git a/src/TargetController/Commands/CommandTypes.hpp b/src/TargetController/Commands/CommandTypes.hpp index 04487c68..300d1e35 100644 --- a/src/TargetController/Commands/CommandTypes.hpp +++ b/src/TargetController/Commands/CommandTypes.hpp @@ -14,5 +14,6 @@ namespace Bloom::TargetController::Commands READ_TARGET_REGISTERS, WRITE_TARGET_REGISTERS, READ_TARGET_MEMORY, + GET_TARGET_STATE, }; } diff --git a/src/TargetController/Commands/GetTargetState.hpp b/src/TargetController/Commands/GetTargetState.hpp new file mode 100644 index 00000000..9c4f6108 --- /dev/null +++ b/src/TargetController/Commands/GetTargetState.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include "Command.hpp" +#include "src/TargetController/Responses/TargetState.hpp" + +namespace Bloom::TargetController::Commands +{ + class GetTargetState: public Command + { + public: + using SuccessResponseType = Responses::TargetState; + + static constexpr CommandType type = CommandType::GET_TARGET_STATE; + static inline const std::string name = "GetTargetState"; + + [[nodiscard]] CommandType getType() const override { + return GetTargetState::type; + } + }; +} diff --git a/src/TargetController/Responses/ResponseTypes.hpp b/src/TargetController/Responses/ResponseTypes.hpp index e8abfa39..d755b111 100644 --- a/src/TargetController/Responses/ResponseTypes.hpp +++ b/src/TargetController/Responses/ResponseTypes.hpp @@ -10,5 +10,6 @@ namespace Bloom::TargetController::Responses ERROR, TARGET_REGISTERS_READ, TARGET_MEMORY_READ, + TARGET_STATE, }; } diff --git a/src/TargetController/Responses/TargetState.hpp b/src/TargetController/Responses/TargetState.hpp new file mode 100644 index 00000000..c17f7527 --- /dev/null +++ b/src/TargetController/Responses/TargetState.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "Response.hpp" + +#include "src/Targets/TargetState.hpp" + +namespace Bloom::TargetController::Responses +{ + class TargetState: public Response + { + public: + static constexpr ResponseType type = ResponseType::TARGET_STATE; + + Targets::TargetState targetState; + + TargetState(Targets::TargetState targetState) + : targetState(targetState) + {} + + [[nodiscard]] ResponseType getType() const override { + return TargetState::type; + } + }; +} diff --git a/src/TargetController/TargetControllerComponent.cpp b/src/TargetController/TargetControllerComponent.cpp index 511c1879..6342b0d1 100644 --- a/src/TargetController/TargetControllerComponent.cpp +++ b/src/TargetController/TargetControllerComponent.cpp @@ -22,6 +22,7 @@ namespace Bloom::TargetController using Commands::Command; using Commands::CommandIdType; + using Commands::GetTargetState; using Commands::StopTargetExecution; using Commands::ResumeTargetExecution; using Commands::ResetTarget; @@ -376,6 +377,7 @@ namespace Bloom::TargetController + std::string(exception.what())); } + this->deregisterCommandHandler(GetTargetState::type); this->deregisterCommandHandler(StopTargetExecution::type); this->deregisterCommandHandler(ResumeTargetExecution::type); this->deregisterCommandHandler(ResetTarget::type); @@ -410,6 +412,10 @@ namespace Bloom::TargetController this->acquireHardware(); this->loadRegisterDescriptors(); + this->registerCommandHandler( + std::bind(&TargetControllerComponent::handleGetTargetState, this, std::placeholders::_1) + ); + this->registerCommandHandler( std::bind(&TargetControllerComponent::handleStopTargetExecution, this, std::placeholders::_1) ); @@ -462,10 +468,6 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::onSetProgramCounterEvent, this, std::placeholders::_1) ); - this->eventListener->registerCallbackForEventType( - std::bind(&TargetControllerComponent::onInsightStateChangedEvent, this, std::placeholders::_1) - ); - this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onRetrieveTargetPinStatesEvent, this, std::placeholders::_1) ); @@ -726,6 +728,10 @@ namespace Bloom::TargetController } } + std::unique_ptr TargetControllerComponent::handleGetTargetState(GetTargetState& command) { + return std::make_unique(this->target->getState()); + } + std::unique_ptr TargetControllerComponent::handleStopTargetExecution(StopTargetExecution& command) { if (this->target->getState() != TargetState::STOPPED) { this->target->stop(); diff --git a/src/TargetController/TargetControllerComponent.hpp b/src/TargetController/TargetControllerComponent.hpp index 2836c253..d3f4a7c9 100644 --- a/src/TargetController/TargetControllerComponent.hpp +++ b/src/TargetController/TargetControllerComponent.hpp @@ -18,6 +18,7 @@ // Commands #include "Commands/Command.hpp" +#include "Commands/GetTargetState.hpp" #include "Commands/StopTargetExecution.hpp" #include "Commands/ResumeTargetExecution.hpp" #include "Commands/ResetTarget.hpp" @@ -27,6 +28,7 @@ // Responses #include "Responses/Response.hpp" +#include "Responses/TargetState.hpp" #include "Responses/TargetRegistersRead.hpp" #include "Responses/TargetMemoryRead.hpp" @@ -291,6 +293,7 @@ namespace Bloom::TargetController */ void onDebugSessionFinishedEvent(const Events::DebugSessionFinished& event); + std::unique_ptr handleGetTargetState(Commands::GetTargetState& command); std::unique_ptr handleStopTargetExecution(Commands::StopTargetExecution& command); std::unique_ptr handleResumeTargetExecution(Commands::ResumeTargetExecution& command); std::unique_ptr handleResetTarget(Commands::ResetTarget& command); diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index facab62d..f1a1479e 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -5,6 +5,7 @@ #include "TargetControllerComponent.hpp" // Commands +#include "Commands/GetTargetState.hpp" #include "Commands/StopTargetExecution.hpp" #include "Commands/ResumeTargetExecution.hpp" #include "Commands/ResetTarget.hpp" @@ -20,6 +21,7 @@ namespace Bloom::TargetController using namespace Bloom::Events; using namespace Bloom::Exceptions; + using Commands::GetTargetState; using Commands::StopTargetExecution; using Commands::ResumeTargetExecution; using Commands::ResetTarget; @@ -50,6 +52,13 @@ namespace Bloom::TargetController )->targetDescriptor; } + Targets::TargetState TargetControllerConsole::getTargetState() { + return this->commandManager.sendCommandAndWaitForResponse( + std::make_unique(), + this->defaultTimeout + )->targetState; + } + void TargetControllerConsole::stopTargetExecution() { this->commandManager.sendCommandAndWaitForResponse( std::make_unique(), diff --git a/src/TargetController/TargetControllerConsole.hpp b/src/TargetController/TargetControllerConsole.hpp index eaebf0e4..fccfe5e5 100644 --- a/src/TargetController/TargetControllerConsole.hpp +++ b/src/TargetController/TargetControllerConsole.hpp @@ -9,11 +9,11 @@ #include "src/EventManager/EventListener.hpp" #include "src/EventManager/EventManager.hpp" +#include "src/Targets/TargetState.hpp" #include "src/Targets/TargetRegister.hpp" #include "src/Targets/TargetMemory.hpp" #include "src/Targets/TargetBreakpoint.hpp" #include "src/Targets/TargetVariant.hpp" -#include "src/Targets/TargetState.hpp" #include "src/Targets/TargetPinDescriptor.hpp" #include "src/Exceptions/Exception.hpp" @@ -58,6 +58,13 @@ namespace Bloom::TargetController */ Targets::TargetDescriptor getTargetDescriptor(); + /** + * Fetches the current target state. + * + * @return + */ + Targets::TargetState getTargetState(); + /** * Requests the TargetController to halt execution on the target. */