コード例 #1
0
ファイル: voe_handler.c プロジェクト: liangyaozhan/ethercat
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;
}
コード例 #2
0
ファイル: common.c プロジェクト: ikcalB/ethercat-master
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;
}
コード例 #3
0
ファイル: voe_handler.c プロジェクト: liangyaozhan/ethercat
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)));
    }
}
コード例 #4
0
ファイル: voe_handler.c プロジェクト: liangyaozhan/ethercat
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)));
    }
}
コード例 #5
0
ファイル: voe_handler.c プロジェクト: liangyaozhan/ethercat
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)));
    }
}
コード例 #6
0
ファイル: voe_handler.c プロジェクト: liangyaozhan/ethercat
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)));
    }
}