From 0e5e2791f8bff0a7d15a44d01ca7d8135da9c066 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Fri, 20 Oct 2006 12:33:48 +0000
Subject: [PATCH] Better debugging output for SDO dictionaries.

---
 master/fsm.c   | 44 +++++++++++++++++++++-----------------------
 master/slave.c | 27 +++++++++++++++++++++++++++
 master/slave.h |  3 +++
 3 files changed, 51 insertions(+), 23 deletions(-)

diff --git a/master/fsm.c b/master/fsm.c
index f035c855..186e51de 100644
--- a/master/fsm.c
+++ b/master/fsm.c
@@ -614,7 +614,7 @@ void ec_fsm_master_action_process_states(ec_fsm_t *fsm
             || slave->error_flag) continue;
 
         if (master->debug_level) {
-            EC_DBG("Fetching SDO dictionary of slave %i.\n",
+            EC_DBG("Fetching SDO dictionary from slave %i.\n",
                    slave->ring_position);
         }
 
@@ -1052,8 +1052,10 @@ void ec_fsm_master_sdodict(ec_fsm_t *fsm /**< finite state machine */)
     // SDO dictionary fetching finished
 
     if (master->debug_level) {
-        EC_DBG("Finished fetching SDO dictionary of slave %i.\n",
-               slave->ring_position);
+        unsigned int sdo_count, entry_count;
+        ec_slave_sdo_dict_info(slave, &sdo_count, &entry_count);
+        EC_DBG("Fetched %i SDOs and %i entries from slave %i.\n",
+               sdo_count, entry_count, slave->ring_position);
     }
 
     // restart master state machine.
@@ -2320,7 +2322,6 @@ void ec_fsm_coe_dict_check(ec_fsm_t *fsm /**< finite state machine */)
 
 void ec_fsm_coe_dict_response(ec_fsm_t *fsm /**< finite state machine */)
 {
-    ec_master_t *master = fsm->master;
     ec_datagram_t *datagram = &fsm->datagram;
     ec_slave_t *slave = fsm->slave;
     uint8_t *data, mbox_prot;
@@ -2375,17 +2376,11 @@ void ec_fsm_coe_dict_response(ec_fsm_t *fsm /**< finite state machine */)
 
     sdo_count = (rec_size - 8) / 2;
 
-    if (master->debug_level) {
-        EC_DBG("Fetching %i SDOs.\n", sdo_count);
-    }
-
     for (i = 0; i < sdo_count; i++) {
         sdo_index = EC_READ_U16(data + 8 + i * 2);
         if (!sdo_index) {
-            // sometimes index is 0... ???
-            if (master->debug_level) {
-                EC_DBG("Received SDO with index 0x0000.\n");
-            }
+            EC_WARN("SDO dictionary of slave %i contains index 0x0000.\n",
+                    slave->ring_position);
             continue;
         }
 
@@ -2457,7 +2452,9 @@ void ec_fsm_coe_dict_desc_request(ec_fsm_t *fsm /**< finite state machine */)
     if (datagram->state != EC_DATAGRAM_RECEIVED
         || datagram->working_counter != 1) {
         fsm->coe_state = ec_fsm_error;
-        EC_ERR("Reception of CoE SDO description request failed.\n");
+        EC_ERR("Reception of CoE SDO description"
+               " request failed on slave %i.\n", slave->ring_position);
+
         return;
     }
 
@@ -2482,7 +2479,9 @@ void ec_fsm_coe_dict_desc_check(ec_fsm_t *fsm /**< finite state machine */)
     if (datagram->state != EC_DATAGRAM_RECEIVED
         || datagram->working_counter != 1) {
         fsm->coe_state = ec_fsm_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed.\n");
+        EC_ERR("Reception of CoE mailbox check datagram failed on slave %i.\n",
+               slave->ring_position);
+
         return;
     }
 
@@ -2524,7 +2523,8 @@ void ec_fsm_coe_dict_desc_response(ec_fsm_t *fsm /**< finite state machine */)
     if (datagram->state != EC_DATAGRAM_RECEIVED
         || datagram->working_counter != 1) {
         fsm->coe_state = ec_fsm_error;
-        EC_ERR("Reception of CoE SDO description response failed.\n");
+        EC_ERR("Reception of CoE SDO description"
+               "response failed on slave %i.\n", slave->ring_position);
         return;
     }
 
@@ -2651,7 +2651,8 @@ void ec_fsm_coe_dict_entry_request(ec_fsm_t *fsm /**< finite state machine */)
     if (datagram->state != EC_DATAGRAM_RECEIVED
         || datagram->working_counter != 1) {
         fsm->coe_state = ec_fsm_error;
-        EC_ERR("Reception of CoE SDO entry request failed.\n");
+        EC_ERR("Reception of CoE SDO entry request failed on slave %i.\n",
+               slave->ring_position);
         return;
     }
 
@@ -2676,7 +2677,8 @@ void ec_fsm_coe_dict_entry_check(ec_fsm_t *fsm /**< finite state machine */)
     if (datagram->state != EC_DATAGRAM_RECEIVED
         || datagram->working_counter != 1) {
         fsm->coe_state = ec_fsm_error;
-        EC_ERR("Reception of CoE mailbox check datagram failed.\n");
+        EC_ERR("Reception of CoE mailbox check datagram failed on slave %i.\n",
+               slave->ring_position);
         return;
     }
 
@@ -2708,7 +2710,6 @@ void ec_fsm_coe_dict_entry_check(ec_fsm_t *fsm /**< finite state machine */)
 
 void ec_fsm_coe_dict_entry_response(ec_fsm_t *fsm /**< finite state machine */)
 {
-    ec_master_t *master = fsm->master;
     ec_datagram_t *datagram = &fsm->datagram;
     ec_slave_t *slave = fsm->slave;
     ec_sdo_t *sdo = fsm->coe_sdo;
@@ -2719,7 +2720,8 @@ void ec_fsm_coe_dict_entry_response(ec_fsm_t *fsm /**< finite state machine */)
     if (datagram->state != EC_DATAGRAM_RECEIVED
         || datagram->working_counter != 1) {
         fsm->coe_state = ec_fsm_error;
-        EC_ERR("Reception of CoE SDO description response failed.\n");
+        EC_ERR("Reception of CoE SDO description"
+               " response failed on slave %i.\n", slave->ring_position);
         return;
     }
 
@@ -2842,10 +2844,6 @@ void ec_fsm_coe_dict_entry_response(ec_fsm_t *fsm /**< finite state machine */)
         return;
     }
 
-    if (master->debug_level) {
-        EC_DBG("Finished fetching SDO descriptions.\n");
-    }
-
     fsm->coe_state = ec_fsm_end;
 }
 
diff --git a/master/slave.c b/master/slave.c
index 48f07184..8e34a09e 100644
--- a/master/slave.c
+++ b/master/slave.c
@@ -960,6 +960,33 @@ int ec_slave_validate(const ec_slave_t *slave, /**< EtherCAT slave */
     return 0;
 }
 
+/*****************************************************************************/
+
+/**
+   Counts the total number of SDOs and entries in the dictionary.
+*/
+
+void ec_slave_sdo_dict_info(const ec_slave_t *slave, /**< EtherCAT slave */
+                            unsigned int *sdo_count, /**< number of SDOs */
+                            unsigned int *entry_count /**< total number of
+                                                         entries */
+                            )
+{
+    unsigned int sdos = 0, entries = 0;
+    ec_sdo_t *sdo;
+    ec_sdo_entry_t *entry;
+
+    list_for_each_entry(sdo, &slave->sdo_dictionary, list) {
+        sdos++;
+        list_for_each_entry(entry, &sdo->entries, list) {
+            entries++;
+        }
+    }
+
+    *sdo_count = sdos;
+    *entry_count = entries;
+}
+
 /******************************************************************************
  *  Realtime interface
  *****************************************************************************/
diff --git a/master/slave.h b/master/slave.h
index 1a311874..0e470580 100644
--- a/master/slave.h
+++ b/master/slave.h
@@ -281,6 +281,9 @@ int ec_slave_has_subbus(const ec_slave_t *);
 
 int ec_slave_validate(const ec_slave_t *, uint32_t, uint32_t);
 
+void ec_slave_sdo_dict_info(const ec_slave_t *,
+                            unsigned int *, unsigned int *);
+
 /*****************************************************************************/
 
 #endif
-- 
GitLab