master/fsm_pdo_entry.c
changeset 2589 2b9c78543663
parent 1964 9327c261056f
equal deleted inserted replaced
2415:af21f0bdc7c9 2589:2b9c78543663
    40 
    40 
    41 #include "fsm_pdo_entry.h"
    41 #include "fsm_pdo_entry.h"
    42 
    42 
    43 /*****************************************************************************/
    43 /*****************************************************************************/
    44 
    44 
    45 void ec_fsm_pdo_entry_read_state_start(ec_fsm_pdo_entry_t *);
    45 void ec_fsm_pdo_entry_read_state_start(ec_fsm_pdo_entry_t *, ec_datagram_t *);
    46 void ec_fsm_pdo_entry_read_state_count(ec_fsm_pdo_entry_t *);
    46 void ec_fsm_pdo_entry_read_state_count(ec_fsm_pdo_entry_t *, ec_datagram_t *);
    47 void ec_fsm_pdo_entry_read_state_entry(ec_fsm_pdo_entry_t *);
    47 void ec_fsm_pdo_entry_read_state_entry(ec_fsm_pdo_entry_t *, ec_datagram_t *);
    48 
    48 
    49 void ec_fsm_pdo_entry_read_action_next(ec_fsm_pdo_entry_t *);
    49 void ec_fsm_pdo_entry_read_action_next(ec_fsm_pdo_entry_t *, ec_datagram_t *);
    50 
    50 
    51 void ec_fsm_pdo_entry_conf_state_start(ec_fsm_pdo_entry_t *);
    51 void ec_fsm_pdo_entry_conf_state_start(ec_fsm_pdo_entry_t *, ec_datagram_t *);
    52 void ec_fsm_pdo_entry_conf_state_zero_entry_count(ec_fsm_pdo_entry_t *);
    52 void ec_fsm_pdo_entry_conf_state_zero_entry_count(ec_fsm_pdo_entry_t *,
    53 void ec_fsm_pdo_entry_conf_state_map_entry(ec_fsm_pdo_entry_t *);
    53         ec_datagram_t *);
    54 void ec_fsm_pdo_entry_conf_state_set_entry_count(ec_fsm_pdo_entry_t *);
    54 void ec_fsm_pdo_entry_conf_state_map_entry(ec_fsm_pdo_entry_t *,
    55 
    55         ec_datagram_t *);
    56 void ec_fsm_pdo_entry_conf_action_map(ec_fsm_pdo_entry_t *);
    56 void ec_fsm_pdo_entry_conf_state_set_entry_count(ec_fsm_pdo_entry_t *,
    57 
    57         ec_datagram_t *);
    58 void ec_fsm_pdo_entry_state_end(ec_fsm_pdo_entry_t *);
    58 
    59 void ec_fsm_pdo_entry_state_error(ec_fsm_pdo_entry_t *);
    59 void ec_fsm_pdo_entry_conf_action_map(ec_fsm_pdo_entry_t *, ec_datagram_t *);
       
    60 
       
    61 void ec_fsm_pdo_entry_state_end(ec_fsm_pdo_entry_t *, ec_datagram_t *);
       
    62 void ec_fsm_pdo_entry_state_error(ec_fsm_pdo_entry_t *, ec_datagram_t *);
    60 
    63 
    61 /*****************************************************************************/
    64 /*****************************************************************************/
    62 
    65 
    63 /** Constructor.
    66 /** Constructor.
    64  */
    67  */
    85 /*****************************************************************************/
    88 /*****************************************************************************/
    86 
    89 
    87 /** Print the current and desired PDO mapping.
    90 /** Print the current and desired PDO mapping.
    88  */
    91  */
    89 void ec_fsm_pdo_entry_print(
    92 void ec_fsm_pdo_entry_print(
    90         ec_fsm_pdo_entry_t *fsm /**< PDO configuration state machine. */
    93         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
    91         )
    94         )
    92 {
    95 {
    93     printk("Currently mapped PDO entries: ");
    96     printk("Currently mapped PDO entries: ");
    94     ec_pdo_print_entries(fsm->cur_pdo);
    97     ec_pdo_print_entries(fsm->cur_pdo);
    95     printk(". Entries to map: ");
    98     printk(". Entries to map: ");
   101 
   104 
   102 /** Start reading a PDO's entries.
   105 /** Start reading a PDO's entries.
   103  */
   106  */
   104 void ec_fsm_pdo_entry_start_reading(
   107 void ec_fsm_pdo_entry_start_reading(
   105         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   108         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   106         ec_slave_t *slave, /**< slave to configure */
   109         ec_slave_t *slave, /**< Slave to configure. */
   107         ec_pdo_t *pdo /**< PDO to read entries for. */
   110         ec_pdo_t *pdo /**< PDO to read entries for. */
   108         )
   111         )
   109 {
   112 {
   110     fsm->slave = slave;
   113     fsm->slave = slave;
   111     fsm->target_pdo = pdo;
   114     fsm->target_pdo = pdo;
   112 
   115 
   113     ec_pdo_clear_entries(fsm->target_pdo);
   116     ec_pdo_clear_entries(fsm->target_pdo);
   114     
   117 
   115     fsm->state = ec_fsm_pdo_entry_read_state_start;
   118     fsm->state = ec_fsm_pdo_entry_read_state_start;
   116 }
   119 }
   117 
   120 
   118 /*****************************************************************************/
   121 /*****************************************************************************/
   119 
   122 
   120 /** Start PDO mapping state machine.
   123 /** Start PDO mapping state machine.
   121  */
   124  */
   122 void ec_fsm_pdo_entry_start_configuration(
   125 void ec_fsm_pdo_entry_start_configuration(
   123         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   126         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   124         ec_slave_t *slave, /**< slave to configure */
   127         ec_slave_t *slave, /**< Slave to configure. */
   125         const ec_pdo_t *pdo, /**< PDO with the desired entries. */
   128         const ec_pdo_t *pdo, /**< PDO with the desired entries. */
   126         const ec_pdo_t *cur_pdo /**< Current PDO mapping. */
   129         const ec_pdo_t *cur_pdo /**< Current PDO mapping. */
   127         )
   130         )
   128 {
   131 {
   129     fsm->slave = slave;
   132     fsm->slave = slave;
   158 /** Executes the current state.
   161 /** Executes the current state.
   159  *
   162  *
   160  * \return false, if state machine has terminated
   163  * \return false, if state machine has terminated
   161  */
   164  */
   162 int ec_fsm_pdo_entry_exec(
   165 int ec_fsm_pdo_entry_exec(
   163         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   166         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   164         )
   167         ec_datagram_t *datagram /**< Datagram to use. */
   165 {
   168         )
   166     fsm->state(fsm);
   169 {
       
   170     fsm->state(fsm, datagram);
       
   171 
   167     return ec_fsm_pdo_entry_running(fsm);
   172     return ec_fsm_pdo_entry_running(fsm);
   168 }
   173 }
   169 
   174 
   170 /*****************************************************************************/
   175 /*****************************************************************************/
   171 
   176 
   185  *****************************************************************************/
   190  *****************************************************************************/
   186 
   191 
   187 /** Request reading the number of mapped PDO entries.
   192 /** Request reading the number of mapped PDO entries.
   188  */
   193  */
   189 void ec_fsm_pdo_entry_read_state_start(
   194 void ec_fsm_pdo_entry_read_state_start(
   190         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   195         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   191         )
   196         ec_datagram_t *datagram /**< Datagram to use. */
   192 {
   197         )
   193     ec_sdo_request_address(&fsm->request, fsm->target_pdo->index, 0);
   198 {
       
   199     ecrt_sdo_request_index(&fsm->request, fsm->target_pdo->index, 0);
   194     ecrt_sdo_request_read(&fsm->request);
   200     ecrt_sdo_request_read(&fsm->request);
   195 
   201 
   196     fsm->state = ec_fsm_pdo_entry_read_state_count;
   202     fsm->state = ec_fsm_pdo_entry_read_state_count;
   197     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   203     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   198     ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   204     ec_fsm_coe_exec(fsm->fsm_coe, datagram); // execute immediately
   199 }
   205 }
   200 
   206 
   201 /*****************************************************************************/
   207 /*****************************************************************************/
   202 
   208 
   203 /** Read number of mapped PDO entries.
   209 /** Read number of mapped PDO entries.
   204  */
   210  */
   205 void ec_fsm_pdo_entry_read_state_count(
   211 void ec_fsm_pdo_entry_read_state_count(
   206         ec_fsm_pdo_entry_t *fsm /**< finite state machine */
   212         ec_fsm_pdo_entry_t *fsm, /**< finite state machine */
   207         )
   213         ec_datagram_t *datagram /**< Datagram to use. */
   208 {
   214         )
   209     if (ec_fsm_coe_exec(fsm->fsm_coe))
   215 {
   210         return;
   216     if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
       
   217         return;
       
   218     }
   211 
   219 
   212     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   220     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   213         EC_SLAVE_ERR(fsm->slave,
   221         EC_SLAVE_ERR(fsm->slave,
   214                 "Failed to read number of mapped PDO entries.\n");
   222                 "Failed to read number of mapped PDO entries.\n");
   215         fsm->state = ec_fsm_pdo_entry_state_error;
   223         fsm->state = ec_fsm_pdo_entry_state_error;
   229 
   237 
   230     EC_SLAVE_DBG(fsm->slave, 1, "%u PDO entries mapped.\n", fsm->entry_count);
   238     EC_SLAVE_DBG(fsm->slave, 1, "%u PDO entries mapped.\n", fsm->entry_count);
   231 
   239 
   232     // read first PDO entry
   240     // read first PDO entry
   233     fsm->entry_pos = 1;
   241     fsm->entry_pos = 1;
   234     ec_fsm_pdo_entry_read_action_next(fsm);
   242     ec_fsm_pdo_entry_read_action_next(fsm, datagram);
   235 }
   243 }
   236 
   244 
   237 /*****************************************************************************/
   245 /*****************************************************************************/
   238 
   246 
   239 /** Read next PDO entry.
   247 /** Read next PDO entry.
   240  */
   248  */
   241 void ec_fsm_pdo_entry_read_action_next(
   249 void ec_fsm_pdo_entry_read_action_next(
   242         ec_fsm_pdo_entry_t *fsm /**< finite state machine */
   250         ec_fsm_pdo_entry_t *fsm, /**< finite state machine */
       
   251         ec_datagram_t *datagram /**< Datagram to use. */
   243         )
   252         )
   244 {
   253 {
   245     if (fsm->entry_pos <= fsm->entry_count) {
   254     if (fsm->entry_pos <= fsm->entry_count) {
   246         ec_sdo_request_address(&fsm->request, fsm->target_pdo->index, fsm->entry_pos);
   255         ecrt_sdo_request_index(&fsm->request, fsm->target_pdo->index,
       
   256                 fsm->entry_pos);
   247         ecrt_sdo_request_read(&fsm->request);
   257         ecrt_sdo_request_read(&fsm->request);
   248         fsm->state = ec_fsm_pdo_entry_read_state_entry;
   258         fsm->state = ec_fsm_pdo_entry_read_state_entry;
   249         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   259         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   250         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   260         ec_fsm_coe_exec(fsm->fsm_coe, datagram); // execute immediately
   251         return;
   261         return;
   252     }
   262     }
   253 
   263 
   254     // finished reading entries.
   264     // finished reading entries.
   255     fsm->state = ec_fsm_pdo_entry_state_end;
   265     fsm->state = ec_fsm_pdo_entry_state_end;
   258 /*****************************************************************************/
   268 /*****************************************************************************/
   259 
   269 
   260 /** Read PDO entry information.
   270 /** Read PDO entry information.
   261  */
   271  */
   262 void ec_fsm_pdo_entry_read_state_entry(
   272 void ec_fsm_pdo_entry_read_state_entry(
   263         ec_fsm_pdo_entry_t *fsm /**< finite state machine */
   273         ec_fsm_pdo_entry_t *fsm, /**< finite state machine */
   264         )
   274         ec_datagram_t *datagram /**< Datagram to use. */
   265 {
   275         )
   266     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   276 {
       
   277     if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
       
   278         return;
       
   279     }
   267 
   280 
   268     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   281     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   269         EC_SLAVE_ERR(fsm->slave, "Failed to read mapped PDO entry.\n");
   282         EC_SLAVE_ERR(fsm->slave, "Failed to read mapped PDO entry.\n");
   270         fsm->state = ec_fsm_pdo_entry_state_error;
   283         fsm->state = ec_fsm_pdo_entry_state_error;
   271         return;
   284         return;
   312 
   325 
   313         list_add_tail(&pdo_entry->list, &fsm->target_pdo->entries);
   326         list_add_tail(&pdo_entry->list, &fsm->target_pdo->entries);
   314 
   327 
   315         // next PDO entry
   328         // next PDO entry
   316         fsm->entry_pos++;
   329         fsm->entry_pos++;
   317         ec_fsm_pdo_entry_read_action_next(fsm);
   330         ec_fsm_pdo_entry_read_action_next(fsm, datagram);
   318     }
   331     }
   319 }
   332 }
   320 
   333 
   321 /******************************************************************************
   334 /******************************************************************************
   322  * Configuration state functions.
   335  * Configuration state functions.
   323  *****************************************************************************/
   336  *****************************************************************************/
   324 
   337 
   325 /** Start PDO mapping.
   338 /** Start PDO mapping.
   326  */
   339  */
   327 void ec_fsm_pdo_entry_conf_state_start(
   340 void ec_fsm_pdo_entry_conf_state_start(
   328         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   341         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
       
   342         ec_datagram_t *datagram /**< Datagram to use. */
   329         )
   343         )
   330 {
   344 {
   331     if (ec_sdo_request_alloc(&fsm->request, 4)) {
   345     if (ec_sdo_request_alloc(&fsm->request, 4)) {
   332         fsm->state = ec_fsm_pdo_entry_state_error;
   346         fsm->state = ec_fsm_pdo_entry_state_error;
   333         return;
   347         return;
   334     }
   348     }
   335 
   349 
   336     // set mapped PDO entry count to zero
   350     // set mapped PDO entry count to zero
   337     EC_WRITE_U8(fsm->request.data, 0);
   351     EC_WRITE_U8(fsm->request.data, 0);
   338     fsm->request.data_size = 1;
   352     fsm->request.data_size = 1;
   339     ec_sdo_request_address(&fsm->request, fsm->source_pdo->index, 0);
   353     ecrt_sdo_request_index(&fsm->request, fsm->source_pdo->index, 0);
   340     ecrt_sdo_request_write(&fsm->request);
   354     ecrt_sdo_request_write(&fsm->request);
   341 
   355 
   342     EC_SLAVE_DBG(fsm->slave, 1, "Setting entry count to zero.\n");
   356     EC_SLAVE_DBG(fsm->slave, 1, "Setting entry count to zero.\n");
   343 
   357 
   344     fsm->state = ec_fsm_pdo_entry_conf_state_zero_entry_count;
   358     fsm->state = ec_fsm_pdo_entry_conf_state_zero_entry_count;
   345     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   359     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   346     ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   360     ec_fsm_coe_exec(fsm->fsm_coe, datagram); // execute immediately
   347 }
   361 }
   348 
   362 
   349 /*****************************************************************************/
   363 /*****************************************************************************/
   350 
   364 
   351 /** Process next PDO entry.
   365 /** Process next PDO entry.
       
   366  *
       
   367  * \return Next PDO entry, or NULL.
   352  */
   368  */
   353 ec_pdo_entry_t *ec_fsm_pdo_entry_conf_next_entry(
   369 ec_pdo_entry_t *ec_fsm_pdo_entry_conf_next_entry(
   354         const ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   370         const ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   355         const struct list_head *list /**< current entry list item */
   371         const struct list_head *list /**< current entry list item */
   356         )
   372         )
   357 {
   373 {
   358     list = list->next; 
   374     list = list->next;
   359     if (list == &fsm->source_pdo->entries)
   375     if (list == &fsm->source_pdo->entries)
   360         return NULL; // no next entry
   376         return NULL; // no next entry
   361     return list_entry(list, ec_pdo_entry_t, list);
   377     return list_entry(list, ec_pdo_entry_t, list);
   362 }
   378 }
   363 
   379 
   364 /*****************************************************************************/
   380 /*****************************************************************************/
   365 
   381 
   366 /** Set the number of mapped entries to zero.
   382 /** Set the number of mapped entries to zero.
   367  */
   383  */
   368 void ec_fsm_pdo_entry_conf_state_zero_entry_count(
   384 void ec_fsm_pdo_entry_conf_state_zero_entry_count(
   369         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   385         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   370         )
   386         ec_datagram_t *datagram /**< Datagram to use. */
   371 {
   387         )
   372     if (ec_fsm_coe_exec(fsm->fsm_coe))
   388 {
   373         return;
   389     if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
       
   390         return;
       
   391     }
   374 
   392 
   375     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   393     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   376         EC_SLAVE_WARN(fsm->slave, "Failed to clear PDO mapping.\n");
   394         EC_SLAVE_WARN(fsm->slave, "Failed to clear PDO mapping.\n");
   377         EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_entry_print(fsm);
   395         EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_entry_print(fsm);
   378         fsm->state = ec_fsm_pdo_entry_state_error;
   396         fsm->state = ec_fsm_pdo_entry_state_error;
   380     }
   398     }
   381 
   399 
   382     // find first entry
   400     // find first entry
   383     if (!(fsm->entry = ec_fsm_pdo_entry_conf_next_entry(
   401     if (!(fsm->entry = ec_fsm_pdo_entry_conf_next_entry(
   384                     fsm, &fsm->source_pdo->entries))) {
   402                     fsm, &fsm->source_pdo->entries))) {
   385         
   403 
   386         EC_SLAVE_DBG(fsm->slave, 1, "No entries to map.\n");
   404         EC_SLAVE_DBG(fsm->slave, 1, "No entries to map.\n");
   387 
   405 
   388         fsm->state = ec_fsm_pdo_entry_state_end; // finished
   406         fsm->state = ec_fsm_pdo_entry_state_end; // finished
   389         return;
   407         return;
   390     }
   408     }
   391 
   409 
   392     // add first entry
   410     // add first entry
   393     fsm->entry_pos = 1;
   411     fsm->entry_pos = 1;
   394     ec_fsm_pdo_entry_conf_action_map(fsm);
   412     ec_fsm_pdo_entry_conf_action_map(fsm, datagram);
   395 }
   413 }
   396 
   414 
   397 /*****************************************************************************/
   415 /*****************************************************************************/
   398 
   416 
   399 /** Starts to add a PDO entry.
   417 /** Starts to add a PDO entry.
   400  */
   418  */
   401 void ec_fsm_pdo_entry_conf_action_map(
   419 void ec_fsm_pdo_entry_conf_action_map(
   402         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   420         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
       
   421         ec_datagram_t *datagram /**< Datagram to use. */
   403         )
   422         )
   404 {
   423 {
   405     uint32_t value;
   424     uint32_t value;
   406 
   425 
   407     EC_SLAVE_DBG(fsm->slave, 1, "Mapping PDO entry 0x%04X:%02X (%u bit)"
   426     EC_SLAVE_DBG(fsm->slave, 1, "Mapping PDO entry 0x%04X:%02X (%u bit)"
   411 
   430 
   412     value = fsm->entry->index << 16
   431     value = fsm->entry->index << 16
   413         | fsm->entry->subindex << 8 | fsm->entry->bit_length;
   432         | fsm->entry->subindex << 8 | fsm->entry->bit_length;
   414     EC_WRITE_U32(fsm->request.data, value);
   433     EC_WRITE_U32(fsm->request.data, value);
   415     fsm->request.data_size = 4;
   434     fsm->request.data_size = 4;
   416     ec_sdo_request_address(&fsm->request, fsm->source_pdo->index, fsm->entry_pos);
   435     ecrt_sdo_request_index(&fsm->request, fsm->source_pdo->index,
       
   436             fsm->entry_pos);
   417     ecrt_sdo_request_write(&fsm->request);
   437     ecrt_sdo_request_write(&fsm->request);
   418     
   438 
   419     fsm->state = ec_fsm_pdo_entry_conf_state_map_entry;
   439     fsm->state = ec_fsm_pdo_entry_conf_state_map_entry;
   420     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   440     ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   421     ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   441     ec_fsm_coe_exec(fsm->fsm_coe, datagram); // execute immediately
   422 }
   442 }
   423 
   443 
   424 /*****************************************************************************/
   444 /*****************************************************************************/
   425 
   445 
   426 /** Add a PDO entry.
   446 /** Add a PDO entry.
   427  */
   447  */
   428 void ec_fsm_pdo_entry_conf_state_map_entry(
   448 void ec_fsm_pdo_entry_conf_state_map_entry(
   429         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   449         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   430         )
   450         ec_datagram_t *datagram /**< Datagram to use. */
   431 {
   451         )
   432     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   452 {
       
   453     if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
       
   454         return;
       
   455     }
   433 
   456 
   434     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   457     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   435         EC_SLAVE_WARN(fsm->slave, "Failed to map PDO entry"
   458         EC_SLAVE_WARN(fsm->slave, "Failed to map PDO entry"
   436                 " 0x%04X:%02X (%u bit) to position %u.\n",
   459                 " 0x%04X:%02X (%u bit) to position %u.\n",
   437                 fsm->entry->index, fsm->entry->subindex,
   460                 fsm->entry->index, fsm->entry->subindex,
   446                     fsm, &fsm->entry->list))) {
   469                     fsm, &fsm->entry->list))) {
   447 
   470 
   448         // No more entries to add. Write entry count.
   471         // No more entries to add. Write entry count.
   449         EC_WRITE_U8(fsm->request.data, fsm->entry_pos);
   472         EC_WRITE_U8(fsm->request.data, fsm->entry_pos);
   450         fsm->request.data_size = 1;
   473         fsm->request.data_size = 1;
   451         ec_sdo_request_address(&fsm->request, fsm->source_pdo->index, 0);
   474         ecrt_sdo_request_index(&fsm->request, fsm->source_pdo->index, 0);
   452         ecrt_sdo_request_write(&fsm->request);
   475         ecrt_sdo_request_write(&fsm->request);
   453 
   476 
   454         EC_SLAVE_DBG(fsm->slave, 1, "Setting number of PDO entries to %u.\n",
   477         EC_SLAVE_DBG(fsm->slave, 1, "Setting number of PDO entries to %u.\n",
   455                 fsm->entry_pos);
   478                 fsm->entry_pos);
   456         
   479 
   457         fsm->state = ec_fsm_pdo_entry_conf_state_set_entry_count;
   480         fsm->state = ec_fsm_pdo_entry_conf_state_set_entry_count;
   458         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   481         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
   459         ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
   482         ec_fsm_coe_exec(fsm->fsm_coe, datagram); // execute immediately
   460         return;
   483         return;
   461     }
   484     }
   462 
   485 
   463     // add next entry
   486     // add next entry
   464     fsm->entry_pos++;
   487     fsm->entry_pos++;
   465     ec_fsm_pdo_entry_conf_action_map(fsm);
   488     ec_fsm_pdo_entry_conf_action_map(fsm, datagram);
   466 }
   489 }
   467 
   490 
   468 /*****************************************************************************/
   491 /*****************************************************************************/
   469 
   492 
   470 /** Set the number of entries.
   493 /** Set the number of entries.
   471  */
   494  */
   472 void ec_fsm_pdo_entry_conf_state_set_entry_count(
   495 void ec_fsm_pdo_entry_conf_state_set_entry_count(
   473         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   496         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   474         )
   497         ec_datagram_t *datagram /**< Datagram to use. */
   475 {
   498         )
   476     if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
   499 {
       
   500     if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
       
   501         return;
       
   502     }
   477 
   503 
   478     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   504     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
   479         EC_SLAVE_WARN(fsm->slave, "Failed to set number of entries.\n");
   505         EC_SLAVE_WARN(fsm->slave, "Failed to set number of entries.\n");
   480         EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_entry_print(fsm);
   506         EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_entry_print(fsm);
   481         fsm->state = ec_fsm_pdo_entry_state_error;
   507         fsm->state = ec_fsm_pdo_entry_state_error;
   493  *****************************************************************************/
   519  *****************************************************************************/
   494 
   520 
   495 /** State: ERROR.
   521 /** State: ERROR.
   496  */
   522  */
   497 void ec_fsm_pdo_entry_state_error(
   523 void ec_fsm_pdo_entry_state_error(
   498         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   524         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
       
   525         ec_datagram_t *datagram /**< Datagram to use. */
   499         )
   526         )
   500 {
   527 {
   501 }
   528 }
   502 
   529 
   503 /*****************************************************************************/
   530 /*****************************************************************************/
   504 
   531 
   505 /** State: END.
   532 /** State: END.
   506  */
   533  */
   507 void ec_fsm_pdo_entry_state_end(
   534 void ec_fsm_pdo_entry_state_end(
   508         ec_fsm_pdo_entry_t *fsm /**< PDO mapping state machine. */
   535         ec_fsm_pdo_entry_t *fsm, /**< PDO mapping state machine. */
   509         )
   536         ec_datagram_t *datagram /**< Datagram to use. */
   510 {
   537         )
   511 }
   538 {
   512 
   539 }
   513 /*****************************************************************************/
   540 
       
   541 /*****************************************************************************/