diff --git a/include/ecrt.h b/include/ecrt.h index 5a43de8b20dc31c5c7b7bd008dca650395f075bd..e69b014079fc415acbcdbded3fd3fb486b6ec5b6 100644 --- a/include/ecrt.h +++ b/include/ecrt.h @@ -88,6 +88,9 @@ void ecrt_release_master(ec_master_t *master); * Master methods *****************************************************************************/ +void ecrt_master_callbacks(ec_master_t *master, int (*request_cb)(void *), + void (*release_cb)(void *), void *cb_data); + ec_domain_t *ecrt_master_create_domain(ec_master_t *master); int ecrt_master_activate(ec_master_t *master); diff --git a/master/master.c b/master/master.c index bc6c9844f3ebabde9e33f002edb28de1ad604849..56db490d93bed56d01007b2a0b7440c586a83e53 100644 --- a/master/master.c +++ b/master/master.c @@ -208,6 +208,10 @@ void ec_master_reset(ec_master_t *master /**< EtherCAT master */) master->stats.t_last = 0; master->mode = EC_MASTER_MODE_IDLE; + + master->request_cb = NULL; + master->release_cb = NULL; + master->cb_data = NULL; } /*****************************************************************************/ @@ -1409,6 +1413,24 @@ ec_slave_t *ecrt_master_get_slave(const ec_master_t *master, /**< Master */ /*****************************************************************************/ +/** + Sets the locking callbacks. + \ingroup RealtimeInterface +*/ + +void ecrt_master_callbacks(ec_master_t *master, /**< EtherCAT master */ + int (*request_cb)(void *), /**< request lock CB */ + void (*release_cb)(void *), /**< release lock CB */ + void *cb_data /**< data parameter */ + ) +{ + master->request_cb = request_cb; + master->release_cb = release_cb; + master->cb_data = cb_data; +} + +/*****************************************************************************/ + /** Sets the debug level of the master. The following levels are valid: diff --git a/master/master.h b/master/master.h index 788a74594ad12d6d0982d70cf22788d4fa1bc371..e036d3b5b00dc086fa68871eace95b4daed7f60a 100644 --- a/master/master.h +++ b/master/master.h @@ -98,6 +98,9 @@ struct ec_master unsigned int reserved; /**< true, if the master is reserved for RT */ struct timer_list freerun_timer; /**< timer object for free run mode */ ec_master_mode_t mode; /**< master mode */ + int (*request_cb)(void *); /**< lock request callback */ + void (*release_cb)(void *); /**< lock release callback */ + void *cb_data; /**< data parameter of locking callbacks */ }; /*****************************************************************************/