diff --git a/include/ecrt.h b/include/ecrt.h index b33f5010..eb99f659 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -1866,7 +1866,7 @@ void ecrt_domain_external_memory( * \return Pointer to the process data memory. */ EC_PUBLIC_API uint8_t *ecrt_domain_data( - ec_domain_t *domain /**< Domain. */ + const ec_domain_t *domain /**< Domain. */ ); /** Determines the states of the domain's datagrams. diff --git a/lib/domain.c b/lib/domain.c index 26d01262..c04fdeee 100644 --- a/lib/domain.c +++ b/lib/domain.c @@ -83,22 +83,8 @@ size_t ecrt_domain_size(const ec_domain_t *domain) /****************************************************************************/ -uint8_t *ecrt_domain_data(ec_domain_t *domain) +uint8_t *ecrt_domain_data(const ec_domain_t *domain) { - if (!domain->process_data) { - int offset = 0; - - offset = ioctl(domain->master->fd, EC_IOCTL_DOMAIN_OFFSET, - domain->index); - if (EC_IOCTL_IS_ERROR(offset)) { - fprintf(stderr, "Failed to get domain offset: %s\n", - strerror(EC_IOCTL_ERRNO(offset))); - return NULL; - } - - domain->process_data = domain->master->process_data + offset; - } - return domain->process_data; } diff --git a/lib/master.c b/lib/master.c index f2d846e1..a215d3e2 100644 --- a/lib/master.c +++ b/lib/master.c @@ -585,6 +585,21 @@ int ecrt_master_activate(ec_master_t *master) master->process_data[0] = 0x00; } + // pick up process data pointers for all created domains + ec_domain_t *domain = master->first_domain; + while (domain) { + int offset = ioctl(domain->master->fd, EC_IOCTL_DOMAIN_OFFSET, + domain->index); + if (EC_IOCTL_IS_ERROR(offset)) { + fprintf(stderr, "Failed to get domain offset: %s\n", + strerror(EC_IOCTL_ERRNO(offset))); + return -EC_IOCTL_ERRNO(offset); + } + + domain->process_data = master->process_data + offset; + domain = domain->next; + } + return 0; } diff --git a/master/domain.c b/master/domain.c index c61a3c1c..0a886821 100644 --- a/master/domain.c +++ b/master/domain.c @@ -440,7 +440,7 @@ void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem) /****************************************************************************/ -uint8_t *ecrt_domain_data(ec_domain_t *domain) +uint8_t *ecrt_domain_data(const ec_domain_t *domain) { return domain->data; }