Support for TargetController commands that do not require the TargetController to be in an active state
This commit is contained in:
@@ -36,6 +36,10 @@ namespace Bloom::TargetController::Commands
|
|||||||
return Command::type;
|
return Command::type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] virtual bool requiresActiveState() const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] virtual bool requiresStoppedTargetState() const {
|
[[nodiscard]] virtual bool requiresStoppedTargetState() const {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,6 +170,84 @@ namespace Bloom::TargetController
|
|||||||
// Install Bloom's udev rules if not already installed
|
// Install Bloom's udev rules if not already installed
|
||||||
TargetControllerComponent::checkUdevRules();
|
TargetControllerComponent::checkUdevRules();
|
||||||
|
|
||||||
|
// Register command handlers
|
||||||
|
|
||||||
|
this->registerCommandHandler<GetTargetDescriptor>(
|
||||||
|
std::bind(&TargetControllerComponent::handleGetTargetDescriptor, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<GetTargetState>(
|
||||||
|
std::bind(&TargetControllerComponent::handleGetTargetState, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<StopTargetExecution>(
|
||||||
|
std::bind(&TargetControllerComponent::handleStopTargetExecution, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<ResumeTargetExecution>(
|
||||||
|
std::bind(&TargetControllerComponent::handleResumeTargetExecution, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<ResetTarget>(
|
||||||
|
std::bind(&TargetControllerComponent::handleResetTarget, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<ReadTargetRegisters>(
|
||||||
|
std::bind(&TargetControllerComponent::handleReadTargetRegisters, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<WriteTargetRegisters>(
|
||||||
|
std::bind(&TargetControllerComponent::handleWriteTargetRegisters, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<ReadTargetMemory>(
|
||||||
|
std::bind(&TargetControllerComponent::handleReadTargetMemory, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<WriteTargetMemory>(
|
||||||
|
std::bind(&TargetControllerComponent::handleWriteTargetMemory, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<StepTargetExecution>(
|
||||||
|
std::bind(&TargetControllerComponent::handleStepTargetExecution, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<SetBreakpoint>(
|
||||||
|
std::bind(&TargetControllerComponent::handleSetBreakpoint, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<RemoveBreakpoint>(
|
||||||
|
std::bind(&TargetControllerComponent::handleRemoveBreakpoint, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<SetTargetProgramCounter>(
|
||||||
|
std::bind(&TargetControllerComponent::handleSetProgramCounter, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<GetTargetPinStates>(
|
||||||
|
std::bind(&TargetControllerComponent::handleGetTargetPinStates, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<SetTargetPinState>(
|
||||||
|
std::bind(&TargetControllerComponent::handleSetTargetPinState, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<GetTargetStackPointer>(
|
||||||
|
std::bind(&TargetControllerComponent::handleGetTargetStackPointer, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<GetTargetProgramCounter>(
|
||||||
|
std::bind(&TargetControllerComponent::handleGetTargetProgramCounter, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<EnableProgrammingMode>(
|
||||||
|
std::bind(&TargetControllerComponent::handleEnableProgrammingMode, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
|
this->registerCommandHandler<DisableProgrammingMode>(
|
||||||
|
std::bind(&TargetControllerComponent::handleDisableProgrammingMode, this, std::placeholders::_1)
|
||||||
|
);
|
||||||
|
|
||||||
// Register event handlers
|
// Register event handlers
|
||||||
this->eventListener->registerCallbackForEventType<Events::ShutdownTargetController>(
|
this->eventListener->registerCallbackForEventType<Events::ShutdownTargetController>(
|
||||||
std::bind(&TargetControllerComponent::onShutdownTargetControllerEvent, this, std::placeholders::_1)
|
std::bind(&TargetControllerComponent::onShutdownTargetControllerEvent, this, std::placeholders::_1)
|
||||||
@@ -309,15 +387,21 @@ namespace Bloom::TargetController
|
|||||||
throw Exception("No handler registered for this command.");
|
throw Exception("No handler registered for this command.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->state != TargetControllerState::ACTIVE && command->requiresActiveState()) {
|
||||||
|
throw Exception("Command rejected - TargetController not in active state.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->state == TargetControllerState::ACTIVE) {
|
||||||
if (command->requiresStoppedTargetState() && this->lastTargetState != TargetState::STOPPED) {
|
if (command->requiresStoppedTargetState() && this->lastTargetState != TargetState::STOPPED) {
|
||||||
throw Exception("Illegal target state - command requires target to be stopped");
|
throw Exception("Command rejected - command requires target execution to be stopped.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->target->programmingModeEnabled() && command->requiresDebugMode()) {
|
if (this->target->programmingModeEnabled() && command->requiresDebugMode()) {
|
||||||
throw Exception(
|
throw Exception(
|
||||||
"Illegal target state - command cannot be serviced whilst the target is in programming mode."
|
"Command rejected - command cannot be serviced whilst the target is in programming mode."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this->registerCommandResponse(
|
this->registerCommandResponse(
|
||||||
commandId,
|
commandId,
|
||||||
@@ -411,26 +495,6 @@ namespace Bloom::TargetController
|
|||||||
+ std::string(exception.what()));
|
+ std::string(exception.what()));
|
||||||
}
|
}
|
||||||
|
|
||||||
this->deregisterCommandHandler(GetTargetDescriptor::type);
|
|
||||||
this->deregisterCommandHandler(GetTargetState::type);
|
|
||||||
this->deregisterCommandHandler(StopTargetExecution::type);
|
|
||||||
this->deregisterCommandHandler(ResumeTargetExecution::type);
|
|
||||||
this->deregisterCommandHandler(ResetTarget::type);
|
|
||||||
this->deregisterCommandHandler(ReadTargetRegisters::type);
|
|
||||||
this->deregisterCommandHandler(WriteTargetRegisters::type);
|
|
||||||
this->deregisterCommandHandler(ReadTargetMemory::type);
|
|
||||||
this->deregisterCommandHandler(WriteTargetMemory::type);
|
|
||||||
this->deregisterCommandHandler(StepTargetExecution::type);
|
|
||||||
this->deregisterCommandHandler(SetBreakpoint::type);
|
|
||||||
this->deregisterCommandHandler(RemoveBreakpoint::type);
|
|
||||||
this->deregisterCommandHandler(SetTargetProgramCounter::type);
|
|
||||||
this->deregisterCommandHandler(GetTargetPinStates::type);
|
|
||||||
this->deregisterCommandHandler(SetTargetPinState::type);
|
|
||||||
this->deregisterCommandHandler(GetTargetStackPointer::type);
|
|
||||||
this->deregisterCommandHandler(GetTargetProgramCounter::type);
|
|
||||||
this->deregisterCommandHandler(EnableProgrammingMode::type);
|
|
||||||
this->deregisterCommandHandler(DisableProgrammingMode::type);
|
|
||||||
|
|
||||||
this->eventListener->deregisterCallbacksForEventType<Events::DebugSessionFinished>();
|
this->eventListener->deregisterCallbacksForEventType<Events::DebugSessionFinished>();
|
||||||
|
|
||||||
this->lastTargetState = TargetState::UNKNOWN;
|
this->lastTargetState = TargetState::UNKNOWN;
|
||||||
@@ -448,82 +512,6 @@ namespace Bloom::TargetController
|
|||||||
this->acquireHardware();
|
this->acquireHardware();
|
||||||
this->loadRegisterDescriptors();
|
this->loadRegisterDescriptors();
|
||||||
|
|
||||||
this->registerCommandHandler<GetTargetDescriptor>(
|
|
||||||
std::bind(&TargetControllerComponent::handleGetTargetDescriptor, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<GetTargetState>(
|
|
||||||
std::bind(&TargetControllerComponent::handleGetTargetState, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<StopTargetExecution>(
|
|
||||||
std::bind(&TargetControllerComponent::handleStopTargetExecution, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<ResumeTargetExecution>(
|
|
||||||
std::bind(&TargetControllerComponent::handleResumeTargetExecution, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<ResetTarget>(
|
|
||||||
std::bind(&TargetControllerComponent::handleResetTarget, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<ReadTargetRegisters>(
|
|
||||||
std::bind(&TargetControllerComponent::handleReadTargetRegisters, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<WriteTargetRegisters>(
|
|
||||||
std::bind(&TargetControllerComponent::handleWriteTargetRegisters, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<ReadTargetMemory>(
|
|
||||||
std::bind(&TargetControllerComponent::handleReadTargetMemory, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<WriteTargetMemory>(
|
|
||||||
std::bind(&TargetControllerComponent::handleWriteTargetMemory, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<StepTargetExecution>(
|
|
||||||
std::bind(&TargetControllerComponent::handleStepTargetExecution, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<SetBreakpoint>(
|
|
||||||
std::bind(&TargetControllerComponent::handleSetBreakpoint, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<RemoveBreakpoint>(
|
|
||||||
std::bind(&TargetControllerComponent::handleRemoveBreakpoint, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<SetTargetProgramCounter>(
|
|
||||||
std::bind(&TargetControllerComponent::handleSetProgramCounter, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<GetTargetPinStates>(
|
|
||||||
std::bind(&TargetControllerComponent::handleGetTargetPinStates, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<SetTargetPinState>(
|
|
||||||
std::bind(&TargetControllerComponent::handleSetTargetPinState, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<GetTargetStackPointer>(
|
|
||||||
std::bind(&TargetControllerComponent::handleGetTargetStackPointer, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<GetTargetProgramCounter>(
|
|
||||||
std::bind(&TargetControllerComponent::handleGetTargetProgramCounter, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<EnableProgrammingMode>(
|
|
||||||
std::bind(&TargetControllerComponent::handleEnableProgrammingMode, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->registerCommandHandler<DisableProgrammingMode>(
|
|
||||||
std::bind(&TargetControllerComponent::handleDisableProgrammingMode, this, std::placeholders::_1)
|
|
||||||
);
|
|
||||||
|
|
||||||
this->eventListener->registerCallbackForEventType<Events::DebugSessionFinished>(
|
this->eventListener->registerCallbackForEventType<Events::DebugSessionFinished>(
|
||||||
std::bind(&TargetControllerComponent::onDebugSessionFinishedEvent, this, std::placeholders::_1)
|
std::bind(&TargetControllerComponent::onDebugSessionFinishedEvent, this, std::placeholders::_1)
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user