47 virtual ~
Impl_() =
default;
51 if (mutex) mutex->
lock();
56 if (mutex) mutex->
unlock();
60 netid()
const noexcept {
61 return dev->getNetid();
69 void Set(uint16_t idx, uint8_t subidx, const ::std::string& value,
70 ::std::error_code& ec) noexcept;
72 void Set(uint16_t idx, uint8_t subidx, const ::std::vector<uint8_t>& value,
73 ::std::error_code& ec) noexcept;
75 void Set(uint16_t idx, uint8_t subidx,
76 const ::std::basic_string<char16_t>& value,
77 ::std::error_code& ec) noexcept;
80 void Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n,
81 ::std::error_code& ec) noexcept;
83 void OnWrite(uint16_t idx, uint8_t subidx);
85 ::std::tuple<uint16_t, uint8_t>
86 RpdoMapping(uint8_t
id, uint16_t idx, uint8_t subidx,
87 ::std::error_code& ec)
const noexcept {
88 auto it = rpdo_mapping.find((static_cast<uint32_t>(
id) << 24) |
89 (static_cast<uint32_t>(idx) << 8) | subidx);
90 if (it != rpdo_mapping.end()) {
91 idx = (it->second >> 8) & 0xffff;
92 subidx = it->second & 0xff;
98 return ::std::make_tuple(idx, subidx);
101 ::std::tuple<uint8_t, uint16_t, uint8_t>
102 RpdoMapping(uint16_t idx, uint8_t subidx, ::std::error_code& ec)
const 105 auto it = rpdo_mapping.find((static_cast<uint32_t>(idx) << 8) | subidx);
106 if (it != rpdo_mapping.end()) {
107 id = (it->second >> 24) & 0xff;
108 idx = (it->second >> 8) & 0xffff;
109 subidx = it->second & 0xff;
115 return ::std::make_tuple(
id, idx, subidx);
118 ::std::tuple<uint16_t, uint8_t>
119 TpdoMapping(uint8_t
id, uint16_t idx, uint8_t subidx,
120 ::std::error_code& ec)
const noexcept {
121 auto it = tpdo_mapping.find((static_cast<uint32_t>(
id) << 24) |
122 (static_cast<uint32_t>(idx) << 8) | subidx);
123 if (it != tpdo_mapping.end()) {
124 idx = (it->second >> 8) & 0xffff;
125 subidx = it->second & 0xff;
131 return ::std::make_tuple(idx, subidx);
136 BasicLockable* mutex{
nullptr};
140 ::std::map<uint32_t, uint32_t> rpdo_mapping;
141 ::std::map<uint32_t, uint32_t> tpdo_mapping;
143 ::std::function<void(uint16_t, uint8_t)> on_write;
144 ::std::function<void(uint8_t, uint16_t, uint8_t)> on_rpdo_write;
149 : impl_(new
Impl_(this, dcf_txt, dcf_bin, id, mutex)) {}
151 Device::~Device() =
default;
155 ::std::lock_guard<Impl_> lock(*impl_);
157 return impl_->netid();
162 ::std::lock_guard<Impl_> lock(*impl_);
170 OnDnCon(
COCSDO*, uint16_t, uint8_t, uint32_t ac,
void* data) noexcept {
171 *
static_cast<uint32_t*
>(data) = ac;
176 OnUpCon(
COCSDO*, uint16_t, uint8_t, uint32_t ac, T value,
void* data) noexcept {
177 auto* t =
static_cast<decltype(::std::tie(ac, value))*
>(data);
178 *t = ::std::forward_as_tuple(ac, ::std::move(value));
184 typename ::std::enable_if<detail::is_canopen_type<T>::value, T>::type
186 ::std::error_code ec;
187 T value(Read<T>(idx, subidx, ec));
193 typename ::std::enable_if<detail::is_canopen_type<T>::value, T>::type
194 Device::Read(uint16_t idx, uint8_t subidx, ::std::error_code& ec)
const {
197 auto t = ::std::tie(ac, value);
199 ::std::lock_guard<Impl_> lock(*impl_);
202 if (!upReq<T, &OnUpCon<T>>(*impl_->dev, idx, subidx, &t)) {
215 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
217 ::std::error_code ec;
218 Write(idx, subidx, value, ec);
223 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
224 Device::Write(uint16_t idx, uint8_t subidx, T value, ::std::error_code& ec) {
228 ::std::lock_guard<Impl_> lock(*impl_);
231 if (!dnReq<N>(*impl_->dev, idx, subidx, value, &OnDnCon, &ac)) {
243 typename ::std::enable_if<detail::is_canopen_array<T>::value>::type
244 Device::Write(uint16_t idx, uint8_t subidx,
const T& value) {
245 ::std::error_code ec;
246 Write(idx, subidx, value, ec);
251 typename ::std::enable_if<detail::is_canopen_array<T>::value>::type
253 ::std::error_code& ec) {
257 ::std::lock_guard<Impl_> lock(*impl_);
260 if (!dnReq<N>(*impl_->dev, idx, subidx, value, &OnDnCon, &ac)) {
271 #ifndef DOXYGEN_SHOULD_SKIP_THIS 274 template bool Device::Read<bool>(uint16_t, uint8_t)
const;
275 template bool Device::Read<bool>(uint16_t, uint8_t, ::std::error_code&)
const;
276 template void Device::Write<bool>(uint16_t, uint8_t, bool);
277 template void Device::Write<bool>(uint16_t, uint8_t, bool, ::std::error_code&);
280 template int8_t Device::Read<int8_t>(uint16_t, uint8_t)
const;
281 template int8_t Device::Read<int8_t>(uint16_t, uint8_t,
282 ::std::error_code&)
const;
283 template void Device::Write<int8_t>(uint16_t, uint8_t, int8_t);
284 template void Device::Write<int8_t>(uint16_t, uint8_t, int8_t,
288 template int16_t Device::Read<int16_t>(uint16_t, uint8_t)
const;
289 template int16_t Device::Read<int16_t>(uint16_t, uint8_t,
290 ::std::error_code&)
const;
291 template void Device::Write<int16_t>(uint16_t, uint8_t, int16_t);
292 template void Device::Write<int16_t>(uint16_t, uint8_t, int16_t,
296 template int32_t Device::Read<int32_t>(uint16_t, uint8_t)
const;
297 template int32_t Device::Read<int32_t>(uint16_t, uint8_t,
298 ::std::error_code&)
const;
299 template void Device::Write<int32_t>(uint16_t, uint8_t, int32_t);
300 template void Device::Write<int32_t>(uint16_t, uint8_t, int32_t,
304 template uint8_t Device::Read<uint8_t>(uint16_t, uint8_t)
const;
305 template uint8_t Device::Read<uint8_t>(uint16_t, uint8_t,
306 ::std::error_code&)
const;
307 template void Device::Write<uint8_t>(uint16_t, uint8_t, uint8_t);
308 template void Device::Write<uint8_t>(uint16_t, uint8_t, uint8_t,
312 template uint16_t Device::Read<uint16_t>(uint16_t, uint8_t)
const;
313 template uint16_t Device::Read<uint16_t>(uint16_t, uint8_t,
314 ::std::error_code&)
const;
315 template void Device::Write<uint16_t>(uint16_t, uint8_t, uint16_t);
316 template void Device::Write<uint16_t>(uint16_t, uint8_t, uint16_t,
320 template uint32_t Device::Read<uint32_t>(uint16_t, uint8_t)
const;
321 template uint32_t Device::Read<uint32_t>(uint16_t, uint8_t,
322 ::std::error_code&)
const;
323 template void Device::Write<uint32_t>(uint16_t, uint8_t, uint32_t);
324 template void Device::Write<uint32_t>(uint16_t, uint8_t, uint32_t,
328 template float Device::Read<float>(uint16_t, uint8_t)
const;
329 template float Device::Read<float>(uint16_t, uint8_t, ::std::error_code&)
const;
330 template void Device::Write<float>(uint16_t, uint8_t, float);
331 template void Device::Write<float>(uint16_t, uint8_t, float,
335 template ::std::string Device::Read<::std::string>(uint16_t, uint8_t)
const;
336 template ::std::string Device::Read<::std::string>(uint16_t, uint8_t,
337 ::std::error_code&)
const;
338 template void Device::Write<::std::string>(uint16_t, uint8_t,
339 const ::std::string&);
340 template void Device::Write<::std::string>(uint16_t, uint8_t,
341 const ::std::string&,
345 template ::std::vector<uint8_t> Device::Read<::std::vector<uint8_t>>(
346 uint16_t, uint8_t)
const;
347 template ::std::vector<uint8_t> Device::Read<::std::vector<uint8_t>>(
348 uint16_t, uint8_t, ::std::error_code&)
const;
349 template void Device::Write<::std::vector<uint8_t>>(
350 uint16_t, uint8_t, const ::std::vector<uint8_t>&);
351 template void Device::Write<::std::vector<uint8_t>>(
352 uint16_t, uint8_t, const ::std::vector<uint8_t>&, ::std::error_code&);
355 template ::std::basic_string<char16_t>
356 Device::Read<::std::basic_string<char16_t>>(uint16_t, uint8_t)
const;
357 template ::std::basic_string<char16_t>
358 Device::Read<::std::basic_string<char16_t>>(uint16_t, uint8_t,
359 ::std::error_code&)
const;
360 template void Device::Write<::std::basic_string<char16_t>>(
361 uint16_t, uint8_t, const ::std::basic_string<char16_t>&);
362 template void Device::Write<::std::basic_string<char16_t>>(
363 uint16_t, uint8_t, const ::std::basic_string<char16_t>&,
372 template double Device::Read<double>(uint16_t, uint8_t)
const;
373 template double Device::Read<double>(uint16_t, uint8_t,
374 ::std::error_code&)
const;
375 template void Device::Write<double>(uint16_t, uint8_t, double);
376 template void Device::Write<double>(uint16_t, uint8_t, double,
384 template int64_t Device::Read<int64_t>(uint16_t, uint8_t)
const;
385 template int64_t Device::Read<int64_t>(uint16_t, uint8_t,
386 ::std::error_code&)
const;
387 template void Device::Write<int64_t>(uint16_t, uint8_t, int64_t);
388 template void Device::Write<int64_t>(uint16_t, uint8_t, int64_t,
397 template uint64_t Device::Read<uint64_t>(uint16_t, uint8_t)
const;
398 template uint64_t Device::Read<uint64_t>(uint16_t, uint8_t,
399 ::std::error_code&)
const;
400 template void Device::Write<uint64_t>(uint16_t, uint8_t, uint64_t);
401 template void Device::Write<uint64_t>(uint16_t, uint8_t, uint64_t,
404 #endif // DOXYGEN_SHOULD_SKIP_THIS 408 ::std::error_code ec;
409 Write(idx, subidx, value, ec);
415 ::std::error_code& ec) {
416 Write(idx, subidx, value, ::std::char_traits<char>::length(value), ec);
421 ::std::error_code ec;
422 Write(idx, subidx, value, ec);
428 ::std::error_code& ec) {
432 ::std::lock_guard<Impl_> lock(*impl_);
436 if (!dnReq<N>(*impl_->dev, idx, subidx, value, &OnDnCon, &ac)) {
448 Device::Write(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n) {
449 ::std::error_code ec;
450 Write(idx, subidx, p, n, ec);
456 ::std::error_code& ec) {
459 ::std::lock_guard<Impl_> lock(*impl_);
462 if (!dnReq(*impl_->dev, idx, subidx, p, n, &OnDnCon, &ac)) {
475 ::std::error_code ec;
482 ::std::error_code& ec) noexcept {
483 ::std::lock_guard<Impl_> lock(*impl_);
489 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
491 ::std::error_code ec;
492 T value(RpdoRead<T>(
id, idx, subidx, ec));
498 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
500 ::std::error_code& ec)
const {
503 ::std::lock_guard<Impl_> lock(*impl_);
504 ::std::tie(idx, subidx) = impl_->RpdoMapping(
id, idx, subidx, ec);
507 return Read<T>(idx, subidx, ec);
511 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
513 ::std::error_code ec;
514 T value(TpdoRead<T>(
id, idx, subidx, ec));
520 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
522 ::std::error_code& ec)
const {
525 ::std::lock_guard<Impl_> lock(*impl_);
526 ::std::tie(idx, subidx) = impl_->TpdoMapping(
id, idx, subidx, ec);
529 return Read<T>(idx, subidx, ec);
533 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
535 ::std::error_code ec;
541 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
543 ::std::error_code& ec) {
546 ::std::lock_guard<Impl_> lock(*impl_);
547 ::std::tie(idx, subidx) = impl_->TpdoMapping(
id, idx, subidx, ec);
549 if (!ec) Write<T>(idx, subidx, value, ec);
552 #ifndef DOXYGEN_SHOULD_SKIP_THIS 555 template bool Device::RpdoRead<bool>(uint8_t, uint16_t, uint8_t)
const;
556 template bool Device::RpdoRead<bool>(uint8_t, uint16_t, uint8_t,
557 ::std::error_code&)
const;
558 template bool Device::TpdoRead<bool>(uint8_t, uint16_t, uint8_t)
const;
559 template bool Device::TpdoRead<bool>(uint8_t, uint16_t, uint8_t,
560 ::std::error_code&)
const;
561 template void Device::TpdoWrite<bool>(uint8_t, uint16_t, uint8_t, bool);
562 template void Device::TpdoWrite<bool>(uint8_t, uint16_t, uint8_t, bool,
566 template int8_t Device::RpdoRead<int8_t>(uint8_t, uint16_t, uint8_t)
const;
567 template int8_t Device::RpdoRead<int8_t>(uint8_t, uint16_t, uint8_t,
568 ::std::error_code&)
const;
569 template int8_t Device::TpdoRead<int8_t>(uint8_t, uint16_t, uint8_t)
const;
570 template int8_t Device::TpdoRead<int8_t>(uint8_t, uint16_t, uint8_t,
571 ::std::error_code&)
const;
572 template void Device::TpdoWrite<int8_t>(uint8_t, uint16_t, uint8_t, int8_t);
573 template void Device::TpdoWrite<int8_t>(uint8_t, uint16_t, uint8_t, int8_t,
577 template int16_t Device::RpdoRead<int16_t>(uint8_t, uint16_t, uint8_t)
const;
578 template int16_t Device::RpdoRead<int16_t>(uint8_t, uint16_t, uint8_t,
579 ::std::error_code&)
const;
580 template int16_t Device::TpdoRead<int16_t>(uint8_t, uint16_t, uint8_t)
const;
581 template int16_t Device::TpdoRead<int16_t>(uint8_t, uint16_t, uint8_t,
582 ::std::error_code&)
const;
583 template void Device::TpdoWrite<int16_t>(uint8_t, uint16_t, uint8_t, int16_t);
584 template void Device::TpdoWrite<int16_t>(uint8_t, uint16_t, uint8_t, int16_t,
588 template int32_t Device::RpdoRead<int32_t>(uint8_t, uint16_t, uint8_t)
const;
589 template int32_t Device::RpdoRead<int32_t>(uint8_t, uint16_t, uint8_t,
590 ::std::error_code&)
const;
591 template int32_t Device::TpdoRead<int32_t>(uint8_t, uint16_t, uint8_t)
const;
592 template int32_t Device::TpdoRead<int32_t>(uint8_t, uint16_t, uint8_t,
593 ::std::error_code&)
const;
594 template void Device::TpdoWrite<int32_t>(uint8_t, uint16_t, uint8_t, int32_t);
595 template void Device::TpdoWrite<int32_t>(uint8_t, uint16_t, uint8_t, int32_t,
599 template uint8_t Device::RpdoRead<uint8_t>(uint8_t, uint16_t, uint8_t)
const;
600 template uint8_t Device::RpdoRead<uint8_t>(uint8_t, uint16_t, uint8_t,
601 ::std::error_code&)
const;
602 template uint8_t Device::TpdoRead<uint8_t>(uint8_t, uint16_t, uint8_t)
const;
603 template uint8_t Device::TpdoRead<uint8_t>(uint8_t, uint16_t, uint8_t,
604 ::std::error_code&)
const;
605 template void Device::TpdoWrite<uint8_t>(uint8_t, uint16_t, uint8_t, uint8_t);
606 template void Device::TpdoWrite<uint8_t>(uint8_t, uint16_t, uint8_t, uint8_t,
610 template uint16_t Device::RpdoRead<uint16_t>(uint8_t, uint16_t, uint8_t)
const;
611 template uint16_t Device::RpdoRead<uint16_t>(uint8_t, uint16_t, uint8_t,
612 ::std::error_code&)
const;
613 template uint16_t Device::TpdoRead<uint16_t>(uint8_t, uint16_t, uint8_t)
const;
614 template uint16_t Device::TpdoRead<uint16_t>(uint8_t, uint16_t, uint8_t,
615 ::std::error_code&)
const;
616 template void Device::TpdoWrite<uint16_t>(uint8_t, uint16_t, uint8_t, uint16_t);
617 template void Device::TpdoWrite<uint16_t>(uint8_t, uint16_t, uint8_t, uint16_t,
621 template uint32_t Device::RpdoRead<uint32_t>(uint8_t, uint16_t, uint8_t)
const;
622 template uint32_t Device::RpdoRead<uint32_t>(uint8_t, uint16_t, uint8_t,
623 ::std::error_code&)
const;
624 template uint32_t Device::TpdoRead<uint32_t>(uint8_t, uint16_t, uint8_t)
const;
625 template uint32_t Device::TpdoRead<uint32_t>(uint8_t, uint16_t, uint8_t,
626 ::std::error_code&)
const;
627 template void Device::TpdoWrite<uint32_t>(uint8_t, uint16_t, uint8_t, uint32_t);
628 template void Device::TpdoWrite<uint32_t>(uint8_t, uint16_t, uint8_t, uint32_t,
632 template float Device::RpdoRead<float>(uint8_t, uint16_t, uint8_t)
const;
633 template float Device::RpdoRead<float>(uint8_t, uint16_t, uint8_t,
634 ::std::error_code&)
const;
635 template float Device::TpdoRead<float>(uint8_t, uint16_t, uint8_t)
const;
636 template float Device::TpdoRead<float>(uint8_t, uint16_t, uint8_t,
637 ::std::error_code&)
const;
638 template void Device::TpdoWrite<float>(uint8_t, uint16_t, uint8_t, float);
639 template void Device::TpdoWrite<float>(uint8_t, uint16_t, uint8_t, float,
651 template double Device::RpdoRead<double>(uint8_t, uint16_t, uint8_t)
const;
652 template double Device::RpdoRead<double>(uint8_t, uint16_t, uint8_t,
653 ::std::error_code&)
const;
654 template double Device::TpdoRead<double>(uint8_t, uint16_t, uint8_t)
const;
655 template double Device::TpdoRead<double>(uint8_t, uint16_t, uint8_t,
656 ::std::error_code&)
const;
657 template void Device::TpdoWrite<double>(uint8_t, uint16_t, uint8_t, double);
658 template void Device::TpdoWrite<double>(uint8_t, uint16_t, uint8_t, double,
666 template int64_t Device::RpdoRead<int64_t>(uint8_t, uint16_t, uint8_t)
const;
667 template int64_t Device::RpdoRead<int64_t>(uint8_t, uint16_t, uint8_t,
668 ::std::error_code&)
const;
669 template int64_t Device::TpdoRead<int64_t>(uint8_t, uint16_t, uint8_t)
const;
670 template int64_t Device::TpdoRead<int64_t>(uint8_t, uint16_t, uint8_t,
671 ::std::error_code&)
const;
672 template void Device::TpdoWrite<int64_t>(uint8_t, uint16_t, uint8_t, int64_t);
673 template void Device::TpdoWrite<int64_t>(uint8_t, uint16_t, uint8_t, int64_t,
682 template uint64_t Device::RpdoRead<uint64_t>(uint8_t, uint16_t, uint8_t)
const;
683 template uint64_t Device::RpdoRead<uint64_t>(uint8_t, uint16_t, uint8_t,
684 ::std::error_code&)
const;
685 template uint64_t Device::TpdoRead<uint64_t>(uint8_t, uint16_t, uint8_t)
const;
686 template uint64_t Device::TpdoRead<uint64_t>(uint8_t, uint16_t, uint8_t,
687 ::std::error_code&)
const;
688 template void Device::TpdoWrite<uint64_t>(uint8_t, uint16_t, uint8_t, uint64_t);
689 template void Device::TpdoWrite<uint64_t>(uint8_t, uint16_t, uint8_t, uint64_t,
692 #endif // DOXYGEN_SHOULD_SKIP_THIS 696 ::std::error_code ec;
703 ::std::error_code& ec) noexcept {
704 ::std::lock_guard<Impl_> lock(*impl_);
710 Device::OnWrite(::std::function<
void(uint16_t, uint8_t)> on_write) {
711 ::std::lock_guard<Impl_> lock(*impl_);
712 impl_->on_write = on_write;
717 ::std::function<
void(uint8_t, uint16_t, uint8_t)> on_rpdo_write) {
718 ::std::lock_guard<Impl_> lock(*impl_);
719 impl_->on_rpdo_write = on_rpdo_write;
724 return impl_->dev.get();
727 const ::std::type_info&
729 ::std::error_code ec;
730 auto& ti =
Type(idx, subidx, ec);
735 const ::std::type_info&
736 Device::Type(uint16_t idx, uint8_t subidx, ::std::error_code& ec)
const 738 auto obj = impl_->dev->find(idx);
744 auto sub = obj->find(subidx);
751 switch (sub->getType()) {
755 return typeid(int8_t);
757 return typeid(int16_t);
759 return typeid(int32_t);
761 return typeid(uint8_t);
763 return typeid(uint16_t);
765 return typeid(uint32_t);
767 return typeid(float);
769 return typeid(::std::string);
771 return typeid(::std::vector<uint8_t>);
773 return typeid(::std::basic_string<char16_t>);
777 return typeid(::std::vector<uint8_t>);
780 return typeid(double);
785 return typeid(int64_t);
791 return typeid(uint64_t);
798 typename ::std::enable_if<detail::is_canopen_type<T>::value, T>::type
800 ::std::error_code ec;
801 auto value = Get<T>(idx, subidx, ec);
807 typename ::std::enable_if<detail::is_canopen_type<T>::value, T>::type
808 Device::Get(uint16_t idx, uint8_t subidx, ::std::error_code& ec)
const 812 auto obj = impl_->dev->find(idx);
818 auto sub = obj->find(subidx);
832 return sub->getVal<N>();
836 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
837 Device::Set(uint16_t idx, uint8_t subidx, T value) {
838 ::std::error_code ec;
839 Set(idx, subidx, value, ec);
844 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
846 ::std::error_code& ec) noexcept {
849 impl_->Set<N>(idx, subidx, &value,
sizeof(value), ec);
853 typename ::std::enable_if<detail::is_canopen_array<T>::value>::type
854 Device::Set(uint16_t idx, uint8_t subidx,
const T& value) {
855 ::std::error_code ec;
856 Set(idx, subidx, value, ec);
861 typename ::std::enable_if<detail::is_canopen_array<T>::value>::type
862 Device::Set(uint16_t idx, uint8_t subidx,
const T& value,
863 ::std::error_code& ec) noexcept {
864 impl_->Set(idx, subidx, value, ec);
867 #ifndef DOXYGEN_SHOULD_SKIP_THIS 870 template bool Device::Get<bool>(uint16_t, uint8_t)
const;
871 template bool Device::Get<bool>(uint16_t, uint8_t, ::std::error_code&)
const 873 template void Device::Set<bool>(uint16_t, uint8_t, bool);
874 template void Device::Set<bool>(uint16_t, uint8_t, bool,
875 ::std::error_code&) noexcept;
878 template int8_t Device::Get<int8_t>(uint16_t, uint8_t)
const;
879 template int8_t Device::Get<int8_t>(uint16_t, uint8_t, ::std::error_code&)
const 881 template void Device::Set<int8_t>(uint16_t, uint8_t, int8_t);
882 template void Device::Set<int8_t>(uint16_t, uint8_t, int8_t,
883 ::std::error_code&) noexcept;
886 template int16_t Device::Get<int16_t>(uint16_t, uint8_t)
const;
887 template int16_t Device::Get<int16_t>(uint16_t, uint8_t,
888 ::std::error_code&)
const noexcept;
889 template void Device::Set<int16_t>(uint16_t, uint8_t, int16_t);
890 template void Device::Set<int16_t>(uint16_t, uint8_t, int16_t,
891 ::std::error_code&) noexcept;
894 template int32_t Device::Get<int32_t>(uint16_t, uint8_t)
const;
895 template int32_t Device::Get<int32_t>(uint16_t, uint8_t,
896 ::std::error_code&)
const noexcept;
897 template void Device::Set<int32_t>(uint16_t, uint8_t, int32_t);
898 template void Device::Set<int32_t>(uint16_t, uint8_t, int32_t,
899 ::std::error_code&) noexcept;
902 template uint8_t Device::Get<uint8_t>(uint16_t, uint8_t)
const;
903 template uint8_t Device::Get<uint8_t>(uint16_t, uint8_t,
904 ::std::error_code&)
const noexcept;
905 template void Device::Set<uint8_t>(uint16_t, uint8_t, uint8_t);
906 template void Device::Set<uint8_t>(uint16_t, uint8_t, uint8_t,
907 ::std::error_code&) noexcept;
910 template uint16_t Device::Get<uint16_t>(uint16_t, uint8_t)
const;
911 template uint16_t Device::Get<uint16_t>(uint16_t, uint8_t,
912 ::std::error_code&)
const noexcept;
913 template void Device::Set<uint16_t>(uint16_t, uint8_t, uint16_t);
914 template void Device::Set<uint16_t>(uint16_t, uint8_t, uint16_t,
915 ::std::error_code&) noexcept;
918 template uint32_t Device::Get<uint32_t>(uint16_t, uint8_t)
const;
919 template uint32_t Device::Get<uint32_t>(uint16_t, uint8_t,
920 ::std::error_code&)
const noexcept;
921 template void Device::Set<uint32_t>(uint16_t, uint8_t, uint32_t);
922 template void Device::Set<uint32_t>(uint16_t, uint8_t, uint32_t,
923 ::std::error_code&) noexcept;
926 template float Device::Get<float>(uint16_t, uint8_t)
const;
927 template float Device::Get<float>(uint16_t, uint8_t, ::std::error_code&)
const 929 template void Device::Set<float>(uint16_t, uint8_t, float);
930 template void Device::Set<float>(uint16_t, uint8_t, float,
931 ::std::error_code&) noexcept;
934 template ::std::string Device::Get<::std::string>(uint16_t, uint8_t)
const;
935 template ::std::string Device::Get<::std::string>(uint16_t, uint8_t,
936 ::std::error_code&)
const 938 template void Device::Set<::std::string>(uint16_t, uint8_t,
939 const ::std::string&);
940 template void Device::Set<::std::string>(uint16_t, uint8_t,
941 const ::std::string&,
942 ::std::error_code&) noexcept;
945 template ::std::vector<uint8_t> Device::Get<::std::vector<uint8_t>>(
946 uint16_t, uint8_t)
const;
947 template ::std::vector<uint8_t> Device::Get<::std::vector<uint8_t>>(
948 uint16_t, uint8_t, ::std::error_code&)
const noexcept;
949 template void Device::Set<::std::vector<uint8_t>>(
950 uint16_t, uint8_t, const ::std::vector<uint8_t>&);
951 template void Device::Set<::std::vector<uint8_t>>(uint16_t, uint8_t,
952 const ::std::vector<uint8_t>&,
953 ::std::error_code&) noexcept;
956 template ::std::basic_string<char16_t>
957 Device::Get<::std::basic_string<char16_t>>(uint16_t, uint8_t)
const;
958 template ::std::basic_string<char16_t>
959 Device::Get<::std::basic_string<char16_t>>(uint16_t, uint8_t,
960 ::std::error_code&)
const noexcept;
961 template void Device::Set<::std::basic_string<char16_t>>(
962 uint16_t, uint8_t, const ::std::basic_string<char16_t>&);
963 template void Device::Set<::std::basic_string<char16_t>>(
964 uint16_t, uint8_t, const ::std::basic_string<char16_t>&,
965 ::std::error_code&) noexcept;
973 template double Device::Get<double>(uint16_t, uint8_t)
const;
974 template double Device::Get<double>(uint16_t, uint8_t, ::std::error_code&)
const 976 template void Device::Set<double>(uint16_t, uint8_t, double);
977 template void Device::Set<double>(uint16_t, uint8_t, double,
978 ::std::error_code&) noexcept;
985 template int64_t Device::Get<int64_t>(uint16_t, uint8_t)
const;
986 template int64_t Device::Get<int64_t>(uint16_t, uint8_t,
987 ::std::error_code&)
const noexcept;
988 template void Device::Set<int64_t>(uint16_t, uint8_t, int64_t);
989 template void Device::Set<int64_t>(uint16_t, uint8_t, int64_t,
990 ::std::error_code&) noexcept;
998 template uint64_t Device::Get<uint64_t>(uint16_t, uint8_t)
const;
999 template uint64_t Device::Get<uint64_t>(uint16_t, uint8_t,
1000 ::std::error_code&)
const noexcept;
1001 template void Device::Set<uint64_t>(uint16_t, uint8_t, uint64_t);
1002 template void Device::Set<uint64_t>(uint16_t, uint8_t, uint64_t,
1003 ::std::error_code&) noexcept;
1005 #endif // DOXYGEN_SHOULD_SKIP_THIS 1009 ::std::error_code ec;
1010 Set(idx, subidx, value, ec);
1016 ::std::error_code& ec) noexcept {
1022 ::std::error_code ec;
1023 Set(idx, subidx, value, ec);
1029 ::std::error_code& ec) noexcept {
1034 Device::Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n) {
1035 ::std::error_code ec;
1036 Set(idx, subidx, p, n, ec);
1041 Device::Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n,
1042 ::std::error_code& ec) noexcept {
1048 ::std::error_code ec;
1050 if (ec)
throw_sdo_error(impl_->id(), idx, subidx, ec,
"GetUploadFile");
1057 auto obj = impl_->dev->find(idx);
1063 auto sub = obj->find(subidx);
1070 return sub->getUploadFile();
1075 ::std::error_code ec;
1077 if (ec)
throw_sdo_error(impl_->id(), idx, subidx, ec,
"SetUploadFile");
1082 ::std::error_code& ec) noexcept {
1083 auto obj = impl_->dev->find(idx);
1089 auto sub = obj->find(subidx);
1097 if (!sub->setUploadFile(filename))
1106 ::std::error_code ec;
1108 if (ec)
throw_sdo_error(impl_->id(), idx, subidx, ec,
"GetDownloadFile");
1114 ::std::error_code& ec)
const noexcept {
1115 auto obj = impl_->dev->find(idx);
1121 auto sub = obj->find(subidx);
1128 return sub->getDownloadFile();
1133 ::std::error_code ec;
1135 if (ec)
throw_sdo_error(impl_->id(), idx, subidx, ec,
"SetDownloadFile");
1140 ::std::error_code& ec) noexcept {
1141 auto obj = impl_->dev->find(idx);
1147 auto sub = obj->find(subidx);
1155 if (!sub->setDownloadFile(filename))
1164 ::std::error_code ec;
1171 auto obj = impl_->dev->find(idx);
1177 auto sub = obj->find(subidx);
1183 impl_->dev->TPDOEvent(idx, subidx);
1187 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
1189 ::std::error_code ec;
1190 auto value = RpdoGet<T>(
id, idx, subidx, ec);
1196 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
1198 ::std::error_code& ec)
const noexcept {
1200 ::std::tie(idx, subidx) = impl_->RpdoMapping(
id, idx, subidx, ec);
1202 return Get<T>(idx, subidx, ec);
1206 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
1208 ::std::error_code ec;
1209 auto value = TpdoGet<T>(
id, idx, subidx, ec);
1215 typename ::std::enable_if<detail::is_canopen_basic<T>::value, T>::type
1217 ::std::error_code& ec)
const noexcept {
1219 ::std::tie(idx, subidx) = impl_->TpdoMapping(
id, idx, subidx, ec);
1221 return Get<T>(idx, subidx, ec);
1225 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
1227 ::std::error_code ec;
1228 TpdoSet(
id, idx, subidx, value, ec);
1233 typename ::std::enable_if<detail::is_canopen_basic<T>::value>::type
1235 ::std::error_code& ec) noexcept {
1237 ::std::tie(idx, subidx) = impl_->TpdoMapping(
id, idx, subidx, ec);
1238 if (!ec) Set<T>(idx, subidx, value, ec);
1241 #ifndef DOXYGEN_SHOULD_SKIP_THIS 1244 template bool Device::RpdoGet<bool>(uint8_t, uint16_t, uint8_t)
const;
1245 template bool Device::RpdoGet<bool>(uint8_t, uint16_t, uint8_t,
1246 ::std::error_code&)
const noexcept;
1247 template bool Device::TpdoGet<bool>(uint8_t, uint16_t, uint8_t)
const;
1248 template bool Device::TpdoGet<bool>(uint8_t, uint16_t, uint8_t,
1249 ::std::error_code&)
const noexcept;
1250 template void Device::TpdoSet<bool>(uint8_t, uint16_t, uint8_t, bool);
1251 template void Device::TpdoSet<bool>(uint8_t, uint16_t, uint8_t, bool,
1252 ::std::error_code&) noexcept;
1255 template int8_t Device::RpdoGet<int8_t>(uint8_t, uint16_t, uint8_t)
const;
1256 template int8_t Device::RpdoGet<int8_t>(uint8_t, uint16_t, uint8_t,
1257 ::std::error_code&)
const noexcept;
1258 template int8_t Device::TpdoGet<int8_t>(uint8_t, uint16_t, uint8_t)
const;
1259 template int8_t Device::TpdoGet<int8_t>(uint8_t, uint16_t, uint8_t,
1260 ::std::error_code&)
const noexcept;
1261 template void Device::TpdoSet<int8_t>(uint8_t, uint16_t, uint8_t, int8_t);
1262 template void Device::TpdoSet<int8_t>(uint8_t, uint16_t, uint8_t, int8_t,
1263 ::std::error_code&) noexcept;
1266 template int16_t Device::RpdoGet<int16_t>(uint8_t, uint16_t, uint8_t)
const;
1267 template int16_t Device::RpdoGet<int16_t>(uint8_t, uint16_t, uint8_t,
1268 ::std::error_code&)
const noexcept;
1269 template int16_t Device::TpdoGet<int16_t>(uint8_t, uint16_t, uint8_t)
const;
1270 template int16_t Device::TpdoGet<int16_t>(uint8_t, uint16_t, uint8_t,
1271 ::std::error_code&)
const noexcept;
1272 template void Device::TpdoSet<int16_t>(uint8_t, uint16_t, uint8_t, int16_t);
1273 template void Device::TpdoSet<int16_t>(uint8_t, uint16_t, uint8_t, int16_t,
1274 ::std::error_code&) noexcept;
1277 template int32_t Device::RpdoGet<int32_t>(uint8_t, uint16_t, uint8_t)
const;
1278 template int32_t Device::RpdoGet<int32_t>(uint8_t, uint16_t, uint8_t,
1279 ::std::error_code&)
const noexcept;
1280 template int32_t Device::TpdoGet<int32_t>(uint8_t, uint16_t, uint8_t)
const;
1281 template int32_t Device::TpdoGet<int32_t>(uint8_t, uint16_t, uint8_t,
1282 ::std::error_code&)
const noexcept;
1283 template void Device::TpdoSet<int32_t>(uint8_t, uint16_t, uint8_t, int32_t);
1284 template void Device::TpdoSet<int32_t>(uint8_t, uint16_t, uint8_t, int32_t,
1285 ::std::error_code&) noexcept;
1288 template uint8_t Device::RpdoGet<uint8_t>(uint8_t, uint16_t, uint8_t)
const;
1289 template uint8_t Device::RpdoGet<uint8_t>(uint8_t, uint16_t, uint8_t,
1290 ::std::error_code&)
const noexcept;
1291 template uint8_t Device::TpdoGet<uint8_t>(uint8_t, uint16_t, uint8_t)
const;
1292 template uint8_t Device::TpdoGet<uint8_t>(uint8_t, uint16_t, uint8_t,
1293 ::std::error_code&)
const noexcept;
1294 template void Device::TpdoSet<uint8_t>(uint8_t, uint16_t, uint8_t, uint8_t);
1295 template void Device::TpdoSet<uint8_t>(uint8_t, uint16_t, uint8_t, uint8_t,
1296 ::std::error_code&) noexcept;
1299 template uint16_t Device::RpdoGet<uint16_t>(uint8_t, uint16_t, uint8_t)
const;
1300 template uint16_t Device::RpdoGet<uint16_t>(uint8_t, uint16_t, uint8_t,
1301 ::std::error_code&)
const noexcept;
1302 template uint16_t Device::TpdoGet<uint16_t>(uint8_t, uint16_t, uint8_t)
const;
1303 template uint16_t Device::TpdoGet<uint16_t>(uint8_t, uint16_t, uint8_t,
1304 ::std::error_code&)
const noexcept;
1305 template void Device::TpdoSet<uint16_t>(uint8_t, uint16_t, uint8_t, uint16_t);
1306 template void Device::TpdoSet<uint16_t>(uint8_t, uint16_t, uint8_t, uint16_t,
1307 ::std::error_code&) noexcept;
1310 template uint32_t Device::RpdoGet<uint32_t>(uint8_t, uint16_t, uint8_t)
const;
1311 template uint32_t Device::RpdoGet<uint32_t>(uint8_t, uint16_t, uint8_t,
1312 ::std::error_code&)
const noexcept;
1313 template uint32_t Device::TpdoGet<uint32_t>(uint8_t, uint16_t, uint8_t)
const;
1314 template uint32_t Device::TpdoGet<uint32_t>(uint8_t, uint16_t, uint8_t,
1315 ::std::error_code&)
const noexcept;
1316 template void Device::TpdoSet<uint32_t>(uint8_t, uint16_t, uint8_t, uint32_t);
1317 template void Device::TpdoSet<uint32_t>(uint8_t, uint16_t, uint8_t, uint32_t,
1318 ::std::error_code&) noexcept;
1321 template float Device::RpdoGet<float>(uint8_t, uint16_t, uint8_t)
const;
1322 template float Device::RpdoGet<float>(uint8_t, uint16_t, uint8_t,
1323 ::std::error_code&)
const noexcept;
1324 template float Device::TpdoGet<float>(uint8_t, uint16_t, uint8_t)
const;
1325 template float Device::TpdoGet<float>(uint8_t, uint16_t, uint8_t,
1326 ::std::error_code&)
const noexcept;
1327 template void Device::TpdoSet<float>(uint8_t, uint16_t, uint8_t, float);
1328 template void Device::TpdoSet<float>(uint8_t, uint16_t, uint8_t, float,
1329 ::std::error_code&) noexcept;
1340 template double Device::RpdoGet<double>(uint8_t, uint16_t, uint8_t)
const;
1341 template double Device::RpdoGet<double>(uint8_t, uint16_t, uint8_t,
1342 ::std::error_code&)
const noexcept;
1343 template double Device::TpdoGet<double>(uint8_t, uint16_t, uint8_t)
const;
1344 template double Device::TpdoGet<double>(uint8_t, uint16_t, uint8_t,
1345 ::std::error_code&)
const noexcept;
1346 template void Device::TpdoSet<double>(uint8_t, uint16_t, uint8_t, double);
1347 template void Device::TpdoSet<double>(uint8_t, uint16_t, uint8_t, double,
1348 ::std::error_code&) noexcept;
1355 template int64_t Device::RpdoGet<int64_t>(uint8_t, uint16_t, uint8_t)
const;
1356 template int64_t Device::RpdoGet<int64_t>(uint8_t, uint16_t, uint8_t,
1357 ::std::error_code&)
const noexcept;
1358 template int64_t Device::TpdoGet<int64_t>(uint8_t, uint16_t, uint8_t)
const;
1359 template int64_t Device::TpdoGet<int64_t>(uint8_t, uint16_t, uint8_t,
1360 ::std::error_code&)
const noexcept;
1361 template void Device::TpdoSet<int64_t>(uint8_t, uint16_t, uint8_t, int64_t);
1362 template void Device::TpdoSet<int64_t>(uint8_t, uint16_t, uint8_t, int64_t,
1363 ::std::error_code&) noexcept;
1371 template uint64_t Device::RpdoGet<uint64_t>(uint8_t, uint16_t, uint8_t)
const;
1372 template uint64_t Device::RpdoGet<uint64_t>(uint8_t, uint16_t, uint8_t,
1373 ::std::error_code&)
const noexcept;
1374 template uint64_t Device::TpdoGet<uint64_t>(uint8_t, uint16_t, uint8_t)
const;
1375 template uint64_t Device::TpdoGet<uint64_t>(uint8_t, uint16_t, uint8_t,
1376 ::std::error_code&)
const noexcept;
1377 template void Device::TpdoSet<uint64_t>(uint8_t, uint16_t, uint8_t, uint64_t);
1378 template void Device::TpdoSet<uint64_t>(uint8_t, uint16_t, uint8_t, uint64_t,
1379 ::std::error_code&) noexcept;
1381 #endif // DOXYGEN_SHOULD_SKIP_THIS 1385 ::std::error_code ec;
1392 ::std::error_code& ec) noexcept {
1394 ::std::tie(idx, subidx) = impl_->TpdoMapping(
id, idx, subidx, ec);
1395 if (!ec)
SetEvent(idx, subidx, ec);
1400 impl_->rpdo_mapping.clear();
1402 for (
int i = 0; i < 512; i++) {
1403 auto obj_1400 = impl_->dev->find(0x1400 + i);
1404 if (!obj_1400)
continue;
1410 auto obj_5800 = impl_->dev->find(0x5800 + i);
1416 switch (cobid & 0x780) {
1430 auto obj_1600 = impl_->dev->find(0x1600 + i);
1431 if (!obj_1600)
continue;
1433 auto obj_5a00 = impl_->dev->find(0x5a00 + i);
1434 if (!obj_5a00)
continue;
1438 for (
int i = 1; i <= n; i++) {
1442 if (!rmap && !tmap)
continue;
1444 if ((rmap & 0xff) != (tmap & 0xff))
break;
1449 tmap |=
static_cast<uint32_t
>(
id) << 24;
1450 impl_->rpdo_mapping[tmap] = rmap;
1452 impl_->rpdo_mapping[rmap] = tmap;
1459 impl_->tpdo_mapping.clear();
1461 for (
int i = 0; i < 512; i++) {
1462 auto obj_1800 = impl_->dev->find(0x1800 + i);
1463 if (!obj_1800)
continue;
1469 auto obj_5c00 = impl_->dev->find(0x5c00 + i);
1475 switch (cobid & 0x780) {
1489 auto obj_1a00 = impl_->dev->find(0x1a00 + i);
1490 if (!obj_1a00)
continue;
1492 auto obj_5e00 = impl_->dev->find(0x5e00 + i);
1493 if (!obj_5e00)
continue;
1497 for (
int i = 1; i <= n; i++) {
1501 if (!rmap && !tmap)
continue;
1503 if ((tmap & 0xff) != (rmap & 0xff))
break;
1506 rmap |=
static_cast<uint32_t
>(
id) << 24;
1507 impl_->tpdo_mapping[rmap] = tmap;
1512 Device::Impl_::Impl_(
Device* self_, const ::std::string& dcf_txt,
1513 const ::std::string& dcf_bin, uint8_t
id,
1515 :
self(self_), mutex(mutex_),
dev(make_unique_c<CODev>(dcf_txt.c_str())) {
1516 if (!dcf_bin.empty() &&
dev->readDCF(
nullptr,
nullptr, dcf_bin.c_str()) == -1)
1517 util::throw_errc(
"Device");
1519 if (
id != 0xff &&
dev->setId(
id) == -1) util::throw_errc(
"Device");
1525 if (obj->getIdx() < 0x2000)
continue;
1527 if (obj->getIdx() >= 0xC000)
break;
1533 if (sub->onDn(*req, &ac) == -1 || ac)
return ac;
1534 auto impl_ =
static_cast<Impl_*
>(data);
1535 impl_->OnWrite(sub->getObj()->getIdx(), sub->getSubidx());
1538 static_cast<void*
>(
this));
1543 Device::Impl_::Set(uint16_t idx, uint8_t subidx, const ::std::string& value,
1544 ::std::error_code& ec) noexcept {
1545 Set<CO_DEFTYPE_VISIBLE_STRING>(idx, subidx, value.c_str(), 0, ec);
1549 Device::Impl_::Set(uint16_t idx, uint8_t subidx,
1550 const ::std::vector<uint8_t>& value,
1551 ::std::error_code& ec) noexcept {
1552 Set<CO_DEFTYPE_OCTET_STRING>(idx, subidx, value.data(), value.size(), ec);
1556 Device::Impl_::Set(uint16_t idx, uint8_t subidx,
1557 const ::std::basic_string<char16_t>& value,
1558 ::std::error_code& ec) noexcept {
1559 Set<CO_DEFTYPE_UNICODE_STRING>(idx, subidx, value.c_str(), 0, ec);
1562 template <u
int16_t N>
1564 Device::Impl_::Set(uint16_t idx, uint8_t subidx,
const void* p, ::std::size_t n,
1565 ::std::error_code& ec) noexcept {
1566 auto obj =
dev->find(idx);
1572 auto sub = obj->find(subidx);
1585 if (sub->setVal(p, n) == n)
1593 Device::Impl_::OnWrite(uint16_t idx, uint8_t subidx) {
1594 self->OnWrite(idx, subidx);
1603 ::std::error_code ec;
1604 ::std::tie(
id, idx, subidx) = RpdoMapping(idx, subidx, ec);
1606 self->OnRpdoWrite(
id, idx, subidx);
1608 if (on_rpdo_write) {
1609 auto f = on_rpdo_write;
A CANopen SDO upload/download request.
#define CO_NUM_NODES
The maximum number of nodes in a CANopen network.
void TpdoWriteEvent(uint8_t id, uint16_t idx, uint8_t subidx)
Triggers the transmission of every event-driven, asynchronous Transmit-PDO which is mapped into the s...
This header file is part of the C++ CANopen application library; it contains the CANopen device descr...
void UpdateRpdoMapping()
Updates the mapping from remote TPDO-mapped sub-objects to local RPDO-mapped sub-objects.
typename ::std::enable_if< detail::is_canopen_basic< T >::value >::type TpdoSet(uint8_t id, uint16_t idx, uint8_t subidx, T value)
Writes a value to a sub-object in a remote object dictionary by writing to the corresponding PDO-mapp...
#define CO_DEFTYPE_VISIBLE_STRING
The data type (and object index) of an array of visible characters.
This is the internal header file of the C++ CANopen application library.
co_obj_t * co_obj_next(const co_obj_t *obj)
Finds the next object in the object dictionary of a CANopen device.
void UpdateTpdoMapping()
Updates the mapping from remote RPDO-mapped sub-objects to local TPDO-mapped sub-objects.
#define CO_DEFTYPE_DOMAIN
The data type (and object index) of an arbitrary large block of data.
typename ::std::enable_if< detail::is_canopen_basic< T >::value >::type Set(uint16_t idx, uint8_t subidx, T value)
Writes a CANopen basic value to a sub-object.
co_obj_t * co_dev_first_obj(const co_dev_t *dev)
Finds the first object (with the lowest index) in the object dictionary of a CANopen device...
A class template mapping CANopen types to C++ types.
An opaque CANopen Client-SDO service type.
virtual void lock()=0
Blocks until a lock can be obtained for the current execution agent (thread, process, task).
An opaque CANopen device type.
typename ::std::enable_if< detail::is_canopen_basic< T >::value, T >::type TpdoRead(uint8_t id, uint16_t idx, uint8_t subidx) const
Submits an SDO upload request to a TPDO-mapped sub-object in the local object dictionary, which reads the value that will be written to an RPDO-mapped sub-object in a remote object dictionary by a Transmit-PDO.
void throw_sdo_error(uint8_t id, uint16_t idx, uint8_t subidx, ::std::error_code ec)
Throws a lely::canopen::SdoError with the specified attributes if ec is an SDO error (ec...
void set_errc(int errc)
Sets the current (thread-specific) native error code to errc.
typename ::std::enable_if< detail::is_canopen_basic< T >::value >::type TpdoWrite(uint8_t id, uint16_t idx, uint8_t subidx, T value)
Writes a value to a sub-object in a remote object dictionary by submitting an SDO download request to...
#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_PDO_COBID_FRAME
The bit in the PDO COB-ID specifying whether to use an 11-bit (0) or 29-bit (1) CAN-ID.
void SetUploadFile(uint16_t idx, uint8_t subidx, const char *filename)
Sets the value of the UploadFile attribute of a sub-object, if present.
#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.
A mutex wrapper that provides a convenient RAII-style mechanism for releasing a mutex for the duratio...
int co_type_is_basic(co_unsigned16_t type)
Returns 1 if the specified (static) data type is a basic type, and 0 if not.
An opaque CANopen sub-object type.
#define CO_DEFTYPE_UNICODE_STRING
The data type (and object index) of an array of (16-bit) Unicode characters.
SdoErrc
The SDO abort codes.
typename ::std::enable_if< detail::is_canopen_type< T >::value, T >::type Read(uint16_t idx, uint8_t subidx) const
Submits an SDO upload request to the local object dictionary.
This header file is part of the CANopen library; it contains the C++ interface of the object dictiona...
#define CO_PDO_COBID_VALID
The bit in the PDO COB-ID specifying whether the PDO exists and is valid.
An abstract interface conforming to the BasicLockable concept.
int get_errc(void)
Returns the last (thread-specific) native error code set by a system call or library function...
void SetEvent(uint16_t idx, uint8_t subidx)
Checks if the specified sub-object in the local object dictionary can be mapped into a PDO and...
const ::std::type_info & Type(uint16_t idx, uint8_t subidx) const
Returns the type of a sub-object.
void WriteEvent(uint16_t idx, uint8_t subidx)
Checks if the specified sub-object in the local object dictionary can be mapped into a PDO and...
#define CO_DEFTYPE_UNSIGNED8
The data type (and object index) of an 8-bit unsigned integer.
void lock() override
Blocks until a lock can be obtained for the current execution agent (thread, process, task).
typename ::std::enable_if< detail::is_canopen_basic< T >::value, T >::type TpdoGet(uint8_t id, uint16_t idx, uint8_t subidx) const
Reads the value of a TPDO-mapped sub-object in the local object dictionary that will be written to an...
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.
typename ::std::enable_if< detail::is_canopen_type< T >::value, T >::type Get(uint16_t idx, uint8_t subidx) const
Reads the value of a sub-object.
#define CO_DEFTYPE_OCTET_STRING
The data type (and object index) of an array of octets.
This header file is part of the utilities library; it contains C++ convenience functions for creating...
void unlock() override
Releases the lock held by the execution agent. Throws no exceptions.
Object cannot be mapped to the PDO.
typename ::std::enable_if< detail::is_canopen_basic< T >::value >::type Write(uint16_t idx, uint8_t subidx, T value)
Submits an SDO download request to the local object dictionary.
#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...
virtual void unlock()=0
Releases the lock held by the execution agent. Throws no exceptions.
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.
The internal implementation of the CANopen device description.
const char * GetUploadFile(uint16_t idx, uint8_t subidx) const
Returns the value of the UploadFile attribute of a sub-object, if present.
::std::error_code make_error_code(SdoErrc e) noexcept
Creates an error code corresponding to an SDO abort code.
CODev * dev() const noexcept
Returns a pointer to the internal CANopen device from <lely/co/dev.hpp>.
typename ::std::enable_if< detail::is_canopen_basic< T >::value, T >::type RpdoRead(uint8_t id, uint16_t idx, uint8_t subidx) const
Reads the value of a sub-object in a remote object dictionary by submitting an SDO upload request to ...
const char * GetDownloadFile(uint16_t idx, uint8_t subidx) const
Returns the value of the DownloadFile attribute of a sub-object, if present.
The CANopen device description.
This header file is part of the CANopen library; it contains the C++ interface of the Client-SDO decl...
bool is_canopen_same(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...
::std::unique_ptr< T, delete_c_type< T > > unique_c_ptr
A specialization of std::unique_ptr for trivial, standard layout or incomplete C types, using lely::delete_c_type as the deleter.
#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.
void SetDownloadFile(uint16_t idx, uint8_t subidx, const char *filename)
Sets the value of the DownloadFile attribute of a sub-object, if present.
Device(const ::std::string &dcf_txt, const ::std::string &dcf_bin="", uint8_t id=0xff, util::BasicLockable *mutex=nullptr)
Creates a new CANopen device description.
#define CO_DEFTYPE_BOOLEAN
The data type (and object index) of a boolean truth value.
typename ::std::enable_if< detail::is_canopen_basic< T >::value, T >::type RpdoGet(uint8_t id, uint16_t idx, uint8_t subidx) const
Reads the value of a sub-object in a remote object dictionary by reading the corresponding PDO-mapped...
void TpdoSetEvent(uint8_t id, uint16_t idx, uint8_t subidx)
Triggers the transmission of every event-driven, asynchronous Transmit-PDO which is mapped into the s...
This header file is part of the CANopen library; it contains the Process Data Object (PDO) declaratio...