From 58476e117623a7af317861f335b6656263c40918 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Thu, 23 Apr 2009 12:25:09 +0000
Subject: [PATCH] DC shift time working.

---
 documentation/graphs/fsm_slave_conf.dot |  1 +
 master/fsm_slave_config.c               |  9 ++++++++-
 master/slave_config.c                   | 12 ++++++++++++
 master/slave_config.h                   |  1 +
 4 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/documentation/graphs/fsm_slave_conf.dot b/documentation/graphs/fsm_slave_conf.dot
index fda7f4d1..8e7aa13b 100644
--- a/documentation/graphs/fsm_slave_conf.dot
+++ b/documentation/graphs/fsm_slave_conf.dot
@@ -92,6 +92,7 @@ digraph slaveconf {
     enter_dc_cycle -> enter_safeop [fontname="Helvetica", label="DC not\nconfigured"]
 
     dc_cycle [fontname="Helvetica"]
+    dc_cycle -> reconfigure
     dc_cycle -> dc_start [weight=10]
 
     dc_start [fontname="Helvetica"]
diff --git a/master/fsm_slave_config.c b/master/fsm_slave_config.c
index 28aa2d83..aa862e75 100644
--- a/master/fsm_slave_config.c
+++ b/master/fsm_slave_config.c
@@ -1062,8 +1062,14 @@ void ec_fsm_slave_config_state_dc_cycle(
 {
     ec_datagram_t *datagram = fsm->datagram;
     ec_slave_t *slave = fsm->slave;
+    ec_slave_config_t *config = slave->config;
     u64 start_time;
 
+    if (!config) { // config removed in the meantime
+        ec_fsm_slave_config_reconfigure(fsm);
+        return;
+    }
+
     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
         return;
 
@@ -1085,7 +1091,8 @@ void ec_fsm_slave_config_state_dc_cycle(
     }
 
     // set DC start time
-    start_time = slave->master->app_time + 10000000ULL; // now + 100 ms
+    start_time = slave->master->app_time +
+        config->dc_sync_shift_times[0] + 100000000ULL; // now + shift + x ns
     if (slave->master->debug_level)
         EC_DBG("Slave %u: Setting DC cyclic operation start time to %llu.\n",
                 slave->ring_position, start_time);
diff --git a/master/slave_config.c b/master/slave_config.c
index b2959f8d..1132cf62 100644
--- a/master/slave_config.c
+++ b/master/slave_config.c
@@ -77,6 +77,8 @@ void ec_slave_config_init(
 	sc->dc_assign_activate = 0x0000;
 	sc->dc_sync_cycle_times[0] = 0x00000000;
 	sc->dc_sync_cycle_times[1] = 0x00000000;
+	sc->dc_sync_shift_times[0] = 0x00000000;
+	sc->dc_sync_shift_times[1] = 0x00000000;
 
     INIT_LIST_HEAD(&sc->sdo_configs);
     INIT_LIST_HEAD(&sc->sdo_requests);
@@ -690,6 +692,15 @@ void ecrt_slave_config_dc_sync_cycle_times(ec_slave_config_t *sc,
 
 /*****************************************************************************/
 
+void ecrt_slave_config_dc_sync_shift_times(ec_slave_config_t *sc,
+        uint32_t sync0_shift_time, uint32_t sync1_shift_time)
+{
+	sc->dc_sync_shift_times[0] = sync0_shift_time;
+	sc->dc_sync_shift_times[1] = sync1_shift_time;
+}
+
+/*****************************************************************************/
+
 int ecrt_slave_config_sdo(ec_slave_config_t *sc, uint16_t index,
         uint8_t subindex, const uint8_t *data, size_t size)
 {
@@ -904,6 +915,7 @@ EXPORT_SYMBOL(ecrt_slave_config_pdos);
 EXPORT_SYMBOL(ecrt_slave_config_reg_pdo_entry);
 EXPORT_SYMBOL(ecrt_slave_config_dc_assign_activate);
 EXPORT_SYMBOL(ecrt_slave_config_dc_sync_cycle_times);
+EXPORT_SYMBOL(ecrt_slave_config_dc_sync_shift_times);
 EXPORT_SYMBOL(ecrt_slave_config_sdo);
 EXPORT_SYMBOL(ecrt_slave_config_sdo8);
 EXPORT_SYMBOL(ecrt_slave_config_sdo16);
diff --git a/master/slave_config.h b/master/slave_config.h
index a7109a6f..7617dc06 100644
--- a/master/slave_config.h
+++ b/master/slave_config.h
@@ -68,6 +68,7 @@ struct ec_slave_config {
 
 	uint16_t dc_assign_activate; /**< Vendor-specific AssignActivate word. */
 	uint32_t dc_sync_cycle_times[2]; /**< SYNC[0,1] cycle times. */
+	uint32_t dc_sync_shift_times[2]; /**< SYNC[0,1] shift times. */
 
     struct list_head sdo_configs; /**< List of SDO configurations. */
     struct list_head sdo_requests; /**< List of SDO requests. */
-- 
GitLab