master/fsm_slave_config.c
changeset 1174 235f34ca50e2
parent 1173 2ec9651a6c89
child 1180 846907b8cc4b
--- a/master/fsm_slave_config.c	Thu Jul 31 09:30:38 2008 +0000
+++ b/master/fsm_slave_config.c	Thu Jul 31 16:13:29 2008 +0000
@@ -53,8 +53,7 @@
 void ec_fsm_slave_config_state_preop(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_state_sdo_conf(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *);
-void ec_fsm_slave_config_state_pdo_assign(ec_fsm_slave_config_t *);
-void ec_fsm_slave_config_state_pdo_mapping(ec_fsm_slave_config_t *);
+void ec_fsm_slave_config_state_pdo_conf(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_state_fmmu(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_state_safeop(ec_fsm_slave_config_t *);
 void ec_fsm_slave_config_state_op(ec_fsm_slave_config_t *);
@@ -75,16 +74,16 @@
  */
 void ec_fsm_slave_config_init(
         ec_fsm_slave_config_t *fsm, /**< slave state machine */
-        ec_datagram_t *datagram /**< datagram structure to use */
+        ec_datagram_t *datagram, /**< datagram structure to use */
+        ec_fsm_change_t *fsm_change, /**< State change state machine to use. */
+        ec_fsm_coe_t *fsm_coe, /**< CoE state machine to use. */
+        ec_fsm_pdo_t *fsm_pdo /**< Pdo configuration state machine to use. */
         )
 {
     fsm->datagram = datagram;
-
-    // init sub state machines
-    ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
-    ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
-    ec_fsm_pdo_assign_init(&fsm->fsm_pdo_assign, &fsm->fsm_coe);
-    ec_fsm_pdo_mapping_init(&fsm->fsm_pdo_mapping, &fsm->fsm_coe);
+    fsm->fsm_change = fsm_change;
+    fsm->fsm_coe = fsm_coe;
+    fsm->fsm_pdo = fsm_pdo;
 }
 
 /*****************************************************************************/
@@ -95,11 +94,6 @@
         ec_fsm_slave_config_t *fsm /**< slave state machine */
         )
 {
-    // clear sub state machines
-    ec_fsm_change_clear(&fsm->fsm_change);
-    ec_fsm_coe_clear(&fsm->fsm_coe);
-    ec_fsm_pdo_assign_clear(&fsm->fsm_pdo_assign);
-    ec_fsm_pdo_mapping_clear(&fsm->fsm_pdo_mapping);
 }
 
 /*****************************************************************************/
@@ -181,8 +175,8 @@
     // force flag
     fsm->slave->force_config = 0;
 
-    ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
-    ec_fsm_change_exec(&fsm->fsm_change);
+    ec_fsm_change_start(fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
+    ec_fsm_change_exec(fsm->fsm_change);
     fsm->state = ec_fsm_slave_config_state_init;
 }
 
@@ -198,10 +192,10 @@
     ec_slave_t *slave = fsm->slave;
     ec_datagram_t *datagram = fsm->datagram;
 
-    if (ec_fsm_change_exec(&fsm->fsm_change)) return;
-
-    if (!ec_fsm_change_success(&fsm->fsm_change)) {
-        if (!fsm->fsm_change.spontaneous_change)
+    if (ec_fsm_change_exec(fsm->fsm_change)) return;
+
+    if (!ec_fsm_change_success(fsm->fsm_change)) {
+        if (!fsm->fsm_change->spontaneous_change)
             slave->error_flag = 1;
         fsm->state = ec_fsm_slave_config_state_error;
         return;
@@ -385,8 +379,8 @@
         )
 {
     fsm->state = ec_fsm_slave_config_state_preop;
-    ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_PREOP);
-    ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
+    ec_fsm_change_start(fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_PREOP);
+    ec_fsm_change_exec(fsm->fsm_change); // execute immediately
 }
 
 /*****************************************************************************/
@@ -400,10 +394,10 @@
     ec_slave_t *slave = fsm->slave;
     ec_master_t *master = fsm->slave->master;
 
-    if (ec_fsm_change_exec(&fsm->fsm_change)) return;
-
-    if (!ec_fsm_change_success(&fsm->fsm_change)) {
-        if (!fsm->fsm_change.spontaneous_change)
+    if (ec_fsm_change_exec(fsm->fsm_change)) return;
+
+    if (!ec_fsm_change_success(fsm->fsm_change)) {
+        if (!fsm->fsm_change->spontaneous_change)
             slave->error_flag = 1;
         fsm->state = ec_fsm_slave_config_state_error;
         return;
@@ -455,8 +449,8 @@
     fsm->request = list_entry(fsm->slave->config->sdo_configs.next,
             ec_sdo_request_t, list);
     ecrt_sdo_request_write(fsm->request);
-    ec_fsm_coe_transfer(&fsm->fsm_coe, fsm->slave, fsm->request);
-    ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
+    ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, fsm->request);
+    ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
 }
 
 /*****************************************************************************/
@@ -467,9 +461,9 @@
         ec_fsm_slave_config_t *fsm /**< slave state machine */
         )
 {
-    if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
-
-    if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
+    if (ec_fsm_coe_exec(fsm->fsm_coe)) return;
+
+    if (!ec_fsm_coe_success(fsm->fsm_coe)) {
         EC_ERR("Sdo configuration failed for slave %u.\n",
                 fsm->slave->ring_position);
         fsm->slave->error_flag = 1;
@@ -482,8 +476,8 @@
         fsm->request = list_entry(fsm->request->list.next, ec_sdo_request_t,
                 list);
         ecrt_sdo_request_write(fsm->request);
-        ec_fsm_coe_transfer(&fsm->fsm_coe, fsm->slave, fsm->request);
-        ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
+        ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, fsm->request);
+        ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
         return;
     }
 
@@ -571,45 +565,25 @@
         return;
     }
 
