From d514439e6e7ae72c99d04ed67ac3abcb8f30bea0 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Fri, 1 Aug 2008 08:58:35 +0000
Subject: [PATCH] Configure Pdos before configuring the Pdo sync managers, to
 earlier detect problems with non-existing SM information.

---
 TODO                                    |  1 -
 documentation/graphs/fsm_slave_conf.dot | 59 +++++++++---------------
 master/fsm_pdo.c                        |  2 +-
 master/fsm_slave_config.c               | 60 +++++++++++++++----------
 4 files changed, 58 insertions(+), 64 deletions(-)

diff --git a/TODO b/TODO
index 86bb85ed..61ac08bc 100644
--- a/TODO
+++ b/TODO
@@ -14,7 +14,6 @@ Version 1.4.0:
 * Remove ec_sync_t::assign_source?
 * Repair rcethercat status.
 * Debug output for all configuration functions of the application interface.
-* Output warning, if there is no sync manager for a configuration.
 * Abort code messages in userspace.
 
 Future issues:
diff --git a/documentation/graphs/fsm_slave_conf.dot b/documentation/graphs/fsm_slave_conf.dot
index f7e18d42..c53ca70d 100644
--- a/documentation/graphs/fsm_slave_conf.dot
+++ b/documentation/graphs/fsm_slave_conf.dot
@@ -10,78 +10,61 @@ digraph slaveconf {
     start -> init [weight=10]
 
     init [fontname="Helvetica"]
-    //init -> init
-    //init -> error
-    init -> enter_mbox_sync [fontname="Helvetica",label ="No FMMUs"]
+    init -> enter_mbox_sync [fontname="Helvetica", label="No FMMUs"]
     init -> clear_fmmus [weight=10]
 
     clear_fmmus [fontname="Helvetica"]
-    //clear_fmmus -> clear_fmmus
-    //clear_fmmus -> error
     clear_fmmus -> enter_mbox_sync [weight=10]
 
-    enter_mbox_sync [shape=point,label=""]
-    enter_mbox_sync -> end [fontname="Helvetica",label="INIT\nrequested"]
-    enter_mbox_sync -> preop [fontname="Helvetica",label="No mailboxes"]
+    enter_mbox_sync [shape=point, label=""]
+    enter_mbox_sync -> end [fontname="Helvetica", label="INIT\nrequested"]
+    enter_mbox_sync -> preop [fontname="Helvetica", label="No mailboxes"]
     enter_mbox_sync -> mbox_sync [weight=10]
 
     mbox_sync [fontname="Helvetica"]
-    //mbox_sync -> mbox_sync
-    //mbox_sync -> error
     mbox_sync -> preop [weight=10]
 
     preop [fontname="Helvetica"]
-    //preop -> preop
-    //preop -> error
-    preop -> end [fontname="Helvetica",label="PREOP\nrequested"]
-    preop -> enter_safeop [fontname="Helvetica",label="No slave\nconfig attached"]
+    preop -> end [fontname="Helvetica", label="PREOP\nrequested"]
+    preop -> enter_safeop [fontname="Helvetica", label="No slave\nconfig attached"]
     preop -> enter_sdo_conf [weight=10]
 
-    enter_sdo_conf [shape=point,label=""]
-    enter_sdo_conf -> enter_pdo_sync [fontname="Helvetica",label="No Sdo\nconfigurations"]
+    enter_sdo_conf [shape=point, label=""]
+    enter_sdo_conf -> enter_pdo_conf [fontname="Helvetica", label="No Sdos\nconfigured"]
     enter_sdo_conf -> sdo_conf [weight=10]
 
     sdo_conf [fontname="Helvetica"]
-    //sdo_conf -> sdo_conf
-    //sdo_conf -> error
-    sdo_conf -> enter_pdo_sync [weight=10]
+    sdo_conf -> enter_pdo_conf [weight=10]
 
-    enter_pdo_sync [shape=point,label=""]
-    enter_pdo_sync -> enter_safeop [fontname="Helvetica",label="No Pdos"]
+    enter_pdo_conf [shape=point, label=""]
+    enter_pdo_conf -> pdo_conf [weight=10]
+
+    pdo_conf [fontname="Helvetica"]
+    pdo_conf -> enter_pdo_sync [weight=10]
+
+    enter_pdo_sync [shape=point, label=""]
+    enter_pdo_sync -> enter_fmmu [fontname="Helvetica", label="No Pdo SMs"]
     enter_pdo_sync -> pdo_sync [weight=10]
 
     pdo_sync [fontname="Helvetica"]
-    //pdo_sync -> pdo_sync
-    //pdo_sync -> error
-    pdo_sync -> pdo_conf [weight=10]
-
-    pdo_conf [fontname="Helvetica"]
-    //pdo_conf -> pdo_conf
-    //pdo_conf -> error
-    pdo_conf -> enter_fmmu [weight=10]
+    pdo_sync -> enter_fmmu [weight=10]
 
     enter_fmmu [shape=point,label=""]
-    enter_fmmu -> enter_safeop [fontname="Helvetica",label="No FMMUs\nto configure"]
+    enter_fmmu -> enter_safeop [fontname="Helvetica", label="No FMMUs\nconfigured"]
     enter_fmmu -> fmmu [weight=10]
 
     fmmu [fontname="Helvetica"]
-    //fmmu -> fmmu
-    //fmmu -> error
     fmmu -> enter_safeop [weight=10]
 
     enter_safeop [shape=point,label=""]
     enter_safeop -> safeop [weight=10]
 
     safeop [fontname="Helvetica"]
-    //safeop -> safeop
-    //safeop -> error
-    safeop -> end [fontname="Helvetica",label="SAFEOP\nrequested"]
+    safeop -> end [fontname="Helvetica", label="SAFEOP\nrequested"]
     safeop -> op [weight=10]
 
     op [fontname="Helvetica"]
-    //op -> op
-    //op -> error
-    op -> end [weight=10]
+    op -> end// [weight=10]
 
     end [fontname="Helvetica"]
 }
