master/master.c
changeset 449 3caf8ff4d8a2
parent 448 e4b76dc7910c
child 456 dea14706efc2
equal deleted inserted replaced
448:e4b76dc7910c 449:3caf8ff4d8a2
   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 /**