00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00034
00035
00036 #include "globals.h"
00037 #include "master.h"
00038 #include "mailbox.h"
00039 #include "slave_config.h"
00040
00041 #include "fsm_pdo.h"
00042
00043
00044
00045 void ec_fsm_pdo_read_state_start(ec_fsm_pdo_t *, ec_datagram_t *);
00046 void ec_fsm_pdo_read_state_pdo_count(ec_fsm_pdo_t *, ec_datagram_t *);
00047 void ec_fsm_pdo_read_state_pdo(ec_fsm_pdo_t *, ec_datagram_t *);
00048 void ec_fsm_pdo_read_state_pdo_entries(ec_fsm_pdo_t *, ec_datagram_t *);
00049
00050 void ec_fsm_pdo_read_action_next_sync(ec_fsm_pdo_t *, ec_datagram_t *);
00051 void ec_fsm_pdo_read_action_next_pdo(ec_fsm_pdo_t *, ec_datagram_t *);
00052
00053 void ec_fsm_pdo_conf_state_start(ec_fsm_pdo_t *, ec_datagram_t *);
00054 void ec_fsm_pdo_conf_state_read_mapping(ec_fsm_pdo_t *, ec_datagram_t *);
00055 void ec_fsm_pdo_conf_state_mapping(ec_fsm_pdo_t *, ec_datagram_t *);
00056 void ec_fsm_pdo_conf_state_zero_pdo_count(ec_fsm_pdo_t *, ec_datagram_t *);
00057 void ec_fsm_pdo_conf_state_assign_pdo(ec_fsm_pdo_t *, ec_datagram_t *);
00058 void ec_fsm_pdo_conf_state_set_pdo_count(ec_fsm_pdo_t *, ec_datagram_t *);
00059
00060 void ec_fsm_pdo_conf_action_next_sync(ec_fsm_pdo_t *, ec_datagram_t *);
00061 void ec_fsm_pdo_conf_action_pdo_mapping(ec_fsm_pdo_t *, ec_datagram_t *);
00062 void ec_fsm_pdo_conf_action_check_mapping(ec_fsm_pdo_t *, ec_datagram_t *);
00063 void ec_fsm_pdo_conf_action_next_pdo_mapping(ec_fsm_pdo_t *, ec_datagram_t *);
00064 void ec_fsm_pdo_conf_action_check_assignment(ec_fsm_pdo_t *, ec_datagram_t *);
00065 void ec_fsm_pdo_conf_action_assign_pdo(ec_fsm_pdo_t *, ec_datagram_t *);
00066
00067 void ec_fsm_pdo_state_end(ec_fsm_pdo_t *, ec_datagram_t *);
00068 void ec_fsm_pdo_state_error(ec_fsm_pdo_t *, ec_datagram_t *);
00069
00070
00071
00074 void ec_fsm_pdo_init(
00075 ec_fsm_pdo_t *fsm,
00076 ec_fsm_coe_t *fsm_coe
00077 )
00078 {
00079 fsm->fsm_coe = fsm_coe;
00080 ec_fsm_pdo_entry_init(&fsm->fsm_pdo_entry, fsm_coe);
00081 ec_pdo_list_init(&fsm->pdos);
00082 ec_sdo_request_init(&fsm->request);
00083 ec_pdo_init(&fsm->slave_pdo);
00084 }
00085
00086
00087
00090 void ec_fsm_pdo_clear(
00091 ec_fsm_pdo_t *fsm
00092 )
00093 {
00094 ec_fsm_pdo_entry_clear(&fsm->fsm_pdo_entry);
00095 ec_pdo_list_clear(&fsm->pdos);
00096 ec_sdo_request_clear(&fsm->request);
00097 ec_pdo_clear(&fsm->slave_pdo);
00098 }
00099
00100
00101
00104 void ec_fsm_pdo_print(
00105 ec_fsm_pdo_t *fsm
00106 )
00107 {
00108 printk("Currently assigned PDOs: ");
00109 ec_pdo_list_print(&fsm->sync->pdos);
00110 printk(". PDOs to assign: ");
00111 ec_pdo_list_print(&fsm->pdos);
00112 printk("\n");
00113 }
00114
00115
00116
00119 void ec_fsm_pdo_start_reading(
00120 ec_fsm_pdo_t *fsm,
00121 ec_slave_t *slave
00122 )
00123 {
00124 fsm->slave = slave;
00125 fsm->state = ec_fsm_pdo_read_state_start;
00126 }
00127
00128
00129
00132 void ec_fsm_pdo_start_configuration(
00133 ec_fsm_pdo_t *fsm,
00134 ec_slave_t *slave
00135 )
00136 {
00137 fsm->slave = slave;
00138 fsm->state = ec_fsm_pdo_conf_state_start;
00139 }
00140
00141
00142
00147 int ec_fsm_pdo_running(
00148 const ec_fsm_pdo_t *fsm
00149 )
00150 {
00151 return fsm->state != ec_fsm_pdo_state_end
00152 && fsm->state != ec_fsm_pdo_state_error;
00153 }
00154
00155
00156
00164 int ec_fsm_pdo_exec(
00165 ec_fsm_pdo_t *fsm,
00166 ec_datagram_t *datagram
00167 )
00168 {
00169 fsm->state(fsm, datagram);
00170
00171 return ec_fsm_pdo_running(fsm);
00172 }
00173
00174
00175
00180 int ec_fsm_pdo_success(
00181 const ec_fsm_pdo_t *fsm
00182 )
00183 {
00184 return fsm->state == ec_fsm_pdo_state_end;
00185 }
00186
00187
00188
00189
00190
00193 void ec_fsm_pdo_read_state_start(
00194 ec_fsm_pdo_t *fsm,
00195 ec_datagram_t *datagram
00196 )
00197 {
00198
00199 fsm->sync_index = 1;
00200 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00201 }
00202
00203
00204
00207 void ec_fsm_pdo_read_action_next_sync(
00208 ec_fsm_pdo_t *fsm,
00209 ec_datagram_t *datagram
00210 )
00211 {
00212 ec_slave_t *slave = fsm->slave;
00213
00214 fsm->sync_index++;
00215
00216 for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) {
00217 if (!(fsm->sync = ec_slave_get_sync(slave, fsm->sync_index)))
00218 continue;
00219
00220 EC_SLAVE_DBG(slave, 1, "Reading PDO assignment of SM%u.\n",
00221 fsm->sync_index);
00222
00223 ec_pdo_list_clear_pdos(&fsm->pdos);
00224
00225 ecrt_sdo_request_index(&fsm->request, 0x1C10 + fsm->sync_index, 0);
00226 ecrt_sdo_request_read(&fsm->request);
00227 fsm->state = ec_fsm_pdo_read_state_pdo_count;
00228 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
00229 ec_fsm_coe_exec(fsm->fsm_coe, datagram);
00230 return;
00231 }
00232
00233 EC_SLAVE_DBG(slave, 1, "Reading of PDO configuration finished.\n");
00234
00235 ec_pdo_list_clear_pdos(&fsm->pdos);
00236 fsm->state = ec_fsm_pdo_state_end;
00237 }
00238
00239
00240
00243 void ec_fsm_pdo_read_state_pdo_count(
00244 ec_fsm_pdo_t *fsm,
00245 ec_datagram_t *datagram
00246 )
00247 {
00248 if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
00249 return;
00250 }
00251
00252 if (!ec_fsm_coe_success(fsm->fsm_coe)) {
00253 EC_SLAVE_ERR(fsm->slave, "Failed to read number of assigned PDOs"
00254 " for SM%u.\n", fsm->sync_index);
00255 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00256 return;
00257 }
00258
00259 if (fsm->request.data_size != sizeof(uint8_t)) {
00260 EC_SLAVE_ERR(fsm->slave, "Invalid data size %zu returned"
00261 " when uploading SDO 0x%04X:%02X.\n", fsm->request.data_size,
00262 fsm->request.index, fsm->request.subindex);
00263 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00264 return;
00265 }
00266 fsm->pdo_count = EC_READ_U8(fsm->request.data);
00267
00268 EC_SLAVE_DBG(fsm->slave, 1, "%u PDOs assigned.\n", fsm->pdo_count);
00269
00270
00271 fsm->pdo_pos = 1;
00272 ec_fsm_pdo_read_action_next_pdo(fsm, datagram);
00273 }
00274
00275
00276
00279 void ec_fsm_pdo_read_action_next_pdo(
00280 ec_fsm_pdo_t *fsm,
00281 ec_datagram_t *datagram
00282 )
00283 {
00284 if (fsm->pdo_pos <= fsm->pdo_count) {
00285 ecrt_sdo_request_index(&fsm->request, 0x1C10 + fsm->sync_index,
00286 fsm->pdo_pos);
00287 ecrt_sdo_request_read(&fsm->request);
00288 fsm->state = ec_fsm_pdo_read_state_pdo;
00289 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
00290 ec_fsm_coe_exec(fsm->fsm_coe, datagram);
00291 return;
00292 }
00293
00294
00295
00296 ec_pdo_list_copy(&fsm->sync->pdos, &fsm->pdos);
00297 ec_pdo_list_clear_pdos(&fsm->pdos);
00298
00299
00300 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00301 }
00302
00303
00304
00307 void ec_fsm_pdo_read_state_pdo(
00308 ec_fsm_pdo_t *fsm,
00309 ec_datagram_t *datagram
00310 )
00311 {
00312 if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
00313 return;
00314 }
00315
00316 if (!ec_fsm_coe_success(fsm->fsm_coe)) {
00317 EC_SLAVE_ERR(fsm->slave, "Failed to read index of"
00318 " assigned PDO %u from SM%u.\n",
00319 fsm->pdo_pos, fsm->sync_index);
00320 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00321 return;
00322 }
00323
00324 if (fsm->request.data_size != sizeof(uint16_t)) {
00325 EC_SLAVE_ERR(fsm->slave, "Invalid data size %zu returned"
00326 " when uploading SDO 0x%04X:%02X.\n", fsm->request.data_size,
00327 fsm->request.index, fsm->request.subindex);
00328 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00329 return;
00330 }
00331
00332 if (!(fsm->pdo = (ec_pdo_t *)
00333 kmalloc(sizeof(ec_pdo_t), GFP_KERNEL))) {
00334 EC_SLAVE_ERR(fsm->slave, "Failed to allocate PDO.\n");
00335 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00336 return;
00337 }
00338
00339 ec_pdo_init(fsm->pdo);
00340 fsm->pdo->index = EC_READ_U16(fsm->request.data);
00341 fsm->pdo->sync_index = fsm->sync_index;
00342
00343 EC_SLAVE_DBG(fsm->slave, 1, "PDO 0x%04X.\n", fsm->pdo->index);
00344
00345 list_add_tail(&fsm->pdo->list, &fsm->pdos.list);
00346
00347 fsm->state = ec_fsm_pdo_read_state_pdo_entries;
00348 ec_fsm_pdo_entry_start_reading(&fsm->fsm_pdo_entry, fsm->slave, fsm->pdo);
00349 fsm->state(fsm, datagram);
00350 }
00351
00352
00353
00356 void ec_fsm_pdo_read_state_pdo_entries(
00357 ec_fsm_pdo_t *fsm,
00358 ec_datagram_t *datagram
00359 )
00360 {
00361 if (ec_fsm_pdo_entry_exec(&fsm->fsm_pdo_entry, datagram)) {
00362 return;
00363 }
00364
00365 if (!ec_fsm_pdo_entry_success(&fsm->fsm_pdo_entry)) {
00366 EC_SLAVE_ERR(fsm->slave, "Failed to read mapped PDO entries"
00367 " for PDO 0x%04X.\n", fsm->pdo->index);
00368 ec_fsm_pdo_read_action_next_sync(fsm, datagram);
00369 return;
00370 }
00371
00372
00373 fsm->pdo_pos++;
00374 ec_fsm_pdo_read_action_next_pdo(fsm, datagram);
00375 }
00376
00377
00378
00379
00380
00383 void ec_fsm_pdo_conf_state_start(
00384 ec_fsm_pdo_t *fsm,
00385 ec_datagram_t *datagram
00386 )
00387 {
00388 if (!fsm->slave->config) {
00389 fsm->state = ec_fsm_pdo_state_end;
00390 return;
00391 }
00392
00393 fsm->sync_index = 1;
00394 ec_fsm_pdo_conf_action_next_sync(fsm, datagram);
00395 }
00396
00397
00398
00403 ec_pdo_t *ec_fsm_pdo_conf_action_next_pdo(
00404 const ec_fsm_pdo_t *fsm,
00405 const struct list_head *list
00406 )
00407 {
00408 list = list->next;
00409 if (list == &fsm->pdos.list)
00410 return NULL;
00411 return list_entry(list, ec_pdo_t, list);
00412 }
00413
00414
00415
00418 void ec_fsm_pdo_conf_action_next_sync(
00419 ec_fsm_pdo_t *fsm,
00420 ec_datagram_t *datagram
00421 )
00422 {
00423 fsm->sync_index++;
00424
00425 for (; fsm->sync_index < EC_MAX_SYNC_MANAGERS; fsm->sync_index++) {
00426 if (!fsm->slave->config) {
00427
00428 fsm->state = ec_fsm_pdo_state_error;
00429 return;
00430 }
00431
00432 if (ec_pdo_list_copy(&fsm->pdos,
00433 &fsm->slave->config->sync_configs[fsm->sync_index].pdos))
00434 {
00435 fsm->state = ec_fsm_pdo_state_error;
00436 return;
00437 }
00438
00439 if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) {
00440 if (!list_empty(&fsm->pdos.list))
00441 EC_SLAVE_WARN(fsm->slave, "PDOs configured for SM%u,"
00442 " but slave does not provide the"
00443 " sync manager information!\n",
00444 fsm->sync_index);
00445 continue;
00446 }
00447
00448
00449 if (!(fsm->pdo =
00450 ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
00451
00452 ec_fsm_pdo_conf_action_check_assignment(fsm, datagram);
00453 return;
00454 }
00455
00456 ec_fsm_pdo_conf_action_pdo_mapping(fsm, datagram);
00457 return;
00458 }
00459
00460 fsm->state = ec_fsm_pdo_state_end;
00461 }
00462
00463
00464
00467 void ec_fsm_pdo_conf_action_pdo_mapping(
00468 ec_fsm_pdo_t *fsm,
00469 ec_datagram_t *datagram
00470 )
00471 {
00472 const ec_pdo_t *assigned_pdo;
00473
00474 fsm->slave_pdo.index = fsm->pdo->index;
00475
00476 if ((assigned_pdo = ec_slave_find_pdo(fsm->slave, fsm->pdo->index))) {
00477 ec_pdo_copy_entries(&fsm->slave_pdo, assigned_pdo);
00478 } else {
00479 ec_pdo_clear_entries(&fsm->slave_pdo);
00480 }
00481
00482 if (list_empty(&fsm->slave_pdo.entries)) {
00483 EC_SLAVE_DBG(fsm->slave, 1, "Reading mapping of PDO 0x%04X.\n",
00484 fsm->pdo->index);
00485
00486
00487 ec_fsm_pdo_entry_start_reading(&fsm->fsm_pdo_entry, fsm->slave,
00488 &fsm->slave_pdo);
00489 fsm->state = ec_fsm_pdo_conf_state_read_mapping;
00490 fsm->state(fsm, datagram);
00491 return;
00492 }
00493
00494
00495 ec_fsm_pdo_conf_action_check_mapping(fsm, datagram);
00496 }
00497
00498
00499
00502 void ec_fsm_pdo_conf_state_read_mapping(
00503 ec_fsm_pdo_t *fsm,
00504 ec_datagram_t *datagram
00505 )
00506 {
00507 if (ec_fsm_pdo_entry_exec(&fsm->fsm_pdo_entry, datagram)) {
00508 return;
00509 }
00510
00511 if (!ec_fsm_pdo_entry_success(&fsm->fsm_pdo_entry))
00512 EC_SLAVE_WARN(fsm->slave,
00513 "Failed to read PDO entries for PDO 0x%04X.\n",
00514 fsm->pdo->index);
00515
00516
00517 ec_fsm_pdo_conf_action_check_mapping(fsm, datagram);
00518 }
00519
00520
00521
00526 void ec_fsm_pdo_conf_action_check_mapping(
00527 ec_fsm_pdo_t *fsm,
00528 ec_datagram_t *datagram
00529 )
00530 {
00531
00532 if ((fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
00533 && fsm->slave->sii.has_general
00534 && fsm->slave->sii.coe_details.enable_pdo_configuration) {
00535
00536
00537 ec_fsm_pdo_entry_start_configuration(&fsm->fsm_pdo_entry, fsm->slave,
00538 fsm->pdo, &fsm->slave_pdo);
00539 fsm->state = ec_fsm_pdo_conf_state_mapping;
00540 fsm->state(fsm, datagram);
00541 return;
00542 }
00543 else if (!ec_pdo_equal_entries(fsm->pdo, &fsm->slave_pdo)) {
00544 EC_SLAVE_WARN(fsm->slave, "Slave does not support"
00545 " changing the PDO mapping!\n");
00546 EC_SLAVE_WARN(fsm->slave, "");
00547 printk("Currently mapped PDO entries: ");
00548 ec_pdo_print_entries(&fsm->slave_pdo);
00549 printk(". Entries to map: ");
00550 ec_pdo_print_entries(fsm->pdo);
00551 printk("\n");
00552 }
00553
00554 ec_fsm_pdo_conf_action_next_pdo_mapping(fsm, datagram);
00555 }
00556
00557
00558
00561 void ec_fsm_pdo_conf_state_mapping(
00562 ec_fsm_pdo_t *fsm,
00563 ec_datagram_t *datagram
00564 )
00565 {
00566 if (ec_fsm_pdo_entry_exec(&fsm->fsm_pdo_entry, datagram)) {
00567 return;
00568 }
00569
00570 if (!ec_fsm_pdo_entry_success(&fsm->fsm_pdo_entry))
00571 EC_SLAVE_WARN(fsm->slave,
00572 "Failed to configure mapping of PDO 0x%04X.\n",
00573 fsm->pdo->index);
00574
00575 ec_fsm_pdo_conf_action_next_pdo_mapping(fsm, datagram);
00576 }
00577
00578
00579
00582 void ec_fsm_pdo_conf_action_next_pdo_mapping(
00583 ec_fsm_pdo_t *fsm,
00584 ec_datagram_t *datagram
00585 )
00586 {
00587
00588 if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdo->list))) {
00589
00590 ec_fsm_pdo_conf_action_check_assignment(fsm, datagram);
00591 return;
00592 }
00593
00594 ec_fsm_pdo_conf_action_pdo_mapping(fsm, datagram);
00595 }
00596
00597
00598
00601 void ec_fsm_pdo_conf_action_check_assignment(
00602 ec_fsm_pdo_t *fsm,
00603 ec_datagram_t *datagram
00604 )
00605 {
00606 if ((fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
00607 && fsm->slave->sii.has_general
00608 && fsm->slave->sii.coe_details.enable_pdo_assign) {
00609
00610
00611 if (fsm->slave->master->debug_level) {
00612 EC_SLAVE_DBG(fsm->slave, 1, "Setting PDO assignment of SM%u:\n",
00613 fsm->sync_index);
00614 EC_SLAVE_DBG(fsm->slave, 1, ""); ec_fsm_pdo_print(fsm);
00615 }
00616
00617 if (ec_sdo_request_alloc(&fsm->request, 2)) {
00618 fsm->state = ec_fsm_pdo_state_error;
00619 return;
00620 }
00621
00622
00623 EC_WRITE_U8(fsm->request.data, 0);
00624 fsm->request.data_size = 1;
00625 ecrt_sdo_request_index(&fsm->request, 0x1C10 + fsm->sync_index, 0);
00626 ecrt_sdo_request_write(&fsm->request);
00627
00628 EC_SLAVE_DBG(fsm->slave, 1, "Setting number of assigned"
00629 " PDOs to zero.\n");
00630
00631 fsm->state = ec_fsm_pdo_conf_state_zero_pdo_count;
00632 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
00633 ec_fsm_coe_exec(fsm->fsm_coe, datagram);
00634 return;
00635 }
00636 else if (!ec_pdo_list_equal(&fsm->sync->pdos, &fsm->pdos)) {
00637 EC_SLAVE_WARN(fsm->slave, "Slave does not support assigning PDOs!\n");
00638 EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm);
00639 }
00640
00641 ec_fsm_pdo_conf_action_next_sync(fsm, datagram);
00642 }
00643
00644
00645
00648 void ec_fsm_pdo_conf_state_zero_pdo_count(
00649 ec_fsm_pdo_t *fsm,
00650 ec_datagram_t *datagram
00651 )
00652 {
00653 if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
00654 return;
00655 }
00656
00657 if (!ec_fsm_coe_success(fsm->fsm_coe)) {
00658 EC_SLAVE_WARN(fsm->slave, "Failed to clear PDO assignment of SM%u.\n",
00659 fsm->sync_index);
00660 EC_SLAVE_WARN(fsm->slave, "");
00661 ec_fsm_pdo_print(fsm);
00662 ec_fsm_pdo_conf_action_next_sync(fsm, datagram);
00663 return;
00664 }
00665
00666
00667 ec_pdo_list_clear_pdos(&fsm->sync->pdos);
00668
00669
00670
00671
00672 if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdos.list))) {
00673
00674 ec_fsm_pdo_conf_action_next_sync(fsm, datagram);
00675 return;
00676 }
00677
00678
00679 fsm->pdo_pos = 1;
00680 ec_fsm_pdo_conf_action_assign_pdo(fsm, datagram);
00681 }
00682
00683
00684
00687 void ec_fsm_pdo_conf_action_assign_pdo(
00688 ec_fsm_pdo_t *fsm,
00689 ec_datagram_t *datagram
00690 )
00691 {
00692 EC_WRITE_U16(fsm->request.data, fsm->pdo->index);
00693 fsm->request.data_size = 2;
00694 ecrt_sdo_request_index(&fsm->request,
00695 0x1C10 + fsm->sync_index, fsm->pdo_pos);
00696 ecrt_sdo_request_write(&fsm->request);
00697
00698 EC_SLAVE_DBG(fsm->slave, 1, "Assigning PDO 0x%04X at position %u.\n",
00699 fsm->pdo->index, fsm->pdo_pos);
00700
00701 fsm->state = ec_fsm_pdo_conf_state_assign_pdo;
00702 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
00703 ec_fsm_coe_exec(fsm->fsm_coe, datagram);
00704 }
00705
00706
00707
00710 void ec_fsm_pdo_conf_state_assign_pdo(
00711 ec_fsm_pdo_t *fsm,
00712 ec_datagram_t *datagram
00713 )
00714 {
00715 if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
00716 return;
00717 }
00718
00719 if (!ec_fsm_coe_success(fsm->fsm_coe)) {
00720 EC_SLAVE_WARN(fsm->slave, "Failed to assign PDO 0x%04X at position %u"
00721 " of SM%u.\n",
00722 fsm->pdo->index, fsm->pdo_pos, fsm->sync_index);
00723 EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm);
00724 fsm->state = ec_fsm_pdo_state_error;
00725 return;
00726 }
00727
00728
00729 if (!(fsm->pdo = ec_fsm_pdo_conf_action_next_pdo(fsm, &fsm->pdo->list))) {
00730
00731 EC_WRITE_U8(fsm->request.data, fsm->pdo_pos);
00732 fsm->request.data_size = 1;
00733 ecrt_sdo_request_index(&fsm->request, 0x1C10 + fsm->sync_index, 0);
00734 ecrt_sdo_request_write(&fsm->request);
00735
00736 EC_SLAVE_DBG(fsm->slave, 1,
00737 "Setting number of assigned PDOs to %u.\n",
00738 fsm->pdo_pos);
00739
00740 fsm->state = ec_fsm_pdo_conf_state_set_pdo_count;
00741 ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
00742 ec_fsm_coe_exec(fsm->fsm_coe, datagram);
00743 return;
00744 }
00745
00746
00747 fsm->pdo_pos++;
00748 ec_fsm_pdo_conf_action_assign_pdo(fsm, datagram);
00749 }
00750
00751
00752
00755 void ec_fsm_pdo_conf_state_set_pdo_count(
00756 ec_fsm_pdo_t *fsm,
00757 ec_datagram_t *datagram
00758 )
00759 {
00760 if (ec_fsm_coe_exec(fsm->fsm_coe, datagram)) {
00761 return;
00762 }
00763
00764 if (!ec_fsm_coe_success(fsm->fsm_coe)) {
00765 EC_SLAVE_WARN(fsm->slave, "Failed to set number of"
00766 " assigned PDOs of SM%u.\n", fsm->sync_index);
00767 EC_SLAVE_WARN(fsm->slave, ""); ec_fsm_pdo_print(fsm);
00768 fsm->state = ec_fsm_pdo_state_error;
00769 return;
00770 }
00771
00772
00773 ec_pdo_list_copy(&fsm->sync->pdos, &fsm->pdos);
00774
00775 EC_SLAVE_DBG(fsm->slave, 1, "Successfully configured"
00776 " PDO assignment of SM%u.\n", fsm->sync_index);
00777
00778
00779 ec_fsm_pdo_conf_action_next_sync(fsm, datagram);
00780 }
00781
00782
00783
00784
00785
00788 void ec_fsm_pdo_state_error(
00789 ec_fsm_pdo_t *fsm,
00790 ec_datagram_t *datagram
00791 )
00792 {
00793 }
00794
00795
00796
00799 void ec_fsm_pdo_state_end(
00800 ec_fsm_pdo_t *fsm,
00801 ec_datagram_t *datagram
00802 )
00803 {
00804 }
00805
00806