-    // Start configuring Pdo mapping
-    ec_fsm_pdo_mapping_start(&fsm->fsm_pdo_mapping, fsm->slave);
-    fsm->state = ec_fsm_slave_config_state_pdo_mapping;
+    // 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_MAPPING.
- */
-void ec_fsm_slave_config_state_pdo_mapping(
-        ec_fsm_slave_config_t *fsm /**< slave state machine */
-        )
-{
-    if (ec_fsm_pdo_mapping_exec(&fsm->fsm_pdo_mapping)) return;
-
-    if (!ec_fsm_pdo_mapping_success(&fsm->fsm_pdo_mapping)) {
-        EC_WARN("Configuration of Pdo mappings failed on slave %u.\n",
-                fsm->slave->ring_position);
-    }
-
-    // start applying Pdo assignments
-    ec_fsm_pdo_assign_start(&fsm->fsm_pdo_assign, fsm->slave);
-    fsm->state = ec_fsm_slave_config_state_pdo_assign;
-    fsm->state(fsm); // execute immediately
-}
-
-/*****************************************************************************/
-
-/** Slave configuration state: PDO_ASSIGN.
- */
-void ec_fsm_slave_config_state_pdo_assign(
-        ec_fsm_slave_config_t *fsm /**< slave state machine */
-        )
-{
-    if (ec_fsm_pdo_assign_exec(&fsm->fsm_pdo_assign)) return;
-
-    if (!ec_fsm_pdo_assign_success(&fsm->fsm_pdo_assign)) {
-        EC_WARN("Configuration of Pdo assignments failed on slave %u.\n",
+/** 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);
     }
 
@@ -708,8 +682,8 @@
         )
 {
     fsm->state = ec_fsm_slave_config_state_safeop;
-    ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAFEOP);
-    ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
+    ec_fsm_change_start(fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAFEOP);
+    ec_fsm_change_exec(fsm->fsm_change); // execute immediately
 }
 
 /*****************************************************************************/
@@ -723,10 +697,10 @@
     ec_master_t *master = fsm->slave->master;
     ec_slave_t *slave = fsm->slave;
 
-    if (ec_fsm_change_exec(&fsm->fsm_change)) return;
-
-    if (!ec_fsm_change_success(&fsm->fsm_change)) {
-        if (!fsm->fsm_change.spontaneous_change)
+    if (ec_fsm_change_exec(fsm->fsm_change)) return;
+
+    if (!ec_fsm_change_success(fsm->fsm_change)) {
+        if (!fsm->fsm_change->spontaneous_change)
             fsm->slave->error_flag = 1;
         fsm->state = ec_fsm_slave_config_state_error;
         return;
@@ -749,8 +723,8 @@
 
     // set state to OP
     fsm->state = ec_fsm_slave_config_state_op;
-    ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_OP);
-    ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
+    ec_fsm_change_start(fsm->fsm_change, slave, EC_SLAVE_STATE_OP);
+    ec_fsm_change_exec(fsm->fsm_change); // execute immediately
 }
 
 /*****************************************************************************/
@@ -764,10 +738,10 @@
     ec_master_t *master = fsm->slave->master;
     ec_slave_t *slave = fsm->slave;
 
-    if (ec_fsm_change_exec(&fsm->fsm_change)) return;
-
-    if (!ec_fsm_change_success(&fsm->fsm_change)) {
-        if (!fsm->fsm_change.spontaneous_change)
+    if (ec_fsm_change_exec(fsm->fsm_change)) return;
+
+    if (!ec_fsm_change_success(fsm->fsm_change)) {
+        if (!fsm->fsm_change->spontaneous_change)
             slave->error_flag = 1;
         fsm->state = ec_fsm_slave_config_state_error;
         return;