25 #include "DeviceStore.hpp"
29 #include <unordered_map>
31 #include <ccut/ryml_internals.hpp>
32 #include <ccut/utils.hpp>
33 #include <logger/Logger.hpp>
35 #include "Exception.hpp"
38 namespace yml = ccut::yml;
40 static const std::string s_loggerCat{
"smc:devicestore"};
47 std::size_t newDeviceCount = 0;
49 const std::lock_guard<std::mutex> lock(m_devicesMutex);
50 for (DeviceBase::Shared device :
51 platform->generateDevices(platform->getSupportedDevices()))
53 logger::notice(s_loggerCat) <<
"new device: " << device->uid();
54 m_devices[device->uid()] = device;
58 return newDeviceCount;
63 const std::lock_guard<std::mutex> lock(m_devicesMutex);
64 return m_devices.size();
68 const std::string &address)
const
72 const std::lock_guard<std::mutex> lock{m_devicesMutex};
73 decltype(m_alias)::const_iterator it = m_alias.find(address);
74 return (it != m_alias.end()) ? m_devices.at(it->second) :
75 m_devices.at(address);
77 catch (
const std::out_of_range &e)
79 throw Exception(ErrorCode::InvalidArguments,
80 "no such device: " + address);
86 const std::lock_guard<std::mutex> lock(m_devicesMutex);
87 return ccut::keys(m_devices);
92 std::set<DeviceId> result;
93 const std::lock_guard<std::mutex> lock(m_devicesMutex);
94 for (
const decltype(m_devices)::value_type &it : m_devices)
96 if (type == it.second->type())
97 result.insert(it.first);
104 const std::lock_guard<std::mutex> lock(m_devicesMutex);
105 return ccut::keys(m_alias);
110 const std::lock_guard<std::mutex> lock(m_devicesMutex);
111 decltype(m_alias)::const_iterator it = m_alias.find(alias);
112 if (it == m_alias.end())
113 throw Exception(ErrorCode::InvalidArguments,
"no such alias");
118 const DeviceId &deviceId,
121 const std::lock_guard<std::mutex> lock(m_devicesMutex);
122 if (
override || (m_alias.count(alias) == 0))
124 m_alias[alias] = deviceId;
132 const std::lock_guard<std::mutex> lock(m_devicesMutex);
133 m_alias.erase(alias);
137 const ccut::yml::Parser *)
141 if (!aliasNode.valid() || !aliasNode.is_map())
142 throw Exception(ErrorCode::InvalidArguments,
143 "alias node must be a map");
145 for (
auto it : aliasNode)
149 it >> yml::default_to(yml::key(key),
"") >>
150 yml::default_to(value,
"");
152 logger::warning(s_loggerCat)
153 <<
"not loading alias " << key <<
" alias: already exist";
156 catch (std::exception &ex)
158 logger::error(s_loggerCat) <<
"failed to parse alias: " << ex.what();
Exception thrown by MotionController in case of issues with command.
DeviceId getAlias(const std::string &alias) const
Get the given alias.
DeviceBase::Shared getDevice(const DeviceId &address) const
Get the Device with specified address.
void removeAlias(const std::string &alias)
remove an alias
bool addAlias(const std::string &alias, const DeviceId &deviceId, bool override=true)
add an alias
size_t probeDevices(const PlatformBase::Shared &platform)
Get devices generated by platform and store them.
std::set< std::string > getAliasList() const
Get current Alias list.
std::set< DeviceId > getDeviceList() const
Get the complete list of existing devices.
size_t getDeviceCount() const
Get the number of devices.
void loadAlias(const ccut::yml::NodeRef &aliasNode, const ccut::yml::Parser *parser=nullptr)
load alias from yml node
DeviceType
List of possible device types supported.
main motion-lib namespace