1450 */ |
1450 */ |
1451 |
1451 |
1452 void ec_master_sync_io(ec_master_t *master /**< EtherCAT master */) |
1452 void ec_master_sync_io(ec_master_t *master /**< EtherCAT master */) |
1453 { |
1453 { |
1454 ec_datagram_t *datagram; |
1454 ec_datagram_t *datagram; |
1455 unsigned int datagrams_waiting; |
1455 unsigned int datagrams_sent; |
1456 |
1456 |
1457 // send datagrams |
1457 // send all datagrams |
1458 ecrt_master_send(master); |
1458 ecrt_master_send(master); |
1459 |
1459 |
1460 while (1) { // active waiting |
1460 while (1) { // active waiting |
1461 ecrt_master_receive(master); // receive and dequeue datagrams |
1461 ecrt_master_receive(master); // receive and dequeue datagrams |
1462 |
1462 |
1463 // count number of datagrams still waiting for response |
1463 // count number of datagrams still waiting for response |
1464 datagrams_waiting = 0; |
1464 datagrams_sent = 0; |
1465 list_for_each_entry(datagram, &master->datagram_queue, queue) { |
1465 list_for_each_entry(datagram, &master->datagram_queue, queue) { |
1466 datagrams_waiting++; |
1466 // there may be another process that queued commands |
1467 } |
1467 // in the meantime. |
1468 |
1468 if (datagram->state == EC_DATAGRAM_QUEUED) continue; |
1469 // if there are no more datagrams waiting, abort loop. |
1469 datagrams_sent++; |
1470 if (!datagrams_waiting) break; |
1470 } |
|
1471 |
|
1472 // abort loop if there are no more datagrams marked as sent. |
|
1473 if (!datagrams_sent) break; |
1471 } |
1474 } |
1472 } |
1475 } |
1473 |
1476 |
1474 /*****************************************************************************/ |
1477 /*****************************************************************************/ |
1475 |
1478 |