lib/master.c
changeset 1963 6aaf77798445
parent 1952 7d9fb723fc4b
parent 1960 6c4269dca1c2
child 1975 8e173dddd183
child 1995 7d748d9cf9e8
equal deleted inserted replaced
1962:df9b00bda8dc 1963:6aaf77798445
    51     }
    51     }
    52 }
    52 }
    53 
    53 
    54 /*****************************************************************************/
    54 /*****************************************************************************/
    55 
    55 
       
    56 void ec_master_clear_config(ec_master_t *master)
       
    57 {
       
    58     ec_domain_t *d, *next_d;
       
    59     ec_slave_config_t *c, *next_c;
       
    60 
       
    61     d = master->first_domain;
       
    62     while (d) {
       
    63         next_d = d->next;
       
    64         ec_domain_clear(d);
       
    65         d = next_d;
       
    66     }
       
    67     master->first_domain = NULL;
       
    68 
       
    69     c = master->first_config;
       
    70     while (c) {
       
    71         next_c = c->next;
       
    72         ec_slave_config_clear(c);
       
    73         c = next_c;
       
    74     }
       
    75     master->first_config = NULL;
       
    76 }
       
    77 
       
    78 /*****************************************************************************/
       
    79 
       
    80 void ec_master_clear(ec_master_t *master)
       
    81 {
       
    82     if (master->process_data)  {
       
    83         munmap(master->process_data, master->process_data_size);
       
    84     }
       
    85 
       
    86     ec_master_clear_config(master);
       
    87 
       
    88     if (master->fd != -1) {
       
    89         close(master->fd);
       
    90     }
       
    91 }
       
    92 
       
    93 /*****************************************************************************/
       
    94 
       
    95 void ec_master_add_domain(ec_master_t *master, ec_domain_t *domain)
       
    96 {
       
    97     if (master->first_domain) {
       
    98         ec_domain_t *d = master->first_domain;
       
    99         while (d->next) {
       
   100             d = d->next;
       
   101         }
       
   102         d->next = domain;
       
   103     } else {
       
   104         master->first_domain = domain;
       
   105     }
       
   106 }
       
   107 
       
   108 /*****************************************************************************/
       
   109 
    56 ec_domain_t *ecrt_master_create_domain(ec_master_t *master)
   110 ec_domain_t *ecrt_master_create_domain(ec_master_t *master)
    57 {
   111 {
    58     ec_domain_t *domain;
   112     ec_domain_t *domain;
    59     int index;
   113     int index;
    60 
   114 
    69         fprintf(stderr, "Failed to create domain: %s\n", strerror(errno));
   123         fprintf(stderr, "Failed to create domain: %s\n", strerror(errno));
    70         free(domain);
   124         free(domain);
    71         return 0; 
   125         return 0; 
    72     }
   126     }
    73 
   127 
       
   128     domain->next = NULL;
    74     domain->index = (unsigned int) index;
   129     domain->index = (unsigned int) index;
    75     domain->master = master;
   130     domain->master = master;
    76     domain->process_data = NULL;
   131     domain->process_data = NULL;
       
   132 
       
   133     ec_master_add_domain(master, domain);
       
   134 
    77     return domain;
   135     return domain;
       
   136 }
       
   137 
       
   138 /*****************************************************************************/
       
   139 
       
   140 void ec_master_add_slave_config(ec_master_t *master, ec_slave_config_t *sc)
       
   141 {
       
   142     if (master->first_config) {
       
   143         ec_slave_config_t *c = master->first_config;
       
   144         while (c->next) {
       
   145             c = c->next;
       
   146         }
       
   147         c->next = sc;
       
   148     } else {
       
   149         master->first_config = sc;
       
   150     }
    78 }
   151 }
    79 
   152 
    80 /*****************************************************************************/
   153 /*****************************************************************************/
    81 
   154 
    82 ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
   155 ec_slave_config_t *ecrt_master_slave_config(ec_master_t *master,
   103                 strerror(errno));
   176                 strerror(errno));
   104         free(sc);
   177         free(sc);
   105         return 0; 
   178         return 0; 
   106     }
   179     }
   107 
   180 
       
   181     sc->next = NULL;
   108     sc->master = master;
   182     sc->master = master;
   109     sc->index = data.config_index;
   183     sc->index = data.config_index;
   110     sc->alias = alias;
   184     sc->alias = alias;
   111     sc->position = position;
   185     sc->position = position;
       
   186     sc->first_sdo_request = NULL;
       
   187     sc->first_voe_handler = NULL;
       
   188 
       
   189     ec_master_add_slave_config(master, sc);
       
   190 
   112     return sc;
   191     return sc;
   113 }
   192 }
   114 
   193 
   115 /*****************************************************************************/
   194 /*****************************************************************************/
   116 
   195 
   387 {
   466 {
   388     if (ioctl(master->fd, EC_IOCTL_DEACTIVATE, NULL) == -1) {
   467     if (ioctl(master->fd, EC_IOCTL_DEACTIVATE, NULL) == -1) {
   389         fprintf(stderr, "Failed to deactivate master: %s\n", strerror(errno));
   468         fprintf(stderr, "Failed to deactivate master: %s\n", strerror(errno));
   390         return;
   469         return;
   391     }
   470     }
   392 }
   471 
   393 
   472     ec_master_clear_config(master);
       
   473 }
   394 
   474 
   395 /*****************************************************************************/
   475 /*****************************************************************************/
   396 
   476 
   397 int ecrt_master_set_send_interval(ec_master_t *master,size_t send_interval_us)
   477 int ecrt_master_set_send_interval(ec_master_t *master,size_t send_interval_us)
   398 {
   478 {
   403         return -1; // FIXME
   483         return -1; // FIXME
   404     }
   484     }
   405     return 0;
   485     return 0;
   406 }
   486 }
   407 
   487 
   408 
       
   409 /*****************************************************************************/
   488 /*****************************************************************************/
   410 
   489 
   411 void ecrt_master_send(ec_master_t *master)
   490 void ecrt_master_send(ec_master_t *master)
   412 {
   491 {
   413     if (ioctl(master->fd, EC_IOCTL_SEND, NULL) == -1) {
   492     if (ioctl(master->fd, EC_IOCTL_SEND, NULL) == -1) {