From cc553d2295bb94d17022c3584349c0ce56aaad7b Mon Sep 17 00:00:00 2001 From: Nav Date: Thu, 11 Nov 2021 19:05:24 +0000 Subject: [PATCH] New TC event for retrieving current stack pointer value --- src/EventManager/Events/Event.hpp | 2 ++ src/EventManager/Events/Events.hpp | 2 ++ .../Events/RetrieveStackPointerFromTarget.hpp | 26 +++++++++++++++++++ .../StackPointerRetrievedFromTarget.hpp | 24 +++++++++++++++++ src/TargetController/TargetController.cpp | 25 ++++++++++++++++++ src/TargetController/TargetController.hpp | 8 ++++++ 6 files changed, 87 insertions(+) create mode 100644 src/EventManager/Events/RetrieveStackPointerFromTarget.hpp create mode 100644 src/EventManager/Events/StackPointerRetrievedFromTarget.hpp diff --git a/src/EventManager/Events/Event.hpp b/src/EventManager/Events/Event.hpp index 5024fc7b..30cd392f 100644 --- a/src/EventManager/Events/Event.hpp +++ b/src/EventManager/Events/Event.hpp @@ -51,6 +51,8 @@ namespace Bloom::Events RETRIEVE_TARGET_PIN_STATES, TARGET_PIN_STATES_RETRIEVED, SET_TARGET_PIN_STATE, + RETRIEVE_STACK_POINTER_FROM_TARGET, + STACK_POINTER_RETRIEVED_FROM_TARGET, }; class Event diff --git a/src/EventManager/Events/Events.hpp b/src/EventManager/Events/Events.hpp index 0e236a42..7dc5d6da 100644 --- a/src/EventManager/Events/Events.hpp +++ b/src/EventManager/Events/Events.hpp @@ -39,6 +39,8 @@ #include "RetrieveTargetPinStates.hpp" #include "TargetPinStatesRetrieved.hpp" #include "SetTargetPinState.hpp" +#include "RetrieveStackPointerFromTarget.hpp" +#include "StackPointerRetrievedFromTarget.hpp" namespace Bloom::Events { diff --git a/src/EventManager/Events/RetrieveStackPointerFromTarget.hpp b/src/EventManager/Events/RetrieveStackPointerFromTarget.hpp new file mode 100644 index 00000000..52e2b97f --- /dev/null +++ b/src/EventManager/Events/RetrieveStackPointerFromTarget.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include "Event.hpp" +#include "StackPointerRetrievedFromTarget.hpp" + +namespace Bloom::Events +{ + class RetrieveStackPointerFromTarget: public Event + { + public: + using TargetControllerResponseType = StackPointerRetrievedFromTarget; + + static inline EventType type = EventType::RETRIEVE_STACK_POINTER_FROM_TARGET; + static inline const std::string name = "RetrieveStackPointerFromTarget"; + + [[nodiscard]] EventType getType() const override { + return RetrieveStackPointerFromTarget::type; + } + + [[nodiscard]] std::string getName() const override { + return RetrieveStackPointerFromTarget::name; + } + }; +} diff --git a/src/EventManager/Events/StackPointerRetrievedFromTarget.hpp b/src/EventManager/Events/StackPointerRetrievedFromTarget.hpp new file mode 100644 index 00000000..e518a867 --- /dev/null +++ b/src/EventManager/Events/StackPointerRetrievedFromTarget.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include "Event.hpp" + +namespace Bloom::Events +{ + class StackPointerRetrievedFromTarget: public Event + { + public: + static inline EventType type = EventType::STACK_POINTER_RETRIEVED_FROM_TARGET; + static inline const std::string name = "StackPointerRetrievedFromTarget"; + std::uint32_t stackPointer = 0; + + [[nodiscard]] EventType getType() const override { + return StackPointerRetrievedFromTarget::type; + } + + [[nodiscard]] std::string getName() const override { + return StackPointerRetrievedFromTarget::name; + } + }; +} diff --git a/src/TargetController/TargetController.cpp b/src/TargetController/TargetController.cpp index ba71c084..554cf701 100644 --- a/src/TargetController/TargetController.cpp +++ b/src/TargetController/TargetController.cpp @@ -174,6 +174,7 @@ void TargetController::suspend() { this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); this->eventListener->deregisterCallbacksForEventType(); + this->eventListener->deregisterCallbacksForEventType(); this->lastTargetState = TargetState::UNKNOWN; this->cachedTargetDescriptor = std::nullopt; @@ -252,6 +253,10 @@ void TargetController::resume() { std::bind(&TargetController::onSetPinStateEvent, this, std::placeholders::_1) ); + this->eventListener->registerCallbackForEventType( + std::bind(&TargetController::onRetrieveStackPointerEvent, this, std::placeholders::_1) + ); + this->state = TargetControllerState::ACTIVE; this->eventManager.triggerEvent( std::make_shared(this->state) @@ -769,3 +774,23 @@ void TargetController::onSetPinStateEvent(const Events::SetTargetPinState& event this->emitErrorEvent(event.id, exception.getMessage()); } } + +void TargetController::onRetrieveStackPointerEvent(const Events::RetrieveStackPointerFromTarget& event) { + try { + if (this->target->getState() != TargetState::STOPPED) { + throw TargetOperationFailure( + "Invalid target state - target must be stopped before stack pointer can be retrieved" + ); + } + + auto stackPointerRetrieved = std::make_shared(); + stackPointerRetrieved->correlationId = event.id; + stackPointerRetrieved->stackPointer = this->target->getStackPointer(); + + this->eventManager.triggerEvent(stackPointerRetrieved); + + } catch (const TargetOperationFailure& exception) { + Logger::error("Failed to retrieve stack pointer value from target - " + exception.getMessage()); + this->emitErrorEvent(event.id, exception.getMessage()); + } +} diff --git a/src/TargetController/TargetController.hpp b/src/TargetController/TargetController.hpp index 1b416787..df2f2df0 100644 --- a/src/TargetController/TargetController.hpp +++ b/src/TargetController/TargetController.hpp @@ -401,5 +401,13 @@ namespace Bloom * @param event */ void onSetPinStateEvent(const Events::SetTargetPinState& event); + + /** + * Will retrieve the current stack pointer from the target. Will emit a StackPointerRetrievedFromTarget event + * containing the retrieved stack pointer value. + * + * @param event + */ + void onRetrieveStackPointerEvent(const Events::RetrieveStackPointerFromTarget& event); }; }