46 /*****************************************************************************/ |
46 /*****************************************************************************/ |
47 |
47 |
48 void ec_fsm_master_start(ec_fsm_t *); |
48 void ec_fsm_master_start(ec_fsm_t *); |
49 void ec_fsm_master_broadcast(ec_fsm_t *); |
49 void ec_fsm_master_broadcast(ec_fsm_t *); |
50 void ec_fsm_master_read_states(ec_fsm_t *); |
50 void ec_fsm_master_read_states(ec_fsm_t *); |
|
51 void ec_fsm_master_acknowledge(ec_fsm_t *); |
51 void ec_fsm_master_validate_vendor(ec_fsm_t *); |
52 void ec_fsm_master_validate_vendor(ec_fsm_t *); |
52 void ec_fsm_master_validate_product(ec_fsm_t *); |
53 void ec_fsm_master_validate_product(ec_fsm_t *); |
53 void ec_fsm_master_rewrite_addresses(ec_fsm_t *); |
54 void ec_fsm_master_rewrite_addresses(ec_fsm_t *); |
54 void ec_fsm_master_configure_slave(ec_fsm_t *); |
55 void ec_fsm_master_configure_slave(ec_fsm_t *); |
55 void ec_fsm_master_scan_slaves(ec_fsm_t *); |
56 void ec_fsm_master_scan_slaves(ec_fsm_t *); |
319 } |
320 } |
320 } |
321 } |
321 |
322 |
322 fsm->slave = slave; |
323 fsm->slave = slave; |
323 fsm->slave_state = ec_fsm_slaveconf_init; |
324 fsm->slave_state = ec_fsm_slaveconf_init; |
324 ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT); |
325 ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT); |
325 fsm->master_state = ec_fsm_master_configure_slave; |
326 fsm->master_state = ec_fsm_master_configure_slave; |
326 fsm->master_state(fsm); // execute immediately |
327 fsm->master_state(fsm); // execute immediately |
327 return; |
328 return; |
328 } |
329 } |
329 |
330 |
505 EC_INFO("Slave %i: %s -> %s.\n", |
506 EC_INFO("Slave %i: %s -> %s.\n", |
506 slave->ring_position, old_state, cur_state); |
507 slave->ring_position, old_state, cur_state); |
507 slave->current_state = new_state; |
508 slave->current_state = new_state; |
508 } |
509 } |
509 |
510 |
|
511 // check, if new slave state has to be acknowledged |
|
512 if (slave->current_state & EC_SLAVE_STATE_ACK_ERR && !slave->error_flag) { |
|
513 ec_fsm_change_ack(&fsm->fsm_change, slave); |
|
514 ec_fsm_change_exec(&fsm->fsm_change); |
|
515 fsm->master_state = ec_fsm_master_acknowledge; |
|
516 return; |
|
517 } |
|
518 |
|
519 ec_fsm_master_action_next_slave_state(fsm); |
|
520 } |
|
521 |
|
522 /*****************************************************************************/ |
|
523 |
|
524 /** |
|
525 Master state: ACKNOWLEDGE |
|
526 */ |
|
527 |
|
528 void ec_fsm_master_acknowledge(ec_fsm_t *fsm /**< finite state machine */) |
|
529 { |
|
530 ec_slave_t *slave = fsm->slave; |
|
531 |
|
532 if (ec_fsm_change_exec(&fsm->fsm_change)) return; |
|
533 |
|
534 if (!ec_fsm_change_success(&fsm->fsm_change)) { |
|
535 fsm->slave->error_flag = 1; |
|
536 EC_ERR("Failed to acknowledge state change on slave %i.\n", |
|
537 slave->ring_position); |
|
538 fsm->master_state = ec_fsm_master_error; |
|
539 return; |
|
540 } |
|
541 |
510 ec_fsm_master_action_next_slave_state(fsm); |
542 ec_fsm_master_action_next_slave_state(fsm); |
511 } |
543 } |
512 |
544 |
513 /*****************************************************************************/ |
545 /*****************************************************************************/ |
514 |
546 |
901 return; |
933 return; |
902 } |
934 } |
903 |
935 |
904 slave->current_state = EC_READ_U8(datagram->data); |
936 slave->current_state = EC_READ_U8(datagram->data); |
905 if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { |
937 if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { |
906 EC_WARN("Slave %i has state error bit set (0x%02X)!\n", |
938 char state_str[EC_STATE_STRING_SIZE]; |
907 slave->ring_position, slave->current_state); |
939 ec_state_string(slave->current_state, state_str); |
|
940 EC_WARN("Slave %i has state error bit set (%s)!\n", |
|
941 slave->ring_position, state_str); |
908 } |
942 } |
909 |
943 |
910 // read base data |
944 // read base data |
911 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6); |
945 ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6); |
912 ec_master_queue_datagram(fsm->master, datagram); |
946 ec_master_queue_datagram(fsm->master, datagram); |
1198 //ec_slave_check_crc(slave); |
1232 //ec_slave_check_crc(slave); |
1199 // TODO: Implement state machine for CRC checking. |
1233 // TODO: Implement state machine for CRC checking. |
1200 |
1234 |
1201 if (!slave->base_sync_count) { // no sync managers |
1235 if (!slave->base_sync_count) { // no sync managers |
1202 fsm->slave_state = ec_fsm_slaveconf_preop; |
1236 fsm->slave_state = ec_fsm_slaveconf_preop; |
1203 ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP); |
1237 ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP); |
1204 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1238 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1205 return; |
1239 return; |
1206 } |
1240 } |
1207 |
1241 |
1208 if (master->debug_level) { |
1242 if (master->debug_level) { |
1274 slave->ring_position); |
1308 slave->ring_position); |
1275 return; |
1309 return; |
1276 } |
1310 } |
1277 |
1311 |
1278 fsm->slave_state = ec_fsm_slaveconf_preop; |
1312 fsm->slave_state = ec_fsm_slaveconf_preop; |
1279 ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP); |
1313 ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP); |
1280 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1314 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1281 } |
1315 } |
1282 |
1316 |
1283 /*****************************************************************************/ |
1317 /*****************************************************************************/ |
1284 |
1318 |
1318 } |
1352 } |
1319 |
1353 |
1320 if (!slave->base_fmmu_count) { // skip FMMU configuration |
1354 if (!slave->base_fmmu_count) { // skip FMMU configuration |
1321 if (list_empty(&slave->sdo_confs)) { // skip SDO configuration |
1355 if (list_empty(&slave->sdo_confs)) { // skip SDO configuration |
1322 fsm->slave_state = ec_fsm_slaveconf_saveop; |
1356 fsm->slave_state = ec_fsm_slaveconf_saveop; |
1323 ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_SAVEOP); |
1357 ec_fsm_change_start(&fsm->fsm_change, slave, |
|
1358 EC_SLAVE_STATE_SAVEOP); |
1324 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1359 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1325 return; |
1360 return; |
1326 } |
1361 } |
1327 |
1362 |
1328 // start SDO configuration |
1363 // start SDO configuration |
1368 |
1403 |
1369 // No CoE configuration to be applied? Jump to SAVEOP state. |
1404 // No CoE configuration to be applied? Jump to SAVEOP state. |
1370 if (list_empty(&slave->sdo_confs)) { // skip SDO configuration |
1405 if (list_empty(&slave->sdo_confs)) { // skip SDO configuration |
1371 // set state to SAVEOP |
1406 // set state to SAVEOP |
1372 fsm->slave_state = ec_fsm_slaveconf_saveop; |
1407 fsm->slave_state = ec_fsm_slaveconf_saveop; |
1373 ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_SAVEOP); |
1408 ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_SAVEOP); |
1374 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1409 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1375 return; |
1410 return; |
1376 } |
1411 } |
1377 |
1412 |
1378 // start SDO configuration |
1413 // start SDO configuration |
1409 |
1444 |
1410 // All SDOs are now configured. |
1445 // All SDOs are now configured. |
1411 |
1446 |
1412 // set state to SAVEOP |
1447 // set state to SAVEOP |
1413 fsm->slave_state = ec_fsm_slaveconf_saveop; |
1448 fsm->slave_state = ec_fsm_slaveconf_saveop; |
1414 ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAVEOP); |
1449 ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAVEOP); |
1415 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1450 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1416 } |
1451 } |
1417 |
1452 |
1418 /*****************************************************************************/ |
1453 /*****************************************************************************/ |
1419 |
1454 |
1449 return; |
1484 return; |
1450 } |
1485 } |
1451 |
1486 |
1452 // set state to OP |
1487 // set state to OP |
1453 fsm->slave_state = ec_fsm_slaveconf_op; |
1488 fsm->slave_state = ec_fsm_slaveconf_op; |
1454 ec_fsm_change(&fsm->fsm_change, slave, EC_SLAVE_STATE_OP); |
1489 ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_OP); |
1455 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1490 ec_fsm_change_exec(&fsm->fsm_change); // execute immediately |
1456 } |
1491 } |
1457 |
1492 |
1458 /*****************************************************************************/ |
1493 /*****************************************************************************/ |
1459 |
1494 |