diff --git a/src/EventManager/Events/Event.hpp b/src/EventManager/Events/Event.hpp index 83027a0d..e2b10cad 100644 --- a/src/EventManager/Events/Event.hpp +++ b/src/EventManager/Events/Event.hpp @@ -32,7 +32,6 @@ namespace Bloom::Events EXTRACT_TARGET_DESCRIPTOR, TARGET_DESCRIPTOR_EXTRACTED, INSIGHT_THREAD_STATE_CHANGED, - RETRIEVE_TARGET_PIN_STATES, TARGET_PIN_STATES_RETRIEVED, SET_TARGET_PIN_STATE, RETRIEVE_STACK_POINTER_FROM_TARGET, diff --git a/src/EventManager/Events/Events.hpp b/src/EventManager/Events/Events.hpp index 2af4d421..128d02af 100644 --- a/src/EventManager/Events/Events.hpp +++ b/src/EventManager/Events/Events.hpp @@ -19,7 +19,6 @@ #include "ExtractTargetDescriptor.hpp" #include "TargetDescriptorExtracted.hpp" #include "InsightThreadStateChanged.hpp" -#include "RetrieveTargetPinStates.hpp" #include "TargetPinStatesRetrieved.hpp" #include "SetTargetPinState.hpp" #include "RetrieveStackPointerFromTarget.hpp" diff --git a/src/EventManager/Events/RetrieveTargetPinStates.hpp b/src/EventManager/Events/RetrieveTargetPinStates.hpp deleted file mode 100644 index 7d920195..00000000 --- a/src/EventManager/Events/RetrieveTargetPinStates.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include - -#include "Event.hpp" -#include "TargetPinStatesRetrieved.hpp" - -namespace Bloom::Events -{ - class RetrieveTargetPinStates: public Event - { - public: - using TargetControllerResponseType = TargetPinStatesRetrieved; - - static constexpr EventType type = EventType::RETRIEVE_TARGET_PIN_STATES; - static inline const std::string name = "RetrieveTargetPinStates"; - int variantId = 0; - - [[nodiscard]] EventType getType() const override { - return RetrieveTargetPinStates::type; - } - - [[nodiscard]] std::string getName() const override { - return RetrieveTargetPinStates::name; - } - }; -} diff --git a/src/TargetController/Commands/CommandTypes.hpp b/src/TargetController/Commands/CommandTypes.hpp index 96fbba1c..61b9f2c2 100644 --- a/src/TargetController/Commands/CommandTypes.hpp +++ b/src/TargetController/Commands/CommandTypes.hpp @@ -20,5 +20,6 @@ namespace Bloom::TargetController::Commands SET_BREAKPOINT, REMOVE_BREAKPOINT, SET_PROGRAM_COUNTER, + GET_TARGET_PIN_STATES, }; } diff --git a/src/TargetController/Commands/GetTargetPinStates.hpp b/src/TargetController/Commands/GetTargetPinStates.hpp new file mode 100644 index 00000000..78d45b86 --- /dev/null +++ b/src/TargetController/Commands/GetTargetPinStates.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include "Command.hpp" + +#include "src/TargetController/Responses/TargetPinStates.hpp" + +namespace Bloom::TargetController::Commands +{ + class GetTargetPinStates: public Command + { + public: + using SuccessResponseType = Responses::TargetPinStates; + + static constexpr CommandType type = CommandType::GET_TARGET_PIN_STATES; + static inline const std::string name = "GetTargetPinStates"; + + int variantId = 0; + + explicit GetTargetPinStates(int variantId) + : variantId(variantId) + {}; + + [[nodiscard]] CommandType getType() const override { + return GetTargetPinStates::type; + } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } + }; +} diff --git a/src/TargetController/Responses/ResponseTypes.hpp b/src/TargetController/Responses/ResponseTypes.hpp index d755b111..e16dd263 100644 --- a/src/TargetController/Responses/ResponseTypes.hpp +++ b/src/TargetController/Responses/ResponseTypes.hpp @@ -11,5 +11,6 @@ namespace Bloom::TargetController::Responses TARGET_REGISTERS_READ, TARGET_MEMORY_READ, TARGET_STATE, + TARGET_PIN_STATES, }; } diff --git a/src/TargetController/Responses/TargetPinStates.hpp b/src/TargetController/Responses/TargetPinStates.hpp new file mode 100644 index 00000000..76301663 --- /dev/null +++ b/src/TargetController/Responses/TargetPinStates.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include "Response.hpp" + +#include "src/Targets/TargetPinDescriptor.hpp" + +namespace Bloom::TargetController::Responses +{ + class TargetPinStates: public Response + { + public: + static constexpr ResponseType type = ResponseType::TARGET_PIN_STATES; + + Targets::TargetPinStateMappingType pinStatesByNumber; + + explicit TargetPinStates(const Targets::TargetPinStateMappingType& pinStatesByNumber) + : pinStatesByNumber(pinStatesByNumber) + {} + + [[nodiscard]] ResponseType getType() const override { + return TargetPinStates::type; + } + }; +} diff --git a/src/TargetController/TargetControllerComponent.cpp b/src/TargetController/TargetControllerComponent.cpp index 572a15cc..e1fc96a5 100644 --- a/src/TargetController/TargetControllerComponent.cpp +++ b/src/TargetController/TargetControllerComponent.cpp @@ -34,10 +34,12 @@ namespace Bloom::TargetController using Commands::SetBreakpoint; using Commands::RemoveBreakpoint; using Commands::SetProgramCounter; + using Commands::GetTargetPinStates; using Responses::Response; using Responses::TargetRegistersRead; using Responses::TargetMemoryRead; + using Responses::TargetPinStates; TargetControllerComponent::TargetControllerComponent( const ProjectConfig& projectConfig, @@ -399,11 +401,11 @@ namespace Bloom::TargetController this->deregisterCommandHandler(SetBreakpoint::type); this->deregisterCommandHandler(RemoveBreakpoint::type); this->deregisterCommandHandler(SetProgramCounter::type); + this->deregisterCommandHandler(GetTargetPinStates::type); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); - this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); @@ -470,6 +472,10 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::handleSetProgramCounter, this, std::placeholders::_1) ); + this->registerCommandHandler( + std::bind(&TargetControllerComponent::handleGetTargetPinStates, this, std::placeholders::_1) + ); + this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onDebugSessionFinishedEvent, this, std::placeholders::_1) ); @@ -478,10 +484,6 @@ namespace Bloom::TargetController std::bind(&TargetControllerComponent::onExtractTargetDescriptor, this, std::placeholders::_1) ); - this->eventListener->registerCallbackForEventType( - std::bind(&TargetControllerComponent::onRetrieveTargetPinStatesEvent, this, std::placeholders::_1) - ); - this->eventListener->registerCallbackForEventType( std::bind(&TargetControllerComponent::onSetPinStateEvent, this, std::placeholders::_1) ); @@ -877,25 +879,8 @@ namespace Bloom::TargetController return std::make_unique(); } - void TargetControllerComponent::onRetrieveTargetPinStatesEvent(const Events::RetrieveTargetPinStates& event) { - try { - if (this->target->getState() != TargetState::STOPPED) { - throw TargetOperationFailure( - "Invalid target state - target must be stopped before pin states can be retrieved" - ); - } - - auto pinStatesRetrieved = std::make_shared(); - pinStatesRetrieved->correlationId = event.id; - pinStatesRetrieved->variantId = event.variantId; - pinStatesRetrieved->pinSatesByNumber = this->target->getPinStates(event.variantId); - - EventManager::triggerEvent(pinStatesRetrieved); - - } catch (const TargetOperationFailure& exception) { - Logger::error("Failed to retrieve target pin states - " + exception.getMessage()); - this->emitErrorEvent(event.id, exception.getMessage()); - } + std::unique_ptr TargetControllerComponent::handleGetTargetPinStates(GetTargetPinStates& command) { + return std::make_unique(this->target->getPinStates(command.variantId)); } void TargetControllerComponent::onSetPinStateEvent(const Events::SetTargetPinState& event) { diff --git a/src/TargetController/TargetControllerComponent.hpp b/src/TargetController/TargetControllerComponent.hpp index a17b1671..dfa8b25f 100644 --- a/src/TargetController/TargetControllerComponent.hpp +++ b/src/TargetController/TargetControllerComponent.hpp @@ -30,12 +30,14 @@ #include "Commands/SetBreakpoint.hpp" #include "Commands/RemoveBreakpoint.hpp" #include "Commands/SetProgramCounter.hpp" +#include "Commands/GetTargetPinStates.hpp" // Responses #include "Responses/Response.hpp" #include "Responses/TargetState.hpp" #include "Responses/TargetRegistersRead.hpp" #include "Responses/TargetMemoryRead.hpp" +#include "Responses/TargetPinStates.hpp" #include "TargetControllerState.hpp" @@ -312,13 +314,7 @@ namespace Bloom::TargetController std::unique_ptr handleSetBreakpoint(Commands::SetBreakpoint& command); std::unique_ptr handleRemoveBreakpoint(Commands::RemoveBreakpoint& command); std::unique_ptr handleSetProgramCounter(Commands::SetProgramCounter& command); - - /** - * Will attempt to obtain the pin states from the target. Will emit a TargetPinStatesRetrieved event on success. - * - * @param event - */ - void onRetrieveTargetPinStatesEvent(const Events::RetrieveTargetPinStates& event); + std::unique_ptr handleGetTargetPinStates(Commands::GetTargetPinStates& command); /** * Will update a pin state for a particular pin. Will emit a TargetPinStatesRetrieved with the new pin diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index 0f31bf23..eb2ec3ad 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -17,6 +17,7 @@ #include "Commands/SetBreakpoint.hpp" #include "Commands/RemoveBreakpoint.hpp" #include "Commands/SetProgramCounter.hpp" +#include "Commands/GetTargetPinStates.hpp" #include "src/Logger/Logger.hpp" @@ -38,6 +39,7 @@ namespace Bloom::TargetController using Commands::SetBreakpoint; using Commands::RemoveBreakpoint; using Commands::SetProgramCounter; + using Commands::GetTargetPinStates; TargetControllerConsole::TargetControllerConsole(EventListener& eventListener) : eventListener(eventListener) @@ -166,10 +168,10 @@ namespace Bloom::TargetController } Targets::TargetPinStateMappingType TargetControllerConsole::getPinStates(int variantId) { - auto requestEvent = std::make_shared(); - requestEvent->variantId = variantId; - - return this->triggerTargetControllerEventAndWaitForResponse(requestEvent)->pinSatesByNumber; + return this->commandManager.sendCommandAndWaitForResponse( + std::make_unique(variantId), + this->defaultTimeout + )->pinStatesByNumber; } void TargetControllerConsole::setPinState(TargetPinDescriptor pinDescriptor, TargetPinState pinState) {