22 #ifndef LELY_COAPP_LOGICAL_DRIVER_HPP_
23 #define LELY_COAPP_LOGICAL_DRIVER_HPP_
34 template <
class = BasicDriver>
41 using DriverBase::time_point;
42 using duration = BasicMaster::duration;
51 return driver.GetExecutor();
60 id() const noexcept final {
81 return DeviceType() & 0xffff;
117 return driver.SubmitWait(t, ::std::forward<F>(f));
130 return driver.SubmitWait(d, ::std::forward<F>(f));
143 return driver.AsyncWait(t);
156 return driver.AsyncWait(d);
165 template <
class T,
class F>
168 driver.SubmitRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con));
177 template <
class T,
class F>
179 SubmitRead(uint16_t idx, uint8_t subidx, F&& con, ::std::error_code& ec) {
180 driver.SubmitRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con), ec);
188 template <
class T,
class F>
191 const ::std::chrono::milliseconds& timeout) {
192 driver.SubmitRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con),
211 template <
class T,
class F>
214 const ::std::chrono::milliseconds& timeout,
215 ::std::error_code& ec) {
216 driver.SubmitRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con),
226 template <
class T,
class F>
229 driver.SubmitBlockRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con));
238 template <
class T,
class F>
241 ::std::error_code& ec) {
242 driver.SubmitBlockRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con),
251 template <
class T,
class F>
254 const ::std::chrono::milliseconds& timeout) {
255 driver.SubmitBlockRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con),
278 template <
class T,
class F>
281 const ::std::chrono::milliseconds& timeout,
282 ::std::error_code& ec) {
283 driver.SubmitBlockRead<T>(ObjectIndex(idx), subidx, ::std::forward<F>(con),
293 template <
class T,
class F>
296 driver.SubmitWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
297 ::std::forward<F>(con));
306 template <
class T,
class F>
309 ::std::error_code& ec) {
310 driver.SubmitWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
311 ::std::forward<F>(con), ec);
319 template <
class T,
class F>
322 const ::std::chrono::milliseconds& timeout) {
323 driver.SubmitWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
324 ::std::forward<F>(con), timeout);
343 template <
class T,
class F>
346 const ::std::chrono::milliseconds& timeout,
347 ::std::error_code& ec) {
348 driver.SubmitWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
349 ::std::forward<F>(con), timeout, ec);
358 template <
class T,
class F>
361 driver.SubmitBlockWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
362 ::std::forward<F>(con));
371 template <
class T,
class F>
374 ::std::error_code& ec) {
375 driver.SubmitBlockWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
376 ::std::forward<F>(con), ec);
384 template <
class T,
class F>
387 const ::std::chrono::milliseconds& timeout) {
388 driver.SubmitBlockWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
389 ::std::forward<F>(con), timeout);
412 template <
class T,
class F>
415 const ::std::chrono::milliseconds& timeout,
416 ::std::error_code& ec) {
417 driver.SubmitBlockWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
418 ::std::forward<F>(con), timeout, ec);
430 return driver.AsyncRead<T>(ObjectIndex(idx), subidx);
450 const ::std::chrono::milliseconds& timeout) {
451 return driver.AsyncRead<T>(ObjectIndex(idx), subidx, timeout);
463 return driver.AsyncBlockRead<T>(ObjectIndex(idx), subidx);
487 const ::std::chrono::milliseconds& timeout) {
488 return driver.AsyncBlockRead<T>(ObjectIndex(idx), subidx, timeout);
500 return driver.AsyncWrite(ObjectIndex(idx), subidx,
501 ::std::forward<T>(value));
521 const ::std::chrono::milliseconds& timeout) {
522 return driver.AsyncWrite(ObjectIndex(idx), subidx, ::std::forward<T>(value),
535 return driver.AsyncBlockWrite(ObjectIndex(idx), subidx,
536 ::std::forward<T>(value));
560 const ::std::chrono::milliseconds& timeout) {
561 return driver.AsyncBlockWrite(ObjectIndex(idx), subidx,
562 ::std::forward<T>(value), timeout);
571 template <
class F,
class... Args>
574 GetExecutor().post(::std::forward<F>(f), ::std::forward<Args>(args)...);
591 operator[](uint16_t idx)
const {
592 return self_.driver.rpdo_mapped[self_.ObjectIndex(idx)];
606 operator[](uint16_t idx) {
607 return self_.driver.tpdo_mapped[self_.ObjectIndex(idx)];
611 operator[](uint16_t idx)
const {
612 const auto& tpdo_mapped = self_.driver.tpdo_mapped;
613 return tpdo_mapped[self_.ObjectIndex(idx)];
634 OnRpdoWrite(uint16_t , uint8_t ) noexcept
override {}
647 OnSync(uint8_t ,
const time_point& ) noexcept
override {}
653 OnTime(const ::std::chrono::system_clock::time_point& ) noexcept
658 uint8_t [5]) noexcept
override {}
666 const ::std::string& ) noexcept
override {}
669 OnConfig(::std::function<
void(::std::error_code ec)> res) noexcept
override {
670 res(::std::error_code{});
675 ::std::function<
void(::std::error_code ec)> res) noexcept
override {
676 res(::std::error_code{});
687 return (idx >= 0x6000 && idx <= 0x67ff) ? idx + (num_ - 1) * 0x800 : idx;
699 template <
class Driver>
700 class BasicLogicalDriver :
public BasicLogicalDriver<BasicDriver> {
702 BasicLogicalDriver(Driver& driver_,
int num = 1, uint32_t dev = 0)
703 : BasicLogicalDriver<BasicDriver>(driver_, num, dev),
driver(driver_) {}
716 #endif // LELY_COAPP_LOGICAL_DRIVER_HPP_