Ver Fonte

update: stop timer after slaves are in preop

Signed-off-by: sakumisu <1203593632@qq.com>
sakumisu há 2 meses atrás
pai
commit
5206ef5252
1 ficheiros alterados com 17 adições e 3 exclusões
  1. 17 3
      src/ec_master.c

+ 17 - 3
src/ec_master.c

@@ -648,7 +648,7 @@ int ec_master_stop(ec_master_t *master)
     }
 
     ec_osal_mutex_take(master->scan_lock);
-    ec_htimer_stop();
+    master->active = false;
 
     for (uint32_t i = 0; i < master->slave_count; i++) {
         master->slaves[i].requested_state = EC_SLAVE_STATE_PREOP;
@@ -656,6 +656,22 @@ int ec_master_stop(ec_master_t *master)
         master->slaves[i].force_update = true;
     }
 
+    while (1) {
+        for (netdev_idx = EC_NETDEV_MAIN; netdev_idx < CONFIG_EC_MAX_NETDEVS; netdev_idx++) {
+            if (master->netdev[netdev_idx]->link_state == 0) {
+                goto out;
+            }
+
+            if ((master->slaves_state[netdev_idx] & EC_SLAVE_STATE_MASK) == EC_SLAVE_STATE_PREOP) {
+                goto out;
+            }
+        }
+        ec_osal_msleep(10);
+    }
+
+out:
+    ec_htimer_stop();
+
     ec_dlist_for_each_entry_safe(pdo_datagram, n, &master->pdo_datagram_queue, queue)
     {
         for (netdev_idx = EC_NETDEV_MAIN; netdev_idx < CONFIG_EC_MAX_NETDEVS; netdev_idx++) {
@@ -665,8 +681,6 @@ int ec_master_stop(ec_master_t *master)
         ec_osal_free(pdo_datagram);
     }
 
-    master->active = false;
-
     ec_master_enter_idle(master);
 
     ec_osal_mutex_give(master->scan_lock);