Separated master requesting into open and reserve for userspace library.

(thanks to Martin Troxler).
This commit is contained in:
Florian Pose
2009-07-10 10:07:48 +00:00
parent e4a8e667f4
commit fbb6b62eaf
4 changed files with 127 additions and 14 deletions
+17 -9
View File
@@ -50,9 +50,25 @@ unsigned int ecrt_version_magic(void)
/*****************************************************************************/
ec_master_t *ecrt_request_master(unsigned int master_index)
{
ec_master_t *master = ecrt_open_master(master_index);
if (master) {
if (ecrt_master_reserve(master) < 0) {
close(master->fd);
free(master);
master = 0;
}
}
return master;
}
/*****************************************************************************/
#define MAX_PATH_LEN 64
ec_master_t *ecrt_request_master(unsigned int master_index)
ec_master_t *ecrt_open_master(unsigned int master_index)
{
char path[MAX_PATH_LEN];
ec_master_t *master;
@@ -75,14 +91,6 @@ ec_master_t *ecrt_request_master(unsigned int master_index)
return 0;
}
if (ioctl(master->fd, EC_IOCTL_REQUEST, NULL) == -1) {
fprintf(stderr, "Failed to request master %u: %s\n",
master_index, strerror(errno));
close(master->fd);
free(master);
return 0;
}
return master;
}
+29 -3
View File
@@ -42,6 +42,17 @@
/*****************************************************************************/
int ecrt_master_reserve(ec_master_t *master)
{
if (ioctl(master->fd, EC_IOCTL_REQUEST, NULL) == -1) {
fprintf(stderr, "Failed to reserve master: %s\n",
strerror(errno));
return -1;
}
}
/*****************************************************************************/
ec_domain_t *ecrt_master_create_domain(ec_master_t *master)
{
ec_domain_t *domain;
@@ -103,6 +114,23 @@ ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
/*****************************************************************************/
int ecrt_master(ec_master_t* master, ec_master_info_t *master_info)
{
ec_ioctl_master_t data;
if (ioctl(master->fd, EC_IOCTL_MASTER, &data) < 0) {
fprintf(stderr, "Failed to get master info: %s\n", strerror(errno));
return -1;
}
master_info->slave_count = data.slave_count;
master_info->link_up = data.devices[0].link_state;
master_info->app_time = data.app_time;
return 0;
}
/*****************************************************************************/
int ecrt_master_slave(ec_master_t *master, uint16_t position,
ec_slave_info_t *slave_info)
{
@@ -112,8 +140,7 @@ int ecrt_master_slave(ec_master_t *master, uint16_t position,
data.position = position;
if (ioctl(master->fd, EC_IOCTL_SLAVE, &data) == -1) {
fprintf(stderr, "Failed to get slave info: %s\n",
strerror(errno));
fprintf(stderr, "Failed to get slave info: %s\n", strerror(errno));
return -1;
}
@@ -129,7 +156,6 @@ int ecrt_master_slave(ec_master_t *master, uint16_t position,
slave_info->sync_count = data.sync_count;
slave_info->sdo_count = data.sdo_count;
strncpy(slave_info->name, data.name, EC_IOCTL_STRING_SIZE);
return 0;
}