master/master.c
changeset 664 18c48cb7de06
parent 663 38d9c37664d9
child 684 bf991809dcf0
--- a/master/master.c	Fri Mar 16 14:42:04 2007 +0000
+++ b/master/master.c	Thu May 03 14:29:21 2007 +0000
@@ -453,6 +453,7 @@
 
     master->mode = EC_MASTER_MODE_OPERATION;
     master->pdo_slaves_offline = 0; // assume all PDO slaves online
+    master->frames_timed_out = 0;
     master->ext_request_cb = NULL;
     master->ext_release_cb = NULL;
     master->ext_cb_data = NULL;
@@ -1485,6 +1486,7 @@
 {
     ec_datagram_t *datagram, *next;
     cycles_t cycles_timeout;
+    unsigned int frames_timed_out = 0;
 
     // receive datagrams
     ec_device_poll(&master->main_device);
@@ -1497,12 +1499,15 @@
 
         if (master->main_device.cycles_poll - datagram->cycles_sent
             > cycles_timeout) {
+            frames_timed_out = 1;
             list_del_init(&datagram->queue);
             datagram->state = EC_DATAGRAM_TIMED_OUT;
             master->stats.timeouts++;
             ec_master_output_stats(master);
         }
     }
+
+    master->frames_timed_out = frames_timed_out;
 }
 
 /*****************************************************************************/
@@ -1563,7 +1568,8 @@
         )
 {
     status->bus_status =
-        master->pdo_slaves_offline ? EC_BUS_FAILURE : EC_BUS_OK;
+        (master->pdo_slaves_offline || master->frames_timed_out)
+        ? EC_BUS_FAILURE : EC_BUS_OK;
     status->bus_tainted = master->fsm.tainted; 
     status->slaves_responding = master->fsm.slaves_responding;
 }