Files
BloomPatched/src/Services/TargetControllerService.hpp

226 lines
6.9 KiB
C++
Raw Normal View History

#pragma once
#include <cstdint>
2022-05-01 19:02:04 +01:00
#include <chrono>
#include <optional>
#include "src/TargetController/CommandManager.hpp"
#include "src/TargetController/TargetControllerState.hpp"
2021-05-30 16:52:32 +01:00
#include "src/Targets/TargetState.hpp"
#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"
namespace Bloom::Services
{
/**
* The TargetControllerService provides an interface to the TargetController.
*/
class TargetControllerService
{
public:
TargetControllerService() = default;
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
*/
2022-12-26 22:25:35 +00:00
TargetController::TargetControllerState getTargetControllerState() const;
2021-05-30 16:52:32 +01:00
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.
*/
2022-12-26 22:25:35 +00:00
bool isTargetControllerInService() const noexcept;
2021-05-30 16:52:32 +01:00
/**
* Resumes the TargetController if it's suspended. Otherwise, this function does nothing.
*/
2022-12-26 22:25:35 +00:00
void resumeTargetController() const;
/**
* Suspends the TargetController if it's active. Otherwise, this function does nothing.
*/
2022-12-26 22:25:35 +00:00
void suspendTargetController() const;
/**
* Requests the TargetDescriptor from the TargetController
*
* @return
*/
2022-12-26 22:25:35 +00:00
const Targets::TargetDescriptor& getTargetDescriptor() const;
/**
* Fetches the current target state.
*
* @return
*/
2022-12-26 22:25:35 +00:00
Targets::TargetState getTargetState() const;
/**
* Requests the TargetController to halt execution on the target.
*/
2022-12-26 22:25:35 +00:00
void stopTargetExecution() const;
/**
* Requests the TargetController to continue execution on the target.
*
* @param fromAddress
*/
void continueTargetExecution(
std::optional<Targets::TargetMemoryAddress> fromAddress,
std::optional<Targets::TargetMemoryAddress> toAddress
) const;
/**
* Requests the TargetController to step execution on the target.
*
* @param fromAddress
*/
2023-04-01 12:40:12 +01:00
void stepTargetExecution(std::optional<Targets::TargetMemoryAddress> fromAddress) const;
/**
* Requests the TargetController to read register values from the target.
*
* @param descriptors
* Descriptors of the registers to read.
*
* @return
*/
2022-12-26 22:25:35 +00:00
Targets::TargetRegisters readRegisters(const Targets::TargetRegisterDescriptors& descriptors) const;
/**
* Requests the TargetController to write register values to the target.
*
* @param registers
*/
2022-12-26 22:25:35 +00:00
void writeRegisters(const Targets::TargetRegisters& registers) const;
/**
* Requests the TargetController to read memory from the target.
*
* @param memoryType
* @param startAddress
* @param bytes
* @param excludedAddressRanges
* @return
*/
Targets::TargetMemoryBuffer readMemory(
Targets::TargetMemoryType memoryType,
Targets::TargetMemoryAddress startAddress,
Targets::TargetMemorySize bytes,
const std::set<Targets::TargetMemoryAddressRange>& excludedAddressRanges = {}
2022-12-26 22:25:35 +00:00
) const;
/**
* Requests the TargetController to write memory to the target.
*
* @param memoryType
* @param startAddress
* @param buffer
*/
void writeMemory(
Targets::TargetMemoryType memoryType,
Targets::TargetMemoryAddress startAddress,
const Targets::TargetMemoryBuffer& buffer
2022-12-26 22:25:35 +00:00
) const;
2022-12-11 23:25:15 +00:00
/**
* Requests the TargetController to erase the given target memory type.
*
* @param memoryType
*/
2022-12-26 22:25:35 +00:00
void eraseMemory(Targets::TargetMemoryType memoryType) const;
2022-12-11 23:25:15 +00:00
/**
* Requests the TargetController to set a breakpoint on the target.
*
* @param breakpoint
*/
2022-12-26 22:25:35 +00:00
void setBreakpoint(Targets::TargetBreakpoint breakpoint) const;
/**
* Requests the TargetController to remove a breakpoint from the target.
*
* @param breakpoint
*/
2022-12-26 22:25:35 +00:00
void removeBreakpoint(Targets::TargetBreakpoint breakpoint) const;
2022-05-01 18:44:04 +01:00
/**
* Retrieves the current program counter value from the target.
*
* @return
*/
2022-12-26 22:25:35 +00:00
Targets::TargetProgramCounter getProgramCounter() const;
2022-05-01 18:44:04 +01:00
/**
* Sets the target's program counter to the given address.
*
* @param address
*/
2022-12-26 22:25:35 +00:00
void setProgramCounter(Targets::TargetProgramCounter address) const;
/**
* Retrieves the pin states for a particular target variant.
*
* @param variantId
*/
2022-12-26 22:25:35 +00:00
Targets::TargetPinStateMapping getPinStates(int variantId) const;
/**
* Updates the pin state on the target, for a specific pin.
*
* @param pinDescriptor
* @param pinState
*/
2022-12-26 22:25:35 +00:00
void setPinState(Targets::TargetPinDescriptor pinDescriptor, Targets::TargetPinState pinState) const;
/**
* Retrieves the current stack pointer value from the target.
*
* @return
*/
2022-12-26 22:25:35 +00:00
Targets::TargetStackPointer getStackPointer() const;
/**
* Triggers a reset on the target. The target will be held in a stopped state.
*/
2022-12-26 22:25:35 +00:00
void resetTarget() const;
2022-06-05 16:13:43 +01:00
/**
* Enables programming mode on the target.
*
* From the point of invoking this function, the TargetController will reject any subsequent commands for
* debug operations (such as ResumeTargetExecution, ReadTargetRegisters, etc), until programming mode has
* been disabled.
*/
2022-12-26 22:25:35 +00:00
void enableProgrammingMode() const;
2022-06-05 16:13:43 +01:00
/**
* Disables programming mode on the target.
*/
2022-12-26 22:25:35 +00:00
void disableProgrammingMode() const;
2022-06-05 16:13:43 +01:00
private:
TargetController::CommandManager commandManager = TargetController::CommandManager();
std::chrono::milliseconds defaultTimeout = std::chrono::milliseconds(60000);
};
}