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>;
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>;
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);
inline ::std::shared_ptr< T > make_shared_c(Args &&... args)
Creates an instance of a trivial, standard layout or incomplete C type and wraps it in a std::shared_...
An opaque CAN network interface type.
An opaque CANopen Client-SDO service type.
An opaque CANopen device type.
Sdo()
Default-constructs an invalid Client-SDO queue.
bool Abort(detail::SdoRequestBase &req)
Aborts a pending SDO request.
void Submit(detail::SdoRequestBase &req)
Queues an LSS request.
bool Cancel(detail::SdoRequestBase &req, SdoErrc ac)
Cancels a pending SDO request.
~Sdo()
Destructs the Client-SDO queue.
::std::size_t AbortAll()
Aborts all pending SDO requests.
::std::size_t CancelAll(SdoErrc ac)
Cancels all pending SDO requests and stops the ongoing request, if any.
This is the internal header file of the C++ CANopen application library.
This header file is part of the CANopen library; it contains the C++ interface of the Client-SDO decl...
int get_errc(void)
Returns the last (thread-specific) native error code set by a system call or library function.
void set_errc(int errc)
Sets the current (thread-specific) native error code to errc.
int to_sdo_timeout(const ::std::chrono::duration< Rep, Period > &d)
Converts a duration to an SDO timeout.
SdoErrc
The SDO abort codes.
@ NO_SDO
Resource not available: SDO connection.
::std::error_code make_error_code(SdoErrc e) noexcept
Creates an error code corresponding to an SDO abort code.
This header file is part of the C++ CANopen master library; it contains the Client-SDO queue declarat...
void sllist_init(struct sllist *list)
Initializes a singly-linked list.
struct sllist * sllist_append(struct sllist *dst, struct sllist *src)
Appends the singly-linked list at src to the one at dst.
void sllist_push_front(struct sllist *list, struct slnode *node)
Pushes a node to the front of a singly-linked list.
struct slnode * sllist_remove(struct sllist *list, struct slnode *node)
Removes a node from a singly-linked list.
void sllist_push_back(struct sllist *list, struct slnode *node)
Pushes a node to the back of a singly-linked list.
int sllist_empty(const struct sllist *list)
Returns 1 if the singly-linked list is empty, and 0 if not.
struct slnode * sllist_pop_front(struct sllist *list)
Pops a node from the front of a singly-linked list.
struct slnode * sllist_first(const struct sllist *list)
Returns a pointer to the first node in a singly-linked list.
The internal implementation of the Client-SDO queue.
A node in a singly-linked list.
size_t ev_task_queue_abort(struct sllist *queue)
Aborts the tasks in queue by invoking ev_exec_on_task_fini() for each of them.
struct ev_task * ev_task_from_node(struct slnode *node)
Converts a pointer to a node in a queue to the address of the task containing the node.