diff --git a/src/TargetController/Commands/CommandTypes.hpp b/src/TargetController/Commands/CommandTypes.hpp index 69b9f14f..188fde87 100644 --- a/src/TargetController/Commands/CommandTypes.hpp +++ b/src/TargetController/Commands/CommandTypes.hpp @@ -7,6 +7,7 @@ namespace Bloom::TargetController::Commands enum class CommandType: std::uint8_t { GENERIC, + GET_STATE, GET_TARGET_DESCRIPTOR, STOP_TARGET_EXECUTION, RESUME_TARGET_EXECUTION, diff --git a/src/TargetController/Commands/GetState.hpp b/src/TargetController/Commands/GetState.hpp new file mode 100644 index 00000000..d0d73a59 --- /dev/null +++ b/src/TargetController/Commands/GetState.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "Command.hpp" + +#include "src/TargetController/Responses/State.hpp" + +namespace Bloom::TargetController::Commands +{ + class GetState: public Command + { + public: + using SuccessResponseType = Responses::State; + + static constexpr CommandType type = CommandType::GET_STATE; + static inline const std::string name = "GetState"; + + [[nodiscard]] CommandType getType() const override { + return GetState::type; + } + + [[nodiscard]] bool requiresActiveState() const override { + return false; + } + + [[nodiscard]] bool requiresDebugMode() const override { + return false; + } + }; +} diff --git a/src/TargetController/Responses/ResponseTypes.hpp b/src/TargetController/Responses/ResponseTypes.hpp index 7b5d4548..53e93c64 100644 --- a/src/TargetController/Responses/ResponseTypes.hpp +++ b/src/TargetController/Responses/ResponseTypes.hpp @@ -8,6 +8,7 @@ namespace Bloom::TargetController::Responses { GENERIC, ERROR, + STATE, TARGET_DESCRIPTOR, TARGET_REGISTERS_READ, TARGET_MEMORY_READ, diff --git a/src/TargetController/Responses/State.hpp b/src/TargetController/Responses/State.hpp new file mode 100644 index 00000000..f7c0495f --- /dev/null +++ b/src/TargetController/Responses/State.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "Response.hpp" + +#include "src/TargetController/TargetControllerState.hpp" + +namespace Bloom::TargetController::Responses +{ + class State: public Response + { + public: + static constexpr ResponseType type = ResponseType::STATE; + + TargetControllerState state; + + explicit State(TargetControllerState state) + : state(state) + {} + + [[nodiscard]] ResponseType getType() const override { + return State::type; + } + }; +} diff --git a/src/TargetController/TargetControllerComponent.cpp b/src/TargetController/TargetControllerComponent.cpp index 83967f60..857ba73b 100644 --- a/src/TargetController/TargetControllerComponent.cpp +++ b/src/TargetController/TargetControllerComponent.cpp @@ -23,6 +23,7 @@ namespace Bloom::TargetController using Commands::CommandIdType; using Commands::Command; + using Commands::GetState; using Commands::GetTargetDescriptor; using Commands::GetTargetState; using Commands::StopTargetExecution; @@ -109,10 +110,6 @@ namespace Bloom::TargetController this->shutdown(); } - TargetControllerState TargetControllerComponent::getState() { - return TargetControllerComponent::state; - } - void TargetControllerComponent::registerCommand(std::unique_ptr command) { auto commandQueueLock = TargetControllerComponent::commandQueue.acquireLock(); TargetControllerComponent::commandQueue.getValue().push(std::move(command)); @@ -171,6 +168,9 @@ namespace Bloom::TargetController TargetControllerComponent::checkUdevRules(); // Register command handlers + this->registerCommandHandler( + std::bind(&TargetControllerComponent::handleGetState, this, std::placeholders::_1) + ); this->registerCommandHandler( std::bind(&TargetControllerComponent::handleGetTargetDescriptor, this, std::placeholders::_1) @@ -761,6 +761,10 @@ namespace Bloom::TargetController } } + std::unique_ptr TargetControllerComponent::handleGetState(GetState& command) { + return std::make_unique(this->state); + } + std::unique_ptr TargetControllerComponent::handleGetTargetDescriptor( GetTargetDescriptor& command ) { diff --git a/src/TargetController/TargetControllerComponent.hpp b/src/TargetController/TargetControllerComponent.hpp index 616be694..573d81b2 100644 --- a/src/TargetController/TargetControllerComponent.hpp +++ b/src/TargetController/TargetControllerComponent.hpp @@ -20,6 +20,7 @@ // Commands #include "Commands/Command.hpp" +#include "Commands/GetState.hpp" #include "Commands/GetTargetDescriptor.hpp" #include "Commands/GetTargetState.hpp" #include "Commands/StopTargetExecution.hpp" @@ -42,6 +43,7 @@ // Responses #include "Responses/Response.hpp" +#include "Responses/State.hpp" #include "Responses/TargetDescriptor.hpp" #include "Responses/TargetState.hpp" #include "Responses/TargetRegistersRead.hpp" @@ -86,8 +88,6 @@ namespace Bloom::TargetController */ void run(); - static TargetControllerState getState(); - static void registerCommand(std::unique_ptr command); static std::optional> waitForResponse( @@ -111,7 +111,7 @@ namespace Bloom::TargetController * The TC starts off in a suspended state. TargetControllerComponent::resume() is invoked from the startup * routine. */ - static inline std::atomic state = TargetControllerState::SUSPENDED; + TargetControllerState state = TargetControllerState::SUSPENDED; ProjectConfig projectConfig; EnvironmentConfig environmentConfig; @@ -334,6 +334,7 @@ namespace Bloom::TargetController void onDebugSessionFinishedEvent(const Events::DebugSessionFinished& event); // Command handlers + std::unique_ptr handleGetState(Commands::GetState& command); std::unique_ptr handleGetTargetDescriptor(Commands::GetTargetDescriptor& command); std::unique_ptr handleGetTargetState(Commands::GetTargetState& command); std::unique_ptr handleStopTargetExecution(Commands::StopTargetExecution& command); diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index 7fdb7a28..18c8357b 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -1,8 +1,7 @@ #include "TargetControllerConsole.hpp" -#include "TargetControllerComponent.hpp" - // Commands +#include "Commands/GetState.hpp" #include "Commands/GetTargetDescriptor.hpp" #include "Commands/GetTargetState.hpp" #include "Commands/StopTargetExecution.hpp" @@ -25,6 +24,7 @@ namespace Bloom::TargetController { + using Commands::GetState; using Commands::GetTargetDescriptor; using Commands::GetTargetState; using Commands::StopTargetExecution; @@ -62,7 +62,10 @@ namespace Bloom::TargetController using Targets::TargetPinStateMappingType; TargetControllerState TargetControllerConsole::getTargetControllerState() { - return TargetControllerComponent::getState(); + return this->commandManager.sendCommandAndWaitForResponse( + std::make_unique(), + this->defaultTimeout + )->state; } bool TargetControllerConsole::isTargetControllerInService() noexcept {