diff --git a/src/TargetController/Commands/Command.hpp b/src/TargetController/Commands/Command.hpp index d50dc667..b4ced02c 100644 --- a/src/TargetController/Commands/Command.hpp +++ b/src/TargetController/Commands/Command.hpp @@ -36,6 +36,10 @@ namespace Bloom::TargetController::Commands return Command::type; } + [[nodiscard]] virtual bool requiresStoppedTargetState() const { + return false; + } + private: static inline std::atomic lastCommandId = 0; }; diff --git a/src/TargetController/Commands/ReadTargetMemory.hpp b/src/TargetController/Commands/ReadTargetMemory.hpp index 32495010..c6e1134a 100644 --- a/src/TargetController/Commands/ReadTargetMemory.hpp +++ b/src/TargetController/Commands/ReadTargetMemory.hpp @@ -35,5 +35,9 @@ namespace Bloom::TargetController::Commands [[nodiscard]] CommandType getType() const override { return ReadTargetMemory::type; } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } }; } diff --git a/src/TargetController/Commands/ReadTargetRegisters.hpp b/src/TargetController/Commands/ReadTargetRegisters.hpp index caeb238f..52201cdf 100644 --- a/src/TargetController/Commands/ReadTargetRegisters.hpp +++ b/src/TargetController/Commands/ReadTargetRegisters.hpp @@ -24,5 +24,9 @@ namespace Bloom::TargetController::Commands [[nodiscard]] CommandType getType() const override { return ReadTargetRegisters::type; } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } }; } diff --git a/src/TargetController/Commands/ResetTarget.hpp b/src/TargetController/Commands/ResetTarget.hpp index 33336be8..06a64c0b 100644 --- a/src/TargetController/Commands/ResetTarget.hpp +++ b/src/TargetController/Commands/ResetTarget.hpp @@ -13,5 +13,9 @@ namespace Bloom::TargetController::Commands [[nodiscard]] CommandType getType() const override { return ResetTarget::type; } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } }; } diff --git a/src/TargetController/Commands/ResumeTargetExecution.hpp b/src/TargetController/Commands/ResumeTargetExecution.hpp index 5f4a9b21..51d6433d 100644 --- a/src/TargetController/Commands/ResumeTargetExecution.hpp +++ b/src/TargetController/Commands/ResumeTargetExecution.hpp @@ -22,5 +22,9 @@ namespace Bloom::TargetController::Commands [[nodiscard]] CommandType getType() const override { return ResumeTargetExecution::type; } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } }; } diff --git a/src/TargetController/Commands/WriteTargetRegisters.hpp b/src/TargetController/Commands/WriteTargetRegisters.hpp index 626373b1..b34e7143 100644 --- a/src/TargetController/Commands/WriteTargetRegisters.hpp +++ b/src/TargetController/Commands/WriteTargetRegisters.hpp @@ -21,5 +21,9 @@ namespace Bloom::TargetController::Commands [[nodiscard]] CommandType getType() const override { return WriteTargetRegisters::type; } + + [[nodiscard]] bool requiresStoppedTargetState() const override { + return true; + } }; } diff --git a/src/TargetController/TargetControllerComponent.cpp b/src/TargetController/TargetControllerComponent.cpp index 015e9821..08cd9170 100644 --- a/src/TargetController/TargetControllerComponent.cpp +++ b/src/TargetController/TargetControllerComponent.cpp @@ -285,6 +285,10 @@ namespace Bloom::TargetController throw Exception("No handler registered for this command."); } + if (command->requiresStoppedTargetState() && this->lastTargetState != TargetState::STOPPED) { + this->target->stop(); + } + this->registerCommandResponse( commandId, this->commandHandlersByCommandType.at(commandType)(*(command.get()))