--- a/lib/slave_config.c Thu Aug 05 09:54:06 2010 +0200
+++ b/lib/slave_config.c Thu Sep 16 10:16:12 2010 +0200
@@ -43,6 +43,29 @@
/*****************************************************************************/
+void ec_slave_config_clear(ec_slave_config_t *sc)
+{
+ ec_sdo_request_t *r, *next_r;
+ ec_voe_handler_t *v, *next_v;
+
+ r = sc->first_sdo_request;
+ while (r) {
+ next_r = r->next;
+ ec_sdo_request_clear(r);
+ r = next_r;
+ }
+
+
+ v = sc->first_voe_handler;
+ while (v) {
+ next_v = v->next;
+ ec_voe_handler_clear(v);
+ v = next_v;
+ }
+}
+
+/*****************************************************************************/
+
int ecrt_slave_config_sync_manager(ec_slave_config_t *sc, uint8_t sync_index,
ec_direction_t dir, ec_watchdog_mode_t watchdog_mode)
{
@@ -361,6 +384,22 @@
/*****************************************************************************/
+void ec_slave_config_add_sdo_request(ec_slave_config_t *sc,
+ ec_sdo_request_t *req)
+{
+ if (sc->first_sdo_request) {
+ ec_sdo_request_t *r = sc->first_sdo_request;
+ while (r->next) {
+ r = r->next;
+ }
+ r->next = req;
+ } else {
+ sc->first_sdo_request = req;
+ }
+}
+
+/*****************************************************************************/
+
ec_sdo_request_t *ecrt_slave_config_create_sdo_request(ec_slave_config_t *sc,
uint16_t index, uint8_t subindex, size_t size)
{
@@ -393,23 +432,42 @@
if (ioctl(sc->master->fd, EC_IOCTL_SC_SDO_REQUEST, &data) == -1) {
fprintf(stderr, "Failed to create SDO request: %s\n",
strerror(errno));
- if (req->data)
- free(req->data);
+ ec_sdo_request_clear(req);
free(req);
return NULL;
}
+ req->next = NULL;
req->config = sc;
req->index = data.request_index;
req->sdo_index = data.sdo_index;
req->sdo_subindex = data.sdo_subindex;
req->data_size = size;
req->mem_size = size;
+
+ ec_slave_config_add_sdo_request(sc, req);
+
return req;
}
/*****************************************************************************/
+void ec_slave_config_add_voe_handler(ec_slave_config_t *sc,
+ ec_voe_handler_t *voe)
+{
+ if (sc->first_voe_handler) {
+ ec_voe_handler_t *v = sc->first_voe_handler;
+ while (v->next) {
+ v = v->next;
+ }
+ v->next = voe;
+ } else {
+ sc->first_voe_handler = voe;
+ }
+}
+
+/*****************************************************************************/
+
ec_voe_handler_t *ecrt_slave_config_create_voe_handler(ec_slave_config_t *sc,
size_t size)
{
@@ -441,16 +499,19 @@
if (ioctl(sc->master->fd, EC_IOCTL_SC_VOE, &data) == -1) {
fprintf(stderr, "Failed to create VoE handler: %s\n",
strerror(errno));
- if (voe->data)
- free(voe->data);
+ ec_voe_handler_clear(voe);
free(voe);
return NULL;
}
+ voe->next = NULL;
voe->config = sc;
voe->index = data.voe_index;
voe->data_size = size;
voe->mem_size = size;
+
+ ec_slave_config_add_voe_handler(sc, voe);
+
return voe;
}