36 std::string address, [[maybe_unused]] std::map<std::string, std::string> parameters) {
39 std::optional<std::string> cacheFile;
40 auto it = parameters.find(
"cacheFile");
41 if(it != parameters.end()) {
42 cacheFile = it->second;
45 return boost::shared_ptr<DeviceBackend>(
new TangoBackend(std::move(address), cacheFile));
72 _deviceProxy = std::make_shared<Tango::DeviceProxy>(_address);
73 _deviceProxy->set_transparency_reconnection(
false);
78 std::unique_ptr<Tango::AttributeInfoListEx> attributes(_deviceProxy->attribute_list_query_ex());
79 for(
auto& attr : *attributes) {
82 _registerCatalogue = std::move(catalogue);
84 catch(Tango::WrongNameSyntax& ex) {
85 throw ChimeraTK::logic_error(
86 "Invalid Tango device address " + _address +
", " +
static_cast<std::string
>(ex.errors[0].desc));
88 catch(Tango::ConnectionFailed& ex) {
89 std::string message =
"Cannot connect to " + _address +
", " +
static_cast<std::string
>(ex.errors[0].desc);
90 setException(message);
91 throw ChimeraTK::runtime_error(message);
93 catch(CORBA::Exception& ex) {
94 std::string message =
"Cannot connect to " + _address +
"for unknown reason";
95 setException(message);
96 throw ChimeraTK::runtime_error(message);
99 setOpenedAndClearException();
113 const RegisterPath& registerPathName,
size_t numberOfWords,
size_t wordOffsetInRegister, AccessModeFlags flags) {
114 boost::shared_ptr<NDRegisterAccessor<UserType>> p;
116 auto info = _registerCatalogue.getBackendRegister(registerPathName);
118 auto sharedThis = boost::static_pointer_cast<TangoBackend>(shared_from_this());
120 switch(info.attributeInfo.data_format) {
121 case Tango::AttrDataFormat::SPECTRUM:
122 case Tango::AttrDataFormat::SCALAR: {
123 switch(info.attributeInfo.data_type) {
124 case Tango::DEV_BOOLEAN:
126 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
128 case Tango::DEV_SHORT:
130 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
132 case Tango::DEV_LONG:
134 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
136 case Tango::DEV_FLOAT:
138 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
140 case Tango::DEV_DOUBLE:
142 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
144 case Tango::DEV_USHORT:
146 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
148 case Tango::DEV_ULONG:
150 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
152 case Tango::DEV_STRING:
154 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
156 case Tango::DEV_STATE:
158 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
160 case Tango::DEV_UCHAR:
162 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
164 case Tango::DEV_LONG64:
166 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
168 case Tango::DEV_ULONG64:
170 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
175 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
177 case Tango::DEV_ENUM:
179 sharedThis, info, registerPathName, numberOfWords, wordOffsetInRegister, flags));
182 throw ChimeraTK::logic_error(
"Unsupported Tango type " + std::to_string(info.attributeInfo.data_type));
187 case Tango::AttrDataFormat::IMAGE:
189 case Tango::AttrDataFormat::FMT_UNKNOWN:
191 throw ChimeraTK::logic_error(
192 "Broken Tango attribute database information. " + registerPathName +
" does not come with a data format");
195 p->setExceptionBackend(sharedThis);