26 #if !LELY_NO_COAPP_SLAVE
50 netid()
const noexcept {
63 static constexpr uint32_t Key(uint16_t idx, uint8_t subidx) noexcept;
64 static uint32_t Key(
const co_sub_t* sub) noexcept;
73 ::std::function<void(
bool)> on_life_guarding;
78 const ::std::string& dcf_bin, uint8_t
id)
79 :
Node(exec, timer, chan, dcf_txt, dcf_bin, id),
82 BasicSlave::~BasicSlave() =
default;
85 typename ::std::enable_if<is_canopen<T>::value>::type
87 ::std::function<OnReadSignature<T>> ind) {
89 OnRead<T>(idx, subidx, ::std::move(ind), ec);
90 if (ec)
throw SdoError(impl_->id(), idx, subidx, ec);
95 template <
class T,
class F>
98 using traits = canopen_traits<T>;
99 using c_type =
typename traits::c_type;
108 auto value = traits::from_c_type(*pval);
111 ac =
static_cast<uint32_t
>(ec.value());
114 auto val = traits::to_c_type(value, ec);
115 ac =
static_cast<uint32_t
>(ec.value());
117 traits::destroy(val);
126 typename ::std::enable_if<is_canopen<T>::value>::type
128 ::std::function<OnReadSignature<T>> ind,
129 ::std::error_code& ec) {
130 using traits = canopen_traits<T>;
148 auto key = Impl_::Key(sub);
151 return OnUpInd<T>(sub, req, ind);
156 void* data) noexcept -> uint32_t {
157 auto self =
static_cast<Impl_*
>(data);
158 auto it =
self->up_ind.find(self->Key(sub));
159 if (it == self->up_ind.end())
return 0;
160 return it->second(sub, req);
169 typename ::std::enable_if<is_canopen<T>::value>::type
171 uint8_t n = (*this)[idx][0];
172 for (uint8_t i = 1; i <= n; i++) OnRead<T>(idx, i, ind);
176 typename ::std::enable_if<is_canopen<T>::value>::type
178 ::std::error_code& ec) {
179 uint8_t n = (*this)[idx][0].Get<uint8_t>(ec);
180 for (uint8_t i = 1; i <= n && !ec; i++) OnRead<T>(idx, i, ind, ec);
184 typename ::std::enable_if<is_canopen<T>::value>::type
186 ::std::function<OnWriteSignature<T>> ind) {
187 ::std::error_code ec;
188 OnWrite<T>(idx, subidx, ::std::move(ind), ec);
189 if (ec)
throw SdoError(impl_->id(), idx, subidx, ec);
194 template <
class T,
class F>
195 typename ::std::enable_if<is_canopen_basic<T>::value, uint32_t>::type
197 using traits = canopen_traits<T>;
198 using c_type =
typename traits::c_type;
211 ac =
static_cast<uint32_t
>(ec.value());
216 traits::destroy(val);
220 template <
class T,
class F>
221 typename ::std::enable_if<!is_canopen_basic<T>::value, uint32_t>::type
223 using traits = canopen_traits<T>;
224 using c_type =
typename traits::c_type;
234 auto value = traits::from_c_type(val);
238 traits::destroy(val);
239 val = traits::to_c_type(value, ec);
241 ac =
static_cast<uint32_t
>(ec.value());
246 traits::destroy(val);
253 typename ::std::enable_if<is_canopen<T>::value>::type
255 ::std::function<OnWriteSignature<T>> ind,
256 ::std::error_code& ec) {
257 using traits = canopen_traits<T>;
275 auto key = Impl_::Key(sub);
278 return OnDnInd<T>(sub, req, ind);
283 auto self =
static_cast<Impl_*
>(data);
284 auto it =
self->dn_ind.find(self->Key(sub));
285 if (it == self->dn_ind.end())
return 0;
286 return it->second(sub, req);
295 typename ::std::enable_if<is_canopen<T>::value>::type
297 uint8_t n = (*this)[idx][0];
298 for (uint8_t i = 1; i <= n; i++) OnWrite<T>(idx, i, ind);
302 typename ::std::enable_if<is_canopen<T>::value>::type
304 ::std::error_code& ec) {
305 uint8_t n = (*this)[idx][0].Get<uint8_t>(ec);
306 for (uint8_t i = 1; i <= n && !ec; i++) OnWrite<T>(idx, i, ind, ec);
309 #ifndef DOXYGEN_SHOULD_SKIP_THIS
312 template void BasicSlave::OnRead<bool>(uint16_t, uint8_t,
313 ::std::function<OnReadSignature<bool>>);
314 template void BasicSlave::OnRead<bool>(uint16_t, uint8_t,
315 ::std::function<OnReadSignature<bool>>,
317 template void BasicSlave::OnRead<bool>(uint16_t,
318 ::std::function<OnReadSignature<bool>>);
319 template void BasicSlave::OnRead<bool>(uint16_t,
320 ::std::function<OnReadSignature<bool>>,
322 template void BasicSlave::OnWrite<bool>(
323 uint16_t, uint8_t, ::std::function<OnWriteSignature<bool>>);
324 template void BasicSlave::OnWrite<bool>(uint16_t, uint8_t,
325 ::std::function<OnWriteSignature<bool>>,
327 template void BasicSlave::OnWrite<bool>(
328 uint16_t, ::std::function<OnWriteSignature<bool>>);
329 template void BasicSlave::OnWrite<bool>(uint16_t,
330 ::std::function<OnWriteSignature<bool>>,
334 template void BasicSlave::OnRead<int8_t>(
335 uint16_t, uint8_t, ::std::function<OnReadSignature<int8_t>>);
336 template void BasicSlave::OnRead<int8_t>(
337 uint16_t, uint8_t, ::std::function<OnReadSignature<int8_t>>,
339 template void BasicSlave::OnRead<int8_t>(
340 uint16_t, ::std::function<OnReadSignature<int8_t>>);
341 template void BasicSlave::OnRead<int8_t>(
342 uint16_t, ::std::function<OnReadSignature<int8_t>>, ::std::error_code&);
343 template void BasicSlave::OnWrite<int8_t>(
344 uint16_t, uint8_t, ::std::function<OnWriteSignature<int8_t>>);
345 template void BasicSlave::OnWrite<int8_t>(
346 uint16_t, uint8_t, ::std::function<OnWriteSignature<int8_t>>,
348 template void BasicSlave::OnWrite<int8_t>(
349 uint16_t, ::std::function<OnWriteSignature<int8_t>>);
350 template void BasicSlave::OnWrite<int8_t>(
351 uint16_t, ::std::function<OnWriteSignature<int8_t>>, ::std::error_code&);
354 template void BasicSlave::OnRead<int16_t>(
355 uint16_t, uint8_t, ::std::function<OnReadSignature<int16_t>>);
356 template void BasicSlave::OnRead<int16_t>(
357 uint16_t, uint8_t, ::std::function<OnReadSignature<int16_t>>,
359 template void BasicSlave::OnRead<int16_t>(
360 uint16_t, ::std::function<OnReadSignature<int16_t>>);
361 template void BasicSlave::OnRead<int16_t>(
362 uint16_t, ::std::function<OnReadSignature<int16_t>>, ::std::error_code&);
363 template void BasicSlave::OnWrite<int16_t>(
364 uint16_t, uint8_t, ::std::function<OnWriteSignature<int16_t>>);
365 template void BasicSlave::OnWrite<int16_t>(
366 uint16_t, uint8_t, ::std::function<OnWriteSignature<int16_t>>,
368 template void BasicSlave::OnWrite<int16_t>(
369 uint16_t, ::std::function<OnWriteSignature<int16_t>>);
370 template void BasicSlave::OnWrite<int16_t>(
371 uint16_t, ::std::function<OnWriteSignature<int16_t>>, ::std::error_code&);
374 template void BasicSlave::OnRead<int32_t>(
375 uint16_t, uint8_t, ::std::function<OnReadSignature<int32_t>>);
376 template void BasicSlave::OnRead<int32_t>(
377 uint16_t, uint8_t, ::std::function<OnReadSignature<int32_t>>,
379 template void BasicSlave::OnRead<int32_t>(
380 uint16_t, ::std::function<OnReadSignature<int32_t>>);
381 template void BasicSlave::OnRead<int32_t>(
382 uint16_t, ::std::function<OnReadSignature<int32_t>>, ::std::error_code&);
383 template void BasicSlave::OnWrite<int32_t>(
384 uint16_t, uint8_t, ::std::function<OnWriteSignature<int32_t>>);
385 template void BasicSlave::OnWrite<int32_t>(
386 uint16_t, uint8_t, ::std::function<OnWriteSignature<int32_t>>,
388 template void BasicSlave::OnWrite<int32_t>(
389 uint16_t, ::std::function<OnWriteSignature<int32_t>>);
390 template void BasicSlave::OnWrite<int32_t>(
391 uint16_t, ::std::function<OnWriteSignature<int32_t>>, ::std::error_code&);
394 template void BasicSlave::OnRead<uint8_t>(
395 uint16_t, uint8_t, ::std::function<OnReadSignature<uint8_t>>);
396 template void BasicSlave::OnRead<uint8_t>(
397 uint16_t, uint8_t, ::std::function<OnReadSignature<uint8_t>>,
399 template void BasicSlave::OnRead<uint8_t>(
400 uint16_t, ::std::function<OnReadSignature<uint8_t>>);
401 template void BasicSlave::OnRead<uint8_t>(
402 uint16_t, ::std::function<OnReadSignature<uint8_t>>, ::std::error_code&);
403 template void BasicSlave::OnWrite<uint8_t>(
404 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint8_t>>);
405 template void BasicSlave::OnWrite<uint8_t>(
406 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint8_t>>,
408 template void BasicSlave::OnWrite<uint8_t>(
409 uint16_t, ::std::function<OnWriteSignature<uint8_t>>);
410 template void BasicSlave::OnWrite<uint8_t>(
411 uint16_t, ::std::function<OnWriteSignature<uint8_t>>, ::std::error_code&);
414 template void BasicSlave::OnRead<uint16_t>(
415 uint16_t, uint8_t, ::std::function<OnReadSignature<uint16_t>>);
416 template void BasicSlave::OnRead<uint16_t>(
417 uint16_t, uint8_t, ::std::function<OnReadSignature<uint16_t>>,
419 template void BasicSlave::OnRead<uint16_t>(
420 uint16_t, ::std::function<OnReadSignature<uint16_t>>);
421 template void BasicSlave::OnRead<uint16_t>(
422 uint16_t, ::std::function<OnReadSignature<uint16_t>>, ::std::error_code&);
423 template void BasicSlave::OnWrite<uint16_t>(
424 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint16_t>>);
425 template void BasicSlave::OnWrite<uint16_t>(
426 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint16_t>>,
428 template void BasicSlave::OnWrite<uint16_t>(
429 uint16_t, ::std::function<OnWriteSignature<uint16_t>>);
430 template void BasicSlave::OnWrite<uint16_t>(
431 uint16_t, ::std::function<OnWriteSignature<uint16_t>>, ::std::error_code&);
434 template void BasicSlave::OnRead<uint32_t>(
435 uint16_t, uint8_t, ::std::function<OnReadSignature<uint32_t>>);
436 template void BasicSlave::OnRead<uint32_t>(
437 uint16_t, uint8_t, ::std::function<OnReadSignature<uint32_t>>,
439 template void BasicSlave::OnRead<uint32_t>(
440 uint16_t, ::std::function<OnReadSignature<uint32_t>>);
441 template void BasicSlave::OnRead<uint32_t>(
442 uint16_t, ::std::function<OnReadSignature<uint32_t>>, ::std::error_code&);
443 template void BasicSlave::OnWrite<uint32_t>(
444 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint32_t>>);
445 template void BasicSlave::OnWrite<uint32_t>(
446 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint32_t>>,
448 template void BasicSlave::OnWrite<uint32_t>(
449 uint16_t, ::std::function<OnWriteSignature<uint32_t>>);
450 template void BasicSlave::OnWrite<uint32_t>(
451 uint16_t, ::std::function<OnWriteSignature<uint32_t>>, ::std::error_code&);
454 template void BasicSlave::OnRead<float>(
455 uint16_t, uint8_t, ::std::function<OnReadSignature<float>>);
456 template void BasicSlave::OnRead<float>(uint16_t, uint8_t,
457 ::std::function<OnReadSignature<float>>,
459 template void BasicSlave::OnRead<float>(
460 uint16_t, ::std::function<OnReadSignature<float>>);
461 template void BasicSlave::OnRead<float>(uint16_t,
462 ::std::function<OnReadSignature<float>>,
464 template void BasicSlave::OnWrite<float>(
465 uint16_t, uint8_t, ::std::function<OnWriteSignature<float>>);
466 template void BasicSlave::OnWrite<float>(
467 uint16_t, uint8_t, ::std::function<OnWriteSignature<float>>,
469 template void BasicSlave::OnWrite<float>(
470 uint16_t, ::std::function<OnWriteSignature<float>>);
471 template void BasicSlave::OnWrite<float>(
472 uint16_t, ::std::function<OnWriteSignature<float>>, ::std::error_code&);
475 template void BasicSlave::OnRead<::std::string>(
476 uint16_t, uint8_t, ::std::function<OnReadSignature<::std::string>>);
477 template void BasicSlave::OnRead<::std::string>(
478 uint16_t, uint8_t, ::std::function<OnReadSignature<::std::string>>,
480 template void BasicSlave::OnRead<::std::string>(
481 uint16_t, ::std::function<OnReadSignature<::std::string>>);
482 template void BasicSlave::OnRead<::std::string>(
483 uint16_t, ::std::function<OnReadSignature<::std::string>>,
485 template void BasicSlave::OnWrite<::std::string>(
486 uint16_t, uint8_t, ::std::function<OnWriteSignature<::std::string>>);
487 template void BasicSlave::OnWrite<::std::string>(
488 uint16_t, uint8_t, ::std::function<OnWriteSignature<::std::string>>,
490 template void BasicSlave::OnWrite<::std::string>(
491 uint16_t, ::std::function<OnWriteSignature<::std::string>>);
492 template void BasicSlave::OnWrite<::std::string>(
493 uint16_t, ::std::function<OnWriteSignature<::std::string>>,
497 template void BasicSlave::OnRead<::std::vector<uint8_t>>(
499 ::std::function<OnReadSignature<::std::vector<uint8_t>>>);
500 template void BasicSlave::OnRead<::std::vector<uint8_t>>(
501 uint16_t, uint8_t, ::std::function<OnReadSignature<::std::vector<uint8_t>>>,
503 template void BasicSlave::OnRead<::std::vector<uint8_t>>(
504 uint16_t, ::std::function<OnReadSignature<::std::vector<uint8_t>>>);
505 template void BasicSlave::OnRead<::std::vector<uint8_t>>(
506 uint16_t, ::std::function<OnReadSignature<::std::vector<uint8_t>>>,
508 template void BasicSlave::OnWrite<::std::vector<uint8_t>>(
510 ::std::function<OnWriteSignature<::std::vector<uint8_t>>>);
511 template void BasicSlave::OnWrite<::std::vector<uint8_t>>(
513 ::std::function<OnWriteSignature<::std::vector<uint8_t>>>,
515 template void BasicSlave::OnWrite<::std::vector<uint8_t>>(
516 uint16_t, ::std::function<OnWriteSignature<::std::vector<uint8_t>>>);
517 template void BasicSlave::OnWrite<::std::vector<uint8_t>>(
518 uint16_t, ::std::function<OnWriteSignature<::std::vector<uint8_t>>>,
522 template void BasicSlave::OnRead<::std::basic_string<char16_t>>(
524 ::std::function<OnReadSignature<::std::basic_string<char16_t>>>);
525 template void BasicSlave::OnRead<::std::basic_string<char16_t>>(
527 ::std::function<OnReadSignature<::std::basic_string<char16_t>>>,
529 template void BasicSlave::OnRead<::std::basic_string<char16_t>>(
530 uint16_t, ::std::function<OnReadSignature<::std::basic_string<char16_t>>>);
531 template void BasicSlave::OnRead<::std::basic_string<char16_t>>(
532 uint16_t, ::std::function<OnReadSignature<::std::basic_string<char16_t>>>,
534 template void BasicSlave::OnWrite<::std::basic_string<char16_t>>(
536 ::std::function<OnWriteSignature<::std::basic_string<char16_t>>>);
537 template void BasicSlave::OnWrite<::std::basic_string<char16_t>>(
539 ::std::function<OnWriteSignature<::std::basic_string<char16_t>>>,
541 template void BasicSlave::OnWrite<::std::basic_string<char16_t>>(
542 uint16_t, ::std::function<OnWriteSignature<::std::basic_string<char16_t>>>);
543 template void BasicSlave::OnWrite<::std::basic_string<char16_t>>(
544 uint16_t, ::std::function<OnWriteSignature<::std::basic_string<char16_t>>>,
553 template void BasicSlave::OnRead<double>(
554 uint16_t, uint8_t, ::std::function<OnReadSignature<double>>);
555 template void BasicSlave::OnRead<double>(
556 uint16_t, uint8_t, ::std::function<OnReadSignature<double>>,
558 template void BasicSlave::OnRead<double>(
559 uint16_t, ::std::function<OnReadSignature<double>>);
560 template void BasicSlave::OnRead<double>(
561 uint16_t, ::std::function<OnReadSignature<double>>, ::std::error_code&);
562 template void BasicSlave::OnWrite<double>(
563 uint16_t, uint8_t, ::std::function<OnWriteSignature<double>>);
564 template void BasicSlave::OnWrite<double>(
565 uint16_t, uint8_t, ::std::function<OnWriteSignature<double>>,
567 template void BasicSlave::OnWrite<double>(
568 uint16_t, ::std::function<OnWriteSignature<double>>);
569 template void BasicSlave::OnWrite<double>(
570 uint16_t, ::std::function<OnWriteSignature<double>>, ::std::error_code&);
577 template void BasicSlave::OnRead<int64_t>(
578 uint16_t, uint8_t, ::std::function<OnReadSignature<int64_t>>);
579 template void BasicSlave::OnRead<int64_t>(
580 uint16_t, uint8_t, ::std::function<OnReadSignature<int64_t>>,
582 template void BasicSlave::OnRead<int64_t>(
583 uint16_t, ::std::function<OnReadSignature<int64_t>>);
584 template void BasicSlave::OnRead<int64_t>(
585 uint16_t, ::std::function<OnReadSignature<int64_t>>, ::std::error_code&);
586 template void BasicSlave::OnWrite<int64_t>(
587 uint16_t, uint8_t, ::std::function<OnWriteSignature<int64_t>>);
588 template void BasicSlave::OnWrite<int64_t>(
589 uint16_t, uint8_t, ::std::function<OnWriteSignature<int64_t>>,
591 template void BasicSlave::OnWrite<int64_t>(
592 uint16_t, ::std::function<OnWriteSignature<int64_t>>);
593 template void BasicSlave::OnWrite<int64_t>(
594 uint16_t, ::std::function<OnWriteSignature<int64_t>>, ::std::error_code&);
602 template void BasicSlave::OnRead<uint64_t>(
603 uint16_t, uint8_t, ::std::function<OnReadSignature<uint64_t>>);
604 template void BasicSlave::OnRead<uint64_t>(
605 uint16_t, uint8_t, ::std::function<OnReadSignature<uint64_t>>,
607 template void BasicSlave::OnRead<uint64_t>(
608 uint16_t, ::std::function<OnReadSignature<uint64_t>>);
609 template void BasicSlave::OnRead<uint64_t>(
610 uint16_t, ::std::function<OnReadSignature<uint64_t>>, ::std::error_code&);
611 template void BasicSlave::OnWrite<uint64_t>(
612 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint64_t>>);
613 template void BasicSlave::OnWrite<uint64_t>(
614 uint16_t, uint8_t, ::std::function<OnWriteSignature<uint64_t>>,
616 template void BasicSlave::OnWrite<uint64_t>(
617 uint16_t, ::std::function<OnWriteSignature<uint64_t>>);
618 template void BasicSlave::OnWrite<uint64_t>(
619 uint16_t, ::std::function<OnWriteSignature<uint64_t>>, ::std::error_code&);
621 #endif // DOXYGEN_SHOULD_SKIP_THIS
625 ::std::lock_guard<util::BasicLockable>
lock(*
this);
626 impl_->on_life_guarding = on_life_guarding;
635 [](
co_nmt_t*
nmt,
int state,
void* data) noexcept {
636 static_cast<Impl_*
>(data)->OnLgInd(
nmt, state);
644 BasicSlave::Impl_::OnLgInd(
co_nmt_t* nmt,
int state) noexcept {
649 self->OnLifeGuarding(occurred);
650 if (on_life_guarding) {
651 auto f = on_life_guarding;
652 util::UnlockGuard<util::BasicLockable> unlock(*
self);
659 BasicSlave::Impl_::Key(uint16_t idx, uint8_t subidx) noexcept {
660 return (uint32_t(idx) << 8) | subidx;
664 BasicSlave::Impl_::Key(
const co_sub_t* sub) noexcept {
674 #endif // !LELY_NO_COAPP_SLAVE