60 void OnDnCon(
COCSDO*, uint16_t idx, uint8_t subidx, uint32_t ac) noexcept;
62 void OnUpCon(
COCSDO*, uint16_t idx, uint8_t subidx, uint32_t ac,
67 ::std::shared_ptr<COCSDO> sdo;
76 SdoDownloadRequestWrapper<T>::operator()() noexcept {
79 auto subidx = this->subidx;
81 ::std::function<Signature> con;
84 if (con) con(
id, idx, subidx, ec);
89 SdoDownloadRequestWrapper<T>::OnRequest(
void* data) noexcept {
90 static_cast<Sdo::Impl_*
>(data)->OnDownload(*
this);
95 SdoUploadRequestWrapper<T>::operator()() noexcept {
98 auto subidx = this->subidx;
100 T value = ::std::move(this->value);
101 ::std::function<Signature> con;
102 con.swap(this->con_);
104 if (con) con(
id, idx, subidx, ec, ::std::move(value));
109 SdoUploadRequestWrapper<T>::OnRequest(
void* data) noexcept {
110 static_cast<Sdo::Impl_*
>(data)->OnUpload(*
this);
113 #ifndef DOXYGEN_SHOULD_SKIP_THIS
116 template class SdoDownloadRequestWrapper<bool>;
117 template class SdoUploadRequestWrapper<bool>;
120 template class SdoDownloadRequestWrapper<int8_t>;
121 template class SdoUploadRequestWrapper<int8_t>;
124 template class SdoDownloadRequestWrapper<int16_t>;
125 template class SdoUploadRequestWrapper<int16_t>;
128 template class SdoDownloadRequestWrapper<int32_t>;
129 template class SdoUploadRequestWrapper<int32_t>;
132 template class SdoDownloadRequestWrapper<uint8_t>;
133 template class SdoUploadRequestWrapper<uint8_t>;
136 template class SdoDownloadRequestWrapper<uint16_t>;
137 template class SdoUploadRequestWrapper<uint16_t>;
140 template class SdoDownloadRequestWrapper<uint32_t>;
141 template class SdoUploadRequestWrapper<uint32_t>;
144 template class SdoDownloadRequestWrapper<float>;
145 template class SdoUploadRequestWrapper<float>;
148 template class SdoDownloadRequestWrapper<::std::string>;
149 template class SdoUploadRequestWrapper<::std::string>;
152 template class SdoDownloadRequestWrapper<::std::vector<uint8_t>>;
153 template class SdoUploadRequestWrapper<::std::vector<uint8_t>>;
156 template class SdoDownloadRequestWrapper<::std::basic_string<char16_t>>;
157 template class SdoUploadRequestWrapper<::std::basic_string<char16_t>>;
165 template class SdoDownloadRequestWrapper<double>;
166 template class SdoUploadRequestWrapper<double>;
173 template class SdoDownloadRequestWrapper<int64_t>;
174 template class SdoUploadRequestWrapper<int64_t>;
182 template class SdoDownloadRequestWrapper<uint64_t>;
183 template class SdoUploadRequestWrapper<uint64_t>;
185 #endif // !DOXYGEN_SHOULD_SKIP_THIS
191 SdoDownloadRequest<T>::operator()() noexcept {
192 if (con_) con_(this->
id, this->idx, this->subidx, this->ec);
197 SdoDownloadRequest<T>::OnRequest(
void* data) noexcept {
198 static_cast<Sdo::Impl_*
>(data)->OnDownload(*
this);
203 SdoUploadRequest<T>::operator()() noexcept {
205 con_(this->
id, this->idx, this->subidx, this->ec, ::std::move(this->value));
210 SdoUploadRequest<T>::OnRequest(
void* data) noexcept {
211 static_cast<Sdo::Impl_*
>(data)->OnUpload(*
this);
214 #ifndef DOXYGEN_SHOULD_SKIP_THIS
217 template class SdoDownloadRequest<bool>;
218 template class SdoUploadRequest<bool>;
221 template class SdoDownloadRequest<int8_t>;
222 template class SdoUploadRequest<int8_t>;
225 template class SdoDownloadRequest<int16_t>;
226 template class SdoUploadRequest<int16_t>;
229 template class SdoDownloadRequest<int32_t>;
230 template class SdoUploadRequest<int32_t>;
233 template class SdoDownloadRequest<uint8_t>;
234 template class SdoUploadRequest<uint8_t>;
237 template class SdoDownloadRequest<uint16_t>;
238 template class SdoUploadRequest<uint16_t>;
241 template class SdoDownloadRequest<uint32_t>;
242 template class SdoUploadRequest<uint32_t>;
245 template class SdoDownloadRequest<float>;
246 template class SdoUploadRequest<float>;
249 template class SdoDownloadRequest<::std::string>;
250 template class SdoUploadRequest<::std::string>;
253 template class SdoDownloadRequest<::std::vector<uint8_t>>;
254 template class SdoUploadRequest<::std::vector<uint8_t>>;
257 template class SdoDownloadRequest<::std::basic_string<char16_t>>;
258 template class SdoUploadRequest<::std::basic_string<char16_t>>;
266 template class SdoDownloadRequest<double>;
267 template class SdoUploadRequest<double>;
274 template class SdoDownloadRequest<int64_t>;
275 template class SdoUploadRequest<int64_t>;
283 template class SdoDownloadRequest<uint64_t>;
284 template class SdoUploadRequest<uint64_t>;
286 #endif // !DOXYGEN_SHOULD_SKIP_THIS
293 : impl_(new
Impl_(net, dev, num)) {}
297 Sdo& Sdo::operator=(
Sdo&&) =
default;
308 return impl_->Cancel(&req, ac) != 0;
313 return impl_->Cancel(
nullptr, ac);
318 return impl_->Abort(&req) != 0;
323 return impl_->Abort(
nullptr);
326 Sdo::Impl_::Impl_(
CANNet* net,
CODev* dev, uint8_t num)
331 Sdo::Impl_::Impl_(
COCSDO* sdo_,
int timeout)
332 : sdo(sdo_, [=](
COCSDO* sdo) { sdo->setTimeout(timeout); }) {
339 Sdo::Impl_::Submit(detail::SdoRequestBase& req) {
341 ev::Executor exec(req.exec);
350 req.id = sdo->getPar().id;
353 if (first) req.OnRequest(
this);
358 Sdo::Impl_::Cancel(detail::SdoRequestBase* req,
SdoErrc ac) {
365 sdo->abortReq(
static_cast<uint32_t
>(ac));
373 auto exec = req->GetExecutor();
377 n += n < ::std::numeric_limits<::std::size_t>::max();
383 Sdo::Impl_::Abort(detail::SdoRequestBase* req) {
394 Sdo::Impl_::Pop(detail::SdoRequestBase* req,
sllist& queue) {
409 return req !=
nullptr;
414 Sdo::Impl_::OnDownload(detail::SdoDownloadRequestBase<T>& req) noexcept {
415 constexpr
auto N = co_type_traits_T<T>::index;
422 if (sdo->dnReq<N, Impl_, &Impl_::OnDnCon>(req.idx, req.subidx, req.value,
433 Sdo::Impl_::OnUpload(detail::SdoUploadRequestBase<T>& req) noexcept {
440 if (sdo->upReq<T, Impl_, &Impl_::OnUpCon<T>>(req.idx, req.subidx,
this) ==
450 Sdo::Impl_::OnDnCon(COCSDO*, uint16_t idx, uint8_t subidx,
451 uint32_t ac) noexcept {
454 auto req =
static_cast<detail::SdoRequestBase*
>(task);
457 req->subidx = subidx;
465 Sdo::Impl_::OnUpCon(COCSDO*, uint16_t idx, uint8_t subidx, uint32_t ac,
469 auto req =
static_cast<detail::SdoUploadRequestBase<T>*
>(task);
472 req->subidx = subidx;
474 req->value = ::std::move(value);
480 Sdo::Impl_::OnCompletion(detail::SdoRequestBase& req) noexcept {
484 ev::Executor exec(req.exec);
489 if (task)
static_cast<detail::SdoRequestBase*
>(task)->OnRequest(
this);