65 void OnDnCon(
__co_csdo*, uint16_t idx, uint8_t subidx, uint32_t ac) noexcept;
67 void OnUpCon(
__co_csdo*, uint16_t idx, uint8_t subidx, uint32_t ac,
68 const void* ptr,
size_t n) noexcept;
72 ::std::shared_ptr<__co_csdo> sdo;
91 util::throw_errc(
"ReadFile");
99 SdoDownloadDcfRequestBase::~SdoDownloadDcfRequestBase() {
105 SdoDownloadRequestWrapper<T>::operator()() noexcept {
107 auto idx = this->idx;
108 auto subidx = this->subidx;
110 ::std::function<Signature> con;
111 con.swap(this->con_);
113 if (con) con(
id, idx, subidx, ec);
118 SdoDownloadRequestWrapper<T>::OnRequest(
void* data) noexcept {
122 static_cast<Sdo::Impl_*
>(data)->OnDownload(*
this);
127 SdoDownloadDcfRequestWrapper::operator()() noexcept {
132 ::std::function<Signature> con;
133 con.swap(this->con_);
139 SdoDownloadDcfRequestWrapper::OnRequest(
void* data) noexcept {
143 static_cast<Sdo::Impl_*
>(data)->OnDownloadDcf(*
this);
149 SdoUploadRequestWrapper<T>::operator()() noexcept {
151 auto idx = this->idx;
152 auto subidx = this->subidx;
154 T value = ::std::move(this->value);
155 ::std::function<Signature> con;
156 con.swap(this->con_);
158 if (con) con(
id, idx, subidx, ec, ::std::move(value));
163 SdoUploadRequestWrapper<T>::OnRequest(
void* data) noexcept {
167 static_cast<Sdo::Impl_*
>(data)->OnUpload(*
this);
171 #ifndef DOXYGEN_SHOULD_SKIP_THIS
174 template class SdoDownloadRequestWrapper<bool>;
175 template class SdoUploadRequestWrapper<bool>;
178 template class SdoDownloadRequestWrapper<int8_t>;
179 template class SdoUploadRequestWrapper<int8_t>;
182 template class SdoDownloadRequestWrapper<int16_t>;
183 template class SdoUploadRequestWrapper<int16_t>;
186 template class SdoDownloadRequestWrapper<int32_t>;
187 template class SdoUploadRequestWrapper<int32_t>;
190 template class SdoDownloadRequestWrapper<uint8_t>;
191 template class SdoUploadRequestWrapper<uint8_t>;
194 template class SdoDownloadRequestWrapper<uint16_t>;
195 template class SdoUploadRequestWrapper<uint16_t>;
198 template class SdoDownloadRequestWrapper<uint32_t>;
199 template class SdoUploadRequestWrapper<uint32_t>;
202 template class SdoDownloadRequestWrapper<float>;
203 template class SdoUploadRequestWrapper<float>;
206 template class SdoDownloadRequestWrapper<::std::string>;
207 template class SdoUploadRequestWrapper<::std::string>;
210 template class SdoDownloadRequestWrapper<::std::vector<uint8_t>>;
211 template class SdoUploadRequestWrapper<::std::vector<uint8_t>>;
214 template class SdoDownloadRequestWrapper<::std::basic_string<char16_t>>;
215 template class SdoUploadRequestWrapper<::std::basic_string<char16_t>>;
223 template class SdoDownloadRequestWrapper<double>;
224 template class SdoUploadRequestWrapper<double>;
231 template class SdoDownloadRequestWrapper<int64_t>;
232 template class SdoUploadRequestWrapper<int64_t>;
240 template class SdoDownloadRequestWrapper<uint64_t>;
241 template class SdoUploadRequestWrapper<uint64_t>;
243 #endif // !DOXYGEN_SHOULD_SKIP_THIS
249 SdoDownloadRequest<T>::operator()() noexcept {
250 if (con_) con_(this->
id, this->idx, this->subidx, this->ec);
255 SdoDownloadRequest<T>::OnRequest(
void* data) noexcept {
259 static_cast<Sdo::Impl_*
>(data)->OnDownload(*
this);
264 SdoDownloadDcfRequest::operator()() noexcept {
265 if (con_) con_(this->
id, this->
idx, this->
subidx, this->
ec);
269 SdoDownloadDcfRequest::OnRequest(
void* data) noexcept {
273 static_cast<Sdo::Impl_*
>(data)->OnDownloadDcf(*
this);
279 SdoUploadRequest<T>::operator()() noexcept {
281 con_(this->
id, this->idx, this->subidx, this->ec, ::std::move(this->value));
286 SdoUploadRequest<T>::OnRequest(
void* data) noexcept {
290 static_cast<Sdo::Impl_*
>(data)->OnUpload(*
this);
294 #ifndef DOXYGEN_SHOULD_SKIP_THIS
297 template class SdoDownloadRequest<bool>;
298 template class SdoUploadRequest<bool>;
301 template class SdoDownloadRequest<int8_t>;
302 template class SdoUploadRequest<int8_t>;
305 template class SdoDownloadRequest<int16_t>;
306 template class SdoUploadRequest<int16_t>;
309 template class SdoDownloadRequest<int32_t>;
310 template class SdoUploadRequest<int32_t>;
313 template class SdoDownloadRequest<uint8_t>;
314 template class SdoUploadRequest<uint8_t>;
317 template class SdoDownloadRequest<uint16_t>;
318 template class SdoUploadRequest<uint16_t>;
321 template class SdoDownloadRequest<uint32_t>;
322 template class SdoUploadRequest<uint32_t>;
325 template class SdoDownloadRequest<float>;
326 template class SdoUploadRequest<float>;
329 template class SdoDownloadRequest<::std::string>;
330 template class SdoUploadRequest<::std::string>;
333 template class SdoDownloadRequest<::std::vector<uint8_t>>;
334 template class SdoUploadRequest<::std::vector<uint8_t>>;
337 template class SdoDownloadRequest<::std::basic_string<char16_t>>;
338 template class SdoUploadRequest<::std::basic_string<char16_t>>;
346 template class SdoDownloadRequest<double>;
347 template class SdoUploadRequest<double>;
354 template class SdoDownloadRequest<int64_t>;
355 template class SdoUploadRequest<int64_t>;
363 template class SdoDownloadRequest<uint64_t>;
364 template class SdoUploadRequest<uint64_t>;
366 #endif // !DOXYGEN_SHOULD_SKIP_THIS
373 : impl_(new
Impl_(net, dev, num)) {}
377 : impl_(
new Impl_(sdo, 0))
384 Sdo& Sdo::operator=(
Sdo&&) =
default;
390 const ::std::chrono::milliseconds& timeout) {
394 [p](uint8_t
id, uint16_t idx, uint8_t subidx,
395 ::std::error_code ec)
mutable {
400 p.
set(util::success());
408 const ::std::chrono::milliseconds& timeout) {
412 [p](uint8_t
id, uint16_t idx, uint8_t subidx,
413 ::std::error_code ec)
mutable {
418 p.
set(util::success());
431 return impl_->Cancel(&req, ac) != 0;
436 return impl_->Cancel(
nullptr, ac);
441 return impl_->Abort(&req) != 0;
446 return impl_->Abort(
nullptr);
462 Sdo::Impl_::Impl_(
__co_csdo* sdo_,
int timeout)
477 Sdo::Impl_::Submit(detail::SdoRequestBase& req) {
479 ev::Executor exec(req.exec);
494 if (first) req.OnRequest(
this);
500 Sdo::Impl_::Cancel(detail::SdoRequestBase* req,
SdoErrc ac) {
521 auto exec = req->GetExecutor();
525 n += n < ::std::numeric_limits<::std::size_t>::max();
532 Sdo::Impl_::Abort(detail::SdoRequestBase* req) {
551 Sdo::Impl_::Pop(detail::SdoRequestBase* req,
sllist& queue) {
566 return req !=
nullptr;
571 Sdo::Impl_::OnDownload(detail::SdoDownloadRequestBase<T>& req) noexcept {
574 using traits = canopen_traits<T>;
576 auto val = traits::to_c_type(req.value, req.ec);
585 auto con = [](
__co_csdo* sdo, uint16_t idx, uint8_t subidx, uint32_t ac,
586 void* data) noexcept {
587 static_cast<Impl_*
>(data)->OnDnCon(sdo, idx, subidx, ac);
589 int result = req.block
591 traits::index, &val, con,
this)
593 traits::index, &val, con, this);
600 traits::destroy(val);
605 Sdo::Impl_::OnDownloadDcf(detail::SdoDownloadDcfRequestBase& req) noexcept {
613 sdo.get(), req.begin, req.end,
614 [](
__co_csdo* sdo, uint16_t idx, uint8_t subidx, uint32_t ac,
615 void* data) noexcept {
616 static_cast<Impl_*>(data)->OnDnCon(sdo, idx, subidx, ac);
628 Sdo::Impl_::OnUpload(detail::SdoUploadRequestBase<T>& req) noexcept {
636 auto con = [](
__co_csdo* sdo, uint16_t idx, uint8_t subidx, uint32_t ac,
637 const void* ptr,
size_t n,
void* data) noexcept {
638 static_cast<Impl_*
>(data)->OnUpCon<T>(sdo, idx, subidx, ac, ptr, n);
653 Sdo::Impl_::OnDnCon(
__co_csdo*, uint16_t idx, uint8_t subidx,
654 uint32_t ac) noexcept {
657 auto req =
static_cast<detail::SdoRequestBase*
>(task);
660 req->subidx = subidx;
668 Sdo::Impl_::OnUpCon(
__co_csdo*, uint16_t idx, uint8_t subidx, uint32_t ac,
669 const void* ptr,
size_t n) noexcept {
670 using traits = canopen_traits<T>;
671 using c_type =
typename traits::c_type;
675 auto req =
static_cast<detail::SdoUploadRequestBase<T>*
>(task);
679 ::std::error_code ec;
680 val = traits::construct(ptr, n, ec);
681 if (ec) ac =
static_cast<uint32_t
>(
sdo_errc(ec));
685 req->subidx = subidx;
687 req->value = ac ? T() : traits::from_c_type(val);
689 traits::destroy(val);
695 Sdo::Impl_::OnCompletion(detail::SdoRequestBase& req) noexcept {
699 ev::Executor exec(req.exec);
704 if (task)
static_cast<detail::SdoRequestBase*
>(task)->OnRequest(
this);
707 #endif // !LELY_NO_CO_CSDO