From 1696d2dcbeb5d5c74d863081fcec1356c9675f37 Mon Sep 17 00:00:00 2001 From: Nav Date: Fri, 8 Apr 2022 22:14:01 +0100 Subject: [PATCH] Implemented ResetTaret handler in TargetController --- src/EventManager/Events/Event.hpp | 1 + src/EventManager/Events/Events.hpp | 1 + src/EventManager/Events/ResetTarget.hpp | 3 +++ src/EventManager/Events/TargetReset.hpp | 23 +++++++++++++++++ src/TargetController/TargetController.cpp | 25 ++++++++++++++++++- src/TargetController/TargetController.hpp | 9 +++++++ .../TargetControllerConsole.cpp | 4 +++ .../TargetControllerConsole.hpp | 5 ++++ 8 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/EventManager/Events/TargetReset.hpp diff --git a/src/EventManager/Events/Event.hpp b/src/EventManager/Events/Event.hpp index 0b9e2d41..cca1553a 100644 --- a/src/EventManager/Events/Event.hpp +++ b/src/EventManager/Events/Event.hpp @@ -53,6 +53,7 @@ namespace Bloom::Events SET_TARGET_PIN_STATE, RETRIEVE_STACK_POINTER_FROM_TARGET, STACK_POINTER_RETRIEVED_FROM_TARGET, + TARGET_RESET, }; class Event diff --git a/src/EventManager/Events/Events.hpp b/src/EventManager/Events/Events.hpp index 7dc5d6da..50014ad9 100644 --- a/src/EventManager/Events/Events.hpp +++ b/src/EventManager/Events/Events.hpp @@ -41,6 +41,7 @@ #include "SetTargetPinState.hpp" #include "RetrieveStackPointerFromTarget.hpp" #include "StackPointerRetrievedFromTarget.hpp" +#include "TargetReset.hpp" namespace Bloom::Events { diff --git a/src/EventManager/Events/ResetTarget.hpp b/src/EventManager/Events/ResetTarget.hpp index 38f9b197..5057fe6d 100644 --- a/src/EventManager/Events/ResetTarget.hpp +++ b/src/EventManager/Events/ResetTarget.hpp @@ -3,12 +3,15 @@ #include #include "Event.hpp" +#include "TargetReset.hpp" namespace Bloom::Events { class ResetTarget: public Event { public: + using TargetControllerResponseType = TargetReset; + static constexpr EventType type = EventType::RESET_TARGET; static inline const std::string name = "ResetTargetEvent"; diff --git a/src/EventManager/Events/TargetReset.hpp b/src/EventManager/Events/TargetReset.hpp new file mode 100644 index 00000000..c27ee9ec --- /dev/null +++ b/src/EventManager/Events/TargetReset.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include + +#include "Event.hpp" + +namespace Bloom::Events +{ + class TargetReset: public Event + { + public: + static constexpr EventType type = EventType::TARGET_RESET; + static inline const std::string name = "TargetReset"; + + [[nodiscard]] EventType getType() const override { + return TargetReset::type; + } + + [[nodiscard]] std::string getName() const override { + return TargetReset::name; + } + }; +} diff --git a/src/TargetController/TargetController.cpp b/src/TargetController/TargetController.cpp index c967021a..9b65d16f 100644 --- a/src/TargetController/TargetController.cpp +++ b/src/TargetController/TargetController.cpp @@ -257,6 +257,10 @@ namespace Bloom std::bind(&TargetController::onRetrieveStackPointerEvent, this, std::placeholders::_1) ); + this->eventListener->registerCallbackForEventType( + std::bind(&TargetController::onResetTarget, this, std::placeholders::_1) + ); + this->state = TargetControllerState::ACTIVE; EventManager::triggerEvent( std::make_shared(this->state) @@ -446,6 +450,15 @@ namespace Bloom } } + void TargetController::resetTarget(const std::optional& resetEventCorrelationId) { + this->target->reset(); + + auto targetResetEvent = std::make_shared(); + targetResetEvent->correlationId = resetEventCorrelationId; + + EventManager::triggerEvent(targetResetEvent); + } + void TargetController::emitErrorEvent(int correlationId, const std::string& errorMessage) { auto errorEvent = std::make_shared(); errorEvent->correlationId = correlationId; @@ -487,7 +500,7 @@ namespace Bloom this->fireTargetEvents(); } - this->target->reset(); + this->resetTarget(); if (this->target->getState() != TargetState::STOPPED) { this->target->stop(); @@ -800,4 +813,14 @@ namespace Bloom this->emitErrorEvent(event.id, exception.getMessage()); } } + + void TargetController::onResetTarget(const Events::ResetTarget& event) { + try { + this->resetTarget(event.id); + + } catch (const TargetOperationFailure& exception) { + Logger::error("Failed to reset target - " + exception.getMessage()); + this->emitErrorEvent(event.id, exception.getMessage()); + } + } } diff --git a/src/TargetController/TargetController.hpp b/src/TargetController/TargetController.hpp index 85b0444f..41b64726 100644 --- a/src/TargetController/TargetController.hpp +++ b/src/TargetController/TargetController.hpp @@ -276,6 +276,13 @@ namespace Bloom */ void fireTargetEvents(); + /** + * Triggers a target reset and emits a TargetReset event. + * + * @param resetEventCorrelationId + */ + void resetTarget(const std::optional& resetEventCorrelationId = std::nullopt); + /** * When the TargetController fails to handle an event, a TargetControllerErrorOccurred event is emitted, with * a correlation ID matching the ID of the event that triggered the handler. @@ -425,5 +432,7 @@ namespace Bloom * @param event */ void onRetrieveStackPointerEvent(const Events::RetrieveStackPointerFromTarget& event); + + void onResetTarget(const Events::ResetTarget& event); }; } diff --git a/src/TargetController/TargetControllerConsole.cpp b/src/TargetController/TargetControllerConsole.cpp index a65f7f5f..0f9e0571 100644 --- a/src/TargetController/TargetControllerConsole.cpp +++ b/src/TargetController/TargetControllerConsole.cpp @@ -140,4 +140,8 @@ namespace Bloom std::make_shared() )->stackPointer; } + + void TargetControllerConsole::resetTarget() { + this->triggerTargetControllerEventAndWaitForResponse(std::make_shared()); + } } diff --git a/src/TargetController/TargetControllerConsole.hpp b/src/TargetController/TargetControllerConsole.hpp index 2c2f8b40..ee3e8bfe 100644 --- a/src/TargetController/TargetControllerConsole.hpp +++ b/src/TargetController/TargetControllerConsole.hpp @@ -165,6 +165,11 @@ namespace Bloom */ std::uint32_t getStackPointer(); + /** + * Triggers a reset on the target. The target will be held in a stopped state. + */ + void resetTarget(); + private: EventListener& eventListener;