diff --git a/master/fsm_pdo.c b/master/fsm_pdo.c
index bf1ccaa4..dc812940 100644
--- a/master/fsm_pdo.c
+++ b/master/fsm_pdo.c
@@ -413,7 +413,7 @@ void ec_fsm_pdo_conf_action_next_sync(
         if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) {
             if (!list_empty(&fsm->pdos.list))
                 EC_WARN("Pdos configured for SM%u, but slave %u does not "
-                        "provide a sync manager configuration!\n",
+                        "provide the sync manager information!\n",
                         fsm->sync_index, fsm->slave->ring_position);
             continue;
         }
diff --git a/master/fsm_slave_config.c b/master/fsm_slave_config.c
index f52c44e2..e2dc0ce0 100644
--- a/master/fsm_slave_config.c
+++ b/master/fsm_slave_config.c
@@ -61,6 +61,7 @@ void ec_fsm_slave_config_state_op(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_enter_mbox_sync(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_enter_preop(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *);
+void ec_fsm_slave_config_enter_pdo_conf(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_enter_pdo_sync(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_enter_fmmu(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_enter_safeop(ec_fsm_slave_config_t *);
@@ -440,7 +441,7 @@ void ec_fsm_slave_config_enter_sdo_conf(
 
     // No CoE configuration to be applied?
     if (list_empty(&slave->config->sdo_configs)) { // skip Sdo configuration
-        ec_fsm_slave_config_enter_pdo_sync(fsm);
+        ec_fsm_slave_config_enter_pdo_conf(fsm);
         return;
     }
 
@@ -482,6 +483,39 @@ void ec_fsm_slave_config_state_sdo_conf(
     }
 
     // All Sdos are now configured.
+    ec_fsm_slave_config_enter_pdo_conf(fsm);
+}
+
+/*****************************************************************************/
+
+/** PDO_CONF entry function.
+ */
+void ec_fsm_slave_config_enter_pdo_conf(
+        ec_fsm_slave_config_t *fsm /**< slave state machine */
+        )
+{
+    // Start configuring Pdos
+    ec_fsm_pdo_start_configuration(fsm->fsm_pdo, fsm->slave);
+    fsm->state = ec_fsm_slave_config_state_pdo_conf;
+    fsm->state(fsm); // execute immediately
+}
+
+/*****************************************************************************/
+
+/** Slave configuration state: PDO_CONF.
+ */
+void ec_fsm_slave_config_state_pdo_conf(
+        ec_fsm_slave_config_t *fsm /**< slave state machine */
+        )
+{
+    if (ec_fsm_pdo_exec(fsm->fsm_pdo))
+        return;
+
+    if (!ec_fsm_pdo_success(fsm->fsm_pdo)) {
+        EC_WARN("Pdo configuration failed on slave %u.\n",
+                fsm->slave->ring_position);
+    }
+
     ec_fsm_slave_config_enter_pdo_sync(fsm);
 }
 
@@ -509,7 +543,7 @@ void ec_fsm_slave_config_enter_pdo_sync(
 
     if (slave->sii.sync_count <= offset) {
         // no Pdo sync managers to configure
-        ec_fsm_slave_config_enter_safeop(fsm);
+        ec_fsm_slave_config_enter_fmmu(fsm);
         return;
     }
 
@@ -565,28 +599,6 @@ void ec_fsm_slave_config_state_pdo_sync(
         return;
     }
 
-    // Start configuring Pdos
-    ec_fsm_pdo_start_configuration(fsm->fsm_pdo, fsm->slave);
-    fsm->state = ec_fsm_slave_config_state_pdo_conf;
-    fsm->state(fsm); // execute immediately
-}
-
-/*****************************************************************************/
-
-/** Slave configuration state: PDO_CONF.
- */
-void ec_fsm_slave_config_state_pdo_conf(
-        ec_fsm_slave_config_t *fsm /**< slave state machine */
-        )
-{
-    if (ec_fsm_pdo_exec(fsm->fsm_pdo))
-        return;
-
-    if (!ec_fsm_pdo_success(fsm->fsm_pdo)) {
-        EC_WARN("Pdo configuration failed on slave %u.\n",
-                fsm->slave->ring_position);
-    }
-
     ec_fsm_slave_config_enter_fmmu(fsm);
 }
 
-- 
GitLab