Activate, Send and received; cyclic timer with setitimer().
This commit is contained in:
parent
9e69d015b6
commit
fb34ddb1f2
|
|
@ -4,15 +4,39 @@
|
|||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "ecrt.h"
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
static unsigned int sig_alarms = 0;
|
||||
static unsigned int user_alarms = 0;
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
void signal_handler(int signum) {
|
||||
switch (signum) {
|
||||
case SIGALRM:
|
||||
sig_alarms++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
ec_master_t *master;
|
||||
ec_domain_t *domain;
|
||||
ec_slave_config_t *sc;
|
||||
struct sigaction sa;
|
||||
struct itimerval tv;
|
||||
|
||||
master = ecrt_request_master(0);
|
||||
if (!master)
|
||||
|
|
@ -26,8 +50,41 @@ int main(int argc, char **argv)
|
|||
if (!sc)
|
||||
return -1;
|
||||
|
||||
if (ecrt_master_activate(master))
|
||||
return -1;
|
||||
|
||||
sa.sa_handler = signal_handler;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
if (sigaction(SIGALRM, &sa, 0)) {
|
||||
fprintf(stderr, "Failed to install signal handler!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
tv.it_interval.tv_sec = 0;
|
||||
tv.it_interval.tv_usec = 10000;
|
||||
tv.it_value.tv_sec = 0;
|
||||
tv.it_value.tv_usec = 1;
|
||||
if (setitimer(ITIMER_REAL, &tv, NULL)) {
|
||||
fprintf(stderr, "Failed to start timer: %s\n", strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
sleep(1);
|
||||
sleep(1);
|
||||
|
||||
while (sig_alarms != user_alarms) {
|
||||
|
||||
#if 0
|
||||
struct timeval t;
|
||||
gettimeofday(&t, NULL);
|
||||
printf("%u %u\n", t.tv_sec, t.tv_usec);
|
||||
#endif
|
||||
ecrt_master_receive(master);
|
||||
ecrt_master_send(master);
|
||||
|
||||
user_alarms++;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
13
lib/master.c
13
lib/master.c
|
|
@ -102,6 +102,12 @@ ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
|
|||
|
||||
int ecrt_master_activate(ec_master_t *master)
|
||||
{
|
||||
if (ioctl(master->fd, EC_IOCTL_ACTIVATE, NULL) == -1) {
|
||||
fprintf(stderr, "Failed to activate master: %s\n",
|
||||
strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -109,12 +115,18 @@ int ecrt_master_activate(ec_master_t *master)
|
|||
|
||||
void ecrt_master_send(ec_master_t *master)
|
||||
{
|
||||
if (ioctl(master->fd, EC_IOCTL_SEND, NULL) == -1) {
|
||||
fprintf(stderr, "Failed to send: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void ecrt_master_receive(ec_master_t *master)
|
||||
{
|
||||
if (ioctl(master->fd, EC_IOCTL_RECEIVE, NULL) == -1) {
|
||||
fprintf(stderr, "Failed to receive: %s\n", strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -123,5 +135,4 @@ void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
|
|||
{
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
|
|||
|
|
@ -1452,6 +1452,63 @@ int ec_cdev_ioctl_create_slave_config(
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Activates the master.
|
||||
*/
|
||||
int ec_cdev_ioctl_activate(
|
||||
ec_master_t *master, /**< EtherCAT master. */
|
||||
unsigned long arg, /**< ioctl() argument. */
|
||||
ec_cdev_priv_t *priv /**< Private data structure of file handle. */
|
||||
)
|
||||
{
|
||||
if (unlikely(!priv->requested))
|
||||
return -EPERM;
|
||||
|
||||
if (ecrt_master_activate(master))
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Send frames.
|
||||
*/
|
||||
int ec_cdev_ioctl_send(
|
||||
ec_master_t *master, /**< EtherCAT master. */
|
||||
unsigned long arg, /**< ioctl() argument. */
|
||||
ec_cdev_priv_t *priv /**< Private data structure of file handle. */
|
||||
)
|
||||
{
|
||||
if (unlikely(!priv->requested))
|
||||
return -EPERM;
|
||||
|
||||
spin_lock_bh(&master->internal_lock);
|
||||
ecrt_master_send(master);
|
||||
spin_unlock_bh(&master->internal_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/** Receive frames.
|
||||
*/
|
||||
int ec_cdev_ioctl_receive(
|
||||
ec_master_t *master, /**< EtherCAT master. */
|
||||
unsigned long arg, /**< ioctl() argument. */
|
||||
ec_cdev_priv_t *priv /**< Private data structure of file handle. */
|
||||
)
|
||||
{
|
||||
if (unlikely(!priv->requested))
|
||||
return -EPERM;
|
||||
|
||||
spin_lock_bh(&master->internal_lock);
|
||||
ecrt_master_receive(master);
|
||||
spin_unlock_bh(&master->internal_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* File operations
|
||||
*****************************************************************************/
|
||||
|
|
@ -1577,6 +1634,18 @@ long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
|||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EPERM;
|
||||
return ec_cdev_ioctl_create_slave_config(master, arg, priv);
|
||||
case EC_IOCTL_ACTIVATE:
|
||||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EPERM;
|
||||
return ec_cdev_ioctl_activate(master, arg, priv);
|
||||
case EC_IOCTL_SEND:
|
||||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EPERM;
|
||||
return ec_cdev_ioctl_send(master, arg, priv);
|
||||
case EC_IOCTL_RECEIVE:
|
||||
if (!(filp->f_mode & FMODE_WRITE))
|
||||
return -EPERM;
|
||||
return ec_cdev_ioctl_receive(master, arg, priv);
|
||||
default:
|
||||
return -ENOTTY;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,6 +82,9 @@
|
|||
#define EC_IOCTL_REQUEST EC_IO(0x16)
|
||||
#define EC_IOCTL_CREATE_DOMAIN EC_IO(0x17)
|
||||
#define EC_IOCTL_CREATE_SLAVE_CONFIG EC_IOWR(0x18, ec_ioctl_config_t)
|
||||
#define EC_IOCTL_ACTIVATE EC_IO(0x19)
|
||||
#define EC_IOCTL_SEND EC_IO(0x1a)
|
||||
#define EC_IOCTL_RECEIVE EC_IO(0x1b)
|
||||
|
||||
#define EC_IOCTL_STRING_SIZE 64
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue