415 |
415 |
416 void ec_master_leave_operation_mode(ec_master_t *master |
416 void ec_master_leave_operation_mode(ec_master_t *master |
417 /**< EtherCAT master */) |
417 /**< EtherCAT master */) |
418 { |
418 { |
419 ec_slave_t *slave; |
419 ec_slave_t *slave; |
|
420 ec_fsm_t *fsm = &master->fsm; |
|
421 ec_datagram_t *datagram = &master->fsm.datagram; |
|
422 |
|
423 // wait for FSM datagram |
|
424 if (datagram->state == EC_DATAGRAM_SENT) { |
|
425 while (get_cycles() - datagram->cycles_sent |
|
426 < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000)) {} |
|
427 ecrt_master_receive(master); |
|
428 } |
|
429 |
|
430 // set states for all slaves |
|
431 list_for_each_entry(slave, &master->slaves, list) { |
|
432 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
|
433 } |
|
434 |
|
435 // execute master FSM to deactivate slaves |
|
436 while (ec_fsm_exec(fsm)) { |
|
437 ec_master_sync_io(master); |
|
438 } |
420 |
439 |
421 ec_master_destroy_domains(master); |
440 ec_master_destroy_domains(master); |
422 |
441 |
423 master->request_cb = NULL; |
442 master->request_cb = NULL; |
424 master->release_cb = NULL; |
443 master->release_cb = NULL; |
1323 |
1342 |
1324 /*****************************************************************************/ |
1343 /*****************************************************************************/ |
1325 |
1344 |
1326 /** |
1345 /** |
1327 Resets all slaves to INIT state. |
1346 Resets all slaves to INIT state. |
|
1347 This method is deprecated and will disappear in the next version |
|
1348 of the realtime interface. The functionality is moved to |
|
1349 ecrt_master_release(). |
1328 \ingroup RealtimeInterface |
1350 \ingroup RealtimeInterface |
1329 */ |
1351 */ |
1330 |
1352 |
1331 void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT master */) |
1353 void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT master */) |
1332 { |
1354 { |
1333 ec_fsm_t *fsm = &master->fsm; |
|
1334 ec_slave_t *slave; |
|
1335 ec_datagram_t *datagram = &master->fsm.datagram; |
|
1336 |
|
1337 // wait for FSM datagram |
|
1338 if (datagram->state == EC_DATAGRAM_SENT) { |
|
1339 while (get_cycles() - datagram->cycles_sent |
|
1340 < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000)) {} |
|
1341 ecrt_master_receive(master); |
|
1342 } |
|
1343 |
|
1344 // set states for all slaves |
|
1345 list_for_each_entry(slave, &master->slaves, list) { |
|
1346 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
|
1347 } |
|
1348 |
|
1349 // execute master FSM to deactivate slaves |
|
1350 while (ec_fsm_exec(fsm)) { |
|
1351 ec_master_sync_io(master); |
|
1352 } |
|
1353 } |
1355 } |
1354 |
1356 |
1355 /*****************************************************************************/ |
1357 /*****************************************************************************/ |
1356 |
1358 |
1357 /** |
1359 /** |