39 Impl_(const ::std::string& dcf_txt, const ::std::string& dcf_bin, uint8_t
id,
44 if (mutex) mutex->
lock();
48 if (mutex) mutex->
unlock();
52 netid() const noexcept {
53 return dev->getNetid();
60 void Set(uint16_t idx, uint8_t subidx, const ::std::string& value,
61 ::std::error_code& ec);
63 void Set(uint16_t idx, uint8_t subidx, const ::std::vector<uint8_t>& value,
64 ::std::error_code& ec);
66 void Set(uint16_t idx, uint8_t subidx,
67 const ::std::basic_string<char16_t>& value, ::std::error_code& ec);
70 void Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n,
71 ::std::error_code& ec);
73 BasicLockable* mutex{
nullptr};
75 unique_c_ptr<CODev> dev;
80 : impl_(new
Impl_(dcf_txt, dcf_bin, id, mutex)) {}
84 Device::~Device() =
default;
88 ::std::lock_guard<Impl_> lock(*impl_);
90 return impl_->netid();
95 ::std::lock_guard<Impl_> lock(*impl_);
103 OnDnCon(
COCSDO*, uint16_t, uint8_t, uint32_t ac,
void* data) noexcept {
104 *
static_cast<uint32_t*
>(data) = ac;
109 OnUpCon(
COCSDO*, uint16_t, uint8_t, uint32_t ac, T value,
void* data) noexcept {
110 auto* t =
static_cast<decltype(::std::tie(ac, value))*
>(data);
111 *t = ::std::forward_as_tuple(ac, ::std::move(value));
117 typename ::std::enable_if<detail::IsCanopenType<T>::value, T>::type
119 ::std::error_code ec;
120 T value(Read<T>(idx, subidx, ec));
121 if (ec)
throw SdoError(
netid(),
id(), idx, subidx, ec,
"Read");
126 typename ::std::enable_if<detail::IsCanopenType<T>::value, T>::type
127 Device::Read(uint16_t idx, uint8_t subidx, ::std::error_code& ec)
const {
130 auto t = ::std::tie(ac, value);
132 ::std::lock_guard<Impl_> lock(*impl_);
133 if (upReq<T, &OnUpCon<T>>(*impl_->dev, idx, subidx, &t) == -1)
144 typename ::std::enable_if<detail::IsCanopenBasic<T>::value>::type
146 ::std::error_code ec;
147 Write(idx, subidx, value, ec);
148 if (ec)
throw SdoError(
netid(),
id(), idx, subidx, ec,
"Write");
152 typename ::std::enable_if<detail::IsCanopenBasic<T>::value>::type
153 Device::Write(uint16_t idx, uint8_t subidx, T value, ::std::error_code& ec) {
154 constexpr
auto N = co_type_traits_T<T>::index;
157 ::std::lock_guard<Impl_> lock(*impl_);
158 if (dnReq<N>(*impl_->dev, idx, subidx, value, &OnDnCon, &ac) == -1)
168 typename ::std::enable_if<detail::IsCanopenArray<T>::value>::type
169 Device::Write(uint16_t idx, uint8_t subidx,
const T& value) {
170 ::std::error_code ec;
171 Write(idx, subidx, value, ec);
172 if (ec)
throw SdoError(
netid(),
id(), idx, subidx, ec,
"Write");
176 typename ::std::enable_if<detail::IsCanopenArray<T>::value>::type
178 ::std::error_code& ec) {
179 constexpr
auto N = co_type_traits_T<T>::index;
182 ::std::lock_guard<Impl_> lock(*impl_);
183 if (dnReq<N>(*impl_->dev, idx, subidx, value, &OnDnCon, &ac) == -1)
192 #ifndef DOXYGEN_SHOULD_SKIP_THIS 195 template bool Device::Read<bool>(uint16_t, uint8_t)
const;
196 template bool Device::Read<bool>(uint16_t, uint8_t, ::std::error_code&)
const;
197 template void Device::Write<bool>(uint16_t, uint8_t, bool);
198 template void Device::Write<bool>(uint16_t, uint8_t, bool, ::std::error_code&);
201 template int8_t Device::Read<int8_t>(uint16_t, uint8_t)
const;
202 template int8_t Device::Read<int8_t>(uint16_t, uint8_t,
203 ::std::error_code&)
const;
204 template void Device::Write<int8_t>(uint16_t, uint8_t, int8_t);
205 template void Device::Write<int8_t>(uint16_t, uint8_t, int8_t,
209 template int16_t Device::Read<int16_t>(uint16_t, uint8_t)
const;
210 template int16_t Device::Read<int16_t>(uint16_t, uint8_t,
211 ::std::error_code&)
const;
212 template void Device::Write<int16_t>(uint16_t, uint8_t, int16_t);
213 template void Device::Write<int16_t>(uint16_t, uint8_t, int16_t,
217 template int32_t Device::Read<int32_t>(uint16_t, uint8_t)
const;
218 template int32_t Device::Read<int32_t>(uint16_t, uint8_t,
219 ::std::error_code&)
const;
220 template void Device::Write<int32_t>(uint16_t, uint8_t, int32_t);
221 template void Device::Write<int32_t>(uint16_t, uint8_t, int32_t,
225 template uint8_t Device::Read<uint8_t>(uint16_t, uint8_t)
const;
226 template uint8_t Device::Read<uint8_t>(uint16_t, uint8_t,
227 ::std::error_code&)
const;
228 template void Device::Write<uint8_t>(uint16_t, uint8_t, uint8_t);
229 template void Device::Write<uint8_t>(uint16_t, uint8_t, uint8_t,
233 template uint16_t Device::Read<uint16_t>(uint16_t, uint8_t)
const;
234 template uint16_t Device::Read<uint16_t>(uint16_t, uint8_t,
235 ::std::error_code&)
const;
236 template void Device::Write<uint16_t>(uint16_t, uint8_t, uint16_t);
237 template void Device::Write<uint16_t>(uint16_t, uint8_t, uint16_t,
241 template uint32_t Device::Read<uint32_t>(uint16_t, uint8_t)
const;
242 template uint32_t Device::Read<uint32_t>(uint16_t, uint8_t,
243 ::std::error_code&)
const;
244 template void Device::Write<uint32_t>(uint16_t, uint8_t, uint32_t);
245 template void Device::Write<uint32_t>(uint16_t, uint8_t, uint32_t,
249 template float Device::Read<float>(uint16_t, uint8_t)
const;
250 template float Device::Read<float>(uint16_t, uint8_t, ::std::error_code&)
const;
251 template void Device::Write<float>(uint16_t, uint8_t, float);
252 template void Device::Write<float>(uint16_t, uint8_t, float,
256 template ::std::string Device::Read<::std::string>(uint16_t, uint8_t)
const;
257 template ::std::string Device::Read<::std::string>(uint16_t, uint8_t,
258 ::std::error_code&)
const;
259 template void Device::Write<::std::string>(uint16_t, uint8_t,
260 const ::std::string&);
261 template void Device::Write<::std::string>(uint16_t, uint8_t,
262 const ::std::string&,
266 template ::std::vector<uint8_t> Device::Read<::std::vector<uint8_t>>(
267 uint16_t, uint8_t)
const;
268 template ::std::vector<uint8_t> Device::Read<::std::vector<uint8_t>>(
269 uint16_t, uint8_t, ::std::error_code&)
const;
270 template void Device::Write<::std::vector<uint8_t>>(
271 uint16_t, uint8_t, const ::std::vector<uint8_t>&);
272 template void Device::Write<::std::vector<uint8_t>>(
273 uint16_t, uint8_t, const ::std::vector<uint8_t>&, ::std::error_code&);
276 template ::std::basic_string<char16_t>
277 Device::Read<::std::basic_string<char16_t>>(uint16_t, uint8_t)
const;
278 template ::std::basic_string<char16_t>
279 Device::Read<::std::basic_string<char16_t>>(uint16_t, uint8_t,
280 ::std::error_code&)
const;
281 template void Device::Write<::std::basic_string<char16_t>>(
282 uint16_t, uint8_t, const ::std::basic_string<char16_t>&);
283 template void Device::Write<::std::basic_string<char16_t>>(
284 uint16_t, uint8_t, const ::std::basic_string<char16_t>&,
293 template double Device::Read<double>(uint16_t, uint8_t)
const;
294 template double Device::Read<double>(uint16_t, uint8_t,
295 ::std::error_code&)
const;
296 template void Device::Write<double>(uint16_t, uint8_t, double);
297 template void Device::Write<double>(uint16_t, uint8_t, double,
305 template int64_t Device::Read<int64_t>(uint16_t, uint8_t)
const;
306 template int64_t Device::Read<int64_t>(uint16_t, uint8_t,
307 ::std::error_code&)
const;
308 template void Device::Write<int64_t>(uint16_t, uint8_t, int64_t);
309 template void Device::Write<int64_t>(uint16_t, uint8_t, int64_t,
318 template uint64_t Device::Read<uint64_t>(uint16_t, uint8_t)
const;
319 template uint64_t Device::Read<uint64_t>(uint16_t, uint8_t,
320 ::std::error_code&)
const;
321 template void Device::Write<uint64_t>(uint16_t, uint8_t, uint64_t);
322 template void Device::Write<uint64_t>(uint16_t, uint8_t, uint64_t,
325 #endif // DOXYGEN_SHOULD_SKIP_THIS 329 ::std::error_code ec;
330 Write(idx, subidx, value, ec);
331 if (ec)
throw SdoError(
netid(),
id(), idx, subidx, ec,
"Write");
336 ::std::error_code& ec) {
337 Write(idx, subidx, value, ::std::char_traits<char>::length(value), ec);
342 ::std::error_code ec;
343 Write(idx, subidx, value, ec);
344 if (ec)
throw SdoError(
netid(),
id(), idx, subidx, ec,
"Write");
349 ::std::error_code& ec) {
353 ::std::lock_guard<Impl_> lock(*impl_);
355 if (dnReq<N>(*impl_->dev, idx, subidx, value, &OnDnCon, &ac) == -1)
365 Device::Write(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n) {
366 ::std::error_code ec;
367 Write(idx, subidx, p, n, ec);
368 if (ec)
throw SdoError(
netid(),
id(), idx, subidx, ec,
"Write");
373 ::std::error_code& ec) {
376 ::std::lock_guard<Impl_> lock(*impl_);
377 if (dnReq(*impl_->dev, idx, subidx, p, n, &OnDnCon, &ac) == -1)
388 return impl_->dev.get();
391 const ::std::type_info&
393 ::std::error_code ec;
394 auto& ti =
Type(idx, subidx, ec);
395 if (ec)
throw SdoError(impl_->netid(), impl_->id(), idx, subidx, ec,
"Type");
399 const ::std::type_info&
400 Device::Type(uint16_t idx, uint8_t subidx, ::std::error_code& ec)
const {
401 auto obj = impl_->dev->find(idx);
407 auto sub = obj->find(subidx);
414 switch (sub->getType()) {
418 return typeid(int8_t);
420 return typeid(int16_t);
422 return typeid(int32_t);
424 return typeid(uint8_t);
426 return typeid(uint16_t);
428 return typeid(uint32_t);
430 return typeid(float);
432 return typeid(::std::string);
434 return typeid(::std::vector<uint8_t>);
436 return typeid(::std::basic_string<char16_t>);
440 return typeid(::std::vector<uint8_t>);
443 return typeid(double);
448 return typeid(int64_t);
454 return typeid(uint64_t);
461 typename ::std::enable_if<detail::IsCanopenType<T>::value, T>::type
463 ::std::error_code ec;
464 auto value = Get<T>(idx, subidx, ec);
465 if (ec)
throw SdoError(impl_->netid(), impl_->id(), idx, subidx, ec,
"Get");
470 typename ::std::enable_if<detail::IsCanopenType<T>::value, T>::type
471 Device::Get(uint16_t idx, uint8_t subidx, ::std::error_code& ec)
const {
474 auto obj = impl_->dev->find(idx);
480 auto sub = obj->find(subidx);
494 return sub->getVal<N>();
498 typename ::std::enable_if<detail::IsCanopenBasic<T>::value>::type
499 Device::Set(uint16_t idx, uint8_t subidx, T value) {
500 ::std::error_code ec;
501 Set(idx, subidx, value, ec);
502 if (ec)
throw SdoError(impl_->netid(), impl_->id(), idx, subidx, ec,
"Set");
506 typename ::std::enable_if<detail::IsCanopenBasic<T>::value>::type
507 Device::Set(uint16_t idx, uint8_t subidx, T value, ::std::error_code& ec) {
508 constexpr
auto N = co_type_traits_T<T>::index;
510 impl_->Set<N>(idx, subidx, &value,
sizeof(value), ec);
514 typename ::std::enable_if<detail::IsCanopenArray<T>::value>::type
515 Device::Set(uint16_t idx, uint8_t subidx,
const T& value) {
516 ::std::error_code ec;
517 Set(idx, subidx, value, ec);
518 if (ec)
throw SdoError(impl_->netid(), impl_->id(), idx, subidx, ec,
"Set");
522 typename ::std::enable_if<detail::IsCanopenArray<T>::value>::type
523 Device::Set(uint16_t idx, uint8_t subidx,
const T& value,
524 ::std::error_code& ec) {
525 impl_->Set(idx, subidx, value, ec);
528 #ifndef DOXYGEN_SHOULD_SKIP_THIS 531 template bool Device::Get<bool>(uint16_t, uint8_t)
const;
532 template bool Device::Get<bool>(uint16_t, uint8_t, ::std::error_code&)
const;
533 template void Device::Set<bool>(uint16_t, uint8_t, bool);
534 template void Device::Set<bool>(uint16_t, uint8_t, bool, ::std::error_code&);
537 template int8_t Device::Get<int8_t>(uint16_t, uint8_t)
const;
538 template int8_t Device::Get<int8_t>(uint16_t, uint8_t,
539 ::std::error_code&)
const;
540 template void Device::Set<int8_t>(uint16_t, uint8_t, int8_t);
541 template void Device::Set<int8_t>(uint16_t, uint8_t, int8_t,
545 template int16_t Device::Get<int16_t>(uint16_t, uint8_t)
const;
546 template int16_t Device::Get<int16_t>(uint16_t, uint8_t,
547 ::std::error_code&)
const;
548 template void Device::Set<int16_t>(uint16_t, uint8_t, int16_t);
549 template void Device::Set<int16_t>(uint16_t, uint8_t, int16_t,
553 template int32_t Device::Get<int32_t>(uint16_t, uint8_t)
const;
554 template int32_t Device::Get<int32_t>(uint16_t, uint8_t,
555 ::std::error_code&)
const;
556 template void Device::Set<int32_t>(uint16_t, uint8_t, int32_t);
557 template void Device::Set<int32_t>(uint16_t, uint8_t, int32_t,
561 template uint8_t Device::Get<uint8_t>(uint16_t, uint8_t)
const;
562 template uint8_t Device::Get<uint8_t>(uint16_t, uint8_t,
563 ::std::error_code&)
const;
564 template void Device::Set<uint8_t>(uint16_t, uint8_t, uint8_t);
565 template void Device::Set<uint8_t>(uint16_t, uint8_t, uint8_t,
569 template uint16_t Device::Get<uint16_t>(uint16_t, uint8_t)
const;
570 template uint16_t Device::Get<uint16_t>(uint16_t, uint8_t,
571 ::std::error_code&)
const;
572 template void Device::Set<uint16_t>(uint16_t, uint8_t, uint16_t);
573 template void Device::Set<uint16_t>(uint16_t, uint8_t, uint16_t,
577 template uint32_t Device::Get<uint32_t>(uint16_t, uint8_t)
const;
578 template uint32_t Device::Get<uint32_t>(uint16_t, uint8_t,
579 ::std::error_code&)
const;
580 template void Device::Set<uint32_t>(uint16_t, uint8_t, uint32_t);
581 template void Device::Set<uint32_t>(uint16_t, uint8_t, uint32_t,
585 template float Device::Get<float>(uint16_t, uint8_t)
const;
586 template float Device::Get<float>(uint16_t, uint8_t, ::std::error_code&)
const;
587 template void Device::Set<float>(uint16_t, uint8_t, float);
588 template void Device::Set<float>(uint16_t, uint8_t, float, ::std::error_code&);
591 template ::std::string Device::Get<::std::string>(uint16_t, uint8_t)
const;
592 template ::std::string Device::Get<::std::string>(uint16_t, uint8_t,
593 ::std::error_code&)
const;
594 template void Device::Set<::std::string>(uint16_t, uint8_t,
595 const ::std::string&);
596 template void Device::Set<::std::string>(uint16_t, uint8_t,
597 const ::std::string&,
601 template ::std::vector<uint8_t> Device::Get<::std::vector<uint8_t>>(
602 uint16_t, uint8_t)
const;
603 template ::std::vector<uint8_t> Device::Get<::std::vector<uint8_t>>(
604 uint16_t, uint8_t, ::std::error_code&)
const;
605 template void Device::Set<::std::vector<uint8_t>>(
606 uint16_t, uint8_t, const ::std::vector<uint8_t>&);
607 template void Device::Set<::std::vector<uint8_t>>(uint16_t, uint8_t,
608 const ::std::vector<uint8_t>&,
612 template ::std::basic_string<char16_t>
613 Device::Get<::std::basic_string<char16_t>>(uint16_t, uint8_t)
const;
614 template ::std::basic_string<char16_t>
615 Device::Get<::std::basic_string<char16_t>>(uint16_t, uint8_t,
616 ::std::error_code&)
const;
617 template void Device::Set<::std::basic_string<char16_t>>(
618 uint16_t, uint8_t, const ::std::basic_string<char16_t>&);
619 template void Device::Set<::std::basic_string<char16_t>>(
620 uint16_t, uint8_t, const ::std::basic_string<char16_t>&,
629 template double Device::Get<double>(uint16_t, uint8_t)
const;
630 template double Device::Get<double>(uint16_t, uint8_t,
631 ::std::error_code&)
const;
632 template void Device::Set<double>(uint16_t, uint8_t, double);
633 template void Device::Set<double>(uint16_t, uint8_t, double,
641 template int64_t Device::Get<int64_t>(uint16_t, uint8_t)
const;
642 template int64_t Device::Get<int64_t>(uint16_t, uint8_t,
643 ::std::error_code&)
const;
644 template void Device::Set<int64_t>(uint16_t, uint8_t, int64_t);
645 template void Device::Set<int64_t>(uint16_t, uint8_t, int64_t,
654 template uint64_t Device::Get<uint64_t>(uint16_t, uint8_t)
const;
655 template uint64_t Device::Get<uint64_t>(uint16_t, uint8_t,
656 ::std::error_code&)
const;
657 template void Device::Set<uint64_t>(uint16_t, uint8_t, uint64_t);
658 template void Device::Set<uint64_t>(uint16_t, uint8_t, uint64_t,
661 #endif // DOXYGEN_SHOULD_SKIP_THIS 665 ::std::error_code ec;
666 Set(idx, subidx, value, ec);
667 if (ec)
throw SdoError(impl_->netid(), impl_->id(), idx, subidx, ec,
"Set");
672 ::std::error_code& ec) {
677 Device::Set(uint16_t idx, uint8_t subidx,
const char16_t* value) {
678 ::std::error_code ec;
679 Set(idx, subidx, value, ec);
680 if (ec)
throw SdoError(impl_->netid(), impl_->id(), idx, subidx, ec,
"Set");
685 ::std::error_code& ec) {
690 Device::Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n) {
691 ::std::error_code ec;
692 Set(idx, subidx, p, n, ec);
693 if (ec)
throw SdoError(impl_->netid(), impl_->id(), idx, subidx, ec,
"Set");
697 Device::Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n,
698 ::std::error_code& ec) {
702 Device::Impl_::Impl_(const ::std::string& dcf_txt, const ::std::string& dcf_bin,
705 if (!dcf_bin.empty() &&
dev->readDCF(
nullptr,
nullptr, dcf_bin.c_str()) == -1)
706 throw_errc(
"Device");
708 if (
id != 0xff &&
dev->setId(
id) == -1) throw_errc(
"Device");
712 Device::Impl_::Set(uint16_t idx, uint8_t subidx, const ::std::string& value,
713 ::std::error_code& ec) {
714 Set<CO_DEFTYPE_VISIBLE_STRING>(idx, subidx, value.c_str(), 0, ec);
718 Device::Impl_::Set(uint16_t idx, uint8_t subidx,
719 const ::std::vector<uint8_t>& value, ::std::error_code& ec) {
720 Set<CO_DEFTYPE_OCTET_STRING>(idx, subidx, value.data(), value.size(), ec);
724 Device::Impl_::Set(uint16_t idx, uint8_t subidx,
725 const ::std::basic_string<char16_t>& value,
726 ::std::error_code& ec) {
727 Set<CO_DEFTYPE_UNICODE_STRING>(idx, subidx, value.c_str(), 0, ec);
730 template <u
int16_t N>
732 Device::Impl_::Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n,
733 ::std::error_code& ec) {
734 auto obj =
dev->find(idx);
740 auto sub = obj->find(subidx);
This header file is part of the C++ CANopen application library; it contains the CANopen device descr...
typename ::std::enable_if< detail::IsCanopenType< T >::value, T >::type Get(uint16_t idx, uint8_t subidx) const
Reads the value of a sub-object.
#define CO_DEFTYPE_VISIBLE_STRING
The data type (and object index) of an array of visible characters.
unique_c_ptr< T > make_unique_c(Args &&... args)
Creates an instance of a trivial, standard layout or incomplete C type and wraps it in a lely::unique...
#define CO_DEFTYPE_DOMAIN
The data type (and object index) of an arbitrary large block of data.
virtual void unlock()=0
Releases the lock held by the execution agent. Throws no exceptions.
virtual void unlock() override
Releases the lock held by the execution agent. Throws no exceptions.
A class template mapping CANopen types to C++ types.
An opaque CANopen Client-SDO service type.
An opaque CANopen device type.
typename ::std::enable_if< detail::IsCanopenType< T >::value, T >::type Read(uint16_t idx, uint8_t subidx) const
Submits an SDO upload request to the local object dictionary.
#define CO_DEFTYPE_UNSIGNED32
The data type (and object index) of a 32-bit unsigned integer.
uint8_t netid() const noexcept
Returns the network-ID.
#define CO_DEFTYPE_INTEGER64
The data type (and object index) of a 64-bit signed integer.
#define CO_DEFTYPE_REAL32
The data type (and object index) of a 32-bit IEEE-754 floating-point number.
Sub-index does not exist.
#define CO_DEFTYPE_INTEGER8
The data type (and object index) of an 8-bit signed integer.
#define CO_DEFTYPE_UNSIGNED16
The data type (and object index) of a 16-bit unsigned integer.
Device(const ::std::string &dcf_txt, const ::std::string &dcf_bin="", uint8_t id=0xff, BasicLockable *mutex=nullptr)
Creates a new CANopen device description.
#define CO_DEFTYPE_UNICODE_STRING
The data type (and object index) of an array of (16-bit) Unicode characters.
SdoErrc
The SDO abort codes.
This header file is part of the CANopen library; it contains the C++ interface of the object dictiona...
virtual void lock()=0
Blocks until a lock can be obtained for the current execution agent (thread, process, task).
const ::std::type_info & Type(uint16_t idx, uint8_t subidx) const
Returns the type of a sub-object.
#define CO_DEFTYPE_UNSIGNED8
The data type (and object index) of an 8-bit unsigned integer.
Data type does not match, length of service parameter does not match.
#define CO_DEFTYPE_INTEGER16
The data type (and object index) of a 16-bit signed integer.
An abstract interface conforming to the BasicLockable concept.
This is the internal header file of the C++ CANopen application library.
#define CO_DEFTYPE_OCTET_STRING
The data type (and object index) of an array of octets.
#define CO_DEFTYPE_UNSIGNED64
The data type (and object index) of a 64-bit unsigned integer.
This header file is part of the CANopen library; it contains the C++ interface of the Electronic Data...
Object does not exist in the object dictionary.
#define CO_DEFTYPE_REAL64
The data type (and object index) of a 64-bit IEEE-754 floating-point number.
typename ::std::enable_if< detail::IsCanopenBasic< T >::value >::type Write(uint16_t idx, uint8_t subidx, T value)
Submits an SDO download request to the local object dictionary.
virtual void lock() override
Blocks until a lock can be obtained for the current execution agent (thread, process, task).
The internal implementation of the CANopen device description.
CODev * dev() const noexcept
Returns a pointer to the internal CANopen device from <lely/co/dev.hpp>.
The CANopen device description.
This header file is part of the CANopen library; it contains the C++ interface of the Client-SDO decl...
Global namespace for the Lely Industries N.V. libraries.
#define CO_DEFTYPE_INTEGER32
The data type (and object index) of a 32-bit signed integer.
uint8_t id() const noexcept
Returns the node-ID.
typename ::std::enable_if< detail::IsCanopenBasic< T >::value >::type Set(uint16_t idx, uint8_t subidx, T value)
Writes a CANopen basic value to a sub-object.
The type of exception thrown when an SDO abort code is received.
#define CO_DEFTYPE_BOOLEAN
The data type (and object index) of a boolean truth value.
bool IsCanopenSame(uint16_t t1, uint16_t t2)
Returns true if the CANopen data types t1 and t2 map to the same C++ type, and false if not...