ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe) { ec_ioctl_voe_t data; int ret; data.config_index = voe->config->index; data.voe_index = voe->index; ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_EXEC, &data); if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to execute VoE handler: %s\n", strerror(EC_IOCTL_ERRNO(ret))); return EC_REQUEST_ERROR; } if (data.size) { // new data waiting to be copied if (voe->mem_size < data.size) { fprintf(stderr, "Received %zu bytes do not fit info VoE data" " memory (%zu bytes)!\n", data.size, voe->mem_size); return EC_REQUEST_ERROR; } data.data = voe->data; ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_DATA, &data); if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to get VoE data: %s\n", strerror(EC_IOCTL_ERRNO(ret))); return EC_REQUEST_ERROR; } voe->data_size = data.size; } return data.state; }
ec_master_t *ecrt_open_master(unsigned int master_index) { char path[MAX_PATH_LEN]; ec_master_t *master = NULL; ec_ioctl_module_t module_data; int ret; master = malloc(sizeof(ec_master_t)); if (!master) { fprintf(stderr, "Failed to allocate memory.\n"); return 0; } master->process_data = NULL; master->process_data_size = 0; master->first_domain = NULL; master->first_config = NULL; snprintf(path, MAX_PATH_LEN - 1, #ifdef USE_RTDM "EtherCAT%u", #else "/dev/EtherCAT%u", #endif master_index); #ifdef USE_RTDM master->fd = rt_dev_open(path, O_RDWR); #else master->fd = open(path, O_RDWR); #endif if (EC_IOCTL_IS_ERROR(master->fd)) { fprintf(stderr, "Failed to open %s: %s\n", path, strerror(EC_IOCTL_ERRNO(master->fd))); goto out_clear; } ret = ioctl(master->fd, EC_IOCTL_MODULE, &module_data); if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to get module information from %s: %s\n", path, strerror(EC_IOCTL_ERRNO(ret))); goto out_clear; } if (module_data.ioctl_version_magic != EC_IOCTL_VERSION_MAGIC) { fprintf(stderr, "ioctl() version magic is differing:" " %s: %u, libethercat: %u.\n", path, module_data.ioctl_version_magic, EC_IOCTL_VERSION_MAGIC); goto out_clear; } return master; out_clear: ec_master_clear(master); free(master); return 0; }
void ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe) { ec_ioctl_voe_t data; int ret; data.config_index = voe->config->index; data.voe_index = voe->index; ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_READ_NOSYNC, &data); if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to initiate VoE reading: %s\n", strerror(EC_IOCTL_ERRNO(ret))); } }
void ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size) { ec_ioctl_voe_t data; int ret; data.config_index = voe->config->index; data.voe_index = voe->index; data.size = size; data.data = voe->data; ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_WRITE, &data); if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to initiate VoE writing: %s\n", strerror(EC_IOCTL_ERRNO(ret))); } }
void ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, uint32_t *vendor_id, uint16_t *vendor_type) { ec_ioctl_voe_t data; int ret; data.config_index = voe->config->index; data.voe_index = voe->index; data.vendor_id = vendor_id; data.vendor_type = vendor_type; ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_REC_HEADER, &data); if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to get received VoE header: %s\n", strerror(EC_IOCTL_ERRNO(ret))); } }
void ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, uint16_t vendor_type) { ec_ioctl_voe_t data; int ret; data.config_index = voe->config->index; data.voe_index = voe->index; data.vendor_id = &vendor_id; data.vendor_type = &vendor_type; ret = ioctl(voe->config->master->fd, EC_IOCTL_VOE_SEND_HEADER, &data); if (EC_IOCTL_IS_ERROR(ret)) { fprintf(stderr, "Failed to set VoE send header: %s\n", strerror(EC_IOCTL_ERRNO(ret))); } }