mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-15 09:31:45 +00:00
Use TransitionTo in Plugins
This commit is contained in:
committed by
Dennis Klein
parent
857ef0c9d3
commit
8bb6a9518a
@@ -90,6 +90,23 @@ const unordered_map<State, PluginServices::DeviceState, tools::HashEnum<State>>
|
||||
{State::ResettingDevice, DeviceState::ResettingDevice},
|
||||
{State::Exiting, DeviceState::Exiting}
|
||||
};
|
||||
const unordered_map<PluginServices::DeviceState, State> PluginServices::fkStateMap = {
|
||||
{DeviceState::Ok, State::Ok},
|
||||
{DeviceState::Error, State::Error},
|
||||
{DeviceState::Idle, State::Idle},
|
||||
{DeviceState::InitializingDevice, State::InitializingDevice},
|
||||
{DeviceState::Initialized, State::Initialized},
|
||||
{DeviceState::Binding, State::Binding},
|
||||
{DeviceState::Bound, State::Bound},
|
||||
{DeviceState::Connecting, State::Connecting},
|
||||
{DeviceState::DeviceReady, State::DeviceReady},
|
||||
{DeviceState::InitializingTask, State::InitializingTask},
|
||||
{DeviceState::Ready, State::Ready},
|
||||
{DeviceState::Running, State::Running},
|
||||
{DeviceState::ResettingTask, State::ResettingTask},
|
||||
{DeviceState::ResettingDevice, State::ResettingDevice},
|
||||
{DeviceState::Exiting, State::Exiting}
|
||||
};
|
||||
const unordered_map<PluginServices::DeviceStateTransition, Transition, tools::HashEnum<PluginServices::DeviceStateTransition>> PluginServices::fkDeviceStateTransitionMap = {
|
||||
{DeviceStateTransition::Auto, Transition::Auto},
|
||||
{DeviceStateTransition::InitDevice, Transition::InitDevice},
|
||||
@@ -125,6 +142,22 @@ auto PluginServices::ChangeDeviceState(const string& controller, const DeviceSta
|
||||
return result;
|
||||
}
|
||||
|
||||
void PluginServices::TransitionDeviceStateTo(const std::string& controller, DeviceState state)
|
||||
{
|
||||
lock_guard<mutex> lock{fDeviceControllerMutex};
|
||||
|
||||
if (!fDeviceController) fDeviceController = controller;
|
||||
|
||||
if (fDeviceController == controller) {
|
||||
fDevice.TransitionTo(fkStateMap.at(state));
|
||||
} else {
|
||||
throw DeviceControlError{tools::ToString(
|
||||
"Plugin '", controller, "' is not allowed to change device states. ",
|
||||
"Currently, plugin '", *fDeviceController, "' has taken control."
|
||||
)};
|
||||
}
|
||||
}
|
||||
|
||||
auto PluginServices::TakeDeviceControl(const string& controller) -> void
|
||||
{
|
||||
lock_guard<mutex> lock{fDeviceControllerMutex};
|
||||
|
Reference in New Issue
Block a user