#include "TargetControllerConsole.hpp" #include "src/EventManager/Events/Events.hpp" #include "src/Logger/Logger.hpp" namespace Bloom { using namespace Bloom::Targets; using namespace Bloom::Events; using namespace Bloom::Exceptions; TargetControllerConsole::TargetControllerConsole(EventListener& eventListener) :eventListener(eventListener) {} TargetControllerState TargetControllerConsole::getTargetControllerState() { return this->triggerTargetControllerEventAndWaitForResponse( std::make_shared() )->state; } bool TargetControllerConsole::isTargetControllerInService() noexcept { try { return this->getTargetControllerState() == TargetControllerState::ACTIVE; } catch (...) { return false; } } Targets::TargetDescriptor TargetControllerConsole::getTargetDescriptor() { return this->triggerTargetControllerEventAndWaitForResponse( std::make_shared() )->targetDescriptor; } void TargetControllerConsole::stopTargetExecution() { this->triggerTargetControllerEventAndWaitForResponse(std::make_shared()); } void TargetControllerConsole::continueTargetExecution(std::optional fromAddress) { auto resumeExecutionEvent = std::make_shared(); if (fromAddress.has_value()) { resumeExecutionEvent->fromProgramCounter = fromAddress.value(); } this->triggerTargetControllerEventAndWaitForResponse(resumeExecutionEvent); } void TargetControllerConsole::stepTargetExecution(std::optional fromAddress) { auto stepExecutionEvent = std::make_shared(); if (fromAddress.has_value()) { stepExecutionEvent->fromProgramCounter = fromAddress.value(); } this->triggerTargetControllerEventAndWaitForResponse(stepExecutionEvent); } TargetRegisters TargetControllerConsole::readRegisters(const TargetRegisterDescriptors& descriptors) { auto readRegistersEvent = std::make_shared(); readRegistersEvent->descriptors = descriptors; return this->triggerTargetControllerEventAndWaitForResponse(readRegistersEvent)->registers; } void TargetControllerConsole::writeRegisters(const TargetRegisters& registers) { auto event = std::make_shared(); event->registers = std::move(registers); this->triggerTargetControllerEventAndWaitForResponse(event); } TargetMemoryBuffer TargetControllerConsole::readMemory( TargetMemoryType memoryType, std::uint32_t startAddress, std::uint32_t bytes, const std::set& excludedAddressRanges ) { auto readMemoryEvent = std::make_shared(); readMemoryEvent->memoryType = memoryType; readMemoryEvent->startAddress = startAddress; readMemoryEvent->bytes = bytes; readMemoryEvent->excludedAddressRanges = excludedAddressRanges; return this->triggerTargetControllerEventAndWaitForResponse(readMemoryEvent)->data; } void TargetControllerConsole::writeMemory( TargetMemoryType memoryType, std::uint32_t startAddress, const TargetMemoryBuffer& buffer ) { auto writeMemoryEvent = std::make_shared(); writeMemoryEvent->memoryType = memoryType; writeMemoryEvent->startAddress = startAddress; writeMemoryEvent->buffer = buffer; this->triggerTargetControllerEventAndWaitForResponse(writeMemoryEvent); } void TargetControllerConsole::setBreakpoint(TargetBreakpoint breakpoint) { auto event = std::make_shared(); event->breakpoint = breakpoint; this->triggerTargetControllerEventAndWaitForResponse(event); } void TargetControllerConsole::removeBreakpoint(TargetBreakpoint breakpoint) { auto event = std::make_shared(); event->breakpoint = breakpoint; this->triggerTargetControllerEventAndWaitForResponse(event); } void TargetControllerConsole::requestPinStates(int variantId) { auto requestEvent = std::make_shared(); requestEvent->variantId = variantId; EventManager::triggerEvent(requestEvent); } Targets::TargetPinStateMappingType TargetControllerConsole::getPinStates(int variantId) { auto requestEvent = std::make_shared(); requestEvent->variantId = variantId; return this->triggerTargetControllerEventAndWaitForResponse(requestEvent)->pinSatesByNumber; } void TargetControllerConsole::setPinState(TargetPinDescriptor pinDescriptor, TargetPinState pinState) { auto updateEvent = std::make_shared(); updateEvent->pinDescriptor = std::move(pinDescriptor); updateEvent->pinState = pinState; this->triggerTargetControllerEventAndWaitForResponse(updateEvent); } std::uint32_t TargetControllerConsole::getStackPointer() { return this->triggerTargetControllerEventAndWaitForResponse( std::make_shared() )->stackPointer; } void TargetControllerConsole::resetTarget() { this->triggerTargetControllerEventAndWaitForResponse(std::make_shared()); } }