2021-04-24 20:23:17 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <optional>
|
|
|
|
|
|
2022-04-17 23:55:34 +01:00
|
|
|
#include "CommandManager.hpp"
|
2021-05-30 16:52:32 +01:00
|
|
|
#include "TargetControllerState.hpp"
|
|
|
|
|
|
2022-04-28 21:02:45 +01:00
|
|
|
#include "src/Targets/TargetState.hpp"
|
2021-04-24 20:23:17 +01:00
|
|
|
#include "src/Targets/TargetRegister.hpp"
|
|
|
|
|
#include "src/Targets/TargetMemory.hpp"
|
|
|
|
|
#include "src/Targets/TargetBreakpoint.hpp"
|
|
|
|
|
#include "src/Targets/TargetVariant.hpp"
|
|
|
|
|
#include "src/Targets/TargetPinDescriptor.hpp"
|
|
|
|
|
|
2022-04-05 22:37:00 +01:00
|
|
|
#include "src/Exceptions/Exception.hpp"
|
|
|
|
|
|
2022-04-09 15:57:24 +01:00
|
|
|
namespace Bloom::TargetController
|
2021-04-24 20:23:17 +01:00
|
|
|
{
|
|
|
|
|
/**
|
2021-10-10 23:18:06 +01:00
|
|
|
* The TargetControllerConsole provides an interface to the TargetController.
|
2021-04-24 20:23:17 +01:00
|
|
|
*/
|
|
|
|
|
class TargetControllerConsole
|
|
|
|
|
{
|
|
|
|
|
public:
|
2022-05-01 18:57:45 +01:00
|
|
|
TargetControllerConsole() = default;
|
2021-04-24 20:23:17 +01:00
|
|
|
|
2021-05-01 13:48:18 +01:00
|
|
|
void setDefaultTimeout(std::chrono::milliseconds timeout) {
|
|
|
|
|
this->defaultTimeout = timeout;
|
|
|
|
|
}
|
|
|
|
|
|
2021-10-10 23:18:06 +01:00
|
|
|
/**
|
|
|
|
|
* Requests the current TargetController state from the TargetController. The TargetController should always
|
|
|
|
|
* respond to such a request, even when it's in a suspended state.
|
|
|
|
|
*
|
|
|
|
|
* To check if the TargetController is in an active state, isTargetControllerInService() can be used for
|
|
|
|
|
* convenience.
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
2021-05-30 16:52:32 +01:00
|
|
|
TargetControllerState getTargetControllerState();
|
|
|
|
|
|
2021-10-10 23:18:06 +01:00
|
|
|
/**
|
|
|
|
|
* Retrieves the TargetController state and checks if it's currently active.
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
* True if the TargetController is currently in an active state, otherwise false.
|
|
|
|
|
*/
|
2021-05-30 16:52:32 +01:00
|
|
|
bool isTargetControllerInService() noexcept;
|
|
|
|
|
|
2021-04-24 20:23:17 +01:00
|
|
|
/**
|
|
|
|
|
* Requests the TargetDescriptor from the TargetController
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
2021-05-24 20:58:49 +01:00
|
|
|
Targets::TargetDescriptor getTargetDescriptor();
|
2021-04-24 20:23:17 +01:00
|
|
|
|
2022-04-28 21:02:45 +01:00
|
|
|
/**
|
|
|
|
|
* Fetches the current target state.
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
Targets::TargetState getTargetState();
|
|
|
|
|
|
2021-04-24 20:23:17 +01:00
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to halt execution on the target.
|
|
|
|
|
*/
|
|
|
|
|
void stopTargetExecution();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to continue execution on the target.
|
|
|
|
|
*
|
|
|
|
|
* @param fromAddress
|
|
|
|
|
*/
|
|
|
|
|
void continueTargetExecution(std::optional<std::uint32_t> fromAddress);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to step execution on the target.
|
|
|
|
|
*
|
|
|
|
|
* @param fromAddress
|
|
|
|
|
*/
|
|
|
|
|
void stepTargetExecution(std::optional<std::uint32_t> fromAddress);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to read register values from the target.
|
|
|
|
|
*
|
|
|
|
|
* @param descriptors
|
|
|
|
|
* Descriptors of the registers to read.
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
2021-08-07 17:07:04 +01:00
|
|
|
Targets::TargetRegisters readRegisters(const Targets::TargetRegisterDescriptors& descriptors);
|
2021-04-24 20:23:17 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to write register values to the target.
|
|
|
|
|
*
|
|
|
|
|
* @param registers
|
|
|
|
|
*/
|
2021-08-07 17:07:04 +01:00
|
|
|
void writeRegisters(const Targets::TargetRegisters& registers);
|
2021-04-24 20:23:17 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to read memory from the target.
|
|
|
|
|
*
|
|
|
|
|
* @param memoryType
|
|
|
|
|
* @param startAddress
|
|
|
|
|
* @param bytes
|
2021-12-25 20:57:03 +00:00
|
|
|
* @param excludedAddressRanges
|
2021-04-24 20:23:17 +01:00
|
|
|
* @return
|
|
|
|
|
*/
|
2021-05-24 20:58:49 +01:00
|
|
|
Targets::TargetMemoryBuffer readMemory(
|
|
|
|
|
Targets::TargetMemoryType memoryType,
|
|
|
|
|
std::uint32_t startAddress,
|
2021-12-25 20:57:03 +00:00
|
|
|
std::uint32_t bytes,
|
|
|
|
|
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges = {}
|
2021-05-24 20:58:49 +01:00
|
|
|
);
|
2021-04-24 20:23:17 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to write memory to the target.
|
|
|
|
|
*
|
|
|
|
|
* @param memoryType
|
|
|
|
|
* @param startAddress
|
|
|
|
|
* @param buffer
|
|
|
|
|
*/
|
2021-05-24 20:58:49 +01:00
|
|
|
void writeMemory(
|
|
|
|
|
Targets::TargetMemoryType memoryType,
|
|
|
|
|
std::uint32_t startAddress,
|
|
|
|
|
const Targets::TargetMemoryBuffer& buffer
|
|
|
|
|
);
|
2021-04-24 20:23:17 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to set a breakpoint on the target.
|
|
|
|
|
*
|
|
|
|
|
* @param breakpoint
|
|
|
|
|
*/
|
2021-05-24 20:58:49 +01:00
|
|
|
void setBreakpoint(Targets::TargetBreakpoint breakpoint);
|
2021-04-24 20:23:17 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Requests the TargetController to remove a breakpoint from the target.
|
|
|
|
|
*
|
|
|
|
|
* @param breakpoint
|
|
|
|
|
*/
|
2021-05-24 20:58:49 +01:00
|
|
|
void removeBreakpoint(Targets::TargetBreakpoint breakpoint);
|
2021-04-24 20:23:17 +01:00
|
|
|
|
2022-05-01 18:44:04 +01:00
|
|
|
/**
|
|
|
|
|
* Retrieves the current program counter value from the target.
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
std::uint32_t getProgramCounter();
|
|
|
|
|
|
2022-04-30 23:10:07 +01:00
|
|
|
/**
|
|
|
|
|
* Sets the target's program counter to the given address.
|
|
|
|
|
*
|
|
|
|
|
* @param address
|
|
|
|
|
*/
|
|
|
|
|
void setProgramCounter(std::uint32_t address);
|
|
|
|
|
|
2021-04-24 20:23:17 +01:00
|
|
|
/**
|
2021-09-02 21:19:46 +01:00
|
|
|
* Retrieves the pin states for a particular target variant.
|
2021-04-24 20:23:17 +01:00
|
|
|
*
|
|
|
|
|
* @param variantId
|
|
|
|
|
*/
|
2021-09-02 21:19:46 +01:00
|
|
|
Targets::TargetPinStateMappingType getPinStates(int variantId);
|
|
|
|
|
|
|
|
|
|
/**
|
2021-09-04 17:58:05 +01:00
|
|
|
* Updates the pin state on the target, for a specific pin.
|
2021-09-02 21:19:46 +01:00
|
|
|
*
|
|
|
|
|
* @param pinDescriptor
|
|
|
|
|
* @param pinState
|
|
|
|
|
*/
|
2021-09-04 17:58:05 +01:00
|
|
|
void setPinState(Targets::TargetPinDescriptor pinDescriptor, Targets::TargetPinState pinState);
|
2021-10-06 21:12:31 +01:00
|
|
|
|
2021-11-11 19:05:59 +00:00
|
|
|
/**
|
|
|
|
|
* Retrieves the current stack pointer value from the target.
|
|
|
|
|
*
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
std::uint32_t getStackPointer();
|
|
|
|
|
|
2022-04-08 22:14:01 +01:00
|
|
|
/**
|
|
|
|
|
* Triggers a reset on the target. The target will be held in a stopped state.
|
|
|
|
|
*/
|
|
|
|
|
void resetTarget();
|
|
|
|
|
|
2021-10-06 21:12:31 +01:00
|
|
|
private:
|
2022-04-17 23:55:34 +01:00
|
|
|
CommandManager commandManager = CommandManager();
|
2021-10-06 21:12:31 +01:00
|
|
|
|
2021-11-27 14:49:43 +00:00
|
|
|
std::chrono::milliseconds defaultTimeout = std::chrono::milliseconds(20000);
|
2021-04-24 20:23:17 +01:00
|
|
|
};
|
|
|
|
|
}
|